📄 fifo.cpp
字号:
#include "StdAfx.h"
#include "Fifo.h"
/***********************************************************************************************/
/* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */
const char CRC_8_table[256] = {
0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
(char)0xE0, (char)0xE7, (char)0xEE, (char)0xE9, (char)0xFC, (char)0xFB, (char)0xF2, (char)0xF5,
(char)0xD8, (char)0xDF, (char)0xD6, (char)0xD1, (char)0xC4, (char)0xC3, (char)0xCA, (char)0xCD,
(char)0x90, (char)0x97, (char)0x9E, (char)0x99, (char)0x8C, (char)0x8B, (char)0x82, (char)0x85,
(char)0xA8, (char)0xAF, (char)0xA6, (char)0xA1, (char)0xB4, (char)0xB3, (char)0xBA, (char)0xBD,
(char)0xC7, (char)0xC0, (char)0xC9, (char)0xCE, (char)0xDB, (char)0xDC, (char)0xD5, (char)0xD2,
(char)0xFF, (char)0xF8, (char)0xF1, (char)0xF6, (char)0xE3, (char)0xE4, (char)0xED, (char)0xEA,
(char)0xB7, (char)0xB0, (char)0xB9, (char)0xBE, (char)0xAB, (char)0xAC, (char)0xA5, (char)0xA2,
(char)0x8F, (char)0x88, (char)0x81, (char)0x86, (char)0x93, (char)0x94, (char)0x9D, (char)0x9A,
0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
(char)0x89, (char)0x8E, (char)0x87, (char)0x80, (char)0x95, (char)0x92, (char)0x9B, (char)0x9C,
(char)0xB1, (char)0xB6, (char)0xBF, (char)0xB8, (char)0xAD, (char)0xAA, (char)0xA3, (char)0xA4,
(char)0xF9, (char)0xFE, (char)0xF7, (char)0xF0, (char)0xE5, (char)0xE2, (char)0xEB, (char)0xEC,
(char)0xC1, (char)0xC6, (char)0xCF, (char)0xC8, (char)0xDD, (char)0xDA, (char)0xD3, (char)0xD4,
0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
(char)0xAE, (char)0xA9, (char)0xA0, (char)0xA7, (char)0xB2, (char)0xB5, (char)0xBC, (char)0xBB,
(char)0x96, (char)0x91, (char)0x98, (char)0x9F, (char)0x8A, (char)0x8D, (char)0x84, (char)0x83,
(char)0xDE, (char)0xD9, (char)0xD0, (char)0xD7, (char)0xC2, (char)0xC5, (char)0xCC, (char)0xCB,
(char)0xE6, (char)0xE1, (char)0xE8, (char)0xEF, (char)0xFA, (char)0xFD, (char)0xF4, (char)0xF3
};
/* CRC-16, poly = x^16 + x^15 + x^2 + x^0, init = 0 */
const WORD CRC_16_table[256] = {
0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011,
0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022,
0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072,
0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041,
0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2,
0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1,
0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1,
0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082,
0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192,
0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1,
0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1,
0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2,
0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151,
0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162,
0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132,
0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101,
0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312,
0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321,
0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371,
0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342,
0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1,
0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2,
0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2,
0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381,
0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291,
0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2,
0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2,
0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1,
0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252,
0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261,
0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231,
0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202
};
/* CRC-CCITT, poly = x^16 + x^12 + x^5 + x^0, init = 0 */
const WORD CRC_CCITT_table[256]={
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};
/***********************************************************************************************/
CFifo::CFifo(void)
{
InitializeCriticalSection(&FIFO_operation);
hEventRead = NULL;
hEventRead = CreateEvent(NULL, TRUE, FALSE, NULL);
hEventWrite = NULL;
hEventWrite = CreateEvent(NULL, TRUE, TRUE, NULL);
}
CFifo::~CFifo(void)
{
if(hEventRead)
{
CloseHandle(hEventRead);
hEventRead = NULL;
}
if(hEventWrite)
{
CloseHandle(hEventWrite);
hEventWrite = NULL;
}
DeleteCriticalSection(&FIFO_operation);
}
BOOL CFifo::ResetFIFO( char *BaseFIFO,
DWORD LenFIFO,
char EndFlag,
char TypeCRC,
DWORD ReadFlag,
DWORD WriteFlag,
BYTE ReadModeFIFO,
BYTE WriteModeFIFO
)
{
if (!hEventRead)
return FALSE;
if (!hEventWrite)
return FALSE;
EnterCriticalSection(&FIFO_operation);
FIFO_Base = BaseFIFO;
FIFO_Len = LenFIFO - 1;
cEndFlag = EndFlag;
nPtr_W = 0;
nPtr_W_inFrame = 0;
nPtr_R = 0;
CRC_Type = TypeCRC;
if(!(CRC_Type >= CRC_TYPE_8_BIT && CRC_Type <= CRC_TYPE_CCITT))
return FALSE;
wFrmNumToRead = ReadFlag;
wFrmNumToWrite = WriteFlag;
ReadFlagEnable = TRUE;
WriteFlagEnable = FALSE;
FIFO_ReadMode = ReadModeFIFO;
if(!(FIFO_ReadMode >= READ_BY_LENGTH && FIFO_ReadMode <= READ_ENDFLAG_WITH_CRC))
return FALSE;
FIFO_WriteMode = WriteModeFIFO;
if(!(FIFO_WriteMode >= WRITE_BY_LENGTH && FIFO_WriteMode <= WRITE_ENDFLAG_WITH_CRC))
return FALSE;
if(FIFO_ReadMode == READ_ENDFLAG_WITH_CRC || FIFO_WriteMode == WRITE_ENDFLAG_WITH_CRC)
{
if(cEndFlag != 0x7E)
return FALSE;
}
wFrameNum = 0;
ResetEvent(hEventRead);
SetEvent(hEventWrite);
LeaveCriticalSection(&FIFO_operation);
return TRUE;
}
void CFifo::EmptyFIFO()
{
EnterCriticalSection(&FIFO_operation);
nPtr_W = 0;
nPtr_W_inFrame = 0;
nPtr_R = 0;
// ReadFlagEnable = TRUE;
// WriteFlagEnable = FALSE;
wFrameNum = 0;
ResetEvent(hEventRead);
SetEvent(hEventWrite);
LeaveCriticalSection(&FIFO_operation);
}
DWORD CFifo::GetRoomLeft()
{
if(nPtr_W >= nPtr_R)
return FIFO_Len - (nPtr_W - nPtr_R);
else
return (nPtr_R - nPtr_W) - 1;
}
DWORD CFifo::WriteFIFO(char *BufIn, DWORD Len)
{
DWORD len_new, len_frm;
DWORD new_frame_num = 0;
EnterCriticalSection(&FIFO_operation);
if(FIFO_WriteMode == WRITE_ENDFLAG_WITH_CRC)
{
len_frm = FrameConstructor(BufIn, Len);
len_new = PutDataIntoFIFO(BufTempIn, len_frm);
if(len_new)
new_frame_num++;
}
if(FIFO_WriteMode == WRITE_NOT_COMPLETE_FRAME)
{
len_new = PartialDataIntoFIFO(BufIn, Len, new_frame_num);
}
if(FIFO_WriteMode == WRITE_BY_LENGTH)
{
len_new = PutDataIntoFIFO(BufIn, Len);
if(len_new)
new_frame_num++;
}
if(new_frame_num)
{
wFrameNum += new_frame_num;
if(ReadFlagEnable && (wFrameNum >= wFrmNumToRead))
SetEvent(hEventRead);
if(WriteFlagEnable && (wFrameNum > wFrmNumToWrite))
ResetEvent(hEventWrite);
}
LeaveCriticalSection(&FIFO_operation);
return len_new;
}
DWORD CFifo::ReadFIFO(char *BufOut, DWORD Len)
{
DWORD len_new, len_frm;
EnterCriticalSection(&FIFO_operation);
if(FIFO_ReadMode == READ_ENDFLAG_WITH_CRC)
{
len_frm = GetDataFromFIFO(BufTempOut);
len_new = FrameExtractor(BufOut, len_frm);
}
if(FIFO_ReadMode == READ_ENDFLAG_NO_CRC)
{
len_new = GetDataFromFIFO(BufOut);
}
if(FIFO_ReadMode == READ_BY_LENGTH)
{
len_new = GetDataFromFIFO(BufOut, Len);
}
if(len_new)
{
wFrameNum--;
if(ReadFlagEnable && (wFrameNum < wFrmNumToRead))
ResetEvent(hEventRead);
if(WriteFlagEnable && (wFrameNum <= wFrmNumToWrite))
SetEvent(hEventWrite);
}
LeaveCriticalSection(&FIFO_operation);
return len_new;
}
DWORD CFifo::PutDataIntoFIFO(char *BufIn, DWORD Len)
{
DWORD Len_tmp = Len;
char *ptr_tmp = FIFO_Base + nPtr_W;
DWORD Len1 = FIFO_Len - nPtr_W + 1;
if(GetRoomLeft() < Len_tmp)
return 0;
if(Len1 > Len_tmp)
{
nPtr_W += Len;
while(Len_tmp--)
*ptr_tmp++ = *BufIn++;
}
else
{
Len_tmp -= Len1;
nPtr_W = Len_tmp;
while(Len1--)
*ptr_tmp++ = *BufIn++;
ptr_tmp = FIFO_Base;
while(Len_tmp--)
*ptr_tmp++ = *BufIn++;
}
return Len;
}
DWORD CFifo::PartialDataIntoFIFO(char *BufIn, DWORD Len, DWORD &FrmNum)
{
DWORD i;
char *ptr_s = BufIn;
DWORD len_r = 0;
DWORD len_t = 0;
DWORD len_n = 0;
static BOOL del_frm = FALSE;
for(i = 0; i < Len; i++)
{
len_n++;
if(*(BufIn + i) == cEndFlag)
{
if(!del_frm)
{
len_t = PutDataIntoFIFO(ptr_s, len_n);
if(len_t)
{
nPtr_W_inFrame = nPtr_W;
len_r += len_t;
FrmNum++;
}
else
{
nPtr_W = nPtr_W_inFrame;
del_frm = TRUE;
}
}
else
del_frm = FALSE;
ptr_s += len_n;
len_n = 0;
}
}
if(len_n && !del_frm)
{
len_t = PutDataIntoFIFO(ptr_s, len_n);
if(len_t)
len_r += len_t;
else
{
nPtr_W = nPtr_W_inFrame;
del_frm = TRUE;
}
}
return len_r;
}
DWORD CFifo::GetDataFromFIFO(char *BufOut, DWORD Len)
{
DWORD Len_tmp = Len;
char *ptr_tmp = FIFO_Base + nPtr_R;
DWORD Len1 = FIFO_Len - nPtr_R + 1;
if(wFrameNum == 0)
return 0;
if(Len1 > Len_tmp)
{
nPtr_R += Len;
while(Len_tmp--)
*BufOut++ = *ptr_tmp++;
}
else
{
Len_tmp -= Len1;
nPtr_R = Len_tmp;
while(Len1--)
*BufOut++ = *ptr_tmp++;
ptr_tmp = FIFO_Base;
while(Len_tmp--)
*BufOut++ = *ptr_tmp++;
}
return Len;
}
DWORD CFifo::GetDataFromFIFO(char *BufOut)
{
DWORD Len_r = 0;
if(wFrameNum == 0)
return 0;
while(*(FIFO_Base + nPtr_R) != cEndFlag)
{
*BufOut++ = *(FIFO_Base + nPtr_R);
Len_r++;
if(nPtr_R++ >= FIFO_Len)
nPtr_R = 0;
}
*BufOut = *(FIFO_Base + nPtr_R);
Len_r++;
if(nPtr_R++ >= FIFO_Len)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -