108 lines
2.4 KiB
C
108 lines
2.4 KiB
C
#include <string.h>
|
|
|
|
/* 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;
|
|
}
|