From c13c9806f957ebc675462737f4b328d3ab89e028 Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Mon, 10 Jul 2023 17:29:22 +0800 Subject: [PATCH] update gpsd.c --- gpsd/booster/ringbuf.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 106 insertions(+), 0 deletions(-) diff --git a/gpsd/booster/ringbuf.c b/gpsd/booster/ringbuf.c new file mode 100644 index 0000000..f79d496 --- /dev/null +++ b/gpsd/booster/ringbuf.c @@ -0,0 +1,106 @@ +/******************************************************************************** + * Copyright: (C) 2021 LingYun IoT System Studio + * All rights reserved. + * + * Filename: ringbuf.h + * Description: This head file + * + * Version: 1.0.0(2021年04月29日) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "2021年04月29日 12时18分32秒" + * + ********************************************************************************/ +#include <string.h> +#include <assert.h> +#include "ringbuf.h" + +void rb_init (struct ring_buffer *ring, unsigned char* buff, int size) +{ + memset (ring, 0, sizeof (struct ring_buffer)); + ring->rd_pointer = 0; + ring->wr_pointer = 0; + ring->buffer= buff; + ring->size = 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_free_size (struct ring_buffer *rb) +{ + return (rb->size - 1 - rb_data_size(rb)); +} + + +int rb_read (struct ring_buffer *rb, unsigned char * 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; +} + +int rb_data_size (struct ring_buffer *rb) +{ + return ((rb->wr_pointer - rb->rd_pointer) & (rb->size-1)); +} + +void rb_clear (struct ring_buffer *rb) +{ + memset(rb->buffer,0,rb->size); + rb->rd_pointer=0; + rb->wr_pointer=0; +} + +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)]; +} -- Gitblit v1.9.1