refactoring

This commit is contained in:
Данила Горнушко 2023-12-16 12:51:13 +03:00
parent 526ead055a
commit c76a9669d8
8 changed files with 57 additions and 76 deletions

View file

@ -5,7 +5,6 @@
#include "freertos/projdefs.h" #include "freertos/projdefs.h"
#include "hal/twai_types.h" #include "hal/twai_types.h"
#include "sdkconfig.h" #include "sdkconfig.h"
#include <stddef.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "freertos/ringbuf.h" #include "freertos/ringbuf.h"
@ -23,9 +22,9 @@ SemaphoreHandle_t can_mutex;
volatile can_status_t curr_can_state = { 0 }; volatile can_status_t curr_can_state = { 0 };
static can_status_t get_can_state() { static can_status_t get_can_state() {
can_status_t result; can_status_t result = { 0 };
twai_status_info_t status = { 0 }; twai_status_info_t status = {0};
esp_err_t res = twai_get_status_info(&status); const esp_err_t res = twai_get_status_info(&status);
if (res != ESP_OK) { if (res != ESP_OK) {
result.state = CAN_NOT_INSTALLED; result.state = CAN_NOT_INSTALLED;
return result; return result;
@ -57,8 +56,7 @@ static can_status_t get_can_state() {
return result; return result;
} }
void can_msg_to_str(twai_message_t *can_msg, char *start_str, char *out_str) { void can_msg_to_str(const twai_message_t *can_msg, char *start_str, char *out_str) {
char byte_str[3];
out_str[0] = '\0'; out_str[0] = '\0';
sprintf(out_str, "%scan frame: ID: %08X dlc: %d ", start_str, (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) {
@ -66,17 +64,17 @@ void can_msg_to_str(twai_message_t *can_msg, char *start_str, char *out_str) {
} else { } else {
strcat(out_str, "data: "); strcat(out_str, "data: ");
for (int i = 0; i < can_msg->data_length_code; i++) { for (int i = 0; i < can_msg->data_length_code; i++) {
char byte_str[3];
sprintf(byte_str, "%02X", can_msg->data[i]); sprintf(byte_str, "%02X", can_msg->data[i]);
strcat(out_str, byte_str); strcat(out_str, byte_str);
} }
} }
} }
bool matches_filters(twai_message_t *msg) { bool matches_filters(const twai_message_t *msg) {
List *tmp_cursor = adv_filters.filters; const List *tmp_cursor = adv_filters.filters;
while (tmp_cursor != NULL) { while (tmp_cursor != NULL) {
smart_filt_element_t *curr_filter; const smart_filt_element_t* curr_filter = tmp_cursor->data;
curr_filter = (smart_filt_element_t *) tmp_cursor->data;
if ((msg->identifier & curr_filter->mask) == curr_filter->filt) { if ((msg->identifier & curr_filter->mask) == curr_filter->filt) {
return true; return true;
} }
@ -89,10 +87,8 @@ void can_task(void* arg) {
static const TickType_t can_task_timeout = pdMS_TO_TICKS(200); static const TickType_t can_task_timeout = pdMS_TO_TICKS(200);
uint32_t alerts = 0; uint32_t alerts = 0;
esp_err_t ret = ESP_OK; esp_err_t ret = ESP_OK;
BaseType_t sem_res;
can_mutex = xSemaphoreCreateMutex(); can_mutex = xSemaphoreCreateMutex();
twai_message_t rx_msg; twai_message_t rx_msg;
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) {
@ -121,9 +117,10 @@ void can_task(void* arg) {
} }
} }
curr_can_state = get_can_state(); curr_can_state = get_can_state();
sem_res = xSemaphoreTake(can_mutex, 0); const BaseType_t sem_res = xSemaphoreTake(can_mutex, 0);
if (sem_res == pdTRUE) { if (sem_res == pdTRUE) {
while ((ret = twai_receive(&rx_msg, can_task_timeout)) == ESP_OK) { while ((ret = twai_receive(&rx_msg, can_task_timeout)) == ESP_OK) {
char data_bytes_str[70];
if (adv_filters.sw_filtering) { if (adv_filters.sw_filtering) {
if (!matches_filters(&rx_msg)) continue; if (!matches_filters(&rx_msg)) continue;
} }

View file

@ -3,9 +3,7 @@
#include "driver/twai.h" #include "driver/twai.h"
#include "hal/twai_types.h" #include "hal/twai_types.h"
#include "sdkconfig.h"
#include "freertos/semphr.h" #include "freertos/semphr.h"
#include <stdint.h>
#include <list.h> #include <list.h>
typedef enum { typedef enum {
@ -50,6 +48,6 @@ extern adv_filt_t adv_filters;
// functions // functions
void can_task(void* arg); void can_task(void* arg);
void can_msg_to_str(twai_message_t *can_msg, char *start_str, char *out_str); void can_msg_to_str(const twai_message_t *can_msg, char *start_str, char *out_str);
#endif // MAIN_CAN_H #endif // MAIN_CAN_H

View file

@ -45,28 +45,29 @@ static struct {
static int send_can_frame(int argc, char **argv) { static int send_can_frame(int argc, char **argv) {
twai_message_t msg = { 0 }; twai_message_t msg = { 0 };
char printf_str[70]; char printf_str[70];
int nerrors = arg_parse(argc, argv, (void **) &cansend_args); const 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]);
return 1; return 1;
} }
const char *can_msg_ptr = cansend_args.message->sval[0]; const char *can_msg_ptr = cansend_args.message->sval[0];
char *can_msg_str_buf = strdup(can_msg_ptr); char* can_msg_str_buf = strdup(can_msg_ptr);
char *id_substr = strtok(can_msg_str_buf, "#"); const char* id_substr = strtok(can_msg_str_buf, "#");
char *data_substr = strtok(NULL, "#"); const char *data_substr = strtok(NULL, "#");
if ((id_substr == NULL) || (strtok(NULL, "#") != NULL)) goto invalid_args; if ((id_substr == NULL) || (strtok(NULL, "#") != NULL)) goto invalid_args;
int id_l = strlen(id_substr); const int id_l = strlen(id_substr);
int dt_l = data_substr == NULL ? 0 : strlen(data_substr); const int dt_l = data_substr == NULL ? 0 : strlen(data_substr);
if ((id_l > 8) || (dt_l > 16) || (dt_l % 2)) goto invalid_args; if ((id_l > 8) || (dt_l > 16) || (dt_l % 2)) goto invalid_args;
for (int i = 0; i < id_l; i++) if(!isxdigit((int) id_substr[i])) goto invalid_args; for (int i = 0; i < id_l; i++) if(!isxdigit((int) id_substr[i])) goto invalid_args;
for (int i = 0; i < dt_l; i++) if(!isxdigit((int) data_substr[i])) goto invalid_args; for (int i = 0; i < dt_l; i++) if(!isxdigit((int) data_substr[i])) goto invalid_args;
int msg_id; int msg_id;
if (sscanf(id_substr, "%X", &msg_id) < 1) goto invalid_args; if (sscanf(id_substr, "%X", &msg_id) < 1) goto invalid_args;
for (int i = 0; i < (dt_l / 2); i++) { for (int i = 0; i < (dt_l / 2); i++) {
char *byte_to_parse = malloc(3); char* byte_to_parse = malloc(3);
strncpy(byte_to_parse, data_substr + i * 2, 2); // ReSharper disable once CppDFANullDereference (if dt_l == 0 we skip this loop)
strncpy(byte_to_parse, i * 2 + data_substr, 2);
int num; int num;
int res = sscanf(byte_to_parse, "%X", &num); const int res = sscanf(byte_to_parse, "%X", &num);
free(byte_to_parse); free(byte_to_parse);
if (res < 1) goto invalid_args; if (res < 1) goto invalid_args;
msg.data[i] = num; msg.data[i] = num;
@ -74,7 +75,7 @@ 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;
msg.extd = (id_l > 3); msg.extd = (id_l > 3);
esp_err_t res = twai_transmit(&msg, pdMS_TO_TICKS(1000)); const esp_err_t res = twai_transmit(&msg, pdMS_TO_TICKS(1000));
switch(res) { switch(res) {
case ESP_OK: case ESP_OK:
can_msg_to_str(&msg, "sent ", printf_str); can_msg_to_str(&msg, "sent ", printf_str);
@ -99,22 +100,16 @@ invalid_args:
} }
static int canrecover(int argc, char **argv) { static int canrecover(int argc, char **argv) {
esp_err_t res = twai_initiate_recovery(); const esp_err_t res = twai_initiate_recovery();
if (res == ESP_OK) print_w_clr_time("Started CAN recovery.", LOG_COLOR_GREEN, true); if (res == ESP_OK) print_w_clr_time("Started CAN recovery.", LOG_COLOR_GREEN, true);
else if (curr_can_state.state == CAN_NOT_INSTALLED) print_w_clr_time("CAN driver is not installed!", LOG_COLOR_RED, true); else if (curr_can_state.state == CAN_NOT_INSTALLED) print_w_clr_time("CAN driver is not installed!", LOG_COLOR_RED, true);
else print_w_clr_time("Can't start recovery - not in bus-off state!", LOG_COLOR_RED, true); else print_w_clr_time("Can't start recovery - not in bus-off state!", LOG_COLOR_RED, true);
return 0; return 0;
} }
static const char* can_states_str[] = { static const char* can_states_str[] = {"not installed", "stopped", "error active", "error passive", "bus off", "recovering"};
"not installed",
"stopped",
"error active",
"error passive",
"bus off",
"recovering"
};
// ReSharper disable once CppDFAConstantFunctionResult
static int canstats(int argc, char **argv) { static int canstats(int argc, char **argv) {
if (curr_can_state.state == CAN_NOT_INSTALLED) { if (curr_can_state.state == CAN_NOT_INSTALLED) {
print_w_clr_time("CAN driver is not installed!", LOG_COLOR_RED, true); print_w_clr_time("CAN driver is not installed!", LOG_COLOR_RED, true);
@ -146,11 +141,10 @@ static struct {
} canup_args; } canup_args;
static int canup(int argc, char **argv) { static int canup(int argc, char **argv) {
esp_err_t res;
static twai_timing_config_t t_config; static twai_timing_config_t t_config;
twai_general_config_t gen_cfg = default_g_config; twai_general_config_t gen_cfg = default_g_config;
twai_filter_config_t f_config; twai_filter_config_t f_config;
int nerrors = arg_parse(argc, argv, (void **) &canup_args); const int nerrors = arg_parse(argc, argv, (void **) &canup_args);
if (nerrors != 0) { if (nerrors != 0) {
arg_print_errors(stderr, canup_args.end, argv[0]); arg_print_errors(stderr, canup_args.end, argv[0]);
return 1; return 1;
@ -164,7 +158,7 @@ static int canup(int argc, char **argv) {
f_config = (twai_filter_config_t) TWAI_FILTER_CONFIG_ACCEPT_ALL(); f_config = (twai_filter_config_t) TWAI_FILTER_CONFIG_ACCEPT_ALL();
printf("Using accept all filters.\n"); printf("Using accept all filters.\n");
} }
esp_log_level_t prev_gpio_lvl = esp_log_level_get("gpio"); const esp_log_level_t prev_gpio_lvl = esp_log_level_get("gpio");
int mode = 0; int mode = 0;
if (canup_args.mode->count) { if (canup_args.mode->count) {
const char* mode_str = canup_args.mode->sval[0]; const char* mode_str = canup_args.mode->sval[0];
@ -239,7 +233,7 @@ static int canup(int argc, char **argv) {
} }
xSemaphoreTake(can_mutex, portMAX_DELAY); xSemaphoreTake(can_mutex, portMAX_DELAY);
esp_log_level_set("gpio", ESP_LOG_ERROR); esp_log_level_set("gpio", ESP_LOG_ERROR);
res = twai_driver_install(&gen_cfg, &t_config, &f_config); const esp_err_t res = twai_driver_install(&gen_cfg, &t_config, &f_config);
if (res == ESP_OK) { if (res == ESP_OK) {
print_w_clr_time("CAN driver installed", LOG_COLOR_BLUE, true); print_w_clr_time("CAN driver installed", LOG_COLOR_BLUE, true);
if (canup_args.autorecover->count) { if (canup_args.autorecover->count) {
@ -264,7 +258,7 @@ free_exit:
static int canstart(int argc, char **argv) { static int canstart(int argc, char **argv) {
xSemaphoreTake(can_mutex, portMAX_DELAY); xSemaphoreTake(can_mutex, portMAX_DELAY);
esp_err_t res = twai_start(); const esp_err_t res = twai_start();
if (res == ESP_OK) { if (res == ESP_OK) {
print_w_clr_time("CAN driver started", LOG_COLOR_GREEN, true); print_w_clr_time("CAN driver started", LOG_COLOR_GREEN, true);
is_error_passive = false; is_error_passive = false;
@ -276,7 +270,7 @@ static int canstart(int argc, char **argv) {
static int candown(int argc, char **argv) { static int candown(int argc, char **argv) {
xSemaphoreTake(can_mutex, portMAX_DELAY); xSemaphoreTake(can_mutex, portMAX_DELAY);
if (curr_can_state.state != CAN_BUF_OFF) { if (curr_can_state.state != CAN_BUF_OFF) {
esp_err_t res = twai_stop(); const esp_err_t res = twai_stop();
if (res == ESP_OK) print_w_clr_time("CAN was stopped.", LOG_COLOR_GREEN, true); if (res == ESP_OK) print_w_clr_time("CAN was stopped.", LOG_COLOR_GREEN, true);
else { else {
print_w_clr_time("Driver is not in running state, or is not installed.", LOG_COLOR_RED, true); print_w_clr_time("Driver is not in running state, or is not installed.", LOG_COLOR_RED, true);
@ -370,15 +364,15 @@ static struct {
} canfilter_args; } canfilter_args;
static int canfilter(int argc, char **argv) { static int canfilter(int argc, char **argv) {
int nerrors = arg_parse(argc, argv, (void **) &canfilter_args); const int nerrors = arg_parse(argc, argv, (void **) &canfilter_args);
if (nerrors != 0) { if (nerrors != 0) {
arg_print_errors(stderr, canfilter_args.end, argv[0]); arg_print_errors(stderr, canfilter_args.end, argv[0]);
return 1; return 1;
} }
const char* mask_s = canfilter_args.mask_arg->sval[0]; const char* mask_s = canfilter_args.mask_arg->sval[0];
const char* code_s = canfilter_args.code_arg->sval[0]; const char* code_s = canfilter_args.code_arg->sval[0];
int m_l = strlen(mask_s); const int m_l = strlen(mask_s);
int c_l = strlen(code_s); const int c_l = strlen(code_s);
if (m_l != 8 || c_l != 8) goto invalid_args; if (m_l != 8 || c_l != 8) goto invalid_args;
for (int i = 0; i < m_l; i++) if(!isxdigit((int) mask_s[i])) goto invalid_args; for (int i = 0; i < m_l; i++) if(!isxdigit((int) mask_s[i])) goto invalid_args;
for (int i = 0; i < c_l; i++) if(!isxdigit((int) code_s[i])) goto invalid_args; for (int i = 0; i < c_l; i++) if(!isxdigit((int) code_s[i])) goto invalid_args;
@ -439,8 +433,8 @@ void smartfilters_destroy(List** head) {
static int cansmartfilter(int argc, char **argv) { static int cansmartfilter(int argc, char **argv) {
char *filter_str_buf = NULL; char *filter_str_buf = NULL;
smart_filt_element_t *filt_element = NULL; smart_filt_element_t* filt_element = NULL;
int nerrors = arg_parse(argc, argv, (void **) &cansmart_args); const int nerrors = arg_parse(argc, argv, (void **) &cansmart_args);
if (nerrors != 0) { if (nerrors != 0) {
arg_print_errors(stderr, cansmart_args.end, argv[0]); arg_print_errors(stderr, cansmart_args.end, argv[0]);
return 1; return 1;
@ -455,14 +449,14 @@ static int cansmartfilter(int argc, char **argv) {
filt_element = malloc(sizeof(smart_filt_element_t)); filt_element = malloc(sizeof(smart_filt_element_t));
const char *filter_str_ptr = cansmart_args.filters->sval[i]; const char *filter_str_ptr = cansmart_args.filters->sval[i];
filter_str_buf = strdup(filter_str_ptr); filter_str_buf = strdup(filter_str_ptr);
char *code_substr = strtok(filter_str_buf, "#"); const char* code_substr = strtok(filter_str_buf, "#");
char *mask_substr = strtok(NULL, "#"); const char *mask_substr = strtok(NULL, "#");
if (code_substr == NULL || mask_substr == NULL || strtok(NULL, "#") != NULL) goto invalid_args; if (code_substr == NULL || mask_substr == NULL || strtok(NULL, "#") != NULL) goto invalid_args;
int m_l = strlen(mask_substr); const int m_l = strlen(mask_substr);
int c_l = strlen(code_substr); const int c_l = strlen(code_substr);
if (m_l > 8 || c_l > 8) goto invalid_args; if (m_l > 8 || c_l > 8) goto invalid_args;
for (int i = 0; i < m_l; i++) if (!isxdigit((int) mask_substr[i])) goto invalid_args; for (int j = 0; j < m_l; j++) if (!isxdigit((int) mask_substr[j])) goto invalid_args;
for (int i = 0; i < c_l; i++) if (!isxdigit((int) code_substr[i])) goto invalid_args; for (int j = 0; j < c_l; j++) if (!isxdigit((int) code_substr[j])) goto invalid_args;
if (sscanf(code_substr, "%" PRIX32, &filt_element->filt) < 1) goto invalid_args; if (sscanf(code_substr, "%" PRIX32, &filt_element->filt) < 1) goto invalid_args;
if (sscanf(mask_substr, "%" PRIX32, &filt_element->mask) < 1) goto invalid_args; if (sscanf(mask_substr, "%" PRIX32, &filt_element->mask) < 1) goto invalid_args;
free(filter_str_buf); free(filter_str_buf);
@ -471,11 +465,11 @@ static int cansmartfilter(int argc, char **argv) {
hwfilt_mask = filt_element->mask; hwfilt_mask = filt_element->mask;
hwfilt_code = filt_element->filt; hwfilt_code = filt_element->filt;
} else { } else {
uint32_t common_bits = filt_element->mask & hwfilt_mask; const uint32_t common_bits = filt_element->mask & hwfilt_mask;
uint32_t new_bits = filt_element->mask - common_bits; const uint32_t new_bits = filt_element->mask - common_bits;
uint32_t missing_bits = hwfilt_mask - common_bits; const uint32_t missing_bits = hwfilt_mask - common_bits;
hwfilt_mask &= filt_element->mask; hwfilt_mask &= filt_element->mask;
uint32_t bit_to_delete = (hwfilt_code ^ filt_element->filt) & hwfilt_mask; const uint32_t bit_to_delete = (hwfilt_code ^ filt_element->filt) & hwfilt_mask;
hwfilt_mask -= bit_to_delete; hwfilt_mask -= bit_to_delete;
if (new_bits || missing_bits || bit_to_delete) tmp_sw = true; if (new_bits || missing_bits || bit_to_delete) tmp_sw = true;
} }

View file

@ -8,7 +8,6 @@
#include "esp_chip_info.h" #include "esp_chip_info.h"
#include "esp_sleep.h" #include "esp_sleep.h"
#include "esp_flash.h" #include "esp_flash.h"
#include "driver/rtc_io.h"
#include "driver/uart.h" #include "driver/uart.h"
#include "argtable3/argtable3.h" #include "argtable3/argtable3.h"
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
@ -145,7 +144,7 @@ static void register_free(void)
/* 'heap' command prints minumum heap size */ /* 'heap' command prints minumum heap size */
static int heap_size(int argc, char **argv) static int heap_size(int argc, char **argv)
{ {
uint32_t heap_size = heap_caps_get_minimum_free_size(MALLOC_CAP_DEFAULT); const uint32_t heap_size = heap_caps_get_minimum_free_size(MALLOC_CAP_DEFAULT);
printf("min heap size: %"PRIu32"\n", heap_size); printf("min heap size: %"PRIu32"\n", heap_size);
return 0; return 0;
} }
@ -215,7 +214,7 @@ static const char* s_log_level_names[] = {
static int log_level(int argc, char **argv) static int log_level(int argc, char **argv)
{ {
int nerrors = arg_parse(argc, argv, (void **) &log_level_args); const int nerrors = arg_parse(argc, argv, (void **) &log_level_args);
if (nerrors != 0) { if (nerrors != 0) {
arg_print_errors(stderr, log_level_args.end, argv[0]); arg_print_errors(stderr, log_level_args.end, argv[0]);
return 1; return 1;
@ -225,7 +224,7 @@ static int log_level(int argc, char **argv)
const char* tag = log_level_args.tag->sval[0]; const char* tag = log_level_args.tag->sval[0];
const char* level_str = log_level_args.level->sval[0]; const char* level_str = log_level_args.level->sval[0];
esp_log_level_t level; esp_log_level_t level;
size_t level_len = strlen(level_str); const size_t level_len = strlen(level_str);
for (level = ESP_LOG_NONE; level <= ESP_LOG_VERBOSE; level++) { for (level = ESP_LOG_NONE; level <= ESP_LOG_VERBOSE; level++) {
if (memcmp(level_str, s_log_level_names[level], level_len) == 0) { if (memcmp(level_str, s_log_level_names[level], level_len) == 0) {
break; break;

View file

@ -1,12 +1,10 @@
#include "cmd_utils.h" #include "cmd_utils.h"
#include "esp_log.h" #include "esp_log.h"
#include "inttypes.h" #include "inttypes.h"
#include "freertos/projdefs.h"
#include "string.h" #include "string.h"
#include "esp_console.h" #include "esp_console.h"
#include "argtable3/argtable3.h" #include "argtable3/argtable3.h"
#include "xvprintf.h" #include "xvprintf.h"
#include <stddef.h>
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
@ -22,7 +20,7 @@ static struct {
} timestamp_args; } timestamp_args;
static int timestamp(int argc, char **argv) { static int timestamp(int argc, char **argv) {
int nerrors = arg_parse(argc, argv, (void **) &timestamp_args); const int nerrors = arg_parse(argc, argv, (void **) &timestamp_args);
if (nerrors != 0) { if (nerrors != 0) {
arg_print_errors(stderr, timestamp_args.end, argv[0]); arg_print_errors(stderr, timestamp_args.end, argv[0]);
return 1; return 1;

View file

@ -1,3 +1,4 @@
// ReSharper disable CppDFAUnreachableCode
#include "console.h" #include "console.h"
#include "sdkconfig.h" #include "sdkconfig.h"
#include <fcntl.h> #include <fcntl.h>
@ -8,7 +9,6 @@
#include "esp_vfs_dev.h" #include "esp_vfs_dev.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "esp_system.h"
#include "freertos/portmacro.h" #include "freertos/portmacro.h"
#include "freertos/projdefs.h" #include "freertos/projdefs.h"
#include "linenoise/linenoise.h" #include "linenoise/linenoise.h"
@ -39,7 +39,6 @@ SemaphoreHandle_t console_taken_sem;
static void update_prompt() { static void update_prompt() {
char text[45]; char text[45];
int text_len;
static char* prompt_color; static char* prompt_color;
text[0] = '\0'; text[0] = '\0';
switch (curr_can_state.state) { switch (curr_can_state.state) {
@ -82,19 +81,17 @@ static void update_prompt() {
} else { } else {
strcat(prompt_buf, text); strcat(prompt_buf, text);
} }
text_len = strlen(text); const int text_len = strlen(text);
ls.prompt = prompt_buf; ls.prompt = prompt_buf;
ls.plen = text_len; ls.plen = text_len;
} }
void console_task_tx(void* arg) { void console_task_tx(void* arg) {
static const TickType_t prompt_timeout = pdMS_TO_TICKS(200); static const TickType_t prompt_timeout = pdMS_TO_TICKS(200);
// static const TickType_t prompt_timeout = portMAX_DELAY;
const int fd = fileno(stdout); const int fd = fileno(stdout);
char *msg_to_print;
size_t msg_to_print_size; size_t msg_to_print_size;
while(1) { while(1) {
msg_to_print = (char *)xRingbufferReceive(can_messages, &msg_to_print_size, prompt_timeout); char* msg_to_print = xRingbufferReceive(can_messages, &msg_to_print_size, prompt_timeout);
update_prompt(); update_prompt();
xSemaphoreTake(console_taken_sem, portMAX_DELAY); xSemaphoreTake(console_taken_sem, portMAX_DELAY);
xSemaphoreTake(stdout_taken_sem, portMAX_DELAY); xSemaphoreTake(stdout_taken_sem, portMAX_DELAY);
@ -117,10 +114,9 @@ void console_task_interactive(void* arg) {
console_taken_sem = xSemaphoreCreateMutex(); console_taken_sem = xSemaphoreCreateMutex();
stdout_taken_sem = xSemaphoreCreateMutex(); stdout_taken_sem = xSemaphoreCreateMutex();
char *buf = calloc(1, console_config.max_cmdline_length); char *buf = calloc(1, console_config.max_cmdline_length);
char *line;
/* Figure out if the terminal supports escape sequences */ /* Figure out if the terminal supports escape sequences */
printf("Testing your console...\n"); printf("Testing your console...\n");
int probe_status = linenoiseProbe(); const int probe_status = linenoiseProbe();
// int probe_status = 1; // int probe_status = 1;
if (probe_status) { /* zero indicates success */ if (probe_status) { /* zero indicates success */
printf("\n" printf("\n"
@ -142,7 +138,7 @@ void console_task_interactive(void* arg) {
xTaskCreate(console_task_tx, "console tsk tx", 5000, NULL, CONFIG_CONSOLE_TX_PRIORITY, NULL); xTaskCreate(console_task_tx, "console tsk tx", 5000, NULL, CONFIG_CONSOLE_TX_PRIORITY, NULL);
esp_log_set_vprintf(&vxprintf); esp_log_set_vprintf(&vxprintf);
while (true) { while (true) {
line = linenoiseEditFeed(&ls); char* line = linenoiseEditFeed(&ls);
if (line == linenoiseEditMore) continue; if (line == linenoiseEditMore) continue;
xSemaphoreTake(console_taken_sem, portMAX_DELAY); xSemaphoreTake(console_taken_sem, portMAX_DELAY);
linenoiseEditStop(&ls); linenoiseEditStop(&ls);
@ -159,7 +155,7 @@ void console_task_interactive(void* arg) {
} }
int ret; int ret;
esp_err_t err = esp_console_run(line, &ret); const esp_err_t err = esp_console_run(line, &ret);
if (err == ESP_ERR_NOT_FOUND) { if (err == ESP_ERR_NOT_FOUND) {
printf("Unrecognized command\n"); printf("Unrecognized command\n");
} else if (err == ESP_ERR_INVALID_ARG) { } else if (err == ESP_ERR_INVALID_ARG) {

View file

@ -11,7 +11,7 @@ static const char* TAG = "fs";
void initialize_filesystem(void) { void initialize_filesystem(void) {
static wl_handle_t wl_handle; static wl_handle_t wl_handle;
const esp_vfs_fat_mount_config_t mount_config = {.max_files = 4, .format_if_mount_failed = true}; const esp_vfs_fat_mount_config_t mount_config = {.max_files = 4, .format_if_mount_failed = true};
esp_err_t err = esp_vfs_fat_spiflash_mount_rw_wl(MOUNT_PATH, "storage", &mount_config, &wl_handle); const esp_err_t err = esp_vfs_fat_spiflash_mount_rw_wl(MOUNT_PATH, "storage", &mount_config, &wl_handle);
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGE(TAG, "Failed to mount FATFS (%s)", esp_err_to_name(err)); ESP_LOGE(TAG, "Failed to mount FATFS (%s)", esp_err_to_name(err));
return; return;

View file

@ -15,8 +15,7 @@ void init_tx_ringbuf() {
// @important Do NOT use the ESP_LOG* macro's in this function ELSE recursive loop and stack overflow! So use printf() instead for debug messages. // @important Do NOT use the ESP_LOG* macro's in this function ELSE recursive loop and stack overflow! So use printf() instead for debug messages.
int vxprintf(const char *fmt, va_list args) { int vxprintf(const char *fmt, va_list args) {
char msg_to_send[300]; char msg_to_send[300];
size_t str_len; const size_t str_len = vsnprintf(msg_to_send, 299, fmt, args);
str_len = vsnprintf(msg_to_send, 299, fmt, args);
xRingbufferSend(can_messages, msg_to_send, str_len + 1, pdMS_TO_TICKS(200)); xRingbufferSend(can_messages, msg_to_send, str_len + 1, pdMS_TO_TICKS(200));
return str_len; return str_len;
} }