Circular Buffer C implementation, must create a buffer structure instance in your main and then dinamically allocate memory for the buffer array.
circularBuff.cpp@0:f6f6750994d2, 2019-05-17 (annotated)
- Committer:
- ivaariasga
- Date:
- Fri May 17 13:06:31 2019 +0000
- Revision:
- 0:f6f6750994d2
Circular Buffer C implementation, must create an instance of the buffer structure and then allocate memory dinamically for the buffer.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ivaariasga | 0:f6f6750994d2 | 1 | #include "circularBuff.h" |
ivaariasga | 0:f6f6750994d2 | 2 | |
ivaariasga | 0:f6f6750994d2 | 3 | int circ_buf_rst(circ_buf_t * cbuf) |
ivaariasga | 0:f6f6750994d2 | 4 | { |
ivaariasga | 0:f6f6750994d2 | 5 | int r = -1; |
ivaariasga | 0:f6f6750994d2 | 6 | |
ivaariasga | 0:f6f6750994d2 | 7 | if(cbuf) |
ivaariasga | 0:f6f6750994d2 | 8 | { |
ivaariasga | 0:f6f6750994d2 | 9 | cbuf->head = 0; |
ivaariasga | 0:f6f6750994d2 | 10 | cbuf->tail = 0; |
ivaariasga | 0:f6f6750994d2 | 11 | r = 0; |
ivaariasga | 0:f6f6750994d2 | 12 | } |
ivaariasga | 0:f6f6750994d2 | 13 | |
ivaariasga | 0:f6f6750994d2 | 14 | return r; |
ivaariasga | 0:f6f6750994d2 | 15 | } |
ivaariasga | 0:f6f6750994d2 | 16 | |
ivaariasga | 0:f6f6750994d2 | 17 | bool circ_buf_empty(circ_buf_t cbuf) |
ivaariasga | 0:f6f6750994d2 | 18 | { |
ivaariasga | 0:f6f6750994d2 | 19 | // We define empty as head == tail |
ivaariasga | 0:f6f6750994d2 | 20 | return (cbuf.head == cbuf.tail); |
ivaariasga | 0:f6f6750994d2 | 21 | } |
ivaariasga | 0:f6f6750994d2 | 22 | |
ivaariasga | 0:f6f6750994d2 | 23 | bool circ_buf_full(circ_buf_t cbuf) |
ivaariasga | 0:f6f6750994d2 | 24 | { |
ivaariasga | 0:f6f6750994d2 | 25 | // We determine "full" case by head being one position behind the tail |
ivaariasga | 0:f6f6750994d2 | 26 | // Note that this means we are wasting one space in the buffer! |
ivaariasga | 0:f6f6750994d2 | 27 | // Instead, you could have an "empty" flag and determine buffer full that way |
ivaariasga | 0:f6f6750994d2 | 28 | return ((cbuf.head + 1) % cbuf.size) == cbuf.tail; |
ivaariasga | 0:f6f6750994d2 | 29 | } |
ivaariasga | 0:f6f6750994d2 | 30 | |
ivaariasga | 0:f6f6750994d2 | 31 | int circ_buf_put(circ_buf_t * cbuf, uint8_t data) |
ivaariasga | 0:f6f6750994d2 | 32 | { |
ivaariasga | 0:f6f6750994d2 | 33 | int r = -1; |
ivaariasga | 0:f6f6750994d2 | 34 | |
ivaariasga | 0:f6f6750994d2 | 35 | if(cbuf) |
ivaariasga | 0:f6f6750994d2 | 36 | { |
ivaariasga | 0:f6f6750994d2 | 37 | cbuf->buffer[cbuf->head] = data; |
ivaariasga | 0:f6f6750994d2 | 38 | cbuf->head = (cbuf->head + 1) % cbuf->size; |
ivaariasga | 0:f6f6750994d2 | 39 | |
ivaariasga | 0:f6f6750994d2 | 40 | if(cbuf->head == cbuf->tail) |
ivaariasga | 0:f6f6750994d2 | 41 | { |
ivaariasga | 0:f6f6750994d2 | 42 | cbuf->tail = (cbuf->tail + 1) % cbuf->size; |
ivaariasga | 0:f6f6750994d2 | 43 | } |
ivaariasga | 0:f6f6750994d2 | 44 | |
ivaariasga | 0:f6f6750994d2 | 45 | r = 0; |
ivaariasga | 0:f6f6750994d2 | 46 | } |
ivaariasga | 0:f6f6750994d2 | 47 | |
ivaariasga | 0:f6f6750994d2 | 48 | return r; |
ivaariasga | 0:f6f6750994d2 | 49 | } |
ivaariasga | 0:f6f6750994d2 | 50 | |
ivaariasga | 0:f6f6750994d2 | 51 | int circ_buf_get(circ_buf_t * cbuf, uint8_t * data) |
ivaariasga | 0:f6f6750994d2 | 52 | { |
ivaariasga | 0:f6f6750994d2 | 53 | int r = -1; |
ivaariasga | 0:f6f6750994d2 | 54 | |
ivaariasga | 0:f6f6750994d2 | 55 | if(cbuf && data && !circ_buf_empty(*cbuf)) |
ivaariasga | 0:f6f6750994d2 | 56 | { |
ivaariasga | 0:f6f6750994d2 | 57 | *data = cbuf->buffer[cbuf->tail]; |
ivaariasga | 0:f6f6750994d2 | 58 | cbuf->tail = (cbuf->tail + 1) % cbuf->size; |
ivaariasga | 0:f6f6750994d2 | 59 | |
ivaariasga | 0:f6f6750994d2 | 60 | r = 0; |
ivaariasga | 0:f6f6750994d2 | 61 | } |
ivaariasga | 0:f6f6750994d2 | 62 | |
ivaariasga | 0:f6f6750994d2 | 63 | return r; |
ivaariasga | 0:f6f6750994d2 | 64 | } |