/******************************************************************************
* @file queue.c
* @author LiangXianJin
* @version V1.0.0
* @date 2015-12-09
* @brief 固定长度 实现循环队列
******************************************************************************/
/*
===============================================================================
##### How to use Array Queue Buffer #####
===============================================================================
1、修改名称 如 CanMsgRx_ 和 宏定义 CANMSGRX_QUEUE_SIZE 修改为 UsartRx_ 和宏定义USARTRX_QUEUE_SIZE
2、修改类型 修改队列中单元数据的类型
3、声明对应数据类型和宏
4、初始化 队列 CanMsgRx_Queue_Init();
*/
#include "string.h"
/*定义队列长度*/
#define CANMSGRX_QUEUE_SIZE (10)
/*定义数据单元类型*/
typedef struct
{
char Data[8];
}CanMsgRx_QueueDataType;
/*定义队列协议数据*/
typedef struct
{
CanMsgRx_QueueDataType Data[CANMSGRX_QUEUE_SIZE];
int DatatSize; //元素长度
int Front; //当前队头
int Rear; //当前队尾
int CurentNum; //当前已入队列元素总数
}str_CanMsgRx_QueueType,*str_CanMsgRx_QueuePtrType;
/*定义一个协议队列变量*/
str_CanMsgRx_QueueType CanMsgRx_Queue,*CanMsgRx_QueuePtr;
/*-------------------------------------------------
* @函数介绍: 初始化Queue
* @参数 : None
* @返回值 : OK Queue指针 Fault NULL
* @备注 : None
*-------------------------------------------------*/
void CanMsgRx_Queue_Init()
{
CanMsgRx_QueuePtr = &CanMsgRx_Queue;
memset(CanMsgRx_QueuePtr,0x00,sizeof(str_CanMsgRx_QueueType));
CanMsgRx_QueuePtr->DatatSize = sizeof(CanMsgRx_QueueDataType);
}
/*-------------------------------------------------
* @函数介绍: 进队列
* @参数 : 数据
* @参数 : Queue
* @返回值 : 0 失败 1 成功 2 不存在
* @备注 : None
*-------------------------------------------------*/
int CanMsgRx_Queue_In(CanMsgRx_QueueDataType *pData)
{
if(CanMsgRx_QueuePtr->CurentNum == CANMSGRX_QUEUE_SIZE)
return 0;
memcpy(CanMsgRx_QueuePtr->Data+CanMsgRx_QueuePtr->Rear,pData,CanMsgRx_QueuePtr->DatatSize);
CanMsgRx_QueuePtr->Rear = (CanMsgRx_QueuePtr->Rear+1)%CANMSGRX_QUEUE_SIZE;
CanMsgRx_QueuePtr->CurentNum++;
return 1;
}
/*-------------------------------------------------
* @函数介绍: 出队列
* @参数 : 元素值保存值 Queue
* @参数 : Queue
* @返回值 : 0 失败 1 成功 2 不存在
* @备注 : None
*-------------------------------------------------*/
int CanMsgRx_Queue_Out(CanMsgRx_QueueDataType *pData)
{
if(CanMsgRx_QueuePtr->CurentNum == 0)
return 0;
memcpy(pData,CanMsgRx_QueuePtr->Data+CanMsgRx_QueuePtr->Front,CanMsgRx_QueuePtr->DatatSize);
CanMsgRx_QueuePtr->Front= (CanMsgRx_QueuePtr->Front+1)%CANMSGRX_QUEUE_SIZE;
CanMsgRx_QueuePtr->CurentNum--;
return 1;
}