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