⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 de_encode.c

📁 C语言源代码及相关资料
💻 C
📖 第 1 页 / 共 5 页
字号:
					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(&params);
						if (ListIsFull(&params,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, &params,len_stru)==FALSE)
								break;
							if (ListIsFull(&params,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(&params))
							break;
						else
							Traverse(&params,D_setupComm, DataBagCmd);
						EmptyTheList(&params);
						*/
						
		            	
						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],&paramValue_alm);
					if(paramValue_alm!=1)
						SaveWorkParamValue(WORK_PARAMS[0],&paramValue);//将求助告警解除保存在工作参数开关量第一项中。
					
					
					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 + -