Coverage Report

Created: 2026-02-26 06:35

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gpsd/gpsd-3.27.6~dev/drivers/driver_rtcm3.c
Line
Count
Source
1
/*****************************************************************************
2
3
This is a decoder for RTCM-104 3.x, a serial protocol used for
4
broadcasting pseudorange corrections from differential-GPS reference
5
stations.  The applicable specification is RTCM 10403.1: RTCM Paper
6
177-2006-SC104-STD.  This obsolesces the earlier RTCM-104 2.x
7
specifications. The specification document is proprietary; ordering
8
instructions are accessible from <http://www.rtcm.org/>
9
under "Publications".
10
11
Unike the RTCM 2.x protocol, RTCM3.x does not use the strange
12
sliding-bit-window IS-GPS-200 protocol as a transport layer, but is a
13
self-contained byte-oriented packet protocol.  Packet recognition is
14
handled in the GPSD packet-getter state machine; this code is
15
concerned with unpacking the packets into well-behaved C structures,
16
coping with odd field lengths and fields that may overlap byte
17
boundaries.  These report structures live in gps.h.
18
19
Note that the unpacking this module does is probably useful only for
20
RTCM reporting and diagnostic tools.  It is not necessary when
21
passing RTCM corrections to a GPS, which normally should just be
22
passed an entire correction packet for processing by their internal
23
firmware.
24
25
Decodes of the following types have been verified: 1004, 1005, 1006,
26
1008, 1012, 1013, 1029. There is good reason to believe the 1007 code
27
is correct, as it's identical to 1008 up to where it ends.
28
29
The 1033 decode was arrived at by looking at an rtcminspect dump and noting
30
that it carries an information superset of the 1008.  There are additional
31
Receiver and Firmware fields we're not certain to decode without access
32
to an RTCM3 standard at revision 4 or later, but the guess in the code
33
has been observed to correctly analyze a message with a nonempty Receiver
34
field.
35
36
This file is Copyright 2010 by the GPSD project
37
SPDX-License-Identifier: BSD-2-clause
38
39
*****************************************************************************/
40
41
#include "../include/gpsd_config.h"  // must be before all includes
42
43
#include <string.h>
44
45
#include "../include/gpsd.h"
46
#include "../include/bits.h"
47
48
// scaling constants for RTCM3 real number types
49
40.7k
#define GPS_PSEUDORANGE_RESOLUTION      0.02    // DF011
50
68.6k
#define PSEUDORANGE_DIFF_RESOLUTION     0.0005  // DF012, DF042
51
41.3k
#define CARRIER_NOISE_RATIO_UNITS       0.25    // DF015, DF045, DF050
52
973
#define ANTENNA_POSITION_RESOLUTION     0.0001  // DF025, DF026, DF027
53
27.1k
#define GLONASS_PSEUDORANGE_RESOLUTION  0.02    // DF041
54
264
#define ANTENNA_DEGREE_RESOLUTION       25e-6   // DF062
55
#define GPS_EPOCH_TIME_RESOLUTION       0.1     // DF065
56
// DF069, DF070, DF192, DF193, DF194, DF195
57
568
#define PHASE_CORRECTION_RESOLUTION     0.5
58
// DF156, DF157, DF158, DF166, DF167, DF168, DF169, DF196, DF197
59
7.26k
#define TRANSLATION_MM_RESOLUTION       0.001
60
2.53k
#define VALIDITY_RESOLUTION             2.0     // DF152, DF153, DF154, DF155
61
769
#define SCALE_PPM_RESOLUTION            1e-5    // DF162
62
1.90k
#define ROTATION_ARCSEC_RESOLUTION      2e-5    // DF159, DF160, DF161
63
// DF171, DF172, DF176, DF177, DF178, DF179, DF183, DF184, DF185, DF186
64
270
#define PROJ_ORIGIN_RESOLUTION          11e-9
65
5.00k
#define DEG_ARCSEC_RESOLUTION           3600
66
142
#define CM_RESOLUTION                   0.01    // DF198
67
4.54k
#define RES_ARCSEC_RESOLUTION           3e-5    // DF199, DF200
68
69
// Other magic values
70
110k
#define GPS_INVALID_PSEUDORANGE         0x80000 // DF012, DF018
71
6.31k
#define GLONASS_INVALID_RANGEINCR       0x2000  // DF047
72
20.9k
#define GLONASS_CHANNEL_BASE            7       // DF040
73
74
// Large case statements make GNU indent very confused
75
// *INDENT-OFF*
76
77
/* good source on message types:
78
 * https://software.rtcm-ntrip.org/export/HEAD/ntrip/trunk/BNC/src/bnchelp.html
79
 * Also look in the BNC source
80
 * and look at the tklib source: http://www.rtklib.com/
81
 */
82
83
737k
#define ugrab(width)    (bitcount += width, ubits(buf, \
84
737k
                         bitcount - width, width, false))
85
231k
#define sgrab(width)    (bitcount += width, sbits(buf,  \
86
231k
                         bitcount - width, width, false))
87
88
/* decode 1015/1016/1017 header
89
 * they share a common header
90
 * TODO: rtklib has C code for these.
91
 *
92
 * Return: false if decoded
93
 *         true if runt
94
 */
95
static bool rtcm3_101567(const struct gps_context_t *context,
96
                         struct rtcm3_t *rtcm, const unsigned char *buf)
97
573
{
98
573
    int bitcount = 36;  // 8 preamble, 6 zero, 10 length, 12 type
99
100
573
    if (22 > rtcm->length) {
101
        // need 76 bits, 9.5 bytes
102
138
        rtcm->length = 0;          // set to zero to prevent JSON decode
103
138
        GPSD_LOG(LOG_WARN, &context->errout,
104
138
                 "RTCM3: rtcm3_101567_msm() type %d runt length %d ",
105
138
                 rtcm->type, rtcm->length);
106
138
        return true;
107
138
    }
108
109
    // 1015, 1016, and 1017 all use the 1015 struct
110
435
    rtcm->rtcmtypes.rtcm3_1015.header.network_id = (unsigned)ugrab(12);
111
435
    rtcm->rtcmtypes.rtcm3_1015.header.subnetwork_id = (unsigned )ugrab(4);
112
435
    rtcm->rtcmtypes.rtcm3_1015.header.tow = ugrab(23);
113
435
    rtcm->rtcmtypes.rtcm3_1015.header.multimesg = (bool)ugrab(1);
114
435
    rtcm->rtcmtypes.rtcm3_1015.header.master_id = (unsigned)ugrab(12);
115
435
    rtcm->rtcmtypes.rtcm3_1015.header.aux_id = (unsigned)ugrab(12);
116
435
    rtcm->rtcmtypes.rtcm3_1015.header.satcount = (unsigned char)ugrab(4);
117
118
435
    GPSD_LOG(LOG_PROG, &context->errout, "RTCM3: rtcm3_10567(%u) "
119
435
             "network_id %u subnetwork_id %u tow %lu multimesg %u "
120
435
             "master_id %u aux_id %u satcount %u",
121
435
             rtcm->type,
122
435
             rtcm->rtcmtypes.rtcm3_1015.header.network_id,
123
435
             rtcm->rtcmtypes.rtcm3_1015.header.subnetwork_id,
124
435
             rtcm->rtcmtypes.rtcm3_1015.header.tow,
125
435
             rtcm->rtcmtypes.rtcm3_1015.header.multimesg,
126
435
             rtcm->rtcmtypes.rtcm3_1015.header.master_id,
127
435
             rtcm->rtcmtypes.rtcm3_1015.header.aux_id,
128
435
             rtcm->rtcmtypes.rtcm3_1015.header.satcount);
129
435
    return false;
130
573
}
131
132
/* decode 4076 header
133
 * IGS State Space Representation (SSR) Format
134
 * www.igs.org
135
 * https://files.igs.org/pub/data/format/igs_ssr_v1.pdf
136
 *
137
 * Return: false if decoded
138
 *         true if runt or undecoded
139
 */
140
static bool rtcm3_4076(const struct gps_context_t *context,
141
                         struct rtcm3_t *rtcm, const unsigned char *buf)
142
138
{
143
138
    int bitcount = 36;         // 8 preamble, 6 zero, 10 length, 12 type
144
145
138
    if (22 > rtcm->length) {
146
        // need 76 bits, 9.5 bytes
147
1
        rtcm->length = 0;          // set to zero to prevent JSON decode
148
1
        GPSD_LOG(LOG_WARN, &context->errout,
149
1
                 "RTCM3: rtcm3_4076() type %d runt length %d ",
150
1
                 rtcm->type, rtcm->length);
151
1
        return true;
152
1
    }
153
154
137
    rtcm->rtcmtypes.rtcm3_4076.ssr_vers = ugrab(3);
155
137
    rtcm->rtcmtypes.rtcm3_4076.igs_num = ugrab(8);
156
137
    rtcm->rtcmtypes.rtcm3_4076.ssr_epoch = ugrab(20);
157
137
    rtcm->rtcmtypes.rtcm3_4076.ssr_update = ugrab(4);
158
137
    rtcm->rtcmtypes.rtcm3_4076.ssr_mmi = ugrab(1);
159
137
    rtcm->rtcmtypes.rtcm3_4076.ssr_iod = ugrab(4);
160
137
    rtcm->rtcmtypes.rtcm3_4076.ssr_provider = ugrab(16);
161
137
    rtcm->rtcmtypes.rtcm3_4076.ssr_solution = ugrab(4);
162
163
137
    GPSD_LOG(LOG_PROG, &context->errout,
164
137
             "RTCM3: rtcm3_4076 ver %u igs_num %u Epoch %u update %u mmi %u "
165
137
             "IOD %u Provider %u Solution %u\n",
166
137
             rtcm->rtcmtypes.rtcm3_4076.ssr_vers,
167
137
             rtcm->rtcmtypes.rtcm3_4076.igs_num,
168
137
             rtcm->rtcmtypes.rtcm3_4076.ssr_epoch,
169
137
             rtcm->rtcmtypes.rtcm3_4076.ssr_update,
170
137
             rtcm->rtcmtypes.rtcm3_4076.ssr_mmi,
171
137
             rtcm->rtcmtypes.rtcm3_4076.ssr_iod,
172
137
             rtcm->rtcmtypes.rtcm3_4076.ssr_provider,
173
137
             rtcm->rtcmtypes.rtcm3_4076.ssr_solution);
174
137
    return true;
175
138
}
176
177
/* decode MSM header
178
 * MSM1 to MSM7 share a common header
179
 * TODO: rtklib has C code for these.
180
 *
181
 * Return: false if decoded
182
 *         true if runt, or error
183
 */
184
static bool rtcm3_decode_msm(const struct gps_context_t *context,
185
                             struct rtcm3_t *rtcm, const unsigned char *buf)
186
11.1k
{
187
11.1k
    int bitcount = 36;  // 8 preamble, 6 zero, 10 length, 12 type
188
11.1k
    unsigned n_sig = 0, n_sat = 0, n_cell = 0;
189
11.1k
    uint64_t sat_mask;
190
11.1k
    uint32_t sig_mask;
191
11.1k
    unsigned i;
192
193
11.1k
    if (22 > rtcm->length) {
194
        // need 169 bits, 21.125 bytes
195
4.23k
        rtcm->length = 0;          // set to zero to prevent JSON decode
196
4.23k
        GPSD_LOG(LOG_WARN, &context->errout,
197
4.23k
                 "RTCM3: rtcm3_decode_msm() type %d runt length %d ",
198
4.23k
                 rtcm->type, rtcm->length);
199
4.23k
        return true;
200
4.23k
    }
201
202
6.88k
    rtcm->rtcmtypes.rtcm3_msm.station_id = ugrab(12);
203
6.88k
    rtcm->rtcmtypes.rtcm3_msm.tow = ugrab(30);
204
6.88k
    rtcm->rtcmtypes.rtcm3_msm.sync = ugrab(1);
205
6.88k
    rtcm->rtcmtypes.rtcm3_msm.IODS = ugrab(3);
206
6.88k
    bitcount += 7;             // skip 7 reserved bits, DF001
207
6.88k
    rtcm->rtcmtypes.rtcm3_msm.steering = ugrab(2);
208
6.88k
    rtcm->rtcmtypes.rtcm3_msm.ext_clk = ugrab(2);
209
6.88k
    rtcm->rtcmtypes.rtcm3_msm.smoothing = ugrab(1);
210
6.88k
    rtcm->rtcmtypes.rtcm3_msm.interval = ugrab(3);
211
    // FIXME: rtcm->rtcmtypes.rtcm3_msm.sat_mask = ugrab(64);
212
    // ugrab(56) is max, can't do 64, so stack it
213
6.88k
    rtcm->rtcmtypes.rtcm3_msm.sat_mask = ugrab(32) << 32;
214
6.88k
    rtcm->rtcmtypes.rtcm3_msm.sat_mask |= ugrab(32);
215
6.88k
    rtcm->rtcmtypes.rtcm3_msm.sig_mask = ugrab(32);
216
217
    // count satellites
218
6.88k
    sat_mask = rtcm->rtcmtypes.rtcm3_msm.sat_mask;
219
339k
    while (sat_mask) {
220
332k
        n_sat += sat_mask & 1;
221
332k
        sat_mask >>= 1;
222
332k
    }
223
    // count signals
224
6.88k
    sig_mask = rtcm->rtcmtypes.rtcm3_msm.sig_mask;
225
149k
    while (sig_mask) {
226
142k
        n_sig += sig_mask & 1;
227
142k
        sig_mask >>= 1;
228
142k
    }
229
    // determine cells
230
6.88k
    n_cell = n_sat * n_sig;
231
6.88k
    rtcm->rtcmtypes.rtcm3_msm.n_sat = n_sat;
232
6.88k
    rtcm->rtcmtypes.rtcm3_msm.n_sig = n_sig;
233
6.88k
    rtcm->rtcmtypes.rtcm3_msm.n_cell = n_cell;
234
235
6.88k
    if (0 == n_sat ||
236
6.14k
        64 < n_cell) {
237
4.76k
        GPSD_LOG(LOG_WARN, &context->errout,
238
4.76k
                 "RTCM3: rtcm3_decode_msm(%u) interval %u  sat_mask x%llx "
239
4.76k
                 "sig_mask x%x invalid n_cell %u\n",
240
4.76k
                 rtcm->type,
241
4.76k
                 rtcm->rtcmtypes.rtcm3_msm.interval,
242
4.76k
                 (unsigned long long)rtcm->rtcmtypes.rtcm3_msm.sat_mask,
243
4.76k
                 rtcm->rtcmtypes.rtcm3_msm.sig_mask,
244
4.76k
                 n_cell);
245
4.76k
        return false;
246
4.76k
    }
247
248
    // cell_mask is variable length!  ugrab() width max is 56
249
2.12k
    if (56 >= n_cell) {
250
1.77k
        rtcm->rtcmtypes.rtcm3_msm.cell_mask = ugrab(n_cell);
251
1.77k
    } else {
252
        // 57 to 64, breaks ugrab(), workaround it...
253
347
        rtcm->rtcmtypes.rtcm3_msm.cell_mask = ugrab(56);
254
347
        rtcm->rtcmtypes.rtcm3_msm.cell_mask <<= n_cell - 56;
255
347
        rtcm->rtcmtypes.rtcm3_msm.cell_mask |= ugrab(n_cell - 56);
256
347
    }
257
258
    // Decode Satellite Data
259
260
    // Decode DF397 (MSM 4-7)
261
2.12k
    if (4 == rtcm->rtcmtypes.rtcm3_msm.msm ||
262
1.76k
        5 == rtcm->rtcmtypes.rtcm3_msm.msm ||
263
1.24k
        6 == rtcm->rtcmtypes.rtcm3_msm.msm ||
264
1.43k
        7 == rtcm->rtcmtypes.rtcm3_msm.msm) {
265
25.7k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_msm.n_sat; i++) {
266
24.2k
            rtcm->rtcmtypes.rtcm3_msm.sat[i].rr_ms = ugrab(8);
267
24.2k
        }
268
1.43k
    }
269
270
    // Decode Extended Info (MSM 5+7)
271
2.12k
    if (5 == rtcm->rtcmtypes.rtcm3_msm.msm ||
272
1.60k
        7 == rtcm->rtcmtypes.rtcm3_msm.msm) {
273
13.8k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_msm.n_sat; i++) {
274
13.0k
            rtcm->rtcmtypes.rtcm3_msm.sat[i].ext_info = ugrab(4);
275
13.0k
        }
276
753
    }
277
278
    // Decode DF398 (MSM 1-7)
279
37.5k
    for (i = 0; i < rtcm->rtcmtypes.rtcm3_msm.n_sat; i++) {
280
35.4k
        rtcm->rtcmtypes.rtcm3_msm.sat[i].rr_m1 = ugrab(10);
281
35.4k
    };
282
283
    // Decode DF399 (MSM 5+7)
284
2.12k
    if (5 == rtcm->rtcmtypes.rtcm3_msm.msm ||
285
1.60k
        7 == rtcm->rtcmtypes.rtcm3_msm.msm) {
286
13.8k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_msm.n_sat; i++) {
287
13.0k
            rtcm->rtcmtypes.rtcm3_msm.sat[i].rates_rphr = ugrab(14);
288
13.0k
        }
289
753
    }
290
291
    // Decode Signal Data
292
293
    // Decode DF400 (MSM 1,3,4,5) resp. DF405 (MSM 6+7)
294
2.12k
    if (1 == rtcm->rtcmtypes.rtcm3_msm.msm ||
295
1.87k
        3 == rtcm->rtcmtypes.rtcm3_msm.msm ||
296
1.64k
        4 == rtcm->rtcmtypes.rtcm3_msm.msm ||
297
1.34k
        5 == rtcm->rtcmtypes.rtcm3_msm.msm) {
298
21.5k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_msm.n_cell; i++) {
299
20.1k
            rtcm->rtcmtypes.rtcm3_msm.sig[i].pseudo_r = sgrab(15);
300
20.1k
        }
301
1.34k
    } else if (6 == rtcm->rtcmtypes.rtcm3_msm.msm ||
302
559
               7 == rtcm->rtcmtypes.rtcm3_msm.msm) {
303
10.1k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_msm.n_cell; i++) {
304
9.60k
            rtcm->rtcmtypes.rtcm3_msm.sig[i].pseudo_r = sgrab(20);
305
9.60k
        }
306
559
    }
307
308
    // Decode DF401 (MSM 2,3,4,5) resp. DF406 (MSM 6+7)
309
2.12k
    if (2 == rtcm->rtcmtypes.rtcm3_msm.msm ||
310
1.90k
        3 == rtcm->rtcmtypes.rtcm3_msm.msm ||
311
1.67k
        4 == rtcm->rtcmtypes.rtcm3_msm.msm ||
312
1.31k
        5 == rtcm->rtcmtypes.rtcm3_msm.msm) {
313
23.2k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_msm.n_cell; i++) {
314
21.9k
            rtcm->rtcmtypes.rtcm3_msm.sig[i].phase_r = sgrab(22);
315
21.9k
        }
316
1.31k
    } else if (6 == rtcm->rtcmtypes.rtcm3_msm.msm ||
317
559
               7 == rtcm->rtcmtypes.rtcm3_msm.msm) {
318
10.1k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_msm.n_cell; i++) {
319
9.60k
            rtcm->rtcmtypes.rtcm3_msm.sig[i].phase_r = sgrab(24);
320
9.60k
        }
321
559
    }
322
323
    // Decode DF402 (MSM 2,3,4,5) resp. DF407 (MSM 6+7)
324
2.12k
    if (2 == rtcm->rtcmtypes.rtcm3_msm.msm ||
325
1.90k
        3 == rtcm->rtcmtypes.rtcm3_msm.msm ||
326
1.67k
        4 == rtcm->rtcmtypes.rtcm3_msm.msm ||
327
1.31k
        5 == rtcm->rtcmtypes.rtcm3_msm.msm) {
328
23.2k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_msm.n_cell; i++) {
329
21.9k
            rtcm->rtcmtypes.rtcm3_msm.sig[i].lti = ugrab(4);
330
21.9k
        }
331
1.31k
    } else if (6 == rtcm->rtcmtypes.rtcm3_msm.msm ||
332
559
               7 == rtcm->rtcmtypes.rtcm3_msm.msm) {
333
10.1k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_msm.n_cell; i++) {
334
9.60k
            rtcm->rtcmtypes.rtcm3_msm.sig[i].lti = ugrab(10);
335
9.60k
        }
336
559
    }
337
338
    // Decode DF420 (MSM 2-7)
339
2.12k
    if (2 == rtcm->rtcmtypes.rtcm3_msm.msm ||
340
1.90k
        3 == rtcm->rtcmtypes.rtcm3_msm.msm ||
341
1.67k
        4 == rtcm->rtcmtypes.rtcm3_msm.msm ||
342
1.31k
        5 == rtcm->rtcmtypes.rtcm3_msm.msm ||
343
801
        6 == rtcm->rtcmtypes.rtcm3_msm.msm ||
344
1.87k
        7 == rtcm->rtcmtypes.rtcm3_msm.msm) {
345
33.4k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_msm.n_cell; i++) {
346
31.5k
            rtcm->rtcmtypes.rtcm3_msm.sig[i].half_amb = ugrab(1);
347
31.5k
        }
348
1.87k
    }
349
350
    // Decode DF403 (MSM 4+5) resp. DF408 (MSM 6+7)
351
2.12k
    if (4 == rtcm->rtcmtypes.rtcm3_msm.msm ||
352
1.76k
        5 == rtcm->rtcmtypes.rtcm3_msm.msm) {
353
19.3k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_msm.n_cell; i++) {
354
18.4k
            rtcm->rtcmtypes.rtcm3_msm.sig[i].cnr = ugrab(6);
355
18.4k
        }
356
1.24k
    } else if (6 == rtcm->rtcmtypes.rtcm3_msm.msm ||
357
929
               7 == rtcm->rtcmtypes.rtcm3_msm.msm) {
358
10.1k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_msm.n_cell; i++) {
359
9.60k
            rtcm->rtcmtypes.rtcm3_msm.sig[i].cnr = ugrab(10);
360
9.60k
        }
361
559
    }
362
363
    // Decode DF404 (MSM 5+7)
364
2.12k
    if (5 == rtcm->rtcmtypes.rtcm3_msm.msm ||
365
1.60k
        7 == rtcm->rtcmtypes.rtcm3_msm.msm) {
366
21.9k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_msm.n_cell; i++) {
367
21.2k
            rtcm->rtcmtypes.rtcm3_msm.sig[i].cnr = sgrab(15);
368
21.2k
        }
369
753
    }
370
371
    // tow is %llu for 32-bit compatibility
372
2.12k
    GPSD_LOG(LOG_PROG, &context->errout, "RTCM3: rtcm3_decode_msm(%u) "
373
2.12k
             "gnssid %u MSM%u id %u tow %llu sync %u IODS %u "
374
2.12k
             "steering %u ext_clk %u smoothing %u interval %u "
375
2.12k
             "sat_mask x%llx sig_mask x%lx cell_mask %llx\n",
376
2.12k
             rtcm->type,
377
2.12k
             rtcm->rtcmtypes.rtcm3_msm.gnssid,
378
2.12k
             rtcm->rtcmtypes.rtcm3_msm.msm,
379
2.12k
             rtcm->rtcmtypes.rtcm3_msm.station_id,
380
2.12k
             (unsigned long long)rtcm->rtcmtypes.rtcm3_msm.tow,
381
2.12k
             rtcm->rtcmtypes.rtcm3_msm.sync,
382
2.12k
             rtcm->rtcmtypes.rtcm3_msm.IODS,
383
2.12k
             rtcm->rtcmtypes.rtcm3_msm.steering,
384
2.12k
             rtcm->rtcmtypes.rtcm3_msm.ext_clk,
385
2.12k
             rtcm->rtcmtypes.rtcm3_msm.smoothing,
386
2.12k
             rtcm->rtcmtypes.rtcm3_msm.interval,
387
2.12k
             (long long unsigned)rtcm->rtcmtypes.rtcm3_msm.sat_mask,
388
2.12k
             (long unsigned)rtcm->rtcmtypes.rtcm3_msm.sig_mask,
389
2.12k
             (long long unsigned)rtcm->rtcmtypes.rtcm3_msm.cell_mask);
390
2.12k
    return false;
391
6.88k
}
392
393
/* break out the raw bits into the scaled report-structure fields
394
 *
395
 * Return: void
396
 */
397
void rtcm3_unpack(const struct gps_context_t *context,
398
                  struct rtcm3_t *rtcm, const unsigned char *buf)
