📄 dabemu.cpp
字号:
for (u32i = 1; u32i < m_head.u8SubFrameNum; u32i++ )
{
m_head.u32SubFrameLen[u32i] = valuethree(pinHead); // 每个复用子帧的长度 从第2帧开始
pinHead += 3;
}
if (1 == m_head.u8NextPara)
{
for (u32i = 0; u32i < 5; u32i++)
{
m_head.u8NextParaC[u32i] = *pinHead;
pinHead++;
}
}
m_head.u32CRC = valuefour(pinHead); // 校验位 32位
pinHead += 4;
return true;
}
/*******************************************************************************
* 函数名称 : GetHeadLen
* 作 者 : 林亚
* 设计日期 : 2006年9月26日
* 功能描述 : 得到复用帧头的长度
* 参 数 : UInt8 *pinHead
* 返 回 值 : UInt8
*******************************************************************************/
UInt8 GetHeadLen(UInt8 *pinHead)
{
UInt8 u8HeadLen = 0;
pinHead += 4;
u8HeadLen = *pinHead;
return (u8HeadLen + 4);
}
/*******************************************************************************
* 函数名称 : GetFrameLen
* 作 者 : 林亚
* 设计日期 : 2006年9月26日
* 功能描述 : 得到所有复用子帧的总长度(文件中有复用帧头的信息)
* 参 数 : UInt8 *pinHead
* 返 回 值 : UInt32
*******************************************************************************/
UInt32 GetFrameLen(UInt8 *pinHead)
{
UInt32 u32Temp = 0;
UInt32 u32SubFrameNum = 0;
UInt32 u32AllFrameLen = 0;
UInt32 u32i = 0;
pinHead += 11; //到第12个字节
u32Temp = *pinHead;
u32SubFrameNum = u32Temp & 0x0F;
pinHead += 1;
u32Temp = valuethree(pinHead);
u32AllFrameLen += u32Temp;
pinHead += 3;
for (u32i = 0; u32i < u32SubFrameNum - 1; u32i++)
{
u32Temp = valuethree(pinHead);
u32AllFrameLen += u32Temp;
pinHead += 3;
}
return (u32AllFrameLen);
}
////////////////////////////////////////////////////////////////////////
int EmuOpen(const char* pFileName, bool bLive)
{
int ret = -1;
if (!bLive && pfInputFile == NULL)
{
pfInputFile = fopen(pFileName, "rb");
}
else // live
{
#ifdef __linux__
startSPI();
stopdemodulatorSPI();
startdemodulatorSPI();
#endif
}
return ret;
}
int EmuClose()
{
int ret = -1;
if (pfInputFile)
{
fclose(pfInputFile);
pfInputFile = NULL;
}
else
{
#ifdef __linux__
stopSPI();
stopdemodulatorSPI();
#endif
}
return ret;
}
int EmuBegin(int iID)
{
int ret = -1;
if (pfInputFile)
{
fseek( pfInputFile, 0, SEEK_SET);
}
else
{
#ifdef __linux__
setTimeSlot(iID, iID+1, iID+2, iID+3);
startSPI();
#endif
}
return ret;
}
int EmuEnd()
{
if (pfInputFile)
{
}
else
{
#ifdef __linux__
stopSPI();
#endif
}
return 0;
}
int DABQUEUE_GetReadBlockSize()
{
return READBLOCKSIZE;
}
int DABQUEUE_ReadBlock(unsigned char *pBlock, int size)
{
int ret = -1;
UInt32 u32SFLen = 0;
if (pfInputFile)
{
ret = fread(pBlock, 1, 15, pfInputFile);
if ( ret != 15)
{
return 0;
}
u32SFLen = GetSubFrameLen(pBlock);
if (u32SFLen < 15 || (u32SFLen + 15) > READBLOCKSIZE)
{
return 0;
}
ret = fread(pBlock + 15, 1, u32SFLen - 15, pfInputFile);
if ( ret != (u32SFLen - 15) )
{
return 0;
}
ret += 15;
}
return ret;
}
int DABQUEUE_ReadBlock_Frame(unsigned char *pBlock, int size)
{
int ret = -1;
unsigned int u32FLen = 0;
int nOffset = 0;
if (pfInputFile)
{
__ReTry:
do
{
ret = fread(pBlock, 1, 1, pfInputFile);
if ( ret != 1)
{
return 0;
}
} while(*pBlock == 0xFF );
nOffset = 1;
ret = fread(pBlock+nOffset, 1, 3, pfInputFile);
if ( ret != 3)
{
return 0;
}
nOffset += 3;
while(!(pBlock[0] == 0x0 && pBlock[1] == 0x0 && pBlock[2] == 0x0 && pBlock[3] == 0x1 ))
{
pBlock[0] = pBlock[1];
pBlock[1] = pBlock[2];
pBlock[2] = pBlock[3];
ret = fread(&pBlock[3], 1, 1, pfInputFile);
if ( ret != 1)
{
return 0;
}
}
//读出复用帧的长度
ret = fread(pBlock+nOffset, 1, 1, pfInputFile);
if ( ret != 1)
{
return 0;
}
nOffset++;
//复用帧头加CRC校验位(*(pBlock+4) - 5 + 4)
ret = fread(pBlock+5, 1, (*(pBlock+4) - 5 + 4), pfInputFile);
if ( ret != (*(pBlock+4) - 5 + 4))
{
return 0;
}
nOffset += (*(pBlock+4) - 5 + 4);
if(!HeadParser(pBlock))
{
goto __ReTry;
}
u32FLen = GetFrameLen(pBlock);
if(u32FLen > 0)
{
ret = fread(pBlock+nOffset, 1, u32FLen, pfInputFile);
if ( ret != u32FLen )
{
return 0;
}
ret += nOffset;
}
else
{
ret = nOffset;
}
// if(g_nCount > 0)
// {
// fwrite(pBlock, 1, u32FLen, pFile1);
// fflush(pFile1);
// g_nCount ++;
// }
}
return ret;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
#ifdef __linux__
void setTimeSlot(int i, int j, int k, int l)
{
int iTime = 0;
int jTime = 0;
int kTime = 0;
int lTime = 0;
int itmp = 0;
if (i == 0 || j == 0)
{
return;
}
if (i < 8)
{
iTime = 1 << i;
if (j < 8)
{
jTime = 1 << j;
itmp = iTime | jTime;
WriteI2CDataEx(0x20, itmp);
WriteI2CDataEx(0x21, 0x00);
}
else
{
jTime = 1 << (j % 8);
WriteI2CDataEx(0x20, iTime);
WriteI2CDataEx(0x21, jTime);
}
WriteI2CDataEx(0x22, 0x00);
WriteI2CDataEx(0x23, 0x00);
WriteI2CDataEx(0x24, 0x00);
WriteI2CDataEx(0x25, 0x00);
}
else if (i < 16)
{
iTime = 1 << (i % 8);
WriteI2CDataEx(0x20, 0x00);
if (j < 16)
{
jTime = 1 << (j % 8);
itmp = iTime | jTime;
WriteI2CDataEx(0x21, itmp);
WriteI2CDataEx(0x22, 0x00);
}
else
{
jTime = 1 << (j % 16);
WriteI2CDataEx(0x21, iTime);
WriteI2CDataEx(0x22, jTime);
}
WriteI2CDataEx(0x23, 0x00);
WriteI2CDataEx(0x24, 0x00);
WriteI2CDataEx(0x25, 0x00);
}
else if (i < 24)
{
iTime = 1 << (i % 16);
WriteI2CDataEx(0x20, 0x00);
WriteI2CDataEx(0x21, 0x00);
if (j < 24)
{
jTime = 1 << (j % 16);
itmp = iTime | jTime;
WriteI2CDataEx(0x22, itmp);
WriteI2CDataEx(0x23, 0x00);
}
else
{
jTime = 1 << (j % 24);
WriteI2CDataEx(0x22, iTime);
WriteI2CDataEx(0x23, jTime);
}
WriteI2CDataEx(0x24, 0x00);
WriteI2CDataEx(0x25, 0x00);
}
else if (i < 32)
{
iTime = 1 << (i % 24);
WriteI2CDataEx(0x20, 0x00);
WriteI2CDataEx(0x21, 0x00);
WriteI2CDataEx(0x22, 0x00);
if (j < 32)
{
jTime = 1 << (j % 24);
itmp = iTime | jTime;
WriteI2CDataEx(0x23, itmp);
WriteI2CDataEx(0x24, 0x00);
}
else
{
jTime = 1 << (j % 32);
WriteI2CDataEx(0x23, iTime);
WriteI2CDataEx(0x24, jTime);
}
WriteI2CDataEx(0x25, 0x00);
}
if (k == 0 || l == 0)
{
return;
}
if (k < 8)
{
kTime = 1 << k;
if (l < 8)
{
lTime = 1 << l;
itmp = kTime | lTime;
WriteI2CDataEx(0x26, itmp);
WriteI2CDataEx(0x27, 0x00);
}
else
{
lTime = 1 << (l % 8);
WriteI2CDataEx(0x26, kTime);
WriteI2CDataEx(0x27, lTime);
}
WriteI2CDataEx(0x28, 0x00);
WriteI2CDataEx(0x29, 0x00);
WriteI2CDataEx(0x2A, 0x00);
WriteI2CDataEx(0x2B, 0x00);
}
else if (k < 16)
{
kTime = 1 << (k % 8);
WriteI2CDataEx(0x26, 0x00);
if (l < 16)
{
lTime = 1 << (l % 8);
itmp = kTime | lTime;
WriteI2CDataEx(0x27, itmp);
WriteI2CDataEx(0x28, 0x00);
}
else
{
lTime = 1 << (l % 16);
WriteI2CDataEx(0x27, kTime);
WriteI2CDataEx(0x28, lTime);
}
WriteI2CDataEx(0x29, 0x00);
WriteI2CDataEx(0x2A, 0x00);
WriteI2CDataEx(0x2B, 0x00);
}
else if (k < 24)
{
kTime = 1 << (k % 16);
WriteI2CDataEx(0x26, 0x00);
WriteI2CDataEx(0x27, 0x00);
if (l < 24)
{
lTime = 1 << (l % 16);
itmp = kTime | lTime;
WriteI2CDataEx(0x28, itmp);
WriteI2CDataEx(0x29, 0x00);
}
else
{
lTime = 1 << (l % 24);
WriteI2CDataEx(0x28, kTime);
WriteI2CDataEx(0x29, lTime);
}
WriteI2CDataEx(0x2A, 0x00);
WriteI2CDataEx(0x2B, 0x00);
}
else if (k < 32)
{
kTime = 1 << (k % 24);
WriteI2CDataEx(0x26, 0x00);
WriteI2CDataEx(0x27, 0x00);
WriteI2CDataEx(0x28, 0x00);
if (l < 32)
{
lTime = 1 << (l % 24);
itmp = kTime | lTime;
WriteI2CDataEx(0x29, itmp);
WriteI2CDataEx(0x2A, 0x00);
}
else
{
lTime = 1 << (l % 32);
WriteI2CDataEx(0x29, kTime);
WriteI2CDataEx(0x2A, lTime);
}
WriteI2CDataEx(0x2B, 0x00);
}
WriteI2CDataEx(0x2C, 0x41);//配置解调参数
WriteI2CDataEx(0x2D, 0x41);//配置解调参数
writeI2CData(0xFF, 0x03);
writeI2CData(0x05, 0x01);
writeI2CData(0x05, 0x00);
writeI2CData(0xFF, 0x00);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -