📄 dataexp.cpp
字号:
#include "stdafx.h"
#include "CeTools.h"
#include "UManageView.h"
extern int ExitRevThread;
int ViewLineNo;
WORD CheckSum(BYTE *buf, int len);
void ErrRate(int flag,CUManageView* pObject);
CString BinToStr(BYTE *buf,int len);//转换成字符串
CString BinToStr2(BYTE *buf,int len);//转换成整数串
CString DataExp_3(BYTE *buf,int *len);//解码
CString DataExp_2(BYTE *buf,int len,int *LineNo,int RunNT);
CString DataExp_1(BYTE *buf,int *len,DWORD *ErrLen,int RunNT);
CString DataExp_0(BYTE *buf,int *len,DWORD *ErrLen,int RunNT);
/***********************************************************
用途:从RvBuff中取出数据及长度,解释数据形成文本形式,
送往ViewDataStr[].ViewData用于显示
调用:独立线程
参数:父指针
返回:不用
***********************************************************/
UINT DataExp( LPVOID pParam )
{
int k,i,m,k1;
int DataPos=0,DataPos2=0,MDataPos=0;
int JDataPos=0,JDataPos2=0;
CString str;
CStdioFile csf;
int Alen=0,Blen=0,Errlen=0;
BYTE bTemp[4];
BYTE DataBuff[R_BUFFER_SIZE],DataBuff2[R_BUFFER_SIZE],MDataBuff[R_BUFFER_SIZE];
BYTE JDataBuff[R_BUFFER_SIZE],JDataBuff2[R_BUFFER_SIZE];
BYTE Z_Buff[140];
CString ViewData="";
ViewLineNo=0;
csf.Open("ABErr.txt",CFile::modeCreate|CFile::modeWrite|CFile::typeText);
CUManageView* pObject = (CUManageView*)pParam;
if(pObject == NULL || !pObject->IsKindOf(RUNTIME_CLASS(CUManageView)))
return 0; // 非法参数
while(1)
{
Sleep(50);
if(ExitRevThread)//退出
{
csf.Close();
return 10;
}
if(pObject->RvStr.Endp == pObject->RvStr.sp)//无数据
continue;
m=pObject->RvStr.Endp;
if(m>pObject->RvStr.sp)
k=pObject->RvStr.Endp-pObject->RvStr.sp;
else
k=R_BUFFER_SIZE-pObject->RvStr.sp+m;
pObject->app->BufferDataLen=k;
if(k<280 && pObject->RvStr.TimerCount<10)
continue;
k1=m;
if(ViewLineNo>10000)
ViewLineNo=0;
if(pObject->app->BmState==0)//无编码
{
m=k;
k=pObject->RvStr.sp;
for(i=0;i<m;i++)
{
DataBuff[DataPos++]=pObject->RvStr.RvBuff[k++];
k%=R_BUFFER_SIZE;
DataPos%=R_BUFFER_SIZE;
}
pObject->RvStr.sp=k;
ViewData=DataExp_1(DataBuff,&DataPos,&pObject->app->ErrCodeRate.ErrLen,pObject->app->RunNT);
if(!ViewData.IsEmpty())
{
for(i=0;i<2;i++)
{
if(pObject->app->ViewDataStr[i].Enable)
{
pObject->app->ViewDataStr[i].Enable=0;
pObject->app->ViewDataStr[i].ViewData+=ViewData;
pObject->app->ViewDataStr[i].DataFlag=1;
pObject->app->ViewDataStr[i].Enable=1;
break;
}
}
ViewData.Empty();
}
//计算误码率
pObject->app->ErrCodeRate.TotalLen+=m;
pObject->app->ErrCodeRate_m.CommTotalLen+=m;
if(pObject->app->ErrCodeRate.TotalLen>140*10)
{
ErrRate(0,pObject);
}
continue;
}
while(1)//有编码,找同步码
{
k=pObject->RvStr.sp;
for(i=0;i<4;i++)
{
bTemp[i]=pObject->RvStr.RvBuff[k++];
k%=R_BUFFER_SIZE;
if(k==k1)
break;
}
if(k==k1)
break;
if((bTemp[0]==pObject->SynCode[0] && bTemp[1]==pObject->SynCode[1] && bTemp[2]==pObject->SynCode[2] && bTemp[3]==pObject->SynCode[3])||
(bTemp[0]==pObject->SynCode2[0] && bTemp[1]==pObject->SynCode2[1] && bTemp[2]==pObject->SynCode2[2] && bTemp[3]==pObject->SynCode2[3]))
// if(bTemp[0]==pObject->SynCode[0] && bTemp[1]==pObject->SynCode[1] && bTemp[2]==pObject->SynCode[2] && bTemp[3]==pObject->SynCode[3])
{
//取数据长度
if(k1>k)
m=k1-k;
else
m=R_BUFFER_SIZE-k+k1;
if(m<136)
break;//此时pObject->sp指向SynCode[0]
pObject->RvStr.sp=k;//指向第一个数据
m=0;
for(i=0;i<136;i++)
{
Z_Buff[i]=pObject->RvStr.RvBuff[k++] ^ pObject->XorCode[m++];
m%=4;
k%=R_BUFFER_SIZE;
}
pObject->RvStr.sp+=135;
pObject->RvStr.sp%=R_BUFFER_SIZE;
//判断显示的通道
if(Z_Buff[0]==0xc0 || Z_Buff[0]==0xc1)//A通道
{
if(Z_Buff[0]==0xc0)//B结束
{
str.Format("Blen=%d",Blen);
csf.WriteString(str);
Blen=0;
}
Alen+=140;
if(pObject->app->CurRevType==2)//解码
{
for(int ii=0;ii<4;ii++)
{
JDataBuff[JDataPos++]=pObject->SynCode[ii];
JDataPos%=R_BUFFER_SIZE;
}
m=17*8;
for(i=0;i<m;i++)
{
JDataBuff[JDataPos++]=Z_Buff[i];
JDataPos%=R_BUFFER_SIZE;
}
}
else
{
if(Z_Buff[2]<0x02)//管理
{
m=14*8;
for(i=0;i<m;i++)
{
MDataBuff[MDataPos++]=Z_Buff[24+i];
MDataPos%=R_BUFFER_SIZE;
}
}
else
{
if(Z_Buff[1]==0x01)//新文件
{
m=14*8;//剩余14帧112字节
for(i=0;i<m;i++)
{
DataBuff[DataPos++]=Z_Buff[24+i];
DataPos%=R_BUFFER_SIZE;
}
}
else
{
m=16*8;
for(i=0;i<m;i++)
{
DataBuff[DataPos++]=Z_Buff[8+i];
DataPos%=R_BUFFER_SIZE;
}
}
}
}
pObject->app->ErrCodeRate.TotalLen+=m+4;//4字节同步码
pObject->app->ErrCodeRate_m.CommTotalLen+=m+4;
}
else if(Z_Buff[0]==0xd0 || Z_Buff[0]==0xd1)
{
if(Z_Buff[0]==0xd0)//A结束
{
str.Format(" Alen=%d Errlen=%d\n",Alen,Errlen);
csf.WriteString(str);
Alen=0;
Errlen=0;
}
Blen+=140;
if(pObject->app->CurRevType==2)//解码
{
for(int ii=0;ii<4;ii++)
{
JDataBuff2[JDataPos2++]=pObject->SynCode[ii];
JDataPos2%=R_BUFFER_SIZE;
}
m=17*8;
for(i=0;i<m;i++)
{
JDataBuff2[JDataPos2++]=Z_Buff[i];
JDataPos2%=R_BUFFER_SIZE;
}
}
else
{
//B通道
if(Z_Buff[1]==0x01)//新文件
{
m=14*8;//剩余14帧112字节
for(i=0;i<m;i++)
{
DataBuff2[DataPos2++]=Z_Buff[24+i];
DataPos2%=R_BUFFER_SIZE;
}
}
else
{
m=16*8;
for(i=0;i<m;i++)
{
DataBuff2[DataPos2++]=Z_Buff[8+i];
DataPos2%=R_BUFFER_SIZE;
}
}
}
pObject->app->ErrCodeRate2.TotalLen+=m+4;//4字节同步码
pObject->app->ErrCodeRate2_m.CommTotalLen+=m+4;
}
}
else
{
if(bTemp[0]==0x55)
{
pObject->app->ErrCodeRate.TotalLen++;
pObject->app->ErrCodeRate_m.CommTotalLen++;
pObject->app->ErrCodeRate2.TotalLen++;
pObject->app->ErrCodeRate2_m.CommTotalLen++;
}
else
{
//误码增加
// if(bTemp[0]!=0xaa && bTemp[0]!=0x8f)
pObject->app->ErrCodeRate.ErrLen++;
pObject->app->ErrCodeRate.TotalLen++;
pObject->app->ErrCodeRate_m.CommTotalLen++;
pObject->app->ErrCodeRate2.ErrLen++;
pObject->app->ErrCodeRate2.TotalLen++;
pObject->app->ErrCodeRate2_m.CommTotalLen++;
Errlen++;
}
if(pObject->app->ErrCodeRate.TotalLen>140*10)
{
ErrRate(0,pObject);
}
}
pObject->RvStr.sp++;//此时pObject->sp指向下一个SynCode[0]
pObject->RvStr.sp%=R_BUFFER_SIZE;
if(pObject->RvStr.sp==k1)
break;
}
if(MDataPos>8)
{
//解释数据...
ViewData=DataExp_0(MDataBuff,&MDataPos,&pObject->app->ErrCodeRate.ErrLen,pObject->app->RunNT);
if(!ViewData.IsEmpty())
{
for(i=0;i<2;i++)
{
if(pObject->app->ViewDataStr[i].Enable)
{
pObject->app->ViewDataStr[i].Enable=0;
pObject->app->ViewDataStr[i].ViewData+=ViewData;
pObject->app->ViewDataStr[i].DataFlag=1;
pObject->app->ViewDataStr[i].Enable=1;
break;
}
}
ViewData.Empty();
}
}
if(DataPos>0)
{
//解释数据...
ViewData=DataExp_1(DataBuff,&DataPos,&pObject->app->ErrCodeRate.ErrLen,pObject->app->RunNT);
if(!ViewData.IsEmpty())
{
for(i=0;i<2;i++)
{
if(pObject->app->ViewDataStr[i].Enable)
{
pObject->app->ViewDataStr[i].Enable=0;
pObject->app->ViewDataStr[i].ViewData+=ViewData;
pObject->app->ViewDataStr[i].DataFlag=1;
pObject->app->ViewDataStr[i].Enable=1;
break;
}
}
ViewData.Empty();
}
if(pObject->app->ErrCodeRate.TotalLen>140*10)
{
ErrRate(0,pObject);
}
}
if(DataPos2>0)
{
//解释数据...
ViewData=DataExp_1(DataBuff2,&DataPos2,&pObject->app->ErrCodeRate2.ErrLen,pObject->app->RunNT);
if(!ViewData.IsEmpty())
{
for(i=0;i<2;i++)
{
if(pObject->app->ViewDataStr2[i].Enable)
{
pObject->app->ViewDataStr2[i].Enable=0;
pObject->app->ViewDataStr2[i].ViewData+=ViewData;
pObject->app->ViewDataStr2[i].DataFlag=1;
pObject->app->ViewDataStr2[i].Enable=1;
break;
}
}
ViewData.Empty();
}
if(pObject->app->ErrCodeRate2.TotalLen>140*10)
{
ErrRate(1,pObject);
}
}
if(JDataPos>0)
{
ViewData=DataExp_3(JDataBuff,&JDataPos);
if(pObject->app->ErrCodeRate.TotalLen>140*10)
ErrRate(0,pObject);
if(!ViewData.IsEmpty())
{
for(i=0;i<2;i++)
{
if(pObject->app->ViewDataStr[i].Enable)
{
pObject->app->ViewDataStr[i].Enable=0;
pObject->app->ViewDataStr[i].ViewData+=ViewData;
pObject->app->ViewDataStr[i].DataFlag=1;
pObject->app->ViewDataStr[i].Enable=1;
break;
}
}
ViewData.Empty();
}
}
if(JDataPos2>0)
{
ViewData=DataExp_3(JDataBuff2,&JDataPos2);
if(!ViewData.IsEmpty())
{
for(i=0;i<2;i++)
{
if(pObject->app->ViewDataStr2[i].Enable)
{
pObject->app->ViewDataStr2[i].Enable=0;
pObject->app->ViewDataStr2[i].ViewData+=ViewData;
pObject->app->ViewDataStr2[i].DataFlag=1;
pObject->app->ViewDataStr2[i].Enable=1;
break;
}
}
ViewData.Empty();
}
if(pObject->app->ErrCodeRate2.TotalLen>140*10)
ErrRate(1,pObject);
}
if(ExitRevThread)
{
csf.Close();
return 10;
}
}
csf.Close();
return 1;
}
/***************************************************
用途:依据《华易数据规约》解释buf中的管理数据,
返回文本形式的内容,用于显示
调用:DataExp
参数:去除了同步码、扰码的数据,
及数据的长度
返回:返回文本形式的内容
***************************************************/
CString DataExp_0(BYTE *buf,int *len,DWORD *ErrLen,int RunNT)//CRevDataView* pObject)
{
BYTE aCh,sCh;
DWORD i;
DWORD k,k1,sum;
CString ViewData="";
k=*len;
k1=*ErrLen;
for(i=0;i<k;i++)
{
if(k-i<8)
{
CopyMemory(buf,&buf[i],k-i);
*len=k-i;
return ViewData;
}
switch(buf[i])//校时
{
case 1:
if(k-i<8)
{
CopyMemory(buf,&buf[i],k-i);
*len=k-i;
return ViewData;
}
sum=CheckSum(&buf[i],6);
aCh=(BYTE)sum;
sCh=(BYTE)(sum>>8);
if(buf[i+6]==sCh && buf[i+7]==aCh)
{
ViewData+=DataExp_2(&buf[i],6,&ViewLineNo,RunNT);
i+=8-1;
}
else
{
k1++;
*ErrLen=k1;
}
break;
case 2:
if(buf[i+8]==0)//密钥
{
if(k-i<27)
{
CopyMemory(buf,&buf[i],k-i);
*len=k-i;
return ViewData;
}
sum=CheckSum(&buf[i],25);
aCh=(BYTE)sum;
sCh=(BYTE)(sum>>8);
if(buf[i+25]==sCh && buf[i+26]==aCh)
{
ViewData+=DataExp_2(&buf[i],25,&ViewLineNo,RunNT);
i+=27-1;
}
else
{
k1++;
*ErrLen=k1;
}
}
else//开台
{
if(k-i<16)
{
CopyMemory(buf,&buf[i],k-i);
*len=k-i;
return ViewData;
}
sum=CheckSum(&buf[i],14);
aCh=(BYTE)sum;
sCh=(BYTE)(sum>>8);
if(buf[i+14]==sCh && buf[i+15]==aCh)
{
ViewData+=DataExp_2(&buf[i],14,&ViewLineNo,RunNT);
i+=16-1;
}
else
{
k1++;
*ErrLen=k1;
}
}
break;
default:
break;
}//switch
}//for i
return ViewData;
}
/***************************************************
用途:依据《华易数据规约》解释buf中的数据,
返回文本形式的内容,用于显示
调用:DataExp
参数:去除了同步码、扰码、控制帧的数据,
及数据的长度
返回:返回文本形式的内容
***************************************************/
CString DataExp_1(BYTE *buf,int *len,DWORD *ErrLen,int RunNT)//CRevDataView* pObject)
{
// float a,b,c;
BYTE *bp,*bwp;
BYTE aCh,sCh;
BYTE DataBuf[256],DataLen;
DWORD i,blen;
DWORD j;
DWORD spos,k,k1;
CString ViewData="";
bp=buf;
k=*len;
k1=*ErrLen;
spos=0;
while(1)
{
if(spos>=k)
{
*len=0;
return ViewData;
}
//找AA
bp=&buf[spos];
bwp=bp;
for(i=spos;i<k;i++)
{
if(*bp==0xaa)
break;
bp++;
}
//没找到AA
if(i>=k)
{
for(i=spos;i<k;i++)
{
if(*bwp!=0x8f)
k1++;
// pObject->app->ErrCodeRate.ErrLen++;
bwp++;
}
*len=0;
if(k1!=0)
*ErrLen=k1;
return ViewData;
}
bwp=bp;//bwp指向0xaa
bp++;//bp指向包长度
blen=*bp;//包长度
if(blen<256 && blen>1)//检查包长度的有效性
{
//不够一包数据
if(k-i-2<blen)//把有效数据移至buf[0]处
{
bp=buf;
for(j=0;j<k-i;j++)
{
*bp=*bwp;
bwp++;
bp++;
}
*len=k-i;
return ViewData;
}
//算校验
aCh=0;
sCh=0;
DataLen=0;
bp++;//bp指向类型,开始算校验
for(j=0;j<blen-2;j++)
{
aCh+=*bp;
if(j%2==0)
sCh-=*bp;
else
sCh+=*bp;
DataBuf[DataLen++]=*bp;
bp++;
}
//bp指向第一个校验字节
if((*bp++==aCh)&&(*bp++==sCh))//bp指向下一个0xaa
{
//解释数据
ViewData+=DataExp_2(DataBuf,DataLen,&ViewLineNo,RunNT);
spos+=blen+2;
}
else
{
// pObject->app->ErrCodeRate.ErrLen++;
k1++;
*ErrLen=k1;
spos++;
}
}
else
{
// pObject->app->ErrCodeRate.ErrLen++;
spos++;
k1++;
*ErrLen=k1;
}
}
}
/************************************************************
用途:依据《华易数据规约》解释buf中的数据(类型+数据区),
返回文本形式的内容,用于显示
调用:DataExp1
参数:只有一包的数据,及数据的长度
返回:返回文本形式的内容
************************************************************/
CString DataExp_2(BYTE *buf,int len,int *LineNo,int RunNT)
{
CString str,str1;
BYTE *ip,i;
DWORD dw;
WORD index,wtemp;
int No;
No=*LineNo;
str.Empty();
if(buf[0]==0x01)//对时
{
str.Format("%d ",++No);
if(RunNT)
str+="对时 ";
else
str+="Settime ";
ip=&buf[1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -