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

📄 irdll.cpp

📁 嵌入式wince下进行红外码的采集和压缩,平台:wince42 xscale pxa225
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		//		printf("2s waiting over====");
			break;
		}
	//	for(nSleepTick=0;nSleepTick<5;nSleepTick++)
		//	SleepTillTick();//避免系统死机
	}
	CloseHandle(hDio);

	//打印数据
//	Sleep(3000);
	WCHAR wTemp[1024];
	swprintf(wTemp,L"Begin DIO:ret=%d =============",Index);
	writebuginfo(wTemp);
	for(i=0;i<Index;i++)
	{
		swprintf(wTemp,L"%ld",lnPulseList[i].QuadPart);
		writebuginfo(wTemp);
	}
	swprintf(wTemp,L"End DIO  =============");
	writebuginfo(wTemp);
	//转换采集的数据
	//将时间转换成要求的精度,us
	QueryPerformanceFrequency(&lnFreq);

	int ulTemp,*pInt=(int*)pbuf;
	//	writebuginfo(wTemp);
	for(i=1;i<Index;i++)
	{
		if(i> nLen /sizeof(int))
			break;
		*(pInt + i-1)=(lnPulseList[i].QuadPart-lnPulseList[i-1].QuadPart)*(TIME_TARGET/1000)/(lnFreq.QuadPart/(TIME_TARGET/1000));
		if(*(pInt + i-1) >TIME_MAX)
			*(pInt + i-1)=TIME_MAX;
	//	*(pInt + i)=(lnPulseList[i].QuadPart-lnPulseList[0].QuadPart)*(TIME_TARGET/1000)/(lnFreq.QuadPart/(TIME_TARGET/1000));
	//	ulTemp=*(pInt + i-1) /3.6864;
	//	swprintf(wTemp,L"Fre%d=%ld,tm=%d,tmus=%d,%d,%d",i,lnPulseList[i].QuadPart,*(pInt + i-1),(*(pInt + i-1)));
		swprintf(wTemp,L"tm%d=%d",i,*(pInt + i-1));
		writebuginfo(wTemp);
	//	if(*(pInt + i-1) >TIME_MAX)
	//		*(pInt + i-1)=TIME_MAX;
	}
	//采集完毕,恢复原来的优先级
	SetThreadPriority(hCurThread,nPiority);
	CeSetThreadQuantum(hCurThread,dwQuant);
    if(i<PULSE_MIN)
		return ERR_IRDLL_MINPULSE;
	else
	return i;
}
/*
功能:内部函数,完成数据的压缩
参数:
int *pbuf-输入参数,采集的原始数据
int nLen -buf的长度
char *pout-输出参数,压缩的数据
int noutlen-pout的长度
返回:int
1 - 数据有效
<0 -错误代码
编写人:吕黄梁
时间:2005-02-21
*/
int CompressData(int *pbuf,int nlen,char *pout,int noutlen)
{
	WCHAR wTemp[1024];
	int nRet=1;
	Pulse_Compress_str pulse_compress_str;
	memset(&pulse_compress_str,0,sizeof(Pulse_Compress_str));
	//压缩
	int i,j,k;
	int nwidth;
	float fscale;
	for(i=1;i<nlen;i+=2)
	{
//	swprintf(wTemp,L"i=%d =============",i);
//	writebuginfo(wTemp);
		nwidth=*(pbuf + i-1) + *(pbuf + i);
		if(i ==75)
		{
			swprintf(wTemp,L"i=%d =============",i);
		}
		for(j=0;j<pulse_compress_str.nPulseKindNum;j++)
		{
			fscale=(*(pbuf + i-1))*100/pulse_compress_str.PulseList[j].ushHigh;
			if(fscale < PRECISION_HIGH || fscale > (200-PRECISION_HIGH))
			{
				continue;
			}
			if(*(pbuf + i) > INTER_OF_FRAME && pulse_compress_str.PulseList[j].ushLow > INTER_OF_FRAME)
			{//高电平相等,且低电平大于定义的帧间隔,认为相等

		swprintf(wTemp,L"index%d =%d,pulse%d=%d:%d ",i,*(pbuf + i),j,pulse_compress_str.PulseList[j].ushHigh,pulse_compress_str.PulseList[j].ushLow);
		writebuginfo(wTemp);
				break;
			}
		//	fscale=nwidth*100/pulse_compress_str.PulseList[j].nWidth;
			//直接比较低电平,准确度高
			fscale=(*(pbuf + i))*100/pulse_compress_str.PulseList[j].ushLow;
			if(fscale < PRECISION_PULSE || fscale > (200-PRECISION_PULSE))
			{
				continue;
			}
			//相等
			break;
		}
		if(j==pulse_compress_str.nPulseKindNum)
		{
			pulse_compress_str.nPulseKindNum++;
			if(pulse_compress_str.nPulseKindNum >= PULSE_KIND_MAX)
				return ERR_IRDLL_OVERKIND;
		}
/*		{//新类型脉冲,添加
			pulse_compress_str.PulseList[j].lTotalHigh +=*(pbuf + i-1);
			pulse_compress_str.PulseList[j].lTotalLow +=*(pbuf + i);
			pulse_compress_str.PulseList[j].ushHigh = *(pbuf + i-1);
			pulse_compress_str.PulseList[j].ushLow = *(pbuf + i);
			pulse_compress_str.PulseList[j].nWidth = nwidth;
		}else
*/		{//求平均
			pulse_compress_str.PulseList[j].lTotalHigh +=*(pbuf + i-1);
			pulse_compress_str.PulseList[j].nNum++;
			pulse_compress_str.PulseList[j].ushHigh=pulse_compress_str.PulseList[j].lTotalHigh /pulse_compress_str.PulseList[j].nNum;
			if(i == nlen -1  && *(pbuf + i) >INTER_OF_FRAME )
			{//最后一个脉冲的,为2秒的结束判断,处理为帧结束脉冲的平均值
			//	printf("the last one =%d \r\n",*(pbuf + i));
				pulse_compress_str.PulseList[j].lTotalLow +=pulse_compress_str.PulseList[j].ushLow;
			}else
			{
				pulse_compress_str.PulseList[j].lTotalLow +=*(pbuf + i);
			}
			pulse_compress_str.PulseList[j].ushLow=pulse_compress_str.PulseList[j].lTotalLow /pulse_compress_str.PulseList[j].nNum;
			pulse_compress_str.PulseList[j].nWidth =pulse_compress_str.PulseList[j].ushHigh+pulse_compress_str.PulseList[j].ushLow;//(pulse_compress_str.PulseList[j].lTotalHigh + pulse_compress_str.PulseList[j].lTotalLow) /pulse_compress_str.PulseList[j].nNum;
		}
		pulse_compress_str.cPulse[pulse_compress_str.nPulseNum]=j;
		pulse_compress_str.nPulseNum++;
	}
	//在此打印帧处理前的数据
/*		swprintf(wTemp,L"before frame pulse kinds=%d =============",pulse_compress_str.nPulseKindNum);
		writebuginfo(wTemp);
	for(i=0;i<pulse_compress_str.nPulseKindNum;i++)
	{
		swprintf(wTemp,L"K%d: %d-%d :%d ",i,pulse_compress_str.PulseList[i].ushHigh,pulse_compress_str.PulseList[i].ushLow,
			pulse_compress_str.PulseList[i].nNum);
		writebuginfo(wTemp);
	}
		swprintf(wTemp,L"before frame pulse num=%d =============",pulse_compress_str.nPulseNum);
		writebuginfo(wTemp);
	for(i=0;i<pulse_compress_str.nPulseNum;i+=4)
	{
		swprintf(wTemp,L"%d %d-%d %d-%d ",i/4,pulse_compress_str.cPulse[i],pulse_compress_str.cPulse[i+1],
			pulse_compress_str.cPulse[i+2],pulse_compress_str.cPulse[i+3]);
		writebuginfo(wTemp);
	}
*/

	//识别帧:至少会有bit0和bit1两种脉冲,从第2个脉冲开始,低电平高于确定的范围认为帧间隔
//	int nFramePos[FRAME_MAX];		//存放帧开始的脉冲索引
	for(i=2;i<pulse_compress_str.nPulseKindNum;i++)
	{
		if(pulse_compress_str.PulseList[i].ushLow > INTER_OF_FRAME)
		{
			for(j=0;j<pulse_compress_str.nPulseNum;j++)
			{
				if(pulse_compress_str.cPulse[j] == i)
				{//当前帧结束脉冲

					if(pulse_compress_str.nFrame >=FRAME_MAX)
					{
						return ERR_IRDLL_OVERFRAME;
					}
					for(k=0;k<pulse_compress_str.nFrame;k++)
					{
						if(pulse_compress_str.nFramePos[k] > j)
							break;
					}
					if(k==pulse_compress_str.nFrame)
					{
						pulse_compress_str.nFramePos[k]=j;
					}else
					{//按顺序插入到帧索引中
						for(int l=pulse_compress_str.nFrame;l>k;l--)
						{
							pulse_compress_str.nFramePos[l]=pulse_compress_str.nFramePos[l-1];
						}
						pulse_compress_str.nFramePos[k]=j;
					}
					pulse_compress_str.nFrame++;
				}
			}
		}
	}
	//帧处理,去除重复帧:
	//1.从最后一帧开始与第二帧对比,如果相同就删除
	int num1,num2;
	for(i=pulse_compress_str.nFrame-1;i>=2;i--)
	{
		num1=pulse_compress_str.nFramePos[i] -  pulse_compress_str.nFramePos[i-1];
		num2=pulse_compress_str.nFramePos[1] -  pulse_compress_str.nFramePos[0];
		if(num1 != num2)
			continue ;
		if(memcmp(pulse_compress_str.cPulse + pulse_compress_str.nFramePos[i-1]+1,
			pulse_compress_str.cPulse + pulse_compress_str.nFramePos[0]+1,num1-1) ==0)
		{
			//继续判断结束脉冲,高电平相等认为该脉冲也相等
			if(pulse_compress_str.cPulse[pulse_compress_str.nFramePos[i]] != pulse_compress_str.cPulse[pulse_compress_str.nFramePos[1]])
			{
				tagPULSE *pPulse1,*pPulse2;
				pPulse1=&(pulse_compress_str.PulseList[pulse_compress_str.cPulse[pulse_compress_str.nFramePos[i]]]);
				pPulse2=&(pulse_compress_str.PulseList[pulse_compress_str.cPulse[pulse_compress_str.nFramePos[1]]]);
				fscale=100*pPulse1->ushHigh/pPulse2->ushHigh;
				if(abs(100-fscale) < (100-PRECISION_HIGH))
				{//不等
					continue;
				}
			}
			//删除帧
			memcpy(pulse_compress_str.cPulse + pulse_compress_str.nFramePos[i-1]+1,pulse_compress_str.cPulse + pulse_compress_str.nFramePos[i]+1,PULSE_MAX -pulse_compress_str.nFramePos[i] );
			pulse_compress_str.nPulseNum -= num1;
		swprintf(wTemp,L" del1 from= %d num= %d ",pulse_compress_str.nFramePos[i-1]+1,num1);
		writebuginfo(wTemp);

			//帧索引前移,并减去删除的脉冲数量
			for(j=i+1;j< pulse_compress_str.nFrame;j++)
			{
				pulse_compress_str.nFramePos[j-1]=pulse_compress_str.nFramePos[j] - num1;
			}
			pulse_compress_str.nFrame--;
		}
	}
	//2.从第二帧开始与第一帧对比,如果相同就删除
	num2=pulse_compress_str.nFramePos[0]+1;
	for(i=1;i<pulse_compress_str.nFrame;i++)
	{
		num1=pulse_compress_str.nFramePos[i] -  pulse_compress_str.nFramePos[i-1];
		if(num1 != num2)
			continue ;
		if(memcmp(pulse_compress_str.cPulse + pulse_compress_str.nFramePos[i-1]+1,
			pulse_compress_str.cPulse,num1-1) ==0)
		{
			//继续判断结束脉冲,高电平相等认为该脉冲也相等
			if(pulse_compress_str.cPulse[pulse_compress_str.nFramePos[i]] != pulse_compress_str.cPulse[pulse_compress_str.nFramePos[0]])
			{
				tagPULSE *pPulse1,*pPulse2;
				pPulse1=&(pulse_compress_str.PulseList[pulse_compress_str.cPulse[pulse_compress_str.nFramePos[i]]]);
				pPulse2=&(pulse_compress_str.PulseList[pulse_compress_str.cPulse[pulse_compress_str.nFramePos[0]]]);
				fscale=pPulse1->ushHigh *100/pPulse2->ushHigh;
				if(abs(100-fscale) < (100 -PRECISION_HIGH ))
				{//不等
					continue;
				}
			}
			//删除帧
			memcpy(pulse_compress_str.cPulse + pulse_compress_str.nFramePos[i-1]+1,pulse_compress_str.cPulse + pulse_compress_str.nFramePos[i]+1,PULSE_MAX -pulse_compress_str.nFramePos[i] );
			pulse_compress_str.nPulseNum -= num1;
		swprintf(wTemp,L" del2 from= %d num= %d ",i,num1);
		writebuginfo(wTemp);
			//帧索引前移,并减去删除的脉冲数量
			for(j=i+1;j< pulse_compress_str.nFrame;j++)
			{
				pulse_compress_str.nFramePos[j-1]=pulse_compress_str.nFramePos[j] - num1;
			}
			pulse_compress_str.nFrame--;
		}
	}
	//将压缩的数据拷贝到输出buf
	if(pulse_compress_str.nPulseKindNum >= OUT_PULSE_MAXKIND)
	{
		return ERR_IRDLL_OVERKIND;
	}
	if(noutlen < OUT_BUF_MIN)
		return ERR_IRDLL_BUFMIN;
	memset(pout,0,noutlen);
	unsigned short *pWidth=(unsigned short*)(pout+OUT_START_PULSE);
	for(i=0;i<pulse_compress_str.nPulseKindNum;i++)
	{
		*(pWidth++)=pulse_compress_str.PulseList[i].ushHigh;
		*(pWidth++)=pulse_compress_str.PulseList[i].ushLow;
	}
	char *pIndex=pout+OUT_START_INDEX;
	for(i=0;i<pulse_compress_str.nPulseNum;i++)
	{
		if(i%2 ==0)
		{
			*pIndex=pulse_compress_str.cPulse[i] & 0x0f;
		}else
		{
			*pIndex +=( pulse_compress_str.cPulse[i]<<4) & 0xf0;
			pIndex++;
		}
	}
	*(unsigned short*)(pout+2) = pulse_compress_str.nPulseNum;
	nRet=OUT_START_INDEX+pulse_compress_str.nPulseNum/2;
	nRet+=pulse_compress_str.nPulseNum%2;
	return nRet;
}
void writebuginfo(WCHAR *p)
{
//#ifdef DEBUG
	FILE *pFile=_wfopen(L"IrData.txt",L"a+");
	if(pFile != NULL)
	{
		fwprintf(pFile,p,sizeof(WCHAR),wcslen(p));
		fwprintf(pFile,L"\r\n",sizeof(WCHAR),2);
		fclose(pFile);
	}
//#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -