#include /* FreeRTOS */ #include "freertos/FreeRTOS.h" #include "freertos/semphr.h" #include "freertos/task.h" /* App */ #include "app_report_rb.h" #define APP_REPORT_RB_SIZE 6400 static app_report_rb_t s_report_rb[APP_REPORT_RB_SIZE]; static volatile uint32_t s_report_rb_rptr = 0U; static volatile uint32_t s_report_rb_wptr = 0U; static SemaphoreHandle_t s_report_rb_semphr = NULL; int app_report_rb_init(void) { s_report_rb_semphr = xSemaphoreCreateMutex(); if (s_report_rb_semphr == NULL) { return -1; } s_report_rb_rptr = 0U; s_report_rb_wptr = 0U; return 0; } void app_report_rb_append(app_report_rb_t *rpt) { if (xSemaphoreTake(s_report_rb_semphr, portMAX_DELAY) != pdPASS) { return; } memcpy(&s_report_rb[s_report_rb_wptr], rpt, sizeof(app_report_rb_t)); if (s_report_rb_wptr < APP_REPORT_RB_SIZE - 1) { s_report_rb_wptr++; } else { s_report_rb_wptr = 0UL; } xSemaphoreGive(s_report_rb_semphr); } void app_report_rb_consume(app_report_rb_t *rpt) { if (xSemaphoreTake(s_report_rb_semphr, portMAX_DELAY) != pdPASS) { return; } memcpy(rpt, &s_report_rb[s_report_rb_rptr], sizeof(app_report_rb_t)); if (s_report_rb_rptr < APP_REPORT_RB_SIZE - 1) { s_report_rb_rptr++; } else { s_report_rb_rptr = 0UL; } xSemaphoreGive(s_report_rb_semphr); } void app_report_rb_flush(void) { if (xSemaphoreTake(s_report_rb_semphr, portMAX_DELAY) != pdPASS) { return; } s_report_rb_wptr = 0U; s_report_rb_rptr = 0U; xSemaphoreGive(s_report_rb_semphr); } uint32_t app_report_rb_get_count(void) { uint32_t ret = 0; if (xSemaphoreTake(s_report_rb_semphr, portMAX_DELAY) != pdPASS) { return ret; } if (s_report_rb_wptr >= s_report_rb_rptr) { ret = s_report_rb_wptr - s_report_rb_rptr; } else { ret = (APP_REPORT_RB_SIZE - s_report_rb_rptr) + s_report_rb_wptr; } xSemaphoreGive(s_report_rb_semphr); return ret; } uint32_t app_report_rb_get_total_size(void) { return APP_REPORT_RB_SIZE; } void app_report_rb_discard(uint32_t num) { if (num > app_report_rb_get_count()) { return; } uint32_t tmp_ptr = s_report_rb_wptr + num; if (tmp_ptr > APP_REPORT_RB_SIZE) { tmp_ptr -= APP_REPORT_RB_SIZE; } s_report_rb_wptr = tmp_ptr; }