60 lines
1.0 KiB
C

#include "fifo.h"
static struct fifo_item fifo[FIFO_SIZE] = {0};
static uint8_t count = 0;
static volatile uint8_t read_idx = 0;
static volatile uint8_t write_idx = 0;
inline uint8_t fifo_count(void) {
return count;
}
void fifo_flush(void) {
write_idx = 0;
read_idx = 0;
count = 0;
}
uint8_t fifo_enqueue(const struct fifo_item item) {
if (count >= FIFO_SIZE)
return 0;
fifo[write_idx].state = item.state;
fifo[write_idx].key = item.key;
write_idx++;
write_idx %= FIFO_SIZE;
++count;
return 1;
}
void fifo_enqueue_force(const struct fifo_item item) {
if (fifo_enqueue(item))
return;
fifo[write_idx].state = item.state;
fifo[write_idx].key = item.key;
write_idx++;
write_idx %= FIFO_SIZE;
read_idx++;
read_idx %= FIFO_SIZE;
}
void fifo_dequeue(struct fifo_item* const outItem) {
if (outItem == NULL)
return;
if (count == 0)
return;
outItem->state = fifo[read_idx].state;
outItem->key = fifo[read_idx].key;
read_idx++;
read_idx %= FIFO_SIZE;
--count;
}