MRTKLIB 0.7.14
Modernized GNSS Positioning Library
Loading...
Searching...
No Matches
mrtk_rtcm2.c
Go to the documentation of this file.
1/*------------------------------------------------------------------------------
2 * mrtk_rtcm2.c : RTCM version 2 message functions
3 *
4 * Copyright (C) 2026 H.SHIONO (MRTKLIB Project)
5 * Copyright (C) 2023-2025 Cabinet Office, Japan
6 * Copyright (C) 2024-2025 Lighthouse Technology & Consulting Co. Ltd.
7 * Copyright (C) 2023-2025 Japan Aerospace Exploration Agency
8 * Copyright (C) 2023-2025 TOSHIBA ELECTRONIC TECHNOLOGIES CORPORATION
9 * Copyright (C) 2015- Mitsubishi Electric Corp.
10 * Copyright (C) 2014 Geospatial Information Authority of Japan
11 * Copyright (C) 2014 T.SUZUKI
12 * Copyright (C) 2007-2023 T.TAKASU
13 *
14 * SPDX-License-Identifier: BSD-2-Clause
15 *----------------------------------------------------------------------------*/
16/**
17 * @file mrtk_rtcm2.c
18 * @brief MRTKLIB RTCM Module — RTCM ver.2 message decoder.
19 */
20#include <math.h>
21#include <stdlib.h>
22#include <string.h>
23
24#include "mrtklib/mrtk_bits.h"
25#include "mrtklib/mrtk_eph.h"
26#include "mrtklib/mrtk_rtcm.h"
27#include "mrtklib/mrtk_sys.h"
28#include "mrtklib/mrtk_trace.h"
29
30/*--- local constants (duplicated to avoid rtklib.h dependency) -------------*/
31#define SYS_GPS 0x01
32#define SYS_GLO 0x04
33
34static const double SC2RAD = 3.1415926535898;
35
36#define P2_5 0.03125
37#define P2_19 1.907348632812500E-06
38#define P2_29 1.862645149230957E-09
39#define P2_31 4.656612873077393E-10
40#define P2_33 1.164153218269348E-10
41#define P2_43 1.136868377216160E-13
42#define P2_55 2.775557561562891E-17
43
44/*--- forward declarations for legacy functions resolved at link time -------*/
45
46/* adjust hourly rollover of rtcm 2 time -------------------------------------*/
47static void adjhour(rtcm_t* rtcm, double zcnt) {
48 double tow, hour, sec;
49 int week;
50
51 /* if no time, get cpu time */
52 if (rtcm->time.time == 0) {
53 rtcm->time = utc2gpst(timeget());
54 }
55 tow = time2gpst(rtcm->time, &week);
56 hour = floor(tow / 3600.0);
57 sec = tow - hour * 3600.0;
58 if (zcnt < sec - 1800.0) {
59 zcnt += 3600.0;
60 } else if (zcnt > sec + 1800.0) {
61 zcnt -= 3600.0;
62 }
63 rtcm->time = gpst2time(week, hour * 3600 + zcnt);
64}
65/* get observation data index ------------------------------------------------*/
66static int obsindex(obs_t* obs, gtime_t time, int sat) {
67 int i, j;
68
69 for (i = 0; i < obs->n; i++) {
70 if (obs->data[i].sat == sat) {
71 return i; /* field already exists */
72 }
73 }
74 if (i >= MAXOBS) {
75 return -1; /* overflow */
76 }
77
78 /* add new field */
79 obs->data[i].time = time;
80 obs->data[i].sat = sat;
81 for (j = 0; j < NFREQ; j++) {
82 obs->data[i].L[j] = obs->data[i].P[j] = 0.0;
83 obs->data[i].D[j] = 0.0;
84 obs->data[i].SNR[j] = obs->data[i].LLI[j] = obs->data[i].code[j] = 0;
85 }
86 obs->n++;
87 return i;
88}
89/* decode type 1/9: differential gps correction/partial correction set -------*/
90static int decode_type1(rtcm_t* rtcm) {
91 int i = 48, fact, udre, prn, sat, iod;
92 double prc, rrc;
93
94 trace(NULL, 4, "decode_type1: len=%d\n", rtcm->len);
95
96 while (i + 40 <= rtcm->len * 8) {
97 fact = getbitu(rtcm->buff, i, 1);
98 i += 1;
99 udre = getbitu(rtcm->buff, i, 2);
100 i += 2;
101 prn = getbitu(rtcm->buff, i, 5);
102 i += 5;
103 prc = getbits(rtcm->buff, i, 16);
104 i += 16;
105 rrc = getbits(rtcm->buff, i, 8);
106 i += 8;
107 iod = getbits(rtcm->buff, i, 8);
108 i += 8;
109 if (prn == 0) {
110 prn = 32;
111 }
112 if (prc == 0x80000000 || rrc == 0xFFFF8000) {
113 trace(NULL, 2, "rtcm2 1 prc/rrc indicates satellite problem: prn=%d\n", prn);
114 continue;
115 }
116 if (rtcm->dgps) {
117 sat = satno(SYS_GPS, prn);
118 rtcm->dgps[sat - 1].t0 = rtcm->time;
119 rtcm->dgps[sat - 1].prc = prc * (fact ? 0.32 : 0.02);
120 rtcm->dgps[sat - 1].rrc = rrc * (fact ? 0.032 : 0.002);
121 rtcm->dgps[sat - 1].iod = iod;
122 rtcm->dgps[sat - 1].udre = udre;
123 }
124 }
125 return 7;
126}
127/* decode type 3: reference station parameter --------------------------------*/
129 int i = 48;
130
131 trace(NULL, 4, "decode_type3: len=%d\n", rtcm->len);
132
133 if (i + 96 <= rtcm->len * 8) {
134 rtcm->sta.pos[0] = getbits(rtcm->buff, i, 32) * 0.01;
135 i += 32;
136 rtcm->sta.pos[1] = getbits(rtcm->buff, i, 32) * 0.01;
137 i += 32;
138 rtcm->sta.pos[2] = getbits(rtcm->buff, i, 32) * 0.01;
139 } else {
140 trace(NULL, 2, "rtcm2 3 length error: len=%d\n", rtcm->len);
141 return -1;
142 }
143 return 5;
144}
145/* decode type 14: gps time of week ------------------------------------------*/
147 double zcnt;
148 int i = 48, week, hour, leaps;
149
150 trace(NULL, 4, "decode_type14: len=%d\n", rtcm->len);
151
152 zcnt = getbitu(rtcm->buff, 24, 13);
153 if (i + 24 <= rtcm->len * 8) {
154 week = getbitu(rtcm->buff, i, 10);
155 i += 10;
156 hour = getbitu(rtcm->buff, i, 8);
157 i += 8;
158 leaps = getbitu(rtcm->buff, i, 6);
159 } else {
160 trace(NULL, 2, "rtcm2 14 length error: len=%d\n", rtcm->len);
161 return -1;
162 }
163 week = adjgpsweek(week);
164 rtcm->time = gpst2time(week, hour * 3600.0 + zcnt * 0.6);
165 rtcm->nav.utc_gps[4] = leaps;
166 return 6;
167}
168/* decode type 16: gps special message ---------------------------------------*/
170 int i = 48, n = 0;
171
172 trace(NULL, 4, "decode_type16: len=%d\n", rtcm->len);
173
174 while (i + 8 <= rtcm->len * 8 && n < 90) {
175 rtcm->msg[n++] = getbitu(rtcm->buff, i, 8);
176 i += 8;
177 }
178 rtcm->msg[n] = '\0';
179
180 trace(NULL, 3, "rtcm2 16 message: %s\n", rtcm->msg);
181 return 9;
182}
183/* decode type 17: gps ephemerides -------------------------------------------*/
185 eph_t eph = {0};
186 double toc, sqrtA;
187 int i = 48, week, prn, sat;
188
189 trace(NULL, 4, "decode_type17: len=%d\n", rtcm->len);
190
191 if (i + 480 <= rtcm->len * 8) {
192 week = getbitu(rtcm->buff, i, 10);
193 i += 10;
194 eph.idot = getbits(rtcm->buff, i, 14) * P2_43 * SC2RAD;
195 i += 14;
196 eph.iode = getbitu(rtcm->buff, i, 8);
197 i += 8;
198 toc = getbitu(rtcm->buff, i, 16) * 16.0;
199 i += 16;
200 eph.f1 = getbits(rtcm->buff, i, 16) * P2_43;
201 i += 16;
202 eph.f2 = getbits(rtcm->buff, i, 8) * P2_55;
203 i += 8;
204 eph.crs = getbits(rtcm->buff, i, 16) * P2_5;
205 i += 16;
206 eph.deln = getbits(rtcm->buff, i, 16) * P2_43 * SC2RAD;
207 i += 16;
208 eph.cuc = getbits(rtcm->buff, i, 16) * P2_29;
209 i += 16;
210 eph.e = getbitu(rtcm->buff, i, 32) * P2_33;
211 i += 32;
212 eph.cus = getbits(rtcm->buff, i, 16);
213 i += 16;
214 sqrtA = getbitu(rtcm->buff, i, 32) * P2_19;
215 i += 32;
216 eph.toes = getbitu(rtcm->buff, i, 16);
217 i += 16;
218 eph.OMG0 = getbits(rtcm->buff, i, 32) * P2_31 * SC2RAD;
219 i += 32;
220 eph.cic = getbits(rtcm->buff, i, 16) * P2_29;
221 i += 16;
222 eph.i0 = getbits(rtcm->buff, i, 32) * P2_31 * SC2RAD;
223 i += 32;
224 eph.cis = getbits(rtcm->buff, i, 16) * P2_29;
225 i += 16;
226 eph.omg = getbits(rtcm->buff, i, 32) * P2_31 * SC2RAD;
227 i += 32;
228 eph.crc = getbits(rtcm->buff, i, 16) * P2_5;
229 i += 16;
230 eph.OMGd = getbits(rtcm->buff, i, 24) * P2_43 * SC2RAD;
231 i += 24;
232 eph.M0 = getbits(rtcm->buff, i, 32) * P2_31 * SC2RAD;
233 i += 32;
234 eph.iodc = getbitu(rtcm->buff, i, 10);
235 i += 10;
236 eph.f0 = getbits(rtcm->buff, i, 22) * P2_31;
237 i += 22;
238 prn = getbitu(rtcm->buff, i, 5);
239 i += 5 + 3;
240 eph.tgd[0] = getbits(rtcm->buff, i, 8) * P2_31;
241 i += 8;
242 eph.code = getbitu(rtcm->buff, i, 2);
243 i += 2;
244 eph.sva = getbitu(rtcm->buff, i, 4);
245 i += 4;
246 eph.svh = getbitu(rtcm->buff, i, 6);
247 i += 6;
248 eph.flag = getbitu(rtcm->buff, i, 1);
249 } else {
250 trace(NULL, 2, "rtcm2 17 length error: len=%d\n", rtcm->len);
251 return -1;
252 }
253 if (prn == 0) {
254 prn = 32;
255 }
256 sat = satno(SYS_GPS, prn);
257 eph.sat = sat;
258 eph.week = adjgpsweek(week);
259 eph.toe = gpst2time(eph.week, eph.toes);
260 eph.toc = gpst2time(eph.week, toc);
261 eph.ttr = rtcm->time;
262 eph.A = sqrtA * sqrtA;
263 rtcm->nav.eph[sat - 1] = eph;
264 rtcm->ephset = 0;
265 rtcm->ephsat = sat;
266 return 2;
267}
268/* decode type 18: rtk uncorrected carrier-phase -----------------------------*/
270 gtime_t time;
271 double usec, cp, tt;
272 int i = 48, index, freq, sync = 1, code, sys, prn, sat, loss;
273
274 trace(NULL, 4, "decode_type18: len=%d\n", rtcm->len);
275
276 if (i + 24 <= rtcm->len * 8) {
277 freq = getbitu(rtcm->buff, i, 2);
278 i += 2 + 2;
279 usec = getbitu(rtcm->buff, i, 20);
280 i += 20;
281 } else {
282 trace(NULL, 2, "rtcm2 18 length error: len=%d\n", rtcm->len);
283 return -1;
284 }
285 if (freq & 0x1) {
286 trace(NULL, 2, "rtcm2 18 not supported frequency: freq=%d\n", freq);
287 return -1;
288 }
289 freq >>= 1;
290
291 while (i + 48 <= rtcm->len * 8 && rtcm->obs.n < MAXOBS) {
292 sync = getbitu(rtcm->buff, i, 1);
293 i += 1;
294 code = getbitu(rtcm->buff, i, 1);
295 i += 1;
296 sys = getbitu(rtcm->buff, i, 1);
297 i += 1;
298 prn = getbitu(rtcm->buff, i, 5);
299 i += 5 + 3;
300 loss = getbitu(rtcm->buff, i, 5);
301 i += 5;
302 cp = getbits(rtcm->buff, i, 32);
303 i += 32;
304 if (prn == 0) {
305 prn = 32;
306 }
307 if (!(sat = satno(sys ? SYS_GLO : SYS_GPS, prn))) {
308 trace(NULL, 2, "rtcm2 18 satellite number error: sys=%d prn=%d\n", sys, prn);
309 continue;
310 }
311 time = timeadd(rtcm->time, usec * 1E-6);
312 if (sys) {
313 time = utc2gpst(time); /* convert glonass time to gpst */
314 }
315
316 tt = timediff(rtcm->obs.data[0].time, time);
317 if (rtcm->obsflag || fabs(tt) > 1E-9) {
318 rtcm->obs.n = rtcm->obsflag = 0;
319 }
320 if ((index = obsindex(&rtcm->obs, time, sat)) >= 0) {
321 rtcm->obs.data[index].L[freq] = -cp / 256.0;
322 rtcm->obs.data[index].LLI[freq] = rtcm->loss[sat - 1][freq] != loss;
323 if (!freq) {
324 rtcm->obs.data[index].code[freq] = code ? CODE_L1P : CODE_L1C;
325 } else {
326 rtcm->obs.data[index].code[freq] = code ? CODE_L2P : CODE_L2C;
327 }
328 rtcm->loss[sat - 1][freq] = loss;
329 }
330 }
331 rtcm->obsflag = !sync;
332 return sync ? 0 : 1;
333}
334/* decode type 19: rtk uncorrected pseudorange -------------------------------*/
336 gtime_t time;
337 double usec, pr, tt;
338 int i = 48, index, freq, sync = 1, code, sys, prn, sat;
339
340 trace(NULL, 4, "decode_type19: len=%d\n", rtcm->len);
341
342 if (i + 24 <= rtcm->len * 8) {
343 freq = getbitu(rtcm->buff, i, 2);
344 i += 2 + 2;
345 usec = getbitu(rtcm->buff, i, 20);
346 i += 20;
347 } else {
348 trace(NULL, 2, "rtcm2 19 length error: len=%d\n", rtcm->len);
349 return -1;
350 }
351 if (freq & 0x1) {
352 trace(NULL, 2, "rtcm2 19 not supported frequency: freq=%d\n", freq);
353 return -1;
354 }
355 freq >>= 1;
356
357 while (i + 48 <= rtcm->len * 8 && rtcm->obs.n < MAXOBS) {
358 sync = getbitu(rtcm->buff, i, 1);
359 i += 1;
360 code = getbitu(rtcm->buff, i, 1);
361 i += 1;
362 sys = getbitu(rtcm->buff, i, 1);
363 i += 1;
364 prn = getbitu(rtcm->buff, i, 5);
365 i += 5 + 8;
366 pr = getbitu(rtcm->buff, i, 32);
367 i += 32;
368 if (prn == 0) {
369 prn = 32;
370 }
371 if (!(sat = satno(sys ? SYS_GLO : SYS_GPS, prn))) {
372 trace(NULL, 2, "rtcm2 19 satellite number error: sys=%d prn=%d\n", sys, prn);
373 continue;
374 }
375 time = timeadd(rtcm->time, usec * 1E-6);
376 if (sys) {
377 time = utc2gpst(time); /* convert glonass time to gpst */
378 }
379
380 tt = timediff(rtcm->obs.data[0].time, time);
381 if (rtcm->obsflag || fabs(tt) > 1E-9) {
382 rtcm->obs.n = rtcm->obsflag = 0;
383 }
384 if ((index = obsindex(&rtcm->obs, time, sat)) >= 0) {
385 rtcm->obs.data[index].P[freq] = pr * 0.02;
386 if (!freq) {
387 rtcm->obs.data[index].code[freq] = code ? CODE_L1P : CODE_L1C;
388 } else {
389 rtcm->obs.data[index].code[freq] = code ? CODE_L2P : CODE_L2C;
390 }
391 }
392 }
393 rtcm->obsflag = !sync;
394 return sync ? 0 : 1;
395}
396/* decode type 22: extended reference station parameter ----------------------*/
398 double del[2][3] = {{0}}, hgt = 0.0;
399 int i = 48, j, noh;
400
401 trace(NULL, 4, "decode_type22: len=%d\n", rtcm->len);
402
403 if (i + 24 <= rtcm->len * 8) {
404 del[0][0] = getbits(rtcm->buff, i, 8) / 25600.0;
405 i += 8;
406 del[0][1] = getbits(rtcm->buff, i, 8) / 25600.0;
407 i += 8;
408 del[0][2] = getbits(rtcm->buff, i, 8) / 25600.0;
409 i += 8;
410 } else {
411 trace(NULL, 2, "rtcm2 22 length error: len=%d\n", rtcm->len);
412 return -1;
413 }
414 if (i + 24 <= rtcm->len * 8) {
415 i += 5;
416 noh = getbits(rtcm->buff, i, 1);
417 i += 1;
418 hgt = noh ? 0.0 : getbitu(rtcm->buff, i, 18) / 25600.0;
419 i += 18;
420 }
421 if (i + 24 <= rtcm->len * 8) {
422 del[1][0] = getbits(rtcm->buff, i, 8) / 1600.0;
423 i += 8;
424 del[1][1] = getbits(rtcm->buff, i, 8) / 1600.0;
425 i += 8;
426 del[1][2] = getbits(rtcm->buff, i, 8) / 1600.0;
427 }
428 rtcm->sta.deltype = 1; /* xyz */
429 for (j = 0; j < 3; j++) {
430 rtcm->sta.del[j] = del[0][j];
431 }
432 rtcm->sta.hgt = hgt;
433 return 5;
434}
435/* decode type 23: antenna type definition record ----------------------------*/
436static int decode_type23(rtcm_t* rtcm) { return 0; }
437/* decode type 24: antenna reference point (arp) -----------------------------*/
438static int decode_type24(rtcm_t* rtcm) { return 0; }
439/* decode type 31: differential glonass correction ---------------------------*/
440static int decode_type31(rtcm_t* rtcm) { return 0; }
441/* decode type 32: differential glonass reference station parameters ---------*/
442static int decode_type32(rtcm_t* rtcm) { return 0; }
443/* decode type 34: glonass partial differential correction set ---------------*/
444static int decode_type34(rtcm_t* rtcm) { return 0; }
445/* decode type 36: glonass special message -----------------------------------*/
446static int decode_type36(rtcm_t* rtcm) { return 0; }
447/* decode type 37: gnss system time offset -----------------------------------*/
448static int decode_type37(rtcm_t* rtcm) { return 0; }
449/* decode type 59: proprietary message ---------------------------------------*/
450static int decode_type59(rtcm_t* rtcm) { return 0; }
451/* decode rtcm ver.2 message -------------------------------------------------*/
453 double zcnt;
454 int staid, seqno, stah, ret = 0, type = getbitu(rtcm->buff, 8, 6);
455
456 trace(NULL, 3, "decode_rtcm2: type=%2d len=%3d\n", type, rtcm->len);
457
458 if ((zcnt = getbitu(rtcm->buff, 24, 13) * 0.6) >= 3600.0) {
459 trace(NULL, 2, "rtcm2 modified z-count error: zcnt=%.1f\n", zcnt);
460 return -1;
461 }
462 adjhour(rtcm, zcnt);
463 staid = getbitu(rtcm->buff, 14, 10);
464 seqno = getbitu(rtcm->buff, 37, 3);
465 stah = getbitu(rtcm->buff, 45, 3);
466 if (seqno - rtcm->seqno != 1 && seqno - rtcm->seqno != -7) {
467 trace(NULL, 2, "rtcm2 message outage: seqno=%d->%d\n", rtcm->seqno, seqno);
468 }
469 rtcm->seqno = seqno;
470 rtcm->stah = stah;
471
472 if (rtcm->outtype) {
473 sprintf(rtcm->msgtype, "RTCM %2d (%4d) zcnt=%7.1f staid=%3d seqno=%d", type, rtcm->len, zcnt, staid, seqno);
474 }
475 if (type == 3 || type == 22 || type == 23 || type == 24) {
476 if (rtcm->staid != 0 && staid != rtcm->staid) {
477 trace(NULL, 2, "rtcm2 station id changed: %d->%d\n", rtcm->staid, staid);
478 }
479 rtcm->staid = staid;
480 }
481 if (rtcm->staid != 0 && staid != rtcm->staid) {
482 trace(NULL, 2, "rtcm2 station id invalid: %d %d\n", staid, rtcm->staid);
483 return -1;
484 }
485 switch (type) {
486 case 1:
487 ret = decode_type1(rtcm);
488 break;
489 case 3:
490 ret = decode_type3(rtcm);
491 break;
492 case 9:
493 ret = decode_type1(rtcm);
494 break;
495 case 14:
496 ret = decode_type14(rtcm);
497 break;
498 case 16:
499 ret = decode_type16(rtcm);
500 break;
501 case 17:
502 ret = decode_type17(rtcm);
503 break;
504 case 18:
505 ret = decode_type18(rtcm);
506 break;
507 case 19:
508 ret = decode_type19(rtcm);
509 break;
510 case 22:
511 ret = decode_type22(rtcm);
512 break;
513 case 23:
514 ret = decode_type23(rtcm);
515 break; /* not supported */
516 case 24:
517 ret = decode_type24(rtcm);
518 break; /* not supported */
519 case 31:
520 ret = decode_type31(rtcm);
521 break; /* not supported */
522 case 32:
523 ret = decode_type32(rtcm);
524 break; /* not supported */
525 case 34:
526 ret = decode_type34(rtcm);
527 break; /* not supported */
528 case 36:
529 ret = decode_type36(rtcm);
530 break; /* not supported */
531 case 37:
532 ret = decode_type37(rtcm);
533 break; /* not supported */
534 case 59:
535 ret = decode_type59(rtcm);
536 break; /* not supported */
537 }
538 if (ret >= 0) {
539 if (1 <= type && type <= 99) {
540 rtcm->nmsg2[type]++;
541 } else {
542 rtcm->nmsg2[0]++;
543 }
544 }
545 return ret;
546}
uint32_t getbitu(const uint8_t *buff, int pos, int len)
Extract unsigned bits from byte data.
Definition mrtk_bits.c:99
int32_t getbits(const uint8_t *buff, int pos, int len)
Extract signed bits from byte data.
Definition mrtk_bits.c:107
MRTKLIB Bits Module — Binary bit operations and CRC functions.
#define SYS_GPS
Definition mrtk_eph.c:65
#define SYS_GLO
Definition mrtk_eph.c:67
MRTKLIB Broadcast Ephemeris Module — Satellite orbit/clock types and Kepler/GLONASS/SBAS orbit comput...
#define MAXOBS
#define CODE_L2P
#define CODE_L1C
#define CODE_L2C
#define CODE_L1P
int satno(int sys, int prn)
Convert satellite system+prn/slot number to satellite number.
Definition mrtk_nav.c:58
static rtcm_t * rtcm
#define P2_31
Definition mrtk_rcvraw.c:56
#define P2_55
Definition mrtk_rcvraw.c:64
#define P2_29
Definition mrtk_rcvraw.c:54
#define P2_43
Definition mrtk_rcvraw.c:62
#define P2_19
Definition mrtk_rcvraw.c:48
#define P2_33
Definition mrtk_rcvraw.c:58
#define P2_5
Definition mrtk_rcvraw.c:43
#define SC2RAD
Definition mrtk_rcvraw.c:33
static int decode_type31(rtcm_t *rtcm)
Definition mrtk_rtcm2.c:440
static int decode_type37(rtcm_t *rtcm)
Definition mrtk_rtcm2.c:448
static int decode_type19(rtcm_t *rtcm)
Definition mrtk_rtcm2.c:335
static int decode_type24(rtcm_t *rtcm)
Definition mrtk_rtcm2.c:438
static int decode_type22(rtcm_t *rtcm)
Definition mrtk_rtcm2.c:397
static void adjhour(rtcm_t *rtcm, double zcnt)
Definition mrtk_rtcm2.c:47
int decode_rtcm2(rtcm_t *rtcm)
Decode RTCM ver.2 message (called from rtcm.c).
Definition mrtk_rtcm2.c:452
static int decode_type1(rtcm_t *rtcm)
Definition mrtk_rtcm2.c:90
static int decode_type23(rtcm_t *rtcm)
Definition mrtk_rtcm2.c:436
static int decode_type59(rtcm_t *rtcm)
Definition mrtk_rtcm2.c:450
static int decode_type36(rtcm_t *rtcm)
Definition mrtk_rtcm2.c:446
static int decode_type32(rtcm_t *rtcm)
Definition mrtk_rtcm2.c:442
static int decode_type3(rtcm_t *rtcm)
Definition mrtk_rtcm2.c:128
static int decode_type17(rtcm_t *rtcm)
Definition mrtk_rtcm2.c:184
static int obsindex(obs_t *obs, gtime_t time, int sat)
Definition mrtk_rtcm2.c:66
static int decode_type16(rtcm_t *rtcm)
Definition mrtk_rtcm2.c:169
static int decode_type14(rtcm_t *rtcm)
Definition mrtk_rtcm2.c:146
static int decode_type34(rtcm_t *rtcm)
Definition mrtk_rtcm2.c:444
static int decode_type18(rtcm_t *rtcm)
Definition mrtk_rtcm2.c:269
MRTKLIB RTCM Module — RTCM message types and functions.
MRTKLIB System Module — OS/filesystem utility functions.
gtime_t gpst2time(int week, double sec)
Convert GPS week/tow to gtime_t.
Definition mrtk_time.c:165
double timediff(gtime_t t1, gtime_t t2)
Compute time difference (t1 - t2).
Definition mrtk_time.c:279
double time2gpst(gtime_t t, int *week)
Convert gtime_t to GPS week/tow.
Definition mrtk_time.c:181
static double leaps[64+1][7]
Leap seconds table (y,m,d,h,m,s,utc-gpst).
Definition mrtk_time.c:49
int adjgpsweek(int week)
Adjust GPS week number using CPU time.
Definition mrtk_time.c:553
gtime_t timeadd(gtime_t t, double sec)
Add seconds to gtime_t.
Definition mrtk_time.c:265
gtime_t utc2gpst(gtime_t t)
Convert UTC to GPS time considering leap seconds.
Definition mrtk_time.c:440
gtime_t timeget(void)
Get current time in UTC.
Definition mrtk_time.c:289
void trace(mrtk_ctx_t *ctx, int level, const char *format,...)
Output trace message.
Definition mrtk_trace.c:78
MRTKLIB Trace Module — debug trace and logging functions.
GPS/GAL/QZS/BDS/IRN broadcast ephemeris type.
Definition mrtk_eph.h:77
double OMG0
Definition mrtk_eph.h:90
double omg
Definition mrtk_eph.h:90
int sat
Definition mrtk_eph.h:78
gtime_t ttr
Definition mrtk_eph.h:88
double OMGd
Definition mrtk_eph.h:90
double f1
Definition mrtk_eph.h:94
double f0
Definition mrtk_eph.h:94
int svh
Definition mrtk_eph.h:81
double e
Definition mrtk_eph.h:90
double idot
Definition mrtk_eph.h:90
double M0
Definition mrtk_eph.h:90
double A
Definition mrtk_eph.h:90
double cis
Definition mrtk_eph.h:91
int flag
Definition mrtk_eph.h:86
gtime_t toe
Definition mrtk_eph.h:88
int week
Definition mrtk_eph.h:82
gtime_t toc
Definition mrtk_eph.h:88
double cic
Definition mrtk_eph.h:91
double tgd[6]
Definition mrtk_eph.h:95
double cus
Definition mrtk_eph.h:91
double cuc
Definition mrtk_eph.h:91
double toes
Definition mrtk_eph.h:92
int code
Definition mrtk_eph.h:83
double crs
Definition mrtk_eph.h:91
double i0
Definition mrtk_eph.h:90
int iode
Definition mrtk_eph.h:79
int sva
Definition mrtk_eph.h:80
double deln
Definition mrtk_eph.h:90
double crc
Definition mrtk_eph.h:91
double f2
Definition mrtk_eph.h:94
int iodc
Definition mrtk_eph.h:79
GNSS time representation.
Definition mrtk_time.h:49
Observation data collection.
Definition mrtk_obs.h:59
obsd_t * data
Definition mrtk_obs.h:61
int n
Definition mrtk_obs.h:60
float D[5+5]
Definition mrtk_obs.h:52
gtime_t time
Definition mrtk_obs.h:45
uint8_t sat
Definition mrtk_obs.h:46
uint8_t LLI[5+5]
Definition mrtk_obs.h:48
double L[5+5]
Definition mrtk_obs.h:50
double P[5+5]
Definition mrtk_obs.h:51
uint16_t SNR[5+5]
Definition mrtk_obs.h:47
uint8_t code[5+5]
Definition mrtk_obs.h:49
RTCM control struct type.
Definition mrtk_rtcm.h:50