aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--stm32f091/backlog.c33
-rw-r--r--stm32f091/backlog.h9
-rw-r--r--stm32f091/makefile1
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