4static const uint16_t FRAM_BUFFER_SIZE =
7static const uint16_t FRAM_BUFFER_READ_ADDR = 0x06F0;
8static const uint16_t FRAM_BUFFER_WRITE_ADDR = 0x06F2;
9static const uint16_t FRAM_BUFFER_LEN_ADDR = 0x06F4;
12static uint16_t read_addr = 0;
13static uint16_t write_addr = 0;
14static uint16_t buffer_len = 0;
22static inline void update_addr(uint16_t* addr,
const uint16_t num_bytes) {
23 *addr = (*addr + num_bytes) % FRAM_BUFFER_SIZE;
35static uint16_t get_remaining_space(
void) {
36 uint16_t space_used = 0;
37 if (write_addr > read_addr) {
38 space_used = write_addr - read_addr;
39 }
else if (write_addr < read_addr) {
40 space_used = FRAM_BUFFER_SIZE - (read_addr - write_addr);
45 space_used = FRAM_BUFFER_SIZE;
51 uint16_t remaining_space = FRAM_BUFFER_SIZE - space_used;
52 return remaining_space;
57 if (num_bytes > get_remaining_space()) {
64 status =
fram_write(write_addr, &num_bytes, 1);
68 update_addr(&write_addr, 1);
79 update_addr(&write_addr, num_bytes_first_half);
82 num_bytes - num_bytes_first_half);
86 update_addr(&write_addr, num_bytes - num_bytes_first_half);
92 update_addr(&write_addr, num_bytes);
104 if (buffer_len == 0) {
114 update_addr(&read_addr, 1);
125 update_addr(&read_addr, len_first_half);
127 status =
fram_read(read_addr, *len - len_first_half,
data + len_first_half);
131 update_addr(&read_addr, *len - len_first_half);
137 update_addr(&read_addr, *len);
149 if (buffer_len == 0) {
152 if (idx >= buffer_len) {
157 uint16_t temp_read_addr = read_addr;
160 for (
size_t i = 0;
i < idx;
i++) {
162 status =
fram_read(temp_read_addr, 1, &temp_len);
166 update_addr(&temp_read_addr, 1 + temp_len);
170 status =
fram_read(temp_read_addr, 1, len);
174 update_addr(&temp_read_addr, 1);
191 update_addr(&temp_read_addr, len_first_half);
194 fram_read(temp_read_addr, *len - len_first_half,
data + len_first_half);
198 update_addr(&temp_read_addr, *len - len_first_half);
204 update_addr(&temp_read_addr, *len);
212 if (buffer_len == 0) {
224 update_addr(&read_addr, 1 + len);
250 buffer[1] = read_addr >> 8;
251 buffer[0] = read_addr & 0xFF;
261 buffer[1] = write_addr >> 8;
262 buffer[0] = write_addr & 0xFF;
271 buffer[1] = buffer_len >> 8;
272 buffer[0] = buffer_len & 0xFF;
297 if (status !=
FRAM_OK)
return status;
306 status =
fram_read(FRAM_BUFFER_WRITE_ADDR,
sizeof(write_addr),
buffer);
307 if (status !=
FRAM_OK)
return status;
316 if (status !=
FRAM_OK)
return status;
Circular buffer as FIFO data structure for buffering measurements.
fram_status fifo_get(uint8_t *data, uint8_t *len)
Reads a measurement from the queue.
int fifo_size(void)
Gets the total number of bytes in the buffer.
#define FRAM_BUFFER_START
uint16_t fifo_buffer_len(void)
Get the current number of measurements stored in the buffer.
fram_status fifo_buffer_clear(void)
Clears the buffer.
fram_status fifo_put(const uint8_t *data, const uint8_t num_bytes)
Puts a measurement into the circular buffer.
fram_status fifo_drop(void)
Drops the next measurement in the buffer.
fram_status fifo_save_buffer_state(void)
Saves the buffer state (read address, write address, and buffer length) to FRAM.
fram_status fifo_peek(size_t idx, uint8_t *data, uint8_t *len)
Peeks at the next measurement in the buffer without removing it.
fram_status fifo_init(void)
Initializes the buffer.
fram_status fifo_load_buffer_state(void)
Loads the buffer state (read address, write address, and buffer length) from FRAM.
fram_status fram_write(fram_addr addr, const uint8_t *data, size_t len)
Write bytes at the given address.
fram_status fram_read(fram_addr addr, size_t len, uint8_t *data)
Read bytes at the given address.