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
114#define BNXSYNC1R 0xD2
115#define BNXSYNC2R 0xF2
116#define BNXSYNC3R 0xD8
117#define BNXSYNC4R 0xF8
119#define MIN(x, y) ((x) < (y) ? (x) : (y))
120#define SQR(x) ((x) * (x))
123static const double ura_eph[] = {2.4, 3.4, 4.85, 6.85, 9.65, 13.65, 24.0, 48.0,
124 96.0, 192.0, 384.0, 768.0, 1536.0, 3072.0, 6144.0, 0.0};
126#define U1(p) (*((uint8_t*)(p)))
127#define I1(p) (*((int8_t*)(p)))
129static uint16_t
U2(uint8_t* p) {
131 uint8_t* q = (uint8_t*)&value + 1;
133 for (i = 0; i < 2; i++) {
138static uint32_t
U4(uint8_t* p) {
140 uint8_t* q = (uint8_t*)&value + 3;
142 for (i = 0; i < 4; i++) {
147static int32_t
I4(uint8_t* p) {
return (int32_t)
U4(p); }
148static float R4(uint8_t* p) {
150 uint8_t* q = (uint8_t*)&value + 3;
152 for (i = 0; i < 4; i++) {
157static double R8(uint8_t* p) {
159 uint8_t* q = (uint8_t*)&value + 7;
161 for (i = 0; i < 8; i++) {
167static int getbnxi(uint8_t* p, uint32_t* val) {
170 for (*val = 0, i = 0; i < 3; i++) {
171 *val = (*val << 7) + (p[i] & 0x7F);
172 if (!(p[i] & 0x80)) {
176 *val = (*val << 8) + p[i];
180static uint8_t
csum8(
const uint8_t* buff,
int len) {
184 for (i = 0; i < len; i++) {
194 if (tow < tow_p - 302400.0) {
196 }
else if (tow > tow_p + 302400.0) {
205 tod_p = ep[3] * 3600.0 + ep[4] * 60.0 + ep[5];
206 if (tod < tod_p - 43200.0) {
208 }
else if (tod > tod_p + 43200.0) {
211 ep[3] = ep[4] = ep[5] = 0.0;
217 for (i = 0; i < 15; i++) {
227 return (
int)((value) / 0.01);
230 return (
int)((value - 0.5) / 0.02) + 50;
233 return (
int)((value - 1.0) / 0.04) + 75;
236 return (
int)((value - 2.0) / 0.16) + 100;
242 const static double gpst0[] = {1980, 1, 6, 0, 0, 0};
246 uint32_t min, qsec, src, fid = 0, flen = 0;
259 msg += sprintf(msg,
" time=%s src=%d",
time_str(raw->
time, 0), src);
261 while (p - buff < len) {
263 if (p - buff >= len) {
267 if (fid <= 0x0c || (fid >= 0x0f && fid <= 0x1c) || (fid >= 0x20 && fid <= 0x22) || fid == 0x7f) {
269 sprintf(str,
"%.*s",
MIN(flen,
MAXANT - 1), (
char*)p);
272 msg += sprintf(msg,
" [%02x]%s", fid, str);
276 }
else if (fid == 0x09) {
278 }
else if (fid == 0x17) {
280 }
else if (fid == 0x18) {
282 }
else if (fid == 0x19) {
284 }
else if (fid == 0x1a) {
286 }
else if (fid == 0x1b) {
290 }
else if (fid == 0x1d || fid == 0x1e || fid == 0x1f) {
291 if (fid == 0x1d || fid == 0x1e) {
295 for (i = 0; i < 3; i++) {
300 msg += sprintf(msg,
" [%02x]%.3f/%.3f/%.3f", fid, x[0], x[1], x[2]);
304 }
else if (fid == 0x1e) {
308 }
else if (fid == 0x1f) {
316 trace(NULL, 2,
"BINEX 0x00: unsupported field fid=0x%02x\n", fid);
324 trace(NULL, 2,
"BINEX 0x01-00: unsupported message\n");
331 double tow, ura, sqrtA;
334 trace(NULL, 4,
"BINEX 0x01-01: len=%d\n", len);
393 trace(NULL, 2,
"BINEX 0x01-01: length error len=%d\n", len);
397 trace(NULL, 2,
"BINEX 0x01-01: satellite error prn=%d\n", prn);
406 eph.
fit = flag & 0xFF;
407 eph.
flag = (flag >> 8) & 0x01;
408 eph.
code = (flag >> 9) & 0x03;
411 if (!strstr(raw->
opt,
"-EPHALL")) {
416 raw->
nav.
eph[sat - 1] = eph;
425 double tod, tof, tau_gps;
426 int prn, sat, day, leap;
428 trace(NULL, 4,
"BINEX 0x01-02: len=%d\n", len);
443 geph.
pos[0] =
R8(p) * 1E3;
445 geph.
vel[0] =
R8(p) * 1E3;
447 geph.
acc[0] =
R8(p) * 1E3;
449 geph.
pos[1] =
R8(p) * 1E3;
451 geph.
vel[1] =
R8(p) * 1E3;
453 geph.
acc[1] =
R8(p) * 1E3;
455 geph.
pos[2] =
R8(p) * 1E3;
457 geph.
vel[2] =
R8(p) * 1E3;
459 geph.
acc[2] =
R8(p) * 1E3;
461 geph.
svh =
U1(p) & 7;
473 trace(NULL, 2,
"BINEX 0x01-02: length error len=%d\n", len);
477 trace(NULL, 2,
"BINEX 0x01-02: satellite error prn=%d\n", prn);
486 geph.
iode = (int)(fmod(tod, 86400.0) / 900.0 + 0.5);
488 if (!strstr(raw->
opt,
"-EPHALL")) {
503 double tow, tod, tof;
504 int prn, sat, week, iodn;
506 trace(NULL, 4,
"BINEX 0x01-03: len=%d\n", len);
521 seph.
pos[0] =
R8(p) * 1E3;
523 seph.
vel[0] =
R8(p) * 1E3;
525 seph.
acc[0] =
R8(p) * 1E3;
527 seph.
pos[1] =
R8(p) * 1E3;
529 seph.
vel[1] =
R8(p) * 1E3;
531 seph.
acc[1] =
R8(p) * 1E3;
533 seph.
pos[2] =
R8(p) * 1E3;
535 seph.
vel[2] =
R8(p) * 1E3;
537 seph.
acc[2] =
R8(p) * 1E3;
545 trace(NULL, 2,
"BINEX 0x01-03 length error: len=%d\n", len);
549 trace(NULL, 2,
"BINEX 0x01-03 satellite error: prn=%d\n", prn);
556 if (!strstr(raw->
opt,
"-EPHALL")) {
571 double tow, ura, sqrtA;
572 int prn, sat, set,
eph_sel = 3;
574 trace(NULL, 4,
"BINEX 0x01-04: len=%d\n", len);
576 if (strstr(raw->
opt,
"-GALFNAV")) {
579 if (strstr(raw->
opt,
"-GALINAV")) {
640 trace(NULL, 2,
"BINEX 0x01-04: length error len=%d\n", len);
644 trace(NULL, 2,
"BINEX 0x01-04: satellite error prn=%d\n", prn);
647 set = (eph.
code & (1 << 8)) ? 1 : 0;
648 if (!(
eph_sel & 1) && set == 0) {
651 if (!(
eph_sel & 2) && set == 1) {
663 if (!strstr(raw->
opt,
"-EPHALL")) {
678 return (tgd & 0x200) ? -1E-10 * ((~tgd) & 0x1FF) : 1E-10 * (tgd & 0x1FF);
684 double tow, toc, sqrtA;
685 int prn, sat, flag1, flag2;
687 trace(NULL, 4,
"BINEX 0x01-05: len=%d\n", len);
740 trace(NULL, 2,
"BINEX 0x01-05: length error len=%d\n", len);
744 trace(NULL, 2,
"BINEX 0x01-05: satellite error prn=%d\n", prn);
748 eph.
type = (prn >= 6 && prn <= 58) ? 0 : 1;
753 eph.
iodc = (flag1 >> 1) & 0x1F;
754 eph.
iode = (flag1 >> 6) & 0x1F;
755 eph.
svh = flag1 & 0x01;
756 eph.
sva = flag2 & 0x0F;
759 eph.
flag = (flag1 >> 11) & 0x07;
760 eph.
code = (flag2 >> 25) & 0x7F;
763 if (!strstr(raw->
opt,
"-EPHALL")) {
768 raw->
nav.
eph[sat - 1] = eph;
777 double tow, ura, sqrtA;
780 trace(NULL, 4,
"BINEX 0x01-06: len=%d\n", len);
839 trace(NULL, 2,
"BINEX 0x01-06: length error len=%d\n", len);
843 trace(NULL, 2,
"BINEX 0x01-06: satellite error prn=%d\n", prn);
852 eph.
fit = (flag & 0x01) ? 0.0 : 2.0;
856 if (!strstr(raw->
opt,
"-EPHALL")) {
861 raw->
nav.
eph[sat - 1] = eph;
870 double tow, toc, sqrtA;
871 int prn, sat, flag, iodec;
873 trace(NULL, 4,
"BINEX 0x01-07: len=%d\n", len);
926 trace(NULL, 2,
"BINEX 0x01-07: length error len=%d\n", len);
930 trace(NULL, 2,
"BINEX 0x01-07: satellite error prn=%d\n", prn);
939 eph.
sva = flag & 0x0F;
940 eph.
svh = ((flag & 0x10) ? 2 : 0) + ((flag & 0x20) ? 1 : 0);
942 eph.
tgd[0] = (int8_t)(iodec >> 8) *
P2_31;
944 if (!strstr(raw->
opt,
"-EPHALL")) {
950 raw->
nav.
eph[sat - 1] = eph;
959 double tow, ura, sqrtA;
960 int prn, sat, tocs, set,
eph_sel = 3;
962 trace(NULL, 4,
"BINEX 0x01-14: len=%d\n", len);
964 if (strstr(raw->
opt,
"-GALFNAV")) {
967 if (strstr(raw->
opt,
"-GALINAV")) {
1030 trace(NULL, 2,
"BINEX 0x01-14: length error len=%d\n", len);
1034 trace(NULL, 2,
"BINEX 0x01-14: satellite error prn=%d\n", prn);
1037 set = (eph.
code & (1 << 8)) ? 1 : 0;
1038 if (!(
eph_sel & 1) && set == 0) {
1041 if (!(
eph_sel & 2) && set == 1) {
1052 eph.
sva = ura < 0.0 ? (int)(-ura) - 1 :
sisaindex(ura);
1053 if (!strstr(raw->
opt,
"-EPHALL")) {
1067 int srec =
U1(buff), prn =
U1(buff + 1);
1070 prn = srec == 0x01 || srec == 0x02 || srec == 0x04 ? prn + 1 : (srec == 0x00 ? 0 : prn);
1071 sprintf(raw->
msgtype + strlen(raw->
msgtype),
" subrec=%02X prn=%d", srec, prn);
1097 trace(NULL, 2,
"BINEX 0x02: unsupported message\n");
1102 trace(NULL, 2,
"BINEX 0x03: unsupported message\n");
1107 trace(NULL, 2,
"BINEX 0x7d: unsupported message\n");
1112 trace(NULL, 2,
"BINEX 0x7e: unsupported message\n");
1117 trace(NULL, 2,
"BINEX 0x7f-00: unsupported message\n");
1122 trace(NULL, 2,
"BINEX 0x7f-01: unsupported message\n");
1127 trace(NULL, 2,
"BINEX 0x7f-02: unsupported message\n");
1132 trace(NULL, 2,
"BINEX 0x7f-03: unsupported message\n");
1137 trace(NULL, 2,
"BINEX 0x7f-04: unsupported message\n");
1142 const uint8_t codes_gps[32] = {
1150 const uint8_t codes_glo[32] = {
1158 const uint8_t codes_gal[32] = {
1166 const uint8_t codes_sbs[32] = {
1170 const uint8_t codes_cmp[32] = {
1178 const uint8_t codes_qzs[32] = {
1186 const uint8_t codes_irn[32] = {
1190 const uint8_t* codes = NULL;
1191 double range[8], phase[8], cnr[8], dopp[8] = {0}, acc, freq;
1193 uint8_t flag, flags[4];
1194 int i, j, k, sys, prn, fcn = -10, code[8], slip[8], pri[8], idx[8];
1195 int slipcnt[8] = {0}, mask[8] = {0};
1197 trace(NULL, 5,
"decode_bnx_7f_05_obs: sat=%2d nobs=%2d\n", sat, nobs);
1227 for (i = 0; i < nobs; i++) {
1233 for (j = 0; j < 4; j++) {
1237 for (j = 0; flag && j < 4; j++) {
1239 flags[flag & 0x03] = flag & 0x7F;
1243 fcn =
getbits(flags + 2, 2, 4);
1248 acc = (flags[0] & 0x20) ? 0.0001 : 0.00002;
1250 cnr[i] =
U1(p++) * 0.4;
1253 cnr[i] +=
getbits(p, 0, 2) * 0.1;
1256 }
else if (flags[0] & 0x40) {
1257 cnr[i] +=
getbits(p, 0, 2) * 0.1;
1264 if (flags[0] & 0x40) {
1268 cnr[i] +=
getbits(p, 0, 2) * 0.1;
1272 if (flags[0] & 0x04) {
1273 dopp[i] =
getbits(p, 0, 24) / 256.0;
1276 if (flags[0] & 0x08) {
1277 if (flags[0] & 0x10) {
1285 trace(NULL, 5,
"(%d) CODE=%2d S=%d F=%02X %02X %02X %02X\n", i + 1, code[i], slip[i], flags[0], flags[1],
1286 flags[2], flags[3]);
1287 trace(NULL, 5,
"(%d) P=%13.3f L=%13.3f D=%7.1f SNR=%4.1f SCNT=%2d\n", i + 1,
range[i], phase[i], dopp[i],
1288 cnr[i], slipcnt[i]);
1298 for (i = 0; i < nobs; i++) {
1302 for (i = 0; i < NFREQ; i++) {
1303 for (j = 0, k = -1; j < nobs; j++) {
1304 if (idx[j] == i && (k < 0 || pri[j] > pri[k])) {
1309 data->
P[i] = data->
L[i] = 0.0;
1311 data->
SNR[i] = data->
LLI[i] = 0;
1314 freq =
code2freq(sys, codes[code[k]], fcn);
1316 data->
L[i] = phase[k] * freq /
CLIGHT;
1317 data->
D[i] = dopp[k];
1318 data->
SNR[i] = (uint16_t)(cnr[k] /
SNR_UNIT + 0.5);
1319 data->
code[i] = codes[code[k]];
1320 data->
LLI[i] = slip[k] ? 1 : 0;
1324 for (; i < NFREQ + NEXOBS; i++) {
1325 for (k = 0; k < nobs; k++) {
1331 data->
P[i] = data->
L[i] = 0.0;
1333 data->
SNR[i] = data->
LLI[i] = 0;
1336 freq =
code2freq(sys, codes[code[k]], fcn);
1338 data->
L[i] = phase[k] * freq /
CLIGHT;
1339 data->
D[i] = dopp[k];
1340 data->
SNR[i] = (uint16_t)(cnr[k] /
SNR_UNIT + 0.5);
1341 data->
code[i] = codes[code[k]];
1342 data->
LLI[i] = slip[k] ? 1 : 0;
1351 double clkoff = 0.0, toff[16] = {0};
1355 int i, nsat, nobs, prn, sys, sat, clkrst = 0, rsys = 0, nsys = 0, tsys[16] = {0};
1357 trace(NULL, 4,
"decode_bnx_7f_05\n");
1361 nsat = (int)(flag & 0x3F) + 1;
1365 clkoff =
getbits(p, 2, 22) * 1E-9;
1372 for (i = 0; i < nsys; i++) {
1373 toff[i] =
getbits(p, 0, 24) * 1E-9;
1378 for (i = 0; i < nsat; i++) {
1384 trace(NULL, 5,
"BINEX 0x7F-05 PRN=%3d SYS=%d NOBS=%d\n", prn, sys, nobs);
1417 if ((
int)(p - buff) > len) {
1418 trace(NULL, 2,
"BINEX 0x7F-05 length error: nsat=%2d len=%d\n", nsat, len);
1428 sprintf(msg,
" nsat=%2d", nsat);
1430 return raw->
obs.
n > 0 ? 1 : 0;
1434 const static double gpst0[] = {1980, 1, 6, 0, 0, 0};
1437 uint32_t srec, min, msec;
1450 sprintf(msg,
" subrec=%02X time%s", srec,
time_str(raw->
time, 3));
1470 uint32_t len, cs1, cs2;
1478 trace(NULL, 5,
"decode_bnx: rec=%02x len=%d\n", rec, len);
1481 if (raw->
len - 1 < 128) {
1489 trace(NULL, 2,
"BINEX 0x%02X parity error CS=%X %X\n", rec, cs1, cs2);
1493 sprintf(raw->
msgtype,
"BINEX 0x%02X (%4d)", rec, raw->
len);
1519 return buff[0] ==
BNXSYNC2 && (buff[1] == 0x00 || buff[1] == 0x01 || buff[1] == 0x02 || buff[1] == 0x03 ||
1520 buff[1] == 0x7D || buff[1] == 0x7E || buff[1] == 0x7F);
1559 trace(NULL, 5,
"input_bnx: data=%02x\n", data);
1562 if (raw->
nbyte == 0) {
1570 if (raw->
nbyte < 4) {
1576 raw->
len = len + len_h + 2;
1578 if (raw->
len - 1 > 4096) {
1579 trace(NULL, 2,
"BINEX length error: len=%d\n", raw->
len - 1);
1583 len_c = (raw->
len - 1 < 128) ? 1 : 2;
1585 if (raw->
nbyte < (
int)(raw->
len + len_c)) {
1601 int i, data, len_h, len_c;
1603 trace(NULL, 4,
"input_bnxf\n");
1605 if (raw->
nbyte == 0) {
1607 if ((data = fgetc(fp)) == EOF) {
1618 if (fread(raw->
buff + 2, 1, 4, fp) < 4) {
1624 raw->
len = len + len_h + 2;
1626 if (raw->
len - 1 > 4096) {
1627 trace(NULL, 2,
"BINEX length error: len=%d\n", raw->
len - 1);
1631 len_c = (raw->
len - 1 < 128) ? 1 : 2;
1633 if (fread(raw->
buff + 6, 1, raw->
len + len_c - 6, fp) < (
size_t)(raw->
len + len_c - 6)) {
1648#define NINCOBS 262144
1653 const char* q = src;
1654 while (*q && q < src + n) {
1658 while (p >= dst && *p ==
' ') {
1665 for (i = 0; i < NFREQ; i++) {
1666 if (data->
LLI[i] & 1) {
1667 slips[data->
sat - 1][i] |= 1;
1674 for (i = 0; i < NFREQ; i++) {
1675 if (slips[data->
sat - 1][i] & 1) {
1678 slips[data->
sat - 1][i] = 0;
1685 if (obs->
nmax <= obs->
n) {
1686 if (obs->
nmax <= 0) {
1692 trace(NULL, 1,
"addobsdata: memalloc error n=%dx%d\n", (
int)
sizeof(
obsd_t), obs->
nmax);
1695 obs->
n = obs->
nmax = 0;
1698 obs->
data = obs_data;
1700 obs->
data[obs->
n++] = *data;
1707 if (nav->
nmax <= nav->
n) {
1710 trace(NULL, 1,
"add_eph: memalloc error n=%d\n", nav->
nmax);
1713 nav->
n = nav->
nmax = 0;
1718 nav->
eph[nav->
n++] = *eph;
1728 trace(NULL, 1,
"add_geph: memalloc error n=%d\n", nav->
ngmax);
1734 nav->
geph = nav_geph;
1736 nav->
geph[nav->
ng++] = *geph;
1746 trace(NULL, 1,
"add_seph: memalloc error n=%d\n", nav->
nsmax);
1752 nav->
seph = nav_seph;
1754 nav->
seph[nav->
ns++] = *seph;
1760 unsigned char slips[
MAXSAT][NFREQ] = {{0}};
1761 int stat, data, dec_type, sys, sat, prn, mask, i;
1766 memset(&raw,
'\0',
sizeof(raw));
1768 strcpy(raw.
opt, opt);
1772 if ((data = fgetc(fp)) == EOF) {
1779 if (fread(raw.
buff + 2, 1, 4, fp) < 4) {
1784 raw.
len = len + len_h + 2;
1786 if (raw.
len - 1 > 4096) {
1787 trace(NULL, 2,
"binex length error: len=%d\n", raw.
len - 1);
1791 len_c = (raw.
len - 1 < 128) ? 1 : 2;
1793 if (raw.
len + len_c - 6 < 1) {
1794 trace(NULL, 2,
"binex length error: len=%d\n", raw.
len - 1);
1798 if (fread(raw.
buff + 6, 1, raw.
len + len_c - 6, fp) < (
size_t)(raw.
len + len_c - 6)) {
1806 for (i = 0; i < raw.
obs.
n; i++) {
1813 for (i = 0; i < raw.
obs.
n; i++) {
1830 if (!(sys & mask)) {
1863 trace(NULL, 3,
"readbnxfile: file=%s flag=%d index=%d\n", file, flag, index);
1878 trace(NULL, 2,
"binex file uncompact error: %s\n", file);
1881 if (!(fp = fopen(cstat ? tmpfile : file,
"rb"))) {
1882 trace(NULL, 2,
"binex file open error: %s\n", cstat ? tmpfile : file);
1885 stat =
readbnxfp(fp, ts, te, tint, opt, flag, index, type, obs, nav, sta, popt);
1912 char type =
' ', *files[
MAXEXFILE] = {0};
1914 trace(NULL, 3,
"readbnxt: file=%s rcv=%d\n", file, rcv);
1917 return readbnxfp(stdin, ts, te, tint, opt, 0, 1, &type, obs, nav, sta, popt);
1920 if (!(files[i] = (
char*)
malloc(1024))) {
1921 for (i--; i >= 0; i--) {
1934 for (i = 0; i < n && stat >= 0; i++) {
1935 stat =
readbnxfile(files[i], ts, te, tint, opt, 0, rcv, &type, obs, nav, sta, popt);
uint16_t rtk_crc16(const uint8_t *buff, int len)
Compute CRC-16 parity for BINEX and NVS.
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)
static const double range[4]
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 getcodepri(int sys, uint8_t code, const char *opt)
Get code priority for multiple codes in a frequency.
int code2freq_idx(int sys, uint8_t code)
Convert system and obs code to frequency index (obsdef-based).
int screent(gtime_t time, gtime_t ts, gtime_t te, double tint)
Screen data by time range and interval.
MRTKLIB Observation Module — Observation data types and utility functions.
MRTKLIB Options Module — Processing and solution option types.
static int readbnxfile(const char *file, gtime_t ts, gtime_t te, double tint, const char *opt, int flag, int index, char *type, obs_t *obs, nav_t *nav, sta_t *sta, const prcopt_t *popt)
static int decode_bnx_01_03(raw_t *raw, uint8_t *buff, int len)
static int add_geph(nav_t *nav, const geph_t *geph)
static int sisaindex(double value)
int input_bnx(raw_t *raw, uint8_t data)
static gtime_t adjweek(gtime_t time, double tow)
static int sync_bnx(uint8_t *buff, uint8_t data)
static int add_seph(nav_t *nav, const seph_t *seph)
static int uraindex(double value)
static int decode_bnx_00(raw_t *raw, uint8_t *buff, int len)
static int getbnxi(uint8_t *p, uint32_t *val)
int input_bnxf(raw_t *raw, FILE *fp)
static gtime_t adjday(gtime_t time, double tod)
static int decode_bnx_7d(raw_t *raw, uint8_t *buff, int len)
static int readbnxfp(FILE *fp, gtime_t ts, gtime_t te, double tint, const char *opt, int flag, int index, char *type, obs_t *obs, nav_t *nav, sta_t *sta, const prcopt_t *popt)
static int decode_bnx_01_01(raw_t *raw, uint8_t *buff, int len)
static int decode_bnx_7f_04(raw_t *raw, uint8_t *buff, int len)
static int decode_bnx_01_06(raw_t *raw, uint8_t *buff, int len)
static int decode_bnx_7f_03(raw_t *raw, uint8_t *buff, int len)
static int decode_bnx_01(raw_t *raw, uint8_t *buff, int len)
static uint8_t csum8(const uint8_t *buff, int len)
static int decode_bnx_01_05(raw_t *raw, uint8_t *buff, int len)
static int add_eph(nav_t *nav, const eph_t *eph)
static int decode_bnx_01_02(raw_t *raw, uint8_t *buff, int len)
static int decode_bnx_01_04(raw_t *raw, uint8_t *buff, int len)
static int decode_bnx_7f_05(raw_t *raw, uint8_t *buff, int len)
static int decode_bnx_01_07(raw_t *raw, uint8_t *buff, int len)
static double bds_tgd(int tgd)
static int decode_bnx(raw_t *raw)
static uint8_t * decode_bnx_7f_05_obs(raw_t *raw, uint8_t *buff, int sat, int nobs, obsd_t *data)
static int decode_bnx_7f_01(raw_t *raw, uint8_t *buff, int len)
static int decode_bnx_7f_02(raw_t *raw, uint8_t *buff, int len)
static void setstr_bnx(char *dst, const char *src, int n)
static int decode_bnx_7f_00(raw_t *raw, uint8_t *buff, int len)
static int addobsdata(obs_t *obs, const obsd_t *data)
static int decode_bnx_7f(raw_t *raw, uint8_t *buff, int len)
static int decode_bnx_03(raw_t *raw, uint8_t *buff, int len)
static int decode_bnx_01_14(raw_t *raw, uint8_t *buff, int len)
int readbnxt(const char *file, int rcv, gtime_t ts, gtime_t te, double tint, const char *opt, obs_t *obs, nav_t *nav, sta_t *sta, const prcopt_t *popt)
Read BINEX observation/navigation data from file(s).
static void saveslips(unsigned char slips[][5], obsd_t *data)
static int decode_bnx_02(raw_t *raw, uint8_t *buff, int len)
static int decode_bnx_7e(raw_t *raw, uint8_t *buff, int len)
static int decode_bnx_01_00(raw_t *raw, uint8_t *buff, int len)
static void restslips(unsigned char slips[][5], obsd_t *data)
void free_raw(raw_t *raw)
Free receiver raw data control struct.
int init_raw(raw_t *raw, int format)
Initialize receiver raw data control struct.
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.
int expath(const char *path, char *paths[], int nmax)
Expand file path with wild-card (*) in file.
int rtk_uncompress(const char *file, char *uncfile)
Uncompress file (gzip/zip/tar/Hatanaka).
MRTKLIB System Module — OS/filesystem utility functions.
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.
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.
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).
static const double gpst0[]
GPS time reference epoch.
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.
Observation data collection.
Receiver raw data control type.