summaryrefslogtreecommitdiff
path: root/libraries/fifo.h
blob: 700d2ec1f104cfed2f8c486286426e54d1e99613 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61


/*
	FIFO Ring Buffer uint8_t array ring_buffer (example length is 8) 
	   with data (x) and read and write index:

	 --- --- --- --- --- --- --- ---
	|   |   | x | x | x |   |   |   |
	 --- --- --- --- --- --- --- ---
			  ^		   ^
			  |		   |
		  read_index	  |
					 write_index

	 --- --- --- --- --- --- --- ---
	| x | x |   |   |   | x | x | x |
	 --- --- --- --- --- --- --- ---
			  ^		   ^
			  |		   |
		 write_index	  |
					  read_index

	- input data goes to position of write_index
	- output data comes from read_index position
	- after input/output operation the according index has to be modified
	- according to the idea of ring buffers the write_index could be 
	  smaller than the read_index
*/


#ifndef FIFO_H
#define FIFO_H


#include <stdint.h>
#include <stdlib.h>


typedef struct FIFO{
	uint8_t *buffer_ptr;
	uint16_t bufferlength;
	uint16_t read_index;
	uint16_t write_index;
} FIFO;


void fifo_init(FIFO *fifo, uint8_t *buffer, uint16_t bufferlength);

uint16_t fifo_get_buffersize(FIFO *fifo);

uint16_t fifo_bytes_available(FIFO *fifo);
uint16_t fifo_lines_available(FIFO *fifo);

void fifo_move_read_index(FIFO *fifo);
void fifo_move_write_index(FIFO *fifo);

void fifo_get_byte(FIFO *fifo, uint8_t *data_sink);
void fifo_put_byte(FIFO *fifo, uint8_t *data_source);


#endif /* FIFO_H */