,.

Dependents:   esclavo_maestro

Buffer.cpp

Committer:
alejo5214416
Date:
2018-07-27
Revision:
0:9375e70ace0a

File content as of revision 0:9375e70ace0a:

#include "Buffer.h"
#include "mbed.h"

int circular_buf_reset(circular_buf_t * cbuf)
{
    int r = -1;

    if(cbuf) {
        cbuf->head = 0;
        cbuf->tail = 0;
        cbuf->size = 0;
        r = 0;
    }

    return r;

}

bool circular_buf_empty(circular_buf_t cbuf)
{
    // We define empty as head == tail
    return (cbuf.head == cbuf.tail);
}

bool circular_buf_full(circular_buf_t cbuf)
{
    // We determine "full" case by head being one position behind the tail
    // Note that this means we are wasting one space in the buffer!
    // Instead, you could have an "empty" flag and determine buffer full that way
    return ((cbuf.head + 1) % cbuf.size) == cbuf.tail;
}

int circular_buf_put(circular_buf_t * cbuf, uint8_t data)
{
    int r = -1;

    if(cbuf) {
        cbuf->buffer[cbuf->head] = data;
        cbuf->head = (cbuf->head + 1) % cbuf->size;

        if(cbuf->head == cbuf->tail) {
            cbuf->tail = (cbuf->tail + 1) % cbuf->size;
        }

        r = 0;
    }

    return r;
}

int circular_buf_get(circular_buf_t * cbuf, uint8_t * data)
{
    int r = -1;

    if(cbuf && data && !circular_buf_empty(*cbuf)) {
        *data = cbuf->buffer[cbuf->tail];
        cbuf->tail = (cbuf->tail + 1) % cbuf->size;

        r = 0;
    }

    return r;
}