stm32f4-uart-bootloader

Simple UART bootloader for STM32F4 MCU's
git clone git://git.mdnr.space/stm32f4-uart-bootloader
Log | Files | Refs | Submodules | README | LICENSE

ring-buffer.c (2063B)


      1 #include "ring-buffer.h"
      2 
      3 void ring_buffer_setup(RingBuffer_t *rb, uint8_t *buffer, uint16_t len) {
      4     rb->buffer = buffer;
      5     rb->len = len;
      6     rb->head = 0;
      7     rb->tail = 0;
      8 }
      9 
     10 bool ring_buffer_empty(RingBuffer_t *rb) { return rb->head == rb->tail; }
     11 
     12 bool ring_buffer_read(RingBuffer_t *rb, uint8_t *byte) {
     13     uint16_t localHead = rb->head;
     14     uint16_t localTail = rb->tail;
     15 
     16     if (localHead == localTail)
     17         return false;
     18     *byte = rb->buffer[localHead];
     19     localHead = (localHead + 1) & (rb->len - 1);
     20     rb->head = localHead;
     21     return true;
     22 }
     23 
     24 bool ring_buffer_write(RingBuffer_t *rb, const uint8_t byte) {
     25     // uint16_t localHead = rb->head;
     26     uint16_t localTail = rb->tail;
     27     rb->buffer[localTail] = byte;
     28 
     29     uint16_t nextTail = (localTail + 1) & (rb->len - 1);
     30     // if (nextTail == localHead)
     31     //     return false; // TODO: what should be done here: overwrite or return?
     32     rb->tail = nextTail;
     33     return true;
     34 }
     35 
     36 uint16_t ring_buffer_capacity(RingBuffer_t *rb) {
     37     uint16_t localHead = rb->head;
     38     uint16_t localTail = rb->tail;
     39     if (localHead == localTail)
     40         return rb->len;
     41     if (localTail > localHead)
     42         return rb->len - (localTail - localHead);
     43     return (localHead - localTail);
     44 }
     45 
     46 uint16_t ring_buffer_read_chunk(RingBuffer_t *rb, uint8_t *dest, uint16_t size) {
     47     uint16_t localHead = rb->head;
     48     uint16_t localTail = rb->tail;
     49     uint16_t bytes_read = 0;
     50     if (localTail == localHead)
     51         return 0;
     52     while (bytes_read < size) {
     53         if (ring_buffer_read(rb, dest + bytes_read))
     54             bytes_read++;
     55         else
     56             return bytes_read;
     57     }
     58     return size;
     59 }
     60 
     61 uint16_t ring_buffer_write_chunk(RingBuffer_t *rb, const uint8_t *src, const uint16_t size) {
     62     // uint16_t localHead = rb->head;
     63     // uint16_t localTail = rb->tail;
     64     uint16_t bytes_written = 0;
     65     while (bytes_written < size) {
     66         if (ring_buffer_write(rb, *(src + bytes_written)))
     67             bytes_written++;
     68         else
     69             return bytes_written;
     70     }
     71     return size;
     72 }