?? de_encode.c
字號(hào):
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); //需上傳數(shù)據(jù)的命令I(lǐng)D。
ss[iplace++]=(uint8)uploadLogInfo.data_CommID; //需上傳數(shù)據(jù)的命令I(lǐng)D。
GetStatusBitForm(ss,&iplace,&statusBit_Form); //同定位終端狀態(tài)位結(jié)構(gòu)體
uploadLogInfo.data_SegmentCou=0; //數(shù)據(jù)總條數(shù)
tempPlace=iplace;
iplace++;
while((int16)(GPRSINFOLEN-iplace)>0)
{
if(cur_BlindSection_SaveAddr>cur_BlindSection_RepairAddr)
{
uint16 buffLen_BlindSectionItem=0;
uint8 buff_BlindSectionItem[TRANSINFOLEN-50]; //盲區(qū)數(shù)據(jù)的最大長(zhǎng)度
if(W25X32_READ_2_BlindSection(buff_BlindSectionItem,(uint32 *)&buffLen_BlindSectionItem))
{
STRU_DataSegment dataSegment;
dataSegment.dataSegment_Len=buffLen_BlindSectionItem-0x11; //去掉數(shù)據(jù)包頭長(zhǎng)度17.
ss[iplace++]=(uint8)(dataSegment.dataSegment_Len>>8); //數(shù)據(jù)段的長(zhǎng)度
ss[iplace++]=(uint8)dataSegment.dataSegment_Len; //數(shù)據(jù)段的長(zhǎng)度
dataSegment.pDataSegmentInfo=buff_BlindSectionItem+0x11;
//memmove(ss+iplace,buff_BlindSectionItem+0x11,dataSegment.dataSegment_Len);
memcpy(ss+iplace,dataSegment.pDataSegmentInfo,dataSegment.dataSegment_Len); //內(nèi)容是該數(shù)據(jù)的全部信息內(nèi)容。
iplace+=dataSegment.dataSegment_Len;
if(iplace>GPRSINFOLEN)
{
iplace-=(dataSegment.dataSegment_Len+2);
break;
}
cur_BlindSection_RepairAddr+=buffLen_BlindSectionItem;
uploadLogInfo.data_SegmentCou++; //數(shù)據(jù)總條數(shù)
ss[tempPlace]=uploadLogInfo.data_SegmentCou; //數(shù)據(jù)總條數(shù)
}
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()
* 功能://解碼
* 入口參數(shù):str 接收的字符數(shù)組,inewlen:長(zhǎng)度,pcur_IPMAINDATA:分解出來(lái)的數(shù)據(jù)存放的結(jié)構(gòu)
* 出口參數(shù):是否正確執(zhí)行
****************************************************************************/
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; //信息長(zhǎng)度不對(duì),或者是非法信息
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 中心命令應(yīng)答(命令I(lǐng)D: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; //新通信參數(shù)連接登錄成功,非0非1.并收到命令應(yīng)答。
if(term2SrvRtn.term_CommID==U_UploadMobileSMSInfoComm && term2SrvRtn.exec_Result_Flag<=1) //0410加(中心短信調(diào)度應(yīng)答)
{
char * MsgToCall[]={"4FE1606F53D1900162105290021",//信息發(fā)送成功
"4FE1606F53D190059318D250021"};//信息發(fā)送失敗
char str1[200];
char len[4];
memset(str1,0,sizeof(str1));
ChineseMsgCompages(G_DriverLoginMobile,str1,0); //表示文本的長(zhǎng)度并加上長(zhǎng)度所占的一個(gè)字節(jié)長(zhǎng)度
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 定位指令(命令I(lǐng)D:0002H) 15
//信息內(nèi)容為空,該指令默認(rèn)無(wú)需定位終端應(yīng)答,定位終端收到該指令后立即上傳一條位置信息。
RTN_FLAG= D_gotoComm;
break;
case D_traceComm: //4.3.1.3 追蹤指令(命令I(lǐng)D:0003H) 15
{
INT16U len=0,moveAddr=0;
GetOmoveAddr(CUSTOM_PARAMS,CUSTOM_PARAMS_COUNT,0x0000,&len,&moveAddr);////ACC開時(shí)間間隔,單位:秒,最小為0,默認(rèn)為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()) //取得當(dāng)前ACC開關(guān)狀態(tài)
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 設(shè)定參數(shù)(命令I(lǐng)D: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) //恢復(fù)初始值 內(nèi)容為空。初始值詳細(xì)參見每批次采購(gòu)技術(shù)狀態(tài)
{
INIT_FLAG=0;
Renew_Initializers(); //恢復(fù)出廠值
Renew_Initializers_Custom(); //恢復(fù)自定義參數(shù)出廠設(shè)置
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;
//主中心通訊參數(shù)被修改,則更改重連標(biāo)志
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 解除報(bào)警(命令I(lǐng)D:0005H) 21
{ //信息內(nèi)容為空。中心在收到定位終端的報(bào)警信息之后,可通過下發(fā)此指令解除車臺(tái)緊急報(bào)警狀態(tài)。
//此指令默認(rèn)需定位終端返回命令應(yīng)答。
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);//將求助告警解除保存在工作參數(shù)開關(guān)量第一項(xiàng)中。
paramValue=1;
paramValue_alm=0;
ALARM_ID_STATUS[ALARMID_COUNT+GetAlarmID_Index(0x06)]=0; //將調(diào)度屏告警暫時(shí)解除
RTN_FLAG= MAIN_ANSWER_FLAG;
break;
}
case D_repPegMenuComm: //4.3.1.6 修改固定菜單(命令I(lǐng)D:0006H) 21
{
//最多可設(shè)置128個(gè)固定菜單,此指令默認(rèn)需定位終端返回命令應(yīng)答。
////////////設(shè)置的固定菜單 根據(jù)修改固定菜單指令內(nèi)容格式上傳
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;
////////////////////////////////////////////////////////////////////
///////////////////////以下部分為修改固定菜單內(nèi)容解析處理,協(xié)議上無(wú)說明,因此暫時(shí)不用
/*
{
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號(hào)。大于0
temp.prev_Menu_ID=ss[iplace++]; //如果當(dāng)前菜單是
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -