经过第一步的分层,硬件通信已经独立开来。下一步就是数据的处理。这里依然有3个线程,各自实时扫描各自的存储池。根据不同的处理结果实现不同的操作。如果数据证据,那么执行Decode。比如下面,一层层的回调
/******************************************************************************************
// @fn: RecBDDataProc : 北斗数据接收处理函数
// @Param:
// CreateDate:2014.3.12 16:35
// Modify:
// Author:LFT
********************************************************************************************/
Jl_dword WINAPI CBDProtocol::RecBDDataProc(LPVOID lpParameter)
{
CBDProtocol* pProto=(CBDProtocol*)lpParameter;
Jl_uint8 CmdType;
Jl_int16 mFrameStart=0,CmdLen=0,ValidCode;
pJl_uint8 buf_lft = new Jl_uint8[600];
Jl_int16 buflen_lft;//buflen每次实际读取的字节数
while (!pProto->m_bIsExitBDProc)
{
buflen_lft=0;
memset(buf_lft,0,sizeof(buf_lft));
buflen_lft = m_BDMemory.GetDataFromPool((pJl_uint8)buf_lft,300);//包含命令字,命令长度信息
while ((ValidCode=pProto->IsValidBDFrame(buf_lft,buflen_lft,&CmdType,&mFrameStart,&CmdLen)) != NO_CMD_ERROR &&!pProto->m_bIsExitBDProc)
{
switch (ValidCode)
{
case NO_VALID_CMD_ERROR:
m_BDMemory.SetFrameLen(buflen_lft,buflen_lft);
Sleep(10);
memset(buf_lft,0,600);
buflen_lft = m_BDMemory.GetDataFromPool((pJl_uint8)buf_lft,300);
break;
case TOO_SHORT_ERROR://长度太短,无法进行计算
m_BDMemory.SetFrameLen(0,buflen_lft);
Sleep(10);
buflen_lft = m_BDMemory.GetDataFromPool((pJl_uint8)buf_lft,300);
break;
case GET_LENS_ERROR://长度计算错误
m_BDMemory.SetFrameLen(mFrameStart+5,buflen_lft);//跳过命令字
Sleep(10);
memset(buf_lft,0,600);
buflen_lft = m_BDMemory.GetDataFromPool((pJl_uint8)buf_lft,300);
break;
case CONTENT_LEN_ERROR:
m_BDMemory.SetFrameLen(0,buflen_lft);
Sleep(10);
buflen_lft = m_BDMemory.GetDataFromPool((pJl_uint8)buf_lft,CmdLen);
break;
case XOR_ERROR:
m_BDMemory.SetFrameLen(mFrameStart+CmdLen,buflen_lft);
Sleep(10);
memset(buf_lft,0,600);
buflen_lft = m_BDMemory.GetDataFromPool((pJl_uint8)buf_lft,300);
break;
default:
break;
}
}
m_BDMemory.SetFrameLen(mFrameStart+CmdLen,buflen_lft);
pProto->BDDecode(CmdType,buf_lft+mFrameStart,CmdLen);
Sleep(10);
}
delete[] buf_lft;
return 0;
}
/******************************************************************************************
// @fn: BDDecode : 解析北斗通信协议数据包
// @Param: buf 数据包内容buflen内容长度
//
// CreateDate:2014.3.12 16:35
// Modify:
// Author:LFT
// Other:
********************************************************************************************/
void CBDProtocol::BDDecode(Jl_uint8 CmdType,Jl_uint8 *buf, Jl_int16 buflen)
{
Jl_int16 ContentLen=0;
static Jl_int16 TmpCmdNb=-1;
//CSystemLog* pLog = new CSystemLog();
switch (CmdType)
{
case GET_ZJXX:
SetEvent(m_hZjxxEvt);
memcpy(g_glzk,buf+14,6);
g_WorkStatus.cSignalQu = g_glzk[0] + g_glzk[1] + g_glzk[2] + g_glzk[3]+g_glzk[4]+g_glzk[5];
break;
case GET_GLZK:
memcpy(g_glzk,buf+10,6);
//printf("%d %d %d %d %d %d\r",g_glzk[0],g_glzk[1],g_glzk[2],g_glzk[3],g_glzk[4],g_glzk[5]);
break;
case GET_GNPX:
//memcpy((Jl_uint8 *)&g_cmd_GNPX,buf,sizeof(g_cmd_GNPX));
break;
case GET_GNTX:
memcpy((Jl_uint8*)&g_cmd_GNTX,buf,sizeof(g_cmd_GNTX));
SetEvent(g_WorkStatus.m_hRecvBDTimeEvt);
break;
case GET_ICXX:
//memset(g_cmd_ICXX.CmdHead.UserAddr,0,sizeof(g_cmd_ICXX.CmdHead.UserAddr));
memcpy((Jl_uint8 *)&g_cmd_ICXX,buf,sizeof(g_cmd_ICXX));
RETAILMSG(LFT_DEBUG_MSG_OUT,(_T("User Addr=%ld "),(DWORD)(((g_cmd_ICXX.CmdHead.UserAddr[0]<<16)&0x00FF0000)+((g_cmd_ICXX.CmdHead.UserAddr[1]<<8)&0x0000FF00)+(g_cmd_ICXX.CmdHead.UserAddr[2]&0x000000FF))));
RETAILMSG(LFT_DEBUG_MSG_OUT,(_T("Freq==%d\r"),((g_cmd_ICXX.FreqService[0]<<8)&0xFF00)+g_cmd_ICXX.FreqService[1]));
//printf("User Addr=%ld\r",(DWORD)(((g_cmd_ICXX.CmdHead.UserAddr[0]<<16)&0x00FF0000)+((g_cmd_ICXX.CmdHead.UserAddr[1]<<8)&0x0000FF00)+(g_cmd_ICXX.CmdHead.UserAddr[2]&0x000000FF)));
//printf("Freq==%d\r",((g_cmd_ICXX.FreqService[0]<<8)&0xFF00)+g_cmd_ICXX.FreqService[1]);
SetEvent(m_hIcxxEvt);
break;
case GET_FKXX:
memcpy((Jl_uint8*)&g_cmd_FKXX,buf,sizeof(g_cmd_FKXX));
//RETAILMSG(LFT_DEBUG_MSG_OUT,(_T("FeedBackFlag == %x\r\n"),g_cmd_FKXX.FeedBackFlag));
if (g_cmd_FKXX.FeedBackFlag == 0x00 || g_cmd_FKXX.FeedBackFlag == 0x04)
{
SetEvent(m_hFKXXEvt);
}
else if(g_cmd_FKXX.FeedBackFlag ==0x02)
{
SetEvent(m_hSendFailEvt);
}
break;
case GET_SJXX:
//memset((char*)&g_cmd_SJXX,0,sizeof(g_cmd_SJXX));
memcpy((Jl_uint8*)&g_cmd_SJXX,buf,sizeof(g_cmd_SJXX));
SetEvent(g_WorkStatus.m_hRecvBDTimeEvt);
break;
case GET_TXXX:
{
//RETAILMSG(LFT_DEBUG_MSG_OUT,(_T("Begin=%ld\n"),GetTickCount()));
DWORD TXXX_Addr = ((buf[11]<<16)&0xFF0000) + ((buf[12]<<8)&0x00FF00) + (buf[13]&0x0000FF);
ContentLen = (((buf[16]<<8)&0xFF00) + (buf[17]&0x00FF))/8;
ContentLen-=1;
//RETAILMSG(LFT_DEBUG_MSG_OUT,(_T("\n[TXXX]")));
#if LFT_DEBUG_MSG_OUT
RETAILMSG(1,(_T("\n[From Terminal:%d]"),TXXX_Addr));
for(int i=0;i<ContentLen;i++)
{
RETAILMSG(1,(_T("%x "),buf[19+i]));
}
RETAILMSG(1,(_T("\n")));
#endif
g_Log.Printf_Log((pJl_int8)buf,buflen,RECVFROMEND);
RETAILMSG(1,(_T("BD Recv:%d\r\n"),GetTickCount()));
memset(g_cmd_Txxx.TextContent,0,sizeof(g_cmd_Txxx.TextContent));
memcpy(g_cmd_Txxx.TextContent,buf+19,ContentLen);
#if LFT_DEBUG_MSG_OUT
RETAILMSG(1,(_T("BD Receive ")));
for(int i=0;i<ContentLen;i++)
{
RETAILMSG(1,(_T("%x "),g_cmd_Txxx.TextContent[i]));
}
RETAILMSG(1,(_T("\r\n")));
#endif
m_lpEndDataProc(g_cmd_Txxx.TextContent,ContentLen,TXXX_Addr);//回调函数处理数据
//CmdDecode(g_cmd_Txxx.TextContent,ContentLen,TXXX_Addr);
}
break;
default:
break;
}
//delete pLog;
}