/********************************************************************** * Copyright: (C)2024 LingYun IoT System Studio * Author: GuoWenxue * * 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 #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)]; }