/**********************************************************************
|
* 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)];
|
}
|