ESP32_DHT_Node/main/app_report_rb.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;
}