BLE5.2 1.0
开发文档说明
ringbuffer.c
浏览该文件的文档.
1
2/*-----------------------------------------------------------------------------------
3 INCLUDE HEADE FILES
4 ------------------------------------------------------------------------------------*/
5#include "ringbuffer.h"
6
11void ring_buffer_create(ring_buffer_t *rb, uint8_t *buffer, uint32_t size)
12{
13 if ((rb == NULL) || (buffer == NULL) || (size == 0)) {
14 return;
15 }
16
17 rb->buffer = buffer;
18 rb->size = size;
19 rb->tail_index = 0;
20 rb->head_index = 0;
21 rb->rx_lock = false;
22}
23
24
25void ring_buffer_queue(ring_buffer_t *rb, uint8_t data)
26{
27 /* Is buffer full? */
28 if (ring_buffer_is_full(rb)) {
29 /* Is going to overwrite the oldest byte */
30 /* Increase tail index */
31 rb->tail_index = ((rb->tail_index + 1) & (rb->size - 1));
32 }
33
34 /* Place data in buffer */
35 rb->buffer[rb->head_index] = data;
36
37 rb->head_index = ((rb->head_index + 1) & (rb->size - 1));
38}
39
40void ring_buffer_queue_arr(ring_buffer_t *rb, uint8_t *data,
42{
43 /* Add bytes; one by one */
45 for (i = 0; i < size; i++) {
46 ring_buffer_queue(rb, data[i]);
47 }
48}
49
51{
52 if (ring_buffer_is_empty(rb)) {
53 /* No items */
54 return 0;
55 }
56
57 *data = rb->buffer[rb->tail_index];
58
59 rb->tail_index = ((rb->tail_index + 1) & (rb->size - 1));
60 return 1;
61}
62
65{
66 if (ring_buffer_is_empty(rb)) {
67 /* No items */
68 return 0;
69 }
70
71 unsigned char *data_ptr = data;
72 ring_buffer_size_t cnt = 0;
73 while ((cnt < len) && ring_buffer_dequeue(rb, data_ptr)) {
74 cnt++;
75 data_ptr++;
76 }
77 return cnt;
78}
79
80
83{
84 if (index >= ring_buffer_num_items(rb)) {
85 /* No items at index */
86 return 0;
87 }
88
89 /* Add index to pointer */
90 ring_buffer_size_t data_index = ((rb->tail_index + index) & (rb->size - 1));
91 *data = rb->buffer[data_index];
92 return 1;
93}
94
ring_buffer_size_t ring_buffer_is_full(ring_buffer_t *rb)
Definition ringbuffer.h:149
void ring_buffer_queue(ring_buffer_t *rb, uint8_t data)
Definition ringbuffer.c:25
ring_buffer_size_t ring_buffer_is_empty(ring_buffer_t *rb)
Definition ringbuffer.h:139
ring_buffer_size_t ring_buffer_dequeue(ring_buffer_t *rb, uint8_t *data)
Definition ringbuffer.c:50
void ring_buffer_queue_arr(ring_buffer_t *rb, uint8_t *data, ring_buffer_size_t size)
Definition ringbuffer.c:40
ring_buffer_size_t ring_buffer_num_items(ring_buffer_t *rb)
Definition ringbuffer.h:160
void ring_buffer_create(ring_buffer_t *rb, uint8_t *buffer, uint32_t size)
Definition ringbuffer.c:11
ring_buffer_size_t ring_buffer_peek(ring_buffer_t *rb, uint8_t *data, ring_buffer_size_t index)
Definition ringbuffer.c:81
ring_buffer_size_t ring_buffer_dequeue_arr(ring_buffer_t *rb, uint8_t *data, ring_buffer_size_t len)
Definition ringbuffer.c:63
uint32_t ring_buffer_size_t
Definition ringbuffer.h:31
uint8_t * buffer
Definition ringbuffer.h:49
ring_buffer_size_t head_index
Definition ringbuffer.h:55
ring_buffer_size_t size
Definition ringbuffer.h:51
ring_buffer_size_t tail_index
Definition ringbuffer.h:53