#include #include #include "fatfs/ff.h" #include "syslog.h" #include "FreeRTOS.h" #include "task.h" #define X(cnt) volatile unsigned cnt = 0; COUNTERS_XMACRO #undef X const int syslog_size = 16; xQueueHandle syslog_queue; void syslog_init() { syslog_queue = xQueueCreate(syslog_size, sizeof(syslog_entry_t)); } void syslog_poll(portTickType timeout) { syslog_entry_t entry; FIL file; unsigned count; // Check event counters #define X(cnt) \ count = counter_get_and_zero(cnt); \ if (count != 0) \ syslog("Counter " #cnt ": %d", count, 0); COUNTERS_XMACRO #undef X if (xQueuePeek(syslog_queue, &entry, 0) == pdTRUE) { // There are messages to log if (f_open(&file, "/syslog", FA_WRITE | FA_OPEN_ALWAYS) != FR_OK) return; if (f_lseek(&file, f_size(&file)) != FR_OK) { f_close(&file); return; } while (xQueueReceive(syslog_queue, &entry, timeout) == pdTRUE) { fprintf((FILE*)&file, "%8u ", (unsigned)xTaskGetTickCount()); fprintf((FILE*)&file, entry.format, entry.arg1, entry.arg2); fprintf((FILE*)&file, "\n"); } f_close(&file); } } void syslog_task(void *pvParameters) { for (;;) { syslog_poll(10); } }