📄 de_encode.c
字号:
uploadLogInfo.data_CommID=U_UploadWorkParamComm;
else if(((uint8)BlindSection_Cfg&0x0f)==(0x01<<3))//((BlindSection_Cfg&(0x01<<3))>0)
uploadLogInfo.data_CommID=U_UploadCompressRevertComm;
else
break;
ss[iplace++]=(uint8)(uploadLogInfo.data_CommID>>8); //需上传数据的命令ID。
ss[iplace++]=(uint8)uploadLogInfo.data_CommID; //需上传数据的命令ID。
GetStatusBitForm(ss,&iplace,&statusBit_Form); //同定位终端状态位结构体
uploadLogInfo.data_SegmentCou=0; //数据总条数
tempPlace=iplace;
iplace++;
while((int16)(GPRSINFOLEN-iplace)>0)
{
if(cur_BlindSection_SaveAddr>cur_BlindSection_RepairAddr)
{
uint16 buffLen_BlindSectionItem=0;
uint8 buff_BlindSectionItem[TRANSINFOLEN-50]; //盲区数据的最大长度
if(W25X32_READ_2_BlindSection(buff_BlindSectionItem,(uint32 *)&buffLen_BlindSectionItem))
{
STRU_DataSegment dataSegment;
dataSegment.dataSegment_Len=buffLen_BlindSectionItem-0x11; //去掉数据包头长度17.
ss[iplace++]=(uint8)(dataSegment.dataSegment_Len>>8); //数据段的长度
ss[iplace++]=(uint8)dataSegment.dataSegment_Len; //数据段的长度
dataSegment.pDataSegmentInfo=buff_BlindSectionItem+0x11;
//memmove(ss+iplace,buff_BlindSectionItem+0x11,dataSegment.dataSegment_Len);
memcpy(ss+iplace,dataSegment.pDataSegmentInfo,dataSegment.dataSegment_Len); //内容是该数据的全部信息内容。
iplace+=dataSegment.dataSegment_Len;
if(iplace>GPRSINFOLEN)
{
iplace-=(dataSegment.dataSegment_Len+2);
break;
}
cur_BlindSection_RepairAddr+=buffLen_BlindSectionItem;
uploadLogInfo.data_SegmentCou++; //数据总条数
ss[tempPlace]=uploadLogInfo.data_SegmentCou; //数据总条数
}
else
{
if(uploadLogInfo.data_SegmentCou==0)
iplace=0;
break;
}
}
else
break;
}
break;
}
}
pcur_IPMAINDATA->ipDataLength=iplace;
for(iTemp=0;iTemp<sizeof(pcur_IPMAINDATA->ipDataLength);iTemp++)
ss[iTemp]=(INT8U)((pcur_IPMAINDATA->ipDataLength)>>(8*(sizeof(pcur_IPMAINDATA->ipDataLength)-iTemp-1)));
*inewlen=pcur_IPMAINDATA->ipDataLength;
return TRUE;
}
//return TRUE;
}
/****************************************************************************
* 名称:strDecode_trans()
* 功能://解码
* 入口参数:str 接收的字符数组,inewlen:长度,pcur_IPMAINDATA:分解出来的数据存放的结构
* 出口参数:是否正确执行
****************************************************************************/
INT16U strDecode_trans(INT8U * str,INT16U * inewlen,IPMAINDATA * pcur_IPMAINDATA)
{
INT16U RTN_FLAG=0;
INT8U * ss;
INT16U iplace=0,itemp=0;
pcur_IPMAINDATA->pDataContext=NULL;
ss=str;
iplace=0;
pcur_IPMAINDATA->ipDataLength=0;
for(itemp=0;itemp<sizeof(pcur_IPMAINDATA->ipDataLength);itemp++)
pcur_IPMAINDATA->ipDataLength|=(INT16U)(ss[iplace++]<<(8*(sizeof(pcur_IPMAINDATA->ipDataLength)-itemp-1))); //
if(*inewlen!=pcur_IPMAINDATA->ipDataLength) return 0xffff; //信息长度不对,或者是非法信息
pcur_IPMAINDATA->protocolVersion=ss[iplace++]; //
pcur_IPMAINDATA->answerFlag=ss[iplace++]; //
for(itemp=0;itemp<sizeof(pcur_IPMAINDATA->terminalID);itemp++)
pcur_IPMAINDATA->terminalID[itemp]=ss[iplace++]; //
pcur_IPMAINDATA->serverID=0;
for(itemp=0;itemp<sizeof(pcur_IPMAINDATA->serverID);itemp++)
pcur_IPMAINDATA->serverID|=(INT16U)(ss[iplace++]<<(8*(sizeof(pcur_IPMAINDATA->serverID)-itemp-1))); //
pcur_IPMAINDATA->commandNumber=0;
for(itemp=0;itemp<sizeof(pcur_IPMAINDATA->commandNumber);itemp++)
pcur_IPMAINDATA->commandNumber|=(INT16U)(ss[iplace++]<<(8*(sizeof(pcur_IPMAINDATA->commandNumber)-itemp-1))); //
pcur_IPMAINDATA->commandID=0;
for(itemp=0;itemp<sizeof(pcur_IPMAINDATA->commandID);itemp++)
pcur_IPMAINDATA->commandID|=(INT16U)(ss[iplace++]<<(8*(sizeof(pcur_IPMAINDATA->commandID)-itemp-1))); //
//if((pcur_IPMAINDATA->commandID>>8)==0x00)
{
switch(pcur_IPMAINDATA->commandID)
{
case D_srvAnswerComm: //4.3.1.1 中心命令应答(命令ID:0001H) 14
{
STRU_D_Term2SrvRtn_Comm term2SrvRtn;
term2SrvRtn.term_CommNum=0;
for(itemp=0;itemp<sizeof(term2SrvRtn.term_CommNum);itemp++)
term2SrvRtn.term_CommNum|=(INT16U)(ss[iplace++]<<(8*(sizeof(term2SrvRtn.term_CommNum)-itemp-1))); //
term2SrvRtn.term_CommID=0;
for(itemp=0;itemp<sizeof(term2SrvRtn.term_CommID);itemp++)
term2SrvRtn.term_CommID|=(INT16U)(ss[iplace++]<<(8*(sizeof(term2SrvRtn.term_CommID)-itemp-1))); //
term2SrvRtn.exec_Result_Flag=ss[iplace++]; // 0:成功 1:失败
if(term2SrvRtn.term_CommID==U_LoginComm)
ReConnect_OK=2; //新通信参数连接登录成功,非0非1.并收到命令应答。
if(term2SrvRtn.term_CommID==U_UploadMobileSMSInfoComm && term2SrvRtn.exec_Result_Flag<=1) //0410加(中心短信调度应答)
{
char * MsgToCall[]={"4FE1606F53D1900162105290021",//信息发送成功
"4FE1606F53D190059318D250021"};//信息发送失败
char str1[200];
char len[4];
memset(str1,0,sizeof(str1));
ChineseMsgCompages(G_DriverLoginMobile,str1,0); //表示文本的长度并加上长度所占的一个字节长度
sprintf(len,"%02X",strlen(MsgToCall[term2SrvRtn.exec_Result_Flag])/2+1);
strcat(str1,len);
strcat(str1,MsgToCall[term2SrvRtn.exec_Result_Flag]);
SendPDUSMS(str1);
}
RTN_FLAG= MAIN_UNANSWER_FLAG;
break;
}
case D_gotoComm: //4.3.1.2 定位指令(命令ID:0002H) 15
//信息内容为空,该指令默认无需定位终端应答,定位终端收到该指令后立即上传一条位置信息。
RTN_FLAG= D_gotoComm;
break;
case D_traceComm: //4.3.1.3 追踪指令(命令ID:0003H) 15
{
INT16U len=0,moveAddr=0;
GetOmoveAddr(CUSTOM_PARAMS,CUSTOM_PARAMS_COUNT,0x0000,&len,&moveAddr);////ACC开时间间隔,单位:秒,最小为0,默认为0秒
W25X32_WRITE(GetAddr(CUSTOM_PARAMS_SEC,moveAddr),sizeof(trace_FORM.communi_Mode)+sizeof(trace_FORM.acc_In_Timeslot)+
sizeof(trace_FORM.acc_Out_Timeslot)+sizeof(trace_FORM.distance_Slot),ss+iplace,CUSTOM_PARAMS_DATASIZE);
#if defined(SYSTEM_SEMCONTROL)
{
INT8U SysRsrcErr;
OSSemPend(gw_pSysRsrcSem, 0, &SysRsrcErr);
}
#else
OSSchedLock();
#endif // end of #if defined(SYSTEM_SEMCONTROL)
trace_FORM.communi_Mode=(uint8)(ss+iplace)[0];
iplace+=sizeof(trace_FORM.communi_Mode);
trace_FORM.acc_In_Timeslot=(uint16)((ss+iplace)[0]<<8)+(uint16)(ss+iplace)[1];
iplace+=sizeof(trace_FORM.acc_In_Timeslot);
trace_FORM.acc_Out_Timeslot=(uint16)((ss+iplace)[0]<<8)+(uint16)(ss+iplace)[1];
iplace+=sizeof(trace_FORM.acc_Out_Timeslot);
trace_FORM.distance_Slot=(uint16)((ss+iplace)[0]<<8)+(uint16)(ss+iplace)[1];
iplace+=sizeof(trace_FORM.distance_Slot);
if(Get_ACCIN()) //取得当前ACC开关状态
cur_Timeslot=trace_FORM.acc_In_Timeslot;
else
cur_Timeslot=trace_FORM.acc_Out_Timeslot;
#if defined(UART_SEMCONTROL)
OSSemPost(gw_pSysRsrcSem);
#else
OSSchedUnlock();
#endif // end of #if defined(SYSTEM_SEMCONTROL)
RTN_FLAG= MAIN_ANSWER_FLAG;
break;
}
case D_setupComm: //4.3.1.4 设定参数(命令ID:0004H) 15
{
if((INT16S)(*inewlen-iplace-3)==0)
{
SetupParam_Item temp;
temp.param_ID=0;
for(itemp=0;itemp<sizeof(temp.param_ID);itemp++)
temp.param_ID|=(INT16U)(ss[iplace++]<<(8*(sizeof(temp.param_ID)-itemp-1)));
if(temp.param_ID==0x0302) //恢复初始值 内容为空。初始值详细参见每批次采购技术状态
{
INIT_FLAG=0;
Renew_Initializers(); //恢复出厂值
Renew_Initializers_Custom(); //恢复自定义参数出厂设置
INIT_FLAG=1;//初始化成功
}
}
else
{
/*
List_N params;
SetupParam_Item temp;
INT16U len_stru=sizeof(SetupParam_Item)+4;
InitializeList(¶ms);
if (ListIsFull(¶ms,len_stru))
break;
while ((INT16S)(*inewlen-iplace-3)>0)
{
uint8 * p=NULL;
temp.param_ID=0;
for(itemp=0;itemp<sizeof(temp.param_ID);itemp++)
temp.param_ID|=(INT16U)(ss[iplace++]<<(8*(sizeof(temp.param_ID)-itemp-1)));
temp.paramValue_Len=ss[iplace++];
p=(uint8 *)malloc(temp.paramValue_Len);
if(NULL==p) break;
temp.pParam_Value=p;
for(itemp=0;itemp<temp.paramValue_Len;itemp++)
temp.pParam_Value[itemp]=ss[iplace++];
if (AddItem((void *)&temp, ¶ms,len_stru)==FALSE)
break;
if (ListIsFull(¶ms,len_stru))
break;
//主中心通讯参数被修改,则更改重连标志
if(temp.param_ID==0x0200||temp.param_ID==0x0201||temp.param_ID==0x0202||temp.param_ID==0x0205)
Reconn_Flag=1;
}
if (ListIsEmpty(¶ms))
break;
else
Traverse(¶ms,D_setupComm, DataBagCmd);
EmptyTheList(¶ms);
*/
uint8 * tempbuff=NULL;
OSMemQuery(IntBuffer_Big,&MemInfo);
if(MemInfo.OSNFree > (uint8)(SETUP_PARAMS_DATASIZE/BlockSize_Big))
{
SetupParam_Item temp;
const uint8 pageLen=0xff;
tempbuff=(INT8U *)OSMemGet(IntBuffer_Big,&err);
W25X32_READ(GetAddr(SETUP_PARAMS_SEC,0),SETUP_PARAMS_DATASIZE,tempbuff);
while ((INT16S)(*inewlen-iplace-3)>0)
{
uint8 * p=NULL;
temp.param_ID=0;
for(itemp=0;itemp<sizeof(temp.param_ID);itemp++)
temp.param_ID|=(INT16U)(ss[iplace++]<<(8*(sizeof(temp.param_ID)-itemp-1)));
temp.paramValue_Len=ss[iplace++];
p=(uint8 *)malloc(temp.paramValue_Len);
if(NULL==p) break;
temp.pParam_Value=p;
for(itemp=0;itemp<temp.paramValue_Len;itemp++)
temp.pParam_Value[itemp]=ss[iplace++];
update(&temp,tempbuff);
FREE(p);
}
W25X32_Erase_Semphore(SETUP_PARAMS_SEC, SETUP_PARAMS_SEC);
for(itemp=0;itemp<SETUP_PARAMS_DATASIZE/pageLen;itemp++)
{
W25X32_WR(GetAddr(SETUP_PARAMS_SEC,itemp*pageLen),tempbuff+itemp*pageLen,pageLen);
OSTimeDly(3);
}
if(SETUP_PARAMS_DATASIZE%pageLen>0)
{
OSTimeDly(3);
W25X32_WR(GetAddr(SETUP_PARAMS_SEC,itemp*pageLen),tempbuff+itemp*pageLen,SETUP_PARAMS_DATASIZE%pageLen);
}
OSMemPut(IntBuffer_Big,tempbuff);
}
}
RTN_FLAG= MAIN_ANSWER_FLAG;
break;
}
case D_unAlarmComm: //4.3.1.5 解除报警(命令ID:0005H) 21
{ //信息内容为空。中心在收到定位终端的报警信息之后,可通过下发此指令解除车台紧急报警状态。
//此指令默认需定位终端返回命令应答。
uint8 paramValue=1;
uint8 paramValue_alm=0;
pcur_IPMAINDATA->answerFlag=MAIN_ANSWER_FLAG;
ALARM_ID_STATUS[ALARMID_COUNT+0]=0;
GetWorkParamValue(WORK_PARAMS[0],¶mValue_alm);
if(paramValue_alm!=1)
SaveWorkParamValue(WORK_PARAMS[0],¶mValue);//将求助告警解除保存在工作参数开关量第一项中。
paramValue=1;
paramValue_alm=0;
ALARM_ID_STATUS[ALARMID_COUNT+GetAlarmID_Index(0x06)]=0; //将调度屏告警暂时解除
RTN_FLAG= MAIN_ANSWER_FLAG;
break;
}
case D_repPegMenuComm: //4.3.1.6 修改固定菜单(命令ID:0006H) 21
{
//最多可设置128个固定菜单,此指令默认需定位终端返回命令应答。
////////////设置的固定菜单 根据修改固定菜单指令内容格式上传
INT16U len=0,moveAddr=0;
GetOmoveAddr(SETUP_PARAMS,SETUP_PARAMS_COUNT,0x0703,&len,&moveAddr);//
W25X32_WRITE(GetAddr(SETUP_PARAMS_SEC,moveAddr),*inewlen-iplace,ss+iplace,SETUP_PARAMS_DATASIZE);
iplace=*inewlen;
////////////////////////////////////////////////////////////////////
///////////////////////以下部分为修改固定菜单内容解析处理,协议上无说明,因此暂时不用
/*
{
List_N repPegMenu;
RepPegMenu_Item temp;
INT16U len_stru=sizeof(RepPegMenu_Item)+4;
InitializeList(&repPegMenu);
if (ListIsFull(&repPegMenu,len_stru))
break;
while ((INT16S)(*inewlen-iplace-3)>0)
{
uint8 * p=NULL;
temp.menu_ID=ss[iplace++]; //菜单ID号。大于0
temp.prev_Menu_ID=ss[iplace++]; //如果当前菜单是
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -