34#define PI 3.1415926535897932
35#define D2R (PI / 180.0)
36#define R2D (180.0 / PI)
37#define CLIGHT 299792458.0
38#define SC2RAD 3.1415926535898
57#define FREQ1 1.57542E9
58#define FREQ2 1.22760E9
59#define FREQ5 1.17645E9
60#define FREQ6 1.27875E9
61#define FREQ7 1.20714E9
62#define FREQ8 1.191795E9
63#define FREQ9 2.492028E9
64#define FREQ1_GLO 1.60200E9
65#define DFRQ1_GLO 0.56250E6
66#define FREQ2_GLO 1.24600E9
67#define DFRQ2_GLO 0.43750E6
68#define FREQ3_GLO 1.202025E9
69#define FREQ1a_GLO 1.600995E9
70#define FREQ2a_GLO 1.248060E9
71#define FREQ1_CMP 1.561098E9
80#define LLI_BOCTRK 0x04
87#define P2_11 4.882812500000000E-04
88#define P2_15 3.051757812500000E-05
89#define P2_17 7.629394531250000E-06
90#define P2_19 1.907348632812500E-06
91#define P2_20 9.536743164062500E-07
92#define P2_21 4.768371582031250E-07
93#define P2_23 1.192092895507810E-07
94#define P2_24 5.960464477539063E-08
95#define P2_27 7.450580596923828E-09
96#define P2_29 1.862645149230957E-09
97#define P2_30 9.313225746154785E-10
98#define P2_31 4.656612873077393E-10
99#define P2_32 2.328306436538696E-10
100#define P2_33 1.164153218269348E-10
101#define P2_34 5.820766091346740E-11
102#define P2_35 2.910383045673370E-11
103#define P2_38 3.637978807091710E-12
104#define P2_40 9.094947017729280E-13
105#define P2_43 1.136868377216160E-13
106#define P2_46 1.421085471520200E-14
107#define P2_50 8.881784197001252E-16
108#define P2_55 2.775557561562891E-17
109#define P2_59 1.734723475976810E-18
113#define OEM4SYNC1 0xAA
114#define OEM4SYNC2 0x44
115#define OEM4SYNC3 0x12
116#define OEM3SYNC1 0xAA
117#define OEM3SYNC2 0x44
118#define OEM3SYNC3 0x11
123#define ID_RANGECMP 140
125#define ID_RAWEPHEM 41
127#define ID_RAWWAASFRAME 287
128#define ID_RAWSBASFRAME 973
130#define ID_GLOEPHEMERIS 723
131#define ID_GALEPHEMERIS 1122
132#define ID_GALINAVEPHEMERIS 1309
133#define ID_GALIONO 1127
134#define ID_GALCLOCK 1121
135#define ID_QZSSRAWEPHEM 1331
136#define ID_QZSSRAWSUBFRAME 1330
137#define ID_QZSSEPHEMERIS 1336
138#define ID_QZSSIONUTC 1347
139#define ID_BDSEPHEMERIS 1696
140#define ID_NAVICEPHEMERIS 2123
152#define WL1 0.1902936727984
153#define WL2 0.2442102134246
154#define MAXVAL 8388608.0
157#define SQR(x) ((x) * (x))
160#define U1(p) (*((uint8_t*)(p)))
161#define I1(p) (*((int8_t*)(p)))
162static uint16_t
U2(uint8_t* p) {
167static uint32_t
U4(uint8_t* p) {
172static int32_t
I4(uint8_t* p) {
177static float R4(uint8_t* p) {
182static double R8(uint8_t* p) {
189static int32_t
exsign(uint32_t v,
int bits) {
return (int32_t)(v & (1 << (bits - 1)) ? v | (~0u << bits) : v); }
191static uint8_t
chksum(
const uint8_t* buff,
int len) {
194 for (i = 0; i < len; i++) {
204 if (tow < tow_p - 302400.0) {
206 }
else if (tow > tow_p + 302400.0) {
216 utc[3] += week / 256 * 256;
217 if (utc[3] < week - 127) {
219 }
else if (utc[3] > week + 127) {
222 utc[5] += utc[3] / 256 * 256;
223 if (utc[5] < utc[3] - 127) {
225 }
else if (utc[5] > utc[3] + 127) {
236 for (i = 0; i < obs->
n; i++) {
243 for (j = 0; j < NFREQ + NEXOBS; j++) {
245 obs->
data[i].
D[j] = 0.0;
254 static const double ura_eph[] = {2.4, 3.4, 4.85, 6.85, 9.65, 13.65, 24.0, 48.0,
255 96.0, 192.0, 384.0, 768.0, 1536.0, 3072.0, 6144.0, 0.0};
257 for (i = 0; i < 15; i++) {
386static int decode_track_stat(uint32_t stat,
int* sys,
int* code,
int* track,
int* plock,
int* clock,
int* parity,
388 int satsys, sigtype, idx = -1;
391 *track = stat & 0x1F;
392 *plock = (stat >> 10) & 1;
393 *parity = (stat >> 11) & 1;
394 *clock = (stat >> 12) & 1;
395 satsys = (stat >> 16) & 7;
396 *halfc = (stat >> 28) & 1;
397 sigtype = (stat >> 21) & 0x1F;
422 trace(NULL, 2,
"oem4 unknown system: sys=%d\n",
satsys);
426 trace(NULL, 2,
"oem4 signal type error: sys=%d sigtype=%d\n", *sys, sigtype);
432static int checkpri(
const char* opt,
int sys,
int code,
int idx) {
436 if (strstr(opt,
"-GL1L") && idx == 0) {
439 if (strstr(opt,
"-GL2S") && idx == 1) {
442 if (strstr(opt,
"-GL2P") && idx == 1) {
446 return (nex < 1) ? -1 : NFREQ;
449 return (nex < 2) ? -1 : NFREQ + 1;
452 return (nex < 3) ? -1 : NFREQ + 2;
455 if (strstr(opt,
"-RL2C") && idx == 1) {
459 return (nex < 1) ? -1 : NFREQ;
462 if (strstr(opt,
"-EL6B") && idx == 3) {
466 return (nex < 2) ? -1 : NFREQ;
469 if (strstr(opt,
"-JL1L") && idx == 0) {
472 if (strstr(opt,
"-JL1Z") && idx == 0) {
476 return (nex < 1) ? -1 : NFREQ;
479 return (nex < 2) ? -1 : NFREQ + 1;
482 if (strstr(opt,
"-CL1P") && idx == 0) {
485 if (strstr(opt,
"-CL7D") && idx == 0) {
489 return (nex < 1) ? -1 : NFREQ;
492 return (nex < 2) ? -1 : NFREQ + 1;
495 return idx < NFREQ ? idx : -1;
501 double psr, adr, adr_rolls, lockt, tt, dop, snr, freq, glo_bias = 0.0;
502 int i, index, nobs, prn, sat, sys, code, idx, track, plock, clock, parity, halfc, lli;
504 if ((q = strstr(raw->
opt,
"-GLOBIAS="))) {
505 sscanf(q,
"-GLOBIAS=%lf", &glo_bias);
510 trace(NULL, 2,
"oem4 rangecmpb length error: len=%d nobs=%d\n", raw->
len, nobs);
516 for (i = 0, p += 4; i < nobs; i++, p += 24) {
517 if ((idx =
decode_track_stat(
U4(p), &sys, &code, &track, &plock, &clock, &parity, &halfc)) < 0) {
527 }
else if (sys ==
SYS_CMP && prn >= 161 && prn <= 197) {
530 if (!(sat =
satno(sys, prn))) {
531 trace(NULL, 3,
"oem4 rangecmpb satellite number error: sys=%d,prn=%d\n", sys, prn);
534 if (sys ==
SYS_GLO && !parity) {
538 if ((idx =
checkpri(raw->
opt, sys, code, idx)) < 0) {
542 dop =
exsign(
U4(p + 4) & 0xFFFFFFF, 28) / 256.0;
543 psr = (
U4(p + 7) >> 4) / 128.0 +
U1(p + 11) * 2097152.0;
545 if ((freq =
sat2freq(sat, (uint8_t)code, &raw->
nav)) != 0.0) {
546 adr =
I4(p + 12) / 256.0;
548 adr = -adr +
MAXVAL * floor(adr_rolls + (adr_rolls <= 0 ? -0.5 : 0.5));
550 adr += glo_bias * freq /
CLIGHT;
555 lockt = (
U4(p + 18) & 0x1FFFFF) / 32.0;
557 if (raw->
tobs[sat - 1][idx].
time != 0) {
559 lli = (lockt < 65535.968 && lockt - raw->
lockt[sat - 1][idx] + 0.05 <= tt) ?
LLI_SLIP : 0;
569 raw->
tobs[sat - 1][idx] = raw->
time;
570 raw->
lockt[sat - 1][idx] = lockt;
571 raw->
halfc[sat - 1][idx] = halfc;
573 snr = ((
U2(p + 20) & 0x3FF) >> 5) + 20.0;
587 raw->
obs.
data[index].
D[idx] = (float)dop;
599 double psr, adr, dop, snr, lockt, tt, freq, glo_bias = 0.0;
600 int i, index, nobs, prn, sat, sys, code, idx, track, plock, clock, parity, halfc, lli;
603 if ((q = strstr(raw->
opt,
"-GLOBIAS="))) {
604 sscanf(q,
"-GLOBIAS=%lf", &glo_bias);
609 trace(NULL, 2,
"oem4 rangeb length error: len=%d nobs=%d\n", raw->
len, nobs);
615 for (i = 0, p += 4; i < nobs; i++, p += 44) {
616 if ((idx =
decode_track_stat(
U4(p + 40), &sys, &code, &track, &plock, &clock, &parity, &halfc)) < 0) {
626 }
else if (sys ==
SYS_CMP && prn >= 161 && prn <= 197) {
629 if (!(sat =
satno(sys, prn))) {
630 trace(NULL, 3,
"oem4 rangeb satellite number error: sys=%d,prn=%d\n", sys, prn);
633 if (sys ==
SYS_GLO && !parity) {
637 if ((idx =
checkpri(raw->
opt, sys, code, idx)) < 0) {
650 adr -= glo_bias * freq /
CLIGHT;
655 if (raw->
tobs[sat - 1][idx].
time != 0) {
657 lli = lockt - raw->
lockt[sat - 1][idx] + 0.05 <= tt ?
LLI_SLIP : 0;
667 raw->
tobs[sat - 1][idx] = raw->
time;
668 raw->
lockt[sat - 1][idx] = lockt;
669 raw->
halfc[sat - 1][idx] = halfc;
684 raw->
obs.
data[index].
D[idx] = (float)dop;
695 uint8_t *p = raw->
buff +
OEM4HLEN, subframe[30 * 5] = {0};
699 trace(NULL, 2,
"oem4 rawephemb length error: len=%d\n", raw->
len);
704 trace(NULL, 2,
"oem4 rawephemb satellite number error: prn=%d\n", prn);
710 memcpy(subframe, p + 12, 30 * 3);
713 trace(NULL, 2,
"oem4 rawephemb subframe error: prn=%d\n", prn);
716 if (!strstr(raw->
opt,
"-EPHALL")) {
722 raw->
nav.
eph[sat - 1] = eph;
733 trace(NULL, 2,
"oem4 ionutcb length error: len=%d\n", raw->
len);
736 for (i = 0; i < 8; i++) {
755 trace(NULL, 2,
"oem4 rawwaasframeb length error: len=%d\n", raw->
len);
777 double tow, toc, ura;
778 int prn, sat, week, iode2, N;
781 trace(NULL, 2,
"oem4 gpsephemb length error: len=%d\n", raw->
len);
848 if (toc != eph.
toes) {
849 trace(NULL, 2,
"oem4 gpsephemb toe and toc unmatch prn=%d\n", prn);
852 if (iode2 != eph.
iode) {
853 trace(NULL, 2,
"oem4 gpsephemb iode unmatch prn=%d iode=%d %d\n", prn, eph.
iode, iode2);
857 trace(NULL, 2,
"oemv gpsephemb satellite error: prn=%d\n", prn);
865 eph.
sva =
uraindex((ura <= 0.0) ? 6144.0 : sqrt(ura));
870 if (!strstr(raw->
opt,
"-EPHALL")) {
875 raw->
nav.
eph[sat - 1] = eph;
884 double tow, tof, toff;
885 int prn, sat, week, type, P, flags;
888 trace(NULL, 2,
"oem4 gloephemerisb length error: len=%d\n", raw->
len);
894 trace(NULL, 2,
"oem4 gloephemerisb prn error: prn=%d\n", prn);
903 tow = floor(
U4(p + 8) / 1000.0 + 0.5);
905 geph.
iode =
U4(p + 20) & 0x7F;
906 geph.
svh = (
U4(p + 24) < 4) ? 0 : 1;
907 geph.
pos[0] =
R8(p + 28);
908 geph.
pos[1] =
R8(p + 36);
909 geph.
pos[2] =
R8(p + 44);
910 geph.
vel[0] =
R8(p + 52);
911 geph.
vel[1] =
R8(p + 60);
912 geph.
vel[2] =
R8(p + 68);
913 geph.
acc[0] =
R8(p + 76);
914 geph.
acc[1] =
R8(p + 84);
915 geph.
acc[2] =
R8(p + 92);
919 tof =
U4(p + 124) - toff;
921 geph.
sva =
U4(p + 132);
922 geph.
age =
U4(p + 136);
924 geph.
flags = (((type >= 1) ? 1 : 0) << 7) + (flags << 2) + P;
926 tof += floor(tow / 86400.0) * 86400;
927 if (tof < tow - 43200.0) {
929 }
else if (tof > tow + 43200.0) {
934 if (!strstr(raw->
opt,
"-EPHALL")) {
952 trace(NULL, 2,
"oem4 qzssrawephemb length error: len=%d\n", raw->
len);
957 trace(NULL, 2,
"oem4 qzssrawephemb satellite number error: prn=%d\n", prn);
963 memcpy(subfrm, p + 12, 90);
966 trace(NULL, 3,
"oem4 qzssrawephemb ephemeris error: prn=%d\n", prn);
969 if (!strstr(raw->
opt,
"-EPHALL")) {
975 raw->
nav.
eph[sat - 1] = eph;
983 double ion[8], utc[8];
988 trace(NULL, 2,
"oem4 qzssrawsubframeb length error: len=%d\n", raw->
len);
994 trace(NULL, 2,
"oem4 qzssrawsubframeb satellite error: prn=%d\n", prn);
998 sprintf(raw->
msgtype + strlen(raw->
msgtype),
" prn=%d id=%d", prn,
id);
1000 if (id < 1 || id > 5) {
1001 trace(NULL, 2,
"oem4 qzssrawsubframeb subfrm id error: prn=%d id=%d\n", prn,
id);
1004 memcpy(raw->
subfrm[sat - 1] + 30 * (
id - 1), p + 8, 30);
1010 if (!strstr(raw->
opt,
"-EPHALL")) {
1016 raw->
nav.
eph[sat - 1] = eph;
1020 }
else if (
id == 4 ||
id == 5) {
1035 double tow, toc, ura;
1036 int prn, sat, week, iode2, as, N, fit;
1039 trace(NULL, 2,
"oem4 qzssephemerisb length error: len=%d\n", raw->
len);
1108 if (iode2 != eph.
iode) {
1109 trace(NULL, 2,
"oem4 qzssephemerisb iode unmatch prn=%d iode=%d %d\n", prn, eph.
iode, iode2);
1113 trace(NULL, 2,
"oemv qzssephemerisb satellite error: prn=%d\n", prn);
1121 eph.
sva =
uraindex(ura <= 0 ? 6144.0 : sqrt(ura));
1122 eph.
fit = fit ? 4.0 : 2.0;
1129 if (!strstr(raw->
opt,
"-EPHALL")) {
1134 raw->
nav.
eph[sat - 1] = eph;
1145 trace(NULL, 2,
"oem4 qzssionutcb length error: len=%d\n", raw->
len);
1148 for (i = 0; i < 8; i++) {
1162 double tow, sqrtA, af0_fnav, af1_fnav, af2_fnav, af0_inav, af1_inav, af2_inav, tt;
1163 int prn, sat, week, rcv_fnav, rcv_inav, svh_e1b, svh_e5a, svh_e5b, dvs_e1b, dvs_e5a;
1164 int dvs_e5b, toc_fnav, toc_inav, set, sel_eph = 3;
1166 if (strstr(raw->
opt,
"-GALINAV")) {
1169 if (strstr(raw->
opt,
"-GALFNAV")) {
1174 trace(NULL, 2,
"oem4 galephemrisb length error: len=%d\n", raw->
len);
1179 rcv_fnav =
U4(p) & 1;
1181 rcv_inav =
U4(p) & 1;
1183 svh_e1b =
U1(p) & 3;
1185 svh_e5a =
U1(p) & 3;
1187 svh_e5b =
U1(p) & 3;
1189 dvs_e1b =
U1(p) & 1;
1191 dvs_e5a =
U1(p) & 1;
1193 dvs_e5b =
U1(p) & 1;
1252 trace(NULL, 2,
"oemv galephemeris satellite error: prn=%d\n", prn);
1258 set = rcv_fnav ? 1 : 0;
1259 if (!(sel_eph & 1) && set == 0) {
1262 if (!(sel_eph & 2) && set == 1) {
1269 eph.
f0 = set ? af0_fnav : af0_inav;
1270 eph.
f1 = set ? af1_fnav : af1_inav;
1271 eph.
f2 = set ? af2_fnav : af2_inav;
1272 eph.
svh = ((svh_e5b << 7) | (dvs_e5b << 6) | (svh_e5a << 4) | (dvs_e5a << 3) | (svh_e1b << 1) | dvs_e1b);
1273 eph.
code = set ? ((1 << 1) + (1 << 8)) : ((1 << 0) + (1 << 2) + (1 << 9));
1280 if (tt < -302400.0) {
1282 }
else if (tt > 302400.0) {
1289 if (!strstr(raw->
opt,
"-EPHALL")) {
1305 double tow, sqrtA, tt;
1306 int prn, sat, week, svh_e1b, svh_e5b, dvs_e1b, src_inav;
1307 int dvs_e5b, toc_inav;
1310 trace(NULL, 2,
"oem4 galinavephemrisb length error: len=%d\n", raw->
len);
1315 svh_e5b =
U1(p) & 3;
1317 dvs_e5b =
U1(p) & 1;
1319 svh_e1b =
U1(p) & 3;
1321 dvs_e1b =
U1(p) & 1;
1374 trace(NULL, 2,
"oemv galephemeris satellite error: prn=%d\n", prn);
1384 eph.
svh = ((svh_e5b << 4) | (dvs_e5b << 3) | (svh_e1b << 1) |
1386 eph.
code = ((src_inav & 1 << 0) + (src_inav & 2 << 2) + (1 << 9));
1393 if (tt < -302400.0) {
1395 }
else if (tt > 302400.0) {
1402 if (!strstr(raw->
opt,
"-EPHALL")) {
1409 raw->
nav.
eph[sat - 1] = eph;
1417 double a0, a1, a0g, a1g;
1418 int dtls, tot, wnt, wnlsf, dn, dtlsf, t0g, wn0g;
1421 trace(NULL, 2,
"oem4 galclockb length error: len=%d\n", raw->
len);
1464 trace(NULL, 2,
"oem4 galionob length error: len=%d\n", raw->
len);
1483 for (i = 0; i < 3; i++) {
1496 trace(NULL, 2,
"oem4 bdsephemrisb length error: len=%d\n", raw->
len);
1505 eph.
svh =
U4(p) & 1;
1556 trace(NULL, 2,
"oemv bdsephemeris satellite error: prn=%d\n", prn);
1563 eph.
type = (prn >= 6 && prn <= 58) ? 0 : 1;
1570 if (!strstr(raw->
opt,
"-EPHALL")) {
1576 raw->
nav.
eph[sat - 1] = eph;
1586 int prn, sat, toc, rsv, l5_health, s_health, alert, autonav;
1589 trace(NULL, 2,
"oem4 navicephemrisb length error: len=%d\n", raw->
len);
1614 l5_health =
U4(p) & 1;
1616 s_health =
U4(p) & 1;
1656 if (toc != eph.
toes) {
1657 trace(NULL, 2,
"oem4 navicephemrisb toe and toc unmatch prn=%d\n", prn);
1661 trace(NULL, 2,
"oemv navicephemeris satellite error: prn=%d\n", prn);
1670 eph.
svh = (l5_health << 1) | s_health;
1678 if (!strstr(raw->
opt,
"-EPHALL")) {
1683 raw->
nav.
eph[sat - 1] = eph;
1691 double tow, psr, adr, tt, lockt, dop, snr;
1692 int i, week, nobs, prn, sat, stat, sys, parity, lli, index, freq;
1700 trace(NULL, 2,
"oem3 regb length error: len=%d nobs=%d\n", raw->
len, nobs);
1703 for (i = 0, p += 20; i < nobs; i++, p += 44) {
1711 freq = (stat >> 20) & 1;
1712 sys = (stat >> 15) & 7;
1713 parity = (stat >> 10) & 1;
1715 trace(NULL, 2,
"oem3 regb satellite number error: sys=%d prn=%d\n", sys, prn);
1718 if (raw->
tobs[sat - 1][freq].
time != 0) {
1720 lli = lockt - raw->
lockt[sat - 1][freq] + 0.05 < tt || parity != raw->
halfc[sat - 1][freq];
1727 raw->
tobs[sat - 1][freq] = raw->
time;
1728 raw->
lockt[sat - 1][freq] = lockt;
1729 raw->
halfc[sat - 1][freq] = parity;
1735 raw->
obs.
data[index].
L[freq] = -adr;
1736 raw->
obs.
data[index].
P[freq] = psr;
1737 raw->
obs.
data[index].
D[freq] = (float)dop;
1738 raw->
obs.
data[index].
SNR[freq] = 0.0 <= snr && snr < 255.0 ? (uint16_t)(snr /
SNR_UNIT + 0.5) : 0;
1739 raw->
obs.
data[index].
LLI[freq] = (uint8_t)lli;
1749 double tow, psrh, psrl, psr, adr, adr_rolls, tt, lockt, dop;
1750 int i, week, nobs, prn, sat, stat, sys, parity, lli, index, freq, snr;
1754 tow =
U4(p + 4) / 100.0;
1757 trace(NULL, 2,
"oem3 regd length error: len=%d nobs=%d\n", raw->
len, nobs);
1760 for (i = 0, p += 12; i < nobs; i++, p += 20) {
1763 snr = ((word >> 6) & 0x1F) + 20;
1764 lockt = (word >> 11) / 32.0;
1765 adr = -
I4(p + 4) / 256.0;
1768 dop =
exsign(word >> 4, 28) / 256.0;
1770 stat =
U4(p + 16) >> 8;
1771 freq = (stat >> 20) & 1;
1772 sys = (stat >> 15) & 7;
1773 parity = (stat >> 10) & 1;
1775 trace(NULL, 2,
"oem3 regd satellite number error: sys=%d prn=%d\n", sys, prn);
1778 psr = (psrh * 4294967296.0 + psrl) / 128.0;
1779 adr_rolls = floor((psr / (freq == 0 ?
WL1 :
WL2) - adr) /
MAXVAL + 0.5);
1780 adr = adr +
MAXVAL * adr_rolls;
1782 if (raw->
tobs[sat - 1][freq].
time != 0) {
1784 lli = lockt - raw->
lockt[sat - 1][freq] + 0.05 < tt || parity != raw->
halfc[sat - 1][freq];
1791 raw->
tobs[sat - 1][freq] = raw->
time;
1792 raw->
lockt[sat - 1][freq] = lockt;
1793 raw->
halfc[sat - 1][freq] = parity;
1799 raw->
obs.
data[index].
L[freq] = adr;
1800 raw->
obs.
data[index].
P[freq] = psr;
1801 raw->
obs.
data[index].
D[freq] = (float)dop;
1803 raw->
obs.
data[index].
LLI[freq] = (uint8_t)lli;
1816 trace(NULL, 2,
"oem3 repb length error: len=%d\n", raw->
len);
1821 trace(NULL, 2,
"oem3 repb satellite number error: prn=%d\n", prn);
1825 trace(NULL, 2,
"oem3 repb subframe error: prn=%d\n", prn);
1828 if (!strstr(raw->
opt,
"-EPHALL")) {
1834 raw->
nav.
eph[sat - 1] = eph;
1843 int i, week, prn, nbit;
1845 trace(NULL, 3,
"decode_frmb: len=%d\n", raw->
len);
1856 trace(NULL, 2,
"oem3 frmb satellite number error: prn=%d\n", prn);
1862 for (i = 0; i < 29; i++) {
1873 trace(NULL, 2,
"oem3 ionb length error: len=%d\n", raw->
len);
1876 for (i = 0; i < 8; i++) {
1886 trace(NULL, 2,
"oem3 utcb length error: len=%d\n", raw->
len);
1900 int msg, stat, week, type =
U2(raw->
buff + 4);
1902 trace(NULL, 3,
"decode_oem4: type=%3d len=%d\n", type, raw->
len);
1906 trace(NULL, 2,
"oem4 crc error: type=%3d len=%d\n", type, raw->
len);
1909 msg = (
U1(raw->
buff + 6) >> 4) & 0x3;
1910 stat =
U1(raw->
buff + 13);
1911 week =
U2(raw->
buff + 14);
1913 if (stat == 20 || week == 0) {
1914 trace(NULL, 3,
"oem4 time error: type=%3d msg=%d stat=%d week=%d\n", type, msg, stat, week);
1918 tow =
U4(raw->
buff + 16) * 0.001;
1926 sprintf(raw->
msgtype,
"OEM4 %4d (%4d): %s", type, raw->
len, tstr);
1970 int type =
U4(raw->
buff + 4);
1972 trace(NULL, 3,
"decode_oem3: type=%3d len=%d\n", type, raw->
len);
1976 trace(NULL, 2,
"oem3 checksum error: type=%3d len=%d\n", type, raw->
len);
1980 sprintf(raw->
msgtype,
"OEM3 %4d (%4d):", type, raw->
len);
2037 trace(NULL, 5,
"input_oem4: data=%02x\n", data);
2040 if (raw->
nbyte == 0) {
2049 trace(NULL, 2,
"oem4 length error: len=%d\n", raw->
len);
2068 trace(NULL, 5,
"input_oem3: data=%02x\n", data);
2071 if (raw->
nbyte == 0) {
2080 trace(NULL, 2,
"oem3 length error: len=%d\n", raw->
len);
2101 trace(NULL, 4,
"input_oem4f:\n");
2104 if (raw->
nbyte == 0) {
2106 if ((data = fgetc(fp)) == EOF) {
2117 if (fread(raw->
buff + 3, 7, 1, fp) < 1) {
2123 trace(NULL, 2,
"oem4 length error: len=%d\n", raw->
len);
2127 if (fread(raw->
buff + 10, raw->
len - 6, 1, fp) < 1) {
2144 trace(NULL, 4,
"input_oem3f:\n");
2147 if (raw->
nbyte == 0) {
2149 if ((data = fgetc(fp)) == EOF) {
2160 if (fread(raw->
buff + 3, 1, 9, fp) < 9) {
2166 trace(NULL, 2,
"oem3 length error: len=%d\n", raw->
len);
2170 if (fread(raw->
buff + 12, 1, raw->
len - 12, fp) < (
size_t)(raw->
len - 12)) {
uint32_t rtk_crc32(const uint8_t *buff, int len)
Compute CRC-32 parity for NovAtel raw data.
MRTKLIB Bits Module — Binary bit operations and CRC functions.
double sat2freq(int sat, uint8_t code, const nav_t *nav)
int satsys(int sat, int *prn)
MRTKLIB Broadcast Ephemeris Module — Satellite orbit/clock types and Kepler/GLONASS/SBAS orbit comput...
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 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.
static int decode_galclockb(raw_t *raw)
static int decode_rged(raw_t *raw)
static int sync_oem4(uint8_t *buff, uint8_t data)
static gtime_t adjweek(gtime_t time, double tow)
static int decode_navicephemerisb(raw_t *raw)
static int decode_oem4(raw_t *raw)
static int decode_gpsephemb(raw_t *raw)
static int uraindex(double value)
static int decode_rangecmpb(raw_t *raw)
static int decode_qzssrawephemb(raw_t *raw)
static int checkpri(const char *opt, int sys, int code, int idx)
static int decode_qzssephemerisb(raw_t *raw)
static int decode_galionob(raw_t *raw)
int input_oem4(raw_t *raw, uint8_t data)
static int32_t exsign(uint32_t v, int bits)
static int decode_repb(raw_t *raw)
#define ID_NAVICEPHEMERIS
static void adj_utcweek(gtime_t time, double *utc)
static int decode_rgeb(raw_t *raw)
static int decode_rawwaasframeb(raw_t *raw)
static int decode_gloephemerisb(raw_t *raw)
int input_oem4f(raw_t *raw, FILE *fp)
static int sync_oem3(uint8_t *buff, uint8_t data)
int input_oem3f(raw_t *raw, FILE *fp)
static int decode_rawsbasframeb(raw_t *raw)
static int decode_qzssrawsubframeb(raw_t *raw)
static uint8_t chksum(const uint8_t *buff, int len)
static int sig2code(int sys, int sigtype)
static int decode_galephemerisb(raw_t *raw)
static int decode_qzssionutcb(raw_t *raw)
static int decode_rangeb(raw_t *raw)
static int decode_frmb(raw_t *raw)
static int decode_track_stat(uint32_t stat, int *sys, int *code, int *track, int *plock, int *clock, int *parity, int *halfc)
static int decode_utcb(raw_t *raw)
static int decode_oem3(raw_t *raw)
static int decode_bdsephemerisb(raw_t *raw)
static int decode_ionutcb(raw_t *raw)
static int obsindex(obs_t *obs, gtime_t time, int sat)
static int decode_galinavephemerisb(raw_t *raw)
static int decode_rawephemb(raw_t *raw)
#define ID_QZSSRAWSUBFRAME
static int decode_ionb(raw_t *raw)
int input_oem3(raw_t *raw, uint8_t data)
#define ID_GALINAVEPHEMERIS
int decode_frame(const uint8_t *buff, eph_t *eph, alm_t *alm, double *ion, double *utc)
MRTKLIB Receiver Raw Data Module — Receiver raw data types and decoder functions for various GNSS rec...
static const double ura_eph[]
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.
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.
Observation data collection.
Receiver raw data control type.
uint8_t subfrm[MAXSAT][380]
double lockt[MAXSAT][5+5]
uint8_t halfc[MAXSAT][5+5]
gtime_t tobs[MAXSAT][5+5]