From 9435a85605d7efc75642491c85b0942bd558fcec Mon Sep 17 00:00:00 2001 From: xengineering Date: Sun, 25 Oct 2020 12:49:35 +0100 Subject: Add usart_irq Code --- libraries/fifo.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 libraries/fifo.c (limited to 'libraries/fifo.c') diff --git a/libraries/fifo.c b/libraries/fifo.c new file mode 100644 index 0000000..faa9fc4 --- /dev/null +++ b/libraries/fifo.c @@ -0,0 +1,66 @@ + + +#include "fifo.h" + + +void fifo_init(FIFO *fifo, uint16_t bufferlength) +{ + fifo->buffer_ptr = calloc(bufferlength, sizeof(uint8_t)); + fifo->read_index = 0; + fifo->write_index = 0; + fifo->bufferlength = bufferlength; +} + +void fifo_deinit(FIFO *fifo) +{ + free(fifo->buffer_ptr); +} + +uint16_t fifo_get_buffersize(FIFO *fifo) +{ + return fifo->bufferlength; +} + +uint16_t fifo_bytes_available(FIFO *fifo) +{ + if (fifo->write_index > fifo->read_index){ + return (fifo->write_index - fifo->read_index); + } + else if (fifo->write_index < fifo->read_index){ + return (fifo_get_buffersize(fifo) - (fifo->read_index - fifo->write_index)); + } + else { // read_index == write_index + return 0; + } +} + +//uint16_t fifo_lines_available(FIFO *fifo){} + +void fifo_move_read_index(FIFO *fifo) +{ + fifo->read_index++; + fifo->read_index %= fifo_get_buffersize(fifo); +} + +void fifo_move_write_index(FIFO *fifo) +{ + fifo->write_index++; + fifo->write_index %= fifo_get_buffersize(fifo); +} + +void fifo_get_byte(FIFO *fifo, uint8_t *data_sink) +{ + if(fifo_bytes_available(fifo)){ + *data_sink = fifo->buffer_ptr[fifo->read_index]; + fifo_move_read_index(fifo); + } +} + +void fifo_put_byte(FIFO *fifo, uint8_t *data_source) +{ + fifo->buffer_ptr[fifo->write_index] = *data_source; + fifo_move_write_index(fifo); + if(fifo->read_index == fifo->write_index){ // buffer overflow case + fifo_move_read_index(fifo); + } +} -- cgit v1.2.3-70-g09d2