📄 irdll.cpp
字号:
// 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 + -