*********************************************************************************************************
*/
#define RQ_ERR_NONE 0u
#define RQ_ERR_POINTER_NULL 1u
#define RQ_ERR_SIZE_ZERO 2u
#define RQ_ERR_BUFFER_FULL 3u
#define RQ_ERR_BUFFER_EMPTY 4u
#define RQ_OPTION_WHEN_FULL_DISCARD_FIRST 0u // discard the first element when ring buffer is full
#define RQ_OPTION_WHEN_FULL_DONT_IN 1u // discard new element when ring buffer is full
/*
*********************************************************************************************************
* DATA TYPE 数据类型
*********************************************************************************************************
*/
// define the data type that stores in the RingQueue. 定义存在环形缓冲区内的数据的类型
typedef unsigned char RQTYPE;
typedef RQTYPE *RQ_ADDRESSING_MODE pRQTYPE;
typedef struct {
unsigned short RingBufCtr; /* Number of characters in the ring buffer */
unsigned short RingBufSize; /* Ring buffer Size */
pRQTYPE RingBufInPtr; /* Pointer to where next character will be inserted */
pRQTYPE RingBufOutPtr; /* Pointer from where next character will be extracted */
pRQTYPE RingBuf; /* Ring buffer array */
pRQTYPE RingBufEnd; /* Point to the end of the buffer */
} RING_QUEUE;
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES 函数原型
*********************************************************************************************************
*/
RING_QUEUE *RingQueueInit(RING_QUEUE *pQueue,pRQTYPE pbuf,unsigned short bufSize,unsigned char *perr);
#pragma CODE_SEG __NEAR_SEG NON_BANKED
unsigned short RingQueueIn(RING_QUEUE *pQueue,RQTYPE data,unsigned char option,unsigned char *perr);
RQTYPE RingQueueOut(RING_QUEUE *pQueue,unsigned char *perr);
#pragma CODE_SEG DEFAULT
short RingQueueMatch(RING_QUEUE *pQueue,pRQTYPE pbuf,unsigned short len);
void RingQueueClear(RING_QUEUE *pQueue);
/*
*********************************************************************************************************
* RingQueueIsEmpty()
*
* Description : whether the RingQueue is empty. 环形队列是否为空
*
* Arguments : pQueue pointer to the ring queue control block; 指向环形队列控制块的指针
*
* Return : TRUE the RingQueue is empty.
* FALSE the RingQueue is not empty.
* Note(s) :
*********************************************************************************************************
*/
#define RingQueueIsEmpty(pQueue) ((pQueue)->RingBufCtr == 0)
/*
*********************************************************************************************************
* RingQueueIsFull()
*
* Descript