forked from test34/can_wizard
added timestamps and new print function
This commit is contained in:
parent
09a14f390d
commit
c85792c265
5 changed files with 36 additions and 17 deletions
20
main/can.c
20
main/can.c
|
@ -8,8 +8,6 @@
|
||||||
#include "freertos/ringbuf.h"
|
#include "freertos/ringbuf.h"
|
||||||
#include "xvprintf.h"
|
#include "xvprintf.h"
|
||||||
|
|
||||||
static const char* LOG_TAG = "can";
|
|
||||||
|
|
||||||
bool is_error_passive = false;
|
bool is_error_passive = false;
|
||||||
|
|
||||||
SemaphoreHandle_t can_mutex;
|
SemaphoreHandle_t can_mutex;
|
||||||
|
@ -50,10 +48,10 @@ static can_status_t get_can_state() {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void can_msg_to_str(twai_message_t *can_msg, char *out_str) {
|
void can_msg_to_str(twai_message_t *can_msg, char *start_str, char *out_str) {
|
||||||
char byte_str[3];
|
char byte_str[3];
|
||||||
out_str[0] = '\0';
|
out_str[0] = '\0';
|
||||||
sprintf(out_str, "can frame: ID: %08X dlc: %d ", (int) can_msg->identifier, can_msg->data_length_code);
|
sprintf(out_str, "%scan frame: ID: %08X dlc: %d ", start_str, (int) can_msg->identifier, can_msg->data_length_code);
|
||||||
if (can_msg->data_length_code == 0) {
|
if (can_msg->data_length_code == 0) {
|
||||||
strcat(out_str, "(no data)");
|
strcat(out_str, "(no data)");
|
||||||
} else {
|
} else {
|
||||||
|
@ -67,11 +65,11 @@ void can_msg_to_str(twai_message_t *can_msg, char *out_str) {
|
||||||
|
|
||||||
// TODO: add software filtering
|
// TODO: add software filtering
|
||||||
void can_task(void* arg) {
|
void can_task(void* arg) {
|
||||||
static const TickType_t can_task_timeout = pdMS_TO_TICKS(100);
|
static const TickType_t can_task_timeout = pdMS_TO_TICKS(10);
|
||||||
uint32_t alerts = 0;
|
uint32_t alerts = 0;
|
||||||
can_mutex = xSemaphoreCreateMutex();
|
can_mutex = xSemaphoreCreateMutex();
|
||||||
twai_message_t rx_msg;
|
twai_message_t rx_msg;
|
||||||
char data_bytes_str[50];
|
char data_bytes_str[70];
|
||||||
for (;;) { // A Task shall never return or exit.
|
for (;;) { // A Task shall never return or exit.
|
||||||
if (twai_read_alerts(&alerts, 0) == ESP_OK) {
|
if (twai_read_alerts(&alerts, 0) == ESP_OK) {
|
||||||
if (alerts & TWAI_ALERT_ERR_ACTIVE) {
|
if (alerts & TWAI_ALERT_ERR_ACTIVE) {
|
||||||
|
@ -81,22 +79,22 @@ void can_task(void* arg) {
|
||||||
is_error_passive = true;
|
is_error_passive = true;
|
||||||
}
|
}
|
||||||
if (alerts & TWAI_ALERT_BUS_ERROR) {
|
if (alerts & TWAI_ALERT_BUS_ERROR) {
|
||||||
ESP_LOGE(LOG_TAG, "CAN error!");
|
print_w_clr_time("CAN error!", LOG_COLOR_RED, false);
|
||||||
}
|
}
|
||||||
if (alerts & TWAI_ALERT_BUS_OFF) {
|
if (alerts & TWAI_ALERT_BUS_OFF) {
|
||||||
ESP_LOGE(LOG_TAG, "CAN went bus-off!");
|
print_w_clr_time("CAN went bus-off!", LOG_COLOR_RED, false);
|
||||||
// ESP_ERROR_CHECK(twai_initiate_recovery());
|
// ESP_ERROR_CHECK(twai_initiate_recovery());
|
||||||
}
|
}
|
||||||
if (alerts & TWAI_ALERT_BUS_RECOVERED) {
|
if (alerts & TWAI_ALERT_BUS_RECOVERED) {
|
||||||
ESP_LOGI(LOG_TAG, "CAN recovered!");
|
print_w_clr_time("CAN recovered!", LOG_COLOR_BLUE, false);
|
||||||
// ESP_ERROR_CHECK(twai_start());
|
// ESP_ERROR_CHECK(twai_start());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
curr_can_state = get_can_state();
|
curr_can_state = get_can_state();
|
||||||
if (xSemaphoreTake(can_mutex, 0) == pdTRUE) {
|
if (xSemaphoreTake(can_mutex, 0) == pdTRUE) {
|
||||||
while (twai_receive(&rx_msg, 0) == ESP_OK) {
|
while (twai_receive(&rx_msg, 0) == ESP_OK) {
|
||||||
can_msg_to_str(&rx_msg, data_bytes_str);
|
can_msg_to_str(&rx_msg, "recv ", data_bytes_str);
|
||||||
xprintf(LOG_COLOR(LOG_COLOR_BLUE) "recv %s\n" LOG_RESET_COLOR, data_bytes_str);
|
print_w_clr_time(data_bytes_str, LOG_COLOR_BLUE, false);
|
||||||
}
|
}
|
||||||
xSemaphoreGive(can_mutex);
|
xSemaphoreGive(can_mutex);
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,10 +39,11 @@ typedef struct {
|
||||||
|
|
||||||
extern SemaphoreHandle_t can_mutex;
|
extern SemaphoreHandle_t can_mutex;
|
||||||
extern volatile can_status_t curr_can_state;
|
extern volatile can_status_t curr_can_state;
|
||||||
|
extern bool timestamp_enabled;
|
||||||
|
|
||||||
// functions
|
// functions
|
||||||
|
|
||||||
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 *start_str, char *out_str);
|
||||||
|
|
||||||
#endif // MAIN_CAN_H
|
#endif // MAIN_CAN_H
|
||||||
|
|
|
@ -41,7 +41,7 @@ static struct {
|
||||||
|
|
||||||
static int send_can_frame(int argc, char **argv) {
|
static int send_can_frame(int argc, char **argv) {
|
||||||
twai_message_t msg = {.extd = 1};
|
twai_message_t msg = {.extd = 1};
|
||||||
char printf_str[50];
|
char printf_str[70];
|
||||||
int nerrors = arg_parse(argc, argv, (void **) &cansend_args);
|
int nerrors = arg_parse(argc, argv, (void **) &cansend_args);
|
||||||
if (nerrors != 0) {
|
if (nerrors != 0) {
|
||||||
arg_print_errors(stderr, cansend_args.end, argv[0]);
|
arg_print_errors(stderr, cansend_args.end, argv[0]);
|
||||||
|
@ -71,9 +71,9 @@ static int send_can_frame(int argc, char **argv) {
|
||||||
msg.data_length_code = dt_l / 2;
|
msg.data_length_code = dt_l / 2;
|
||||||
msg.identifier = msg_id;
|
msg.identifier = msg_id;
|
||||||
twai_transmit(&msg, pdMS_TO_TICKS(1000));
|
twai_transmit(&msg, pdMS_TO_TICKS(1000));
|
||||||
can_msg_to_str(&msg, printf_str);
|
can_msg_to_str(&msg, "sent ", printf_str);
|
||||||
printf("sent %s\n", printf_str);
|
print_w_clr_time(printf_str, NULL, true);
|
||||||
// free(can_msg_str_buf);
|
free(can_msg_str_buf);
|
||||||
return 0;
|
return 0;
|
||||||
invalid_args:
|
invalid_args:
|
||||||
printf("Invalid arguments!\n");
|
printf("Invalid arguments!\n");
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
|
|
||||||
RingbufHandle_t can_messages;
|
RingbufHandle_t can_messages;
|
||||||
|
bool timestamp_enabled = true;
|
||||||
|
|
||||||
void init_tx_ringbuf() {
|
void init_tx_ringbuf() {
|
||||||
can_messages = xRingbufferCreate(2200, RINGBUF_TYPE_NOSPLIT);
|
can_messages = xRingbufferCreate(2200, RINGBUF_TYPE_NOSPLIT);
|
||||||
|
@ -26,3 +26,19 @@ int xprintf(const char *fmt, ...) {
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
return vxprintf(fmt, args);
|
return vxprintf(fmt, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int print_w_clr_time(char *msg, char *color, bool use_printf) {
|
||||||
|
print_func pr_func;
|
||||||
|
if (use_printf) pr_func = printf;
|
||||||
|
else pr_func = xprintf;
|
||||||
|
char timestamp[20];
|
||||||
|
timestamp[0] = '\0';
|
||||||
|
if (timestamp_enabled) {
|
||||||
|
snprintf(timestamp, 19, "[%s] ", esp_log_system_timestamp());
|
||||||
|
}
|
||||||
|
if (color != NULL) {
|
||||||
|
return(pr_func("\033[0;%sm%s%s\033[0m\n", color, timestamp, msg));
|
||||||
|
} else {
|
||||||
|
return(pr_func("%s%s\n", timestamp, msg));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -3,11 +3,15 @@
|
||||||
|
|
||||||
#include "freertos/ringbuf.h"
|
#include "freertos/ringbuf.h"
|
||||||
|
|
||||||
|
typedef int (*print_func)(const char *fmt, ...);
|
||||||
|
|
||||||
extern RingbufHandle_t can_messages;
|
extern RingbufHandle_t can_messages;
|
||||||
|
extern bool timestamp_enabled;
|
||||||
|
|
||||||
void init_tx_ringbuf();
|
void init_tx_ringbuf();
|
||||||
int vxprintf(const char *fmt, va_list args);
|
int vxprintf(const char *fmt, va_list args);
|
||||||
int xprintf(const char *fmt, ...);
|
int xprintf(const char *fmt, ...);
|
||||||
|
int print_w_clr_time(char *msg, char *color, bool use_printf);
|
||||||
|
|
||||||
// functions
|
// functions
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue