/*********************************************************************************
|
* Copyright: (C) 2023 LingYun IoT System Studio.
|
* All rights reserved.
|
*
|
* Filename: ringbuf.c
|
* Description: This file is common ring buffer API functions
|
*
|
* Version: 1.0.0(11/08/23)
|
* Author: Guo Wenxue <guowenxue@gmail.com>
|
* ChangeLog: 1, Release initial version on "11/08/23 16:18:43"
|
*
|
********************************************************************************/
|
|
#include <string.h>
|
#include <assert.h>
|
#include "ringbuf.h"
|
|
void rb_init(struct ring_buffer *rb, unsigned char *buf, int size)
|
{
|
memset(rb, 0, sizeof (struct ring_buffer));
|
rb->rd_pointer = 0;
|
rb->wr_pointer = 0;
|
rb->buffer= buf;
|
rb->size = size;
|
}
|
|
void rb_clear(struct ring_buffer *rb)
|
{
|
memset(rb->buffer, 0, rb->size);
|
rb->rd_pointer=0;
|
rb->wr_pointer=0;
|
}
|
|
int rb_data_size(struct ring_buffer *rb)
|
{
|
return ((rb->wr_pointer - rb->rd_pointer) & (rb->size-1));
|
}
|
|
int rb_free_size(struct ring_buffer *rb)
|
{
|
return (rb->size - 1 - rb_data_size(rb));
|
}
|
|
unsigned char rb_peek(struct ring_buffer *rb, int index)
|
{
|
assert(index < rb_data_size(rb));
|
|
return rb->buffer[((rb->rd_pointer + index) % rb->size)];
|
}
|
|
int rb_write(struct ring_buffer *rb, unsigned char *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(struct ring_buffer *rb, unsigned char *buf, int bytes)
|
{
|
int total;
|
int i;
|
|
total = rb_data_size(rb);
|
|
if(bytes > total)
|
bytes = total;
|
|
i = rb->rd_pointer;
|
if(i + bytes > rb->size)
|
{
|
memcpy(buf, rb->buffer + i, rb->size - i);
|
buf += rb->size - i;
|
bytes -= rb->size - i;
|
i = 0;
|
}
|
|
memcpy(buf, rb->buffer + i, bytes);
|
rb->rd_pointer = i + bytes;
|
|
return total;
|
}
|
|
int rb_copy(struct ring_buffer *rb, unsigned char *buf, int bytes)
|
{
|
int total;
|
int i;
|
|
total = rb_data_size(rb);
|
|
if(bytes > total)
|
bytes = total;
|
|
i = rb->rd_pointer;
|
if(i + bytes > rb->size)
|
{
|
memcpy(buf, rb->buffer + i, rb->size - i);
|
buf += rb->size - i;
|
bytes -= rb->size - i;
|
i = 0;
|
}
|
|
memcpy(buf, rb->buffer + i, bytes);
|
|
return total;
|
}
|