/* decode gps navigation data subframe 5 -------------------------------------*/ static void decode_gps_subfrm5(const unsigned char *buff, alm_t *alm) { double toas; int i,sat,week,svid=getbitu(buff,50,6); if (1<=svid&&svid<=24) { /* page 1-24 */ /* decode almanac */ sat=getbitu(buff,50,6); if (1<=sat&&sat<=32) decode_almanac(buff,sat,alm); } else if (svid==51) { /* page 25 */ if (alm) { i=56; toas=getbitu(buff,i,8)*4096; i+=8; week=getbitu(buff,i,8); i+=8; week=adjgpsweek(week); /* decode sv health */ for (sat=1;sat<=24;sat++) { alm[sat-1].svh=getbitu(buff,i,6); i+=6; } for (sat=1;sat<=32;sat++) { alm[sat-1].toas=toas; alm[sat-1].week=week; alm[sat-1].toa=gpst2time(week,toas); } } } }
/* decode gps navigation data subframe 4 -------------------------------------*/ static void decode_gps_subfrm4(const unsigned char *buff, alm_t *alm, double *ion, double *utc, int *leaps) { int i,sat,svid=getbitu(buff,50,6); if (25<=svid&&svid<=32) { /* page 2,3,4,5,7,8,9,10 */ /* decode almanac */ sat=getbitu(buff,50,6); if (1<=sat&&sat<=32) decode_almanac(buff,sat,alm); } else if (svid==63) { /* page 25 */ /* decode as and sv config */ i=56; for (sat=1;sat<=32;sat++) { if (alm) alm[sat-1].svconf=getbitu(buff,i,4); i+=4; } /* decode sv health */ i=186; for (sat=25;sat<=32;sat++) { if (alm) alm[sat-1].svh =getbitu(buff,i,6); i+=6; } } else if (svid==56) { /* page 18 */ /* decode ion/utc parameters */ if (ion) { i=56; ion[0]=getbits(buff,i, 8)*P2_30; i+= 8; ion[1]=getbits(buff,i, 8)*P2_27; i+= 8; ion[2]=getbits(buff,i, 8)*P2_24; i+= 8; ion[3]=getbits(buff,i, 8)*P2_24; i+= 8; ion[4]=getbits(buff,i, 8)*pow(2,11); i+= 8; ion[5]=getbits(buff,i, 8)*pow(2,14); i+= 8; ion[6]=getbits(buff,i, 8)*pow(2,16); i+= 8; ion[7]=getbits(buff,i, 8)*pow(2,16); } if (utc) { i=120; utc[1]=getbits(buff,i,24)*P2_50; i+=24; utc[0]=getbits(buff,i,32)*P2_30; i+=32; utc[2]=getbits(buff,i, 8)*pow(2,12); i+= 8; utc[3]=getbitu(buff,i, 8); } if (leaps) { i=192; *leaps=getbits(buff,i,8); } } }
/* decode qzss navigation data subframe 4/5 ----------------------------------*/ static void decode_qzs_subfrm45(const unsigned char *buff, alm_t *alm, double *ion, double *utc, int *leaps) { int i,j,sat,toas,week,svid=getbitu(buff,50,6); if (1<=svid&&svid<=5) { /* qzss almanac */ if (!(sat=satno(SYS_QZS,192+svid))) return; decode_almanac(buff,sat,alm); } else if (svid==51) { /* qzss health */ if (alm) { i=56; toas=getbitu(buff,i,8)*4096; i+=8; week=getbitu(buff,i,8); i+=8; week=adjgpsweek(week); for (j=0;j<5;j++) { if (!(sat=satno(SYS_QZS,193+j))) continue; alm[sat-1].toas=toas; alm[sat-1].week=week; alm[sat-1].toa=gpst2time(week,toas); alm[sat-1].svh=getbitu(buff,i,6); i+=6; } } } else if (svid==56) { /* ion/utc parameters */ if (ion) { i=56; ion[0]=getbits(buff,i, 8)*P2_30; i+= 8; ion[1]=getbits(buff,i, 8)*P2_27; i+= 8; ion[2]=getbits(buff,i, 8)*P2_24; i+= 8; ion[3]=getbits(buff,i, 8)*P2_24; i+= 8; ion[4]=getbits(buff,i, 8)*pow(2,11); i+= 8; ion[5]=getbits(buff,i, 8)*pow(2,14); i+= 8; ion[6]=getbits(buff,i, 8)*pow(2,16); i+= 8; ion[7]=getbits(buff,i, 8)*pow(2,16); } if (utc) { i=120; utc[1]=getbits(buff,i,24)*P2_50; i+=24; utc[0]=getbits(buff,i,32)*P2_30; i+=32; utc[2]=getbits(buff,i, 8)*pow(2,12); i+= 8; utc[3]=getbitu(buff,i, 8); } } }
/* decode navigation data subframe 5 -----------------------------------------*/ static int decode_subfrm5(const unsigned char *buff, alm_t *alm) { double toas; int i,sat,week,svid=getbitu(buff,50,6); trace(4,"decode_subfrm5: svid=%d\n",svid); trace(5,"decode_subfrm5: buff="); traceb(5,buff,30); if (1<=svid&&svid<=24) { /* page 1-24 */ /* decode almanac */ decode_almanac(buff,alm); } else if (svid==51) { /* page 25 */ if (alm) { i=56; toas=getbitu(buff,i,8)*4096; i+=8; week=getbitu(buff,i,8); i+=8; week=adjgpsweek(week); /* decode sv health */ for (sat=1; sat<=24; sat++) { alm[sat-1].svh=getbitu(buff,i,6); i+=6; } for (sat=1; sat<=32; sat++) { alm[sat-1].toas=toas; alm[sat-1].week=week; alm[sat-1].toa=gpst2time(week,toas); } } } return 5; }