Circular Buffer C implementation, must create a buffer structure instance in your main and then dinamically allocate memory for the buffer array.

Dependents:   Chat buffprob

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?

UserRevisionLine numberNew 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 }