forked from test34/can_wizard
probably working canup, candown, canstop, new realization on canstats
This commit is contained in:
parent
ba67c741d9
commit
18514d4d96
3 changed files with 43 additions and 26 deletions
47
main/can.c
47
main/can.c
|
@ -16,21 +16,39 @@ bool is_error_passive = false;
|
||||||
SemaphoreHandle_t can_mutex;
|
SemaphoreHandle_t can_mutex;
|
||||||
can_status_t curr_can_state = { 0 };
|
can_status_t curr_can_state = { 0 };
|
||||||
|
|
||||||
can_state_e get_can_state() {
|
static can_status_t get_can_state() {
|
||||||
twai_status_info_t status;
|
can_status_t result;
|
||||||
|
twai_status_info_t status = { 0 };
|
||||||
esp_err_t res = twai_get_status_info(&status);
|
esp_err_t res = twai_get_status_info(&status);
|
||||||
if (res != ESP_OK) return CAN_NOT_INSTALLED;
|
if (res != ESP_OK) {
|
||||||
|
result.state = CAN_NOT_INSTALLED;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result.msgs_to_rx = status.msgs_to_rx;
|
||||||
|
result.msgs_to_tx = status.msgs_to_tx;
|
||||||
|
result.arb_lost_count = status.arb_lost_count;
|
||||||
|
result.bus_error_count = status.bus_error_count;
|
||||||
|
result.tx_error_counter = status.tx_error_counter;
|
||||||
|
result.rx_error_counter = status.rx_error_counter;
|
||||||
|
result.tx_failed_count = status.tx_failed_count;
|
||||||
|
result.rx_missed_count = status.rx_missed_count;
|
||||||
|
result.rx_overrun_count = status.rx_overrun_count;
|
||||||
switch (status.state) {
|
switch (status.state) {
|
||||||
case TWAI_STATE_STOPPED:
|
case TWAI_STATE_STOPPED:
|
||||||
return CAN_STOPPED;
|
result.state = CAN_STOPPED;
|
||||||
|
break;
|
||||||
case TWAI_STATE_BUS_OFF:
|
case TWAI_STATE_BUS_OFF:
|
||||||
return CAN_BUF_OFF;
|
result.state = CAN_BUF_OFF;
|
||||||
|
break;
|
||||||
case TWAI_STATE_RECOVERING:
|
case TWAI_STATE_RECOVERING:
|
||||||
return CAN_RECOVERING;
|
result.state = CAN_RECOVERING;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if (is_error_passive) return CAN_ERROR_PASSIVE;
|
if (is_error_passive) result.state = CAN_ERROR_PASSIVE;
|
||||||
else return CAN_ERROR_ACTIVE;
|
else result.state = CAN_ERROR_ACTIVE;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void can_init() {
|
void can_init() {
|
||||||
|
@ -89,6 +107,7 @@ void can_msg_to_str(twai_message_t *can_msg, char *out_str) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: add software filtering
|
||||||
void can_task(void* arg) {
|
void can_task(void* arg) {
|
||||||
can_mutex = xSemaphoreCreateMutex();
|
can_mutex = xSemaphoreCreateMutex();
|
||||||
twai_message_t rx_msg;
|
twai_message_t rx_msg;
|
||||||
|
@ -96,12 +115,14 @@ void can_task(void* arg) {
|
||||||
// ESP_ERROR_CHECK(esp_task_wdt_add(NULL));
|
// ESP_ERROR_CHECK(esp_task_wdt_add(NULL));
|
||||||
for (;;) { // A Task shall never return or exit.
|
for (;;) { // A Task shall never return or exit.
|
||||||
// esp_task_wdt_reset();
|
// esp_task_wdt_reset();
|
||||||
can_bus_off_check();
|
// can_bus_off_check();
|
||||||
if (twai_receive(&rx_msg, pdMS_TO_TICKS(1000)) != ESP_OK) continue;
|
curr_can_state = get_can_state();
|
||||||
// TODO: add software filtering
|
xSemaphoreTake(can_mutex, pdMS_TO_TICKS(200));
|
||||||
// if ((((rx_msg.identifier >> 8) & 0xFF) != CONFIG_DEVICE_ID) && (((rx_msg.identifier >> 8) & 0xFF) != 0xFF)) continue;
|
while(twai_receive(&rx_msg, 0) == ESP_OK) {
|
||||||
// ESP_LOGI(LOG_TAG, "received can frame: %" PRIu32, rx_msg.identifier);
|
|
||||||
can_msg_to_str(&rx_msg, data_bytes_str);
|
can_msg_to_str(&rx_msg, data_bytes_str);
|
||||||
xprintf(LOG_COLOR(LOG_COLOR_BLUE) "recv %s\n" LOG_RESET_COLOR, data_bytes_str);
|
xprintf(LOG_COLOR(LOG_COLOR_BLUE) "recv %s\n" LOG_RESET_COLOR, data_bytes_str);
|
||||||
}
|
}
|
||||||
|
xSemaphoreGive(can_mutex);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(100));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,5 @@ void calculate_hw_can_filter(uint32_t device_id, twai_filter_config_t* filter, b
|
||||||
void can_bus_off_check();
|
void can_bus_off_check();
|
||||||
void can_task(void* arg);
|
void can_task(void* arg);
|
||||||
void can_msg_to_str(twai_message_t *can_msg, char *out_str);
|
void can_msg_to_str(twai_message_t *can_msg, char *out_str);
|
||||||
can_state_e get_can_state();
|
|
||||||
|
|
||||||
#endif // MAIN_CAN_H
|
#endif // MAIN_CAN_H
|
||||||
|
|
|
@ -99,20 +99,17 @@ static const char* can_states_str[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static int canstats(int argc, char **argv) {
|
static int canstats(int argc, char **argv) {
|
||||||
can_state_e canstate = get_can_state();
|
if (curr_can_state.state == CAN_NOT_INSTALLED) {
|
||||||
if (canstate == CAN_NOT_INSTALLED) {
|
|
||||||
printf("CAN driver is not installed!");
|
printf("CAN driver is not installed!");
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
twai_status_info_t status;
|
const char *state_str = can_states_str[curr_can_state.state];
|
||||||
twai_get_status_info(&status);
|
|
||||||
const char *state_str = can_states_str[canstate];
|
|
||||||
printf("status: %s\n", state_str);
|
printf("status: %s\n", state_str);
|
||||||
printf("TX Err Counter: %" PRIu32 "\n", status.tx_error_counter);
|
printf("TX Err Counter: %" PRIu32 "\n", curr_can_state.tx_error_counter);
|
||||||
printf("RX Err Counter: %" PRIu32 "\n", status.rx_error_counter);
|
printf("RX Err Counter: %" PRIu32 "\n", curr_can_state.rx_error_counter);
|
||||||
printf("Failed transmit: %" PRIu32 "\n", status.tx_failed_count);
|
printf("Failed transmit: %" PRIu32 "\n", curr_can_state.tx_failed_count);
|
||||||
printf("Arbitration lost times: %" PRIu32 "\n", status.arb_lost_count);
|
printf("Arbitration lost times: %" PRIu32 "\n", curr_can_state.arb_lost_count);
|
||||||
printf("Bus-off count: %" PRIu32 "\n", status.bus_error_count);
|
printf("Bus-off count: %" PRIu32 "\n", curr_can_state.bus_error_count);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue