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

📄 de_encode.c

📁 C语言源代码及相关资料
💻 C
📖 第 1 页 / 共 5 页
字号:
			INT16U	len=0,moveAddr=0;
			uint8	*	p=NULL;
			temp=(SetupParam_Item *)item;
			
			GetOmoveAddr(SETUP_PARAMS,SETUP_PARAMS_COUNT,temp->param_ID,&len,&moveAddr);
			p=(uint8	*)malloc(len);
			if(NULL==p)	break;
			memset(p,0xFF,len);
			memcpy(p,temp->pParam_Value,temp->paramValue_Len);
			W25X32_WRITE(GetAddr(SETUP_PARAMS_SEC,moveAddr),len,p,SETUP_PARAMS_DATASIZE);
			if(temp->param_ID==0x0402)	//低电压门限值及采样次数时间
		    	memcpy(Lmt_V_Time,temp->pParam_Value,sizeof(Lmt_V_Time));
		    else	if(temp->param_ID==0x0301)	//终端密码值
		    	memcpy(Password,temp->pParam_Value,sizeof(Password));
		    else	if(temp->param_ID==0x0209)	//终端上传心跳包时间间隔
		    	memcpy(&HeartSlot,temp->pParam_Value,sizeof(HeartSlot));
		    else	if(temp->param_ID==0x0307)	//安装调度屏标志
		    	memcpy(&schedLCD_BuildIn_OK,temp->pParam_Value,sizeof(schedLCD_BuildIn_OK));
		    //else	if(temp->param_ID==0x0202)	//设置主中心域名
		    
		    //上位机发送恢复出厂值时,做下列判断
		    if(INIT_FLAG==1)	
		    	FREE(temp->pParam_Value);
			FREE(p);
			
			break;
		}
		case 	D_repPegMenuComm:    //4.3.1.6 修改固定菜单(命令ID:0006H)	21
		{

			RepPegMenu_Item  *	temp;

			temp=(RepPegMenu_Item *)item;
			//temp->menu_ID;
			//temp->prev_Menu_ID;
			//temp->menu_Info_Len;
			FREE(temp->pMenu_Info);
			
			break;
		}
		case  D_setupTelNumComm:     //4.3.1.9 设定固定通话号码(命令ID:0009H)	22
		{
			SetupTelNum_Item	*	temp;

			temp=(SetupTelNum_Item	*)item;
			//temp->restrict_Status;
			//temp->owner_Name;
			//temp->telNum_Len;
			FREE(temp->pTelNum);
			
			break;
		}
	}

}

//实际应用则为DataBagCmd_u真实函数体。
void DataBagCmd_u(void	* item,INT16U	commtype,INT8U	*	buff,INT16U	*	inewlen)
{
	
	
	switch(commtype)
	{
		case	0:     
		{
			
			break;
		}
		
	}

}
*/
uint8	GetStatusBit(uint32	*	pStatusBit)
{
	
	uint32	statusBit=*pStatusBit;
	
	
	//第0位	0:GPS不定位   1:GPS已定位		
	if(GPS_DATA.Time.Flag=='A')
		statusBit|=0x01<<0;
	else
		statusBit&=(~(0x01<<0));//V
	//第1位	0:南纬         1:北纬
	if(GPS_DATA.Latitude.Indicator=='N')
		statusBit|=0x01<<1;
	else
		statusBit&=(~(0x01<<1));//S
	//第2位	0:西经         1:东经		
	if(GPS_DATA.Longitude.Indicator=='E')
		statusBit|=0x01<<2;
	else
		statusBit&=(~(0x01<<2));//W
	//第3~6位	定位终端状态位预留		
	
	//第7位	 0:远程控制(1)解除状态		// 1:远程控制(1)执行状态
	statusBit|=(RemoteCtrl_Status<<7);
	//第8位	0:ACC关      1:ACC开	
	statusBit|=(Get_ACCIN()<<8);
	//第9位	0:空车         1:重车
	//第10位	0:运营状态     1:停运状态		
	//第11位	发动机运行状态, 0:运行    1:熄火		
	//第12~15位	业务状态位预留
	//第16位	1:求助报警	
	statusBit|=(ALARM_ID_STATUS[ALARMID_COUNT+0]<<16);
	//第17位	1:超速报警		
	//第18位	1:视频信号拆除报警		
	//第19位	1:低压报警	
	statusBit|=(ALARM_ID_STATUS[ALARMID_COUNT+GetAlarmID_Index(0x04)]<<19);	//低压报警代码	0x04
	//第20位	1:断电报警
	//第21位	1:低速报警		
	//第22~23位	报警位预留		
	//第24位	故障位预留		
	//第25位	1:GPS模块发生故障		
	statusBit|=(GPS_Fault<<25);
	//第26位	1:GPS天线开路报警
	//第27位	1: GPS天线短路报警		
	//第28位	1:LCD通讯故障	
	statusBit|=(ALARM_ID_STATUS[ALARMID_COUNT+GetAlarmID_Index(0x06)]<<28);	
	//第29~31位	故障位预留
	
	*pStatusBit=statusBit;
	
	{
//		char szOut[24];
//		sprintf(szOut, "\r\nGPS: 0x%x\r\n", statusBit );
//		__DBG0_printf1(szOut);
	}
	
	return	TRUE;
	
}

