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; + } +}
