📄 serialq.c
字号:
/**************************************************************************** * * NAME: u8SerialQ_RemoveItem *//*! *\DESCRIPTION Remove a byte from a serial queue * * If the receive queue and it begins to empty enable receive on the UART. *//* PARAMETERS Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PUBLIC uint8 u8SerialQ_RemoveItem(teQueueRef eQueue) /**< Queue to operate on. */{ uint8 u8Item = 0; tsCircBuff *psQueue; uint16 u16Head; uint16 u16Free; psQueue = (tsCircBuff *)apsQueueList[eQueue]; /* Set pointer to the requested queue */ /* Get local copy of the head - the add function updates it */ u16Head = psQueue->u16Head; if (psQueue->u16Tail != u16Head) { /* Data available on queue so remove a single item */ u8Item = psQueue->u8Buff[psQueue->u16Tail]; psQueue->u16Tail = (psQueue->u16Tail + 1) & SERIALQ_MASK; psQueue->u16Out++; /* Receive queue ? */ if (eQueue == RX_QUEUE) { /* Calculate the free characters */ if (psQueue->u16Tail > u16Head) u16Free = psQueue->u16Tail - u16Head; else u16Free = SERIALQ_SIZE + psQueue->u16Tail - u16Head; /* Did we just get a high amount of free space ? */ if (u16Free == SERIALQ_FREE_HIGH) { /* If UART Rx currently disabled - enable UART Rx */ if (! bUart_GetRxEnable()) vUart_SetRxEnable(TRUE); } } } return(u8Item);}/**************************************************************************** * * NAME: bSerialQ_Empty *//*! *\DESCRIPTION Test for empty queue *//* PARAMETERS Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PUBLIC bool_t bSerialQ_Empty(teQueueRef eQueue) /**< Queue to operate on. */{ bool_t bResult = FALSE; tsCircBuff *psQueue; psQueue = (tsCircBuff *)apsQueueList[eQueue]; if (psQueue->u16Tail == psQueue->u16Head) { bResult = TRUE; } return(bResult); /** \retval TRUE queue is empty \retval FALSE queue has data */}/**************************************************************************** * * NAME: bSerialQ_Full *//*! *\DESCRIPTION Test for full queue *//* PARAMETERS Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PUBLIC bool_t bSerialQ_Full(teQueueRef eQueue) /**< Queue to operate on. */{ bool_t bResult = FALSE; tsCircBuff *psQueue; uint16 u16NextLocation; psQueue = (tsCircBuff *)apsQueueList[eQueue]; u16NextLocation = (psQueue->u16Head + 1) & SERIALQ_MASK; if (u16NextLocation == psQueue->u16Tail) { bResult = TRUE; } return(bResult); /** \retval TRUE queue is full \retval FALSE queue has space */}/**************************************************************************** * * NAME: u16SerialQ_Count *//*! *\DESCRIPTION Number of characters in queue. *//* PARAMETERS Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PUBLIC uint16 u16SerialQ_Count(teQueueRef eQueue) /**< Queue to operate on. */{ uint16 u16Head; uint16 u16Tail; tsCircBuff *psQueue = (tsCircBuff *)apsQueueList[eQueue]; /* Get local tail and head values, we don't want them changing under us while we calculate the count */ u16Tail = psQueue->u16Tail; u16Head = psQueue->u16Head; /* Calculate the used characters into the head value */ if (u16Head >= u16Tail) u16Head -= u16Tail; else u16Head = SERIALQ_SIZE + u16Head - u16Tail; return(u16Head); /** \return Number of characters in queue */}/**************************************************************************** * * NAME: u16SerialQ_Free *//*! *\DESCRIPTION Amount of free space in queue. *//* PARAMETERS Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PUBLIC uint16 u16SerialQ_Free(teQueueRef eQueue) /**< Queue to operate on. */{ uint16 u16Head; uint16 u16Free; tsCircBuff *psQueue = (tsCircBuff *)apsQueueList[eQueue]; /* Get local tail and head values, we don't want them changing under us while we calculate the count */ u16Free = psQueue->u16Tail; u16Head = psQueue->u16Head; /* Calculate the used characters into the head value */ if (u16Free > u16Head) u16Free -= u16Head; else u16Free = SERIALQ_SIZE + u16Free - u16Head; return(u16Free); /** \return Amount of free space in queue */}/**************************************************************************** * * NAME: u16SerialQ_GetInCount *//*! *\DESCRIPTION Get number of characters added to queue *//* PARAMETERS Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PUBLIC uint16 u16SerialQ_GetInCount(teQueueRef eQueue) /**< Queue to operate on. */{ tsCircBuff *psQueue = (tsCircBuff *)apsQueueList[eQueue]; return(psQueue->u16In); /** \return Count of characters added to queue */}/**************************************************************************** * * NAME: u16SerialQ_GetOutCount *//*! *\DESCRIPTION Get number of characters removed from queue *//* PARAMETERS Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PUBLIC uint16 u16SerialQ_GetOutCount(teQueueRef eQueue) /**< Queue to operate on. */{ tsCircBuff *psQueue = (tsCircBuff *)apsQueueList[eQueue]; return(psQueue->u16Out); /** \return Count of characters removed from queue */}/**************************************************************************** * * NAME: vSerialQ_Flush *//*! *\DESCRIPTION Flush queue so it is effectively empty. *//* PARAMETERS Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PRIVATE void vSerialQ_Flush(teQueueRef eQueue) /**< Queue to operate on. */{ tsCircBuff *psQueue; psQueue = (tsCircBuff *)apsQueueList[eQueue]; /* Set pointer to the requested queue */ psQueue->u16Head = 0; psQueue->u16Tail = 0; psQueue->u16In = 0; psQueue->u16Out = 0;}/****************************************************************************//*** END OF FILE ***//****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -