#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;
}