/*----------------------------------------------------------------------------------- INCLUDE HEADE FILES ------------------------------------------------------------------------------------*/ #include "ringbuffer.h" /** * @file * Implementation of ring buffer functions. */ void ring_buffer_create(ring_buffer_t *rb, uint8_t *buffer, uint32_t size) { if ((rb == NULL) || (buffer == NULL) || (size == 0)) { return; } rb->buffer = buffer; rb->size = size; rb->tail_index = 0; rb->head_index = 0; rb->rx_lock = false; } void ring_buffer_queue(ring_buffer_t *rb, uint8_t data) { /* Is buffer full? */ if (ring_buffer_is_full(rb)) { /* Is going to overwrite the oldest byte */ /* Increase tail index */ rb->tail_index = ((rb->tail_index + 1) & (rb->size - 1)); } /* Place data in buffer */ rb->buffer[rb->head_index] = data; rb->head_index = ((rb->head_index + 1) & (rb->size - 1)); } void ring_buffer_queue_arr(ring_buffer_t *rb, uint8_t *data, ring_buffer_size_t size) { /* Add bytes; one by one */ ring_buffer_size_t i; for (i = 0; i < size; i++) { ring_buffer_queue(rb, data[i]); } } ring_buffer_size_t ring_buffer_dequeue(ring_buffer_t *rb, uint8_t *data) { if (ring_buffer_is_empty(rb)) { /* No items */ return 0; } *data = rb->buffer[rb->tail_index]; rb->tail_index = ((rb->tail_index + 1) & (rb->size - 1)); return 1; } ring_buffer_size_t ring_buffer_dequeue_arr(ring_buffer_t *rb, uint8_t *data, ring_buffer_size_t len) { if (ring_buffer_is_empty(rb)) { /* No items */ return 0; } unsigned char *data_ptr = data; ring_buffer_size_t cnt = 0; while ((cnt < len) && ring_buffer_dequeue(rb, data_ptr)) { cnt++; data_ptr++; } return cnt; } ring_buffer_size_t ring_buffer_peek(ring_buffer_t *rb, uint8_t *data, ring_buffer_size_t index) { if (index >= ring_buffer_num_items(rb)) { /* No items at index */ return 0; } /* Add index to pointer */ ring_buffer_size_t data_index = ((rb->tail_index + index) & (rb->size - 1)); *data = rb->buffer[data_index]; return 1; } extern inline ring_buffer_size_t ring_buffer_is_empty(ring_buffer_t *rb); extern inline ring_buffer_size_t ring_buffer_is_full(ring_buffer_t *rb); extern inline ring_buffer_size_t ring_buffer_num_items(ring_buffer_t *rb);