⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dabemu.cpp

📁 中兴提供的跨平台解码库的解码器的介绍源码和文档
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -