ISKBoard example project
guowenxue
7 days ago 6c7b6c910be1dcdc0bb786e02be648b1a56faa5e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/**********************************************************************
 *   Copyright: (C)2024 LingYun IoT System Studio
 *      Author: GuoWenxue<guowenxue@gmail.com>
 *
 * Description: The purpose of this code is to provide a simple ring buffer
 *              C library for ISKBoard.
 *
 *   ChangeLog:
 *        Version    Date       Author            Description
 *        V1.0.0  2024.08.29    GuoWenxue      Release initial version
 *
 ***********************************************************************/
 
#include <string.h>
#include "ringbuf.h"
 
void rb_init (ring_buffer_t *rb, uint8_t *buf, int size)
{
    rb->rd_pointer = 0;
    rb->wr_pointer = 0;
 
    rb->buffer= buf;
    rb->size = size;
    memset(buf, 0, size);
 
}
 
void rb_clear (ring_buffer_t *rb)
{
    rb->rd_pointer=0;
    rb->wr_pointer=0;
 
    memset(rb->buffer,0,rb->size);
}
 
int rb_data_size (ring_buffer_t *rb)
{
    return ((rb->wr_pointer - rb->rd_pointer) & (rb->size-1));
}
 
int rb_free_size (ring_buffer_t *rb)
{
    return (rb->size - 1 - rb_data_size(rb));
}
 
int rb_write (ring_buffer_t *rb, uint8_t *buf, int len)
{
    int total;
    int i;
 
    /* total = len = min(space, len) */
    total = rb_free_size(rb);
    if(len > total)
        len = total;
    else
        total = len;
 
    i = rb->wr_pointer;
    if(i + len > rb->size)
    {
        memcpy(rb->buffer + i, buf, rb->size - i);
        buf += rb->size - i;
        len -= rb->size - i;
        i = 0;
    }
    memcpy(rb->buffer + i, buf, len);
    rb->wr_pointer = i + len;
    return total;
}
 
int rb_read (ring_buffer_t *rb, uint8_t *buf, int max)
{
    int total;
    int i;
    /* total = len = min(used, len) */
    total = rb_data_size(rb);
 
    if(max > total)
        max = total;
    else
        total = max;
 
    i = rb->rd_pointer;
    if(i + max > rb->size)
    {
        memcpy(buf, rb->buffer + i, rb->size - i);
        buf += rb->size - i;
        max -= rb->size - i;
        i = 0;
    }
    memcpy(buf, rb->buffer + i, max);
    rb->rd_pointer = i + max;
 
    return total;
}
 
uint8_t rb_peek(ring_buffer_t *rb, int index)
{
    assert(index < rb_data_size(rb));
 
    return rb->buffer[((rb->rd_pointer + index) % rb->size)];
}