399
32.8k
{
400
32.8k
    unsigned n, n2, n3, n4;
401
32.8k
    int bitcount = 0;
402
32.8k
    unsigned i;
403
32.8k
    signed long temp;
404
32.8k
    bool unknown = true;               // we don't know how to decode
405
32.8k
    const char *msg_name = "Unknown";  // we know the name
406
32.8k
    unsigned preamble, mbz;            // preamble 0xd3, and must be zero
407
408
32.8k
#define GPS_PSEUDORANGE(fld, len) \
409
41.3k
    {temp = (unsigned long)ugrab(len);          \
410
41.3k
    if (temp == GPS_INVALID_PSEUDORANGE) {      \
411
644
        fld.pseudorange = 0;                    \
412
40.7k
    } else {                                    \
413
40.7k
        fld.pseudorange = temp * GPS_PSEUDORANGE_RESOLUTION;} \
414
41.3k
    }
415
32.8k
#define RANGEDIFF(fld, len) \
416
58.9k
    temp = (long)sgrab(len);                    \
417
58.9k
    if (temp == GPS_INVALID_PSEUDORANGE) {      \
418
0
        fld.rangediff = 0;                      \
419
58.9k
    } else {                                    \
420
58.9k
        fld.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION; \
421
58.9k
    }
422
423
32.8k
    memset(rtcm, 0, sizeof(struct rtcm3_t));
424
425
    // check preamble and zero bits
426
32.8k
    preamble = ugrab(8);
427
32.8k
    mbz = ugrab(6);
428
32.8k
    if (0xD3 != preamble ||
429
30.4k
        0 != mbz) {
430
30.4k
        GPSD_LOG(LOG_WARN, &context->errout,
431
30.4k
                 "RTCM3: invalid preamble x%2x or mbz x%x\n",
432
30.4k
                 preamble, mbz);
433
30.4k
    }
434
435
32.8k
    rtcm->length = (unsigned)ugrab(10);
436
32.8k
    if (2 > rtcm->length) {
437
        // ignore zero payload messages, they do not evan have type
438
        // need 2 bytes just to read 10 bit type.
439
1.14k
        GPSD_LOG(LOG_PROG, &context->errout,
440
1.14k
                 "RTCM3: bad payload length %d bitcount %d\n",
441
1.14k
                 rtcm->length, bitcount);
442
1.14k
        return;
443
1.14k
    }
444
31.7k
    rtcm->type = (unsigned)ugrab(12);
445
446
31.7k
    GPSD_LOG(LOG_IO, &context->errout,
447
31.7k
             "RTCM3: type %d payload length %d bitcount %d\n",
448
31.7k
             rtcm->type, rtcm->length, bitcount);
449
450
    // RTCM3 message type numbers start at 1001
451
31.7k
    switch (rtcm->type) {
452
463
    case 1001:
453
463
        msg_name = "GPS Basic RTK, L1 Only";
454
463
        rtcm->rtcmtypes.rtcm3_1001.header.station_id = (unsigned)ugrab(12);
455
463
        rtcm->rtcmtypes.rtcm3_1001.header.tow = ugrab(30);
456
463
        rtcm->rtcmtypes.rtcm3_1001.header.sync = (bool)ugrab(1);
457
463
        rtcm->rtcmtypes.rtcm3_1001.header.satcount = (unsigned short)ugrab(5);
458
463
        rtcm->rtcmtypes.rtcm3_1001.header.smoothing = (bool)ugrab(1);
459
463
        rtcm->rtcmtypes.rtcm3_1001.header.interval = (unsigned short)ugrab(3);
460
14.5k
#define R1001 rtcm->rtcmtypes.rtcm3_1001.rtk_data[i]
461
5.29k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_1001.header.satcount; i++) {
462
4.83k
            R1001.ident = (unsigned short)ugrab(6);
463
4.83k
            R1001.L1.indicator = (unsigned char)ugrab(1);
464
4.83k
            GPS_PSEUDORANGE(R1001.L1, 24);
465
4.83k
            RANGEDIFF(R1001.L1, 20);
466
4.83k
            R1001.L1.locktime = (unsigned char)sgrab(7);
467
4.83k
        }
468
463
#undef R1001
469
463
        unknown = false;
470
463
        break;
471
472
464
    case 1002:
473
464
        msg_name = "GPS Extended RTK, L1 Only";
474
464
        rtcm->rtcmtypes.rtcm3_1002.header.station_id = (unsigned)ugrab(12);
475
464
        rtcm->rtcmtypes.rtcm3_1002.header.tow = ugrab(30);
476
464
        rtcm->rtcmtypes.rtcm3_1002.header.sync = (bool)ugrab(1);
477
464
        rtcm->rtcmtypes.rtcm3_1002.header.satcount = (unsigned short)ugrab(5);
478
464
        rtcm->rtcmtypes.rtcm3_1002.header.smoothing = (bool)ugrab(1);
479
464
        rtcm->rtcmtypes.rtcm3_1002.header.interval = (unsigned short)ugrab(3);
480
35.4k
#define R1002 rtcm->rtcmtypes.rtcm3_1002.rtk_data[i]
481
7.54k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_1002.header.satcount; i++) {
482
7.08k
            R1002.ident = (unsigned short)ugrab(6);
483
7.08k
            R1002.L1.indicator = (unsigned char)ugrab(1);
484
7.08k
            GPS_PSEUDORANGE(R1002.L1, 24);
485
7.08k
            RANGEDIFF(R1002.L1, 20);
486
7.08k
            R1002.L1.locktime = (unsigned char)sgrab(7);
487
7.08k
            R1002.L1.ambiguity = (unsigned char)ugrab(8);
488
7.08k
            R1002.L1.CNR = (ugrab(8)) * CARRIER_NOISE_RATIO_UNITS;
489
7.08k
        }
490
464
#undef R1002
491
464
        unknown = false;
492
464
        break;
493
494
683
    case 1003:
495
683
        msg_name = "GPS Basic RTK, L1 & L2";
496
683
        rtcm->rtcmtypes.rtcm3_1003.header.station_id = (unsigned)ugrab(12);
497
683
        rtcm->rtcmtypes.rtcm3_1003.header.tow = ugrab(30);
498
683
        rtcm->rtcmtypes.rtcm3_1003.header.sync = (bool)ugrab(1);
499
683
        rtcm->rtcmtypes.rtcm3_1003.header.satcount = (unsigned short)ugrab(5);
500
683
        rtcm->rtcmtypes.rtcm3_1003.header.smoothing = (bool)ugrab(1);
501
683
        rtcm->rtcmtypes.rtcm3_1003.header.interval = (unsigned short)ugrab(3);
502
58.0k
#define R1003 rtcm->rtcmtypes.rtcm3_1003.rtk_data[i]
503
10.3k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_1003.header.satcount; i++) {
504
9.66k
            R1003.ident = (unsigned short)ugrab(6);
505
9.66k
            R1003.L1.indicator = (unsigned char)ugrab(1);
506
9.66k
            GPS_PSEUDORANGE(R1003.L1, 24);
507
9.66k
            RANGEDIFF(R1003.L1, 20);
508
9.66k
            R1003.L1.locktime = (unsigned char)sgrab(7);
509
9.66k
            R1003.L2.indicator = (unsigned char)ugrab(2);
510
9.66k
            GPS_PSEUDORANGE(R1003.L2, 24);
511
9.66k
            temp = (long)sgrab(20);
512
9.66k
            if (temp == GPS_INVALID_PSEUDORANGE) {
513
0
                R1003.L2.rangediff = 0;
514
9.66k
            } else {
515
9.66k
                R1003.L2.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION;
516
9.66k
            }
517
9.66k
            R1003.L2.locktime = (unsigned char)sgrab(7);
518
9.66k
        }
519
683
#undef R1003
520
683
        unknown = false;
521
683
        break;
522
523
520
    case 1004:
524
520
        msg_name = "GPS Extended RTK, L1 & L2";
525
520
        rtcm->rtcmtypes.rtcm3_1004.header.station_id = (unsigned)ugrab(12);
526
520
        rtcm->rtcmtypes.rtcm3_1004.header.tow = ugrab(30);
527
520
        rtcm->rtcmtypes.rtcm3_1004.header.sync = (bool)ugrab(1);
528
520
        rtcm->rtcmtypes.rtcm3_1004.header.satcount = (unsigned short)ugrab(5);
529
520
        rtcm->rtcmtypes.rtcm3_1004.header.smoothing = (bool)ugrab(1);
530
520
        rtcm->rtcmtypes.rtcm3_1004.header.interval = (unsigned short)ugrab(3);
531
40.5k
#define R1004 rtcm->rtcmtypes.rtcm3_1004.rtk_data[i]
532
5.58k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_1004.header.satcount; i++) {
533
5.06k
            R1004.ident = (unsigned short)ugrab(6);
534
5.06k
            R1004.L1.indicator = (bool)ugrab(1);
535
5.06k
            GPS_PSEUDORANGE(R1004.L1, 24);
536
5.06k
            RANGEDIFF(R1004.L1, 20);
537
5.06k
            R1004.L1.locktime = (unsigned char)sgrab(7);
538
5.06k
            R1004.L1.ambiguity = (unsigned char)ugrab(8);
539
5.06k
            R1004.L1.CNR = ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
540
5.06k
            R1004.L2.indicator = (unsigned char)ugrab(2);
541
5.06k
            GPS_PSEUDORANGE(R1004.L2, 14);
542
5.06k
            RANGEDIFF(R1004.L2, 20);
543
5.06k
            R1004.L2.locktime = (unsigned char)sgrab(7);
544
5.06k
            R1004.L2.CNR = ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
545
5.06k
        }
546
520
#undef R1004
547
520
        unknown = false;
548
520
        break;
549
550
143
    case 1005:
551
143
        msg_name = "Stationary Antenna Reference Point, No Height Information";
552
        // 19 bytes
553
1.00k
#define R1005 rtcm->rtcmtypes.rtcm3_1005
554
143
        R1005.station_id = (unsigned short)ugrab(12);
555
143
        ugrab(6);               // reserved
556
143
        R1005.system = ugrab(3);
557
143
        R1005.reference_station = (bool)ugrab(1);
558
143
        R1005.ecef_x = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
559
143
        R1005.single_receiver = ugrab(1);
560
143
        ugrab(1);
561
143
        R1005.ecef_y = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
562
143
        ugrab(2);
563
143
        R1005.ecef_z = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
564
143
#undef R1005
565
143
        unknown = false;
566
143
        break;
567
568
136
    case 1006:
569
136
        msg_name = "Stationary Antenna Reference Point, w/ Height Info";
570
        // 21 bytes
571
1.08k
#define R1006 rtcm->rtcmtypes.rtcm3_1006
572
136
        R1006.station_id = (unsigned short)ugrab(12);
573
136
        (void)ugrab(6);         // reserved
574
136
        R1006.system = ugrab(3);
575
136
        R1006.reference_station = (bool)ugrab(1);
576
136
        R1006.ecef_x = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
577
136
        R1006.single_receiver = ugrab(1);
578
136
        ugrab(1);
579
136
        R1006.ecef_y = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
580
136
        ugrab(2);
581
136
        R1006.ecef_z = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
582
136
        R1006.height = ugrab(16) * ANTENNA_POSITION_RESOLUTION;
583
136
#undef R1006
584
136
        unknown = false;
585
136
        break;
586
587
142
    case 1007:
588
142
        msg_name = "Antenna Description";
589
        // 5 to 36 bytes
590
142
        rtcm->rtcmtypes.rtcm3_1007.station_id = (unsigned short)ugrab(12);
591
142
        n = (unsigned long)ugrab(8);
592
142
        (void)memcpy(rtcm->rtcmtypes.rtcm3_1007.descriptor, buf + 7, n);
593
142
        rtcm->rtcmtypes.rtcm3_1007.descriptor[n] = '\0';
594
142
        bitcount += 8 * n;
595
142
        rtcm->rtcmtypes.rtcm3_1007.setup_id = ugrab(8);
596
142
        unknown = false;
597
142
        break;
598
599
137
    case 1008:
600
137
        msg_name = "Antenna Description & Serial Number";
601
        // 6 to 68 bytes
602
137
        rtcm->rtcmtypes.rtcm3_1008.station_id = (unsigned short)ugrab(12);
603
137
        n = (unsigned long)ugrab(8);
604
137
        (void)memcpy(rtcm->rtcmtypes.rtcm3_1008.descriptor, buf + 7, n);
605
137
        rtcm->rtcmtypes.rtcm3_1008.descriptor[n] = '\0';
606
137
        bitcount += 8 * n;
607
137
        rtcm->rtcmtypes.rtcm3_1008.setup_id = ugrab(8);
608
137
        n2 = (unsigned long)ugrab(8);
609
137
        (void)memcpy(rtcm->rtcmtypes.rtcm3_1008.serial, buf + 9 + n, n2);
610
137
        rtcm->rtcmtypes.rtcm3_1008.serial[n2] = '\0';
