queue.c
void InitQueue(S_Queue *q)
{
q->front = 0;
q->rear = 0;
q->num = 0;
}
// insert a node
bool EnQueue(S_Queue *q, U_QueueNode *p,u16 queueSize)
{
U_QueueNode *pos;
if(QueIsFull(q,queueSize))
{
return FALSE;
}
pos = q->node + q->rear;
q->curIndex = q->rear;
memcpy(pos,p,sizeof(U_QueueNode));
q->rear = (q->rear+1) % queueSize;
q->num++;
return TRUE;
}
// delete a node and return the node
U_QueueNode *DeQueue(S_Queue *q,u16 queueSize)
{
U_QueueNode *pos;
if(QueIsEmpty(q))
{
return NULL;
}
pos = q->node + q->front;
q->front = (q->front+1) % queueSize;
q->num--;
return pos;
}
// return queue head node
U_QueueNode *QueHeadNode(S_Queue *q)
{
U_QueueNode *p;
p = QueIsEmpty(q) ? NULL : (q->node + q->front);
return p;
}
// if queue is empty return true
bool QueIsEmpty(S_Queue *q)
{
return (bool)(0 == q->num);
}
// if queue is full return true
bool QueIsFull(S_Queue *q,u16 queueSize)
{
return (bool)(queueSize <= q->num);
}
queue.h
typedef union
{
BaliseParame_S BaliseParame;
u8 buf[140];
u16 Word[68];
}U_QueueNode;
typedef struct
{
u16 front; // queue head, outlet
u16 rear; // queue tail inlet
u16 num; // node number
u16 curIndex;
U_QueueNode node[BTM_QUEUE_SIZE];
}S_Queue;
void InitQueue(S_Queue *q);
bool EnQueue(S_Queue *q,U_QueueNode *p,u16 queueSize);// insert a node
U_QueueNode *DeQueue(S_Queue *q,u16 queueSize);// delete a node and return the node
U_QueueNode *QueHeadNode(S_Queue *q);// return queue head node
bool QueIsEmpty(S_Queue *q); // if queue is empty return true
bool QueIsFull(S_Queue *q,u16 queueSize); // if queue is full return true