diff options
-rw-r--r-- | stm32f091/backlog.c | 33 | ||||
-rw-r--r-- | stm32f091/backlog.h | 9 | ||||
-rw-r--r-- | stm32f091/makefile | 1 |
3 files changed, 40 insertions, 3 deletions
diff --git a/stm32f091/backlog.c b/stm32f091/backlog.c index 1c847f0..3f21924 100644 --- a/stm32f091/backlog.c +++ b/stm32f091/backlog.c @@ -1 +1,34 @@ +#include <stdlib.h> + #include "backlog.h" + +ws_s_backlog_database* WS_G_BACKLOG_DATABASE = NULL; + +void ws_backlog_alloc(uint16_t record_amt) { + WS_G_BACKLOG_DATABASE = malloc(sizeof(ws_s_backlog_database) + sizeof(ws_s_backlog_record) * record_amt); + WS_G_BACKLOG_DATABASE->buffer_size = record_amt; + WS_G_BACKLOG_DATABASE->buffer_start = 0; + WS_G_BACKLOG_DATABASE->buffer_end = 0; +} + +void ws_backlog_add_record(ws_s_backlog_record record) { + static uint16_t id = 0; + + WS_G_BACKLOG_DATABASE->records[WS_G_BACKLOG_DATABASE->buffer_end].id = id++; + WS_G_BACKLOG_DATABASE->records[WS_G_BACKLOG_DATABASE->buffer_end].sens_atm_pressure = record.sens_atm_pressure; + WS_G_BACKLOG_DATABASE->records[WS_G_BACKLOG_DATABASE->buffer_end].sens_humidity = record.sens_humidity; + WS_G_BACKLOG_DATABASE->records[WS_G_BACKLOG_DATABASE->buffer_end].sens_temperature = record.sens_temperature; + + // shift buffer start/end + WS_G_BACKLOG_DATABASE->buffer_end = (WS_G_BACKLOG_DATABASE->buffer_end + 1) % WS_G_BACKLOG_DATABASE->buffer_size; + if (WS_G_BACKLOG_DATABASE->buffer_end == WS_G_BACKLOG_DATABASE->buffer_start) + WS_G_BACKLOG_DATABASE->buffer_start = (WS_G_BACKLOG_DATABASE->buffer_start + 1) % WS_G_BACKLOG_DATABASE->buffer_size; +} + +ws_s_backlog_record* ws_backlog_get_record(uint16_t record_index) { + return &WS_G_BACKLOG_DATABASE->records[record_index]; +} + +ws_s_backlog_record* ws_backlog_get_last_record(uint16_t record_offset) { + return ws_backlog_get_record((WS_G_BACKLOG_DATABASE->buffer_end - record_offset - 1) % WS_G_BACKLOG_DATABASE->buffer_size); +} diff --git a/stm32f091/backlog.h b/stm32f091/backlog.h index 7051ecf..465b3c0 100644 --- a/stm32f091/backlog.h +++ b/stm32f091/backlog.h @@ -20,10 +20,10 @@ typedef struct { } ws_s_backlog_record; typedef struct { - uint16_t buffer_size; /**< buffer size (buffer_size + 1 = amount of records) */ + uint16_t buffer_size; /**< buffer size (amount of records) */ uint16_t buffer_start; /** first record index */ uint16_t buffer_end; /** last record index */ - ws_s_backlog_record* records; /** pointer to record array */ + ws_s_backlog_record records[]; /** record array */ } ws_s_backlog_database; // disable struct packing @@ -38,7 +38,7 @@ extern ws_s_backlog_database* WS_G_BACKLOG_DATABASE; * automatically sets record.id, pushes buffer_end forwards and overwrites the * last record if the buffer is full */ -void ws_backlog_add_record(ws_s_backlog_record* record); +void ws_backlog_add_record(ws_s_backlog_record record); /** * there's intentionally no function to retrieve multiple records as an array, @@ -52,3 +52,6 @@ void ws_backlog_add_record(ws_s_backlog_record* record); /** @brief get pointer to record with index `record_index` from the database */ ws_s_backlog_record* ws_backlog_get_record(uint16_t record_index); +/** @brief get pointer to last record with offset `record_offset` from the database */ +ws_s_backlog_record* ws_backlog_get_last_record(uint16_t record_offset); + diff --git a/stm32f091/makefile b/stm32f091/makefile index 08c582a..10ede8c 100644 --- a/stm32f091/makefile +++ b/stm32f091/makefile @@ -11,6 +11,7 @@ SHARED_FLAGS += -Wall SHARED_FLAGS += -Wextra # SHARED_FLAGS += -Wno-register SHARED_FLAGS += -Wa,--defsym,CALL_ARM_SYSTEM_INIT=1 +# SHARED_FLAGS += -I/usr/arm-none-eabi/include/ SHARED_FLAGS += -I./lib/STM32-base-STM32Cube/CMSIS/ARM/inc SHARED_FLAGS += -I./lib/STM32-base-STM32Cube/CMSIS/STM32F0xx/inc SHARED_FLAGS += -I./lib/STM32-base/startup |