611
        // bitcount += 8 * n2;
612
137
        unknown = false;
613
137
        break;
614
615
391
    case 1009:
616
391
        msg_name = "GLONASS Basic RTK, L1 Only";
617
391
        rtcm->rtcmtypes.rtcm3_1009.header.station_id =
618
391
            (unsigned short)ugrab(12);
619
391
        rtcm->rtcmtypes.rtcm3_1009.header.tow = ugrab(27);
620
391
        rtcm->rtcmtypes.rtcm3_1009.header.sync = (bool)ugrab(1);
621
391
        rtcm->rtcmtypes.rtcm3_1009.header.satcount = (unsigned short)ugrab(5);
622
391
        rtcm->rtcmtypes.rtcm3_1009.header.smoothing = (bool)ugrab(1);
623
391
        rtcm->rtcmtypes.rtcm3_1009.header.interval = (unsigned short)ugrab(3);
624
15.7k
#define R1009 rtcm->rtcmtypes.rtcm3_1009.rtk_data[i]
625
3.54k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_1009.header.satcount; i++) {
626
3.15k
            R1009.ident = (unsigned short)ugrab(6);
627
3.15k
            R1009.L1.indicator = (bool)ugrab(1);
628
3.15k
            R1009.L1.channel = (short)ugrab(5) - GLONASS_CHANNEL_BASE;
629
3.15k
            R1009.L1.pseudorange = ugrab(25) * GLONASS_PSEUDORANGE_RESOLUTION;
630
3.15k
            RANGEDIFF(R1009.L1, 20);
631
3.15k
            R1009.L1.locktime = (unsigned char)sgrab(7);
632
3.15k
        }
633
391
#undef R1009
634
391
        unknown = false;
635
391
        break;
636
637
360
    case 1010:
638
360
        msg_name = "GLONASS Extended RTK, L1 Only";
639
360
        rtcm->rtcmtypes.rtcm3_1010.header.station_id =
640
360
            (unsigned short)ugrab(12);
641
360
        rtcm->rtcmtypes.rtcm3_1010.header.tow = ugrab(27);
642
360
        rtcm->rtcmtypes.rtcm3_1010.header.sync = (bool)ugrab(1);
643
360
        rtcm->rtcmtypes.rtcm3_1010.header.satcount = (unsigned short)ugrab(5);
644
360
        rtcm->rtcmtypes.rtcm3_1010.header.smoothing = (bool)ugrab(1);
645
360
        rtcm->rtcmtypes.rtcm3_1010.header.interval = (unsigned short)ugrab(3);
646
22.0k
#define R1010 rtcm->rtcmtypes.rtcm3_1010.rtk_data[i]
647
3.51k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_1010.header.satcount; i++) {
648
3.15k
            R1010.ident = (unsigned short)ugrab(6);
649
3.15k
            R1010.L1.indicator = (bool)ugrab(1);
650
3.15k
            R1010.L1.channel = (short)ugrab(5) - GLONASS_CHANNEL_BASE;
651
3.15k
            R1010.L1.pseudorange = ugrab(25) * GLONASS_PSEUDORANGE_RESOLUTION;
652
3.15k
            RANGEDIFF(R1010.L1, 20);
653
3.15k
            R1010.L1.locktime = (unsigned char)sgrab(7);
654
3.15k
            R1010.L1.ambiguity = (unsigned char)ugrab(7);
655
3.15k
            R1010.L1.CNR = ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
656
3.15k
        }
657
360
#undef R1010
658
360
        unknown = false;
659
360
        break;
660
661
372
    case 1011:
662
372
        msg_name = "GLONASS Basic RTK, L1 & L2";
663
372
        rtcm->rtcmtypes.rtcm3_1011.header.station_id =
664
372
            (unsigned short)ugrab(12);
665
372
        rtcm->rtcmtypes.rtcm3_1011.header.tow = ugrab(27);
666
372
        rtcm->rtcmtypes.rtcm3_1011.header.sync = (bool)ugrab(1);
667
372
        rtcm->rtcmtypes.rtcm3_1011.header.satcount = (unsigned short)ugrab(5);
668
372
        rtcm->rtcmtypes.rtcm3_1011.header.smoothing = (bool)ugrab(1);
669
372
        rtcm->rtcmtypes.rtcm3_1011.header.interval = (unsigned short)ugrab(3);
670
54.1k
#define R1011 rtcm->rtcmtypes.rtcm3_1011.rtk_data[i]
671
4.53k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_1011.header.satcount; i++) {
672
4.16k
            R1011.ident = (unsigned short)ugrab(6);
673
4.16k
            R1011.L1.indicator = (bool)ugrab(1);
674
4.16k
            R1011.L1.channel = (short)ugrab(5) - GLONASS_CHANNEL_BASE;
675
4.16k
            R1011.L1.pseudorange = ugrab(25) * GLONASS_PSEUDORANGE_RESOLUTION;
676
4.16k
            RANGEDIFF(R1011.L1, 20);
677
4.16k
            R1011.L1.locktime = (unsigned char)sgrab(7);
678
4.16k
            R1011.L1.ambiguity = (unsigned char)ugrab(7);
679
4.16k
            R1011.L1.CNR = ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
680
4.16k
            R1011.L2.indicator = (bool)ugrab(1);
681
4.16k
            R1011.L2.channel = (short)ugrab(5) - GLONASS_CHANNEL_BASE;
682
4.16k
            R1011.L2.pseudorange = ugrab(25) * GLONASS_PSEUDORANGE_RESOLUTION;
683
4.16k
            RANGEDIFF(R1011.L2, 20);
684
4.16k
            R1011.L2.locktime = (unsigned char)sgrab(7);
685
4.16k
            R1011.L2.ambiguity = (unsigned char)ugrab(7);
686
4.16k
            R1011.L2.CNR = ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
687
4.16k
        }
688
372
#undef R1011
689
372
        unknown = false;
690
372
        break;
691
692
453
    case 1012:
693
453
        msg_name = "GLONASS Extended RTK, L1 & L2";
694
453
        rtcm->rtcmtypes.rtcm3_1012.header.station_id =
695
453
            (unsigned short)ugrab(12);
696
453
        rtcm->rtcmtypes.rtcm3_1012.header.tow = ugrab(27);
697
453
        rtcm->rtcmtypes.rtcm3_1012.header.sync = (bool)ugrab(1);
698
453
        rtcm->rtcmtypes.rtcm3_1012.header.satcount = (unsigned short)ugrab(5);
699
453
        rtcm->rtcmtypes.rtcm3_1012.header.smoothing = (bool)ugrab(1);
700
453
        rtcm->rtcmtypes.rtcm3_1012.header.interval = (unsigned short)ugrab(3);
701
69.4k
#define R1012 rtcm->rtcmtypes.rtcm3_1012.rtk_data[i]
702
6.76k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_1012.header.satcount; i++) {
703
6.31k
            unsigned rangeincr;
704
705
6.31k
            R1012.ident = (unsigned short)ugrab(6);
706
6.31k
            R1012.L1.indicator = (bool)ugrab(1);
707
6.31k
            R1012.L1.channel = (short)ugrab(5) - GLONASS_CHANNEL_BASE;
708
6.31k
            R1012.L1.pseudorange = ugrab(25) * GLONASS_PSEUDORANGE_RESOLUTION;
709
6.31k
            RANGEDIFF(R1012.L1, 20);
710
6.31k
            R1012.L1.locktime = (unsigned char)ugrab(7);
711
6.31k
            R1012.L1.ambiguity = (unsigned char)ugrab(7);
712
6.31k
            R1012.L1.CNR = (unsigned char)ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
713
6.31k
            R1012.L2.indicator = (bool)ugrab(2);
714
6.31k
            rangeincr = ugrab(14);
715
6.31k
            if (rangeincr == GLONASS_INVALID_RANGEINCR) {
716
140
                R1012.L2.pseudorange = 0;
717
6.17k
            } else {
718
6.17k
                R1012.L2.pseudorange = (rangeincr *
719
6.17k
                                        GLONASS_PSEUDORANGE_RESOLUTION);
720
6.17k
            }
721
6.31k
            RANGEDIFF(R1012.L2, 20);
722
6.31k
            R1012.L2.locktime = (unsigned char)sgrab(7);
723
6.31k
            R1012.L2.CNR = (unsigned char)ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
724
6.31k
        }
725
453
#undef R1012
726
453
        unknown = false;
727
453
        break;
728
729
292
    case 1013:
730
292
        msg_name = "System Parameters";
731
292
        rtcm->rtcmtypes.rtcm3_1013.station_id = (unsigned short)ugrab(12);
732
292
        rtcm->rtcmtypes.rtcm3_1013.mjd = (unsigned short)ugrab(16);
733
292
        rtcm->rtcmtypes.rtcm3_1013.sod = (unsigned short)ugrab(17);
734
292
        rtcm->rtcmtypes.rtcm3_1013.ncount = (unsigned long)ugrab(5);
735
292
        rtcm->rtcmtypes.rtcm3_1013.leapsecs = (unsigned char)ugrab(8);
736
7.71k
#define R1013 rtcm->rtcmtypes.rtcm3_1013.announcements[i]
737
2.86k
        for (i = 0; i < rtcm->rtcmtypes.rtcm3_1013.ncount; i++) {
738
2.57k
            R1013.id = (unsigned short)ugrab(12);
739
2.57k
            R1013.sync = (bool)ugrab(1);
740
2.57k
            R1013.interval = (unsigned short)ugrab(16);
741
2.57k
        }
742
292
#undef R1013
743
292
        unknown = false;
744
292
        break;
745
746
132
    case 1014:
747
132
        msg_name = "Network Auxiliary Station Data";
748
        // coordinate difference between one Aux station and master station
749
132
        rtcm->rtcmtypes.rtcm3_1014.network_id = (int)ugrab(8);
750
132
        rtcm->rtcmtypes.rtcm3_1014.subnetwork_id = (int)ugrab(4);
751
132
        rtcm->rtcmtypes.rtcm3_1014.stationcount = (char)ugrab(5);
752
132
        rtcm->rtcmtypes.rtcm3_1014.master_id = (int)ugrab(12);
753
132
        rtcm->rtcmtypes.rtcm3_1014.aux_id = (int)ugrab(12);
754
132
        rtcm->rtcmtypes.rtcm3_1014.d_lat =
755
132
            (unsigned short)ugrab(20) * ANTENNA_DEGREE_RESOLUTION;
756
132
        rtcm->rtcmtypes.rtcm3_1014.d_lon =
757
132
            (unsigned short)ugrab(21) * ANTENNA_DEGREE_RESOLUTION;
758
132
        rtcm->rtcmtypes.rtcm3_1014.d_alt = (unsigned short)ugrab(23) / 1000;
759
132
        unknown = false;
760
132
        break;
761
762
271
    case 1015:
763
        /* RTCM 3.1
764
         * GPS Ionospheric Correction Differences for all satellites
765
         * between the master station and one auxiliary station
766
         * 9 bytes minimum
767
         */
768
271
        unknown = rtcm3_101567(context, rtcm, buf);
769
271
        msg_name = "GPS Ionospheric Correction Differences";
770
271
        break;
771
772
167
    case 1016:
773
        /* RTCM 3.1
774
         * GPS Geometric Correction Differences for all satellites between
775
         * the master station and one auxiliary station.
776
         * 9 bytes minimum
777
         */
778
167
        unknown = rtcm3_101567(context, rtcm, buf);
779
167
        msg_name = "GPS Geometric Correction Differences";
780
167
        break;
781
782
135
    case 1017:
783
        /* RTCM 3.1
784
         * GPS Combined Geometric and Ionospheric Correction Differences
785
         * for all satellites between one Aux station and the master station
786
         * (same content as both types 1015 and 1016 together, but less size)
787
         * 9 bytes minimum
788
         */
789
135
        unknown = rtcm3_101567(context, rtcm, buf);
790
135
        msg_name = "GPS Combined Geometric and Ionospheric "
791
135
                       "Correction Differences";
792
135
        break;
793
794
134
    case 1018:
795
        /* RTCM 3.1
796
         * Reserved for alternative Ionospheric Correction Difference Message
797
         */
798
134
        msg_name = "Reserved for alternative Ionospheric Correction "
799
134
                       "Differences";
800
134
        break;
801
802
132
    case 1019:
803
        /* RTCM 3.1 - 1020
804
         * GPS Ephemeris
805
         * 62 bytes
806
         */
807
        // TODO: rtklib has C code for this one.
808
132
        msg_name = "GPS Ephemeris";
809
132
        break;
810
811
133
    case 1020:
812
        /* RTCM 3.1 - 1020
813
         * GLONASS Ephemeris
814
         * 45 bytes
815
         */
816
        // TODO: rtklib has C code for this one.
817
133
        msg_name = "GLO Ephemeris";
818
133
        break;
819
820
634
    case 1021:
821
        /* RTCM 3.1
822
         * Helmert / Abridged Molodenski Transformation parameters
823
         */
824
634
        msg_name = "Helmert / Abridged Molodenski Transformation "
825
634
                       "parameters";
826
        // Set Source-Name
827
634
        n = (unsigned)ugrab(5);
828
634
        if ((sizeof(rtcm->rtcmtypes.rtcm3_1021.src_name) -1) <= n) {
829
            // paranoia
830
143
            n = sizeof(rtcm->rtcmtypes.rtcm3_1021.src_name) - 1;
831
143
        }
832
7.38k
        for (i = 0; i < n; i++) {
833
6.74k
            rtcm->rtcmtypes.rtcm3_1021.src_name[i] = (char)ugrab(8);
834
6.74k
        }
835
634
        rtcm->rtcmtypes.rtcm3_1021.src_name[n] = '\0';
836
        // Set Target-Name
837
634
        n2 = (unsigned)ugrab(5);
838
634
        if ((sizeof(rtcm->rtcmtypes.rtcm3_1021.tar_name) - 1) <= n2) {
839
            // paranoia
840
196
            n2 = sizeof(rtcm->rtcmtypes.rtcm3_1021.tar_name) - 1;
841
196
        }
842
9.13k
        for (i = 0; i < n2; i++) {
843
8.50k
            rtcm->rtcmtypes.rtcm3_1021.tar_name[i] = (char)ugrab(8);
844
8.50k
        }
845
634
        rtcm->rtcmtypes.rtcm3_1021.tar_name[n2] = '\0';
846
634
        rtcm->rtcmtypes.rtcm3_1021.sys_id_num = (unsigned)ugrab(8);
847
6.34k
#define R1021 rtcm->rtcmtypes.rtcm3_1021.ut_tr_msg_id[i]
848
6.97k
        for (i = 0; i < RTCM3_DF148_SIZE; i++) {
849
6.34k
            R1021 = (bool)ugrab(1);
850
6.34k
        }
851
634
#undef R1021
852
634
        rtcm->rtcmtypes.rtcm3_1021.plate_number = (unsigned)ugrab(5);
853
634
        rtcm->rtcmtypes.rtcm3_1021.computation_id = (unsigned)ugrab(4);
854
634
        rtcm->rtcmtypes.rtcm3_1021.height_id = (unsigned)ugrab(2);
855
634
        rtcm->rtcmtypes.rtcm3_1021.lat_origin = sgrab(19) *
856
634
            VALIDITY_RESOLUTION / DEG_ARCSEC_RESOLUTION;
857
634
        rtcm->rtcmtypes.rtcm3_1021.lon_origin = sgrab(20) *
858
634
            VALIDITY_RESOLUTION / DEG_ARCSEC_RESOLUTION;
859
634
        rtcm->rtcmtypes.rtcm3_1021.lat_extension = sgrab(14) *
860
634
            VALIDITY_RESOLUTION / DEG_ARCSEC_RESOLUTION;
861
634
        rtcm->rtcmtypes.rtcm3_1021.lon_extension = sgrab(14) *
862
634
            VALIDITY_RESOLUTION / DEG_ARCSEC_RESOLUTION;
863
634
        rtcm->rtcmtypes.rtcm3_1021.x_trans = sgrab(23) *
864
634
            TRANSLATION_MM_RESOLUTION;
865
634
        rtcm->rtcmtypes.rtcm3_1021.y_trans = sgrab(23) *
866
634
            TRANSLATION_MM_RESOLUTION;
867
634
        rtcm->rtcmtypes.rtcm3_1021.z_trans = sgrab(23) *
868
634
            TRANSLATION_MM_RESOLUTION;
869
634
        rtcm->rtcmtypes.rtcm3_1021.x_rot = sgrab(32) *
870
634
            ROTATION_ARCSEC_RESOLUTION / DEG_ARCSEC_RESOLUTION;
871
634
        rtcm->rtcmtypes.rtcm3_1021.y_rot = sgrab(32) *
872
634
            ROTATION_ARCSEC_RESOLUTION / DEG_ARCSEC_RESOLUTION;
873
634
        rtcm->rtcmtypes.rtcm3_1021.z_rot = sgrab(32) *
874
634
            ROTATION_ARCSEC_RESOLUTION / DEG_ARCSEC_RESOLUTION;
875
634
        rtcm->rtcmtypes.rtcm3_1021.ds = sgrab(25) * SCALE_PPM_RESOLUTION;
876
634
        rtcm->rtcmtypes.rtcm3_1021.add_as = sgrab(24) *
877
634
            TRANSLATION_MM_RESOLUTION;
878
634
        rtcm->rtcmtypes.rtcm3_1021.add_bs = sgrab(25) *
879
634
            TRANSLATION_MM_RESOLUTION;
880
634
        rtcm->rtcmtypes.rtcm3_1021.add_at = sgrab(24) *
881
634
            TRANSLATION_MM_RESOLUTION;
882
634
        rtcm->rtcmtypes.rtcm3_1021.add_bt = sgrab(25) *
883
634
            TRANSLATION_MM_RESOLUTION;
884
634
        rtcm->rtcmtypes.rtcm3_1021.quality_hori = (unsigned)ugrab(3);
885
634
        rtcm->rtcmtypes.rtcm3_1021.quality_vert = (unsigned)ugrab(3);
886
887
634
        unknown = false;
888
634
        break;
889
890
135
    case 1022:
891
        /* RTCM 3.1
892
         * Molodenski-Badekas transformation parameters
893
         */
894
135
        msg_name = "Molodenski-Badekas transformation parameters";
895
135
        break;
896
897
142
    case 1023:
898
        /* RTCM 3.1
899
         * Residuals Ellipsoidal Grid Representation
900
         */
901
142
        msg_name = "Residuals Ellipsoidal Grid Representation";
902
142
        rtcm->rtcmtypes.rtcm3_1023.sys_id_num = (unsigned)ugrab(8);
903
142
        rtcm->rtcmtypes.rtcm3_1023.shift_id_hori = (bool)ugrab(1);
904
142
        rtcm->rtcmtypes.rtcm3_1023.shift_id_vert = (bool)ugrab(1);
905
142
        rtcm->rtcmtypes.rtcm3_1023.lat_origin = sgrab(21) *
906
142
            PHASE_CORRECTION_RESOLUTION / DEG_ARCSEC_RESOLUTION;
907
142
        rtcm->rtcmtypes.rtcm3_1023.lon_origin = sgrab(22) *
908
142
            PHASE_CORRECTION_RESOLUTION / DEG_ARCSEC_RESOLUTION;
909
142
        rtcm->rtcmtypes.rtcm3_1023.lat_extension = (unsigned)ugrab(12) *
910
142
            PHASE_CORRECTION_RESOLUTION / DEG_ARCSEC_RESOLUTION;
911
142
        rtcm->rtcmtypes.rtcm3_1023.lon_extension = (unsigned)ugrab(12) *
912
142
            PHASE_CORRECTION_RESOLUTION / DEG_ARCSEC_RESOLUTION;
913
142
        rtcm->rtcmtypes.rtcm3_1023.lat_mean = sgrab(8) *
914
142
            TRANSLATION_MM_RESOLUTION;
915
142
        rtcm->rtcmtypes.rtcm3_1023.lon_mean = sgrab(8) *
916
142
            TRANSLATION_MM_RESOLUTION;
917
142
        rtcm->rtcmtypes.rtcm3_1023.hgt_mean = sgrab(15) * CM_RESOLUTION;
918
6.81k
#define R1023 rtcm->rtcmtypes.rtcm3_1023.residuals[i]
919
2.41k
        for (i = 0; i < RTCM3_GRID_SIZE; i++) {
920
2.27k
            R1023.lat_res = sgrab(9) * RES_ARCSEC_RESOLUTION;
921
2.27k
            R1023.lon_res = sgrab(9) * RES_ARCSEC_RESOLUTION;
922
2.27k
            R1023.hgt_res = sgrab(9) * TRANSLATION_MM_RESOLUTION;
923
2.27k
        }
924
142
#undef R1023
925
142
        rtcm->rtcmtypes.rtcm3_1023.interp_meth_id_hori = (unsigned)ugrab(2);
926
142
        rtcm->rtcmtypes.rtcm3_1023.interp_meth_id_vert = (unsigned)ugrab(2);
927
142
        rtcm->rtcmtypes.rtcm3_1023.grd_qual_id_hori = (unsigned)ugrab(3);
928
142
        rtcm->rtcmtypes.rtcm3_1023.grd_qual_id_vert = (unsigned)ugrab(3);
929
142
        rtcm->rtcmtypes.rtcm3_1023.mjd = (unsigned short)ugrab(16);
930
142
        unknown = false;
931
142
        break;
932
933
134
    case 1024:
934
        /* RTCM 3.1
935
         * Residuals Plane Grid Representation
936
         */
937
134
        msg_name = "Residuals Plane Grid Representation";
938
134
        break;
939
940
135
    case 1025:
941
        /* RTCM 3.1
942
         * Projection Parameters, Projection Types other than LCC2SP
943
         */
944
135
        msg_name = "Projection Parameters, Projection Types other "
945
135
                       "than LCC2SP";
946
135
        rtcm->rtcmtypes.rtcm3_1025.sys_id_num = (unsigned short)ugrab(8);
947
135
        rtcm->rtcmtypes.rtcm3_1025.projection_type = (unsigned short)ugrab(6);
948
135
        rtcm->rtcmtypes.rtcm3_1025.lat_origin = sgrab(34) *
949
135
            PROJ_ORIGIN_RESOLUTION;
950
135
        rtcm->rtcmtypes.rtcm3_1025.lon_origin = sgrab(35) *
951
135
            PROJ_ORIGIN_RESOLUTION;
952
135
        rtcm->rtcmtypes.rtcm3_1025.add_sno = (unsigned)ugrab(30) *
953
135
            SCALE_PPM_RESOLUTION;
954
135
        rtcm->rtcmtypes.rtcm3_1025.false_east = (unsigned)ugrab(36) *
955
135
            TRANSLATION_MM_RESOLUTION;
956
135
        rtcm->rtcmtypes.rtcm3_1025.false_north = ugrab(35) *
957
135
            TRANSLATION_MM_RESOLUTION;
958
135
        unknown = false;
959
135
        break;
960
961
135
    case 1026:
962
        /* RTCM 3.1
963
         * Projection Parameters, Projection Type LCC2SP
964
         * (Lambert Conic Conformal)
965
         */
966
135
        msg_name = "Projection Parameters, Projection Type LCC2SP";
967
135
        break;
968
969
139
    case 1027:
970
        /* RTCM 3.1
971
         * Projection Parameters, Projection Type OM (Oblique Mercator)
972
         */
973
139
        msg_name = "Projection Parameters, Projection Type OM";
974
139
        break;
975
976
530
    case 1028:
977
        /* RTCM 3.1
978
         * Reserved for global to plate fixed transformation
979
         */
980
530
        msg_name = "Reserved, Global to Plate Transformation";
981
530
        break;
982
983
226
    case 1029:
984
226
        msg_name = "Text in UTF8 format";
985
        /* 9 bytes minimum
986
         * (max. 127 multibyte characters and max. 255 bytes)
987
         */
988
226
        rtcm->rtcmtypes.rtcm3_1029.station_id = (unsigned short)ugrab(12);
989
226
        rtcm->rtcmtypes.rtcm3_1029.mjd = (unsigned short)ugrab(16);
990
226
        rtcm->rtcmtypes.rtcm3_1029.sod = (unsigned short)ugrab(17);
991
226
        rtcm->rtcmtypes.rtcm3_1029.len = (unsigned long)ugrab(7);
992
226
        rtcm->rtcmtypes.rtcm3_1029.unicode_units = (size_t)ugrab(8);
993
226
        (void)memcpy(rtcm->rtcmtypes.rtcm3_1029.text,
994
226
                     buf + 12, rtcm->rtcmtypes.rtcm3_1029.unicode_units);
995
226
        unknown = false;
996
226
        break;
997
998
153
    case 1030:
999
        /* RTCM 3.1
1000
         * GPS Network RTK Residual Message
1001
         */
1002
153
        msg_name = "GPS Network RTK Residual";
1003
153
        break;
1004
1005
134
    case 1031:
1006
        /* RTCM 3.1
1007
         * GLONASS Network RTK Residual Message
1008
         */
1009
134
        msg_name = "GLONASS Network RTK Residual";
1010
134
        break;
1011
1012
134
    case 1032:
1013
        /* RTCM 3.1
1014
         * Physical Reference Station Position message
1015
         */
1016
134
        msg_name = "Physical Reference Station Position";
1017
134
        break;
1018
1019
133
    case 1033:                  // see note in header
1020
133
        msg_name ="Receiver and Antenna Descriptor";
1021
        /* Type1033 is a combined Message Types 1007 and 1008
1022
         * and hence contains antenna descriptor and serial number
1023
         * as well as receiver descriptor and serial number.
1024
         */
1025
        // TODO: rtklib has C code for this one.
1026
133
        rtcm->rtcmtypes.rtcm3_1033.station_id = (unsigned short)ugrab(12);
1027
133
        n = (unsigned long)ugrab(8);
1028
133
        (void)memcpy(rtcm->rtcmtypes.rtcm3_1033.descriptor, buf + 7, n);
1029
133
        rtcm->rtcmtypes.rtcm3_1033.descriptor[n] = '\0';
1030
133
        bitcount += 8 * n;
1031
133
        rtcm->rtcmtypes.rtcm3_1033.setup_id = ugrab(8);
1032
133
        n2 = (unsigned long)ugrab(8);
1033
133
        (void)memcpy(rtcm->rtcmtypes.rtcm3_1033.serial, buf + 9 + n, n2);
1034
133
        rtcm->rtcmtypes.rtcm3_1033.serial[n2] = '\0';
1035
133
        bitcount += 8 * n2;
1036
133
        n3 = (unsigned long)ugrab(8);
1037
133
        (void)memcpy(rtcm->rtcmtypes.rtcm3_1033.receiver, buf + 10+n+n2, n3);
1038
133
        rtcm->rtcmtypes.rtcm3_1033.receiver[n3] = '\0';
1039
133
        bitcount += 8 * n3;
1040
133
        n4 = (unsigned long)ugrab(8);
1041
133
        (void)memcpy(rtcm->rtcmtypes.rtcm3_1033.firmware, buf + 11+n+n2+n3, n3);
1042
133
        rtcm->rtcmtypes.rtcm3_1033.firmware[n4] = '\0';
1043
        // bitcount += 8 * n4;
1044
        // TODO: next is receiver serial number
1045
133
        unknown = false;
1046
133
        break;
1047
1048
133
    case 1034:
1049
        /* RTCM 3.2
1050
         * GPS Network FKP Gradient Message
1051
         */
1052
133
        msg_name = "GPS Network FKP Gradient";
1053
133
        break;
1054
1055
137
    case 1035:
1056
        /* RTCM 3.2
1057
         * GLONASS Network FKP Gradient Message
1058
         */
1059
137
        msg_name = "GLO Network FKP Gradient";
1060
137
        break;
1061
1062
135
    case 1037:
1063
        /* RTCM 3.2
1064
         * GLONASS Ionospheric Correction Differences
1065
         */
1066
135
        msg_name = "GLO Ionospheric Correction Differences";
1067
135
        break;
1068
1069
132
    case 1038:
1070
        /* RTCM 3.2
1071
         * GLONASS Geometric Correction Differences
1072
         */
1073
132
        msg_name = "GLO Geometric Correction Differences";
1074
132
        break;
1075
1076
100
    case 1039:
1077
        /* RTCM 3.2
1078
         * GLONASS Combined Geometric and Ionospheric Correction Differences
1079
         */
1080
100
        msg_name = "GLONASS Combined Geometric and Ionospheric "
1081
100
                       "Correction Differences";
1082
100
        break;
1083
1084
161
    case 1042:
1085
        /* RTCM 3.x - 1043
1086
         * BeiDou Ephemeris
1087
         * length ?
1088
         */
1089
161
        msg_name = "BD Ephemeris";
1090
161
        break;
1091
1092
149
    case 1043:
1093
        /* RTCM 3.x - 1043
1094
         * SBAS Ephemeris
1095
         * length 29
1096
         */
1097
149
        msg_name = "SBAS Ephemeris";
1098
149
        break;
1099
1100
134
    case 1044:
1101
        /* RTCM 3.x - 1044
1102
         * QZSS ephemeris
1103
         * length 61
1104
         */
1105
        // TODO: rtklib has C code for this one.
1106
134
        msg_name = "QZSS Ephemeris";
1107
134
        break;
1108
1109
146
    case 1045:
1110
        /* RTCM 3.2 - 1045
1111
         * Galileo F/NAV Ephemeris Data
1112
         * 64 bytes
1113
         */
1114
        // TODO: rtklib has C code for this one.
1115
146
        msg_name = "GAL F/NAV Ephemeris Data";
1116
146
        break;
1117
1118
133
    case 1046:
1119
        /* RTCM 3.x - 1046
1120
         * Galileo I/NAV Ephemeris Data
1121
         * length 63
1122
         */
1123
        // TODO: rtklib has C code for this one.
1124
133
        msg_name = "GAL I/NAV Ephemeris Data";
1125
133
        break;
1126
1127
132
    case 1057:
1128
        /* RTCM 3.2
1129
         * SSR GPS Orbit Correction
1130
         */
1131
132
        msg_name = "SSR GPS Orbit Correction";
1132
132
        break;
1133
1134
136
    case 1058:
1135
        /* RTCM 3.2
1136
         * SSR GPS Clock Correction
1137
         */
1138
136
        msg_name = "SSR GPS Clock Correction";
1139
136
        break;
1140
1141
143
    case 1059:
1142
        /* RTCM 3.2
1143
         * SSR GPS Code Bias
1144
         */
1145
143
        msg_name = "SSR GPS Code Bias";
1146
143
        break;
1147
1148
138
    case 1060:
1149
        /* RTCM 3.2
1150
         * SSR GPS Combined Orbit and Clock Correction
1151
         */
1152
138
        msg_name = "SSR GPS Combined Orbit and Clock Correction";
1153
138
        break;
1154
1155
142
    case 1061:
1156
        /* RTCM 3.2
1157
         * SSR GPS URA
1158
         */
1159
142
        msg_name = "SSR GPS URA";
1160
142
        break;
1161
1162
147
    case 1062:
1163
        /* RTCM 3.2
1164
         * SSR GPS High Rate Clock Correction
1165
         */
1166
147
        msg_name = "SSR GPS High Rate Clock Correction";
1167
147
        break;
1168
1169
140
    case 1063:
1170
        /* RTCM 3.2
1171
         * SSR GLO Orbit Correction
1172
         */
1173
140
        msg_name = "SSR GLO Orbit Correction";
1174
140
        break;
1175
1176
137
    case 1064:
1177
        /* RTCM 3.2
1178
         * SSR GLO Clock Correction
1179
         */
1180
137
        msg_name = "SSR GLO Clock Correction";
1181
137
        break;
1182
1183
133
    case 1065:
1184
        /* RTCM 3.2
1185
         * SSR GLO Code Correction
1186
         */
1187
133
        msg_name = "SSR GLO ode Correction";
1188
133
        break;
1189
1190
134
    case 1066:
1191
        /* RTCM 3.2
1192
         * SSR GLO Combined Orbit and Clock Correction
1193
         */
1194
134
        msg_name = "SSR GLO Combined Orbit and Clock Correction";
1195
134
        break;
1196
1197
143
    case 1067:
1198
        /* RTCM 3.2
1199
         * SSR GLO URA
1200
         */
1201
143
        msg_name = "SSR GLO URA";
1202
143
        break;
1203
1204
132
    case 1068:
1205
        /* RTCM 3.2
1206
         * SSR GPS High Rate Clock Correction
1207
         */
1208
132
        msg_name = "SSR GLO High Rate Clock Correction";
1209
132
        break;
1210
1211
132
    case 1070:
1212
        /* RTCM 3.x
1213
         * Reserved for MSM
1214
         */
1215
132
        msg_name = "Reserved for MSM";
1216
132
        break;
1217
1218
233
    case 1071:
1219
        // RTCM 3.2
1220
233
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GPS;
1221
233
        rtcm->rtcmtypes.rtcm3_msm.msm = 1;
1222
233
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1223
233
        msg_name = "GPS MSM 1";
1224
233
        break;
1225
1226
279
    case 1072:
1227
        // RTCM 3.2
1228
279
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GPS;
1229
279
        rtcm->rtcmtypes.rtcm3_msm.msm = 2;
1230
279
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1231
279
        msg_name = "GPS MSM 2";
1232
279
        break;
1233
1234
186
    case 1073:
1235
        /* RTCM 3.2
1236
         * GPS Multi Signal Message 3
1237
         */
1238
186
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GPS;
1239
186
        rtcm->rtcmtypes.rtcm3_msm.msm = 3;
1240
186
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1241
186
        msg_name = "GPS MSM 3";
1242
186
        break;
1243
1244
392
    case 1074:
1245
        /* RTCM 3.2
1246
         * GPS Multi Signal Message 4
1247
         */
1248
392
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GPS;
1249
392
        rtcm->rtcmtypes.rtcm3_msm.msm = 4;
1250
392
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1251
392
        msg_name = "GPS MSM 4";
1252
392
        break;
1253
1254
299
    case 1075:
1255
        /* RTCM 3.2
1256
         * GPS Multi Signal Message 5
1257
         */
1258
299
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GPS;
1259
299
        rtcm->rtcmtypes.rtcm3_msm.msm = 5;
1260
299
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1261
299
        msg_name = "GPS MSM 5";
1262
299
        break;
1263
1264
346
    case 1076:
1265
        /* RTCM 3.2
1266
         * GPS Multi Signal Message 6
1267
         */
1268
346
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GPS;
1269
346
        rtcm->rtcmtypes.rtcm3_msm.msm = 6;
1270
346
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1271
346
        msg_name = "GPS MSM 6";
1272
346
        break;
1273
1274
371
    case 1077:
1275
        /* RTCM 3.2 - 1077
1276
         * GPS Multi Signal Message 7
1277
         * Full GPS pseudo-ranges, carrier phases, Doppler and
1278
         * signal strength (high resolution)
1279
         * min length 438
1280
         */
1281
371
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GPS;
1282
371
        rtcm->rtcmtypes.rtcm3_msm.msm = 7;
1283
371
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1284
371
        msg_name = "GPS MSM7";
1285
371
        break;
1286
1287
153
    case 1078:
1288
        /* RTCM 3.x
1289
         * Reserved for MSM
1290
         */
1291
153
        msg_name = "Reserved for MSM";
1292
153
        break;
1293
1294
135
    case 1079:
1295
        /* RTCM 3.x
1296
         * Reserved for MSM
1297
         */
1298
135
        msg_name = "Reserved for MSM";
1299
135
        break;
1300
1301
135
    case 1080:
1302
        /* RTCM 3.x
1303
         * Reserved for MSM
1304
         */
1305
135
        msg_name = "Reserved for MSM";
1306
135
        break;
1307
1308
121
    case 1081:
1309
        /* RTCM 3.2
1310
         * GLONASS Multi Signal Message 1
1311
         */
1312
121
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GLO;
1313
121
        rtcm->rtcmtypes.rtcm3_msm.msm = 1;
1314
121
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1315
121
        msg_name = "GLO MSM 1";
1316
121
        break;
1317
1318
272
    case 1082:
1319
        /* RTCM 3.2
1320
         * GLONASS Multi Signal Message 2
1321
         */
1322
272
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GLO;
1323
272
        rtcm->rtcmtypes.rtcm3_msm.msm = 2;
1324
272
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1325
272
        msg_name = "GLO MSM 2";
1326
272
        break;
1327
1328
241
    case 1083:
1329
        /* RTCM 3.2
1330
         * GLONASS Multi Signal Message 4
1331
         */
1332
241
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GLO;
1333
241
        rtcm->rtcmtypes.rtcm3_msm.msm = 3;
1334
241
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1335
241
        msg_name = "GLO MSM 3";
1336
241
        break;
1337
1338
144
    case 1084:
1339
        /* RTCM 3.2
1340
         * GLONASS Multi Signal Message 4
1341
         */
1342
144
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GLO;
1343
144
        rtcm->rtcmtypes.rtcm3_msm.msm = 4;
1344
144
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1345
144
        msg_name = "GLO MSM 4";
1346
144
        break;
1347
1348
279
    case 1085:
1349
        /* RTCM 3.2
1350
         * GLONASS Multi Signal Message 5
1351
         */
1352
279
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GLO;
1353
279
        rtcm->rtcmtypes.rtcm3_msm.msm = 5;
