Files
CuboBmsFirmware/firmware/Libs/RingBuffer/RingBuffer.h
Dmitriy Semenov 9c2667bbe5 CAN Update
2023-04-03 21:51:33 +03:00

78 lines
2.3 KiB
C

/**
*******************************************
* @file RingBuffer.h
* @author Dmitriy Semenov / Crazy_Geeks
* @version 1.2
* @date 05-March-2022
* @brief Header file for RingBuffer lib
* @note https://crazygeeks.ru/c-ringbuffer/
*******************************************
*/
#ifndef RING_BUF_H_
#define RING_BUF_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "libs.h"
/**
* @addtogroup RING_BUF
* @brief Ring buffer implementation
* @{
*/
/**
* @struct RINGBUF_t
* @brief Ring buffer unit
*/
typedef struct RINGBUF_t{
u8_t *buf; ///< Storage of the buffer
volatile size_t tail; ///< Place of read point [cells]
volatile size_t head; ///< Place of write point [cells]
volatile size_t size; ///< Size of buffer [cells]
volatile size_t cell_size; ///< Size of one cell [bytes]
} RINGBUF_t;
/**
* @enum RINGBUF_STATUS
* @brief Ring buf status enum
*
* RINGBUF_X
* X: OK, ERR, PARAM_ERR, OVERFLOW
*/
typedef enum RINGBUF_STATUS{
RINGBUF_OK, ///< Success status
RINGBUF_ERR, ///< Error
RINGBUF_PARAM_ERR, ///< Parameter error
RINGBUF_OVERFLOW, ///< Buffer overflow
} RINGBUF_STATUS;
RINGBUF_STATUS RingBuf_Init(void *buf, u16_t size, size_t cellsize, RINGBUF_t *rb); // Init buf
RINGBUF_STATUS RingBuf_Clear(RINGBUF_t *rb); // Clear buf
RINGBUF_STATUS RingBuf_Available(u16_t *len, RINGBUF_t *rb); // Data available
// Put: add data to buffer
RINGBUF_STATUS RingBuf_BytePut(u8_t data, RINGBUF_t *rb); // Put byte to the buf
RINGBUF_STATUS RingBuf_CellPut(const void *data, RINGBUF_t *rb); // Put 1 cell to the buf
RINGBUF_STATUS RingBuf_DataPut(const void *data, u16_t len, RINGBUF_t *rb); // Put data to the buf
// Read: Get data & flush it
RINGBUF_STATUS RingBuf_ByteRead(u8_t *data, RINGBUF_t *rb); // Read byte from buf
RINGBUF_STATUS RingBuf_CellRead(void *data, RINGBUF_t *rb); // Read 1 cell from buf
RINGBUF_STATUS RingBuf_DataRead(void *data, u16_t len, RINGBUF_t *rb); // Read data from buf
// Watch: Get data without flushing
RINGBUF_STATUS RingBuf_ByteWatch(u8_t *data, RINGBUF_t *rb); // Watch byte from buf
RINGBUF_STATUS RingBuf_CellWatch(void *data, RINGBUF_t *rb); // Watch 1 cell from buf
RINGBUF_STATUS RingBuf_DataWatch(void *data, u16_t len, RINGBUF_t *rb); // Watch data form buf
/// @} RING_BUF Group
#ifdef __cplusplus
}
#endif
#endif /* RING_BUF_H_ */