diff options
| author | lonkaars <loek@pipeframe.xyz> | 2022-10-19 18:15:36 +0200 | 
|---|---|---|
| committer | lonkaars <loek@pipeframe.xyz> | 2022-10-19 18:15:36 +0200 | 
| commit | 89b8217435286081dc0fe481559da3ee5c20c72a (patch) | |
| tree | 9be59daf476878a8e55c17776f6c3760d02a27a5 /stm32f091 | |
| parent | e555b5b5e0ad94279ef62d16feacee4976e2970d (diff) | |
last-records response handler implemented
Diffstat (limited to 'stm32f091')
| -rw-r--r-- | stm32f091/backlog.c | 41 | ||||
| -rw-r--r-- | stm32f091/backlog.h | 4 | 
2 files changed, 30 insertions, 15 deletions
diff --git a/stm32f091/backlog.c b/stm32f091/backlog.c index 3f21924..926ccad 100644 --- a/stm32f091/backlog.c +++ b/stm32f091/backlog.c @@ -2,33 +2,46 @@  #include "backlog.h" -ws_s_backlog_database* WS_G_BACKLOG_DATABASE = NULL; +ws_s_backlog_database* g_ws_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; +	g_ws_backlog_database = malloc(sizeof(ws_s_backlog_database) + sizeof(ws_s_backlog_record) * record_amt); +	g_ws_backlog_database->buffer_size = record_amt; +	g_ws_backlog_database->buffer_start = 0; +	g_ws_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; +	g_ws_backlog_database->records[g_ws_backlog_database->buffer_end].id = id++; +	g_ws_backlog_database->records[g_ws_backlog_database->buffer_end].sens_atm_pressure = record.sens_atm_pressure; +	g_ws_backlog_database->records[g_ws_backlog_database->buffer_end].sens_humidity = record.sens_humidity; +	g_ws_backlog_database->records[g_ws_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; +	g_ws_backlog_database->buffer_end = (g_ws_backlog_database->buffer_end + 1) % g_ws_backlog_database->buffer_size; +	if (g_ws_backlog_database->buffer_end == g_ws_backlog_database->buffer_start) +		g_ws_backlog_database->buffer_start = (g_ws_backlog_database->buffer_start + 1) % g_ws_backlog_database->buffer_size;  }  ws_s_backlog_record* ws_backlog_get_record(uint16_t record_index) { -	return &WS_G_BACKLOG_DATABASE->records[record_index]; +	return &g_ws_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); +	return ws_backlog_get_record((g_ws_backlog_database->buffer_end - record_offset - 1) % g_ws_backlog_database->buffer_size); +} + +static uint16_t mod(uint16_t a, uint16_t b) { +	uint16_t m = a % b; +	return m < 0 ? (b < 0) ? m - b : m + b : m; +} + +uint16_t ws_backlog_get_record_count() { +	// add buffer_size to the result of the modulo operation if it's result is negative +	// (only works when buffer_size is less than 2^15) +	// this is a consequence of the way in which c handles negative numbers in modulo operations +	int16_t mod = (g_ws_backlog_database->buffer_end - g_ws_backlog_database->buffer_start) % g_ws_backlog_database->buffer_size; +	return mod < 0 ? mod + g_ws_backlog_database->buffer_size : mod;  } diff --git a/stm32f091/backlog.h b/stm32f091/backlog.h index 465b3c0..c8ea019 100644 --- a/stm32f091/backlog.h +++ b/stm32f091/backlog.h @@ -30,7 +30,7 @@ typedef struct {  #pragma pack(pop)  /** @brief global record backlog database pointer */ -extern ws_s_backlog_database* WS_G_BACKLOG_DATABASE; +extern ws_s_backlog_database* g_ws_backlog_database;  /**   * @brief add record to database @@ -55,3 +55,5 @@ 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); +/** @brief return amount of valid records in database */ +uint16_t ws_backlog_get_record_count();  |