ring-buffer.c (2063B)
1 #include "ring-buffer.h" 2 3 void ring_buffer_setup(RingBuffer_t *rb, uint8_t *buffer, uint16_t len) { 4 rb->buffer = buffer; 5 rb->len = len; 6 rb->head = 0; 7 rb->tail = 0; 8 } 9 10 bool ring_buffer_empty(RingBuffer_t *rb) { return rb->head == rb->tail; } 11 12 bool ring_buffer_read(RingBuffer_t *rb, uint8_t *byte) { 13 uint16_t localHead = rb->head; 14 uint16_t localTail = rb->tail; 15 16 if (localHead == localTail) 17 return false; 18 *byte = rb->buffer[localHead]; 19 localHead = (localHead + 1) & (rb->len - 1); 20 rb->head = localHead; 21 return true; 22 } 23 24 bool ring_buffer_write(RingBuffer_t *rb, const uint8_t byte) { 25 // uint16_t localHead = rb->head; 26 uint16_t localTail = rb->tail; 27 rb->buffer[localTail] = byte; 28 29 uint16_t nextTail = (localTail + 1) & (rb->len - 1); 30 // if (nextTail == localHead) 31 // return false; // TODO: what should be done here: overwrite or return? 32 rb->tail = nextTail; 33 return true; 34 } 35 36 uint16_t ring_buffer_capacity(RingBuffer_t *rb) { 37 uint16_t localHead = rb->head; 38 uint16_t localTail = rb->tail; 39 if (localHead == localTail) 40 return rb->len; 41 if (localTail > localHead) 42 return rb->len - (localTail - localHead); 43 return (localHead - localTail); 44 } 45 46 uint16_t ring_buffer_read_chunk(RingBuffer_t *rb, uint8_t *dest, uint16_t size) { 47 uint16_t localHead = rb->head; 48 uint16_t localTail = rb->tail; 49 uint16_t bytes_read = 0; 50 if (localTail == localHead) 51 return 0; 52 while (bytes_read < size) { 53 if (ring_buffer_read(rb, dest + bytes_read)) 54 bytes_read++; 55 else 56 return bytes_read; 57 } 58 return size; 59 } 60 61 uint16_t ring_buffer_write_chunk(RingBuffer_t *rb, const uint8_t *src, const uint16_t size) { 62 // uint16_t localHead = rb->head; 63 // uint16_t localTail = rb->tail; 64 uint16_t bytes_written = 0; 65 while (bytes_written < size) { 66 if (ring_buffer_write(rb, *(src + bytes_written))) 67 bytes_written++; 68 else 69 return bytes_written; 70 } 71 return size; 72 }