diff --git a/epicardium/ble/ble.c b/epicardium/ble/ble.c index cb613ddc4bd88247551f401aeee43e822f7db803..02c0af400efeb96cccb1f919917dc6111d0a54f6 100644 --- a/epicardium/ble/ble.c +++ b/epicardium/ble/ble.c @@ -95,6 +95,7 @@ void WsfPDump(wsfPDumpType_t pdType, uint16_t length, uint8_t *pBuffer) { uint32_t direction; uint8_t type; + int ret; if (log_enabled) { switch (pdType) { @@ -131,11 +132,29 @@ void WsfPDump(wsfPDumpType_t pdType, uint16_t length, uint8_t *pBuffer) .timestamp_us_l = __htonl(timestamp_us & 0xFFFFFFFF) }; - epic_file_write(log_fd, &header, sizeof(header)); - epic_file_write(log_fd, &type, sizeof(type)); - epic_file_write(log_fd, pBuffer, length); + ret = epic_file_write(log_fd, &header, sizeof(header)); + if (ret != sizeof(header)) { + goto out_err; + } + + ret = epic_file_write(log_fd, &type, sizeof(type)); + if (ret != sizeof(type)) { + goto out_err; + } + + ret = epic_file_write(log_fd, pBuffer, length); + if (ret != length) { + goto out_err; + } + log_dirty = true; } + + return; + +out_err: + LOG_WARN("ble", "Log file write failed. Logging diabled"); + log_enabled = false; } /*************************************************************************************************/ static void WsfInit(void) @@ -319,15 +338,25 @@ static void log_flush(void) } } /*************************************************************************************************/ -static void log_rotate(void) +static int log_rotate(void) { int i; char filename_old[16]; char filename_new[16]; struct epic_stat stat; + int ret; - if (epic_file_stat("logs/", &stat) != 0) { - epic_file_mkdir("logs"); + epic_file_stat("logs", &stat); + + if (stat.type == EPICSTAT_FILE) { + return -1; + } + + if (stat.type == EPICSTAT_NONE) { + ret = epic_file_mkdir("logs"); + if (ret < 0) { + return ret; + } } if (epic_file_stat("logs/ble9.log", &stat) == 0) { @@ -346,6 +375,43 @@ static void log_rotate(void) if (epic_file_stat("logs/ble.log", &stat) == 0) { epic_file_rename("logs/ble.log", "logs/ble1.log"); } + + return 0; +} +/*************************************************************************************************/ +static void log_init(void) +{ + int ret; + log_enabled = config_get_boolean_with_default("ble_log_enable", false); + + if (!log_enabled) { + return; + } + + LOG_INFO("ble", "Log is enabled"); + + if (log_rotate() < 0) { + log_enabled = false; + LOG_WARN("ble", "Can not rotate logs. Logging disabled."); + return; + } + + log_fd = epic_file_open("logs/ble.log", "w"); + if (log_fd < 0) { + log_enabled = false; + LOG_WARN("ble", "Can not create log file. Logging disabled."); + return; + } + + ret = epic_file_write(log_fd, log_header, sizeof(log_header)); + if (ret != sizeof(log_header)) { + log_enabled = false; + LOG_WARN( + "ble", + "Can not create log file header. Logging disabled." + ); + return; + } } /*************************************************************************************************/ void vBleTask(void *pvParameters) @@ -357,14 +423,7 @@ void vBleTask(void *pvParameters) */ vTaskDelay(pdMS_TO_TICKS(500)); - log_enabled = config_get_boolean_with_default("ble_log_enable", false); - - if (log_enabled) { - LOG_INFO("ble", "Log is enabled"); - log_rotate(); - log_fd = epic_file_open("logs/ble.log", "w"); - epic_file_write(log_fd, log_header, sizeof(log_header)); - } + log_init(); /* We are going to execute FreeRTOS functions from callbacks * coming from this interrupt. Its priority needs to be