#ifndef __GX_swLoopFIFO_H__
#define __GX_swLoopFIFO_H__
#include "TypeDefine.h"
#define FIFO_SIZE 4000
#define True 1
#define Flase 0
#define Error -1
typedef struct
{
volatile uint DataBagCount;
volatile uint InPointer; // 头标记
volatile uint OutPointer; // 尾标记
volatile uint Free_Space_Count; //剩余空间数量
volatile char Error_Flag; //错误标志
volatile char Buf[FIFO_SIZE]; // 数据缓冲区
} sw_Loop_FIFO_t;
//函数名称: swFifoInit(sw_Loop_FIFO_t *pFifo,char EndSign);
//函数功能: 初始化swFIFO对象
//参数含义: pFifo :待初始化FIFO的地址
// EndSign :结束标志字符
//返 回 值: void
//备 注: 测试通过
//作 者: 郭萧
//所在单位: 北方民族大学
//完成时间: 2014.9.1
void swFifoInit(sw_Loop_FIFO_t *pFifo);
//函数名称: swFifoIsFull(sw_Loop_FIFO_t *pFifo);
//函数功能: 判定FIFO是否满
//参数含义: pFifo :待判断的FIFO的地址
//返 回 值: tBool
// True :FIFO为满
// Flase:FIFO非满
//备 注: 测试通过
//作 者: 郭萧
//所在单位: 北方民族大学
//完成时间: 2014.9.1
tBool swFifoIsFull(sw_Loop_FIFO_t *pFifo);
//函数名称: tBool swFifoIsEmpty(sw_Loop_FIFO_t *pFifo);
//函数功能: 判定FIFO是否空
//参数含义: pFifo :待判断的FIFO的地址
//返 回 值: tBool
// True :FIFO为空
// Flase:FIFO非空
//备 注: 测试通过
//作 者: 郭萧
//所在单位: 北方民族大学
//完成时间: 2014.9.1
tBool swFifoIsEmpty(sw_Loop_FIFO_t *pFifo);
//函数名称: tBool swFifoWrite(sw_Loop_FIFO_t *pFifo,char c);
//函数功能: 向指定FIFO写数据
//参数含义: pFifo:待写入的FIFO的地址
// c :待写入的数值
//返 回 值: tBool
// True :写入成功
// Flase:写入失败
//备 注: 测试通过
//作 者: 郭萧
//所在单位: 北方民族大学
//完成时间: 2014.9.1
void swFifoWrite(sw_Loop_FIFO_t *pFifo,char c);
//函数名称: char swFifoRead(sw_Loop_FIFO_t *pFifo);
//函数功能: 从指定的FIFO读数据
//参数含义: pFifo:待读取的的FIFO的地址
//返 回 值: char ReceiveData
//备 注: 测试通过
//作 者: 郭萧
//所在单位: 北方民族大学
//完成时间: 2014.9.1
char swFifoRead(sw_Loop_FIFO_t *pFifo);
//函数名称: char swFifoErrorFlagCheck(sw_Loop_FIFO_t *pFifo);
//函数功能: 判断是否有丢失数据的情况
//参数含义: pFifo:待读取的的FIFO的地址
//返 回 值: tBool
// True :数据接过程有丢数据错误
// Flase:数据接过程无丢数据错误
//备 注: 测试通过
//作 者: 郭萧
//所在单位: 北方民族大学
//完成时间: 2014.9.1
tBool swFifoErrorFlagCheck(sw_Loop_FIFO_t *pFifo);
#endif
#include "TypeDefine.h"
#include "GX_swLoopFIFO.h"
void swFifoInit(sw_Loop_FIFO_t *pFifo)
{
pFifo -> InPointer = 0;
pFifo -> OutPointer = 0;
pFifo -> Free_Space_Count = FIFO_SIZE;
pFifo -> Error_Flag = Flase;
}
tBool swFifoIsFull(sw_Loop_FIFO_t *pFifo)
{
if(pFifo -> Free_Space_Count == 0) //如果未置位判断是否已满
{
return True;
}
else
{
return Flase; //如果未满返回不成立
}
}
tBool swFifoIsEmpty(sw_Loop_FIFO_t *pFifo)
{
if(pFifo -> Free_Space_Count == FIFO_SIZE) //如果未置位判断是否已空
{
return True;
}
else
{
return Flase; //如果非空返回不成立
}
}
uint swFifoGetDataBagCount(sw_Loop_FIFO_t *pFifo)
{
return pFifo -> DataBagCount;
}
void swFifoWrite(sw_Loop_FIFO_t *pFifo,char c)
{
if (pFifo -> Free_Space_Count == 0)
{
pFifo -> Error_Flag = True; // 若FIFO是空的,则返回空字符
return;
}
else
{
pFifo -> Error_Flag = Flase;
}
pFifo -> Buf[pFifo -> InPointer] = c; //将数据存入FIFO
pFifo -> InPointer ++; //输入指针指向下一个空间
if(pFifo -> InPointer >= FIFO_SIZE) //判断输入是否超出FIFO界限
pFifo -> InPointer = 0; //如果超出则从零开始存放
pFifo -> Free_Space_Count --; //剩余空间减一
}
char swFifoRead(sw_Loop_FIFO_t *pFifo)
{
char ReceiveData;
if (pFifo -> Free_Space_Count >= FIFO_SIZE)
{
pFifo -> Error_Flag = True; // 若FIFO是空的,则返回空字符
return ('\0');
}
else
{
pFifo -> Error_Flag = Flase;
}
ReceiveData = pFifo -> Buf[pFifo -> OutPointer]; // 若FIFO不空,则正常读取
pFifo -> OutPointer ++; // 输出数据指针指向下一个
pFifo -> Free_Space_Count ++; // 空闲空间数加一
if (pFifo -> OutPointer >= FIFO_SIZE) // 调整Tail
{
pFifo -> OutPointer = 0;
}
return ReceiveData;
}
tBool swFifoErrorFlagCheck(sw_Loop_FIFO_t *pFifo)
{
if( pFifo -> Error_Flag)
{
pFifo -> Error_Flag = 0;
return True;
}
else
return Flase;
}