46static const double CLIGHT = 299792458.0;
47static const double FREQ1 = 1.57542E9;
48static const double FREQ2 = 1.22760E9;
53static const double D2R = 3.1415926535897932 / 180.0;
54static const double SC2RAD = 3.1415926535897932;
60#define PRUNIT_GPS 299792.458
61#define PRUNIT_GLO 599584.916
62#define RANGE_MS (CLIGHT * 0.001)
65#define P2_10 0.0009765625
66#define P2_11 4.882812500000000E-04
67#define P2_19 1.907348632812500E-06
68#define P2_20 9.536743164062500E-07
69#define P2_24 5.960464477539063E-08
70#define P2_28 3.725290298461914E-09
71#define P2_29 1.862645149230957E-09
72#define P2_30 9.313225746154785E-10
73#define P2_31 4.656612873077393E-10
74#define P2_32 2.328306436538696E-10
75#define P2_33 1.164153218269348E-10
76#define P2_34 5.820766091346740E-11
77#define P2_40 9.094947017729280E-13
78#define P2_41 4.547473508864641E-13
79#define P2_43 1.136868377216160E-13
80#define P2_46 1.421085471520200E-14
81#define P2_50 8.881784197001252E-16
82#define P2_55 2.775557561562891E-17
83#define P2_59 1.734723475976810E-18
84#define P2_66 1.355252715606880E-20
86#define ROUND(x) ((int)floor((x) + 0.5))
87#define ROUND_U(x) ((uint32_t)floor((x) + 0.5))
88#define MIN(x, y) ((x) < (y) ? (x) : (y))
108static const double ssrudint[16] = {1, 2, 5, 10, 15, 30, 60, 120, 240, 300, 600, 900, 1800, 3600, 7200, 10800};
110static void setbitg(uint8_t* buff,
int pos,
int len, int32_t value) {
111 setbitu(buff, pos, 1, value < 0 ? 1 : 0);
112 setbitu(buff, pos + 1, len - 1, value < 0 ? -value : value);
115static void set38bits(uint8_t* buff,
int pos,
double value) {
116 int word_h = (int)floor(value / 64.0);
117 uint32_t word_l = (uint32_t)(value - word_h * 64.0);
118 setbits(buff, pos, 32, word_h);
119 setbitu(buff, pos + 32, 6, word_l);
123 if (!lltime->
time || (LLI & 1)) {
126 return (
int)
timediff(time, *lltime);
130 if (!lltime->
time || (LLI & 1)) {
142 if (
rtcm->nav.geph[prn - 1].sat == sat) {
143 return rtcm->nav.geph[prn - 1].frq + 7;
145 if (
rtcm->nav.glo_fcn[prn - 1] > 0) {
146 return rtcm->nav.glo_fcn[prn - 1] - 8 + 7;
159 return (lock + 24) / 2;
162 return (lock + 120) / 4;
165 return (lock + 408) / 8;
168 return (lock + 1176) / 16;
171 return (lock + 3096) / 32;
213 if (lock < 131.072) {
216 if (lock < 262.144) {
219 if (lock < 524.288) {
226 int lock_ms = (int)(lock * 1000.0);
235 return (lock_ms + 64) / 2;
238 return (lock_ms + 256) / 4;
241 return (lock_ms + 768) / 8;
244 return (lock_ms + 2048) / 16;
247 return (lock_ms + 5120) / 32;
250 return (lock_ms + 12288) / 64;
253 return (lock_ms + 28672) / 128;
256 return (lock_ms + 65536) / 256;
259 return (lock_ms + 147456) / 512;
262 return (lock_ms + 327680) / 1024;
264 if (lock < 131.072) {
265 return (lock_ms + 720896) / 2048;
267 if (lock < 262.144) {
268 return (lock_ms + 1572864) / 4096;
270 if (lock < 524.288) {
271 return (lock_ms + 3407872) / 8192;
273 if (lock < 1048.576) {
274 return (lock_ms + 7340032) / 16384;
276 if (lock < 2097.152) {
277 return (lock_ms + 15728640) / 32768;
279 if (lock < 4194.304) {
280 return (lock_ms + 33554432) / 65536;
282 if (lock < 8388.608) {
283 return (lock_ms + 71303168) / 131072;
285 if (lock < 16777.216) {
286 return (lock_ms + 150994944) / 262144;
288 if (lock < 33554.432) {
289 return (lock_ms + 318767104) / 524288;
291 if (lock < 67108.864) {
292 return (lock_ms + 671088640) / 1048576;
349static double cp_pr(
double cp,
double pr_cyc) {
return fmod(cp - pr_cyc + 750.0, 1500.0) - 750.0; }
352 int* cnr1,
int* code2,
int* pr21,
int* ppr2,
int* lock2,
int* cnr2) {
353 double lam1, lam2, pr1c = 0.0, ppr;
370 if (data->
P[0] != 0.0 && data->
code[0]) {
376 if (data->
P[0] != 0.0 && data->
L[0] != 0.0 && data->
code[0]) {
377 ppr =
cp_pr(data->
L[0], pr1c / lam1);
379 *ppr1 =
ROUND(ppr * lam1 / 0.0005);
383 if (data->
P[0] != 0.0 && data->
P[1] != 0.0 && data->
code[0] && data->
code[1] && fabs(data->
P[1] - pr1c) <= 163.82) {
385 *pr21 =
ROUND((data->
P[1] - pr1c) / 0.02);
389 if (data->
P[0] != 0.0 && data->
L[1] != 0.0 && data->
code[0] && data->
code[1]) {
390 ppr =
cp_pr(data->
L[1], pr1c / lam2);
392 *ppr2 =
ROUND(ppr * lam2 / 0.0005);
419 int* amb,
int* cnr1,
int* code2,
int* pr21,
int* ppr2,
int* lock2,
int* cnr2) {
420 double lam1 = 0.0, lam2 = 0.0, pr1c = 0.0, ppr;
439 if (data->
P[0] != 0.0) {
445 if (data->
P[0] != 0.0 && data->
L[0] != 0.0 && data->
code[0] && lam1 > 0.0) {
446 ppr =
cp_pr(data->
L[0], pr1c / lam1);
448 *ppr1 =
ROUND(ppr * lam1 / 0.0005);
452 if (data->
P[0] != 0.0 && data->
P[1] != 0.0 && data->
code[0] && data->
code[1] && fabs(data->
P[1] - pr1c) <= 163.82) {
454 *pr21 =
ROUND((data->
P[1] - pr1c) / 0.02);
458 if (data->
P[0] != 0.0 && data->
L[1] != 0.0 && data->
code[0] && data->
code[1] && lam2 > 0.0) {
459 ppr =
cp_pr(data->
L[1], pr1c / lam2);
461 *ppr2 =
ROUND(ppr * lam2 / 0.0005);
489 int i = 24, week, epoch;
491 trace(NULL, 4,
"encode_head: type=%d sync=%d sys=%d nsat=%d\n", type, sync, sys, nsat);
500 epoch =
ROUND(fmod(tow, 86400.0) / 0.001);
505 epoch =
ROUND(tow / 0.001);
521 int i, j, nsat = 0, sys, prn;
522 int code1, pr1, ppr1, lock1, amb;
524 trace(NULL, 3,
"encode_type1001: sync=%d\n", sync);
526 for (j = 0; j <
rtcm->obs.n && nsat <
MAXOBS; j++) {
536 for (j = 0; j <
rtcm->obs.n && nsat <
MAXOBS; j++) {
547 gen_obs_gps(
rtcm,
rtcm->obs.data + j, &code1, &pr1, &ppr1, &lock1, &amb, NULL, NULL, NULL, NULL, NULL, NULL);
565 int i, j, nsat = 0, sys, prn;
566 int code1, pr1, ppr1, lock1, amb, cnr1;
568 trace(NULL, 3,
"encode_type1002: sync=%d\n", sync);
570 for (j = 0; j <
rtcm->obs.n && nsat <
MAXOBS; j++) {
580 for (j = 0; j <
rtcm->obs.n && nsat <
MAXOBS; j++) {
591 gen_obs_gps(
rtcm,
rtcm->obs.data + j, &code1, &pr1, &ppr1, &lock1, &amb, &cnr1, NULL, NULL, NULL, NULL, NULL);
613 int i, j, nsat = 0, sys, prn;
614 int code1, pr1, ppr1, lock1, amb, code2, pr21, ppr2, lock2;
616 trace(NULL, 3,
"encode_type1003: sync=%d\n", sync);
618 for (j = 0; j <
rtcm->obs.n && nsat <
MAXOBS; j++) {
628 for (j = 0; j <
rtcm->obs.n && nsat <
MAXOBS; j++) {
639 gen_obs_gps(
rtcm,
rtcm->obs.data + j, &code1, &pr1, &ppr1, &lock1, &amb, NULL, &code2, &pr21, &ppr2, &lock2,
666 int i, j, nsat = 0, sys, prn;
667 int code1, pr1, ppr1, lock1, amb, cnr1, code2, pr21, ppr2, lock2, cnr2;
669 trace(NULL, 3,
"encode_type1004: sync=%d\n", sync);
671 for (j = 0; j <
rtcm->obs.n && nsat <
MAXOBS; j++) {
681 for (j = 0; j <
rtcm->obs.n && nsat <
MAXOBS; j++) {
692 gen_obs_gps(
rtcm,
rtcm->obs.data + j, &code1, &pr1, &ppr1, &lock1, &amb, &cnr1, &code2, &pr21, &ppr2, &lock2,
725 double* p =
rtcm->sta.pos;
727 int j, has_gps = 0, has_glo = 0, has_gal = 0;
729 trace(NULL, 3,
"encode_type1005: sync=%d\n", sync);
732 for (j = 0; j <
rtcm->obs.n; j++) {
733 int sys =
satsys(
rtcm->obs.data[j].sat, NULL);
742 if (!has_gps && !has_glo && !has_gal) has_gps = 1;
775 double* p =
rtcm->sta.pos;
776 int i = 24, j, hgt = 0;
777 int has_gps = 0, has_glo = 0, has_gal = 0;
779 trace(NULL, 3,
"encode_type1006: sync=%d\n", sync);
781 if (0.0 <=
rtcm->sta.hgt &&
rtcm->sta.hgt <= 6.5535) {
784 trace(NULL, 2,
"antenna height error: h=%.4f\n",
rtcm->sta.hgt);
787 for (j = 0; j <
rtcm->obs.n; j++) {
788 int sys =
satsys(
rtcm->obs.data[j].sat, NULL);
796 if (!has_gps && !has_glo && !has_gal) has_gps = 1;
831 int i = 24, j, antsetup =
rtcm->sta.antsetup;
832 int n =
MIN(strlen(
rtcm->sta.antdes), 31);
834 trace(NULL, 3,
"encode_type1007: sync=%d\n", sync);
844 for (j = 0; j < n; j++) {
855 int i = 24, j, antsetup =
rtcm->sta.antsetup;
856 int n =
MIN(strlen(
rtcm->sta.antdes), 31);
857 int m =
MIN(strlen(
rtcm->sta.antsno), 31);
859 trace(NULL, 3,
"encode_type1008: sync=%d\n", sync);
869 for (j = 0; j < n; j++) {
879 for (j = 0; j < m; j++) {
888 int i, j, nsat = 0, sat, prn, fcn;
889 int code1, pr1, ppr1, lock1, amb;
891 for (j = 0; j <
rtcm->obs.n && nsat <
MAXOBS; j++) {
892 sat =
rtcm->obs.data[j].sat;
904 for (j = 0; j <
rtcm->obs.n && nsat <
MAXOBS; j++) {
905 sat =
rtcm->obs.data[j].sat;
914 gen_obs_glo(
rtcm,
rtcm->obs.data + j, fcn, &code1, &pr1, &ppr1, &lock1, &amb, NULL, NULL, NULL, NULL, NULL,
935 int i, j, nsat = 0, sat, prn, fcn;
936 int code1, pr1, ppr1, lock1, amb, cnr1;
938 trace(NULL, 3,
"encode_type1010: sync=%d\n", sync);
940 for (j = 0; j <
rtcm->obs.n && nsat <
MAXOBS; j++) {
941 sat =
rtcm->obs.data[j].sat;
953 for (j = 0; j <
rtcm->obs.n && nsat <
MAXOBS; j++) {
954 sat =
rtcm->obs.data[j].sat;
963 gen_obs_glo(
rtcm,
rtcm->obs.data + j, fcn, &code1, &pr1, &ppr1, &lock1, &amb, &cnr1, NULL, NULL, NULL, NULL,
988 int i, j, nsat = 0, sat, prn, fcn;
989 int code1, pr1, ppr1, lock1, amb, code2, pr21, ppr2, lock2;
991 trace(NULL, 3,
"encode_type1011: sync=%d\n", sync);
993 for (j = 0; j <
rtcm->obs.n && nsat <
MAXOBS; j++) {
994 sat =
rtcm->obs.data[j].sat;
1006 for (j = 0; j <
rtcm->obs.n && nsat <
MAXOBS; j++) {
1007 sat =
rtcm->obs.data[j].sat;
1016 gen_obs_glo(
rtcm,
rtcm->obs.data + j, fcn, &code1, &pr1, &ppr1, &lock1, &amb, NULL, &code2, &pr21, &ppr2,
1045 int i, j, nsat = 0, sat, prn, fcn;
1046 int code1, pr1, ppr1, lock1, amb, cnr1, code2, pr21, ppr2, lock2, cnr2;
1048 trace(NULL, 3,
"encode_type1012: sync=%d\n", sync);
1050 for (j = 0; j <
rtcm->obs.n && nsat <
MAXOBS; j++) {
1051 sat =
rtcm->obs.data[j].sat;
1063 for (j = 0; j <
rtcm->obs.n && nsat <
MAXOBS; j++) {
1064 sat =
rtcm->obs.data[j].sat;
1073 gen_obs_glo(
rtcm,
rtcm->obs.data + j, fcn, &code1, &pr1, &ppr1, &lock1, &amb, &cnr1, &code2, &pr21, &ppr2,
1110 int i = 24, prn, week, toe, toc, i0, OMG0, omg, M0, deln, idot, OMGd, crs, crc;
1111 int cus, cuc, cis, cic, af0, af1, af2, tgd;
1113 trace(NULL, 3,
"encode_type1019: sync=%d\n", sync);
1118 eph =
rtcm->nav.eph +
rtcm->ephsat - 1;
1119 if (eph->
sat !=
rtcm->ephsat) {
1122 week = eph->
week % 1024;
1215 int i = 24, j, prn, tk_h, tk_m, tk_s, tb, pos[3], vel[3], acc[3], gamn, taun, dtaun;
1216 int fcn,
NT, Bn, Cn, Cn_a, ln, P1, P2, P3, P4, P, M;
1218 trace(NULL, 3,
"encode_type1020: sync=%d\n", sync);
1223 geph =
rtcm->nav.geph + prn - 1;
1224 if (geph->
sat !=
rtcm->ephsat) {
1227 fcn = geph->
frq + 7;
1234 tk_s =
ROUND(ep[5] / 30.0);
1237 ep[0] = floor(ep[0] / 4.0) * 4.0;
1238 ep[1] = ep[2] = 1.0;
1239 ep[3] = ep[4] = ep[5] = 0.0;
1245 tb =
ROUND((ep[3] * 3600.0 + ep[4] * 60.0 + ep[5]) / 900.0);
1247 for (j = 0; j < 3; j++) {
1256 Bn = (geph->
svh >> 0) & 1;
1257 Cn = (geph->
svh >> 1) & 1;
1258 Cn_a = (geph->
svh >> 2) & 1;
1259 ln = (geph->
svh >> 3) & 1;
1260 M = (geph->
flags >> 7) & 3;
1261 P4 = (geph->
flags >> 6) & 1;
1262 P3 = (geph->
flags >> 5) & 1;
1263 P2 = (geph->
flags >> 4) & 1;
1264 P1 = (geph->
flags >> 2) & 3;
1265 P = (geph->
flags >> 0) & 3;
1350 int i = 24, j, antsetup =
rtcm->sta.antsetup;
1351 int n =
MIN(strlen(
rtcm->sta.antdes), 31);
1352 int m =
MIN(strlen(
rtcm->sta.antsno), 31);
1353 int I =
MIN(strlen(
rtcm->sta.rectype), 31);
1354 int J =
MIN(strlen(
rtcm->sta.recver), 31);
1355 int K =
MIN(strlen(
rtcm->sta.recsno), 31);
1357 trace(NULL, 3,
"encode_type1033: sync=%d\n", sync);
1366 for (j = 0; j < n; j++) {
1375 for (j = 0; j < m; j++) {
1381 for (j = 0; j < I; j++) {
1387 for (j = 0; j < J; j++) {
1393 for (j = 0; j < K; j++) {
1404 int i = 24, prn, week, toe, toc, i0, OMG0, omg, M0, deln, idot, OMGd, crs, crc;
1405 int cus, cuc, cis, cic, af0, af1, af2, tgd;
1407 trace(NULL, 3,
"encode_type1041: sync=%d\n", sync);
1412 eph =
rtcm->nav.eph +
rtcm->ephsat - 1;
1413 if (eph->
sat !=
rtcm->ephsat) {
1416 week = eph->
week % 1024;
1500 int i = 24, prn, week, toe, toc, i0, OMG0, omg, M0, deln, idot, OMGd, crs, crc;
1501 int cus, cuc, cis, cic, af0, af1, af2, tgd;
1503 trace(NULL, 3,
"encode_type1044: sync=%d\n", sync);
1508 eph =
rtcm->nav.eph +
rtcm->ephsat - 1;
1509 if (eph->
sat !=
rtcm->ephsat) {
1512 week = eph->
week % 1024;
1602 int i = 24, prn, week, toe, toc, i0, OMG0, omg, M0, deln, idot, OMGd, crs, crc;
1603 int cus, cuc, cis, cic, af0, af1, af2, bgd1, bgd2, oshs, osdvs;
1605 trace(NULL, 3,
"encode_type1045: sync=%d\n", sync);
1611 if (eph->
sat !=
rtcm->ephsat) {
1614 week = (eph->
week - 1024) % 4096;
1637 oshs = (eph->
svh >> 4) & 3;
1638 osdvs = (eph->
svh >> 3) & 1;
1704 int i = 24, prn, week, toe, toc, i0, OMG0, omg, M0, deln, idot, OMGd, crs, crc;
1705 int cus, cuc, cis, cic, af0, af1, af2, bgd1, bgd2, oshs1, osdvs1, oshs2, osdvs2;
1707 trace(NULL, 3,
"encode_type1046: sync=%d\n", sync);
1712 eph =
rtcm->nav.eph +
rtcm->ephsat - 1;
1713 if (eph->
sat !=
rtcm->ephsat) {
1716 week = (eph->
week - 1024) % 4096;
1739 oshs1 = (eph->
svh >> 7) & 3;
1740 osdvs1 = (eph->
svh >> 6) & 1;
1741 oshs2 = (eph->
svh >> 1) & 3;
1742 osdvs2 = (eph->
svh >> 0) & 1;
1812 int i = 24, prn, week, toe, toc, i0, OMG0, omg, M0, deln, idot, OMGd, crs, crc;
1813 int cus, cuc, cis, cic, af0, af1, af2, tgd1, tgd2;
1815 trace(NULL, 3,
"encode_type1042: sync=%d\n", sync);
1820 eph =
rtcm->nav.eph +
rtcm->ephsat - 1;
1821 if (eph->
sat !=
rtcm->ephsat) {
1824 week = eph->
week % 8192;
1913 int i = 24, prn, week, toe, toc, i0, OMG0, omg, M0, deln, idot, OMGd, crs, crc;
1914 int cus, cuc, cis, cic, af0, af1, af2, tgd1, tgd2;
1916 trace(NULL, 3,
"encode_type63: sync=%d\n", sync);
1921 eph =
rtcm->nav.eph +
rtcm->ephsat - 1;
1922 if (eph->
sat !=
rtcm->ephsat) {
1925 week = eph->
week % 8192;
2012 int refd,
int provid,
int solid) {
2014 int i = 24, msgno, epoch, week, udi, ns;
2017 "encode_ssr_head: type=%d sys=%d subtype=%d nsat=%d sync=%d iod=%d "
2019 type, sys, subtype, nsat, sync, iod, udint);
2022 ns = (sys ==
SYS_QZS) ? 4 : 6;
2025 msgno = (type == 7) ? 11 : 1056 + type;
2028 msgno = (type == 7) ? 0 : 1062 + type;
2031 msgno = (type == 7) ? 12 : 1239 + type;
2034 msgno = (type == 7) ? 13 : 1245 + type;
2037 msgno = (type == 7) ? 14 : 1257 + type;
2040 msgno = (type == 7) ? 0 : 1251 + type;
2053 epoch =
ROUND(tow) % 86400;
2058 epoch =
ROUND(tow) % 604800;
2065 epoch =
ROUND(tow) % 604800;
2075 for (udi = 0; udi < 15; udi++) {
2084 if (subtype == 0 && (type == 1 || type == 4)) {
2094 if (subtype > 0 && (type == 1 || type == 4)) {
2111 int i, j, iod = 0, nsat, prn, iode, iodcrc, refd = 0, np, ni, nj, offp, deph[3], ddeph[3];
2113 trace(NULL, 3,
"encode_ssr1: sys=%d subtype=%d sync=%d\n", sys, subtype, sync);
2166 for (j = nsat = 0; j <
MAXSAT; j++) {
2167 if (
satsys(j + 1, &prn) != sys || !
rtcm->ssr[j].update) {
2171 udint =
rtcm->ssr[j].udi[0];
2172 iod =
rtcm->ssr[j].iod[0];
2173 refd =
rtcm->ssr[j].refd;
2176 i =
encode_ssr_head(1,
rtcm, sys, subtype, nsat, sync, iod, udint, refd, 0, 0);
2178 for (j = 0; j <
MAXSAT; j++) {
2179 if (
satsys(j + 1, &prn) != sys || !
rtcm->ssr[j].update) {
2183 iode =
rtcm->ssr[j].iode;
2184 iodcrc =
rtcm->ssr[j].iodcrc;
2189 deph[0] =
ROUND(
rtcm->ssr[j].deph[0] / 1E-4);
2190 deph[1] =
ROUND(
rtcm->ssr[j].deph[1] / 4E-4);
2191 deph[2] =
ROUND(
rtcm->ssr[j].deph[2] / 4E-4);
2192 ddeph[0] =
ROUND(
rtcm->ssr[j].ddeph[0] / 1E-6);
2193 ddeph[1] =
ROUND(
rtcm->ssr[j].ddeph[1] / 4E-6);
2194 ddeph[2] =
ROUND(
rtcm->ssr[j].ddeph[2] / 4E-6);
2221 int i, j, iod = 0, nsat, prn, np, offp, dclk[3];
2223 trace(NULL, 3,
"encode_ssr2: sys=%d subtype=%d sync=%d\n", sys, subtype, sync);
2262 for (j = nsat = 0; j <
MAXSAT; j++) {
2263 if (
satsys(j + 1, &prn) != sys || !
rtcm->ssr[j].update) {
2267 udint =
rtcm->ssr[j].udi[1];
2268 iod =
rtcm->ssr[j].iod[1];
2271 i =
encode_ssr_head(2,
rtcm, sys, subtype, nsat, sync, iod, udint, 0, 0, 0);
2273 for (j = 0; j <
MAXSAT; j++) {
2274 if (
satsys(j + 1, &prn) != sys || !
rtcm->ssr[j].update) {
2278 dclk[0] =
ROUND(
rtcm->ssr[j].dclk[0] / 1E-4);
2279 dclk[1] =
ROUND(
rtcm->ssr[j].dclk[1] / 1E-6);
2280 dclk[2] =
ROUND(
rtcm->ssr[j].dclk[2] / 2E-8);
2296 const uint8_t* sigs;
2298 int i, j, k, iod = 0, nsat, prn, nbias, np, offp;
2301 trace(NULL, 3,
"encode_ssr3: sys=%d subtype=%d sync=%d\n", sys, subtype, sync);
2346 for (j = nsat = 0; j <
MAXSAT; j++) {
2347 if (
satsys(j + 1, &prn) != sys || !
rtcm->ssr[j].update) {
2351 udint =
rtcm->ssr[j].udi[4];
2352 iod =
rtcm->ssr[j].iod[4];
2355 i =
encode_ssr_head(3,
rtcm, sys, subtype, nsat, sync, iod, udint, 0, 0, 0);
2357 for (j = nsat = 0; j <
MAXSAT; j++) {
2358 if (
satsys(j + 1, &prn) != sys || !
rtcm->ssr[j].update) {
2362 for (k = nbias = 0; k < 32; k++) {
2363 if (!sigs[k] ||
rtcm->ssr[j].vcbias[sigs[k] - 1] == 0) {
2367 bias[nbias++] =
ROUND(
rtcm->ssr[j].cbias[sigs[k] - 1] / 0.01);
2374 for (k = 0; k < nbias; k++) {
2387 int i, j, iod = 0, nsat, prn, iode, iodcrc, refd = 0, np, ni, nj, offp;
2388 int deph[3], ddeph[3], dclk[3];
2390 trace(NULL, 3,
"encode_ssr4: sys=%d subtype=%d sync=%d\n", sys, subtype, sync);
2443 for (j = nsat = 0; j <
MAXSAT; j++) {
2444 if (
satsys(j + 1, &prn) != sys || !
rtcm->ssr[j].update) {
2448 udint =
rtcm->ssr[j].udi[0];
2449 iod =
rtcm->ssr[j].iod[0];
2450 refd =
rtcm->ssr[j].refd;
2453 i =
encode_ssr_head(4,
rtcm, sys, subtype, nsat, sync, iod, udint, refd, 0, 0);
2455 for (j = 0; j <
MAXSAT; j++) {
2456 if (
satsys(j + 1, &prn) != sys || !
rtcm->ssr[j].update) {
2460 iode =
rtcm->ssr[j].iode;
2461 iodcrc =
rtcm->ssr[j].iodcrc;
2466 deph[0] =
ROUND(
rtcm->ssr[j].deph[0] / 1E-4);
2467 deph[1] =
ROUND(
rtcm->ssr[j].deph[1] / 4E-4);
2468 deph[2] =
ROUND(
rtcm->ssr[j].deph[2] / 4E-4);
2469 ddeph[0] =
ROUND(
rtcm->ssr[j].ddeph[0] / 1E-6);
2470 ddeph[1] =
ROUND(
rtcm->ssr[j].ddeph[1] / 4E-6);
2471 ddeph[2] =
ROUND(
rtcm->ssr[j].ddeph[2] / 4E-6);
2472 dclk[0] =
ROUND(
rtcm->ssr[j].dclk[0] / 1E-4);
2473 dclk[1] =
ROUND(
rtcm->ssr[j].dclk[1] / 1E-6);
2474 dclk[2] =
ROUND(
rtcm->ssr[j].dclk[2] / 2E-8);
2507 int i, j, nsat, iod = 0, prn, ura, np, offp;
2509 trace(NULL, 3,
"encode_ssr5: sys=%d subtype=%d sync=%d\n", sys, subtype, sync);
2548 for (j = nsat = 0; j <
MAXSAT; j++) {
2549 if (
satsys(j + 1, &prn) != sys || !
rtcm->ssr[j].update) {
2553 udint =
rtcm->ssr[j].udi[3];
2554 iod =
rtcm->ssr[j].iod[3];
2557 i =
encode_ssr_head(5,
rtcm, sys, subtype, nsat, sync, iod, udint, 0, 0, 0);
2559 for (j = 0; j <
MAXSAT; j++) {
2560 if (
satsys(j + 1, &prn) != sys || !
rtcm->ssr[j].update) {
2564 ura =
rtcm->ssr[j].ura;
2576 int i, j, nsat, iod = 0, prn, hrclk, np, offp;
2578 trace(NULL, 3,
"encode_ssr6: sys=%d subtype=%d sync=%d\n", sys, subtype, sync);
2617 for (j = nsat = 0; j <
MAXSAT; j++) {
2618 if (
satsys(j + 1, &prn) != sys || !
rtcm->ssr[j].update) {
2622 udint =
rtcm->ssr[j].udi[2];
2623 iod =
rtcm->ssr[j].iod[2];
2626 i =
encode_ssr_head(6,
rtcm, sys, subtype, nsat, sync, iod, udint, 0, 0, 0);
2628 for (j = 0; j <
MAXSAT; j++) {
2629 if (
satsys(j + 1, &prn) != sys || !
rtcm->ssr[j].update) {
2633 hrclk =
ROUND(
rtcm->ssr[j].hrclk / 1E-4);
2645 const uint8_t* sigs;
2647 int i, j, k, iod = 0, nsat, prn, nbias, np, offp;
2651 trace(NULL, 3,
"encode_ssr7: sys=%d subtype=%d sync=%d\n", sys, subtype, sync);
2696 for (j = nsat = 0; j <
MAXSAT; j++) {
2697 if (
satsys(j + 1, &prn) != sys || !
rtcm->ssr[j].update) {
2701 udint =
rtcm->ssr[j].udi[5];
2702 iod =
rtcm->ssr[j].iod[5];
2705 i =
encode_ssr_head(7,
rtcm, sys, subtype, nsat, sync, iod, udint, 0, 0, 0);
2707 for (j = nsat = 0; j <
MAXSAT; j++) {
2708 if (
satsys(j + 1, &prn) != sys || !
rtcm->ssr[j].update) {
2712 for (k = nbias = 0; k < 32; k++) {
2713 if (!sigs[k] ||
rtcm->ssr[j].vpbias[sigs[k] - 1] == 0) {
2717 discnt[nbias] =
rtcm->ssr[j].discnt[sigs[k] - 1];
2718 pbias[nbias] =
ROUND(
rtcm->ssr[j].pbias[sigs[k] - 1] / 0.0001);
2719 stdpb[nbias++] =
ROUND(
rtcm->ssr[j].stdpb[sigs[k] - 1] / 0.0001);
2721 yaw_ang =
ROUND(
rtcm->ssr[j].yaw_ang / 180.0 * 256.0);
2722 yaw_rate =
ROUND(
rtcm->ssr[j].yaw_rate / 180.0 * 8192.0);
2732 for (k = 0; k < nbias; k++) {
2756 if (
satsys(sat, &prn) != sys) {
2770 const char** msm_sig;
2821 for (i = 0; i < 32; i++) {
2822 if (!strcmp(sig, msm_sig[i])) {
2830 uint8_t* cell_ind) {
2831 int i, j, sat, sig, cell;
2833 *nsat = *nsig = *ncell = 0;
2836 for (i = 0; i <
rtcm->obs.n; i++) {
2841 for (j = 0; j < NFREQ + NEXOBS; j++) {
2842 if (!(sig =
to_sigid(sys,
rtcm->obs.data[i].code[j]))) {
2846 sat_ind[sat - 1] = sig_ind[sig - 1] = 1;
2849 for (i = 0; i < 64; i++) {
2851 sat_ind[i] = ++(*nsat);
2854 for (i = 0; i < 32; i++) {
2856 sig_ind[i] = ++(*nsig);
2860 for (i = 0; i <
rtcm->obs.n; i++) {
2865 for (j = 0; j < NFREQ + NEXOBS; j++) {
2866 if (!(sig =
to_sigid(sys,
rtcm->obs.data[i].code[j]))) {
2870 cell = sig_ind[sig - 1] - 1 + (sat_ind[sat - 1] - 1) * (*nsig);
2874 for (i = 0; i < *nsat * (*nsig); i++) {
2875 if (cell_ind[i] && *ncell < 64) {
2876 cell_ind[i] = ++(*ncell);
2885 int i, j, k, sat, sig, fcn;
2887 for (i = 0; i < 64; i++) {
2888 rrng[i] = rrate[i] = 0.0;
2891 for (i = 0; i <
rtcm->obs.n; i++) {
2892 data =
rtcm->obs.data + i;
2899 for (j = 0; j < NFREQ + NEXOBS; j++) {
2903 k = sat_ind[sat - 1] - 1;
2907 if (rrng[k] == 0.0 && data->
P[j] != 0.0) {
2910 if (rrate[k] == 0.0 && data->
D[j] != 0.0 && freq > 0.0) {
2915 info[k] = sys !=
SYS_GLO ? 0 : (fcn < 0 ? 15 : fcn);
2922 const uint8_t* sig_ind,
const uint8_t* cell_ind,
const double* rrng,
const double* rrate,
2923 double* psrng,
double* phrng,
double* rate,
double* lock, uint8_t* half,
float* cnr) {
2925 double freq,
lambda, psrng_s, phrng_s, rate_s, lt;
2926 int i, j, k, sat, sig, fcn, cell, LLI;
2928 for (i = 0; i < ncell; i++) {
2939 for (i = 0; i <
rtcm->obs.n; i++) {
2940 data =
rtcm->obs.data + i;
2947 for (j = 0; j < NFREQ + NEXOBS; j++) {
2952 k = sat_ind[sat - 1] - 1;
2953 if ((cell = cell_ind[sig_ind[sig - 1] - 1 + k * nsig]) >= 64) {
2959 psrng_s = data->
P[j] == 0.0 ? 0.0 : data->
P[j] - rrng[k];
2960 phrng_s = data->
L[j] == 0.0 ||
lambda <= 0.0 ? 0.0 : data->
L[j] *
lambda - rrng[k];
2961 rate_s = data->
D[j] == 0.0 ||
lambda <= 0.0 ? 0.0 : -data->
D[j] *
lambda - rrate[k];
2965 if ((LLI & 1) || fabs(phrng_s -
rtcm->cp[data->
sat - 1][j]) > 1171.0) {
2969 phrng_s -=
rtcm->cp[data->
sat - 1][j];
2973 if (psrng && psrng_s != 0.0) {
2974 psrng[cell - 1] = psrng_s;
2976 if (phrng && phrng_s != 0.0) {
2977 phrng[cell - 1] = phrng_s;
2979 if (rate && rate_s != 0.0) {
2980 rate[cell - 1] = rate_s;
2983 lock[cell - 1] = lt;
2986 half[cell - 1] = (data->
LLI[j] & 2) ? 1 : 0;
2996 double* rrate, uint8_t* info,
double* psrng,
double* phrng,
double* rate,
double* lock,
2997 uint8_t* half,
float* cnr) {
2999 uint8_t sat_ind[64] = {0}, sig_ind[32] = {0}, cell_ind[32 * 64] = {0};
3000 uint32_t dow, epoch;
3001 int i = 24, j, nsig = 0;
3034 dow = (uint32_t)(tow / 86400.0);
3035 epoch = (dow << 27) +
ROUND_U(fmod(tow, 86400.0) * 1E3);
3066 for (j = 0; j < 64; j++) {
3071 for (j = 0; j < 32; j++) {
3076 for (j = 0; j < *nsat * nsig && j < 64; j++) {
3084 gen_msm_sig(
rtcm, sys, *nsat, nsig, *ncell, sat_ind, sig_ind, cell_ind, rrng, rrate, psrng, phrng, rate, lock, half,
3094 for (j = 0; j < nsat; j++) {
3095 if (rrng[j] == 0.0) {
3097 }
else if (rrng[j] < 0.0 || rrng[j] >
RANGE_MS * 255.0) {
3098 trace(NULL, 2,
"msm rough range overflow %s rrng=%.3f\n",
time_str(
rtcm->time, 0), rrng[j]);
3113 for (j = 0; j < nsat; j++) {
3114 if (rrng[j] <= 0.0 || rrng[j] >
RANGE_MS * 255.0) {
3128 for (j = 0; j < nsat; j++) {
3138 for (j = 0; j < nsat; j++) {
3139 if (fabs(rrate[j]) > 8191.0) {
3140 trace(NULL, 2,
"msm rough phase-range-rate overflow %s rrate=%.4f\n",
time_str(
rtcm->time, 0), rrate[j]);
3143 rrate_val =
ROUND(rrate[j] / 1.0);
3154 for (j = 0; j < ncell; j++) {
3155 if (psrng[j] == 0.0) {
3157 }
else if (fabs(psrng[j]) > 292.7) {
3158 trace(NULL, 2,
"msm fine pseudorange overflow %s psrng=%.3f\n",
time_str(
rtcm->time, 0), psrng[j]);
3172 for (j = 0; j < ncell; j++) {
3173 if (psrng[j] == 0.0) {
3174 psrng_val = -524288;
3175 }
else if (fabs(psrng[j]) > 292.7) {
3176 trace(NULL, 2,
"msm fine pseudorange ext overflow %s psrng=%.3f\n",
time_str(
rtcm->time, 0), psrng[j]);
3177 psrng_val = -524288;
3190 for (j = 0; j < ncell; j++) {
3191 if (phrng[j] == 0.0) {
3192 phrng_val = -2097152;
3193 }
else if (fabs(phrng[j]) > 1171.0) {
3194 trace(NULL, 2,
"msm fine phase-range overflow %s phrng=%.3f\n",
time_str(
rtcm->time, 0), phrng[j]);
3195 phrng_val = -2097152;
3208 for (j = 0; j < ncell; j++) {
3209 if (phrng[j] == 0.0) {
3210 phrng_val = -8388608;
3211 }
else if (fabs(phrng[j]) > 1171.0) {
3212 trace(NULL, 2,
"msm fine phase-range ext overflow %s phrng=%.3f\n",
time_str(
rtcm->time, 0), phrng[j]);
3213 phrng_val = -8388608;
3226 for (j = 0; j < ncell; j++) {
3237 for (j = 0; j < ncell; j++) {
3248 for (j = 0; j < ncell; j++) {
3258 for (j = 0; j < ncell; j++) {
3259 cnr_val =
ROUND(cnr[j] / 1.0);
3269 for (j = 0; j < ncell; j++) {
3270 cnr_val =
ROUND(cnr[j] / 0.0625);
3280 for (j = 0; j < ncell; j++) {
3281 if (rate[j] == 0.0) {
3283 }
else if (fabs(rate[j]) > 1.6384) {
3284 trace(NULL, 2,
"msm fine phase-range-rate overflow %s rate=%.3f\n",
time_str(
rtcm->time, 0), rate[j]);
3287 rate_val =
ROUND(rate[j] / 0.0001);
3296 double rrng[64], rrate[64], psrng[64];
3299 trace(NULL, 3,
"encode_msm1: sys=%d sync=%d\n", sys, sync);
3302 if (!(i =
encode_msm_head(1,
rtcm, sys, sync, &nsat, &ncell, rrng, rrate, NULL, psrng, NULL, NULL, NULL, NULL,
3317 double rrng[64], rrate[64], phrng[64], lock[64];
3321 trace(NULL, 3,
"encode_msm2: sys=%d sync=%d\n", sys, sync);
3324 if (!(i =
encode_msm_head(2,
rtcm, sys, sync, &nsat, &ncell, rrng, rrate, NULL, NULL, phrng, NULL, lock, half,
3341 double rrng[64], rrate[64], psrng[64], phrng[64], lock[64];
3345 trace(NULL, 3,
"encode_msm3: sys=%d sync=%d\n", sys, sync);
3348 if (!(i =
encode_msm_head(3,
rtcm, sys, sync, &nsat, &ncell, rrng, rrate, NULL, psrng, phrng, NULL, lock, half,
3366 double rrng[64], rrate[64], psrng[64], phrng[64], lock[64];
3371 trace(NULL, 3,
"encode_msm4: sys=%d sync=%d\n", sys, sync);
3374 if (!(i =
encode_msm_head(4,
rtcm, sys, sync, &nsat, &ncell, rrng, rrate, NULL, psrng, phrng, NULL, lock, half,
3393 double rrng[64], rrate[64], psrng[64], phrng[64], rate[64], lock[64];
3395 uint8_t info[64], half[64];
3398 trace(NULL, 3,
"encode_msm5: sys=%d sync=%d\n", sys, sync);
3401 if (!(i =
encode_msm_head(5,
rtcm, sys, sync, &nsat, &ncell, rrng, rrate, info, psrng, phrng, rate, lock, half,
3423 double rrng[64], rrate[64], psrng[64], phrng[64], lock[64];
3428 trace(NULL, 3,
"encode_msm6: sys=%d sync=%d\n", sys, sync);
3431 if (!(i =
encode_msm_head(6,
rtcm, sys, sync, &nsat, &ncell, rrng, rrate, NULL, psrng, phrng, NULL, lock, half,
3450 double rrng[64], rrate[64], psrng[64], phrng[64], rate[64], lock[64];
3452 uint8_t info[64], half[64];
3455 trace(NULL, 3,
"encode_msm7: sys=%d sync=%d\n", sys, sync);
3458 if (!(i =
encode_msm_head(7,
rtcm, sys, sync, &nsat, &ncell, rrng, rrate, info, psrng, phrng, rate, lock, half,
3480 int i = 24, j, align, mask = 15, bias[4];
3482 trace(NULL, 3,
"encode_type1230: sync=%d\n", sync);
3484 align =
rtcm->sta.glo_cp_align;
3486 for (j = 0; j < 4; j++) {
3487 bias[j] =
ROUND(
rtcm->sta.glo_cp_bias[j] / 0.02);
3488 if (bias[j] <= -32768 || bias[j] > 32767) {
3515 trace(NULL, 2,
"rtcm3 4073: unsupported message subtype=%d\n", subtype);
3606 trace(NULL, 2,
"rtcm3 4076: unsupported message subtype=%d\n", subtype);
3613 trace(NULL, 3,
"encode_rtcm3: type=%d subtype=%d sync=%d\n", type, subtype, sync);
3993 if (1001 <= type && type <= 1299) {
3994 rtcm->nmsg3[type - 1000]++;
3995 }
else if (4070 <= type && type <= 4099) {
3996 rtcm->nmsg3[type - 3770]++;
char * code2obs(uint8_t code)
void setbitu(uint8_t *buff, int pos, int len, uint32_t data)
Set unsigned bits in byte data.
void setbits(uint8_t *buff, int pos, int len, int32_t data)
Set signed bits in byte data.
MRTKLIB Bits Module — Binary bit operations and CRC functions.
static const double ssrudint[16]
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)
int lambda(int n, int m, const double *a, const double *Q, double *F, double *s)
Integer least-square estimation (LAMBDA/MLAMBDA).
MRTKLIB Observation Module — Observation data types and utility functions.
const uint8_t ssr_sig_qzs[32]
const uint8_t ssr_sig_gps[32]
const uint8_t ssr_sig_gal[32]
const char * msm_sig_glo[32]
const uint8_t ssr_sig_glo[32]
const uint8_t ssr_sig_sbs[32]
const char * msm_sig_gps[32]
const uint8_t ssr_sig_cmp[32]
const char * msm_sig_irn[32]
const char * msm_sig_gal[32]
const char * msm_sig_sbs[32]
const char * msm_sig_qzs[32]
const char * msm_sig_cmp[32]
int encode_lcltrop(rtcm_t *rtcm, int type)
Encode local tropospheric delay correction grid RTCM message.
int encode_lcliono(rtcm_t *rtcm, int type)
Encode local ionospheric delay correction grid RTCM message.
static int encode_msm_cnr_ex(rtcm_t *rtcm, int i, const float *cnr, int ncell)
static void gen_obs_glo(rtcm_t *rtcm, const obsd_t *data, int fcn, int *code1, int *pr1, int *ppr1, int *lock1, int *amb, int *cnr1, int *code2, int *pr21, int *ppr2, int *lock2, int *cnr2)
static int encode_ssr7(rtcm_t *rtcm, int sys, int subtype, int sync)
static int encode_msm_rrate(rtcm_t *rtcm, int i, const double *rrate, int nsat)
static int encode_type1020(rtcm_t *rtcm, int sync)
static double cp_pr(double cp, double pr_cyc)
static int encode_msm_half_amb(rtcm_t *rtcm, int i, const uint8_t *half, int ncell)
static int encode_msm6(rtcm_t *rtcm, int sys, int sync)
int encode_rtcm3(rtcm_t *rtcm, int type, int subtype, int sync)
Encode RTCM ver.3 message (called from rtcm.c).
static int to_code2_glo(uint8_t code)
static int encode_msm_int_rrng(rtcm_t *rtcm, int i, const double *rrng, int nsat)
static void gen_msm_sat(rtcm_t *rtcm, int sys, int nsat, const uint8_t *sat_ind, double *rrng, double *rrate, uint8_t *info)
static int encode_type1041(rtcm_t *rtcm, int sync)
static int encode_msm_mod_rrng(rtcm_t *rtcm, int i, const double *rrng, int nsat)
static void setbitg(uint8_t *buff, int pos, int len, int32_t value)
static double locktime_d(gtime_t time, gtime_t *lltime, uint8_t LLI)
static int to_code1_glo(uint8_t code)
static int encode_msm7(rtcm_t *rtcm, int sys, int sync)
static int encode_type1011(rtcm_t *rtcm, int sync)
static int encode_msm2(rtcm_t *rtcm, int sys, int sync)
static int encode_ssr5(rtcm_t *rtcm, int sys, int subtype, int sync)
static int encode_msm4(rtcm_t *rtcm, int sys, int sync)
static int to_code2_gps(uint8_t code)
static int encode_type1045(rtcm_t *rtcm, int sync)
static int encode_msm_rate(rtcm_t *rtcm, int i, const double *rate, int ncell)
static int encode_ssr_head(int type, rtcm_t *rtcm, int sys, int subtype, int nsat, int sync, int iod, double udint, int refd, int provid, int solid)
static int encode_type1033(rtcm_t *rtcm, int sync)
static void gen_msm_index(rtcm_t *rtcm, int sys, int *nsat, int *nsig, int *ncell, uint8_t *sat_ind, uint8_t *sig_ind, uint8_t *cell_ind)
static int locktime(gtime_t time, gtime_t *lltime, uint8_t LLI)
static int to_msm_lock_ex(double lock)
static int to_msm_lock(double lock)
static int encode_msm3(rtcm_t *rtcm, int sys, int sync)
static int encode_type1003(rtcm_t *rtcm, int sync)
static int encode_msm1(rtcm_t *rtcm, int sys, int sync)
static int encode_type1005(rtcm_t *rtcm, int sync)
static int encode_msm_phrng_ex(rtcm_t *rtcm, int i, const double *phrng, int ncell)
static int fcn_glo(int sat, rtcm_t *rtcm)
static int encode_msm_psrng(rtcm_t *rtcm, int i, const double *psrng, int ncell)
static int encode_msm_phrng(rtcm_t *rtcm, int i, const double *phrng, int ncell)
static void gen_obs_gps(rtcm_t *rtcm, const obsd_t *data, int *code1, int *pr1, int *ppr1, int *lock1, int *amb, int *cnr1, int *code2, int *pr21, int *ppr2, int *lock2, int *cnr2)
static int encode_ssr2(rtcm_t *rtcm, int sys, int subtype, int sync)
static int encode_msm_psrng_ex(rtcm_t *rtcm, int i, const double *psrng, int ncell)
static int encode_ssr3(rtcm_t *rtcm, int sys, int subtype, int sync)
static int to_satid(int sys, int sat)
static int encode_head(int type, rtcm_t *rtcm, int sys, int sync, int nsat)
static int encode_type1002(rtcm_t *rtcm, int sync)
static int encode_type1009(rtcm_t *rtcm, int sync)
static int encode_type1007(rtcm_t *rtcm, int sync)
static int to_code1_gps(uint8_t code)
static int encode_type1046(rtcm_t *rtcm, int sync)
static int encode_type4076(rtcm_t *rtcm, int subtype, int sync)
static int encode_type1044(rtcm_t *rtcm, int sync)
static int encode_msm_lock_ex(rtcm_t *rtcm, int i, const double *lock, int ncell)
static int encode_ssr4(rtcm_t *rtcm, int sys, int subtype, int sync)
static int encode_type63(rtcm_t *rtcm, int sync)
static int encode_msm_lock(rtcm_t *rtcm, int i, const double *lock, int ncell)
static void set38bits(uint8_t *buff, int pos, double value)
static int encode_type1230(rtcm_t *rtcm, int sync)
static int encode_msm_head(int type, rtcm_t *rtcm, int sys, int sync, int *nsat, int *ncell, double *rrng, double *rrate, uint8_t *info, double *psrng, double *phrng, double *rate, double *lock, uint8_t *half, float *cnr)
static int encode_type4073(rtcm_t *rtcm, int subtype, int sync)
static int encode_type1006(rtcm_t *rtcm, int sync)
static int encode_type1010(rtcm_t *rtcm, int sync)
static int encode_type1008(rtcm_t *rtcm, int sync)
static int encode_type1019(rtcm_t *rtcm, int sync)
static void gen_msm_sig(rtcm_t *rtcm, int sys, int nsat, int nsig, int ncell, const uint8_t *sat_ind, const uint8_t *sig_ind, const uint8_t *cell_ind, const double *rrng, const double *rrate, double *psrng, double *phrng, double *rate, double *lock, uint8_t *half, float *cnr)
static int encode_type1004(rtcm_t *rtcm, int sync)
static int encode_ssr6(rtcm_t *rtcm, int sys, int subtype, int sync)
static int encode_msm_cnr(rtcm_t *rtcm, int i, const float *cnr, int ncell)
static int to_sigid(int sys, uint8_t code)
static int to_lock(int lock)
static int encode_type1012(rtcm_t *rtcm, int sync)
static int encode_msm5(rtcm_t *rtcm, int sys, int sync)
static int encode_type1001(rtcm_t *rtcm, int sync)
static int encode_ssr1(rtcm_t *rtcm, int sys, int subtype, int sync)
static int encode_type1042(rtcm_t *rtcm, int sync)
static int encode_msm_info(rtcm_t *rtcm, int i, const uint8_t *info, int nsat)
MRTKLIB RTCM Module — RTCM message types and functions.
MRTKLIB System Module — OS/filesystem utility functions.
gtime_t epoch2time(const double *ep)
Convert calendar day/time to gtime_t struct.
void time2epoch(gtime_t t, double *ep)
Convert gtime_t struct to calendar day/time.
gtime_t gpst2bdt(gtime_t t)
Convert GPS time to BeiDou time.
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.
double time2bdt(gtime_t t, int *week)
Convert gtime_t to BeiDou time 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).
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.
RTCM control struct type.