This is an automated email from the ASF dual-hosted git repository.

kasjer pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git

commit 10b89de45f870a6474928e24e9dd2f330aaa4fc8
Author: Jerzy Kasenberg <[email protected]>
AuthorDate: Thu Jun 11 11:03:27 2026 +0200

    util/ring_buffer: Extend API for easy usage
    
    This adds few functions that make working with
    ring_buffer easier.
    
    Signed-off-by: Jerzy Kasenberg <[email protected]>
---
 util/ring_buffer/include/util/ring_buffer.h | 64 ++++++++++++++++++++++
 util/ring_buffer/src/ring_buffer.c          | 83 +++++++++++++++++++++++++++++
 2 files changed, 147 insertions(+)

diff --git a/util/ring_buffer/include/util/ring_buffer.h 
b/util/ring_buffer/include/util/ring_buffer.h
index e628730b9..75323f5d7 100644
--- a/util/ring_buffer/include/util/ring_buffer.h
+++ b/util/ring_buffer/include/util/ring_buffer.h
@@ -39,6 +39,15 @@ struct ring_buffer {
     uint8_t *buf;
 };
 
+/**
+ * Initialize ring buffer
+ *
+ * @param rb - ring buffer to initialize
+ * @param buf - buffer to use for storing data
+ * @param size - size of ring buffer storage data, it must be power of 2
+ */
+void ring_buffer_init(struct ring_buffer *rb, uint8_t *buf, int size);
+
 /**
  * Push new element to ring buffer.
  * Ring buffer must have at least one empty space.
@@ -77,6 +86,61 @@ bool ring_buffer_is_full(const struct ring_buffer *rb);
  */
 bool ring_buffer_is_empty(const struct ring_buffer *rb);
 
+/**
+ * Write data to ring buffer
+ *
+ * @param rb - ring buffer
+ * @param data - data to write
+ * @param len - number of bytes to write
+ * @return number of bytes written
+ */
+int ring_buffer_write(struct ring_buffer *rb, const uint8_t *data, int len);
+
+/**
+ * Read data from ring buffer
+ *
+ * @param rb - ring buffer
+ * @param data - buffer for output data
+ * @param len - number of bytes to read
+ * @return actuall bytes count read from ring buffer
+ */
+int ring_buffer_read(struct ring_buffer *rb, uint8_t *data, int len);
+
+/**
+ * Return number of bytes that can be writtne to ring buffer
+ *
+ * @param rb - ring buffer
+ * @return - number of bytes that can be put in ring buffer
+ */
+int ring_buffer_free_space(const struct ring_buffer *rb);
+
+/**
+ * Read number of bytes in ring buffer
+ *
+ * @param rb - ring buffer
+ * @return number of bytes available in ring buffer
+ */
+int ring_buffer_data_count(const struct ring_buffer *rb);
+
+/**
+ * Read number of bytes from ring buffer without removing them
+ *
+ * @param rb - ring buffer
+ * @param data - buffer for output data
+ * @param len - number of bytes to read
+ * @return number of bytes read from ring buffer
+ */
+int ring_buffer_peek(struct ring_buffer *rb, uint8_t *data, int len);
+
+/**
+ * Peek byte from ring buffer
+ *
+ * @param rb - ring buffer
+ * @return - byte that would be read with ring_buffer_pull or -1 if there
+ * is nothing that can be read
+ */
+int ring_buffer_peek_byte(struct ring_buffer *rb);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/util/ring_buffer/src/ring_buffer.c 
b/util/ring_buffer/src/ring_buffer.c
index ab177ecc5..db65af809 100644
--- a/util/ring_buffer/src/ring_buffer.c
+++ b/util/ring_buffer/src/ring_buffer.c
@@ -19,6 +19,7 @@
 
 #include <stdint.h>
 #include <util/ring_buffer.h>
+#include <os/os.h>
 
 static int
 ring_buffer_inc_and_wrap(int i, int max)
@@ -26,6 +27,15 @@ ring_buffer_inc_and_wrap(int i, int max)
     return (i + 1) & (max - 1);
 }
 
+void
+ring_buffer_init(struct ring_buffer *rb, uint8_t *buf, int size)
+{
+    rb->head = 0;
+    rb->tail = 0;
+    rb->size = size;
+    rb->buf = buf;
+}
+
 void
 ring_buffer_push(struct ring_buffer *rb, uint8_t ch)
 {
@@ -55,3 +65,76 @@ ring_buffer_is_empty(const struct ring_buffer *rb)
 {
     return rb->head == rb->tail;
 }
+
+int
+ring_buffer_free_space(const struct ring_buffer *rb)
+{
+    uint32_t head = rb->head;
+    uint32_t tail = rb->tail;
+
+    return rb->size - ((tail - head) & (rb->size - 1)) - 1;
+}
+
+int
+ring_buffer_data_count(const struct ring_buffer *rb)
+{
+    uint32_t head = rb->head;
+    uint32_t tail = rb->tail;
+
+    return (head - tail) & (rb->size - 1);
+}
+
+int
+ring_buffer_write(struct ring_buffer *rb, const uint8_t *data, int len)
+{
+    int free_space = ring_buffer_free_space(rb);
+    int n = min(free_space, len);
+
+    for (int i = 0; i < n; i++) {
+        ring_buffer_push(rb, data[i]);
+    }
+    return n;
+}
+
+int
+ring_buffer_read(struct ring_buffer *rb, uint8_t *data, int len)
+{
+    int data_len = ring_buffer_data_count(rb);
+
+    if (data_len > len) {
+        data_len = len;
+    }
+
+    for (int i = 0; i < data_len; i++) {
+        data[i] = ring_buffer_pull(rb);
+    }
+    return data_len;
+}
+
+int
+ring_buffer_peek(struct ring_buffer *rb, uint8_t *data, int len)
+{
+    int data_len = ring_buffer_data_count(rb);
+
+    if (data_len > len) {
+        data_len = len;
+    }
+
+    for (int i = 0, j = rb->tail; i < data_len; i++) {
+        data[i] = rb->buf[j];
+        j = ring_buffer_inc_and_wrap(j, rb->size);
+    }
+
+    return data_len;
+}
+
+int
+ring_buffer_peek_byte(struct ring_buffer *rb)
+{
+    int data_len = ring_buffer_data_count(rb);
+    if (data_len > 0) {
+        return rb->buf[rb->tail];
+    } else {
+        return -1;
+    }
+}

Reply via email to