/** \file
 *  \brief This file contains definitions for a circular buffer.
 *
 */

#ifndef UTIL_CIRCULARBUFFER_H
#define UTIL_CIRCULARBUFFER_H

/* Definitions */
    
typedef enum
{
    //! The result could not be determined.
    UTIL_CIRCULARBUFFERRESULT_UNKNOWN = 0,
    //! The requested action completed successfully.
    UTIL_CIRCULARBUFFERRESULT_SUCCESS,
    //! There is no more room in the buffer.
    UTIL_CIRCULARBUFFERRESULT_ERROR_OVERFLOW,
    //! There is no data left in the buffer.
    UTIL_CIRCULARBUFFERRESULT_ERROR_UNDERFLOW
} UTIL_CircularBufferResult_T;

//! Circular buffer data structure.
typedef struct
{
    uint8_t * buffer;
    uint16_t size;
    volatile uint16_t head;
    volatile uint16_t tail;
    volatile uint16_t count;
} UTIL_CircularBuffer_T;

/* Function Declarations */

void UTIL_InitCircularBuffer(UTIL_CircularBuffer_T * const this, uint8_t * buffer, uint16_t size);
UTIL_CircularBufferResult_T UTIL_PushToCircularBuffer(UTIL_CircularBuffer_T * const this, uint8_t value);
UTIL_CircularBufferResult_T UTIL_PopFromCircularBuffer(UTIL_CircularBuffer_T * const this, uint8_t * const value);
bool UTIL_IsCircularBufferEmpty(UTIL_CircularBuffer_T * const this);
bool UTIL_IsCircularBufferFull(UTIL_CircularBuffer_T * const this);

#endif // UTIL_CIRCULARBUFFER_H