//位置信息
uint8	GetStatusBitForm(uint8	*	ss,uint16 *	p_iplace,STRU_U_StatusBit_FORM	*	statusBit_Form)
{
	uint16	iTemp=0;
	uint16	iplace=*p_iplace;
	statusBit_Form->latitude=(uint32)((GPS_DATA.Latitude.dd)*1000000+(GPS_DATA.Latitude.mm)*1000000/60+(GPS_DATA.Latitude.mmmm)*100/60);
	for(iTemp=0;iTemp<sizeof(statusBit_Form->latitude);iTemp++)
		ss[iplace++]=statusBit_Form->latitude>>(8*(sizeof(statusBit_Form->latitude)-iTemp-1));//纬度×1000000
	statusBit_Form->longitude=(uint32)(GPS_DATA.Longitude.ddd*1000000+GPS_DATA.Longitude.mm*1000000/60+GPS_DATA.Longitude.mmmm*100/60);
	for(iTemp=0;iTemp<sizeof(statusBit_Form->longitude);iTemp++)
		ss[iplace++]=statusBit_Form->longitude>>(8*(sizeof(statusBit_Form->longitude)-iTemp-1));//经度×1000000
	if(cur_DatumMark_Falg==1)	//保存基准点经纬度
	{
		G_LastLatitude=statusBit_Form->latitude;
		G_lastLongitude=statusBit_Form->longitude;
	}
	statusBit_Form->speed=GPS_DATA.Speed;
	ss[iplace++]=statusBit_Form->speed;//速度,单位:公里/小时,表示范围0~255。从GPS模块接收处理后的速度
	statusBit_Form->direction=(GPS_DATA.Direction.ddd)/2;
	ss[iplace++]=statusBit_Form->direction;//正北方向为0度,顺时针增加,单位:2度,数值范围0~180。
	//高位第一位表示正负高度,为0表示海拔为正高度,1为表示海拔为负高度,表示范围-32767~32767米。
	statusBit_Form->heightAboveSeaLevel=GPS_DATA.Altitude;
	for(iTemp=0;iTemp<sizeof(statusBit_Form->heightAboveSeaLevel);iTemp++)
		ss[iplace++]=statusBit_Form->heightAboveSeaLevel>>(8*(sizeof(statusBit_Form->heightAboveSeaLevel)-iTemp-1));//海拔高度,单位:米,
	//第一个字节代表年(2000年为0年),第二个字节代表月,第三个字节代表日,第四个字节代表小时,第五个字节代表分钟,第六个字节代表秒
	statusBit_Form->dateTime[0]=GPS_DATA.Time.Year;
	statusBit_Form->dateTime[1]=GPS_DATA.Time.Mon;
	statusBit_Form->dateTime[2]=GPS_DATA.Time.Day;
	statusBit_Form->dateTime[3]=GPS_DATA.Time.Hour;
	statusBit_Form->dateTime[4]=GPS_DATA.Time.Min;
	statusBit_Form->dateTime[5]=GPS_DATA.Time.Sec;
	for(iTemp=0;iTemp<sizeof(statusBit_Form->dateTime);iTemp++)
		ss[iplace++]=statusBit_Form->dateTime[iTemp];
	
	//      状态位	定义		//用来表示定位终端的各种状态信息。
	statusBit_Form->statusBit=0;
	GetStatusBit(&statusBit_Form->statusBit);	//得到状态位
	
	for(iTemp=0;iTemp<sizeof(statusBit_Form->statusBit);iTemp++)
		ss[iplace++]=statusBit_Form->statusBit>>(8*(sizeof(statusBit_Form->statusBit)-iTemp-1));
		
	*p_iplace=iplace;
	
	return	TRUE;
	
	
}
//压缩点位置信息
uint8	GetCompressPointStatusBitForm(uint8	*	ss,uint16 *	p_iplace,STRUCT_CompressPointStatusBit_Form		*	statusBit_Form)
{
	uint16	iTemp=0;
	uint16	iplace=*p_iplace;
	uint32	tempLatitude=0;
	uint32	tempLongitude=0;
	int16	tempValue=0;
	
	//压缩点2的经纬度值(两个字节bit15~bit0)的最低位bit15表示正负值:为0表示此值为正,直接加上压缩点1经纬度值即为当前的经纬度值,
	//如果为1则表示此值为负,压缩点1经纬度减去此数为当前的经纬度。
	tempLatitude=(uint32)((GPS_DATA.Latitude.dd)*1000000+(GPS_DATA.Latitude.mm)*1000000/60+(GPS_DATA.Latitude.mmmm)*100/60);
	tempValue=(int16)(tempLatitude-G_LastLatitude);
	if(tempValue<0)
		statusBit_Form->latitude=(uint16)((~tempValue)|0x8000);
	else
		statusBit_Form->latitude=(uint16)tempValue;
	G_LastLatitude=tempLatitude;	//保存当前压缩点的纬度
	for(iTemp=0;iTemp<sizeof(statusBit_Form->latitude);iTemp++)
		ss[iplace++]=statusBit_Form->latitude>>(8*(sizeof(statusBit_Form->latitude)-iTemp-1));//纬度×1000000
	
	tempLongitude=(uint32)(GPS_DATA.Longitude.ddd*1000000+GPS_DATA.Longitude.mm*1000000/60+GPS_DATA.Longitude.mmmm*100/60);
	tempValue=(int16)(tempLongitude-G_lastLongitude);
	if(tempValue<0)
		statusBit_Form->longitude=(uint16)((~tempValue)|0x8000);
	else
		statusBit_Form->longitude=(uint16)tempValue;
	G_lastLongitude=tempLongitude;	//保存当前压缩点的经度
	for(iTemp=0;iTemp<sizeof(statusBit_Form->longitude);iTemp++)
		ss[iplace++]=statusBit_Form->longitude>>(8*(sizeof(statusBit_Form->longitude)-iTemp-1));//经度×1000000
	
	statusBit_Form->speed=GPS_DATA.Speed;
	ss[iplace++]=statusBit_Form->speed;//速度,单位:公里/小时,表示范围0~255。从GPS模块接收处理后的速度
	statusBit_Form->direction=(GPS_DATA.Direction.ddd)/2;
	ss[iplace++]=statusBit_Form->direction;//正北方向为0度,顺时针增加,单位:2度,数值范围0~180。
	//高位第一位表示正负高度,为0表示海拔为正高度,1为表示海拔为负高度,表示范围-32767~32767米。
	statusBit_Form->heightAboveSeaLevel=GPS_DATA.Altitude;
	for(iTemp=0;iTemp<sizeof(statusBit_Form->heightAboveSeaLevel);iTemp++)
		ss[iplace++]=statusBit_Form->heightAboveSeaLevel>>(8*(sizeof(statusBit_Form->heightAboveSeaLevel)-iTemp-1));//海拔高度,单位:米,
	//第一个字节代表年(2000年为0年),第二个字节代表月,第三个字节代表日,第四个字节代表小时,第五个字节代表分钟,第六个字节代表秒
	/*
	statusBit_Form->dateTime[0]=GPS_DATA.Time.Year;
	statusBit_Form->dateTime[1]=GPS_DATA.Time.Mon;
	statusBit_Form->dateTime[2]=GPS_DATA.Time.Day;
	statusBit_Form->dateTime[3]=GPS_DATA.Time.Hour;
	statusBit_Form->dateTime[4]=GPS_DATA.Time.Min;
	statusBit_Form->dateTime[5]=GPS_DATA.Time.Sec;
	
	for(iTemp=0;iTemp<sizeof(statusBit_Form->dateTime);iTemp++)
		ss[iplace++]=statusBit_Form->dateTime[iTemp];
	*/
	//      状态位	定义		//用来表示定位终端的各种状态信息。
	statusBit_Form->statusBit=0;
	GetStatusBit(&statusBit_Form->statusBit);	//得到状态位
	
	for(iTemp=0;iTemp<sizeof(statusBit_Form->statusBit);iTemp++)
		ss[iplace++]=statusBit_Form->statusBit>>(8*(sizeof(statusBit_Form->statusBit)-iTemp-1));
		
	*p_iplace=iplace;
	
	return	TRUE;
	
	
}

