34static const double SC2RAD = 3.1415926535898;
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
48 double tow, hour, sec;
52 if (
rtcm->time.time == 0) {
56 hour = floor(tow / 3600.0);
57 sec = tow - hour * 3600.0;
58 if (zcnt < sec - 1800.0) {
60 }
else if (zcnt > sec + 1800.0) {
69 for (i = 0; i < obs->
n; i++) {
81 for (j = 0; j < NFREQ; j++) {
83 obs->
data[i].
D[j] = 0.0;
91 int i = 48, fact, udre, prn, sat, iod;
94 trace(NULL, 4,
"decode_type1: len=%d\n",
rtcm->len);
96 while (i + 40 <=
rtcm->len * 8) {
112 if (prc == 0x80000000 || rrc == 0xFFFF8000) {
113 trace(NULL, 2,
"rtcm2 1 prc/rrc indicates satellite problem: prn=%d\n", 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;
131 trace(NULL, 4,
"decode_type3: len=%d\n",
rtcm->len);
133 if (i + 96 <=
rtcm->len * 8) {
140 trace(NULL, 2,
"rtcm2 3 length error: len=%d\n",
rtcm->len);
148 int i = 48, week, hour,
leaps;
150 trace(NULL, 4,
"decode_type14: len=%d\n",
rtcm->len);
153 if (i + 24 <=
rtcm->len * 8) {
160 trace(NULL, 2,
"rtcm2 14 length error: len=%d\n",
rtcm->len);
172 trace(NULL, 4,
"decode_type16: len=%d\n",
rtcm->len);
174 while (i + 8 <=
rtcm->len * 8 && n < 90) {
180 trace(NULL, 3,
"rtcm2 16 message: %s\n",
rtcm->msg);
187 int i = 48, week, prn, sat;
189 trace(NULL, 4,
"decode_type17: len=%d\n",
rtcm->len);
191 if (i + 480 <=
rtcm->len * 8) {
250 trace(NULL, 2,
"rtcm2 17 length error: len=%d\n",
rtcm->len);
262 eph.
A = sqrtA * sqrtA;
263 rtcm->nav.eph[sat - 1] = eph;
272 int i = 48, index, freq, sync = 1, code, sys, prn, sat, loss;
274 trace(NULL, 4,
"decode_type18: len=%d\n",
rtcm->len);
276 if (i + 24 <=
rtcm->len * 8) {
282 trace(NULL, 2,
"rtcm2 18 length error: len=%d\n",
rtcm->len);
286 trace(NULL, 2,
"rtcm2 18 not supported frequency: freq=%d\n", freq);
308 trace(NULL, 2,
"rtcm2 18 satellite number error: sys=%d prn=%d\n", sys, prn);
317 if (
rtcm->obsflag || fabs(tt) > 1E-9) {
321 rtcm->obs.data[index].L[freq] = -cp / 256.0;
322 rtcm->obs.data[index].LLI[freq] =
rtcm->loss[sat - 1][freq] != loss;
328 rtcm->loss[sat - 1][freq] = loss;
331 rtcm->obsflag = !sync;
338 int i = 48, index, freq, sync = 1, code, sys, prn, sat;
340 trace(NULL, 4,
"decode_type19: len=%d\n",
rtcm->len);
342 if (i + 24 <=
rtcm->len * 8) {
348 trace(NULL, 2,
"rtcm2 19 length error: len=%d\n",
rtcm->len);
352 trace(NULL, 2,
"rtcm2 19 not supported frequency: freq=%d\n", freq);
372 trace(NULL, 2,
"rtcm2 19 satellite number error: sys=%d prn=%d\n", sys, prn);
381 if (
rtcm->obsflag || fabs(tt) > 1E-9) {
385 rtcm->obs.data[index].P[freq] = pr * 0.02;
393 rtcm->obsflag = !sync;
398 double del[2][3] = {{0}}, hgt = 0.0;
401 trace(NULL, 4,
"decode_type22: len=%d\n",
rtcm->len);
403 if (i + 24 <=
rtcm->len * 8) {
411 trace(NULL, 2,
"rtcm2 22 length error: len=%d\n",
rtcm->len);
414 if (i + 24 <=
rtcm->len * 8) {
418 hgt = noh ? 0.0 :
getbitu(
rtcm->buff, i, 18) / 25600.0;
421 if (i + 24 <=
rtcm->len * 8) {
428 rtcm->sta.deltype = 1;
429 for (j = 0; j < 3; j++) {
430 rtcm->sta.del[j] = del[0][j];
454 int staid, seqno, stah, ret = 0, type =
getbitu(
rtcm->buff, 8, 6);
456 trace(NULL, 3,
"decode_rtcm2: type=%2d len=%3d\n", type,
rtcm->len);
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);
466 if (seqno -
rtcm->seqno != 1 && seqno -
rtcm->seqno != -7) {
467 trace(NULL, 2,
"rtcm2 message outage: seqno=%d->%d\n",
rtcm->seqno, seqno);
473 sprintf(
rtcm->msgtype,
"RTCM %2d (%4d) zcnt=%7.1f staid=%3d seqno=%d", type,
rtcm->len, zcnt, staid, seqno);
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);
481 if (
rtcm->staid != 0 && staid !=
rtcm->staid) {
482 trace(NULL, 2,
"rtcm2 station id invalid: %d %d\n", staid,
rtcm->staid);
539 if (1 <= type && type <= 99) {
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.
MRTKLIB Broadcast Ephemeris Module — Satellite orbit/clock types and Kepler/GLONASS/SBAS orbit comput...
int satno(int sys, int prn)
Convert satellite system+prn/slot number to satellite number.
static int decode_type31(rtcm_t *rtcm)
static int decode_type37(rtcm_t *rtcm)
static int decode_type19(rtcm_t *rtcm)
static int decode_type24(rtcm_t *rtcm)
static int decode_type22(rtcm_t *rtcm)
static void adjhour(rtcm_t *rtcm, double zcnt)
int decode_rtcm2(rtcm_t *rtcm)
Decode RTCM ver.2 message (called from rtcm.c).
static int decode_type1(rtcm_t *rtcm)
static int decode_type23(rtcm_t *rtcm)
static int decode_type59(rtcm_t *rtcm)
static int decode_type36(rtcm_t *rtcm)
static int decode_type32(rtcm_t *rtcm)
static int decode_type3(rtcm_t *rtcm)
static int decode_type17(rtcm_t *rtcm)
static int obsindex(obs_t *obs, gtime_t time, int sat)
static int decode_type16(rtcm_t *rtcm)
static int decode_type14(rtcm_t *rtcm)
static int decode_type34(rtcm_t *rtcm)
static int decode_type18(rtcm_t *rtcm)
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.
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.
static double leaps[64+1][7]
Leap seconds table (y,m,d,h,m,s,utc-gpst).
int adjgpsweek(int week)
Adjust GPS week number using CPU time.
gtime_t timeadd(gtime_t t, double sec)
Add seconds to gtime_t.
gtime_t utc2gpst(gtime_t t)
Convert UTC to GPS time considering leap seconds.
gtime_t timeget(void)
Get current time in UTC.
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.
GNSS time representation.
Observation data collection.
RTCM control struct type.