📄 de_encode.c
字号:
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),¶mAddr);
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 + -