?? 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 + -