blob: d5225cc7945deff449d0071d440cf5df164f0060 [file] [log] [blame]
liubin281ac462023-07-19 14:22:54 +08001#include "ringbuffer.h"
2
3/**
4 * @file
5 * Implementation of ring buffer functions.
6 */
7
8void ring_buffer_init(ring_buffer_t *buffer, char *buf, size_t buf_size) {
9 RING_BUFFER_ASSERT(RING_BUFFER_IS_POWER_OF_TWO(buf_size) == 1);
10 buffer->buffer = buf;
11 buffer->buffer_mask = buf_size - 1;
12 buffer->tail_index = 0;
13 buffer->head_index = 0;
14}
15
16void ring_buffer_queue(ring_buffer_t *buffer, char data) {
17 /* Is buffer full? */
18 if(ring_buffer_is_full(buffer)) {
19 /* Is going to overwrite the oldest byte */
20 /* Increase tail index */
21 buffer->tail_index = ((buffer->tail_index + 1) & RING_BUFFER_MASK(buffer));
22 }
23
24 /* Place data in buffer */
25 buffer->buffer[buffer->head_index] = data;
26 buffer->head_index = ((buffer->head_index + 1) & RING_BUFFER_MASK(buffer));
27}
28
29void ring_buffer_queue_arr(ring_buffer_t *buffer, const char *data, ring_buffer_size_t size) {
30 /* Add bytes; one by one */
31 ring_buffer_size_t i;
32 for(i = 0; i < size; i++) {
33 ring_buffer_queue(buffer, data[i]);
34 }
35}
36
37uint8_t ring_buffer_dequeue(ring_buffer_t *buffer, char *data) {
38 if(ring_buffer_is_empty(buffer)) {
39 /* No items */
40 return 0;
41 }
42
43 *data = buffer->buffer[buffer->tail_index];
44 buffer->tail_index = ((buffer->tail_index + 1) & RING_BUFFER_MASK(buffer));
45 return 1;
46}
47
48ring_buffer_size_t ring_buffer_dequeue_arr(ring_buffer_t *buffer, char *data, ring_buffer_size_t len) {
49 if(ring_buffer_is_empty(buffer)) {
50 /* No items */
51 return 0;
52 }
53
54 char *data_ptr = data;
55 ring_buffer_size_t cnt = 0;
56 while((cnt < len) && ring_buffer_dequeue(buffer, data_ptr)) {
57 cnt++;
58 data_ptr++;
59 }
60 return cnt;
61}
62
63uint8_t ring_buffer_peek(ring_buffer_t *buffer, char *data, ring_buffer_size_t index) {
64 if(index >= ring_buffer_num_items(buffer)) {
65 /* No items at index */
66 return 0;
67 }
68
69 /* Add index to pointer */
70 ring_buffer_size_t data_index = ((buffer->tail_index + index) & RING_BUFFER_MASK(buffer));
71 *data = buffer->buffer[data_index];
72 return 1;
73}
74
75uint8_t ring_buffer_is_empty(ring_buffer_t *buffer) {
76 return (buffer->head_index == buffer->tail_index);
77}
78
79uint8_t ring_buffer_is_full(ring_buffer_t *buffer) {
80 return ((buffer->head_index - buffer->tail_index) & RING_BUFFER_MASK(buffer)) == RING_BUFFER_MASK(buffer);
81}
82
83ring_buffer_size_t ring_buffer_num_items(ring_buffer_t *buffer) {
84 return ((buffer->head_index - buffer->tail_index) & RING_BUFFER_MASK(buffer));
85}
86
87void ring_buffer_clean(ring_buffer_t *buffer) {
88 buffer->tail_index = 0;
89 buffer->head_index = 0;
90}