1354
279
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1355
279
        msg_name = "GLO MSM 5";
1356
279
        break;
1357
1358
134
    case 1086:
1359
        /* RTCM 3.2
1360
         * GLONASS Multi Signal Message 6
1361
         */
1362
134
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GLO;
1363
134
        rtcm->rtcmtypes.rtcm3_msm.msm = 6;
1364
134
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1365
134
        msg_name = "GLO MSM 6";
1366
134
        break;
1367
1368
313
    case 1087:
1369
        /* RTCM 3.2 - 1087
1370
         * GLONASS Multi Signal Message 7
1371
         * Full GLONASS pseudo-ranges, carrier phases, Doppler and
1372
         * signal strength (high resolution)
1373
         * length 417 or 427
1374
         */
1375
313
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GLO;
1376
313
        rtcm->rtcmtypes.rtcm3_msm.msm = 7;
1377
313
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1378
313
        msg_name = "GLO MSM 7";
1379
313
        break;
1380
1381
133
    case 1088:
1382
        /* RTCM 3.x
1383
         * Reserved for MSM
1384
         */
1385
133
        msg_name = "Reserved for MSM";
1386
133
        break;
1387
1388
136
    case 1089:
1389
        /* RTCM 3.x
1390
         * Reserved for MSM
1391
         */
1392
136
        msg_name = "Reserved for MSM";
1393
136
        break;
1394
1395
161
    case 1090:
1396
        /* RTCM 3.x
1397
         * Reserved for MSM
1398
         */
1399
161
        msg_name = "Reserved for MSM";
1400
161
        break;
1401
1402
340
    case 1091:
1403
        /* RTCM 3.2
1404
         * Galileo Multi Signal Message 1
1405
         */
1406
340
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GAL;
1407
340
        rtcm->rtcmtypes.rtcm3_msm.msm = 1;
1408
340
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1409
340
        msg_name = "GAL MSM 1";
1410
340
        break;
1411
1412
294
    case 1092:
1413
        /* RTCM 3.2
1414
         * Galileo Multi Signal Message 2
1415
         */
1416
294
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GAL;
1417
294
        rtcm->rtcmtypes.rtcm3_msm.msm = 2;
1418
294
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1419
294
        msg_name = "GAL MSM 2";
1420
294
        break;
1421
1422
273
    case 1093:
1423
        /* RTCM 3.2
1424
         * Galileo Multi Signal Message 3
1425
         */
1426
273
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GAL;
1427
273
        rtcm->rtcmtypes.rtcm3_msm.msm = 3;
1428
273
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1429
273
        msg_name = "GAL MSM 3";
1430
273
        break;
1431
1432
322
    case 1094:
1433
        /* RTCM 3.2
1434
         * Galileo Multi Signal Message 4
1435
         */
1436
322
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GAL;
1437
322
        rtcm->rtcmtypes.rtcm3_msm.msm = 4;
1438
322
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1439
322
        msg_name = "GAL MSM 4";
1440
322
        break;
1441
1442
520
    case 1095:
1443
        /* RTCM 3.2
1444
         * Galileo Multi Signal Message 5
1445
         */
1446
520
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GAL;
1447
520
        rtcm->rtcmtypes.rtcm3_msm.msm = 5;
1448
520
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1449
520
        msg_name = "GAL MSM 5";
1450
520
        break;
1451
1452
156
    case 1096:
1453
        /* RTCM 3.2
1454
         * Galileo Multi Signal Message 6
1455
         */
1456
156
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GAL;
1457
156
        rtcm->rtcmtypes.rtcm3_msm.msm = 6;
1458
156
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1459
156
        msg_name = "GAL MSM 6";
1460
156
        break;
1461
1462
134
    case 1097:
1463
        /* RTCM 3.2 - 1097
1464
         * Galileo Multi Signal Message 7
1465
         * Full Galileo pseudo-ranges, carrier phases, Doppler and
1466
         * signal strength (high resolution)
1467
         * length 96
1468
         */
1469
134
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_GAL;
1470
134
        rtcm->rtcmtypes.rtcm3_msm.msm = 7;
1471
134
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1472
134
        msg_name = "GAL MSM 7";
1473
134
        break;
1474
1475
132
    case 1098:
1476
        /* RTCM 3.x
1477
         * Reserved for MSM
1478
         */
1479
132
        msg_name = "Reserved for MSM";
1480
132
        break;
1481
1482
84
    case 1099:
1483
        /* RTCM 3.x
1484
         * Reserved for MSM
1485
         */
1486
84
        msg_name = "Reserved for MSM";
1487
84
        break;
1488
1489
134
    case 1100:
1490
        /* RTCM 3.x
1491
         * Reserved for MSM
1492
         */
1493
134
        msg_name = "Reserved for MSM";
1494
134
        break;
1495
1496
268
    case 1101:
1497
        /* RTCM 3.3
1498
         * SBAS Multi Signal Message 1
1499
         */
1500
268
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_SBAS;
1501
268
        rtcm->rtcmtypes.rtcm3_msm.msm = 1;
1502
268
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1503
268
        msg_name = "SBAS MSM 1";
1504
268
        break;
1505
1506
166
    case 1102:
1507
        /* RTCM 3.3
1508
         * SBAS Multi Signal Message 2
1509
         */
1510
166
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_SBAS;
1511
166
        rtcm->rtcmtypes.rtcm3_msm.msm = 2;
1512
166
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1513
166
        msg_name = "SBAS MSM 2";
1514
166
        break;
1515
1516
269
    case 1103:
1517
        /* RTCM 3.3
1518
         * SBAS Multi Signal Message 3
1519
         */
1520
269
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_SBAS;
1521
269
        rtcm->rtcmtypes.rtcm3_msm.msm = 3;
1522
269
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1523
269
        msg_name = "SBAS MSM 3";
1524
269
        break;
1525
1526
451
    case 1104:
1527
        /* RTCM 3.3
1528
         * SBAS Multi Signal Message 4
1529
         */
1530
451
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_SBAS;
1531
451
        rtcm->rtcmtypes.rtcm3_msm.msm = 4;
1532
451
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1533
451
        msg_name = "SBAS MSM 4";
1534
451
        break;
1535
1536
172
    case 1105:
1537
        /* RTCM 3.3
1538
         * SBAS Multi Signal Message 5
1539
         */
1540
172
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_SBAS;
1541
172
        rtcm->rtcmtypes.rtcm3_msm.msm = 5;
1542
172
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1543
172
        msg_name = "SBAS MSM 5";
1544
172
        break;
1545
1546
293
    case 1106:
1547
        /* RTCM 3.3
1548
         * SBAS Multi Signal Message 6
1549
         */
1550
293
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_SBAS;
1551
293
        rtcm->rtcmtypes.rtcm3_msm.msm = 6;
1552
293
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1553
293
        msg_name = "SBAS MSM 6";
1554
293
        break;
1555
1556
317
    case 1107:
1557
        /* RTCM 3.3 - 1107
1558
         * 'Multiple Signal Message
1559
         * Full SBAS pseudo-ranges, carrier phases, Doppler and
1560
         * signal strength (high resolution)
1561
         * length 96
1562
         */
1563
317
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_SBAS;
1564
317
        rtcm->rtcmtypes.rtcm3_msm.msm = 7;
1565
317
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1566
317
        msg_name = "SBAS MSM 7";
1567
317
        break;
1568
1569
151
    case 1108:
1570
        /* RTCM 3.x
1571
         * Reserved for MSM
1572
         */
1573
151
        msg_name = "Reserved for MSM";
1574
151
        break;
1575
1576
188
    case 1109:
1577
        /* RTCM 3.x
1578
         * Reserved for MSM
1579
         */
1580
188
        msg_name = "Reserved for MSM";
1581
188
        break;
1582
1583
132
    case 1110:
1584
        /* RTCM 3.x
1585
         * Reserved for MSM
1586
         */
1587
132
        msg_name = "Reserved for MSM";
1588
132
        break;
1589
1590
281
    case 1111:
1591
        /* RTCM 3.3
1592
         * QZSS Multi Signal Message 1
1593
         */
1594
281
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_QZSS;
1595
281
        rtcm->rtcmtypes.rtcm3_msm.msm = 1;
1596
281
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1597
281
        msg_name = "QZSS MSM 1";
1598
281
        break;
1599
1600
138
    case 1112:
1601
        /* RTCM 3.3
1602
         * QZSS Multi Signal Message 2
1603
         */
1604
138
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_QZSS;
1605
138
        rtcm->rtcmtypes.rtcm3_msm.msm = 2;
1606
138
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1607
138
        msg_name = "QZSS MSM 2";
1608
138
        break;
1609
1610
139
    case 1113:
1611
        /* RTCM 3.3
1612
         * QZSS Multi Signal Message 3
1613
         */
1614
139
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_QZSS;
1615
139
        rtcm->rtcmtypes.rtcm3_msm.msm = 3;
1616
139
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1617
139
        msg_name = "QZSS MSM 3";
1618
139
        break;
1619
1620
326
    case 1114:
1621
        /* RTCM 3.3
1622
         * QZSS Multi Signal Message 4
1623
         */
1624
326
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_QZSS;
1625
326
        rtcm->rtcmtypes.rtcm3_msm.msm = 4;
1626
326
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1627
326
        msg_name = "QZSS MSM 4";
1628
326
        break;
1629
1630
210
    case 1115:
1631
        /* RTCM 3.3
1632
         * QZSS Multi Signal Message 5
1633
         */
1634
210
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_QZSS;
1635
210
        rtcm->rtcmtypes.rtcm3_msm.msm = 5;
1636
210
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1637
210
        msg_name = "QZSS MSM 5";
1638
210
        break;
1639
1640
148
    case 1116:
1641
        /* RTCM 3.3
1642
         * QZSS Multi Signal Message 6
1643
         */
1644
148
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_QZSS;
1645
148
        rtcm->rtcmtypes.rtcm3_msm.msm = 6;
1646
148
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1647
148
        msg_name = "QZSS MSM 6";
1648
148
        break;
1649
1650
334
    case 1117:
1651
        /* RTCM 3.3
1652
         * QZSS Multi Signal Message 7
1653
         */
1654
334
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_QZSS;
1655
334
        rtcm->rtcmtypes.rtcm3_msm.msm = 7;
1656
334
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1657
334
        msg_name = "QZSS MSM 7";
1658
334
        break;
1659
1660
133
    case 1118:
1661
        /* RTCM 3.x
1662
         * Reserved for MSM
1663
         */
1664
133
        msg_name = "Reserved for MSM";
1665
133
        break;
1666
1667
140
    case 1119:
1668
        /* RTCM 3.x
1669
         * Reserved for MSM
1670
         */
1671
140
        msg_name = "Reserved for MSM";
1672
140
        break;
1673
1674
135
    case 1120:
1675
        /* RTCM 3.x
1676
         * Reserved for MSM
1677
         */
1678
135
        msg_name = "Reserved for MSM";
1679
135
        break;
1680
1681
171
    case 1121:
1682
        /* RTCM 3.2 A.1
1683
         * BD Multi Signal Message 1
1684
         */
1685
171
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_BD;
1686
171
        rtcm->rtcmtypes.rtcm3_msm.msm = 1;
1687
171
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1688
171
        msg_name = "BD MSM 1";
1689
171
        break;
1690
1691
316
    case 1122:
1692
        /* RTCM 3.2 A.1
1693
         * BD Multi Signal Message 2
1694
         */
1695
316
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_BD;
1696
316
        rtcm->rtcmtypes.rtcm3_msm.msm = 2;
1697
316
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1698
316
        msg_name = "BD MSM 2";
1699
316
        break;
1700
1701
277
    case 1123:
1702
        /* RTCM 3.2 A.1
1703
         * BD Multi Signal Message 3
1704
         */
1705
277
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_BD;
1706
277
        rtcm->rtcmtypes.rtcm3_msm.msm = 3;
1707
277
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1708
277
        msg_name = "BD MSM 3";
1709
277
        break;
1710
1711
281
    case 1124:
1712
        /* RTCM 3.2 A.1
1713
         * BD Multi Signal Message 4
1714
         */
1715
281
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_BD;
1716
281
        rtcm->rtcmtypes.rtcm3_msm.msm = 4;
1717
281
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1718
281
        msg_name = "BD MSM 4";
1719
281
        break;
1720
1721
350
    case 1125:
1722
        /* RTCM 3.2 A.1
1723
         * BeiDou Multi Signal Message 5
1724
         */
1725
350
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_BD;
1726
350
        rtcm->rtcmtypes.rtcm3_msm.msm = 5;