/****************************************************************************
* 名称:strEncoder_trans()
* 功能:编码   
* 入口参数:newSms		要生成的字符数组,inewlen:长度,pcur_IPMAINDATA:接收的数据存放的结构 ,baseCommID_Up主动上传命令ID
* 出口参数:是否正确执行
****************************************************************************/
uint16	commandNum=0;
INT16U strEncoder_trans(INT8U * dest ,INT16U *inewlen,IPMAINDATA *pcur_IPMAINDATA,INT16U  baseCommID_Up)
{
   
	INT16U		iplace=0,iTemp=0;
	INT8U		*	ss;
	
	ss=dest;
	
	if(pcur_IPMAINDATA!=NULL)      //if(pcur_IPMAINDATA->answerFlag==MAIN_ANSWER_FLAG)
	{ //回应上位机消息   终端命令应答。
			
			
		switch(pcur_IPMAINDATA->commandID)
		{
			case  D_paramQueryComm: 	//上传//4.3.1.12 参数查询指令(命令ID:000CH)	24
			{
				//if(pcur_IPMAINDATA->answerFlag==MAIN_UNANSWER_FLAG)	return	FALSE;
				if(pcur_IPMAINDATA->pDataContext!=NULL)
				{
					
					INT16U		*	p,	* pTemp;
					INT16U		tempPlace=0;
					
					pcur_IPMAINDATA->answerFlag=MAIN_ANSWER_FLAG;  //应答标志,00:不需要应答,01:需要应答
					pcur_IPMAINDATA->commandNumber=commandNum++;
					pcur_IPMAINDATA->commandID=U_UploadParam;	//4.3.2.9 上传定位终端参数(命令ID:0109H)	3
					iplace=0;
					for(iTemp=0;iTemp<sizeof(pcur_IPMAINDATA->ipDataLength);iTemp++)
						ss[iplace++]=(INT8U)((pcur_IPMAINDATA->ipDataLength)>>(8*(sizeof(pcur_IPMAINDATA->ipDataLength)-iTemp-1)));
					ss[iplace++]=pcur_IPMAINDATA->protocolVersion;  //
					ss[iplace++]=pcur_IPMAINDATA->answerFlag;  //
					for(iTemp=0;iTemp<sizeof(pcur_IPMAINDATA->terminalID);iTemp++)
						ss[iplace++]=pcur_IPMAINDATA->terminalID[iTemp];
					for(iTemp=0;iTemp<sizeof(pcur_IPMAINDATA->serverID);iTemp++)
						ss[iplace++]=(INT8U)((pcur_IPMAINDATA->serverID)>>(8*(sizeof(pcur_IPMAINDATA->serverID)-iTemp-1)));
					for(iTemp=0;iTemp<sizeof(pcur_IPMAINDATA->commandNumber);iTemp++)
						ss[iplace++]=(INT8U)((pcur_IPMAINDATA->commandNumber)>>(8*(sizeof(pcur_IPMAINDATA->commandNumber)-iTemp-1)));
					for(iTemp=0;iTemp<sizeof(pcur_IPMAINDATA->commandID);iTemp++)
						ss[iplace++]=(INT8U)((pcur_IPMAINDATA->commandID)>>(8*(sizeof(pcur_IPMAINDATA->commandID)-iTemp-1)));
					
					tempPlace=iplace;
					
					pTemp=(INT16U	*)pcur_IPMAINDATA->pDataContext;
					p=pTemp;
					while((INT16S)(*inewlen-tempPlace)>0)
					{
						INT16U		paramAddr=0;
						
						STRU_U_UploadParam_Comm		uploadParam;
						
						uploadParam.param_ID=*pTemp;            //2个字节
						pTemp+=1;
						tempPlace+=2;
						
						uploadParam.query_Result_Flag=0;	//0:成功,1:失败
						ss[iplace++]=uploadParam.query_Result_Flag;
						
						
						for(iTemp=0;iTemp<sizeof(uploadParam.param_ID);iTemp++)	
							ss[iplace++]=(uint8)(uploadParam.param_ID>>(8*(sizeof(uploadParam.param_ID)-iTemp-1)));
						GetOmoveAddr(SETUP_PARAMS,SETUP_PARAMS_COUNT,uploadParam.param_ID,(uint16	*)&(uploadParam.paramValue_Len),&paramAddr);
						if((iplace+uploadParam.paramValue_Len)>GPRSINFOLEN)		//
						{
							iplace-=(1+sizeof(uploadParam.param_ID));
							break;
						}
						ss[iplace++]=uploadParam.paramValue_Len;
						
						if(uploadParam.param_ID==0x0304)	//里程数
						{
							memcpy(ss+iplace,Last_ACC_Mileage,4);
							
						}
						else	if(uploadParam.param_ID==0x0303)	//ACC累计时间
						{
							memcpy(ss+iplace,Last_ACC_Mileage+5,4);
						}
						else	
							W25X32_READ_Semphore(GetAddr(SETUP_PARAMS_SEC,paramAddr),(uint32)uploadParam.paramValue_Len,ss+iplace);
							
						GetParamVal_ASCII(uploadParam.param_ID,ss+iplace,(uint32 *)&uploadParam.paramValue_Len);
						
						for(iTemp=0;iTemp<uploadParam.paramValue_Len;iTemp++)
						{
							if((ss+iplace)[iTemp]==0xff&&(ss+iplace)[iTemp+1]==0xff)
							{
								uploadParam.paramValue_Len=iTemp;
								break;
							}
						}
						ss[iplace-1]=uploadParam.paramValue_Len;//重新将参数长度值赋值。
						iplace+=uploadParam.paramValue_Len;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -