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
81#define P2_11 4.882812500000000E-04
82#define P2_15 3.051757812500000E-05
83#define P2_17 7.629394531250000E-06
84#define P2_19 1.907348632812500E-06
85#define P2_20 9.536743164062500E-07
86#define P2_21 4.768371582031250E-07
87#define P2_23 1.192092895507810E-07
88#define P2_24 5.960464477539063E-08
89#define P2_27 7.450580596923828E-09
90#define P2_29 1.862645149230957E-09
91#define P2_30 9.313225746154785E-10
92#define P2_31 4.656612873077393E-10
93#define P2_32 2.328306436538696E-10
94#define P2_33 1.164153218269348E-10
95#define P2_34 5.820766091346740E-11
96#define P2_35 2.910383045673370E-11
97#define P2_38 3.637978807091710E-12
98#define P2_40 9.094947017729280E-13
99#define P2_43 1.136868377216160E-13
100#define P2_46 1.421085471520200E-14
101#define P2_50 8.881784197001252E-16
102#define P2_55 2.775557561562891E-17
103#define P2_59 1.734723475976810E-18
107#define PREAMB_CNAV 0x8B
109#define ISTXT(c) ('0' <= (c) && (c) <= '~')
110#define ISHEX(c) (('0' <= (c) && (c) <= '9') || ('A' <= (c) && (c) <= 'F'))
111#define ROT_LEFT(val) (((val) << 2) | ((val) >> 6))
114#define U1(p) (*((uint8_t*)(p)))
115#define I1(p) (*((int8_t*)(p)))
116static uint16_t
U2(uint8_t* p) {
121static uint32_t
U4(uint8_t* p) {
126static int16_t
I2(uint8_t* p) {
131static int32_t
I4(uint8_t* p) {
137static float R4(uint8_t* p) {
139 uint8_t* q = (uint8_t*)&value;
141 if (
U4(p) == 0x7FC00000) {
144 for (i = 0; i < 4; i++) {
149static double R8(uint8_t* p) {
151 uint8_t* q = (uint8_t*)&value;
153 if (
U4(p + 4) == 0x7FF80000 &&
U4(p) == 0) {
156 for (i = 0; i < 8; i++) {
167 if (sscanf((
char*)buff,
"%3X", &len) == 1) {
174 return sig ==
'c' || sig ==
'C' || sig ==
'1' || sig ==
'2' || sig ==
'3' || sig ==
'5' || sig ==
'l';
177static int sig2idx(
int sys,
char sig,
int* code) {
178 const uint8_t codes[7][6] = {
240 if (!(*code = codes[j][i])) {
244 return idx < NFREQ ? idx : -1;
247static int checkpri(
int sys,
int code,
const char* opt,
int idx) {
251 if (strstr(opt,
"-GL1W") && idx == 0) {
254 if (strstr(opt,
"-GL1X") && idx == 0) {
257 if (strstr(opt,
"-GL2X") && idx == 1) {
261 return nex < 1 ? -1 : NFREQ;
264 return nex < 2 ? -1 : NFREQ + 1;
267 return nex < 3 ? -1 : NFREQ + 2;
270 if (strstr(opt,
"-RL1P") && idx == 0) {
273 if (strstr(opt,
"-RL2C") && idx == 1) {
277 return nex < 1 ? -1 : NFREQ;
280 return nex < 2 ? -1 : NFREQ + 1;
283 if (strstr(opt,
"-JL1Z") && idx == 0) {
286 if (strstr(opt,
"-JL1X") && idx == 0) {
290 return nex < 1 ? -1 : NFREQ;
293 return nex < 2 ? -1 : NFREQ + 1;
302 for (i = 0; i < len - 1; i++) {
306 return cs == buff[len - 1];
313 if (tow < tow_p - 302400.0) {
315 }
else if (tow > tow_p + 302400.0) {
324 tod_p = ep[3] * 3600.0 + ep[4] * 60.0 + ep[5];
325 if (tod < tod_p - 43200.0) {
327 }
else if (tod > tod_p + 43200.0) {
330 ep[3] = ep[4] = ep[5] = 0.0;
340 trace(NULL, 2,
"time inconsistent: time=%s %s sat=%2d\n", s1, s2, data->
sat);
351 trace(NULL, 3,
"flushobuf: n=%d\n", raw->
obuf.
n);
366 for (i = 0; i <
MAXOBS; i++) {
368 for (j = 0; j < NFREQ + NEXOBS; j++) {
375 for (i = 0; i <
MAXSAT; i++) {
378 return n > 0 ? 1 : 0;
384 uint8_t* p = raw->
buff + 5;
387 trace(NULL, 2,
"javad RT error: len=%d\n", raw->
len);
391 trace(NULL, 2,
"javad RT length error: len=%d\n", raw->
len);
402 if (raw->
tbase >= 1) {
406 if (raw->
tbase >= 1) {
415 sprintf(msg,
" %s",
time_str(time, 3));
422 uint8_t* p = raw->
buff + 5;
425 trace(NULL, 2,
"javad ET checksum error: len=%d\n", raw->
len);
429 trace(NULL, 2,
"javad ET length error: len=%d\n", raw->
len);
432 if (raw->
tod != (
int)
U4(p)) {
433 trace(NULL, 2,
"javad ET inconsistent tod: tod=%d %d\n", raw->
tod,
U4(p));
445 uint8_t* p = raw->
buff + 5;
448 trace(NULL, 2,
"javad RD checksum error: len=%d\n", raw->
len);
452 trace(NULL, 2,
"javad RD length error: len=%d\n", raw->
len);
465 sprintf(msg,
" %04.0f/%02.0f/%02.0f base=%d", ep[0], ep[1], ep[2], raw->
tbase);
468 trace(NULL, 2,
"javad RD lack of preceding RT\n");
472 if (raw->
tbase >= 1) {
484 uint8_t* p = raw->
buff + 5;
487 trace(NULL, 2,
"javad SI checksum error: len=%d\n", raw->
len);
498 }
else if (usi <= 37) {
500 }
else if (usi <= 70) {
502 }
else if (usi <= 119) {
504 }
else if (usi <= 142) {
506 }
else if (usi <= 192) {
508 }
else if (usi <= 197) {
510 }
else if (usi <= 210) {
512 }
else if (usi <= 240) {
514 }
else if (usi <= 247) {
525 raw->
freqn[i] = usi - 45;
528 trace(NULL, 4,
"decode_SI: nsat=raw->obuf.n\n");
532 sprintf(msg,
" nsat=%2d", raw->
obuf.
n);
538 uint8_t* p = raw->
buff + 5;
540 int i, n, ns, slot, sat, index[
MAXOBS];
543 trace(NULL, 2,
"javad NN checksum error: len=%d\n", raw->
len);
546 for (i = n = 0; i < raw->
obuf.
n && i <
MAXOBS; i++) {
553 for (i = 0; i < ns && i < n; i++) {
561 sprintf(msg,
" nsat=%2d", ns);
567 trace(NULL, 3,
"javad GA unsupported\n");
573 trace(NULL, 3,
"javad NA unsupported\n");
579 trace(NULL, 3,
"javad EA unsupported\n");
585 trace(NULL, 3,
"javad WA unsupported\n");
591 trace(NULL, 3,
"javad QA unsupported\n");
597 trace(NULL, 3,
"javad CA unsupported\n");
603 trace(NULL, 3,
"javad IA unsupported\n");
610 double toc, sqrtA, tt;
612 int sat, prn, tow, flag, week, navtype, sigtype, set = 0;
614 uint8_t* p = raw->
buff + 5;
616 trace(NULL, 3,
"decode_eph: sys=%2d prn=%3d\n", sys,
U1(p));
618 if (strstr(raw->
opt,
"-GALINAV")) {
621 if (strstr(raw->
opt,
"-GALFNAV")) {
683 eph.
A = sqrtA * sqrtA;
687 sprintf(msg,
" prn=%3d iode=%3d iodc=%3d toes=%6.0f", prn, eph.
iode, eph.
iodc, eph.
toes);
690 if (!(sat =
satno(sys, prn))) {
691 trace(NULL, 2,
"javad ephemeris satellite error: sys=%d prn=%d\n", sys, prn);
695 eph.
flag = (flag >> 1) & 1;
696 eph.
code = (flag >> 2) & 3;
703 if (tt < -302400.0) {
705 }
else if (tt > 302400.0) {
713 if (!(sat =
satno(sys, prn))) {
714 trace(NULL, 2,
"javad ephemeris satellite error: sys=%d prn=%d\n", sys, prn);
724 set = (navtype == 1) ? 1 : 0;
725 if (!(
eph_sel & 1) && set == 0) {
728 if (!(
eph_sel & 2) && set == 1) {
731 eph.
code = set ? (1 << 1) + (1 << 8) : (1 << 0) + (1 << 2) + (1 << 9);
735 eph.
week = week + 1024;
740 if (tt < -302400.0) {
742 }
else if (tt > 302400.0) {
750 if (!(sat =
satno(sys, prn))) {
751 trace(NULL, 2,
"javad ephemeris satellite error: sys=%d prn=%d\n", sys, prn);
754 eph.
type = (prn >= 6 && prn <= 58) ? 0 : 1;
780 if (!strstr(raw->
opt,
"-EPHALL")) {
788 raw->
nav.
eph[sat - 1] = eph;
796 trace(NULL, 2,
"javad GE checksum error: len=%d\n", raw->
len);
799 if (raw->
len < 128) {
800 trace(NULL, 2,
"javad GE length error: len=%d\n", raw->
len);
811 uint8_t* p = raw->
buff + 5;
814 trace(NULL, 2,
"javad NE checksum error: len=%d\n", raw->
len);
817 if (raw->
len >= 85) {
826 geph.
svh =
U1(p) & 0x1;
830 geph.
pos[0] =
R8(p) * 1E3;
832 geph.
pos[1] =
R8(p) * 1E3;
834 geph.
pos[2] =
R8(p) * 1E3;
836 geph.
vel[0] =
R4(p) * 1E3;
838 geph.
vel[1] =
R4(p) * 1E3;
840 geph.
vel[2] =
R4(p) * 1E3;
842 geph.
acc[0] =
R4(p) * 1E3;
844 geph.
acc[1] =
R4(p) * 1E3;
846 geph.
acc[2] =
R4(p) * 1E3;
853 trace(NULL, 2,
"javad NE length error: len=%d\n", raw->
len);
856 if (raw->
len >= 93) {
863 sprintf(msg,
" prn=%2d frq=%2d tk=%6d tb=%4d", prn, geph.
frq, tk, tb);
866 trace(NULL, 2,
"javad NE satellite error: prn=%d\n", prn);
872 geph.
iode = (tb / 900) & 0x7F;
878 if (fabs(tt) > 3600.0) {
879 trace(NULL, 3,
"javad NE illegal toe: prn=%2d tt=%6.0f\n", prn, tt);
884 trace(NULL, 2,
"javad NE glonass fcn changed: prn=%2d fcn=%2d->%2d\n", prn, raw->
nav.
geph[prn - 1].
frq,
888 if (!strstr(raw->
opt,
"-EPHALL")) {
900 trace(NULL, 2,
"javad EN checksum error: len=%d\n", raw->
len);
903 if (raw->
len < 150) {
904 trace(NULL, 2,
"javad EN length error: len=%d\n", raw->
len);
915 uint8_t* p = raw->
buff + 5;
918 trace(NULL, 2,
"javad WE checksum error: len=%d\n", raw->
len);
922 trace(NULL, 2,
"javad WE length error: len=%d\n", raw->
len);
931 for (i = 0; i < 3; i++) {
935 for (i = 0; i < 3; i++) {
939 for (i = 0; i < 3; i++) {
953 sprintf(msg,
" prn=%3d tod=%6d", prn, tod);
956 trace(NULL, 2,
"javad WE satellite error: prn=%d\n", prn);
962 if (!strstr(raw->
opt,
"-EPHALL")) {
975 trace(NULL, 2,
"javad QE checksum error: len=%d\n", raw->
len);
978 if (raw->
len < 128) {
979 trace(NULL, 2,
"javad QE length error: len=%d\n", raw->
len);
987 trace(NULL, 2,
"javad CN checksum error: len=%d\n", raw->
len);
990 if (raw->
len < 133) {
991 trace(NULL, 2,
"javad QE length error: len=%d\n", raw->
len);
999 trace(NULL, 2,
"javad IE checksum error: len=%d\n", raw->
len);
1002 if (raw->
len < 129) {
1003 trace(NULL, 2,
"javad IE length error: len=%d\n", raw->
len);
1010 uint8_t* p = raw->
buff + 5;
1013 trace(NULL, 2,
"javad UO checksum error: len=%d\n", raw->
len);
1016 if (raw->
len < 29) {
1017 trace(NULL, 2,
"javad UO length error: len=%d\n", raw->
len);
1033 trace(NULL, 3,
"javad NU unsupported\n");
1039 trace(NULL, 3,
"javad EU unsupported\n");
1045 trace(NULL, 3,
"javad WU unsupported\n");
1051 trace(NULL, 3,
"javad QU unsupported\n");
1058 uint8_t* p = raw->
buff + 5;
1061 trace(NULL, 2,
"javad IO checksum error: len=%d\n", raw->
len);
1064 if (raw->
len < 44) {
1065 trace(NULL, 2,
"javad IO length error: len=%d\n", raw->
len);
1069 for (i = 0; i < 8; i++) {
1083 if (!strstr(raw->
opt,
"-EPHALL")) {
1089 raw->
nav.
eph[sat - 1] = eph;
1099 utc[3] += week / 256 * 256;
1100 if (utc[3] < week - 127) {
1102 }
else if (utc[3] > week + 127) {
1105 utc[5] += utc[3] / 256 * 256;
1106 if (utc[5] < utc[3] - 127) {
1108 }
else if (utc[5] > utc[3] + 127) {
1114 double ion[8], utc[8];
1115 int sys =
satsys(sat, NULL);
1133 uint8_t subfrm[30], *p;
1134 int i, id, sys =
satsys(sat, NULL);
1137 trace(NULL, 2,
"navigation subframe system error: sat=%d\n", sat);
1141 trace(NULL, 2,
"navigation subframe length error: len=%d\n", len);
1144 for (i = 0, p = buff; i < 10; i++, p += 4) {
1145 setbitu(subfrm, 24 * i, 24,
U4(p) >> 6);
1148 if (id < 1 || id > 5) {
1149 trace(NULL, 2,
"navigation subframe format error: sat=%d id=%d\n", sat,
id);
1152 memcpy(raw->
subfrm[sat - 1] + (
id - 1) * 30, subfrm, 30);
1156 }
else if (
id == 4 ||
id == 5) {
1163 uint8_t msg[1024] = {0};
1164 int i, j, preamb, prn, msgid, tow, alert;
1166 trace(NULL, 3,
"decode_L2nav len=%2d sat=%2d L5 CNAV\n", len, sat);
1168 for (i = 0; i < len; i++) {
1169 for (j = 0; j < 4; j++) {
1170 msg[3 - j + i * 4] = buff[j + i * 4];
1186 trace(NULL, 2,
"javad *d sat=%2d L2 CNAV preamble error preamb=%02X\n", preamb);
1189 trace(NULL, 3,
"L2CNAV: sat=%2d prn=%2d msgid=%2d tow=%6d alert=%d\n", sat, prn, msgid, tow, alert);
1195 uint8_t msg[1024] = {0};
1196 int i, j, preamb, prn, msgid, tow, alert;
1198 trace(NULL, 3,
"decode_L5nav len=%2d sat=%2d L5 CNAV\n", len, sat);
1200 for (i = 0; i < len; i++) {
1201 for (j = 0; j < 4; j++) {
1202 msg[3 - j + i * 4] = buff[j + i * 4];
1218 trace(NULL, 2,
"javad *d sat=%2d L5 CNAV preamble error preamb=%02X\n", preamb);
1221 trace(NULL, 3,
"L5CNAV: sat=%2d prn=%2d msgid=%2d tow=%6d alert=%d\n", sat, prn, msgid, tow, alert);
1227 trace(NULL, 3,
"javad *d len=%2d sat=%2d L1C CNAV2 unsupported\n", len, sat);
1233 int i, n, siz, sat, prn, stat = 0;
1234 uint8_t* p = raw->
buff + 5;
1237 trace(NULL, 2,
"javad nD checksum error: sys=%d len=%d\n", sys, raw->
len);
1242 n = (raw->
len - 7) / siz;
1245 trace(NULL, 2,
"javad nD length error: sys=%d len=%d\n", sys, raw->
len);
1248 for (i = 0; i < n; i++, p += siz) {
1249 trace(NULL, 3,
"decode_*D: sys=%2d prn=%3d\n", sys,
U1(p));
1252 if (!(sat =
satno(sys, prn))) {
1253 trace(NULL, 2,
"javad nD satellite error: sys=%d prn=%d\n", sys, prn);
1262 uint8_t* p = raw->
buff + 5;
1264 int sat, prn, time, type, len;
1267 trace(NULL, 2,
"javad nd checksum error: sys=%d len=%d\n", sys, raw->
len);
1270 trace(NULL, 3,
"decode_*d: sys=%2d prn=%3d\n", sys,
U1(p));
1280 if (raw->
len != 13 + len * 4) {
1281 trace(NULL, 2,
"javad nd length error: sys=%d len=%d\n", sys, raw->
len);
1286 sprintf(msg,
" prn=%3d time=%7d type=%d", prn, time, type);
1288 if (!(sat =
satno(sys, prn))) {
1289 trace(NULL, 2,
"javad nd satellite error: sys=%d prn=%d\n", sys, prn);
1292 trace(NULL, 4,
"sat=%2d time=%7d type=%d len=%3d\n", sat, time, type, len);
1308 trace(NULL, 3,
"javad LD unsupported\n");
1315 uint8_t* p = raw->
buff + 5;
1317 int i, sat, prn, frq, time, type, len, id;
1320 trace(NULL, 2,
"javad lD checksum error: len=%d\n", raw->
len);
1323 trace(NULL, 3,
"decode_lD: prn=%3d\n",
U1(p));
1336 if (raw->
len != 14 + len * 4) {
1337 trace(NULL, 2,
"javad lD length error: len=%d\n", raw->
len);
1342 sprintf(msg,
" prn=%2d frq=%2d time=%7d type=%d", prn, frq, time, type);
1345 trace(NULL, 2,
"javad lD satellite error: prn=%d\n", prn);
1349 trace(NULL, 3,
"javad lD type unsupported: type=%d\n", type);
1352 if ((
id = (
U4(p) >> 20) & 0xF) < 1) {
1357 for (i = 0; i < 4; i++) {
1358 setbitu(raw->
subfrm[sat - 1] + (
id - 1) * 10, i * 25, i < 3 ? 25 : 2,
U4(p + 4 * i) >> (i < 3 ? 0 : 23));
1371 if (!strstr(raw->
opt,
"-EPHALL")) {
1376 raw->
nav.
geph[prn - 1] = geph;
1382 trace(NULL, 3,
"javad ED unsupported\n");
1388 trace(NULL, 3,
"javad cd unsupported\n");
1394 trace(NULL, 3,
"javad id unsupported\n");
1400 int i, prn, tow, tow_p, week;
1402 uint8_t* p = raw->
buff + 5;
1405 trace(NULL, 2,
"javad WD checksum error: len=%d\n", raw->
len);
1408 if (raw->
len < 45) {
1409 trace(NULL, 2,
"javad WD length error: len=%d\n", raw->
len);
1412 trace(NULL, 3,
"decode_WD: prn=%3d\n",
U1(p));
1421 sprintf(msg,
" prn=%3d tow=%6d", prn, tow);
1424 trace(NULL, 2,
"javad WD satellite error: prn=%d\n", prn);
1437 if (tow < tow_p - 302400.0) {
1439 }
else if (tow > tow_p + 302400.0) {
1444 for (i = 0; i < 29; i++) {
1452 uint8_t* p = raw->
buff + 5;
1454 int i, idx, code, sat, sys;
1461 trace(NULL, 2,
"javad R%c checksum error: len=%d\n", sig, raw->
len);
1464 if (raw->
len != raw->
obuf.
n * 8 + 6) {
1465 trace(NULL, 2,
"javad R%c length error: n=%d len=%d\n", sig, raw->
obuf.
n, raw->
len);
1476 if (!(sys =
satsys(sat, NULL))) {
1483 raw->
prCA[sat - 1] = prm;
1486 if ((idx =
sig2idx(sys, sig, &code)) < 0) {
1490 if ((idx =
checkpri(sys, code, raw->
opt, idx)) >= 0) {
1502 uint8_t* p = raw->
buff + 5;
1504 int i, idx, code, pr, sat, sys;
1511 trace(NULL, 2,
"javad r%c checksum error: len=%d\n", sig, raw->
len);
1514 if (raw->
len != raw->
obuf.
n * 4 + 6) {
1515 trace(NULL, 2,
"javad r%c length error: n=%d len=%d\n", sig, raw->
obuf.
n, raw->
len);
1522 if (!(sys =
satsys(sat, NULL))) {
1526 if (pr == 0x7FFFFFFF) {
1527 trace(NULL, 3,
"javad r%c value missing: sat=%2d\n", sig, sat);
1532 prm = (pr * 1E-11 + 0.125) *
CLIGHT;
1534 prm = (pr * 2E-11 + 0.125) *
CLIGHT;
1536 prm = (pr * 2E-11 + 0.105) *
CLIGHT;
1538 prm = (pr * 2E-11 + 0.085) *
CLIGHT;
1540 prm = (pr * 2E-11 + 0.105) *
CLIGHT;
1542 prm = (pr * 1E-11 + 0.075) *
CLIGHT;
1546 raw->
prCA[sat - 1] = prm;
1549 if ((idx =
sig2idx(sys, sig, &code)) < 0) {
1553 if ((idx =
checkpri(sys, code, raw->
opt, idx)) >= 0) {
1565 uint8_t* p = raw->
buff + 5;
1567 int i, idx, code, sat, sys;
1574 trace(NULL, 2,
"javad %cR checksum error: len=%d\n", sig, raw->
len);
1577 if (raw->
len != raw->
obuf.
n * 4 + 6) {
1578 trace(NULL, 2,
"javad %cR length error: n=%d len=%d\n", sig, raw->
obuf.
n, raw->
len);
1589 if (!(sys =
satsys(sat, NULL)) || raw->
prCA[sat - 1] == 0.0) {
1593 if ((idx =
sig2idx(sys, sig, &code)) < 0) {
1597 if ((idx =
checkpri(sys, code, raw->
opt, idx)) >= 0) {
1609 uint8_t* p = raw->
buff + 5;
1612 int i, idx, code, sat, sys;
1619 trace(NULL, 2,
"javad %cr checksum error: len=%d\n", sig, raw->
len);
1622 if (raw->
len != raw->
obuf.
n * 2 + 6) {
1623 trace(NULL, 2,
"javad %cR length error: n=%d len=%d\n", sig, raw->
obuf.
n, raw->
len);
1629 if (pr == (int16_t)0x7FFF) {
1634 if (!(sys =
satsys(sat, NULL)) || raw->
prCA[sat - 1] == 0.0) {
1638 prm = (pr * 1E-11 + 2E-7) *
CLIGHT + raw->
prCA[sat - 1];
1640 if ((idx =
sig2idx(sys, sig, &code)) < 0) {
1644 if ((idx =
checkpri(sys, code, raw->
opt, idx)) >= 0) {
1656 uint8_t* p = raw->
buff + 5;
1658 int i, idx, code, sys;
1665 trace(NULL, 2,
"javad P%c checksum error: len=%d\n", sig, raw->
len);
1668 if (raw->
len != raw->
obuf.
n * 8 + 6) {
1669 trace(NULL, 2,
"javad P%c length error: n=%d len=%d\n", sig, raw->
obuf.
n, raw->
len);
1683 if ((idx =
sig2idx(sys, sig, &code)) < 0) {
1687 if ((idx =
checkpri(sys, code, raw->
opt, idx)) >= 0) {
1699 uint8_t* p = raw->
buff + 5;
1701 int i, idx, code, sys;
1708 trace(NULL, 2,
"javad p%c checksum error: len=%d\n", sig, raw->
len);
1711 if (raw->
len != raw->
obuf.
n * 4 + 6) {
1712 trace(NULL, 2,
"javad p%c length error: n=%d len=%d\n", sig, raw->
obuf.
n, raw->
len);
1718 if (cp == 0xFFFFFFFF) {
1726 if ((idx =
sig2idx(sys, sig, &code)) < 0) {
1730 if ((idx =
checkpri(sys, code, raw->
opt, idx)) >= 0) {
1742 uint8_t* p = raw->
buff + 5;
1743 double cp, rcp, freq;
1744 int i, idx, code, sat, sys;
1751 trace(NULL, 2,
"javad %cP checksum error: len=%d\n", sig, raw->
len);
1754 if (raw->
len != raw->
obuf.
n * 4 + 6) {
1755 trace(NULL, 2,
"javad %cP length error: n=%d len=%d\n", sig, raw->
obuf.
n, raw->
len);
1766 if (!(sys =
satsys(sat, NULL)) || raw->
prCA[sat - 1] == 0.0) {
1770 if ((idx =
sig2idx(sys, sig, &code)) < 0) {
1774 if ((idx =
checkpri(sys, code, raw->
opt, idx)) >= 0) {
1780 cp = (rcp + raw->
prCA[sat - 1] /
CLIGHT) * freq;
1790 uint8_t* p = raw->
buff + 5;
1792 int i, idx, code, rcp, sat, sys;
1799 trace(NULL, 2,
"javad %cp checksum error: len=%d\n", sig, raw->
len);
1802 if (raw->
len != raw->
obuf.
n * 4 + 6) {
1803 trace(NULL, 2,
"javad %cp length error: n=%d len=%d\n", sig, raw->
obuf.
n, raw->
len);
1809 if (rcp == 0x7FFFFFFF) {
1814 if (!(sys =
satsys(sat, NULL)) || raw->
prCA[sat - 1] == 0.0) {
1818 if ((idx =
sig2idx(sys, sig, &code)) < 0) {
1822 if ((idx =
checkpri(sys, code, raw->
opt, idx)) >= 0) {
1838 uint8_t* p = raw->
buff + 5;
1840 int i, idx, code, dp, sat, sys;
1847 trace(NULL, 2,
"javad D%c checksum error: len=%d\n", sig, raw->
len);
1850 if (raw->
len != raw->
obuf.
n * 4 + 6) {
1851 trace(NULL, 2,
"javad D%c length error: n=%d len=%d\n", sig, raw->
obuf.
n, raw->
len);
1857 if (dp == 0x7FFFFFFF) {
1862 if (!(sys =
satsys(sat, NULL))) {
1869 raw->
dpCA[sat - 1] = dop;
1872 if ((idx =
sig2idx(sys, sig, &code)) < 0) {
1876 if ((idx =
checkpri(sys, code, raw->
opt, idx)) >= 0) {
1887 uint8_t* p = raw->
buff + 5;
1890 int i, idx, code, sat, sys;
1897 trace(NULL, 2,
"javad %cd checksum error: len=%d\n", sig, raw->
len);
1900 if (raw->
len != raw->
obuf.
n * 2 + 6) {
1901 trace(NULL, 2,
"javad %cd length error: n=%d len=%d\n", sig, raw->
obuf.
n, raw->
len);
1907 if (rdp == (int16_t)0x7FFF) {
1912 if (!(sys =
satsys(sat, NULL)) || raw->
dpCA[sat - 1] == 0.0) {
1916 if ((idx =
sig2idx(sys, sig, &code)) < 0) {
1920 if ((idx =
checkpri(sys, code, raw->
opt, idx)) >= 0) {
1926 dop = (-rdp + raw->
dpCA[sat - 1] * 1E4) * fn / f1 * 1E-4;
1935 uint8_t* p = raw->
buff + 5;
1937 int i, idx, code, sys;
1944 trace(NULL, 2,
"javad E%c checksum error: len=%d\n", sig, raw->
len);
1948 trace(NULL, 2,
"javad E%c length error: n=%d len=%d\n", sig, raw->
obuf.
n, raw->
len);
1962 if ((idx =
sig2idx(sys, sig, &code)) < 0) {
1966 if ((idx =
checkpri(sys, code, raw->
opt, idx)) >= 0) {
1977 uint8_t* p = raw->
buff + 5;
1979 int i, idx, code, sys;
1986 trace(NULL, 2,
"javad %cE checksum error: len=%d\n", sig, raw->
len);
1990 trace(NULL, 2,
"javad %cE length error: n=%d len=%d\n", sig, raw->
obuf.
n, raw->
len);
2004 if ((idx =
sig2idx(sys, sig, &code)) < 0) {
2008 if ((idx =
checkpri(sys, code, raw->
opt, idx)) >= 0) {
2019 uint8_t* p = raw->
buff + 5;
2021 int i, idx, code, sat, sys;
2028 trace(NULL, 2,
"javad F%c checksum error: len=%d\n", sig, raw->
len);
2031 if (raw->
len != raw->
obuf.
n * 2 + 6) {
2032 trace(NULL, 2,
"javad F%c length error: n=%d len=%d\n", sig, raw->
obuf.
n, raw->
len);
2038 if (flags == 0xFFFF) {
2043 if (!(sys =
satsys(sat, NULL))) {
2047 if ((idx =
sig2idx(sys, sig, &code)) < 0) {
2051 if ((idx =
checkpri(sys, code, raw->
opt, idx)) >= 0) {
2059 if (!(flags&0x40)||!(flags&0x100)) {
2071 uint8_t* p = raw->
buff + 5;
2073 if (raw->
obuf.
n == 0) {
2078 trace(NULL, 2,
"javad TC checksum error: len=%d\n", raw->
len);
2081 if (raw->
len != raw->
obuf.
n * 2 + 6) {
2082 trace(NULL, 2,
"javad TC length error: n=%d len=%d\n", raw->
obuf.
n, raw->
len);
2097 tt_p = (uint16_t)raw->
lockt[sat - 1][0];
2099 trace(NULL, 4,
"%s: sat=%2d tt=%6d->%6d\n",
time_str(raw->
time, 3), sat, tt_p, tt);
2102 if (tt == 0 || tt < tt_p) {
2103 trace(NULL, 3,
"decode_TC: loss-of-lock detected: t=%s sat=%2d tt=%6d->%6d\n",
time_str(raw->
time, 3), sat,
2107 raw->
lockt[sat - 1][0] = tt;
2113 char* p = (
char*)raw->
buff;
2115 trace(NULL, 3,
"decode_javad: type=%2.2s len=%3d\n", p, raw->
len);
2118 sprintf(raw->
msgtype,
"JAVAD %2.2s (%4d)", p, raw->
len);
2120 if (!strncmp(p,
"~~", 2)) {
2124 if (strstr(raw->
opt,
"-NOET")) {
2125 if (!strncmp(p,
"::", 2)) {
2129 if (!strncmp(p,
"RD", 2)) {
2132 if (!strncmp(p,
"SI", 2)) {
2135 if (!strncmp(p,
"NN", 2)) {
2138 if (!strncmp(p,
"GA", 2)) {
2141 if (!strncmp(p,
"NA", 2)) {
2144 if (!strncmp(p,
"EA", 2)) {
2147 if (!strncmp(p,
"WA", 2)) {
2150 if (!strncmp(p,
"QA", 2)) {
2153 if (!strncmp(p,
"CA", 2)) {
2156 if (!strncmp(p,
"IA", 2)) {
2160 if (!strncmp(p,
"GE", 2)) {
2163 if (!strncmp(p,
"NE", 2)) {
2166 if (!strncmp(p,
"EN", 2)) {
2169 if (!strncmp(p,
"WE", 2)) {
2172 if (!strncmp(p,
"QE", 2)) {
2175 if (!strncmp(p,
"CN", 2)) {
2178 if (!strncmp(p,
"IE", 2)) {
2182 if (!strncmp(p,
"UO", 2)) {
2185 if (!strncmp(p,
"NU", 2)) {
2188 if (!strncmp(p,
"EU", 2)) {
2191 if (!strncmp(p,
"WU", 2)) {
2194 if (!strncmp(p,
"QU", 2)) {
2197 if (!strncmp(p,
"IO", 2)) {
2201 if (!strncmp(p,
"GD", 2)) {
2204 if (!strncmp(p,
"QD", 2)) {
2207 if (!strncmp(p,
"gd", 2)) {
2210 if (!strncmp(p,
"qd", 2)) {
2213 if (!strncmp(p,
"ED", 2)) {
2217 if (!strncmp(p,
"cd", 2)) {
2220 if (!strncmp(p,
"id", 2)) {
2223 if (!strncmp(p,
"LD", 2)) {
2226 if (!strncmp(p,
"lD", 2)) {
2229 if (!strncmp(p,
"WD", 2)) {
2232 if (!strncmp(p,
"TC", 2)) {
2280 uint8_t p = buff[0];
2289 return (p ==
'\r' || p ==
'\n') &&
ISTXT(buff[0]) &&
ISTXT(buff[1]) &&
ISHEX(buff[2]) &&
ISHEX(buff[3]) &&
2295 for (i = 0; i < 5; i++) {
2326 trace(NULL, 5,
"input_javad: data=%02x\n", data);
2329 if (raw->
nbyte == 0) {
2334 trace(NULL, 2,
"javad message length error: len=%d\n", len);
2358 raw->
buff[4] =
'\n';
2376 int i, data, len, stat;
2378 trace(NULL, 4,
"input_javadf:\n");
2386 if (raw->
nbyte == 0) {
2388 if ((data = fgetc(fp)) == EOF) {
2400 trace(NULL, 2,
"javad message length error: len=%3.3s\n", raw->
buff + 2);
2407 if (fread(raw->
buff + 5, 1, raw->
len - 5, fp) < (
size_t)(raw->
len - 5)) {
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.
MRTKLIB Bits Module — Binary bit operations and CRC functions.
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)
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_javad(raw_t *raw)
static int decode_cd(raw_t *raw)
static gtime_t adjweek(gtime_t time, double tow)
static int sync_javad(uint8_t *buff, uint8_t data)
static int decode_WA(raw_t *raw)
static int decode_xE(raw_t *raw, char sig)
static int decode_SI(raw_t *raw)
static int decode_nD(raw_t *raw, int sys)
static gtime_t adjday(gtime_t time, double tod)
static int decode_QA(raw_t *raw)
static int decode_CA(raw_t *raw)
static int decode_xr(raw_t *raw, char sig)
static void adj_utcweek(gtime_t time, double *utc)
static int decode_Rx(raw_t *raw, char sig)
int input_javadf(raw_t *raw, FILE *fp)
static int decode_GE(raw_t *raw)
int input_javad(raw_t *raw, uint8_t data)
static int decode_WE(raw_t *raw)
static int decode_Px(raw_t *raw, char sig)
static int decode_xP(raw_t *raw, char sig)
static int decode_Fx(raw_t *raw, char sig)
static int decode_L1eph(int sat, raw_t *raw)
static int decode_QU(raw_t *raw)
static int decode_L1ionutc(int sat, raw_t *raw)
static void clearbuff(raw_t *raw)
static int decode_nd(raw_t *raw, int sys)
static int decodelen(const uint8_t *buff)
static int decode_IE(raw_t *raw)
static int decode_GA(raw_t *raw)
static int checkpri(int sys, int code, const char *opt, int idx)
static int decode_EU(raw_t *raw)
static int decode_L2nav(uint8_t *buff, int len, int sat, raw_t *raw)
static int decode_EA(raw_t *raw)
static int decode_NN(raw_t *raw)
static int decode_px(raw_t *raw, char sig)
static int decode_LD(raw_t *raw)
static int decode_NA(raw_t *raw)
static int decode_NU(raw_t *raw)
static int decode_WD(raw_t *raw)
static int decode_id(raw_t *raw)
static int sig2idx(int sys, char sig, int *code)
static void startfile(raw_t *raw)
static int decode_IA(raw_t *raw)
static int decode_CN(raw_t *raw)
static int decode_xR(raw_t *raw, char sig)
static int settag(obsd_t *data, gtime_t time)
static int endfile(raw_t *raw)
static int decode_NE(raw_t *raw)
static int decode_EN(raw_t *raw)
static int decode_QE(raw_t *raw)
static int decode_L5nav(uint8_t *buff, int len, int sat, raw_t *raw)
static int decode_Dx(raw_t *raw, char sig)
static int decode_Ex(raw_t *raw, char sig)
static int decode_UO(raw_t *raw)
static int decode_ED(raw_t *raw)
static int is_meas(char sig)
static int checksum(uint8_t *buff, int len)
static int decode_ET(raw_t *raw)
static int decode_L1Cnav(uint8_t *buff, int len, int sat, raw_t *raw)
static int decode_xp(raw_t *raw, char sig)
static int decode_RT(raw_t *raw)
static int decode_eph(raw_t *raw, int sys)
static int decode_rx(raw_t *raw, char sig)
static int decode_L1nav(uint8_t *buff, int len, int sat, raw_t *raw)
static int decode_RD(raw_t *raw)
static int decode_IO(raw_t *raw)
static int decode_WU(raw_t *raw)
static int decode_xd(raw_t *raw, char sig)
static int decode_lD(raw_t *raw)
static int decode_TC(raw_t *raw)
static int flushobuf(raw_t *raw)
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)
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 epoch2time(const double *ep)
Convert calendar day/time to gtime_t struct.
gtime_t gpst2time(int week, double sec)
Convert GPS week/tow to gtime_t.
void time2epoch(gtime_t t, double *ep)
Convert gtime_t struct to calendar day/time.
void time2str(gtime_t t, char *s, int n)
Convert gtime_t struct to string.
gtime_t gpst2utc(gtime_t t)
Convert GPS time to UTC considering leap seconds.
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 timeadd(gtime_t t, double sec)
Add seconds to gtime_t.
char * time_str(gtime_t t, int n)
Get time string (not reentrant).
gtime_t utc2gpst(gtime_t t)
Convert UTC to GPS time considering leap seconds.
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]