/* * RingBuffer.h * * Created: 11.05.2021 11:14:37 * Author: Admin */ #ifndef RINGBUFFER_H_ #define RINGBUFFER_H_ #include typedef struct { const uint16_t BUF_SZ; uint16_t tail; // "указатель" хвоста буфера uint16_t head; // "указатель" головы буфера volatile uint16_t count; // счетчик символов uint16_t *data; } RingBuf16bit_ptr_typeDef; typedef struct { const uint16_t BUF_SZ; uint16_t tail; // "указатель" хвоста буфера uint16_t head; // "указатель" головы буфера volatile uint16_t count; // счетчик символов uint8_t *data; } RingBuf8bit_ptr_typeDef; #define dRBuf_Count(us) ((us)->count) #define dRBuf_Full(us) (((((us)->head+1)&((us)->BUF_SZ-1)) == (us)->tail) && ((us)->count != 0)) #define dRBuf_Empty(us) (((us)->count) == (0)) #define dRBuf_Put(us, buf, sym) {buf[((us)->head)]=sym; (us)->head = (((us)->head + 1) & ((us)->BUF_SZ - 1)); (us)->count++;} #define dRBuf_PutF(us, buf, sym) {if (!(dRBuf_Full(us))) dRBuf_Put(us, buf, sym);} #define dRBuf_Get(us, buf, sym) {sym = buf[((us)->tail)]; (us)->tail = (((us)->tail + 1) & ( (us)->BUF_SZ - 1)); (us)->count--;} #define dRBuf_GetE(us, buf, sym) {if (!(dRBuf_Empty(us))) dRBuf_Get(us, buf, sym);} #endif /* RINGBUFFER_H_ */