1727
350
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1728
350
        msg_name = "BD MSM 5";
1729
350
        break;
1730
1731
252
    case 1126:
1732
        /* RTCM 3.2 A.1
1733
         * BeiDou Multi Signal Message 6
1734
         */
1735
252
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_BD;
1736
252
        rtcm->rtcmtypes.rtcm3_msm.msm = 6;
1737
252
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1738
252
        msg_name = "BD MSM 6";
1739
252
        break;
1740
1741
316
    case 1127:
1742
        /* RTCM 3.2 A.1
1743
         * BeiDou Multi Signal Message 7
1744
         */
1745
316
        rtcm->rtcmtypes.rtcm3_msm.gnssid = GNSSID_BD;
1746
316
        rtcm->rtcmtypes.rtcm3_msm.msm = 7;
1747
316
        unknown = rtcm3_decode_msm(context, rtcm, buf);
1748
316
        msg_name = "BD MSM 7";
1749
316
        break;
1750
1751
198
    case 1128:
1752
        /* RTCM 3.x
1753
         * Reserved for MSM
1754
         */
1755
198
        msg_name = "Reserved for MSM";
1756
198
        break;
1757
1758
137
    case 1229:
1759
        /* RTCM 3.x
1760
         * Reserved for MSM
1761
         */
1762
137
        msg_name = "Reserved for MSM";
1763
137
        break;
1764
1765
515
    case 1230:
1766
        /* RTCM 3.2
1767
         * GLONASS L1 and L2, C/A and P, Code-Phase Biases.
1768
         */
1769
515
        msg_name = "GLO L1 and L2 Code-Phase Biases";
1770
515
        unknown = false;
1771
515
        rtcm->rtcmtypes.rtcm3_1230.station_id = (unsigned short)ugrab(12);
1772
515
        rtcm->rtcmtypes.rtcm3_1230.bias_indicator = (unsigned char)ugrab(1);
1773
515
        (void)ugrab(1);         // reserved
1774
515
        rtcm->rtcmtypes.rtcm3_1230.signals_mask = (unsigned char)ugrab(3);
1775
        // actual mask order is undocumented...
1776
515
        if (1 & rtcm->rtcmtypes.rtcm3_1230.signals_mask) {
1777
151
            rtcm->rtcmtypes.rtcm3_1230.l1_ca_bias = ugrab(16);
1778
151
        }
1779
515
        if (2 & rtcm->rtcmtypes.rtcm3_1230.signals_mask) {
1780
116
            rtcm->rtcmtypes.rtcm3_1230.l1_p_bias = ugrab(16);
1781
116
        }
1782
515
        if (4 & rtcm->rtcmtypes.rtcm3_1230.signals_mask) {
1783
153
            rtcm->rtcmtypes.rtcm3_1230.l2_ca_bias = ugrab(16);
1784
153
        }
1785
515
        if (8 & rtcm->rtcmtypes.rtcm3_1230.signals_mask) {
1786
0
            rtcm->rtcmtypes.rtcm3_1230.l2_p_bias = ugrab(16);
1787
0
        }
1788
515
        break;
1789
1790
    // Message Types 4001 — 4060 Are Reserved
1791
1792
136
    case 4062:
1793
        /* RTCM 3.3
1794
         * Geely Proprietary
1795
         */
1796
136
        msg_name = "Geely Proprietary";
1797
136
        break;
1798
1799
133
    case 4063:
1800
        /* RTCM 3.3
1801
         * CHC Navigation (CHCNAV) Proprietary
1802
         */
1803
133
        msg_name = "CHC Navigation (CHCNAV) Proprietary";
1804
133
        break;
1805
1806
138
    case 4064:
1807
        /* RTCM 3.3
1808
         * NTLab Proprietary
1809
         */
1810
138
        msg_name = "NTLab Proprietary";
1811
138
        break;
1812
1813
138
    case 4065:
1814
        /* RTCM 3.3
1815
         * Allystar Technology (Shenzhen) Co. Ltd. Proprietary
1816
         *
1817
         * sub-id:
1818
         *    0    Reference stations PVT, requires MSM7.
1819
         *    1    Navigation PVT Solyution
1820
         *    2    Attitude Determination (multi antenna)
1821
         *    0x0a Raw Sensor measurements.
1822
         */
1823
138
        msg_name = "Allystar Technology (Shenzhen) Co. Ltd. Proprietary";
1824
138
        break;
1825
1826
137
    case 4066:
1827
        /* RTCM 3.3
1828
         * Lantmateriet Proprietary
1829
         */
1830
137
        msg_name = "Lantmateriet Proprietary";
1831
137
        break;
1832
1833
132
    case 4067:
1834
        /* RTCM 3.x
1835
         * China Transport telecommunications & Information Center Proprietary
1836
         */
1837
132
        msg_name = "China Transport telecommunications & Information "
1838
132
                       "Center Proprietary";
1839
132
        break;
1840
1841
143
    case 4068:
1842
        /* RTCM 3.3
1843
         * Qianxun Location Networks Co. Ltd Proprietary
1844
         */
1845
143
        msg_name = "Qianxun Location Networks Co. Ltd Proprietary";
1846
143
        break;
1847
1848
132
    case 4069:
1849
        /* RTCM 3.3
1850
         * VERIPOS Ltd Proprietary
1851
         */
1852
132
        msg_name = "VERIPOS Ltd Proprietary";
1853
132
        break;
1854
1855
132
    case 4070:
1856
        /* RTCM 3.3
1857
         * Wuhan MengXin Technology
1858
         */
1859
132
        msg_name = "Wuhan MengXin Technology Proprietary";
1860
132
        break;
1861
1862
133
    case 4071:
1863
        /* RTCM 3.3
1864
         * Wuhan Navigation and LBS
1865
         */
1866
133
        msg_name = "Wuhan Navigation and LBS Proprietary";
1867
133
        break;
1868
1869
133
    case 4072:
1870
        /* RTCM 3.x
1871
         * u-blox Proprietary
1872
         * Mitsubishi Electric Corp Proprietary
1873
         * 4072.0 Reference station PVT (u-blox proprietary)
1874
         * 4072.1 Additional reference station information (u-blox proprietary)
1875
         */
1876
133
        msg_name = "u-blox Proprietary";
1877
133
        break;
1878
1879
135
    case 4073:
1880
        /* RTCM 3.x
1881
         * Unicore Communications Proprietary
1882
         */
1883
135
        msg_name = "Alberding GmbH Proprietary";
1884
135
        break;
1885
1886
138
    case 4075:
1887
        /* RTCM 3.x
1888
         * Alberding GmbH Proprietary
1889
         */
1890
138
        msg_name = "Alberding GmbH Proprietary";
1891
138
        break;
1892
1893
138
    case 4076:
1894
        /* RTCM 3.x
1895
         * International GNSS Service Proprietary, www.igs.org
1896
         */
1897
138
        msg_name = "International GNSS Service Proprietary";
1898
138
        unknown = rtcm3_4076(context, rtcm, buf);
1899
138
        break;
1900
1901
138
    case 4077:
1902
        /* RTCM 3.x
1903
         * Hemisphere GNSS Proprietary
1904
         */
1905
138
        msg_name = "Hemisphere GNSS Proprietary";
1906
138
        break;
1907
1908
144
    case 4078:
1909
        /* RTCM 3.x
1910
         * ComNav Technology Proprietary
1911
         */
1912
144
        msg_name = "ComNav Technology Proprietary";
1913
144
        break;
1914
1915
139
    case 4079:
1916
        /* RTCM 3.x
1917
         * SubCarrier Systems Corp Proprietary
1918
         */
1919
139
        msg_name = "SubCarrier Systems Corp Proprietary";
1920
139
        break;
1921
1922
115
    case 4080:
1923
        /* RTCM 3.x
1924
         * NavCom Technology, Inc.
1925
         */
1926
115
        msg_name = "NavCom Technology, Inc.";
1927
115
        break;
1928
1929
113
    case 4081:
1930
        /* RTCM 3.x
1931
         * Seoul National Universtiry GNSS Lab Proprietary
1932
         */
1933
113
        msg_name = "Seoul National Universtiry GNSS Lab Proprietery";
1934
113
        break;
1935
1936
179
    case 4082:
1937
        /* RTCM 3.x
1938
         * Cooperative Research Centre for Spatial Information Proprietary
1939
         */
1940
179
        msg_name = "Cooperative Research Centre for Spatial Information "
1941
179
                       "Proprietary";
1942
179
        break;
1943
1944
158
    case 4083:
1945
        /* RTCM 3.x
1946
         * German Aerospace Center Proprietary
1947
         */
1948
158
        msg_name = "German Aerospace Center Proprietary";
1949
158
        break;
1950
1951
136
    case 4084:
1952
        /* RTCM 3.x
1953
         * Geodetics Inc Proprietary
1954
         */
1955
136
        msg_name = "Geodetics Inc Proprietary";
1956
136
        break;
1957
1958
150
    case 4085:
1959
        /* RTCM 3.x
1960
         * European GNSS Supervisory Authority Proprietary
1961
         */
1962
150
        msg_name = "European GNSS Supervisory Authority Proprietary";
1963
150
        break;
1964
1965
136
    case 4086:
1966
        /* RTCM 3.x
1967
         * InPosition GmbH Proprietary
1968
         */
1969
136
        msg_name = "InPosition GmbH Proprietary";
1970
136
        break;
1971
1972
133
    case 4087:
1973
        /* RTCM 3.x
1974
         * Fugro Proprietary
1975
         */
1976
133
        msg_name = "Fugro Proprietary";
1977
133
        break;
1978
1979
158
    case 4088:
1980
        /* RTCM 3.x
1981
         * IfEN GmbH Proprietary
1982
         */
1983
158
        msg_name = "IfEN GmbH Proprietary";
1984
158
        break;
1985
1986
136
    case 4089:
1987
        /* RTCM 3.x
1988
         * Septentrio Satellite Navigation Proprietary
1989
         */
1990
136
        msg_name = "Septentrio Satellite Navigation Proprietary";
1991
136
        break;
1992
1993
161
    case 4090:
1994
        /* RTCM 3.x
1995
         * Geo++ Proprietary
1996
         */
1997
161
        msg_name = "Geo++ Proprietary";
1998
161
        break;
1999
2000
133
    case 4091:
2001
        /* RTCM 3.x
2002
         * Topcon Positioning Systems Proprietary
2003
         */
2004
133
        msg_name = "Topcon Positioning Systems Proprietary";
2005
133
        break;
2006
2007
137
    case 4092:
2008
        /* RTCM 3.x
2009
         * Leica Geosystems Proprietary
2010
         */
2011
137
        msg_name = "Leica Geosystems Proprietary";
2012
137
        break;
2013
2014
141
    case 4093:
2015
        /* RTCM 3.x
2016
         * NovAtel Proprietary
2017
         */
2018
141
        msg_name = "NovAtel Pr.orietary";
2019
141
        break;
2020
2021
141
    case 4094:
2022
        /* RTCM 3.x
2023
         * Trimble Proprietary
2024
         */
2025
141
        msg_name = "Trimble Proprietary";
2026
141
        break;
2027
2028
132
    case 4095:
2029
        /* RTCM 3.x
2030
         * Ashtech/Magellan Proprietary
2031
         */
2032
132
        msg_name = "Ashtech/Magellan Proprietary";
2033
132
        break;
2034
2035
1.52k
    default:
2036
1.52k
        break;
2037
31.7k
    }
2038
31.7k
#undef RANGEDIFF
2039
31.7k
#undef GPS_PSEUDORANGE
2040
31.7k
#undef sgrab
2041
31.7k
#undef ugrab
2042
31.7k
    if (unknown) {
2043
        /*
2044
         * Leader bytes, message length, and checksum won't be copied.
2045
         * The first 12 bits of the copied payload will be the type field.
2046
         */
2047
17.9k
        memcpy(rtcm->rtcmtypes.data, buf + 3, rtcm->length);
2048
17.9k
        GPSD_LOG(LOG_PROG, &context->errout,
2049
17.9k
                 "RTCM3: %d (%s) Undecoded, length %d\n",
2050
17.9k
                 rtcm->type, msg_name, rtcm->length);
2051
17.9k
    } else {
2052
13.7k
        GPSD_LOG(LOG_PROG, &context->errout,
2053
13.7k
                 "RTCM3: %d (%s) length %d\n",
2054
13.7k
                 rtcm->type, msg_name, rtcm->length);
2055
13.7k
    }
2056
31.7k
}
2057
2058
// *INDENT-ON*
2059
2060
// vim: set expandtab shiftwidth=4