agpsEncode.c
1.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include "agpsEncode.h"
/* accord to ts49.031 R6 */
kal_uint8 AsnEncode_SS2_gpsAssistanceData(cp_mmi_req_assist_data_struct *gpsData, kal_uint8 *encodeBuf){
kal_uint8 len=0;
kal_uint8 i;
if(gpsData == NULL || encodeBuf == NULL){ return len; }
for(i=0;i<CP_MAX_GPS_ASSISTANCE_DATA_LEN;i++){
*(encodeBuf+i) = 0;
}
if(gpsData->almanac == KAL_TRUE){ *(encodeBuf+0) |= 1<<0; }
if(gpsData->utc_model == KAL_TRUE){ *(encodeBuf+0) |= 1<<1; }
if(gpsData->ionospheric_model == KAL_TRUE){ *(encodeBuf+0) |= 1<<2; }
if(gpsData->navigation_model == KAL_TRUE){ *(encodeBuf+0) |= 1<<3; }
if(gpsData->dgps_correction == KAL_TRUE){ *(encodeBuf+0) |= 1<<4; }
if(gpsData->ref_location == KAL_TRUE){ *(encodeBuf+0) |= 1<<5; }
if(gpsData->ref_time == KAL_TRUE){ *(encodeBuf+0) |= 1<<6; }
if(gpsData->acquisition_assist == KAL_TRUE){ *(encodeBuf+0) |= 1<<7; }
if(gpsData->realtime_integrity == KAL_TRUE){ *(encodeBuf+1) |= 1<<0; }
//gps_week
*(encodeBuf+2) |= (gpsData->nav_model_data.gps_week&0x300)>>2;
*(encodeBuf+3) |= (gpsData->nav_model_data.gps_week>>0)&0xFF;
//gps_toe
if(gpsData->nav_model_data.gps_toe<=167){
*(encodeBuf+4) = gpsData->nav_model_data.gps_toe;
}
else{
//range should be 0 ~ 167
//kal_trace();
}
//nsat
*(encodeBuf+5) |= (gpsData->nav_model_data.nsat&0xF)<<4;
//T-Toe limit
if(gpsData->nav_model_data.gps_toe<=10){
*(encodeBuf+5) |= (gpsData->nav_model_data.toe_limit&0xF);
}
else{
//range should be 0 ~ 10
//kal_trace();
}
len = 6;
if(gpsData->nav_model_data.sat_info_used == KAL_TRUE){
for(i=0;i<gpsData->nav_model_data.nsat;i++){
*(encodeBuf+6+2*i) |= gpsData->nav_model_data.sat_info[i].sat_id&0x3F;
*(encodeBuf+7+2*i) |= gpsData->nav_model_data.sat_info[i].iODE;
}
len += gpsData->nav_model_data.sat_info_used;
}
return len;
}