36#define PI 3.1415926535897932
37#define D2R (PI / 180.0)
38#define R2D (180.0 / PI)
39#define CLIGHT 299792458.0
40#define SC2RAD 3.1415926535898
59#define FREQ1 1.57542E9
60#define FREQ2 1.22760E9
61#define FREQ5 1.17645E9
62#define FREQ6 1.27875E9
63#define FREQ7 1.20714E9
64#define FREQ8 1.191795E9
65#define FREQ9 2.492028E9
66#define FREQ1_GLO 1.60200E9
67#define DFRQ1_GLO 0.56250E6
68#define FREQ2_GLO 1.24600E9
69#define DFRQ2_GLO 0.43750E6
70#define FREQ3_GLO 1.202025E9
71#define FREQ1a_GLO 1.600995E9
72#define FREQ2a_GLO 1.248060E9
73#define FREQ1_CMP 1.561098E9
83#define P2_11 4.882812500000000E-04
84#define P2_15 3.051757812500000E-05
85#define P2_17 7.629394531250000E-06
86#define P2_19 1.907348632812500E-06
87#define P2_20 9.536743164062500E-07
88#define P2_21 4.768371582031250E-07
89#define P2_23 1.192092895507810E-07
90#define P2_24 5.960464477539063E-08
91#define P2_27 7.450580596923828E-09
92#define P2_29 1.862645149230957E-09
93#define P2_30 9.313225746154785E-10
94#define P2_31 4.656612873077393E-10
95#define P2_32 2.328306436538696E-10
96#define P2_33 1.164153218269348E-10
97#define P2_34 5.820766091346740E-11
98#define P2_35 2.910383045673370E-11
99#define P2_38 3.637978807091710E-12
100#define P2_40 9.094947017729280E-13
101#define P2_43 1.136868377216160E-13
102#define P2_46 1.421085471520200E-14
103#define P2_50 8.881784197001252E-16
104#define P2_55 2.775557561562891E-17
105#define P2_59 1.734723475976810E-18
109#define SBF_SYNC1 0x24
110#define SBF_SYNC2 0x40
113#define SBF_MEASEPOCH 4027
114#define SBF_MEASEXTRA 4000
115#define SBF_GPSRAWCA 4017
116#define SBF_GLORAWCA 4026
117#define SBF_GALRAWFNAV 4022
118#define SBF_GALRAWINAV 4023
119#define SBF_GALRAWCNAV 4024
120#define SBF_GEORAWL1 4020
121#define SBF_BDSRAW 4047
122#define SBF_QZSRAWL1CA 4066
123#define SBF_QZSRAWL6 4069
124#define SBF_QZSRAWL6D 4270
125#define SBF_QZSRAWL6E 4271
126#define SBF_NAVICRAW 4093
129#define SBF_GPSNAV 5891
130#define SBF_GLONAV 4004
131#define SBF_GALNAV 4002
132#define SBF_BDSNAV 4081
133#define SBF_QZSSNAV 4095
136#define SBF_PVTGEOD 4007
139#define U1(p) (*((uint8_t*)(p)))
140#define I1(p) (*((int8_t*)(p)))
141static uint16_t
U2(uint8_t* p) {
146static uint32_t
U4(uint8_t* p) {
151static int32_t
I4(uint8_t* p) {
156static int16_t
I2(uint8_t* p) {
161static float R4(
const uint8_t* p) {
166static double R8(
const uint8_t* p) {
174 int16_t offset = (ref_WN % 1024) - WN;
175 if (offset > 512) offset -= 1024;
176 if (offset < -511) offset += 1024;
177 return ref_WN + offset;
180 int16_t offset = (ref_WN % 4096) - WN;
181 if (offset > 2048) offset -= 4096;
182 if (offset < -2047) offset += 4096;
183 return ref_WN + offset;
186 int16_t offset = (ref_WN % 8192) - WN;
187 if (offset > 4096) offset -= 8192;
188 if (offset < -4095) offset += 8192;
189 return ref_WN + offset;
287 const char* opt = raw->
opt;
288 int idx, sys =
satsys(sat, NULL), nex = NEXOBS;
310 if (strstr(opt,
"-GL1W") && idx == 0) {
311 return (*code ==
CODE_L1W) ? 0 : -1;
313 if (strstr(opt,
"-GL1L") && idx == 0) {
314 return (*code ==
CODE_L1L) ? 0 : -1;
316 if (strstr(opt,
"-GL2L") && idx == 1) {
317 return (*code ==
CODE_L2L) ? 1 : -1;
320 return (nex < 1) ? -1 : NFREQ;
323 return (nex < 2) ? -1 : NFREQ + 1;
326 return (nex < 3) ? -1 : NFREQ + 2;
329 if (strstr(opt,
"-RL1P") && idx == 0) {
330 return (*code ==
CODE_L1P) ? 0 : -1;
332 if (strstr(opt,
"-RL2C") && idx == 1) {
333 return (*code ==
CODE_L2C) ? 1 : -1;
336 return (nex < 1) ? -1 : NFREQ;
339 return (nex < 2) ? -1 : NFREQ + 1;
342 if (strstr(opt,
"-JL1L") && idx == 0) {
343 return (*code ==
CODE_L1L) ? 0 : -1;
345 if (strstr(opt,
"-JL1Z") && idx == 0) {
346 return (*code ==
CODE_L1Z) ? 0 : -1;
349 return (nex < 1) ? -1 : NFREQ;
352 return (nex < 2) ? -1 : NFREQ + 1;
355 if (strstr(opt,
"-CL1P") && idx == 0) {
356 return (*code ==
CODE_L1P) ? 0 : -1;
359 return (nex < 1) ? -1 : NFREQ;
362 return (idx < NFREQ) ? idx : -1;
369 data->
sat = (uint8_t)sat;
371 for (i = 0; i < NFREQ + NEXOBS; i++) {
372 data->
L[i] = data->
P[i] = 0.0;
374 data->
SNR[i] = (uint16_t)0;
375 data->
LLI[i] = (uint8_t)0;
381 uint8_t *p = raw->
buff + 14, code;
382 double P1, P2, L1, L2, D1, D2, S1, S2, freq1, freq2;
383 int i, j, idx, n, n1, n2, len1, len2, sig, ant, svid, info, sat, sys, lock, fcn, LLI;
386 if (strstr(raw->
opt,
"-AUX1")) {
388 }
else if (strstr(raw->
opt,
"-AUX2")) {
393 trace(NULL, 2,
"sbf measepoch length error: len=%d\n", raw->
len);
400 if (
U1(p + 3) & 0x80) {
401 trace(NULL, 2,
"sbf measepoch scrambled\n");
407 for (i = n = 0, p += 6; i < n1 && n <
MAXOBS && p + 20 <= raw->
buff + raw->
len; i++) {
409 ant =
U1(p + 1) >> 5;
410 sig =
U1(p + 1) & 0x1f;
415 sig = (info >> 3) + 32;
416 }
else if (sig >= 8 && sig <= 11) {
417 fcn = (info >> 3) - 8;
420 if (ant != ant_sel) {
421 trace(NULL, 3,
"sbf measepoch ant error: svid=%d ant=%d\n", svid, ant);
422 p += len1 + len2 * n2;
426 trace(NULL, 3,
"sbf measepoch svid error: svid=%d\n", svid);
427 p += len1 + len2 * n2;
441 if ((
U1(p + 3) & 0x1f) != 0 ||
U4(p + 4) != 0) {
442 P1 = (
U1(p + 3) & 0x0f) * 4294967.296 +
U4(p + 4) * 0.001;
444 if (
I4(p + 8) != (-2147483647 - 1)) {
445 D1 =
I4(p + 8) * 0.0001;
449 if ((idx =
sig2idx(sat, sig, raw, &code)) >= 0) {
454 raw->
obs.
data[n].
D[idx] = (float)D1;
457 if (P1 != 0.0 && freq1 > 0.0 && lock != 65535 && (
I1(p + 14) != -128 ||
U2(p + 12) != 0)) {
458 L1 =
I1(p + 14) * 65.536 +
U2(p + 12) * 0.001;
461 if (lock < raw->lockt[sat - 1][idx]) {
464 if (info & (1 << 2)) {
468 raw->
lockt[sat - 1][idx] = lock;
470 if (
U1(p + 15) != 255) {
471 S1 =
U1(p + 15) * 0.25 + ((sig == 1 || sig == 2) ? 0.0 : 10.0);
477 for (j = 0, p += len1; j < n2 && p + 12 <= raw->
buff + raw->
len; j++, p += len2) {
482 sig = (info >> 3) + 32;
485 if (ant != ant_sel) {
486 trace(NULL, 3,
"sbf measepoch ant error: sat=%d ant=%d\n", sat, ant);
489 if ((idx =
sig2idx(sat, sig, raw, &code)) < 0) {
490 trace(NULL, 3,
"sbf measepoch sig error: sat=%d sig=%d\n", sat, sig);
496 if (P1 != 0.0 && (
getbits(p + 3, 5, 3) != -4 ||
U2(p + 6) != 0)) {
497 P2 = P1 +
getbits(p + 3, 5, 3) * 65.536 +
U2(p + 6) * 0.001;
500 if (P2 != 0.0 && freq2 > 0.0 && (
I1(p + 4) != -128 ||
U2(p + 8) != 0)) {
501 L2 =
I1(p + 4) * 65.536 +
U2(p + 8) * 0.001;
504 if (D1 != 0.0 && freq1 > 0.0 && freq2 > 0.0 && (
getbits(p + 3, 0, 5) != -16 ||
U2(p + 10) != 0)) {
505 D2 =
getbits(p + 3, 0, 5) * 6.5536 +
U2(p + 10) * 0.0001;
506 raw->
obs.
data[n].
D[idx] = (float)(D1 * freq2 / freq1) + D2;
511 if (lock < raw->lockt[sat - 1][idx]) {
514 if (info & (1 << 2)) {
518 raw->
lockt[sat - 1][idx] = lock;
520 if (
U1(p + 2) != 255) {
521 S2 =
U1(p + 2) * 0.25 + ((sig == 1 || sig == 2) ? 0.0 : 10.0);
529 for (ki = 0; ki < NFREQ + NEXOBS; ki++) {
556 if (!strstr(raw->
opt,
"-EPHALL")) {
564 raw->
nav.
eph[sat - 1] = eph;
574 utc[3] += week / 256 * 256;
575 if (utc[3] < week - 127) {
577 }
else if (utc[3] > week + 127) {
580 utc[5] += utc[3] / 256 * 256;
581 if (utc[5] < utc[3] - 127) {
583 }
else if (utc[5] > utc[3] + 127) {
589 double ion[8], utc[8];
590 int sys =
satsys(sat, NULL);
608 uint8_t *p = raw->
buff + 14, buff[30];
609 int i, svid, sat, prn, id, ret;
612 trace(NULL, 2,
"sbf rawca length error: sys=%d len=%d\n", sys, raw->
len);
617 trace(NULL, 2,
"sbf rawca svid error: sys=%d svid=%d\n", sys, svid);
621 trace(NULL, 3,
"sbf rawca parity/crc error: sys=%d prn=%d\n", sys, prn);
627 for (i = 0, p += 6; i < 10; i++, p += 4) {
632 if (id < 1 || id > 5) {
633 trace(NULL, 2,
"sbf rawca subframe id error: sys=%d prn=%d id=%d\n", sys, prn,
id);
636 memcpy(raw->
subfrm[sat - 1] + (
id - 1) * 30, buff, 30);
641 if (
id == 4 ||
id == 5) {
643 memset(raw->
subfrm[sat - 1] +
id * 30, 0, 30);
655 uint8_t *p = raw->
buff + 14, buff[12];
656 int i, svid, sat, prn, m;
659 trace(NULL, 2,
"sbf glorawca length error: len=%d\n", raw->
len);
664 trace(NULL, 3,
"sbf glorawca svid error: svid=%d\n", svid);
665 return (svid == 62) ? 0 : -1;
668 trace(NULL, 3,
"sbf glorawca parity/crc error: prn=%d\n", prn);
674 for (i = 0; i < 3; i++) {
675 setbitu(buff, 32 * i, 32,
U4(p + 6 + 4 * i));
678 if (m < 1 || m > 15) {
679 trace(NULL, 2,
"sbf glorawca string number error: prn=%d m=%d\n", prn, m);
684 memset(raw->
subfrm[sat - 1], 0, 40);
687 memcpy(raw->
subfrm[sat - 1] + (m - 1) * 10, buff, 10);
699 if (geph.
sat != sat) {
700 trace(NULL, 2,
"sbf glorawca satellite error: sat=%d %d\n", sat, geph.
sat);
703 geph.
frq = (int)
U1(p + 4) - 8;
705 if (!strstr(raw->
opt,
"-EPHALL")) {
719 double ion[4] = {0}, utc[8] = {0};
720 uint8_t *p = raw->
buff + 14, buff[32], crc_buff[27];
721 int i, svid, src, sat, prn, type;
723 if (strstr(raw->
opt,
"-GALINAV")) {
728 trace(NULL, 2,
"sbf galrawfnav length error: len=%d\n", raw->
len);
732 src =
U1(p + 3) & 0x1f;
735 trace(NULL, 2,
"sbf galrawfnav svid error: svid=%d src=%d\n", svid, src);
739 sprintf(raw->
msgtype + strlen(raw->
msgtype),
" prn=%d src=%d", prn, src);
741 if (src != 20 && src != 22) {
742 trace(NULL, 2,
"sbf galrawfnav source error: prn=%d src=%d\n", prn, src);
745 for (i = 0; i < 8; i++) {
746 setbitu(buff, 32 * i, 32,
U4(p + 6 + 4 * i));
748 for (i = 0; i < 27; i++) {
750 crc_buff[i] =
getbitu(buff, 0, 6);
752 crc_buff[i] =
getbitu(buff, 8 * i - 2, 8);
755 trace(NULL, 4,
"sbf galrawfnav: prn=%d src=%d crc=%06x %06x\n", prn, src,
rtk_crc24q(crc_buff, 27),
759 trace(NULL, 3,
"sbf galrawfnav parity/crc error: prn=%d src=%d\n", prn, src);
767 if (type < 1 || type > 6) {
768 trace(NULL, 2,
"sbf galrawfnav page type error: prn=%d type=%d\n", prn, type);
772 memcpy(raw->
subfrm[sat - 1] + 128 + (type - 1) * 31, buff, 31);
781 if (eph.
sat != sat) {
782 trace(NULL, 2,
"sbf galrawfnav satellite error: sat=%d %d\n", sat, eph.
sat);
785 eph.
code |= (1 << 1);
791 if (!strstr(raw->
opt,
"-EPHALL")) {
806 double ion[4] = {0}, utc[8] = {0};
807 uint8_t *p = raw->
buff + 14, buff[32], crc_buff[25], type, part1, part2, page1, page2;
808 int i, j, svid, src, sat, prn;
810 if (strstr(raw->
opt,
"-GALFNAV")) {
815 trace(NULL, 2,
"sbf galrawinav length error: len=%d\n", raw->
len);
819 src =
U1(p + 3) & 0x1f;
822 trace(NULL, 2,
"sbf galrawinav svid error: svid=%d src=%d\n", svid, src);
826 sprintf(raw->
msgtype + strlen(raw->
msgtype),
" prn=%d src=%d", prn, src);
828 if (src != 17 && src != 21 && src != 22) {
829 trace(NULL, 2,
"sbf galrawinav source error: prn=%d src=%d\n", prn, src);
832 for (i = 0; i < 8; i++) {
833 setbitu(buff, 32 * i, 32,
U4(p + 6 + i * 4));
835 for (i = 0; i < 25; i++) {
837 crc_buff[i] =
getbitu(buff, 0, 4);
839 crc_buff[i] =
getbitu(buff, 8 * i - 4, 8);
842 trace(NULL, 4,
"sbf galrawinav: prn=%d src=%d crc=%06x %06x\n", prn, src,
rtk_crc24q(crc_buff, 25),
846 trace(NULL, 3,
"sbf galrawinav parity/crc error: prn=%d src=%d\n", prn, src);
854 if (part1 != 0 || part2 != 1) {
855 trace(NULL, 3,
"sbf galrawinav part error: prn=%d even/odd=%d %d\n", prn, part1, part2);
858 if (page1 == 1 || page2 == 1) {
869 for (i = 0, j = 2; i < 14; i++, j += 8) {
872 for (i = 14, j = 116; i < 16; i++, j += 8) {
882 if (eph.
sat != sat) {
883 trace(NULL, 2,
"sbf galrawinav satellite error: sat=%d %d\n", sat, eph.
sat);
886 eph.
code |= (src == 17) ? (1 << 0) : (1 << 2);
892 if (!strstr(raw->
opt,
"-EPHALL")) {
898 raw->
nav.
eph[sat - 1] = eph;
922 uint8_t* p = raw->
buff + 14;
925 int i, svid, crc_ok, prn, srcbit, b;
929 trace(NULL, 2,
"sbf galrawcnav length error: len=%d\n", raw->
len);
936 if (prn < 1 || prn > 40) {
937 trace(NULL, 2,
"sbf galrawcnav svid error: svid=%d\n", svid);
941 sprintf(raw->
msgtype + strlen(raw->
msgtype),
" prn=%d crc=%d", prn, crc_ok);
944 trace(NULL, 3,
"sbf galrawcnav crc fail: prn=%d\n", prn);
949 for (i = 0; i < 16; i++) {
950 uint32_t w =
U4(raw->
buff + 20 + i * 4);
951 bits[i * 4] = (w >> 24) & 0xFF;
952 bits[i * 4 + 1] = (w >> 16) & 0xFF;
953 bits[i * 4 + 2] = (w >> 8) & 0xFF;
954 bits[i * 4 + 3] = w & 0xFF;
958 for (i = 0; i < 56 * 8; i++) {
960 b = (bits[srcbit >> 3] >> (7 - (srcbit & 7))) & 1;
962 raw->
has_page[i >> 3] |= (uint8_t)(1 << (7 - (i & 7)));
964 raw->
has_page[i >> 3] &= (uint8_t)~(1 << (7 - (i & 7)));
970 if (hdr24 == 0xAF3BC3) {
980 uint8_t *p = raw->
buff + 14, buff[32];
981 int i, svid, sat, prn;
984 trace(NULL, 2,
"sbf georawl1 length error: len=%d\n", raw->
len);
989 trace(NULL, 2,
"sbf georawl1 svid error: svid=%d\n", svid);
993 trace(NULL, 3,
"sbf georawl1 parity/crc error: prn=%d err=%d\n", prn,
U1(p + 2));
1002 for (i = 0; i < 8; i++) {
1003 setbitu(buff, 32 * i, 32,
U4(p + 6 + 4 * i));
1012 double ion[8], utc[8];
1013 uint8_t *p = raw->
buff + 14, buff[40];
1014 int i, id, svid, sat, prn, pgn;
1016 if (raw->
len < 52) {
1017 trace(NULL, 2,
"sbf bdsraw length error: len=%d\n", raw->
len);
1022 trace(NULL, 2,
"sbf bdsraw svid error: svid=%d\n", svid);
1026 trace(NULL, 3,
"sbf bdsraw parity/crc error: prn=%d\n", prn);
1032 for (i = 0, p += 6; i < 10; i++, p += 4) {
1036 if (id < 1 || id > 5) {
1037 trace(NULL, 2,
"sbf bdsraw id error: prn=%d id=%d\n", prn,
id);
1040 if (prn >= 6 && prn <= 58) {
1041 memcpy(raw->
subfrm[sat - 1] + (
id - 1) * 38, buff, 38);
1047 }
else if (
id == 5) {
1060 if (
id == 1 && pgn >= 1 && pgn <= 10) {
1061 memcpy(raw->
subfrm[sat - 1] + (pgn - 1) * 38, buff, 38);
1068 }
else if (
id == 1 && pgn == 102) {
1069 memcpy(raw->
subfrm[sat - 1] + 10 * 38, buff, 38);
1079 if (!strstr(raw->
opt,
"-EPHALL")) {
1085 raw->
nav.
eph[sat - 1] = eph;
1102 int prn, sat, week, i, j, ret;
1103 unsigned char svid, parity, rscnt, source, rxchannel;
1104 uint8_t* p = (raw->
buff) + 8;
1105 unsigned char buff[256];
1107 if (raw->
len < 272) {
1108 trace(NULL, 2,
"SBF decode_qzsrawl6 frame length error: len=%d\n", raw->
len);
1121 rxchannel =
U1(p + 11);
1127 trace(NULL, 2,
"SBF decode_qzssl6 SVID error: SVID=%d,prn=%d\n", svid, prn);
1130 trace(NULL, 3,
"SBF QZSRawL6 : %s, prn=%d,SVID=%d, Parity=%d, RSCnt=%d, Source=%d, rxchannel=%d\n",
1131 time_str(time, 0), prn, svid, parity, rscnt, source, rxchannel);
1134 trace(NULL, 2,
"SBF decode_qzsrawl6 RS decode error\n");
1139 for (i = 0; i < 63; i++) {
1140 buff[j] = ((
U4(p + 12 + i * 4) >> 24) & 0x000000FF);
1141 buff[1 + j] = ((
U4(p + 12 + i * 4) >> 16) & 0x000000FF);
1142 buff[2 + j] = ((
U4(p + 12 + i * 4) >> 8) & 0x000000FF);
1143 buff[3 + j] = ((
U4(p + 12 + i * 4)) & 0x000000FF);
1147 memcpy(
rtcm->buff, buff, 250);
1148 raw->
l6tag = week * 604800.0 + tow * 0.001;
1155 if (ret == 10 || ret == 16) {
1163 double ion[8], utc[9];
1164 uint8_t *p = raw->
buff + 14, buff[40];
1165 int i, id, svid, sat, prn, ret = 0;
1167 if (raw->
len < 52) {
1168 trace(NULL, 2,
"sbf navicraw length error: len=%d\n", raw->
len);
1173 trace(NULL, 2,
"sbf navicraw svid error: svid=%d\n", svid);
1177 trace(NULL, 3,
"sbf navicraw parity/crc error: prn=%d err=%d\n", prn,
U1(p + 2));
1183 for (i = 0, p += 6; i < 10; i++, p += 4) {
1188 memcpy(raw->
subfrm[sat - 1] +
id * 37, buff, 37);
1195 if (!strstr(raw->
opt,
"-EPHALL")) {
1201 raw->
nav.
eph[sat - 1] = eph;
1205 }
else if (
id == 2 ||
id == 3) {
1215 memset(raw->
subfrm[sat - 1] +
id * 37, 0, 37);
1227 trace(NULL, 4,
"SBF decode_gpsnav: len=%d\n", raw->
len);
1229 if (raw->
len < 140) {
1230 trace(NULL, 2,
"SBF decode_gpsnav frame length error: len=%d\n", raw->
len);
1233 prn =
U1(raw->
buff + 14);
1235 if (sat == 0 || !(prn >= 1 && prn <= 37)) {
1236 trace(NULL, 2,
"SBF decode_gpsnav prn error: prn=%d\n", prn);
1239 week =
U2(raw->
buff + 12);
1248 tocs =
U4(raw->
buff + 32);
1258 eph.
A = pow(
R8(raw->
buff + 80), 2);
1273 if (!strstr(raw->
opt,
"-EPHALL")) {
1277 raw->
nav.
eph[sat - 1] = eph;
1285 uint8_t* p = raw->
buff + 8;
1287 uint16_t week, week_toes;
1290 trace(NULL, 4,
"SBF decode_glonav: len=%d\n", raw->
len);
1292 if (raw->
len < 96) {
1293 trace(NULL, 2,
"SBF decode_glonav frame length error: len=%d\n", raw->
len);
1296 prn =
U1(p + 6) - 37;
1298 if (sat == 0 || !(prn >= 1 && prn <= 24)) {
1299 trace(NULL, 2,
"SBF decode_glonav prn error: prn=%d\n", prn);
1303 eph.
frq =
U1(p + 7) - 8;
1304 eph.
pos[0] =
R8(p + 8) * 1000.0;
1305 eph.
pos[1] =
R8(p + 16) * 1000.0;
1306 eph.
pos[2] =
R8(p + 24) * 1000.0;
1307 eph.
vel[0] =
R4(p + 32) * 1000.0;
1308 eph.
vel[1] =
R4(p + 36) * 1000.0;
1309 eph.
vel[2] =
R4(p + 40) * 1000.0;
1310 eph.
acc[0] =
R4(p + 44) * 1000.0;
1311 eph.
acc[1] =
R4(p + 48) * 1000.0;
1312 eph.
acc[2] =
R4(p + 52) * 1000.0;
1318 eph.
age =
U1(p + 76);
1319 eph.
svh =
U1(p + 77) >> 2;
1321 eph.
sva =
U2(p + 86);
1325 if (!strstr(raw->
opt,
"-EPHALL")) {
1338 uint8_t* p = raw->
buff + 8;
1340 uint16_t week_toe, week_toc, health;
1344 trace(NULL, 4,
"SBF decode_galnav: len=%d\n", raw->
len);
1346 if (raw->
len < 149) {
1347 trace(NULL, 2,
"SBF decode_galnav frame length error: len=%d\n", raw->
len);
1350 prn =
U1(p + 6) - 70;
1352 if (sat == 0 || !(prn >= 1 && prn <= 36)) {
1353 trace(NULL, 2,
"SBF decode_galnav prn error: prn=%d\n", prn);
1358 if (code != 2 && code != 16) {
1359 trace(NULL, 2,
"SBF decode_galnav code error: prn=%d code=%d\n", prn, code);
1362 eph.
code = code == 2 ? (1 << 0) | (1 << 2) | (1 << 9) : (1 << 1) | (1 << 8);
1363 eph.
A = pow(
R8(p + 8), 2);
1364 eph.
M0 =
R8(p + 16) *
PI;
1366 eph.
i0 =
R8(p + 32) *
PI;
1372 eph.
cuc =
R4(p + 68);
1373 eph.
cus =
R4(p + 72);
1374 eph.
crc =
R4(p + 76);
1375 eph.
crs =
R4(p + 80);
1376 eph.
cic =
R4(p + 84);
1377 eph.
cis =
R4(p + 88);
1380 eph.
f2 =
R4(p + 100);
1381 eph.
f1 =
R4(p + 104);
1382 eph.
f0 =
R8(p + 108);
1387 health =
U2(p + 122);
1390 if (health & 0x001) svh |= (health >> 1) & 7;
1391 if (health & 0x010) svh |= ((health >> 5) & 7) << 6;
1392 if (health & 0x100) svh |= ((health >> 9) & 7) << 3;
1395 sva =
U1(p + (code == 2 ? 126 : 125));
1396 eph.
sva = sva == 255 ? 0 : sva;
1397 if (
R4(p + 128) != -2.e10f) eph.
tgd[0] =
R4(p + 128);
1398 if (
R4(p + 132) != -2.e10f) eph.
tgd[1] =
R4(p + 132);
1404 if (!strstr(raw->
opt,
"-EPHALL")) {
1408 raw->
nav.
eph[sat - 1] = eph;
1417 uint16_t week, week_toc, week_toe;
1420 trace(NULL, 4,
"SBF decode_bdsnav: len=%d\n", raw->
len);
1422 if (raw->
len < 140) {
1423 trace(NULL, 2,
"SBF decode_bdsnav frame length error: len=%d\n", raw->
len);
1426 prn =
U1(raw->
buff + 14) - 140;
1428 if (sat == 0 || !(prn >= 1 && prn <= 63)) {
1429 trace(NULL, 2,
"SBF decode_bdsnav prn error: prn=%d\n", prn);
1439 tocs =
U4(raw->
buff + 32);
1449 eph.
A = pow(
R8(raw->
buff + 80), 2);
1459 week =
U2(raw->
buff + 12) - 1356;
1462 eph.
week = week_toe;
1468 if (!strstr(raw->
opt,
"-EPHALL")) {
1472 raw->
nav.
eph[sat - 1] = eph;
1484 trace(NULL, 4,
"SBF decode_qzssnav: len=%d\n", raw->
len);
1486 if (raw->
len < 140) {
1487 trace(NULL, 2,
"SBF decode_qzssnav frame length error: len=%d\n", raw->
len);
1490 svid =
U1(raw->
buff + 14);
1493 trace(NULL, 2,
"SBF decode_qzssnav svid error: svid=%d\n", svid);
1496 week =
U2(raw->
buff + 12);
1504 toc =
U4(raw->
buff + 32);
1514 eph.
A = pow(
R8(raw->
buff + 80), 2);
1529 if (!strstr(raw->
opt,
"-EPHALL")) {
1533 raw->
nav.
eph[sat - 1] = eph;
1540 uint8_t* p = raw->
buff + 8;
1541 uint8_t mode, error;
1542 double lat, lon, hgt, pos[3];
1544 if (raw->
len < 44)
return 0;
1550 if ((mode & 0x0F) == 0 || error != 0)
return 0;
1557 if (lat < -2.0e10 || lon < -2.0e10 || hgt < -2.0e10)
return 0;
1564 trace(NULL, 3,
"SBF PVTGeodetic: lat=%.8f lon=%.8f hgt=%.3f mode=%d\n", lat /
D2R, lon /
D2R, hgt, mode & 0x0F);
1570 uint8_t* p = raw->
buff;
1573 int type =
U2(p + 4) & 0x1fff;
1576 trace(NULL, 2,
"sbf crc error: type=%d len=%d\n", type, raw->
len);
1579 if (raw->
len < 14) {
1580 trace(NULL, 2,
"sbf length error: type=%d len=%d\n", type, raw->
len);
1585 if (tow == 4294967295u || week == 65535u) {
1586 trace(NULL, 2,
"sbf tow/week error: type=%d len=%d\n", type, raw->
len);
1593 sprintf(raw->
msgtype,
"SBF %4d (%4d): %s", type, raw->
len, tstr);
1637 trace(NULL, 3,
"sbf unsupported message: type=%d\n", type);
1679 trace(NULL, 5,
"input_sbf: data=%02x\n", data);
1681 if (raw->
nbyte == 0) {
1688 if (raw->
nbyte < 8) {
1694 trace(NULL, 2,
"sbf length error: len=%d\n", raw->
len);
1716 trace(NULL, 4,
"input_sbff:\n");
1718 if (raw->
nbyte == 0) {
1720 if ((data = fgetc(fp)) == EOF) {
1731 if (fread(raw->
buff + 2, 1, 6, fp) < 6) {
1738 trace(NULL, 2,
"sbf length error: len=%d\n", raw->
len);
1742 if (fread(raw->
buff + 8, raw->
len - 8, 1, fp) < 1) {
uint32_t rtk_crc24q(const uint8_t *buff, int len)
Compute CRC-24Q parity for SBAS and RTCM3.
uint16_t rtk_crc16(const uint8_t *buff, int len)
Compute CRC-16 parity for BINEX and NVS.
void setbitu(uint8_t *buff, int pos, int len, uint32_t data)
Set unsigned bits in byte data.
uint32_t getbitu(const uint8_t *buff, int pos, int len)
Extract unsigned bits from byte data.
int32_t getbits(const uint8_t *buff, int pos, int len)
Extract signed bits from byte data.
MRTKLIB Bits Module — Binary bit operations and CRC functions.
void pos2ecef(const double *pos, double *r)
Transform geodetic position to ECEF position.
MRTKLIB Coordinates Module — Coordinate transformations and geometry.
int satsys(int sat, int *prn)
MRTKLIB Broadcast Ephemeris Module — Satellite orbit/clock types and Kepler/GLONASS/SBAS orbit comput...
double code2freq(int sys, uint8_t code, int fcn)
MRTKLIB MADOCA-PPP Module — QZSS L6E CSSR message decode functions.
void matcpy(double *A, const double *B, int n, int m)
Copy matrix.
MRTKLIB Matrix Module — Matrix/vector operations and estimation.
int satno(int sys, int prn)
Convert satellite system+prn/slot number to satellite number.
MRTKLIB Navigation Module — Navigation data types and satellite/nav utility functions.
int mrtk_sigcfg_freq_idx(int sys, uint8_t code, const mrtk_sigcfg_t *cfg, int nex)
Resolve the observation slot for a decoded (sys, code) from sigcfg.
int code2freq_idx(int sys, uint8_t code)
Convert system and obs code to frequency index (obsdef-based).
MRTKLIB Observation Module — Observation data types and utility functions.
#define MRTK_SIGCFG_NOOPINION
mrtk_sigcfg_freq_idx() sentinel: this constellation has no sigcfg entry, so the caller should fall ba...
static int decode_galrawinav(raw_t *raw)
static int decode_bdsraw(raw_t *raw)
static uint16_t adjust_WN14(uint16_t ref_WN, uint16_t WN)
static int decode_glonav(raw_t *raw)
static int decode_galrawcnav(raw_t *raw)
Decode an SBF GALRawCNAV block (4024) into a staged Galileo HAS page.
static int decode_sbf(raw_t *raw, rtcm_t *rtcm)
static int decode_georawl1(raw_t *raw)
static int sig2idx(int sat, int sig, const raw_t *raw, uint8_t *code)
static uint16_t adjust_WN10(uint16_t ref_WN, uint16_t WN)
static int decode_measepoch(raw_t *raw)
static int decode_qzsrawl1ca(raw_t *raw)
static int decode_glorawca(raw_t *raw)
static void adj_utcweek(gtime_t time, double *utc)
static int svid2sat(int svid)
static uint8_t sig_tbl[40+1][2]
static int decode_navicraw(raw_t *raw)
int input_sbff(raw_t *raw, rtcm_t *rtcm, FILE *fp)
int input_sbf(raw_t *raw, rtcm_t *rtcm, uint8_t data)
static int decode_galnav(raw_t *raw)
static int decode_measextra(raw_t *raw)
static int decode_qzssnav(raw_t *raw)
static uint16_t adjust_WN12(uint16_t ref_WN, uint16_t WN)
static int decode_rawca(raw_t *raw, int sys)
static int decode_ionutc(raw_t *raw, int sat)
static int sync_sbf(uint8_t *buff, uint8_t data)
static int decode_galrawfnav(raw_t *raw)
static void init_obsd(gtime_t time, int sat, obsd_t *data)
static int decode_qzsrawl6(raw_t *raw, rtcm_t *rtcm)
static int decode_gpsnav(raw_t *raw)
static int decode_bdsnav(raw_t *raw)
static int decode_gpsrawca(raw_t *raw)
static int decode_eph(raw_t *raw, int sat)
static int decode_pvtgeodetic(raw_t *raw)
int decode_qzss_l6frame(rtcm_t *rtcm, int is_l6d)
Route one QZSS L6 frame received in a UBX/SBF container.
int decode_gal_fnav(const uint8_t *buff, eph_t *eph, double *ion, double *utc)
int decode_frame(const uint8_t *buff, eph_t *eph, alm_t *alm, double *ion, double *utc)
int decode_glostr(const uint8_t *buff, geph_t *geph, double *utc)
int decode_bds_d2(const uint8_t *buff, eph_t *eph, double *utc)
int decode_gal_inav(const uint8_t *buff, eph_t *eph, double *ion, double *utc)
int decode_bds_d1(const uint8_t *buff, eph_t *eph, double *ion, double *utc)
int decode_irn_nav(const uint8_t *buff, eph_t *eph, double *ion, double *utc)
MRTKLIB Receiver Raw Data Module — Receiver raw data types and decoder functions for various GNSS rec...
MRTKLIB RTCM Module — RTCM message types and functions.
MRTKLIB System Module — OS/filesystem utility functions.
gtime_t bdt2time(int week, double sec)
Convert BeiDou time week/tow to gtime_t.
gtime_t gpst2time(int week, double sec)
Convert GPS week/tow to gtime_t.
void time2str(gtime_t t, char *s, int n)
Convert gtime_t struct to string.
double timediff(gtime_t t1, gtime_t t2)
Compute time difference (t1 - t2).
double time2gpst(gtime_t t, int *week)
Convert gtime_t to GPS week/tow.
int adjgpsweek(int week)
Adjust GPS week number using CPU time.
gtime_t bdt2gpst(gtime_t t)
Convert BeiDou time to GPS time.
char * time_str(gtime_t t, int n)
Get time string (not reentrant).
MRTKLIB Time Module — GNSS time types and conversion functions.
void trace(mrtk_ctx_t *ctx, int level, const char *format,...)
Output trace message.
MRTKLIB Trace Module — debug trace and logging functions.
GPS/GAL/QZS/BDS/IRN broadcast ephemeris type.
GLONASS broadcast ephemeris type.
GNSS time representation.
Receiver raw data control type.
uint8_t subfrm[MAXSAT][380]
double lockt[MAXSAT][5+5]
mrtk_sigcfg_t sigcfg[MRTK_NSYS]
RTCM control struct type.