Coverage Report

Created: 2026-09-28 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-ubx.c
Line
Count
Source
1
/* packet-ubx.c
2
 * u-blox UBX protocol dissection.
3
 *
4
 * By Timo Warns <timo.warns@gmail.com>
5
 * Copyright 2023 Timo Warns
6
 *
7
 * Wireshark - Network traffic analyzer
8
 * By Gerald Combs <gerald@unicom.net>
9
 * Copyright 1998 Gerald Combs
10
 *
11
 * SPDX-License-Identifier: GPL-2.0-or-later
12
 */
13
14
#include "config.h"
15
16
#include <epan/expert.h>
17
#include <epan/packet.h>
18
#include <epan/unit_strings.h>
19
#include <wsutil/array.h>
20
#include <wsutil/utf8_entities.h>
21
#include <wsutil/pint.h>
22
23
#include "packet-ubx.h"
24
#include "packet-sbas_l1.h"
25
26
/*
27
 * Dissects the UBX protocol of u-blox GNSS receivers as defined by the
28
 * u-blox 8 / u-blox M8 receiver description.
29
 */
30
31
/* mapping from UBX message class / id to mnemonics */
32
static const value_string UBX_MSG_CLASS_ID[] = {
33
    {UBX_ACK_ACK, "UBX-ACK-ACK"},
34
    {UBX_ACK_NAK, "UBX-ACK-NAK"},
35
    {UBX_AID_ALM, "UBX-AID-ALM"},
36
    {UBX_AID_AOP, "UBX-AID-AOP"},
37
    {UBX_AID_EPH, "UBX-AID-EPH"},
38
    {UBX_AID_HUI, "UBX-AID-HUI"},
39
    {UBX_AID_INI, "UBX-AID-INI"},
40
    {UBX_CFG_ANT, "UBX-CFG-ANT"},
41
    {UBX_CFG_BATCH, "UBX-CFG-BATCH"},
42
    {UBX_CFG_CFG, "UBX-CFG-CFG"},
43
    {UBX_CFG_DAT, "UBX-CFG-DAT"},
44
    {UBX_CFG_DGNSS, "UBX-CFG-DGNSS"},
45
    {UBX_CFG_DOSC, "UBX-CFG-DOSC"},
46
    {UBX_CFG_ESFALG, "UBX-CFG-ESFALG"},
47
    {UBX_CFG_ESFA, "UBX-CFG-ESFA"},
48
    {UBX_CFG_ESFG, "UBX-CFG-ESFG"},
49
    {UBX_CFG_ESFWT, "UBX-CFG-ESFWT"},
50
    {UBX_CFG_ESRC, "UBX-CFG-ESRC"},
51
    {UBX_CFG_GEOFENCE, "UBX-CFG-GEOFENCE"},
52
    {UBX_CFG_GNSS, "UBX-CFG-GNSS"},
53
    {UBX_CFG_HNR, "UBX-CFG-HNR"},
54
    {UBX_CFG_INF, "UBX-CFG-INF"},
55
    {UBX_CFG_ITFM, "UBX-CFG-ITFM"},
56
    {UBX_CFG_LOGFILTER, "UBX-CFG-LOGFILTER"},
57
    {UBX_CFG_MSG, "UBX-CFG-MSG"},
58
    {UBX_CFG_NAV5, "UBX-CFG-NAV5"},
59
    {UBX_CFG_NAVX5, "UBX-CFG-NAVX5"},
60
    {UBX_CFG_NMEA, "UBX-CFG-NMEA"},
61
    {UBX_CFG_ODO, "UBX-CFG-ODO"},
62
    {UBX_CFG_PM2, "UBX-CFG-PM2"},
63
    {UBX_CFG_PMS, "UBX-CFG-PMS"},
64
    {UBX_CFG_PRT, "UBX-CFG-PRT"},
65
    {UBX_CFG_PWR, "UBX-CFG-PWR"},
66
    {UBX_CFG_RATE, "UBX-CFG-RATE"},
67
    {UBX_CFG_RINV, "UBX-CFG-RINV"},
68
    {UBX_CFG_RST, "UBX-CFG-RST"},
69
    {UBX_CFG_RXM, "UBX-CFG-RXM"},
70
    {UBX_CFG_SBAS, "UBX-CFG-SBAS"},
71
    {UBX_CFG_SENIF, "UBX-CFG-SENIF"},
72
    {UBX_CFG_SLAS, "UBX-CFG-SLAS"},
73
    {UBX_CFG_SMGR, "UBX-CFG-SMGR"},
74
    {UBX_CFG_SPT, "UBX-CFG-SPT"},
75
    {UBX_CFG_TMODE2, "UBX-CFG-TMODE2"},
76
    {UBX_CFG_TMODE3, "UBX-CFG-TMODE3"},
77
    {UBX_CFG_TP5, "UBX-CFG-TP5"},
78
    {UBX_CFG_TXSLOT, "UBX-CFG-TXSLOT"},
79
    {UBX_CFG_USB, "UBX-CFG-USB"},
80
    {UBX_ESF_ALG, "UBX-ESF-ALG"},
81
    {UBX_ESF_INS, "UBX-ESF-INS"},
82
    {UBX_ESF_MEAS, "UBX-ESF-MEAS"},
83
    {UBX_ESF_RAW, "UBX-ESF-RAW"},
84
    {UBX_ESF_STATUS, "UBX-ESF-STATUS"},
85
    {UBX_HNR_ATT, "UBX-HNR-ATT"},
86
    {UBX_HNR_INS, "UBX-HNR-INS"},
87
    {UBX_HNR_PVT, "UBX-HNR-PVT"},
88
    {UBX_INF_DEBUG, "UBX-INF-DEBUG"},
89
    {UBX_INF_ERROR, "UBX-INF-ERROR"},
90
    {UBX_INF_NOTICE, "UBX-INF-NOTICE"},
91
    {UBX_INF_TEST, "UBX-INF-TEST"},
92
    {UBX_INF_WARNING, "UBX-INF-WARNING"},
93
    {UBX_LOG_BATCH, "UBX-LOG-BATCH"},
94
    {UBX_LOG_CREATE, "UBX-LOG-CREATE"},
95
    {UBX_LOG_ERASE, "UBX-LOG-ERASE"},
96
    {UBX_LOG_FINDTIME, "UBX-LOG-FINDTIME"},
97
    {UBX_LOG_INFO, "UBX-LOG-INFO"},
98
    {UBX_LOG_RETRIEVEBATCH, "UBX-LOG-RETRIEVEBATCH"},
99
    {UBX_LOG_RETRIEVEPOSEXTRA, "UBX-LOG-RETRIEVEPOSEXTRA"},
100
    {UBX_LOG_RETRIEVEPOS, "UBX-LOG-RETRIEVEPOS"},
101
    {UBX_LOG_RETRIEVESTRING, "UBX-LOG-RETRIEVESTRING"},
102
    {UBX_LOG_RETRIEVE, "UBX-LOG-RETRIEVE"},
103
    {UBX_LOG_STRING, "UBX-LOG-STRING"},
104
    {UBX_MGA_ACK_DATA0, "UBX-MGA-ACK-DATA0"},
105
    {UBX_MGA_ANO, "UBX-MGA-ANO"},
106
    {UBX_MGA_BDS, "UBX-MGA-BDS"},
107
    {UBX_MGA_DBD, "UBX-MGA-DBD"},
108
    {UBX_MGA_FLASH, "UBX-MGA-FLASH"},
109
    {UBX_MGA_GAL, "UBX-MGA-GAL"},
110
    {UBX_MGA_GLO, "UBX-MGA-GLO"},
111
    {UBX_MGA_GPS, "UBX-MGA-GPS"},
112
    {UBX_MGA_INI, "UBX-MGA-INI"},
113
    {UBX_MGA_QZSS, "UBX-MGA-QZSS"},
114
    {UBX_MON_BATCH, "UBX-MON-BATCH"},
115
    {UBX_MON_GNSS, "UBX-MON-GNSS"},
116
    {UBX_MON_HW2, "UBX-MON-HW2"},
117
    {UBX_MON_HW, "UBX-MON-HW"},
118
    {UBX_MON_IO, "UBX-MON-IO"},
119
    {UBX_MON_MSGPP, "UBX-MON-MSGPP"},
120
    {UBX_MON_PATCH, "UBX-MON-PATCH"},
121
    {UBX_MON_RF, "UBX-MON-RF"},
122
    {UBX_MON_RXBUF, "UBX-MON-RXBUF"},
123
    {UBX_MON_RXR, "UBX-MON-RXR"},
124
    {UBX_MON_SMGR, "UBX-MON-SMGR"},
125
    {UBX_MON_SPT, "UBX-MON-SPT"},
126
    {UBX_MON_TXBUF, "UBX-MON-TXBUF"},
127
    {UBX_MON_VER, "UBX-MON-VER"},
128
    {UBX_NAV_AOPSTATUS, "UBX-NAV-AOPSTATUS"},
129
    {UBX_NAV_ATT, "UBX-NAV-ATT"},
130
    {UBX_NAV_CLOCK, "UBX-NAV-CLOCK"},
131
    {UBX_NAV_COV, "UBX-NAV-COV"},
132
    {UBX_NAV_DGPS, "UBX-NAV-DGPS"},
133
    {UBX_NAV_DOP, "UBX-NAV-DOP"},
134
    {UBX_NAV_EELL, "UBX-NAV-EELL"},
135
    {UBX_NAV_EOE, "UBX-NAV-EOE"},
136
    {UBX_NAV_GEOFENCE, "UBX-NAV-GEOFENCE"},
137
    {UBX_NAV_HPPOSECEF, "UBX-NAV-HPPOSECEF"},
138
    {UBX_NAV_HPPOSLLH, "UBX-NAV-HPPOSLLH"},
139
    {UBX_NAV_NMI, "UBX-NAV-NMI"},
140
    {UBX_NAV_ODO, "UBX-NAV-ODO"},
141
    {UBX_NAV_ORB, "UBX-NAV-ORB"},
142
    {UBX_NAV_POSECEF, "UBX-NAV-POSECEF"},
143
    {UBX_NAV_POSLLH, "UBX-NAV-POSLLH"},
144
    {UBX_NAV_PVT, "UBX-NAV-PVT"},
145
    {UBX_NAV_RELPOSNED, "UBX-NAV-RELPOSNED"},
146
    {UBX_NAV_RESETODO, "UBX-NAV-RESETODO"},
147
    {UBX_NAV_SAT, "UBX-NAV-SAT"},
148
    {UBX_NAV_SBAS, "UBX-NAV-SBAS"},
149
    {UBX_NAV_SLAS, "UBX-NAV-SLAS"},
150
    {UBX_NAV_SOL, "UBX-NAV-SOL"},
151
    {UBX_NAV_STATUS, "UBX-NAV-STATUS"},
152
    {UBX_NAV_SVINFO, "UBX-NAV-SVINFO"},
153
    {UBX_NAV_SVIN, "UBX-NAV-SVIN"},
154
    {UBX_NAV_TIMEBDS, "UBX-NAV-TIMEBDS"},
155
    {UBX_NAV_TIMEGAL, "UBX-NAV-TIMEGAL"},
156
    {UBX_NAV_TIMEGLO, "UBX-NAV-TIMEGLO"},
157
    {UBX_NAV_TIMEGPS, "UBX-NAV-TIMEGPS"},
158
    {UBX_NAV_TIMELS, "UBX-NAV-TIMELS"},
159
    {UBX_NAV_TIMEUTC, "UBX-NAV-TIMEUTC"},
160
    {UBX_NAV_VELECEF, "UBX-NAV-VELECEF"},
161
    {UBX_NAV_VELNED, "UBX-NAV-VELNED"},
162
    {UBX_RXM_IMES, "UBX-RXM-IMES"},
163
    {UBX_RXM_MEASX, "UBX-RXM-MEASX"},
164
    {UBX_RXM_PMREQ, "UBX-RXM-PMREQ"},
165
    {UBX_RXM_RAWX, "UBX-RXM-RAWX"},
166
    {UBX_RXM_RLM, "UBX-RXM-RLM"},
167
    {UBX_RXM_RTCM, "UBX-RXM-RTCM"},
168
    {UBX_RXM_SFRBX, "UBX-RXM-SFRBX"},
169
    {UBX_RXM_SVSI, "UBX-RXM-SVSI"},
170
    {UBX_SEC_UNIQID, "UBX-SEC-UNIQID"},
171
    {UBX_TIM_DOSC, "UBX-TIM-DOSC"},
172
    {UBX_TIM_FCHG, "UBX-TIM-FCHG"},
173
    {UBX_TIM_HOC, "UBX-TIM-HOC"},
174
    {UBX_TIM_SMEAS, "UBX-TIM-SMEAS"},
175
    {UBX_TIM_SVIN, "UBX-TIM-SVIN"},
176
    {UBX_TIM_TM2, "UBX-TIM-TM2"},
177
    {UBX_TIM_TOS, "UBX-TIM-TOS"},
178
    {UBX_TIM_TP, "UBX-TIM-TP"},
179
    {UBX_TIM_VCOCAL, "UBX-TIM-VCOCAL"},
180
    {UBX_TIM_VRFY, "UBX-TIM-VRFY"},
181
    {UBX_UPD_SOS, "UBX-UPD-SOS"},
182
    {0, NULL},
183
};
184
185
static const value_string UBX_GNSS_ID[] = {
186
    {GNSS_ID_GPS,     "GPS"},
187
    {GNSS_ID_SBAS,    "SBAS"},
188
    {GNSS_ID_GALILEO, "Galileo"},
189
    {GNSS_ID_BEIDOU,  "Beidou"},
190
    {GNSS_ID_IMES,    "IMES"},
191
    {GNSS_ID_QZSS,    "QZSS"},
192
    {GNSS_ID_GLONASS, "Glonass"},
193
    {0, NULL},
194
};
195
196
/* mapping from correction age id to description */
197
static const value_string UBX_LAST_CORRECTION_AGE[] = {
198
    {0, "not available"},
199
    {1, "age between 0 and 1 second"},
200
    {2, "age between 1 (inclusive) and 2 seconds"},
201
    {3, "age between 2 (inclusive) and 5 seconds"},
202
    {4, "age between 5 (inclusive) and 10 seconds"},
203
    {5, "age between 10 (inclusive) and 15 seconds"},
204
    {6, "age between 15 (inclusive) and 20 seconds"},
205
    {7, "age between 20 (inclusive) and 30 seconds"},
206
    {8, "age between 30 (inclusive) and 45 seconds"},
207
    {9, "age between 45 (inclusive) and 60 seconds"},
208
    {10, "age between 60 (inclusive) and 90 seconds"},
209
    {11, "age between 90 (inclusive) and 120 seconds"},
210
    {12, "age greater or equal than 120 seconds"},
211
    {13, "age greater or equal than 120 seconds"},
212
    {14, "age greater or equal than 120 seconds"},
213
    {15, "age greater or equal than 120 seconds"},
214
    {0, NULL}
215
};
216
217
/* mapping from GNSS fix type id to description */
218
static const value_string UBX_GNSS_FIX_TYPE[] = {
219
    {0, "no fix"},
220
    {1, "dead reckoning only"},
221
    {2, "2D-fix"},
222
    {3, "3D-fix"},
223
    {4, "GNSS + dead reckoning combined"},
224
    {5, "time only fix"},
225
    {0, NULL}
226
};
227
228
/* signal quality indicator description */
229
static const value_string UBX_SIGNAL_QUALITY_INDICATOR[] = {
230
    {0, "no signal"},
231
    {1, "searching signal"},
232
    {2, "signal acquired"},
233
    {3, "signal detected but unusable"},
234
    {4, "code locked and time synchronized"},
235
    {5, "code and carrier locked and time synchronized"},
236
    {6, "code and carrier locked and time synchronized"},
237
    {7, "code and carrier locked and time synchronized"},
238
    {0, NULL}
239
};
240
241
/* signal health description */
242
static const value_string UBX_SIGNAL_HEALTH[] = {
243
    {0, "unknown"},
244
    {1, "healthy"},
245
    {2, "unhealthy"},
246
    {0, NULL}
247
};
248
249
/* orbit source description */
250
static const value_string UBX_ORBIT_SOURCE[] = {
251
    {0, "no orbit information available"},
252
    {1, "ephemeris is used"},
253
    {2, "almanac is used"},
254
    {3, "AssistNow Offline orbit is used"},
255
    {4, "AssistNow Autonomous orbit is used"},
256
    {5, "other orbit information is used"},
257
    {6, "other orbit information is used"},
258
    {7, "other orbit information is used"},
259
    {0, NULL}
260
};
261
262
/* CFG-GNSS GPS sigCfgMsk */
263
static const value_string UBX_CFG_GNSS_GPS_SIGCFGMASK[] = {
264
    {0x01, "GPS L1C/A"},
265
    {0x10, "GPS L2C"},
266
    {0, NULL}
267
};
268
269
/* CFG-GNSS SBAS sigCfgMsk */
270
static const value_string UBX_CFG_GNSS_SBAS_SIGCFGMASK[] = {
271
    {0x01, "SBAS L1C/A"},
272
    {0, NULL}
273
};
274
275
/* CFG-GNSS Galileo sigCfgMsk */
276
static const value_string UBX_CFG_GNSS_GAL_SIGCFGMASK[] = {
277
    {0x01, "Galileo E1"},
278
    {0x20, "Galileo E5b"},
279
    {0, NULL}
280
};
281
282
/* CFG-GNSS BeiDou sigCfgMsk */
283
static const value_string UBX_CFG_GNSS_BDS_SIGCFGMASK[] = {
284
    {0x01, "BeiDou B1I"},
285
    {0x10, "BeiDou B2I"},
286
    {0, NULL}
287
};
288
289
/* CFG-GNSS IMES sigCfgMsk */
290
static const value_string UBX_CFG_GNSS_IMES_SIGCFGMASK[] = {
291
    {0x01, "IMES L1"},
292
    {0, NULL}
293
};
294
295
/* CFG-GNSS QZSS sigCfgMsk */
296
static const value_string UBX_CFG_GNSS_QZSS_SIGCFGMASK[] = {
297
    {0x01, "QZSS L1C/A"},
298
    {0x04, "QZSS L1S"},
299
    {0x10, "QZSS L2C"},
300
    {0, NULL}
301
};
302
303
/* CFG-GNSS Glonass sigCfgMsk */
304
static const value_string UBX_CFG_GNSS_GLO_SIGCFGMASK[] = {
305
    {0x01, "Glonass L1"},
306
    {0x10, "Glonass L2"},
307
    {0, NULL}
308
};
309
310
/* UBX-RXM-MEASX Multipath index */
311
static const value_string UBX_RXM_MEASX_MULTIPATH_INDEX[] = {
312
    {0x0, "not measured"},
313
    {0x1, "low"},
314
    {0x2, "medium"},
315
    {0x3, "high"},
316
    {0, NULL}
317
};
318
319
/* SBAS mode */
320
static const value_string UBX_SBAS_MODE[] = {
321
    {0, "Disabled"},
322
    {1, "Enabled integrity"},
323
    {3, "Enabled test mode"},
324
    {0, NULL}
325
};
326
327
/* SBAS system */
328
static const value_string UBX_SBAS_SYSTEM[] = {
329
    {-1, "Unknown"},
330
    {0, "WAAS"},
331
    {1, "EGNOS"},
332
    {2, "MSAS"},
333
    {3, "GAGAN"},
334
    {16, "GPS"},
335
    {0, NULL}
336
};
337
338
/* SBAS testbed description */
339
static const value_string UBX_SBAS_TESTBED[] = {
340
    {0, "Ignore data when in test mode (SBAS msg 0)"},
341
    {1, "Use data anyhow"},
342
    {0, NULL}
343
};
344
345
/* UTC standard identifier */
346
static const value_string UBX_UTC_STD_ID[] = {
347
    {0, "Information not available"},
348
    {1, "Communications Research Laboratory (CRL), Tokyo, Japan"},
349
    {2, "National Institute of Standards and Technology (NIST)"},
350
    {3, "U.S. Naval Observatory (USNO)"},
351
    {4, "International Bureau of Weights and Measures (BIPM)"},
352
    {5, "European laboratories"},
353
    {6, "Former Soviet Union (SU)"},
354
    {7, "National Time Service Center (NTSC), China"},
355
    {15, "Unknown"},
356
    {0, NULL}
357
};
358
359
/* Carrier Phase Solution Status */
360
static const value_string UBX_CARRSOLN[] = {
361
    {0, "No Carrier Phase Range Solution"},
362
    {1, "Carrier Phase Range Solution with Floating Ambiguities"},
363
    {2, "Carrier Phase Range Solution with Fixed Ambiguities"},
364
    {0, NULL}
365
};
366
367
/* RF Block ID */
368
static const value_string UBX_RF_BLOCK_ID[] = {
369
    {0, "L1 band"},
370
    {1, "L2 or L5 band"},
371
    {0, NULL}
372
};
373
374
/* Jamming State */
375
static const value_string UBX_JAMMING_STATE[] = {
376
    {0, "Unknown or Feature Disabled"},
377
    {1, "Ok - no significant jamming"},
378
    {2, "Warning - interference visible but fix OK"},
379
    {3, "Critical - interference visible and no fix"},
380
    {0, NULL}
381
};
382
383
/* Antenna Status */
384
static const value_string UBX_ANTENNA_STATUS[] = {
385
    {0, "Init"},
386
    {1, "Don't Know"},
387
    {2, "Ok"},
388
    {3, "Short"},
389
    {4, "Open"},
390
    {0, NULL}
391
};
392
393
/* Antenna Power */
394
static const value_string UBX_ANTENNA_POWER[] = {
395
    {0, "Off"},
396
    {1, "On"},
397
    {2, "Don't Know"},
398
    {0, NULL}
399
};
400
401
/* Initialize the protocol and registered fields */
402
static int proto_ubx;
403
404
static int hf_ubx_preamble;
405
static int hf_ubx_msg_class_id;
406
static int hf_ubx_payload_len;
407
static int hf_ubx_chksum;
408
409
static int hf_ubx_ack_ack;
410
static int hf_ubx_ack_ack_msg_class_id;
411
412
static int hf_ubx_ack_nak;
413
static int hf_ubx_ack_nak_msg_class_id;
414
415
static int hf_ubx_cfg_gnss;
416
static int hf_ubx_cfg_gnss_version;
417
static int hf_ubx_cfg_gnss_numtrkchhw;
418
static int hf_ubx_cfg_gnss_numtrkchuse;
419
static int hf_ubx_cfg_gnss_numconfigblocks;
420
static int hf_ubx_cfg_gnss_blk_gnssid;
421
static int hf_ubx_cfg_gnss_blk_restrkch;
422
static int hf_ubx_cfg_gnss_blk_maxtrkch;
423
static int hf_ubx_cfg_gnss_blk_reserved1;
424
static int hf_ubx_cfg_gnss_blk_enable;
425
static int hf_ubx_cfg_gnss_blk_sigcfgmask;
426
static int hf_ubx_cfg_gnss_blk_gps_sigcfgmask;
427
static int hf_ubx_cfg_gnss_blk_sbas_sigcfgmask;
428
static int hf_ubx_cfg_gnss_blk_gal_sigcfgmask;
429
static int hf_ubx_cfg_gnss_blk_bds_sigcfgmask;
430
static int hf_ubx_cfg_gnss_blk_imes_sigcfgmask;
431
static int hf_ubx_cfg_gnss_blk_qzss_sigcfgmask;
432
static int hf_ubx_cfg_gnss_blk_glo_sigcfgmask;
433
434
static int hf_ubx_cfg_sbas;
435
static int hf_ubx_cfg_sbas_mode;
436
static int hf_ubx_cfg_sbas_mode_enabled;
437
static int hf_ubx_cfg_sbas_mode_test;
438
static int hf_ubx_cfg_sbas_usage_range;
439
static int hf_ubx_cfg_sbas_usage_diffcorr;
440
static int hf_ubx_cfg_sbas_usage_integrity;
441
static int hf_ubx_cfg_sbas_max_sbas;
442
static int hf_ubx_cfg_sbas_scanmode_prn158;
443
static int hf_ubx_cfg_sbas_scanmode_prn157;
444
static int hf_ubx_cfg_sbas_scanmode_prn156;
445
static int hf_ubx_cfg_sbas_scanmode_prn155;
446
static int hf_ubx_cfg_sbas_scanmode_prn154;
447
static int hf_ubx_cfg_sbas_scanmode_prn153;
448
static int hf_ubx_cfg_sbas_scanmode_prn152;
449
static int hf_ubx_cfg_sbas_scanmode_prn151;
450
static int hf_ubx_cfg_sbas_scanmode_prn150;
451
static int hf_ubx_cfg_sbas_scanmode_prn149;
452
static int hf_ubx_cfg_sbas_scanmode_prn148;
453
static int hf_ubx_cfg_sbas_scanmode_prn147;
454
static int hf_ubx_cfg_sbas_scanmode_prn146;
455
static int hf_ubx_cfg_sbas_scanmode_prn145;
456
static int hf_ubx_cfg_sbas_scanmode_prn144;
457
static int hf_ubx_cfg_sbas_scanmode_prn143;
458
static int hf_ubx_cfg_sbas_scanmode_prn142;
459
static int hf_ubx_cfg_sbas_scanmode_prn141;
460
static int hf_ubx_cfg_sbas_scanmode_prn140;
461
static int hf_ubx_cfg_sbas_scanmode_prn139;
462
static int hf_ubx_cfg_sbas_scanmode_prn138;
463
static int hf_ubx_cfg_sbas_scanmode_prn137;
464
static int hf_ubx_cfg_sbas_scanmode_prn136;
465
static int hf_ubx_cfg_sbas_scanmode_prn135;
466
static int hf_ubx_cfg_sbas_scanmode_prn134;
467
static int hf_ubx_cfg_sbas_scanmode_prn133;
468
static int hf_ubx_cfg_sbas_scanmode_prn132;
469
static int hf_ubx_cfg_sbas_scanmode_prn131;
470
static int hf_ubx_cfg_sbas_scanmode_prn130;
471
static int hf_ubx_cfg_sbas_scanmode_prn129;
472
static int hf_ubx_cfg_sbas_scanmode_prn128;
473
static int hf_ubx_cfg_sbas_scanmode_prn127;
474
static int hf_ubx_cfg_sbas_scanmode_prn126;
475
static int hf_ubx_cfg_sbas_scanmode_prn125;
476
static int hf_ubx_cfg_sbas_scanmode_prn124;
477
static int hf_ubx_cfg_sbas_scanmode_prn123;
478
static int hf_ubx_cfg_sbas_scanmode_prn122;
479
static int hf_ubx_cfg_sbas_scanmode_prn121;
480
static int hf_ubx_cfg_sbas_scanmode_prn120;
481
482
static int * const ubx_cfg_sbas_mode_fields[] = {
483
    &hf_ubx_cfg_sbas_mode_enabled,
484
    &hf_ubx_cfg_sbas_mode_test,
485
    NULL
486
};
487
488
static int hf_ubx_mon_rf;
489
static int hf_ubx_mon_rf_version;
490
static int hf_ubx_mon_rf_nblocks;
491
static int hf_ubx_mon_rf_reserved0;
492
static int hf_ubx_mon_rf_blockid;
493
static int hf_ubx_mon_rf_flags;
494
static int hf_ubx_mon_rf_jammingstate;
495
static int hf_ubx_mon_rf_antstatus;
496
static int hf_ubx_mon_rf_antpower;
497
static int hf_ubx_mon_rf_poststatus;
498
static int hf_ubx_mon_rf_reserved1;
499
static int hf_ubx_mon_rf_noiseperms;
500
static int hf_ubx_mon_rf_agccnt;
501
static int hf_ubx_mon_rf_cwsuppression;
502
static int hf_ubx_mon_rf_ofsi;
503
static int hf_ubx_mon_rf_magi;
504
static int hf_ubx_mon_rf_ofsq;
505
static int hf_ubx_mon_rf_magq;
506
static int hf_ubx_mon_rf_reserved2;
507
508
static int * const ubx_mon_rf_flags_fields[] = {
509
    &hf_ubx_mon_rf_jammingstate,
510
    NULL
511
};
512
513
static int hf_ubx_nav_dop;
514
static int hf_ubx_nav_dop_itow;
515
static int hf_ubx_nav_dop_gdop;
516
static int hf_ubx_nav_dop_pdop;
517
static int hf_ubx_nav_dop_tdop;
518
static int hf_ubx_nav_dop_vdop;
519
static int hf_ubx_nav_dop_hdop;
520
static int hf_ubx_nav_dop_ndop;
521
static int hf_ubx_nav_dop_edop;
522
523
static int hf_ubx_nav_eoe;
524
static int hf_ubx_nav_eoe_itow;
525
526
static int hf_ubx_nav_odo;
527
static int hf_ubx_nav_odo_version;
528
static int hf_ubx_nav_odo_reserved1;
529
static int hf_ubx_nav_odo_itow;
530
static int hf_ubx_nav_odo_distance;
531
static int hf_ubx_nav_odo_totaldistance;
532
static int hf_ubx_nav_odo_distancestd;
533
534
static int hf_ubx_nav_posecef;
535
static int hf_ubx_nav_posecef_itow;
536
static int hf_ubx_nav_posecef_ecefx;
537
static int hf_ubx_nav_posecef_ecefy;
538
static int hf_ubx_nav_posecef_ecefz;
539
static int hf_ubx_nav_posecef_pacc;
540
541
static int hf_ubx_nav_pvt;
542
static int hf_ubx_nav_pvt_itow;
543
static int hf_ubx_nav_pvt_year;
544
static int hf_ubx_nav_pvt_month;
545
static int hf_ubx_nav_pvt_day;
546
static int hf_ubx_nav_pvt_hour;
547
static int hf_ubx_nav_pvt_min;
548
static int hf_ubx_nav_pvt_sec;
549
static int hf_ubx_nav_pvt_valid;
550
static int hf_ubx_nav_pvt_validmag;
551
static int hf_ubx_nav_pvt_fullyresolved;
552
static int hf_ubx_nav_pvt_validtime;
553
static int hf_ubx_nav_pvt_validdate;
554
static int hf_ubx_nav_pvt_tacc;
555
static int hf_ubx_nav_pvt_nano;
556
static int hf_ubx_nav_pvt_fixtype;
557
static int hf_ubx_nav_pvt_flags;
558
static int hf_ubx_nav_pvt_headvehvalid;
559
static int hf_ubx_nav_pvt_psmstate;
560
static int hf_ubx_nav_pvt_diffsoln;
561
static int hf_ubx_nav_pvt_gnssfixok;
562
static int hf_ubx_nav_pvt_flags2;
563
static int hf_ubx_nav_pvt_confirmedtime;
564
static int hf_ubx_nav_pvt_confirmeddate;
565
static int hf_ubx_nav_pvt_confirmedavai;
566
static int hf_ubx_nav_pvt_numsv;
567
static int hf_ubx_nav_pvt_lon;
568
static int hf_ubx_nav_pvt_lat;
569
static int hf_ubx_nav_pvt_height;
570
static int hf_ubx_nav_pvt_hmsl;
571
static int hf_ubx_nav_pvt_hacc;
572
static int hf_ubx_nav_pvt_vacc;
573
static int hf_ubx_nav_pvt_veln;
574
static int hf_ubx_nav_pvt_vele;
575
static int hf_ubx_nav_pvt_veld;
576
static int hf_ubx_nav_pvt_gspeed;
577
static int hf_ubx_nav_pvt_headmot;
578
static int hf_ubx_nav_pvt_sacc;
579
static int hf_ubx_nav_pvt_headacc;
580
static int hf_ubx_nav_pvt_pdop;
581
static int hf_ubx_nav_pvt_lastcorrectionage;
582
static int hf_ubx_nav_pvt_invalidllh;
583
static int hf_ubx_nav_pvt_reserved1;
584
static int hf_ubx_nav_pvt_headveh;
585
static int hf_ubx_nav_pvt_magdec;
586
static int hf_ubx_nav_pvt_magacc;
587
588
static int * const ubx_nav_pvt_valid_fields[] = {
589
    &hf_ubx_nav_pvt_validdate,
590
    &hf_ubx_nav_pvt_validtime,
591
    &hf_ubx_nav_pvt_fullyresolved,
592
    &hf_ubx_nav_pvt_validmag,
593
    NULL
594
};
595
596
static int * const ubx_nav_pvt_flags_fields[] = {
597
    &hf_ubx_nav_pvt_gnssfixok,
598
    &hf_ubx_nav_pvt_diffsoln,
599
    &hf_ubx_nav_pvt_psmstate,
600
    &hf_ubx_nav_pvt_headvehvalid,
601
    NULL
602
};
603
604
static int * const ubx_nav_pvt_flags2_fields[] = {
605
    &hf_ubx_nav_pvt_confirmedavai,
606
    &hf_ubx_nav_pvt_confirmeddate,
607
    &hf_ubx_nav_pvt_confirmedtime,
608
    NULL
609
};
610
611
static int hf_ubx_nav_relposned;
612
static int hf_ubx_nav_relposned_version;
613
static int hf_ubx_nav_relposned_reserved0;
614
static int hf_ubx_nav_relposned_refstationid;
615
static int hf_ubx_nav_relposned_itow;
616
static int hf_ubx_nav_relposned_relposn;
617
static int hf_ubx_nav_relposned_relpose;
618
static int hf_ubx_nav_relposned_relposd;
619
static int hf_ubx_nav_relposned_relposlength;
620
static int hf_ubx_nav_relposned_relposheading;
621
static int hf_ubx_nav_relposned_reserved1;
622
static int hf_ubx_nav_relposned_relposhpn;
623
static int hf_ubx_nav_relposned_relposhpe;
624
static int hf_ubx_nav_relposned_relposhpd;
625
static int hf_ubx_nav_relposned_relposhplength;
626
static int hf_ubx_nav_relposned_accn;
627
static int hf_ubx_nav_relposned_acce;
628
static int hf_ubx_nav_relposned_accd;
629
static int hf_ubx_nav_relposned_acclength;
630
static int hf_ubx_nav_relposned_accheading;
631
static int hf_ubx_nav_relposned_reserved2;
632
static int hf_ubx_nav_relposned_flags;
633
static int hf_ubx_nav_relposned_gnssfixok;
634
static int hf_ubx_nav_relposned_diffsoln;
635
static int hf_ubx_nav_relposned_relposvalid;
636
static int hf_ubx_nav_relposned_carrsoln;
637
static int hf_ubx_nav_relposned_ismoving;
638
static int hf_ubx_nav_relposned_refposmiss;
639
static int hf_ubx_nav_relposned_refobsmiss;
640
static int hf_ubx_nav_relposned_relposheadingvalid;
641
static int hf_ubx_nav_relposned_relposnormalized;
642
static int hf_ubx_nav_relposned_relposn_full;
643
static int hf_ubx_nav_relposned_relpose_full;
644
static int hf_ubx_nav_relposned_relposd_full;
645
static int hf_ubx_nav_relposned_relposlength_full;
646
647
static int * const ubx_nav_relposned_flags_fields[] = {
648
    &hf_ubx_nav_relposned_gnssfixok,
649
    &hf_ubx_nav_relposned_diffsoln,
650
    &hf_ubx_nav_relposned_relposvalid,
651
    &hf_ubx_nav_relposned_carrsoln,
652
    &hf_ubx_nav_relposned_ismoving,
653
    &hf_ubx_nav_relposned_refposmiss,
654
    &hf_ubx_nav_relposned_refobsmiss,
655
    &hf_ubx_nav_relposned_relposheadingvalid,
656
    &hf_ubx_nav_relposned_relposnormalized,
657
    NULL
658
};
659
660
static int hf_ubx_nav_sat;
661
static int hf_ubx_nav_sat_itow;
662
static int hf_ubx_nav_sat_version;
663
static int hf_ubx_nav_sat_num_svs;
664
static int hf_ubx_nav_sat_reserved1;
665
static int hf_ubx_nav_sat_gnss_id;
666
static int hf_ubx_nav_sat_sv_id;
667
static int hf_ubx_nav_sat_cn0;
668
static int hf_ubx_nav_sat_elev;
669
static int hf_ubx_nav_sat_azim;
670
static int hf_ubx_nav_sat_pr_res;
671
static int hf_ubx_nav_sat_flags;
672
static int hf_ubx_nav_sat_quality_ind;
673
static int hf_ubx_nav_sat_sv_used;
674
static int hf_ubx_nav_sat_health;
675
static int hf_ubx_nav_sat_diff_corr;
676
static int hf_ubx_nav_sat_smoothed;
677
static int hf_ubx_nav_sat_orbit_src;
678
static int hf_ubx_nav_sat_eph_avail;
679
static int hf_ubx_nav_sat_alm_avail;
680
static int hf_ubx_nav_sat_ano_avail;
681
static int hf_ubx_nav_sat_aop_avail;
682
static int hf_ubx_nav_sat_sbas_corr_used;
683
static int hf_ubx_nav_sat_rtcm_corr_used;
684
static int hf_ubx_nav_sat_slas_corr_used;
685
static int hf_ubx_nav_sat_spartn_corr_used;
686
static int hf_ubx_nav_sat_pr_corr_used;
687
static int hf_ubx_nav_sat_cr_corr_used;
688
static int hf_ubx_nav_sat_do_corr_used;
689
690
static int * const ubx_nav_sat_flags_fields[] = {
691
    &hf_ubx_nav_sat_quality_ind,
692
    &hf_ubx_nav_sat_sv_used,
693
    &hf_ubx_nav_sat_health,
694
    &hf_ubx_nav_sat_diff_corr,
695
    &hf_ubx_nav_sat_smoothed,
696
    &hf_ubx_nav_sat_orbit_src,
697
    &hf_ubx_nav_sat_eph_avail,
698
    &hf_ubx_nav_sat_alm_avail,
699
    &hf_ubx_nav_sat_ano_avail,
700
    &hf_ubx_nav_sat_aop_avail,
701
    &hf_ubx_nav_sat_sbas_corr_used,
702
    &hf_ubx_nav_sat_rtcm_corr_used,
703
    &hf_ubx_nav_sat_slas_corr_used,
704
    &hf_ubx_nav_sat_spartn_corr_used,
705
    &hf_ubx_nav_sat_pr_corr_used,
706
    &hf_ubx_nav_sat_cr_corr_used,
707
    &hf_ubx_nav_sat_do_corr_used,
708
    NULL
709
};
710
711
static int hf_ubx_nav_sbas;
712
static int hf_ubx_nav_sbas_itow;
713
static int hf_ubx_nav_sbas_geo;
714
static int hf_ubx_nav_sbas_mode;
715
static int hf_ubx_nav_sbas_sys;
716
static int hf_ubx_nav_sbas_service;
717
static int hf_ubx_nav_sbas_service_ranging;
718
static int hf_ubx_nav_sbas_service_corrections;
719
static int hf_ubx_nav_sbas_service_integrity;
720
static int hf_ubx_nav_sbas_service_testmode;
721
static int hf_ubx_nav_sbas_service_bad;
722
static int hf_ubx_nav_sbas_cnt;
723
static int hf_ubx_nav_sbas_reserved1;
724
static int hf_ubx_nav_sbas_sv_id;
725
static int hf_ubx_nav_sbas_flags;
726
static int hf_ubx_nav_sbas_udre;
727
static int hf_ubx_nav_sbas_sv_sys;
728
static int hf_ubx_nav_sbas_sv_service;
729
static int hf_ubx_nav_sbas_reserved2;
730
static int hf_ubx_nav_sbas_prc;
731
static int hf_ubx_nav_sbas_reserved3;
732
static int hf_ubx_nav_sbas_ic;
733
734
static int * const ubx_nav_sbas_service_fields[] = {
735
    &hf_ubx_nav_sbas_service_ranging,
736
    &hf_ubx_nav_sbas_service_corrections,
737
    &hf_ubx_nav_sbas_service_integrity,
738
    &hf_ubx_nav_sbas_service_testmode,
739
    &hf_ubx_nav_sbas_service_bad,
740
    NULL
741
};
742
743
static int hf_ubx_nav_timegps;
744
static int hf_ubx_nav_timegps_itow;
745
static int hf_ubx_nav_timegps_ftow;
746
static int hf_ubx_nav_timegps_week;
747
static int hf_ubx_nav_timegps_leaps;
748
static int hf_ubx_nav_timegps_valid;
749
static int hf_ubx_nav_timegps_leapsvalid;
750
static int hf_ubx_nav_timegps_weekvalid;
751
static int hf_ubx_nav_timegps_towvalid;
752
static int hf_ubx_nav_timegps_tacc;
753
754
static int * const ubx_nav_timegps_valid_fields[] = {
755
    &hf_ubx_nav_timegps_towvalid,
756
    &hf_ubx_nav_timegps_weekvalid,
757
    &hf_ubx_nav_timegps_leapsvalid,
758
    NULL
759
};
760
761
static int hf_ubx_nav_timeutc;
762
static int hf_ubx_nav_timeutc_itow;
763
static int hf_ubx_nav_timeutc_tacc;
764
static int hf_ubx_nav_timeutc_nano;
765
static int hf_ubx_nav_timeutc_year;
766
static int hf_ubx_nav_timeutc_month;
767
static int hf_ubx_nav_timeutc_day;
768
static int hf_ubx_nav_timeutc_hour;
769
static int hf_ubx_nav_timeutc_min;
770
static int hf_ubx_nav_timeutc_sec;
771
static int hf_ubx_nav_timeutc_valid;
772
static int hf_ubx_nav_timeutc_validtow;
773
static int hf_ubx_nav_timeutc_validwkn;
774
static int hf_ubx_nav_timeutc_validutc;
775
static int hf_ubx_nav_timeutc_utcstandard;
776
777
static int * const ubx_nav_timeutc_valid_fields[] = {
778
    &hf_ubx_nav_timeutc_validtow,
779
    &hf_ubx_nav_timeutc_validwkn,
780
    &hf_ubx_nav_timeutc_validutc,
781
    &hf_ubx_nav_timeutc_utcstandard,
782
    NULL
783
};
784
785
static int hf_ubx_nav_velecef;
786
static int hf_ubx_nav_velecef_itow;
787
static int hf_ubx_nav_velecef_ecefvx;
788
static int hf_ubx_nav_velecef_ecefvy;
789
static int hf_ubx_nav_velecef_ecefvz;
790
static int hf_ubx_nav_velecef_sacc;
791
792
static int hf_ubx_rxm_measx;
793
static int hf_ubx_rxm_measx_version;
794
static int hf_ubx_rxm_measx_reserved1;
795
static int hf_ubx_rxm_measx_gpstow;
796
static int hf_ubx_rxm_measx_glotow;
797
static int hf_ubx_rxm_measx_bdstow;
798
static int hf_ubx_rxm_measx_reserved2;
799
static int hf_ubx_rxm_measx_qzsstow;
800
static int hf_ubx_rxm_measx_gpstowacc;
801
static int hf_ubx_rxm_measx_glotowacc;
802
static int hf_ubx_rxm_measx_bdstowacc;
803
static int hf_ubx_rxm_measx_reserved3;
804
static int hf_ubx_rxm_measx_qzsstowacc;
805
static int hf_ubx_rxm_measx_numsv;
806
static int hf_ubx_rxm_measx_flags_towset;
807
static int hf_ubx_rxm_measx_reserved4;
808
static int hf_ubx_rxm_measx_gnssid;
809
static int hf_ubx_rxm_measx_svid;
810
static int hf_ubx_rxm_measx_cn0;
811
static int hf_ubx_rxm_measx_mpathindic;
812
static int hf_ubx_rxm_measx_dopplerms;
813
static int hf_ubx_rxm_measx_dopplerhz;
814
static int hf_ubx_rxm_measx_wholechips;
815
static int hf_ubx_rxm_measx_fracchips;
816
static int hf_ubx_rxm_measx_codephase;
817
static int hf_ubx_rxm_measx_intcodephase;
818
static int hf_ubx_rxm_measx_pseurangermserr;
819
static int hf_ubx_rxm_measx_reserved5;
820
821
static int hf_ubx_rxm_rawx;
822
static int hf_ubx_rxm_rawx_rcvtow;
823
static int hf_ubx_rxm_rawx_week;
824
static int hf_ubx_rxm_rawx_leaps;
825
static int hf_ubx_rxm_rawx_nummeas;
826
static int hf_ubx_rxm_rawx_recstat;
827
static int hf_ubx_rxm_rawx_recstat_leapsec;
828
static int hf_ubx_rxm_rawx_recstat_clkreset;
829
static int hf_ubx_rxm_rawx_version;
830
static int hf_ubx_rxm_rawx_reserved1;
831
static int hf_ubx_rxm_rawx_prmes;
832
static int hf_ubx_rxm_rawx_cpmes;
833
static int hf_ubx_rxm_rawx_domes;
834
static int hf_ubx_rxm_rawx_gnssid;
835
static int hf_ubx_rxm_rawx_svid;
836
static int hf_ubx_rxm_rawx_sigid;
837
static int hf_ubx_rxm_rawx_freqid;
838
static int hf_ubx_rxm_rawx_locktime;
839
static int hf_ubx_rxm_rawx_cn0;
840
static int hf_ubx_rxm_rawx_prstdev;
841
static int hf_ubx_rxm_rawx_cpstdev;
842
static int hf_ubx_rxm_rawx_dostdev;
843
static int hf_ubx_rxm_rawx_trkstat;
844
static int hf_ubx_rxm_rawx_trkstat_prvalid;
845
static int hf_ubx_rxm_rawx_trkstat_cpvalid;
846
static int hf_ubx_rxm_rawx_trkstat_halfcyc;
847
static int hf_ubx_rxm_rawx_trkstat_subhalfcyc;
848
static int hf_ubx_rxm_rawx_reserved2;
849
850
static int * const ubx_rxm_rawx_recstat_fields[] = {
851
    &hf_ubx_rxm_rawx_recstat_leapsec,
852
    &hf_ubx_rxm_rawx_recstat_clkreset,
853
    NULL
854
};
855
856
static int * const ubx_rxm_rawx_trkstat_fields[] = {
857
    &hf_ubx_rxm_rawx_trkstat_prvalid,
858
    &hf_ubx_rxm_rawx_trkstat_cpvalid,
859
    &hf_ubx_rxm_rawx_trkstat_halfcyc,
860
    &hf_ubx_rxm_rawx_trkstat_subhalfcyc,
861
    NULL
862
};
863
864
static int hf_ubx_rxm_sfrbx;
865
static int hf_ubx_rxm_sfrbx_gnssid;
866
static int hf_ubx_rxm_sfrbx_svid;
867
static int hf_ubx_rxm_sfrbx_sigid;
868
static int hf_ubx_rxm_sfrbx_freqid;
869
static int hf_ubx_rxm_sfrbx_numwords;
870
static int hf_ubx_rxm_sfrbx_chn;
871
static int hf_ubx_rxm_sfrbx_version;
872
static int hf_ubx_rxm_sfrbx_dwrd;
873
static int hf_ubx_rxm_sfrbx_reserved1;
874
static int hf_ubx_rxm_sfrbx_reserved2;
875
static int hf_ubx_rxm_sfrbx_reserved3;
876
877
static dissector_table_t ubx_class_id_dissector_table;
878
static dissector_table_t ubx_gnssid_dissector_table;
879
880
static expert_field ei_ubx_chksum;
881
882
static int ett_ubx;
883
static int ett_ubx_ack_ack;
884
static int ett_ubx_ack_nak;
885
static int ett_ubx_cfg_gnss;
886
static int ett_ubx_cfg_gnss_block[255];
887
static int ett_ubx_cfg_sbas;
888
static int ett_ubx_cfg_sbas_mode;
889
static int ett_ubx_cfg_sbas_scanmode;
890
static int ett_ubx_mon_rf;
891
static int ett_ubx_mon_rf_rf_info[255];
892
static int ett_ubx_mon_rf_flags;
893
static int ett_ubx_nav_dop;
894
static int ett_ubx_nav_eoe;
895
static int ett_ubx_nav_odo;
896
static int ett_ubx_nav_posecef;
897
static int ett_ubx_nav_pvt;
898
static int ett_ubx_nav_pvt_datetime;
899
static int ett_ubx_nav_pvt_valid;
900
static int ett_ubx_nav_pvt_flags;
901
static int ett_ubx_nav_pvt_flags2;
902
static int ett_ubx_nav_relposned;
903
static int ett_ubx_nav_relposned_flags;
904
static int ett_ubx_nav_sat;
905
static int ett_ubx_nav_sat_sv_info[255];
906
static int ett_ubx_nav_sat_flags;
907
static int ett_ubx_nav_sbas;
908
static int ett_ubx_nav_sbas_service;
909
static int ett_ubx_nav_sbas_sv_info[255];
910
static int ett_ubx_nav_timegps;
911
static int ett_ubx_nav_timegps_tow;
912
static int ett_ubx_nav_timegps_valid;
913
static int ett_ubx_nav_timeutc;
914
static int ett_ubx_nav_timeutc_valid;
915
static int ett_ubx_nav_velecef;
916
static int ett_ubx_rxm_measx;
917
static int ett_ubx_rxm_measx_meas[255];
918
static int ett_ubx_rxm_rawx;
919
static int ett_ubx_rxm_rawx_recstat;
920
static int ett_ubx_rxm_rawx_trkstat;
921
static int ett_ubx_rxm_rawx_meas[255];
922
static int ett_ubx_rxm_sfrbx;
923
924
static dissector_handle_t ubx_handle;
925
926
/* compute the checksum for a UBX message (Fletcher 8-bit by RFC 1145 */
927
0
static uint16_t chksum_fletcher_8(const uint8_t *data, const int len) {
928
0
    uint8_t ck_a = 0, ck_b = 0;
929
0
    int i;
930
931
0
    for (i = 0; i < len; i++) {
932
0
        ck_a += data[i];
933
0
        ck_b += ck_a;
934
0
    }
935
936
0
    return (ck_b << 8) | ck_a;
937
0
}
938
939
/* Format code phase */
940
0
static void fmt_codephase(char *label, uint32_t p) {
941
0
    snprintf(label, ITEM_LABEL_LENGTH, "%d * 2^-21 ms", p);
942
0
}
943
944
/* Format carrier phase standard deviation */
945
0
static void fmt_cpstdev(char *label, uint32_t p) {
946
0
    snprintf(label, ITEM_LABEL_LENGTH, "%d.%03d cycles", (p * 4) / 1000, (p * 4) % 1000);
947
0
}
948
949
/* Format magnetic declination */
950
0
static void fmt_decl(char *label, int32_t d) {
951
0
    if (d >= 0) {
952
0
        snprintf(label, ITEM_LABEL_LENGTH, "%d.%02d%s", d / 100, d % 100,
953
0
                UTF8_DEGREE_SIGN);
954
0
    }
955
0
    else {
956
0
        snprintf(label, ITEM_LABEL_LENGTH, "-%d.%02d%s", -d / 100, -d % 100,
957
0
                UTF8_DEGREE_SIGN);
958
0
    }
959
0
}
960
961
/* Format magnetic declination accuracy */
962
0
static void fmt_decl_acc(char *label, uint32_t a) {
963
0
    snprintf(label, ITEM_LABEL_LENGTH, "%d.%02d%s", a / 100,
964
0
            a % 100, UTF8_DEGREE_SIGN);
965
0
}
966
967
/* Format Dilution of Precision */
968
0
static void fmt_dop(char *label, uint32_t dop) {
969
0
    snprintf(label, ITEM_LABEL_LENGTH, "%i.%02i", dop / 100, dop % 100);
970
0
}
971
972
/* Format Doppler measurement in m/s */
973
0
static void fmt_dopplerms(char *label, int32_t d) {
974
0
    if (d >= 0) {
975
0
        snprintf(label, ITEM_LABEL_LENGTH, "%d.%02d m/s", d * 4 / 100, (d * 4) % 100);
976
0
    }
977
0
    else {
978
0
        snprintf(label, ITEM_LABEL_LENGTH, "-%d.%02d m/s", -d * 4 / 100, (-d * 4) % 100);
979
0
    }
980
0
}
981
982
/* Format Doppler measurement in Hz */
983
0
static void fmt_dopplerhz(char *label, int32_t d) {
984
0
    if (d >= 0) {
985
0
        snprintf(label, ITEM_LABEL_LENGTH, "%d.%01d Hz", d * 2 / 10, (d * 2) % 10);
986
0
    }
987
0
    else {
988
0
        snprintf(label, ITEM_LABEL_LENGTH, "-%d.%01d Hz", -d * 2 / 10, (-d * 2) % 10);
989
0
    }
990
0
}
991
992
/* Format Doppler standard deviation */
993
0
static void fmt_dostdev(char *label, uint32_t p) {
994
0
    snprintf(label, ITEM_LABEL_LENGTH, "%d.%03d Hz", (1 << p) * 2 / 1000, ((1 << p) * 2) % 1000);
995
0
}
996
997
/* Format heading */
998
0
static void fmt_heading(char *label, int32_t h) {
999
0
    if (h >= 0) {
1000
0
        snprintf(label, ITEM_LABEL_LENGTH, "%d.%05d%s", h / 100000, h % 100000,
1001
0
                UTF8_DEGREE_SIGN);
1002
0
    }
1003
0
    else {
1004
0
        snprintf(label, ITEM_LABEL_LENGTH, "-%d.%05d%s", -h / 100000,
1005
0
                -h % 100000, UTF8_DEGREE_SIGN);
1006
0
    }
1007
0
}
1008
1009
/* Format heading accuracy */
1010
0
static void fmt_heading_acc(char *label, uint32_t a) {
1011
0
    snprintf(label, ITEM_LABEL_LENGTH, "%d.%05d%s", a / 100000,
1012
0
            a % 100000, UTF8_DEGREE_SIGN);
1013
0
}
1014
1015
/* Format latitude or longitude */
1016
0
static void fmt_lat_lon(char *label, int32_t l) {
1017
0
    if (l >= 0) {
1018
0
        snprintf(label, ITEM_LABEL_LENGTH, "%d.%07d%s", l / 10000000,
1019
0
                l % 10000000, UTF8_DEGREE_SIGN);
1020
0
    }
1021
0
    else {
1022
0
        snprintf(label, ITEM_LABEL_LENGTH, "-%d.%07d%s", -l / 10000000,
1023
0
                -l % 10000000, UTF8_DEGREE_SIGN);
1024
0
    }
1025
0
}
1026
1027
/* Format pseudo-range residuals */
1028
0
static void fmt_pr_res(char *label, int32_t p) {
1029
0
    if (p >= 0) {
1030
0
        snprintf(label, ITEM_LABEL_LENGTH, "%d.%01dm", p / 10, p % 10);
1031
0
    }
1032
0
    else {
1033
0
        snprintf(label, ITEM_LABEL_LENGTH, "-%d.%01dm", -p / 10, -p % 10);
1034
0
    }
1035
0
}
1036
1037
/* Format pseudo-range standard deviation */
1038
0
static void fmt_prstdev(char *label, uint32_t p) {
1039
0
    snprintf(label, ITEM_LABEL_LENGTH, "%d.%02dm", (1 << p) / 100, (1 << p) % 100);
1040
0
}
1041
1042
/* Format measurement reference time accuracy */
1043
0
static void fmt_towacc(char *label, uint32_t p) {
1044
0
    snprintf(label, ITEM_LABEL_LENGTH, "%d.%04dms", p / 16, (p * 10000 / 16) % 10000);
1045
0
}
1046
1047
/* Format high-precision components of relative position vectors in cm between -0.99cm and 0.99cm */
1048
0
static void fmt_relpos_hp(char *label, int8_t p) {
1049
0
    if (p >= 0) {
1050
0
        snprintf(label, ITEM_LABEL_LENGTH, "%d.%02dcm", p / 100, p % 100);
1051
0
    }
1052
0
    else {
1053
0
        snprintf(label, ITEM_LABEL_LENGTH, "-%d.%02dcm", -p / 100, -p % 100);
1054
0
    }
1055
0
}
1056
1057
0
static void fmt_relpos_acc(char *label, uint32_t p) {
1058
0
    snprintf(label, ITEM_LABEL_LENGTH, "%d.%02dcm", p / 100, p % 100);
1059
0
}
1060
1061
0
static void fmt_relpos_full(char *label, int64_t p) {
1062
0
    if (p >= 0) {
1063
0
        snprintf(label, ITEM_LABEL_LENGTH, "%"PRId64".%02"PRId64"cm", p / 100, p % 100);
1064
0
    }
1065
0
    else {
1066
0
        snprintf(label, ITEM_LABEL_LENGTH, "-%"PRId64".%02"PRId64"cm", -p / 100, -p % 100);
1067
0
    }
1068
0
}
1069
1070
/* Dissect UBX message */
1071
0
static int dissect_ubx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1072
0
    tvbuff_t *next_tvb;
1073
0
    uint32_t msg_class_id, payload_len, cmp_chksum;
1074
1075
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX");
1076
0
    col_clear(pinfo->cinfo, COL_INFO);
1077
1078
0
    payload_len = tvb_get_uint16(tvb, 4, ENC_LITTLE_ENDIAN);
1079
1080
0
    proto_item *ti = proto_tree_add_item(tree, proto_ubx, tvb, 0,
1081
0
            UBX_HEADER_SIZE + payload_len + UBX_CHKSUM_SIZE, ENC_NA);
1082
0
    proto_tree *ubx_tree = proto_item_add_subtree(ti, ett_ubx);
1083
1084
    // dissect the registered fields
1085
0
    proto_tree_add_item(ubx_tree, hf_ubx_preamble,
1086
0
            tvb, 0, 2, ENC_BIG_ENDIAN);
1087
0
    proto_tree_add_item_ret_uint(ubx_tree, hf_ubx_msg_class_id,
1088
0
            tvb, 2, 2, ENC_BIG_ENDIAN, &msg_class_id);
1089
0
    proto_tree_add_item(ubx_tree, hf_ubx_payload_len,
1090
0
            tvb, 4, 2, ENC_LITTLE_ENDIAN);
1091
1092
    // checksum
1093
0
    cmp_chksum = chksum_fletcher_8(
1094
0
            (uint8_t *)tvb_memdup(pinfo->pool, tvb, 2, UBX_HEADER_SIZE + payload_len - 2),
1095
0
            UBX_HEADER_SIZE + payload_len - 2);
1096
0
    proto_tree_add_checksum(ubx_tree,
1097
0
            tvb, UBX_HEADER_SIZE + payload_len,
1098
0
            hf_ubx_chksum, -1, &ei_ubx_chksum, NULL, cmp_chksum,
1099
0
            ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY);
1100
1101
    // send the payload to the next dissector
1102
0
    next_tvb = tvb_new_subset_length(tvb, UBX_HEADER_SIZE, payload_len);
1103
0
    if (!dissector_try_uint(ubx_class_id_dissector_table, msg_class_id,
1104
0
                next_tvb, pinfo, tree)) {
1105
0
        call_data_dissector(next_tvb, pinfo, tree);
1106
0
    }
1107
1108
0
    return tvb_captured_length(tvb);
1109
0
}
1110
1111
/* Dissect UBX-ACK-ACK message */
1112
0
static int dissect_ubx_ack_ack(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1113
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-ACK-ACK");
1114
0
    col_clear(pinfo->cinfo, COL_INFO);
1115
1116
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_ack_ack, tvb, 0, 2, ENC_NA);
1117
0
    proto_tree *ubx_ack_ack_tree = proto_item_add_subtree(ti, ett_ubx_ack_ack);
1118
1119
    // dissect the registered fields
1120
0
    proto_tree_add_item(ubx_ack_ack_tree, hf_ubx_ack_ack_msg_class_id,
1121
0
            tvb, 0, 2, ENC_BIG_ENDIAN);
1122
1123
0
    return tvb_captured_length(tvb);
1124
0
}
1125
1126
/* Dissect UBX-ACK-NAK message */
1127
0
static int dissect_ubx_ack_nak(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1128
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-ACK-NAK");
1129
0
    col_clear(pinfo->cinfo, COL_INFO);
1130
1131
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_ack_nak, tvb, 0, 2, ENC_NA);
1132
0
    proto_tree *ubx_ack_nak_tree = proto_item_add_subtree(ti, ett_ubx_ack_nak);
1133
1134
    // dissect the registered fields
1135
0
    proto_tree_add_item(ubx_ack_nak_tree, hf_ubx_ack_nak_msg_class_id,
1136
0
            tvb, 0, 2, ENC_BIG_ENDIAN);
1137
1138
0
    return tvb_captured_length(tvb);
1139
0
}
1140
1141
/* Dissect UBX-CFG-SBAS message */
1142
0
static int dissect_ubx_cfg_gnss(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1143
0
    uint8_t i, num_config_blocks;
1144
1145
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-CFG-GNSS");
1146
0
    col_clear(pinfo->cinfo, COL_INFO);
1147
1148
0
    num_config_blocks = tvb_get_uint8(tvb, 3);
1149
1150
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_cfg_gnss,
1151
0
            tvb, 0, 4 + 8 * num_config_blocks, ENC_NA);
1152
0
    proto_tree *ubx_cfg_gnss_tree = proto_item_add_subtree(ti, ett_ubx_cfg_gnss);
1153
1154
    // dissect the registered fields
1155
0
    proto_tree_add_item(ubx_cfg_gnss_tree, hf_ubx_cfg_gnss_version,
1156
0
            tvb, 0, 1, ENC_NA);
1157
0
    proto_tree_add_item(ubx_cfg_gnss_tree, hf_ubx_cfg_gnss_numtrkchhw,
1158
0
            tvb, 1, 1, ENC_NA);
1159
0
    proto_tree_add_item(ubx_cfg_gnss_tree, hf_ubx_cfg_gnss_numtrkchuse,
1160
0
            tvb, 2, 1, ENC_NA);
1161
0
    proto_tree_add_item(ubx_cfg_gnss_tree, hf_ubx_cfg_gnss_numconfigblocks,
1162
0
            tvb, 3, 1, ENC_NA);
1163
1164
0
    for (i = 0; i < num_config_blocks; i++) {
1165
0
        const uint8_t gnss_id = tvb_get_uint8(tvb, 4 + 8 * i);
1166
0
        const uint8_t res_trk_ch = tvb_get_uint8(tvb, 5 + 8 * i);
1167
0
        const uint8_t max_trk_ch = tvb_get_uint8(tvb, 6 + 8 * i);
1168
1169
0
        proto_tree *gnss_blk_tree = proto_tree_add_subtree_format(ubx_cfg_gnss_tree,
1170
0
                tvb, 4 + 8 * i, 8, ett_ubx_cfg_gnss_block[i], NULL,
1171
0
                "%-7s (Res Trk Ch %2d, Max Trk Ch %2d)",
1172
0
                val_to_str_const(gnss_id, UBX_GNSS_ID, "Unknown GNSS ID"),
1173
0
                res_trk_ch, max_trk_ch);
1174
1175
0
        proto_tree_add_item(gnss_blk_tree, hf_ubx_cfg_gnss_blk_gnssid,
1176
0
            tvb,  4 + (8 * i), 1, ENC_NA);
1177
0
        proto_tree_add_item(gnss_blk_tree, hf_ubx_cfg_gnss_blk_restrkch,
1178
0
            tvb,  5 + (8 * i), 1, ENC_NA);
1179
0
        proto_tree_add_item(gnss_blk_tree, hf_ubx_cfg_gnss_blk_maxtrkch,
1180
0
            tvb,  6 + (8 * i), 1, ENC_NA);
1181
0
        proto_tree_add_item(gnss_blk_tree, hf_ubx_cfg_gnss_blk_reserved1,
1182
0
            tvb,  7 + (8 * i), 1, ENC_NA);
1183
0
        proto_tree_add_item(gnss_blk_tree, hf_ubx_cfg_gnss_blk_enable,
1184
0
            tvb,  8 + (8 * i), 4, ENC_LITTLE_ENDIAN);
1185
1186
0
        int hf;
1187
0
        switch (gnss_id) {
1188
0
            case GNSS_ID_GPS:
1189
0
                hf = hf_ubx_cfg_gnss_blk_gps_sigcfgmask;
1190
0
                break;
1191
0
            case GNSS_ID_SBAS:
1192
0
                hf = hf_ubx_cfg_gnss_blk_sbas_sigcfgmask;
1193
0
                break;
1194
0
            case GNSS_ID_GALILEO:
1195
0
                hf = hf_ubx_cfg_gnss_blk_gal_sigcfgmask;
1196
0
                break;
1197
0
            case GNSS_ID_BEIDOU:
1198
0
                hf = hf_ubx_cfg_gnss_blk_bds_sigcfgmask;
1199
0
                break;
1200
0
            case GNSS_ID_IMES:
1201
0
                hf = hf_ubx_cfg_gnss_blk_imes_sigcfgmask;
1202
0
                break;
1203
0
            case GNSS_ID_QZSS:
1204
0
                hf = hf_ubx_cfg_gnss_blk_qzss_sigcfgmask;
1205
0
                break;
1206
0
            case GNSS_ID_GLONASS:
1207
0
                hf = hf_ubx_cfg_gnss_blk_glo_sigcfgmask;
1208
0
                break;
1209
0
            default:
1210
0
                hf = hf_ubx_cfg_gnss_blk_sigcfgmask;
1211
0
        }
1212
0
        proto_tree_add_item(gnss_blk_tree, hf,
1213
0
            tvb,  8 + (8 * i), 4, ENC_LITTLE_ENDIAN);
1214
0
    }
1215
1216
0
    return tvb_captured_length(tvb);
1217
0
}
1218
1219
/* Dissect UBX-CFG-SBAS message */
1220
0
static int dissect_ubx_cfg_sbas(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1221
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-CFG-SBAS");
1222
0
    col_clear(pinfo->cinfo, COL_INFO);
1223
1224
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_cfg_sbas, tvb, 0, 2, ENC_NA);
1225
0
    proto_tree *ubx_cfg_sbas_tree = proto_item_add_subtree(ti, ett_ubx_cfg_sbas);
1226
1227
    // dissect the registered fields
1228
0
    proto_tree_add_bitmask(ubx_cfg_sbas_tree, tvb, 0, hf_ubx_cfg_sbas_mode,
1229
0
            ett_ubx_cfg_sbas_mode, ubx_cfg_sbas_mode_fields, ENC_NA);
1230
0
    proto_tree_add_item(ubx_cfg_sbas_tree, hf_ubx_cfg_sbas_usage_range,
1231
0
            tvb, 1, 1, ENC_NA);
1232
0
    proto_tree_add_item(ubx_cfg_sbas_tree, hf_ubx_cfg_sbas_usage_diffcorr,
1233
0
            tvb, 1, 1, ENC_NA);
1234
0
    proto_tree_add_item(ubx_cfg_sbas_tree, hf_ubx_cfg_sbas_usage_integrity,
1235
0
            tvb, 1, 1, ENC_NA);
1236
0
    proto_tree_add_item(ubx_cfg_sbas_tree, hf_ubx_cfg_sbas_max_sbas,
1237
0
            tvb, 2, 1, ENC_NA);
1238
1239
    // scanmode bitmask
1240
0
    proto_tree *scanmode_tree = proto_tree_add_subtree(ubx_cfg_sbas_tree,
1241
0
            tvb, 3, 5, ett_ubx_cfg_sbas_scanmode, NULL, "Scanmode bitmask");
1242
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn120,
1243
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1244
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn121,
1245
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1246
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn122,
1247
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1248
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn123,
1249
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1250
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn124,
1251
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1252
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn125,
1253
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1254
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn126,
1255
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1256
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn127,
1257
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1258
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn128,
1259
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1260
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn129,
1261
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1262
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn130,
1263
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1264
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn131,
1265
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1266
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn132,
1267
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1268
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn133,
1269
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1270
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn134,
1271
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1272
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn135,
1273
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1274
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn136,
1275
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1276
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn137,
1277
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1278
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn138,
1279
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1280
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn139,
1281
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1282
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn140,
1283
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1284
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn141,
1285
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1286
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn142,
1287
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1288
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn143,
1289
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1290
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn144,
1291
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1292
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn145,
1293
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1294
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn146,
1295
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1296
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn147,
1297
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1298
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn148,
1299
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1300
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn149,
1301
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1302
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn150,
1303
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1304
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn151,
1305
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1306
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn152,
1307
0
            tvb, 3, 1, ENC_NA);
1308
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn153,
1309
0
            tvb, 3, 1, ENC_NA);
1310
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn154,
1311
0
            tvb, 3, 1, ENC_NA);
1312
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn155,
1313
0
            tvb, 3, 1, ENC_NA);
1314
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn156,
1315
0
            tvb, 3, 1, ENC_NA);
1316
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn157,
1317
0
            tvb, 3, 1, ENC_NA);
1318
0
    proto_tree_add_item(scanmode_tree, hf_ubx_cfg_sbas_scanmode_prn158,
1319
0
            tvb, 3, 1, ENC_NA);
1320
1321
0
    return tvb_captured_length(tvb);
1322
0
}
1323
1324
/* Dissect UBX-MON-RF message */
1325
0
static int dissect_ubx_mon_rf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1326
0
    uint8_t num_blocks;
1327
1328
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-MON-RF");
1329
0
    col_clear(pinfo->cinfo, COL_INFO);
1330
1331
0
    num_blocks = tvb_get_uint8(tvb, 1);
1332
1333
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_mon_rf,
1334
0
            tvb, 0, 4 + 24 * num_blocks, ENC_NA);
1335
0
    proto_tree *ubx_mon_rf_tree = proto_item_add_subtree(ti, ett_ubx_mon_rf);
1336
1337
    // dissect the registered fields
1338
0
    proto_tree_add_item(ubx_mon_rf_tree, hf_ubx_mon_rf_version,
1339
0
            tvb, 0, 1, ENC_NA);
1340
0
    proto_tree_add_item(ubx_mon_rf_tree, hf_ubx_mon_rf_nblocks,
1341
0
            tvb, 1, 1, ENC_NA);
1342
0
    proto_tree_add_item(ubx_mon_rf_tree, hf_ubx_mon_rf_reserved0,
1343
0
            tvb, 2, 2, ENC_LITTLE_ENDIAN);
1344
1345
0
    for (unsigned i = 0; i < num_blocks; i++) {
1346
0
        const uint8_t block_id = tvb_get_uint8(tvb, 4 + 24 * i);
1347
1348
0
        proto_tree *rf_info_tree = proto_tree_add_subtree_format(ubx_mon_rf_tree,
1349
0
            tvb, 4 + 24 * i, 24, ett_ubx_mon_rf_rf_info[i], NULL,
1350
0
            "Block ID %3d", block_id);
1351
1352
0
        proto_tree_add_item(rf_info_tree, hf_ubx_mon_rf_blockid,
1353
0
            tvb, 4 + (24 * i), 1, ENC_NA);
1354
0
        proto_tree_add_bitmask(rf_info_tree, tvb, 5 + (24 * i), hf_ubx_mon_rf_flags,
1355
0
            ett_ubx_mon_rf_flags, ubx_mon_rf_flags_fields, ENC_NA);
1356
0
        proto_tree_add_item(rf_info_tree, hf_ubx_mon_rf_antstatus,
1357
0
            tvb, 6 + (24 * i), 1, ENC_NA);
1358
0
        proto_tree_add_item(rf_info_tree, hf_ubx_mon_rf_antpower,
1359
0
            tvb, 7 + (24 * i), 1, ENC_NA);
1360
0
        proto_tree_add_item(rf_info_tree, hf_ubx_mon_rf_poststatus,
1361
0
            tvb, 8 + (24 * i), 4, ENC_LITTLE_ENDIAN);
1362
0
        proto_tree_add_item(rf_info_tree, hf_ubx_mon_rf_reserved1,
1363
0
            tvb, 12 + (24 * i), 4, ENC_LITTLE_ENDIAN);
1364
0
        proto_tree_add_item(rf_info_tree, hf_ubx_mon_rf_noiseperms,
1365
0
            tvb, 16 + (24 * i), 2, ENC_LITTLE_ENDIAN);
1366
0
        proto_tree_add_item(rf_info_tree, hf_ubx_mon_rf_agccnt,
1367
0
            tvb, 18 + (24 * i), 2, ENC_LITTLE_ENDIAN);
1368
0
        proto_tree_add_item(rf_info_tree, hf_ubx_mon_rf_cwsuppression,
1369
0
            tvb, 20 + (24 * i), 1, ENC_NA);
1370
0
        proto_tree_add_item(rf_info_tree, hf_ubx_mon_rf_ofsi,
1371
0
            tvb, 21 + (24 * i), 1, ENC_NA);
1372
0
        proto_tree_add_item(rf_info_tree, hf_ubx_mon_rf_magi,
1373
0
            tvb, 22 + (24 * i), 1, ENC_NA);
1374
0
        proto_tree_add_item(rf_info_tree, hf_ubx_mon_rf_ofsq,
1375
0
            tvb, 23 + (24 * i), 1, ENC_NA);
1376
0
        proto_tree_add_item(rf_info_tree, hf_ubx_mon_rf_magq,
1377
0
            tvb, 24 + (24 * i), 1, ENC_NA);
1378
0
        proto_tree_add_item(rf_info_tree, hf_ubx_mon_rf_reserved2,
1379
0
            tvb, 25 + (24 * i), 3, ENC_LITTLE_ENDIAN);
1380
0
    }
1381
1382
0
    return tvb_captured_length(tvb);
1383
0
}
1384
1385
/* Dissect UBX-NAV-DOP message */
1386
0
static int dissect_ubx_nav_dop(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1387
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-NAV-DOP");
1388
0
    col_clear(pinfo->cinfo, COL_INFO);
1389
1390
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_nav_dop,
1391
0
            tvb, 0, 18, ENC_NA);
1392
0
    proto_tree *ubx_nav_dop_tree = proto_item_add_subtree(ti, ett_ubx_nav_dop);
1393
1394
    // dissect the registered fields
1395
0
    proto_tree_add_item(ubx_nav_dop_tree, hf_ubx_nav_dop_itow,
1396
0
            tvb, 0, 4, ENC_LITTLE_ENDIAN);
1397
0
    proto_tree_add_item(ubx_nav_dop_tree, hf_ubx_nav_dop_gdop, tvb,  4, 2, ENC_LITTLE_ENDIAN);
1398
0
    proto_tree_add_item(ubx_nav_dop_tree, hf_ubx_nav_dop_pdop, tvb,  6, 2, ENC_LITTLE_ENDIAN);
1399
0
    proto_tree_add_item(ubx_nav_dop_tree, hf_ubx_nav_dop_tdop, tvb,  8, 2, ENC_LITTLE_ENDIAN);
1400
0
    proto_tree_add_item(ubx_nav_dop_tree, hf_ubx_nav_dop_vdop, tvb, 10, 2, ENC_LITTLE_ENDIAN);
1401
0
    proto_tree_add_item(ubx_nav_dop_tree, hf_ubx_nav_dop_hdop, tvb, 12, 2, ENC_LITTLE_ENDIAN);
1402
0
    proto_tree_add_item(ubx_nav_dop_tree, hf_ubx_nav_dop_ndop, tvb, 14, 2, ENC_LITTLE_ENDIAN);
1403
0
    proto_tree_add_item(ubx_nav_dop_tree, hf_ubx_nav_dop_edop, tvb, 16, 2, ENC_LITTLE_ENDIAN);
1404
1405
0
    return tvb_captured_length(tvb);
1406
0
}
1407
1408
/* Dissect UBX-NAV-EOE message */
1409
0
static int dissect_ubx_nav_eoe(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1410
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-NAV-EOE");
1411
0
    col_clear(pinfo->cinfo, COL_INFO);
1412
1413
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_nav_eoe,
1414
0
            tvb, 0, 4, ENC_NA);
1415
0
    proto_tree *ubx_nav_eoe_tree = proto_item_add_subtree(ti, ett_ubx_nav_eoe);
1416
1417
    // dissect the registered fields
1418
0
    proto_tree_add_item(ubx_nav_eoe_tree, hf_ubx_nav_eoe_itow,
1419
0
            tvb, 0, 4, ENC_LITTLE_ENDIAN);
1420
1421
0
    return tvb_captured_length(tvb);
1422
0
}
1423
1424
/* Dissect UBX-NAV-ODO message */
1425
0
static int dissect_ubx_nav_odo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1426
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-NAV-ODO");
1427
0
    col_clear(pinfo->cinfo, COL_INFO);
1428
1429
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_nav_odo,
1430
0
            tvb, 0, 20, ENC_NA);
1431
0
    proto_tree *ubx_nav_odo_tree = proto_item_add_subtree(ti, ett_ubx_nav_odo);
1432
1433
    // dissect the registered fields
1434
0
    proto_tree_add_item(ubx_nav_odo_tree, hf_ubx_nav_odo_version,
1435
0
            tvb, 0, 1, ENC_NA);
1436
0
    proto_tree_add_item(ubx_nav_odo_tree, hf_ubx_nav_odo_reserved1,
1437
0
            tvb, 1, 3, ENC_LITTLE_ENDIAN);
1438
0
    proto_tree_add_item(ubx_nav_odo_tree, hf_ubx_nav_odo_itow,
1439
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1440
0
    proto_tree_add_item(ubx_nav_odo_tree, hf_ubx_nav_odo_distance,
1441
0
            tvb, 8, 4, ENC_LITTLE_ENDIAN);
1442
0
    proto_tree_add_item(ubx_nav_odo_tree, hf_ubx_nav_odo_totaldistance,
1443
0
            tvb, 12, 4, ENC_LITTLE_ENDIAN);
1444
0
    proto_tree_add_item(ubx_nav_odo_tree, hf_ubx_nav_odo_distancestd,
1445
0
            tvb, 16, 4, ENC_LITTLE_ENDIAN);
1446
1447
0
    return tvb_captured_length(tvb);
1448
0
}
1449
1450
/* Dissect UBX-NAV-POSECEF message */
1451
0
static int dissect_ubx_nav_posecef(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1452
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-NAV-POSECEF");
1453
0
    col_clear(pinfo->cinfo, COL_INFO);
1454
1455
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_nav_posecef,
1456
0
            tvb, 0, 20, ENC_NA);
1457
0
    proto_tree *ubx_nav_posecef_tree = proto_item_add_subtree(ti, ett_ubx_nav_posecef);
1458
1459
    // dissect the registered fields
1460
0
    proto_tree_add_item(ubx_nav_posecef_tree, hf_ubx_nav_posecef_itow,
1461
0
            tvb, 0, 4, ENC_LITTLE_ENDIAN);
1462
0
    proto_tree_add_item(ubx_nav_posecef_tree, hf_ubx_nav_posecef_ecefx,
1463
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1464
0
    proto_tree_add_item(ubx_nav_posecef_tree, hf_ubx_nav_posecef_ecefy,
1465
0
            tvb, 8, 4, ENC_LITTLE_ENDIAN);
1466
0
    proto_tree_add_item(ubx_nav_posecef_tree, hf_ubx_nav_posecef_ecefz,
1467
0
            tvb, 12, 4, ENC_LITTLE_ENDIAN);
1468
0
    proto_tree_add_item(ubx_nav_posecef_tree, hf_ubx_nav_posecef_pacc,
1469
0
            tvb, 16, 4, ENC_LITTLE_ENDIAN);
1470
1471
0
    return tvb_captured_length(tvb);
1472
0
}
1473
1474
/* Dissect UBX-NAV-PVT message */
1475
0
static int dissect_ubx_nav_pvt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1476
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-NAV-PVT");
1477
0
    col_clear(pinfo->cinfo, COL_INFO);
1478
1479
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_nav_pvt,
1480
0
            tvb, 0, 92, ENC_NA);
1481
0
    proto_tree *ubx_nav_pvt_tree = proto_item_add_subtree(ti, ett_ubx_nav_pvt);
1482
1483
    // dissect the registered fields
1484
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_itow,
1485
0
            tvb, 0, 4, ENC_LITTLE_ENDIAN);
1486
1487
    // dissect date & time
1488
0
    uint16_t year = tvb_get_int16(tvb, 4, ENC_LITTLE_ENDIAN);
1489
0
    uint8_t month = tvb_get_int8(tvb, 6);
1490
0
    uint8_t day = tvb_get_int8(tvb, 7);
1491
0
    uint8_t hour = tvb_get_int8(tvb, 8);
1492
0
    uint8_t min = tvb_get_int8(tvb, 9);
1493
0
    uint8_t sec = tvb_get_int8(tvb, 10);
1494
0
    proto_tree *datetime_tree = proto_tree_add_subtree_format(ubx_nav_pvt_tree,
1495
0
            tvb, 4, 7, ett_ubx_nav_pvt_datetime, NULL,
1496
0
            "Date/time: %04d-%02d-%02d %02d:%02d:%02d",
1497
0
            year, month, day, hour, min, sec);
1498
0
    proto_tree_add_item(datetime_tree, hf_ubx_nav_pvt_year,
1499
0
            tvb, 4, 2, ENC_LITTLE_ENDIAN);
1500
0
    proto_tree_add_item(datetime_tree, hf_ubx_nav_pvt_month,
1501
0
            tvb, 6, 1, ENC_NA);
1502
0
    proto_tree_add_item(datetime_tree, hf_ubx_nav_pvt_day,
1503
0
            tvb, 7, 1, ENC_NA);
1504
0
    proto_tree_add_item(datetime_tree, hf_ubx_nav_pvt_hour,
1505
0
            tvb, 8, 1, ENC_NA);
1506
0
    proto_tree_add_item(datetime_tree, hf_ubx_nav_pvt_min,
1507
0
            tvb, 9, 1, ENC_NA);
1508
0
    proto_tree_add_item(datetime_tree, hf_ubx_nav_pvt_sec,
1509
0
            tvb, 10, 1, ENC_NA);
1510
1511
0
    proto_tree_add_bitmask(ubx_nav_pvt_tree, tvb, 11, hf_ubx_nav_pvt_valid,
1512
0
            ett_ubx_nav_pvt_valid, ubx_nav_pvt_valid_fields, ENC_NA);
1513
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_tacc,
1514
0
            tvb, 12, 4, ENC_LITTLE_ENDIAN);
1515
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_nano,
1516
0
            tvb, 16, 4, ENC_LITTLE_ENDIAN);
1517
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_fixtype,
1518
0
            tvb, 20, 1, ENC_NA);
1519
0
    proto_tree_add_bitmask(ubx_nav_pvt_tree, tvb, 21, hf_ubx_nav_pvt_flags,
1520
0
            ett_ubx_nav_pvt_flags, ubx_nav_pvt_flags_fields, ENC_NA);
1521
0
    proto_tree_add_bitmask(ubx_nav_pvt_tree, tvb, 22, hf_ubx_nav_pvt_flags2,
1522
0
            ett_ubx_nav_pvt_flags2, ubx_nav_pvt_flags2_fields, ENC_NA);
1523
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_numsv,
1524
0
            tvb, 23, 1, ENC_NA);
1525
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_lon,
1526
0
            tvb, 24, 4, ENC_LITTLE_ENDIAN);
1527
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_lat,
1528
0
            tvb, 28, 4, ENC_LITTLE_ENDIAN);
1529
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_height,
1530
0
            tvb, 32, 4, ENC_LITTLE_ENDIAN);
1531
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_hmsl,
1532
0
            tvb, 36, 4, ENC_LITTLE_ENDIAN);
1533
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_hacc,
1534
0
            tvb, 40, 4, ENC_LITTLE_ENDIAN);
1535
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_vacc,
1536
0
            tvb, 44, 4, ENC_LITTLE_ENDIAN);
1537
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_veln,
1538
0
            tvb, 48, 4, ENC_LITTLE_ENDIAN);
1539
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_vele,
1540
0
            tvb, 52, 4, ENC_LITTLE_ENDIAN);
1541
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_veld,
1542
0
            tvb, 56, 4, ENC_LITTLE_ENDIAN);
1543
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_gspeed,
1544
0
            tvb, 60, 4, ENC_LITTLE_ENDIAN);
1545
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_headmot,
1546
0
            tvb, 64, 4, ENC_LITTLE_ENDIAN);
1547
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_sacc,
1548
0
            tvb, 68, 4, ENC_LITTLE_ENDIAN);
1549
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_headacc,
1550
0
            tvb, 72, 4, ENC_LITTLE_ENDIAN);
1551
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_pdop,
1552
0
            tvb, 76, 2, ENC_LITTLE_ENDIAN);
1553
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_invalidllh,
1554
0
            tvb, 78, 2, ENC_LITTLE_ENDIAN);
1555
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_lastcorrectionage,
1556
0
            tvb, 78, 2, ENC_LITTLE_ENDIAN);
1557
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_reserved1,
1558
0
            tvb, 80, 4, ENC_LITTLE_ENDIAN);
1559
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_headveh,
1560
0
            tvb, 84, 4, ENC_LITTLE_ENDIAN);
1561
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_magdec,
1562
0
            tvb, 88, 2, ENC_LITTLE_ENDIAN);
1563
0
    proto_tree_add_item(ubx_nav_pvt_tree, hf_ubx_nav_pvt_magacc,
1564
0
            tvb, 90, 2, ENC_LITTLE_ENDIAN);
1565
1566
0
    return tvb_captured_length(tvb);
1567
0
}
1568
1569
0
static int dissect_ubx_nav_relposned(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1570
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-NAV-RELPOSNED");
1571
0
    col_clear(pinfo->cinfo, COL_INFO);
1572
1573
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_nav_relposned,
1574
0
            tvb, 0, 64, ENC_NA);
1575
0
    proto_tree *ubx_nav_relposned_tree = proto_item_add_subtree(ti, ett_ubx_nav_relposned);
1576
1577
    // dissect the registered fields
1578
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_version,
1579
0
            tvb, 0, 1, ENC_LITTLE_ENDIAN);
1580
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_reserved0,
1581
0
            tvb, 1, 1, ENC_LITTLE_ENDIAN);
1582
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_refstationid,
1583
0
            tvb, 2, 2, ENC_LITTLE_ENDIAN);
1584
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_itow,
1585
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1586
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_relposn,
1587
0
            tvb, 8, 4, ENC_LITTLE_ENDIAN);
1588
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_relpose,
1589
0
            tvb, 12, 4, ENC_LITTLE_ENDIAN);
1590
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_relposd,
1591
0
            tvb, 16, 4, ENC_LITTLE_ENDIAN);
1592
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_relposlength,
1593
0
            tvb, 20, 4, ENC_LITTLE_ENDIAN);
1594
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_relposheading,
1595
0
            tvb, 24, 4, ENC_LITTLE_ENDIAN);
1596
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_reserved1,
1597
0
            tvb, 28, 4, ENC_LITTLE_ENDIAN);
1598
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_relposhpn,
1599
0
            tvb, 32, 1, ENC_LITTLE_ENDIAN);
1600
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_relposhpe,
1601
0
            tvb, 33, 1, ENC_LITTLE_ENDIAN);
1602
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_relposhpd,
1603
0
            tvb, 34, 1, ENC_LITTLE_ENDIAN);
1604
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_relposhplength,
1605
0
            tvb, 35, 1, ENC_LITTLE_ENDIAN);
1606
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_accn,
1607
0
            tvb, 36, 4, ENC_LITTLE_ENDIAN);
1608
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_acce,
1609
0
            tvb, 40, 4, ENC_LITTLE_ENDIAN);
1610
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_accd,
1611
0
            tvb, 44, 4, ENC_LITTLE_ENDIAN);
1612
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_acclength,
1613
0
            tvb, 48, 4, ENC_LITTLE_ENDIAN);
1614
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_accheading,
1615
0
            tvb, 52, 4, ENC_LITTLE_ENDIAN);
1616
0
    proto_tree_add_item(ubx_nav_relposned_tree, hf_ubx_nav_relposned_reserved2,
1617
0
            tvb, 56, 4, ENC_LITTLE_ENDIAN);
1618
0
    proto_tree_add_bitmask(ubx_nav_relposned_tree, tvb, 60, hf_ubx_nav_relposned_flags,
1619
0
            ett_ubx_nav_relposned_flags, ubx_nav_relposned_flags_fields, ENC_LITTLE_ENDIAN);
1620
1621
0
    gint64 relposn_full = (gint64)tvb_get_int32(tvb, 8, ENC_LITTLE_ENDIAN) * 100 + tvb_get_int8(tvb, 32);
1622
0
    gint64 relpose_full = (gint64)tvb_get_int32(tvb, 12, ENC_LITTLE_ENDIAN) * 100 + tvb_get_int8(tvb, 33);
1623
0
    gint64 relposd_full = (gint64)tvb_get_int32(tvb, 16, ENC_LITTLE_ENDIAN) * 100 + tvb_get_int8(tvb, 34);
1624
0
    gint64 relposlength_full = (gint64)tvb_get_int32(tvb, 20, ENC_LITTLE_ENDIAN) * 100 + tvb_get_int8(tvb, 35);
1625
1626
0
    proto_item *ti_n;
1627
0
    proto_item *ti_e;
1628
0
    proto_item *ti_d;
1629
0
    proto_item *ti_length;
1630
0
    ti_n = proto_tree_add_int64(ubx_nav_relposned_tree, hf_ubx_nav_relposned_relposn_full, tvb, 8, 0, relposn_full);
1631
0
    proto_item_set_generated(ti_n);
1632
0
    ti_e = proto_tree_add_int64(ubx_nav_relposned_tree, hf_ubx_nav_relposned_relpose_full, tvb, 12, 0, relpose_full);
1633
0
    proto_item_set_generated(ti_e);
1634
0
    ti_d = proto_tree_add_int64(ubx_nav_relposned_tree, hf_ubx_nav_relposned_relposd_full, tvb, 16, 0, relposd_full);
1635
0
    proto_item_set_generated(ti_d);
1636
0
    ti_length = proto_tree_add_int64(ubx_nav_relposned_tree, hf_ubx_nav_relposned_relposlength_full, tvb, 20, 0, relposlength_full);
1637
0
    proto_item_set_generated(ti_length);
1638
1639
0
    return tvb_captured_length(tvb);
1640
0
}
1641
1642
/* Dissect UBX-NAV-SAT message */
1643
0
static int dissect_ubx_nav_sat(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1644
0
    uint32_t num_svs;
1645
1646
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-NAV-SAT");
1647
0
    col_clear(pinfo->cinfo, COL_INFO);
1648
1649
0
    num_svs = tvb_get_uint8(tvb, 5);
1650
1651
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_nav_sat,
1652
0
            tvb, 0, 8 + 12 * num_svs, ENC_NA);
1653
0
    proto_tree *ubx_nav_sat_tree = proto_item_add_subtree(ti, ett_ubx_nav_sat);
1654
1655
    // dissect the registered fields
1656
0
    proto_tree_add_item(ubx_nav_sat_tree, hf_ubx_nav_sat_itow,
1657
0
            tvb, 0, 4, ENC_LITTLE_ENDIAN);
1658
0
    proto_tree_add_item(ubx_nav_sat_tree, hf_ubx_nav_sat_version,
1659
0
            tvb, 4, 1, ENC_NA);
1660
0
    proto_tree_add_item(ubx_nav_sat_tree, hf_ubx_nav_sat_num_svs,
1661
0
            tvb, 5, 1, ENC_NA);
1662
0
    proto_tree_add_item(ubx_nav_sat_tree, hf_ubx_nav_sat_reserved1,
1663
0
            tvb, 6, 2, ENC_LITTLE_ENDIAN);
1664
1665
0
    for (unsigned i = 0; i < num_svs; i++) {
1666
0
        const uint8_t gnss_id = tvb_get_uint8(tvb, 8 + 12 * i);
1667
0
        const uint8_t sv_id = tvb_get_uint8(tvb, 9 + 12 * i);
1668
0
        const uint32_t used = (tvb_get_uint32(tvb, 16 + 12 * i, ENC_LITTLE_ENDIAN) & 0x0008) >> 3;
1669
1670
0
        proto_tree *sv_info_tree = proto_tree_add_subtree_format(ubx_nav_sat_tree,
1671
0
                tvb, 8 + 12 * i, 12, ett_ubx_nav_sat_sv_info[i], NULL,
1672
0
                "%-7s / SV ID %3d, used %d",
1673
0
                val_to_str_const(gnss_id, UBX_GNSS_ID, "Unknown GNSS ID"),
1674
0
                sv_id, used);
1675
1676
0
        proto_tree_add_item(sv_info_tree, hf_ubx_nav_sat_gnss_id,
1677
0
            tvb,  8 + (12 * i), 1, ENC_NA);
1678
0
        proto_tree_add_item(sv_info_tree, hf_ubx_nav_sat_sv_id,
1679
0
            tvb,  9 + (12 * i), 1, ENC_NA);
1680
0
        proto_tree_add_item(sv_info_tree, hf_ubx_nav_sat_cn0,
1681
0
            tvb, 10 + (12 * i), 1, ENC_NA);
1682
0
        proto_tree_add_item(sv_info_tree, hf_ubx_nav_sat_elev,
1683
0
            tvb, 11 + (12 * i), 1, ENC_NA);
1684
0
        proto_tree_add_item(sv_info_tree, hf_ubx_nav_sat_azim,
1685
0
            tvb, 12 + (12 * i), 2, ENC_LITTLE_ENDIAN);
1686
0
        proto_tree_add_item(sv_info_tree, hf_ubx_nav_sat_pr_res,
1687
0
            tvb, 14 + (12 * i), 2, ENC_LITTLE_ENDIAN);
1688
0
        proto_tree_add_bitmask(sv_info_tree,
1689
0
            tvb, 16 + (12 * i),
1690
0
            hf_ubx_nav_sat_flags, ett_ubx_nav_sat_flags,
1691
0
            ubx_nav_sat_flags_fields, ENC_LITTLE_ENDIAN);
1692
0
    }
1693
1694
0
    return tvb_captured_length(tvb);
1695
0
}
1696
1697
/* Dissect UBX-NAV-SBAS message */
1698
0
static int dissect_ubx_nav_sbas(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1699
0
    uint32_t num_svs;
1700
1701
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-NAV-SBAS");
1702
0
    col_clear(pinfo->cinfo, COL_INFO);
1703
1704
0
    num_svs = tvb_get_uint8(tvb, 8);
1705
1706
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_nav_sbas,
1707
0
            tvb, 0, 12 + 12 * num_svs, ENC_NA);
1708
0
    proto_tree *ubx_nav_sbas_tree = proto_item_add_subtree(ti, ett_ubx_nav_sbas);
1709
1710
0
    proto_tree_add_item(ubx_nav_sbas_tree, hf_ubx_nav_sbas_itow,
1711
0
            tvb, 0, 4, ENC_LITTLE_ENDIAN);
1712
0
    proto_tree_add_item(ubx_nav_sbas_tree, hf_ubx_nav_sbas_geo,
1713
0
            tvb, 4, 1, ENC_NA);
1714
0
    proto_tree_add_item(ubx_nav_sbas_tree, hf_ubx_nav_sbas_mode,
1715
0
            tvb, 5, 1, ENC_NA);
1716
0
    proto_tree_add_item(ubx_nav_sbas_tree, hf_ubx_nav_sbas_sys,
1717
0
            tvb, 6, 1, ENC_NA);
1718
0
    proto_tree_add_bitmask(ubx_nav_sbas_tree, tvb, 7, hf_ubx_nav_sbas_service,
1719
0
            ett_ubx_nav_sbas_service, ubx_nav_sbas_service_fields, ENC_NA);
1720
0
    proto_tree_add_item(ubx_nav_sbas_tree, hf_ubx_nav_sbas_cnt,
1721
0
            tvb, 8, 1, ENC_NA);
1722
0
    proto_tree_add_item(ubx_nav_sbas_tree, hf_ubx_nav_sbas_reserved1,
1723
0
            tvb, 9, 3, ENC_LITTLE_ENDIAN);
1724
1725
0
    for (unsigned i = 0; i < num_svs; i++) {
1726
0
        const uint8_t sv_id = tvb_get_uint8(tvb, 12 + 12 * i);
1727
1728
0
        proto_tree *sv_info_tree = proto_tree_add_subtree_format(ubx_nav_sbas_tree,
1729
0
                tvb, 12 + (12 * i), 12, ett_ubx_nav_sbas_sv_info[i], NULL,
1730
0
                "SV ID %3d", sv_id);
1731
1732
0
        proto_tree_add_item(sv_info_tree, hf_ubx_nav_sbas_sv_id,
1733
0
            tvb,  12 + (12 * i), 1, ENC_NA);
1734
0
        proto_tree_add_item(sv_info_tree, hf_ubx_nav_sbas_flags,
1735
0
            tvb,  13 + (12 * i), 1, ENC_NA);
1736
0
        proto_tree_add_item(sv_info_tree, hf_ubx_nav_sbas_udre,
1737
0
            tvb,  14 + (12 * i), 1, ENC_NA);
1738
0
        proto_tree_add_item(sv_info_tree, hf_ubx_nav_sbas_sv_sys,
1739
0
            tvb,  15 + (12 * i), 1, ENC_NA);
1740
0
        proto_tree_add_item(sv_info_tree, hf_ubx_nav_sbas_sv_service,
1741
0
            tvb,  16 + (12 * i), 1, ENC_NA);
1742
0
        proto_tree_add_item(sv_info_tree, hf_ubx_nav_sbas_reserved2,
1743
0
            tvb,  17 + (12 * i), 1, ENC_NA);
1744
0
        proto_tree_add_item(sv_info_tree, hf_ubx_nav_sbas_prc,
1745
0
            tvb,  18 + (12 * i), 2, ENC_LITTLE_ENDIAN);
1746
0
        proto_tree_add_item(sv_info_tree, hf_ubx_nav_sbas_reserved3,
1747
0
            tvb,  20 + (12 * i), 2, ENC_LITTLE_ENDIAN);
1748
0
        proto_tree_add_item(sv_info_tree, hf_ubx_nav_sbas_ic,
1749
0
            tvb,  22 + (12 * i), 2, ENC_LITTLE_ENDIAN);
1750
0
    }
1751
1752
0
    return tvb_captured_length(tvb);
1753
0
}
1754
1755
/* Dissect UBX-NAV-TIMEGPS message */
1756
0
static int dissect_ubx_nav_timegps(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1757
0
    uint32_t itow;
1758
0
    int32_t ftow;
1759
1760
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-NAV-TIMEGPS");
1761
0
    col_clear(pinfo->cinfo, COL_INFO);
1762
1763
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_nav_timegps,
1764
0
            tvb, 0, 16, ENC_NA);
1765
0
    proto_tree *ubx_nav_timegps_tree = proto_item_add_subtree(ti, ett_ubx_nav_timegps);
1766
1767
    // dissect the registered fields
1768
0
    itow = tvb_get_uint32(tvb, 0, ENC_LITTLE_ENDIAN);
1769
0
    ftow = tvb_get_int32(tvb, 4, ENC_LITTLE_ENDIAN);
1770
0
    ftow = (itow % 1000) * 1000000 + ftow;
1771
0
    itow = itow / 1000;
1772
0
    if (ftow < 0) {
1773
0
        itow = itow - 1;
1774
0
        ftow = 1000000000 + ftow;
1775
0
    }
1776
0
    proto_tree *tow_tree = proto_tree_add_subtree_format(ubx_nav_timegps_tree,
1777
0
            tvb, 0, 8, ett_ubx_nav_timegps_tow, NULL, "TOW: %d.%09ds", itow, ftow);
1778
0
    proto_tree_add_item(tow_tree, hf_ubx_nav_timegps_itow,
1779
0
            tvb, 0, 4, ENC_LITTLE_ENDIAN);
1780
0
    proto_tree_add_item(tow_tree, hf_ubx_nav_timegps_ftow,
1781
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1782
1783
0
    proto_tree_add_item(ubx_nav_timegps_tree, hf_ubx_nav_timegps_week,
1784
0
            tvb, 8, 2, ENC_LITTLE_ENDIAN);
1785
0
    proto_tree_add_item(ubx_nav_timegps_tree, hf_ubx_nav_timegps_leaps,
1786
0
            tvb, 10, 1, ENC_NA);
1787
0
    proto_tree_add_bitmask(ubx_nav_timegps_tree, tvb, 11,
1788
0
            hf_ubx_nav_timegps_valid, ett_ubx_nav_timegps_valid,
1789
0
            ubx_nav_timegps_valid_fields, ENC_NA);
1790
0
    proto_tree_add_item(ubx_nav_timegps_tree, hf_ubx_nav_timegps_tacc,
1791
0
            tvb, 12, 4, ENC_LITTLE_ENDIAN);
1792
1793
0
    return tvb_captured_length(tvb);
1794
0
}
1795
1796
/* Dissect UBX-NAV-TIMEUTC message */
1797
0
static int dissect_ubx_nav_timeutc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1798
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-NAV-TIMEUTC");
1799
0
    col_clear(pinfo->cinfo, COL_INFO);
1800
1801
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_nav_timeutc,
1802
0
            tvb, 0, 20, ENC_NA);
1803
0
    proto_tree *ubx_nav_timeutc_tree = proto_item_add_subtree(ti, ett_ubx_nav_timeutc);
1804
1805
0
    proto_tree_add_item(ubx_nav_timeutc_tree, hf_ubx_nav_timeutc_itow,
1806
0
            tvb, 0, 4, ENC_LITTLE_ENDIAN);
1807
0
    proto_tree_add_item(ubx_nav_timeutc_tree, hf_ubx_nav_timeutc_tacc,
1808
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1809
0
    proto_tree_add_item(ubx_nav_timeutc_tree, hf_ubx_nav_timeutc_nano,
1810
0
            tvb, 8, 4, ENC_LITTLE_ENDIAN);
1811
0
    proto_tree_add_item(ubx_nav_timeutc_tree, hf_ubx_nav_timeutc_year,
1812
0
            tvb, 12, 2, ENC_LITTLE_ENDIAN);
1813
0
    proto_tree_add_item(ubx_nav_timeutc_tree, hf_ubx_nav_timeutc_month,
1814
0
            tvb, 14, 1, ENC_NA);
1815
0
    proto_tree_add_item(ubx_nav_timeutc_tree, hf_ubx_nav_timeutc_day,
1816
0
            tvb, 15, 1, ENC_NA);
1817
0
    proto_tree_add_item(ubx_nav_timeutc_tree, hf_ubx_nav_timeutc_hour,
1818
0
            tvb, 16, 1, ENC_NA);
1819
0
    proto_tree_add_item(ubx_nav_timeutc_tree, hf_ubx_nav_timeutc_min,
1820
0
            tvb, 17, 1, ENC_NA);
1821
0
    proto_tree_add_item(ubx_nav_timeutc_tree, hf_ubx_nav_timeutc_sec,
1822
0
            tvb, 18, 1, ENC_NA);
1823
0
    proto_tree_add_bitmask(ubx_nav_timeutc_tree, tvb, 19,
1824
0
            hf_ubx_nav_timeutc_valid, ett_ubx_nav_timeutc_valid,
1825
0
            ubx_nav_timeutc_valid_fields, ENC_NA);
1826
1827
0
    return tvb_captured_length(tvb);
1828
0
}
1829
1830
/* Dissect UBX-NAV-VELECEF message */
1831
0
static int dissect_ubx_nav_velecef(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1832
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-NAV-VELECEF");
1833
0
    col_clear(pinfo->cinfo, COL_INFO);
1834
1835
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_nav_velecef,
1836
0
            tvb, 0, 20, ENC_NA);
1837
0
    proto_tree *ubx_nav_velecef_tree = proto_item_add_subtree(ti, ett_ubx_nav_velecef);
1838
1839
    // dissect the registered fields
1840
0
    proto_tree_add_item(ubx_nav_velecef_tree, hf_ubx_nav_velecef_itow,
1841
0
            tvb, 0, 4, ENC_LITTLE_ENDIAN);
1842
0
    proto_tree_add_item(ubx_nav_velecef_tree, hf_ubx_nav_velecef_ecefvx,
1843
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1844
0
    proto_tree_add_item(ubx_nav_velecef_tree, hf_ubx_nav_velecef_ecefvy,
1845
0
            tvb, 8, 4, ENC_LITTLE_ENDIAN);
1846
0
    proto_tree_add_item(ubx_nav_velecef_tree, hf_ubx_nav_velecef_ecefvz,
1847
0
            tvb, 12, 4, ENC_LITTLE_ENDIAN);
1848
0
    proto_tree_add_item(ubx_nav_velecef_tree, hf_ubx_nav_velecef_sacc,
1849
0
            tvb, 16, 4, ENC_LITTLE_ENDIAN);
1850
1851
0
    return tvb_captured_length(tvb);
1852
0
}
1853
1854
/* Dissect UBX-RXM-MEASX message */
1855
0
static int dissect_ubx_rxm_measx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1856
0
    uint32_t i, numsv;
1857
1858
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-RXM-MEASX");
1859
0
    col_clear(pinfo->cinfo, COL_INFO);
1860
1861
0
    numsv = tvb_get_uint8(tvb, 34);
1862
1863
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_rxm_measx,
1864
0
            tvb, 0, 44 + numsv * 24, ENC_NA);
1865
0
    proto_tree *ubx_rxm_measx_tree = proto_item_add_subtree(ti, ett_ubx_rxm_measx);
1866
1867
0
    proto_tree_add_item(ubx_rxm_measx_tree, hf_ubx_rxm_measx_version,
1868
0
            tvb, 0, 1, ENC_NA);
1869
0
    proto_tree_add_item(ubx_rxm_measx_tree, hf_ubx_rxm_measx_reserved1,
1870
0
            tvb, 1, 3, ENC_LITTLE_ENDIAN);
1871
0
    proto_tree_add_item(ubx_rxm_measx_tree, hf_ubx_rxm_measx_gpstow,
1872
0
            tvb, 4, 4, ENC_LITTLE_ENDIAN);
1873
0
    proto_tree_add_item(ubx_rxm_measx_tree, hf_ubx_rxm_measx_glotow,
1874
0
            tvb, 8, 4, ENC_LITTLE_ENDIAN);
1875
0
    proto_tree_add_item(ubx_rxm_measx_tree, hf_ubx_rxm_measx_bdstow,
1876
0
            tvb, 12, 4, ENC_LITTLE_ENDIAN);
1877
0
    proto_tree_add_item(ubx_rxm_measx_tree, hf_ubx_rxm_measx_reserved2,
1878
0
            tvb, 16, 4, ENC_LITTLE_ENDIAN);
1879
0
    proto_tree_add_item(ubx_rxm_measx_tree, hf_ubx_rxm_measx_qzsstow,
1880
0
            tvb, 20, 4, ENC_LITTLE_ENDIAN);
1881
0
    proto_tree_add_item(ubx_rxm_measx_tree, hf_ubx_rxm_measx_gpstowacc,
1882
0
            tvb, 24, 2, ENC_LITTLE_ENDIAN);
1883
0
    proto_tree_add_item(ubx_rxm_measx_tree, hf_ubx_rxm_measx_glotowacc,
1884
0
            tvb, 26, 2, ENC_LITTLE_ENDIAN);
1885
0
    proto_tree_add_item(ubx_rxm_measx_tree, hf_ubx_rxm_measx_bdstowacc,
1886
0
            tvb, 28, 2, ENC_LITTLE_ENDIAN);
1887
0
    proto_tree_add_item(ubx_rxm_measx_tree, hf_ubx_rxm_measx_reserved3,
1888
0
            tvb, 30, 2, ENC_LITTLE_ENDIAN);
1889
0
    proto_tree_add_item(ubx_rxm_measx_tree, hf_ubx_rxm_measx_qzsstowacc,
1890
0
            tvb, 32, 2, ENC_LITTLE_ENDIAN);
1891
0
    proto_tree_add_item(ubx_rxm_measx_tree, hf_ubx_rxm_measx_numsv,
1892
0
            tvb, 34, 1, ENC_NA);
1893
0
    proto_tree_add_item(ubx_rxm_measx_tree, hf_ubx_rxm_measx_flags_towset,
1894
0
            tvb, 35, 1, ENC_NA);
1895
0
    proto_tree_add_item(ubx_rxm_measx_tree, hf_ubx_rxm_measx_reserved4,
1896
0
            tvb, 36, 8, ENC_LITTLE_ENDIAN);
1897
1898
0
    for (i = 0; i < numsv; i++) {
1899
0
        const uint8_t gnss_id = tvb_get_uint8(tvb, 44 + 24 * i);
1900
0
        const uint8_t sv_id = tvb_get_uint8(tvb, 45 + 24 * i);
1901
0
        const uint8_t cn0 = tvb_get_uint8(tvb, 46 + 24 * i);
1902
1903
0
        proto_tree *meas_tree = proto_tree_add_subtree_format(ubx_rxm_measx_tree,
1904
0
                tvb, 44 + 24 * i, 24, ett_ubx_rxm_measx_meas[i], NULL,
1905
0
                "%-7s / SV ID %3d / C/N0 %d dB-Hz",
1906
0
                val_to_str_const(gnss_id, UBX_GNSS_ID, "Unknown GNSS ID"),
1907
0
                sv_id, cn0);
1908
1909
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_measx_gnssid,
1910
0
                tvb, 44 + 24 * i, 1, ENC_NA);
1911
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_measx_svid,
1912
0
                tvb, 45 + 24 * i, 1, ENC_NA);
1913
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_measx_cn0,
1914
0
                tvb, 46 + 24 * i, 1, ENC_NA);
1915
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_measx_mpathindic,
1916
0
                tvb, 47 + 24 * i, 1, ENC_NA);
1917
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_measx_dopplerms,
1918
0
                tvb, 48 + 24 * i, 4, ENC_LITTLE_ENDIAN);
1919
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_measx_dopplerhz,
1920
0
                tvb, 52 + 24 * i, 4, ENC_LITTLE_ENDIAN);
1921
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_measx_wholechips,
1922
0
                tvb, 56 + 24 * i, 2, ENC_LITTLE_ENDIAN);
1923
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_measx_fracchips,
1924
0
                tvb, 58 + 24 * i, 2, ENC_LITTLE_ENDIAN);
1925
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_measx_codephase,
1926
0
                tvb, 60 + 24 * i, 4, ENC_LITTLE_ENDIAN);
1927
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_measx_intcodephase,
1928
0
                tvb, 64 + 24 * i, 1, ENC_NA);
1929
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_measx_pseurangermserr,
1930
0
                tvb, 65 + 24 * i, 1, ENC_NA);
1931
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_measx_reserved5,
1932
0
                tvb, 66 + 24 * i, 2, ENC_LITTLE_ENDIAN);
1933
0
    }
1934
1935
0
    return tvb_captured_length(tvb);
1936
0
}
1937
1938
/* Dissect UBX-RXM-RAWX message */
1939
0
static int dissect_ubx_rxm_rawx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
1940
0
    uint32_t i, nummeas;
1941
1942
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-RXM-RAWX");
1943
0
    col_clear(pinfo->cinfo, COL_INFO);
1944
1945
0
    nummeas = tvb_get_uint8(tvb, 11);
1946
1947
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_rxm_rawx,
1948
0
            tvb, 0, 16 + nummeas * 32, ENC_NA);
1949
0
    proto_tree *ubx_rxm_rawx_tree = proto_item_add_subtree(ti, ett_ubx_rxm_rawx);
1950
1951
0
    proto_tree_add_item(ubx_rxm_rawx_tree, hf_ubx_rxm_rawx_rcvtow,
1952
0
            tvb, 0, 8, ENC_LITTLE_ENDIAN);
1953
0
    proto_tree_add_item(ubx_rxm_rawx_tree, hf_ubx_rxm_rawx_week,
1954
0
            tvb, 8, 2, ENC_LITTLE_ENDIAN);
1955
0
    proto_tree_add_item(ubx_rxm_rawx_tree, hf_ubx_rxm_rawx_leaps,
1956
0
            tvb, 10, 1, ENC_NA);
1957
0
    proto_tree_add_item(ubx_rxm_rawx_tree, hf_ubx_rxm_rawx_nummeas,
1958
0
            tvb, 11, 1, ENC_NA);
1959
0
    proto_tree_add_bitmask(ubx_rxm_rawx_tree, tvb, 12,
1960
0
            hf_ubx_rxm_rawx_recstat, ett_ubx_rxm_rawx_recstat,
1961
0
            ubx_rxm_rawx_recstat_fields, ENC_NA);
1962
0
    proto_tree_add_item(ubx_rxm_rawx_tree, hf_ubx_rxm_rawx_version,
1963
0
            tvb, 13, 1, ENC_NA);
1964
0
    proto_tree_add_item(ubx_rxm_rawx_tree, hf_ubx_rxm_rawx_reserved1,
1965
0
            tvb, 14, 2, ENC_LITTLE_ENDIAN);
1966
1967
0
    for (i = 0; i < nummeas; i++) {
1968
0
        const uint8_t gnss_id = tvb_get_uint8(tvb, 36 + 32 * i);
1969
0
        const uint8_t sv_id = tvb_get_uint8(tvb, 37 + 32 * i);
1970
0
        const uint8_t cn0 = tvb_get_uint8(tvb, 42 + 32 * i);
1971
1972
0
        proto_tree *meas_tree = proto_tree_add_subtree_format(ubx_rxm_rawx_tree,
1973
0
                tvb, 16 + 32 * i, 32, ett_ubx_rxm_rawx_meas[i], NULL,
1974
0
                "%-7s / SV ID %3d / C/N0 %d dB-Hz",
1975
0
                val_to_str_const(gnss_id, UBX_GNSS_ID, "Unknown GNSS ID"),
1976
0
                sv_id, cn0);
1977
1978
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_rawx_prmes,
1979
0
                tvb, 16 + (32 * i), 8, ENC_LITTLE_ENDIAN);
1980
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_rawx_cpmes,
1981
0
                tvb, 24 + (32 * i), 8, ENC_LITTLE_ENDIAN);
1982
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_rawx_domes,
1983
0
                tvb, 32 + (32 * i), 4, ENC_LITTLE_ENDIAN);
1984
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_rawx_gnssid,
1985
0
                tvb, 36 + (32 * i), 1, ENC_NA);
1986
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_rawx_svid,
1987
0
                tvb, 37 + (32 * i), 1, ENC_NA);
1988
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_rawx_sigid,
1989
0
                tvb, 38 + (32 * i), 1, ENC_NA);
1990
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_rawx_freqid,
1991
0
                tvb, 39 + (32 * i), 1, ENC_NA);
1992
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_rawx_locktime,
1993
0
                tvb, 40 + (32 * i), 2, ENC_LITTLE_ENDIAN);
1994
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_rawx_cn0,
1995
0
                tvb, 42 + (32 * i), 1, ENC_NA);
1996
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_rawx_prstdev,
1997
0
                tvb, 43 + (32 * i), 1, ENC_NA);
1998
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_rawx_cpstdev,
1999
0
                tvb, 44 + (32 * i), 1, ENC_NA);
2000
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_rawx_dostdev,
2001
0
                tvb, 45 + (32 * i), 1, ENC_NA);
2002
0
        proto_tree_add_bitmask(meas_tree,
2003
0
                tvb, 46 + (32 * i),
2004
0
                hf_ubx_rxm_rawx_trkstat, ett_ubx_rxm_rawx_trkstat,
2005
0
                ubx_rxm_rawx_trkstat_fields, ENC_NA);
2006
0
        proto_tree_add_item(meas_tree, hf_ubx_rxm_rawx_reserved2,
2007
0
                tvb, 47 + (32 * i), 1, ENC_NA);
2008
0
    }
2009
2010
0
    return tvb_captured_length(tvb);
2011
0
}
2012
2013
/* Dissect UBX-RXM-SFRBX message */
2014
0
static int dissect_ubx_rxm_sfrbx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
2015
0
    tvbuff_t *next_tvb;
2016
0
    uint8_t *buf;
2017
0
    uint32_t gnssid, numwords, version;
2018
2019
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "UBX-RXM-SFRBX");
2020
0
    col_clear(pinfo->cinfo, COL_INFO);
2021
2022
    // get length of the payload and protocol version
2023
0
    numwords = tvb_get_uint8(tvb, 4);
2024
0
    version = tvb_get_uint8(tvb, 6);
2025
2026
0
    proto_item *ti = proto_tree_add_item(tree, hf_ubx_rxm_sfrbx,
2027
0
            tvb, 0, 8 + numwords * 4, ENC_NA);
2028
0
    proto_tree *ubx_rxm_sfrbx_tree = proto_item_add_subtree(ti, ett_ubx_rxm_sfrbx);
2029
2030
0
    proto_tree_add_item_ret_uint(ubx_rxm_sfrbx_tree, hf_ubx_rxm_sfrbx_gnssid,
2031
0
            tvb, 0, 1, ENC_NA, &gnssid);
2032
0
    proto_tree_add_item(ubx_rxm_sfrbx_tree, hf_ubx_rxm_sfrbx_svid,
2033
0
            tvb, 1, 1, ENC_NA);
2034
0
    switch(version) {
2035
0
        case 0x01: proto_tree_add_item(ubx_rxm_sfrbx_tree,
2036
0
                           hf_ubx_rxm_sfrbx_reserved1, tvb, 2, 1, ENC_NA);
2037
0
                   break;
2038
0
        case 0x02: proto_tree_add_item(ubx_rxm_sfrbx_tree,
2039
0
                           hf_ubx_rxm_sfrbx_sigid, tvb, 2, 1, ENC_NA);
2040
0
                   break;
2041
0
    }
2042
0
    proto_tree_add_item(ubx_rxm_sfrbx_tree, hf_ubx_rxm_sfrbx_freqid,
2043
0
            tvb, 3, 1, ENC_NA);
2044
0
    proto_tree_add_item(ubx_rxm_sfrbx_tree, hf_ubx_rxm_sfrbx_numwords,
2045
0
            tvb, 4, 1, ENC_NA);
2046
0
    switch(version) {
2047
0
        case 0x01: proto_tree_add_item(ubx_rxm_sfrbx_tree,
2048
0
                           hf_ubx_rxm_sfrbx_reserved2, tvb, 5, 1, ENC_NA);
2049
0
                   break;
2050
0
        case 0x02: proto_tree_add_item(ubx_rxm_sfrbx_tree,
2051
0
                           hf_ubx_rxm_sfrbx_chn, tvb, 5, 1, ENC_NA);
2052
0
                   break;
2053
0
    }
2054
0
    proto_tree_add_item(ubx_rxm_sfrbx_tree, hf_ubx_rxm_sfrbx_version,
2055
0
            tvb, 6, 1, ENC_NA);
2056
0
    switch(version) {
2057
0
        case 0x01: proto_tree_add_item(ubx_rxm_sfrbx_tree,
2058
0
                           hf_ubx_rxm_sfrbx_reserved3, tvb, 7, 1, ENC_NA);
2059
0
                   break;
2060
0
        case 0x02: proto_tree_add_item(ubx_rxm_sfrbx_tree,
2061
0
                           hf_ubx_rxm_sfrbx_reserved1, tvb, 7, 1, ENC_NA);
2062
0
                   break;
2063
0
    }
2064
0
    proto_tree_add_item(ubx_rxm_sfrbx_tree, hf_ubx_rxm_sfrbx_dwrd,
2065
0
            tvb, 8, numwords * 4, ENC_NA);
2066
2067
0
    if (gnssid == GNSS_ID_GPS) {
2068
        // send the GPS nav msg (preprocessed by UBX) to the next dissector
2069
0
        next_tvb = tvb_new_subset_length(tvb, 8, 4 * numwords);
2070
0
    }
2071
0
    else {
2072
        // UBX-RXM-SFRBX has the nav msg encoded in little endian. As this is not
2073
        // convenient for dissection, map to big endian and add as new data source.
2074
0
        buf = wmem_alloc(pinfo->pool, numwords * 4);
2075
0
        for (unsigned i = 0; i < numwords; i++) {
2076
0
            phtonu32(buf + 4 * i, tvb_get_uint32(tvb, 8 + i * 4, ENC_LITTLE_ENDIAN));
2077
0
        }
2078
0
        next_tvb = tvb_new_child_real_data(tvb, (uint8_t *)buf, numwords * 4, numwords * 4);
2079
0
        add_new_data_source(pinfo, next_tvb, "GNSS navigation message");
2080
0
    }
2081
2082
    // send the nav msg to the next dissector
2083
0
    if (!dissector_try_uint_with_data(ubx_gnssid_dissector_table, gnssid, next_tvb, pinfo, tree, true, (void *)tvb_get_ptr(tvb, 1, 1))) {
2084
0
        call_data_dissector(next_tvb, pinfo, tree);
2085
0
    }
2086
2087
0
    return tvb_captured_length(tvb);
2088
0
}
2089
2090
16
void proto_register_ubx(void) {
2091
16
    static hf_register_info hf[] = {
2092
16
        {&hf_ubx_preamble,
2093
16
            {"Preamble", "ubx.preamble",
2094
16
                FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2095
16
        {&hf_ubx_msg_class_id,
2096
16
            {"Msg Class & ID", "ubx.msg_class_id",
2097
16
                FT_UINT16, BASE_HEX, VALS(UBX_MSG_CLASS_ID), 0x0, NULL, HFILL}},
2098
16
        {&hf_ubx_payload_len,
2099
16
            {"Payload Length", "ubx.payload_len",
2100
16
                FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2101
16
        {&hf_ubx_chksum,
2102
16
            {"Checksum", "ubx.checksum",
2103
16
                FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2104
2105
        // ACK-ACK
2106
16
        {&hf_ubx_ack_ack,
2107
16
            {"UBX-ACK-ACK", "ubx.ack.ack",
2108
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2109
16
        {&hf_ubx_ack_ack_msg_class_id,
2110
16
            {"Msg Class & ID", "ubx.ack.ack.msg_class_id",
2111
16
                FT_UINT16, BASE_HEX, VALS(UBX_MSG_CLASS_ID), 0x0, NULL, HFILL}},
2112
2113
        // ACK-NAK
2114
16
        {&hf_ubx_ack_nak,
2115
16
            {"UBX-ACK-NAK", "ubx.ack.nak",
2116
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2117
16
        {&hf_ubx_ack_nak_msg_class_id,
2118
16
            {"Msg Class & ID", "ubx.ack.nak.msg_class_id",
2119
16
                FT_UINT16, BASE_HEX, VALS(UBX_MSG_CLASS_ID), 0x0, NULL, HFILL}},
2120
2121
        // CFG-GNSS
2122
16
        {&hf_ubx_cfg_gnss,
2123
16
            {"UBX-CFG-GNSS", "ubx.cfg.gnss",
2124
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2125
16
        {&hf_ubx_cfg_gnss_version,
2126
16
            {"Version", "ubx.cfg.gnss.version",
2127
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2128
16
        {&hf_ubx_cfg_gnss_numtrkchhw,
2129
16
            {"Number of tracking channels available in hardware", "ubx.cfg.gnss.numtrkchhw",
2130
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2131
16
        {&hf_ubx_cfg_gnss_numtrkchuse,
2132
16
            {"Number of tracking channels to use", "ubx.cfg.gnss.numtrkchuse",
2133
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2134
16
        {&hf_ubx_cfg_gnss_numconfigblocks,
2135
16
            {"Number of configuration blocks following", "ubx.cfg.gnss.numconfigblocks",
2136
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2137
16
        {&hf_ubx_cfg_gnss_blk_gnssid,
2138
16
            {"GNSS ID", "ubx.cfg.gnss.gnssid",
2139
16
                FT_UINT8, BASE_DEC, VALS(UBX_GNSS_ID), 0x0, NULL, HFILL}},
2140
16
        {&hf_ubx_cfg_gnss_blk_restrkch,
2141
16
            {"Number of reserved (minimum) tracking channels", "ubx.cfg.gnss.restrkch",
2142
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2143
16
        {&hf_ubx_cfg_gnss_blk_maxtrkch,
2144
16
            {"Maximum number of tracking channels", "ubx.cfg.gnss.maxtrkch",
2145
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2146
16
        {&hf_ubx_cfg_gnss_blk_reserved1,
2147
16
            {"Reserved", "ubx.cfg.gnss.reserved1",
2148
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2149
16
        {&hf_ubx_cfg_gnss_blk_enable,
2150
16
            {"Enabled", "ubx.cfg.gnss.enabled",
2151
16
                FT_UINT32, BASE_HEX, NULL, 0x00000001, NULL, HFILL}},
2152
16
        {&hf_ubx_cfg_gnss_blk_sigcfgmask,
2153
16
            {"Signal configuration mask", "ubx.cfg.gnss.sigcfgmask",
2154
16
                FT_UINT32, BASE_HEX, NULL, 0x00ff0000, NULL, HFILL}},
2155
16
        {&hf_ubx_cfg_gnss_blk_gps_sigcfgmask,
2156
16
            {"Signal configuration mask", "ubx.cfg.gnss.sigcfgmask",
2157
16
                FT_UINT32, BASE_HEX, VALS(UBX_CFG_GNSS_GPS_SIGCFGMASK), 0x00ff0000, NULL, HFILL}},
2158
16
        {&hf_ubx_cfg_gnss_blk_sbas_sigcfgmask,
2159
16
            {"Signal configuration mask", "ubx.cfg.gnss.sigcfgmask",
2160
16
                FT_UINT32, BASE_HEX, VALS(UBX_CFG_GNSS_SBAS_SIGCFGMASK), 0x00ff0000, NULL, HFILL}},
2161
16
        {&hf_ubx_cfg_gnss_blk_gal_sigcfgmask,
2162
16
            {"Signal configuration mask", "ubx.cfg.gnss.sigcfgmask",
2163
16
                FT_UINT32, BASE_HEX, VALS(UBX_CFG_GNSS_GAL_SIGCFGMASK), 0x00ff0000, NULL, HFILL}},
2164
16
        {&hf_ubx_cfg_gnss_blk_bds_sigcfgmask,
2165
16
            {"Signal configuration mask", "ubx.cfg.gnss.sigcfgmask",
2166
16
                FT_UINT32, BASE_HEX, VALS(UBX_CFG_GNSS_BDS_SIGCFGMASK), 0x00ff0000, NULL, HFILL}},
2167
16
        {&hf_ubx_cfg_gnss_blk_imes_sigcfgmask,
2168
16
            {"Signal configuration mask", "ubx.cfg.gnss.sigcfgmask",
2169
16
                FT_UINT32, BASE_HEX, VALS(UBX_CFG_GNSS_IMES_SIGCFGMASK), 0x00ff0000, NULL, HFILL}},
2170
16
        {&hf_ubx_cfg_gnss_blk_qzss_sigcfgmask,
2171
16
            {"Signal configuration mask", "ubx.cfg.gnss.sigcfgmask",
2172
16
                FT_UINT32, BASE_HEX, VALS(UBX_CFG_GNSS_QZSS_SIGCFGMASK), 0x00ff0000, NULL, HFILL}},
2173
16
        {&hf_ubx_cfg_gnss_blk_glo_sigcfgmask,
2174
16
            {"Signal configuration mask", "ubx.cfg.gnss.sigcfgmask",
2175
16
                FT_UINT32, BASE_HEX, VALS(UBX_CFG_GNSS_GLO_SIGCFGMASK), 0x00ff0000, NULL, HFILL}},
2176
2177
        // CFG-SBAS
2178
16
        {&hf_ubx_cfg_sbas,
2179
16
            {"UBX-CFG-SBAS", "ubx.cfg.sbas",
2180
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2181
16
        {&hf_ubx_cfg_sbas_mode,
2182
16
            {"SBAS mode", "ubx.cfg.sbas.mode",
2183
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2184
16
        {&hf_ubx_cfg_sbas_mode_enabled,
2185
16
            {"SBAS enabled", "ubx.cfg.sbas.mode.enabled",
2186
16
                FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}},
2187
16
        {&hf_ubx_cfg_sbas_mode_test,
2188
16
            {"SBAS testbed", "ubx.cfg.sbas.mode.test",
2189
16
                FT_UINT8, BASE_HEX, VALS(UBX_SBAS_TESTBED), 0x02, NULL, HFILL}},
2190
16
        {&hf_ubx_cfg_sbas_usage_range,
2191
16
            {"Use SBAS GEOs as a ranging source (for navigation)", "ubx.cfg.sbas.usage.range",
2192
16
                FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL}},
2193
16
        {&hf_ubx_cfg_sbas_usage_diffcorr,
2194
16
            {"Use SBAS differential corrections", "ubx.cfg.sbas.usage.diffcorr",
2195
16
                FT_UINT8, BASE_HEX, NULL, 0x02, NULL, HFILL}},
2196
16
        {&hf_ubx_cfg_sbas_usage_integrity,
2197
16
            {"Use SBAS integrity information", "ubx.cfg.sbas.usage.integrity",
2198
16
                FT_UINT8, BASE_HEX, NULL, 0x04, NULL, HFILL}},
2199
16
        {&hf_ubx_cfg_sbas_max_sbas,
2200
16
            {"Maximum number of SBAS prioritized tracking channels to use", "ubx.cfg.sbas.maxsbas",
2201
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2202
16
        {&hf_ubx_cfg_sbas_scanmode_prn158,
2203
16
            {"PRN 158", "ubx.cfg.sbas.scanmode.prn158",
2204
16
                FT_UINT8, BASE_HEX, NULL, 0x40, NULL, HFILL}},
2205
16
        {&hf_ubx_cfg_sbas_scanmode_prn157,
2206
16
            {"PRN 157", "ubx.cfg.sbas.scanmode.prn157",
2207
16
                FT_UINT8, BASE_HEX, NULL, 0x20, NULL, HFILL}},
2208
16
        {&hf_ubx_cfg_sbas_scanmode_prn156,
2209
16
            {"PRN 156", "ubx.cfg.sbas.scanmode.prn156",
2210
16
                FT_UINT8, BASE_HEX, NULL, 0x10, NULL, HFILL}},
2211
16
        {&hf_ubx_cfg_sbas_scanmode_prn155,
2212
16
            {"PRN 155", "ubx.cfg.sbas.scanmode.prn155",
2213
16
                FT_UINT8, BASE_HEX, NULL, 0x08, NULL, HFILL}},
2214
16
        {&hf_ubx_cfg_sbas_scanmode_prn154,
2215
16
            {"PRN 154", "ubx.cfg.sbas.scanmode.prn154",
2216
16
                FT_UINT8, BASE_HEX, NULL, 0x04, NULL, HFILL}},
2217
16
        {&hf_ubx_cfg_sbas_scanmode_prn153,
2218
16
            {"PRN 153", "ubx.cfg.sbas.scanmode.prn153",
2219
16
                FT_UINT8, BASE_HEX, NULL, 0x02, NULL, HFILL}},
2220
16
        {&hf_ubx_cfg_sbas_scanmode_prn152,
2221
16
            {"PRN 152", "ubx.cfg.sbas.scanmode.prn152",
2222
16
                FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL}},
2223
16
        {&hf_ubx_cfg_sbas_scanmode_prn151,
2224
16
            {"PRN 151", "ubx.cfg.sbas.scanmode.prn151",
2225
16
                FT_UINT32, BASE_HEX, NULL, 0x80000000, NULL, HFILL}},
2226
16
        {&hf_ubx_cfg_sbas_scanmode_prn150,
2227
16
            {"PRN 150", "ubx.cfg.sbas.scanmode.prn150",
2228
16
                FT_UINT32, BASE_HEX, NULL, 0x40000000, NULL, HFILL}},
2229
16
        {&hf_ubx_cfg_sbas_scanmode_prn149,
2230
16
            {"PRN 149", "ubx.cfg.sbas.scanmode.prn149",
2231
16
                FT_UINT32, BASE_HEX, NULL, 0x20000000, NULL, HFILL}},
2232
16
        {&hf_ubx_cfg_sbas_scanmode_prn148,
2233
16
            {"PRN 148", "ubx.cfg.sbas.scanmode.prn148",
2234
16
                FT_UINT32, BASE_HEX, NULL, 0x10000000, NULL, HFILL}},
2235
16
        {&hf_ubx_cfg_sbas_scanmode_prn147,
2236
16
            {"PRN 147", "ubx.cfg.sbas.scanmode.prn147",
2237
16
                FT_UINT32, BASE_HEX, NULL, 0x08000000, NULL, HFILL}},
2238
16
        {&hf_ubx_cfg_sbas_scanmode_prn146,
2239
16
            {"PRN 146", "ubx.cfg.sbas.scanmode.prn146",
2240
16
                FT_UINT32, BASE_HEX, NULL, 0x04000000, NULL, HFILL}},
2241
16
        {&hf_ubx_cfg_sbas_scanmode_prn145,
2242
16
            {"PRN 145", "ubx.cfg.sbas.scanmode.prn145",
2243
16
                FT_UINT32, BASE_HEX, NULL, 0x02000000, NULL, HFILL}},
2244
16
        {&hf_ubx_cfg_sbas_scanmode_prn144,
2245
16
            {"PRN 144", "ubx.cfg.sbas.scanmode.prn144",
2246
16
                FT_UINT32, BASE_HEX, NULL, 0x01000000, NULL, HFILL}},
2247
16
        {&hf_ubx_cfg_sbas_scanmode_prn143,
2248
16
            {"PRN 143", "ubx.cfg.sbas.scanmode.prn143",
2249
16
                FT_UINT32, BASE_HEX, NULL, 0x00800000, NULL, HFILL}},
2250
16
        {&hf_ubx_cfg_sbas_scanmode_prn142,
2251
16
            {"PRN 142", "ubx.cfg.sbas.scanmode.prn142",
2252
16
                FT_UINT32, BASE_HEX, NULL, 0x00400000, NULL, HFILL}},
2253
16
        {&hf_ubx_cfg_sbas_scanmode_prn141,
2254
16
            {"PRN 141", "ubx.cfg.sbas.scanmode.prn141",
2255
16
                FT_UINT32, BASE_HEX, NULL, 0x00200000, NULL, HFILL}},
2256
16
        {&hf_ubx_cfg_sbas_scanmode_prn140,
2257
16
            {"PRN 140", "ubx.cfg.sbas.scanmode.prn140",
2258
16
                FT_UINT32, BASE_HEX, NULL, 0x00100000, NULL, HFILL}},
2259
16
        {&hf_ubx_cfg_sbas_scanmode_prn139,
2260
16
            {"PRN 139", "ubx.cfg.sbas.scanmode.prn139",
2261
16
                FT_UINT32, BASE_HEX, NULL, 0x00080000, NULL, HFILL}},
2262
16
        {&hf_ubx_cfg_sbas_scanmode_prn138,
2263
16
            {"PRN 138", "ubx.cfg.sbas.scanmode.prn138",
2264
16
                FT_UINT32, BASE_HEX, NULL, 0x00040000, NULL, HFILL}},
2265
16
        {&hf_ubx_cfg_sbas_scanmode_prn137,
2266
16
            {"PRN 137", "ubx.cfg.sbas.scanmode.prn137",
2267
16
                FT_UINT32, BASE_HEX, NULL, 0x00020000, NULL, HFILL}},
2268
16
        {&hf_ubx_cfg_sbas_scanmode_prn136,
2269
16
            {"PRN 136", "ubx.cfg.sbas.scanmode.prn136",
2270
16
                FT_UINT32, BASE_HEX, NULL, 0x00010000, NULL, HFILL}},
2271
16
        {&hf_ubx_cfg_sbas_scanmode_prn135,
2272
16
            {"PRN 135", "ubx.cfg.sbas.scanmode.prn135",
2273
16
                FT_UINT32, BASE_HEX, NULL, 0x00008000, NULL, HFILL}},
2274
16
        {&hf_ubx_cfg_sbas_scanmode_prn134,
2275
16
            {"PRN 134", "ubx.cfg.sbas.scanmode.prn134",
2276
16
                FT_UINT32, BASE_HEX, NULL, 0x00004000, NULL, HFILL}},
2277
16
        {&hf_ubx_cfg_sbas_scanmode_prn133,
2278
16
            {"PRN 133", "ubx.cfg.sbas.scanmode.prn133",
2279
16
                FT_UINT32, BASE_HEX, NULL, 0x00002000, NULL, HFILL}},
2280
16
        {&hf_ubx_cfg_sbas_scanmode_prn132,
2281
16
            {"PRN 132", "ubx.cfg.sbas.scanmode.prn132",
2282
16
                FT_UINT32, BASE_HEX, NULL, 0x00001000, NULL, HFILL}},
2283
16
        {&hf_ubx_cfg_sbas_scanmode_prn131,
2284
16
            {"PRN 131", "ubx.cfg.sbas.scanmode.prn131",
2285
16
                FT_UINT32, BASE_HEX, NULL, 0x00000800, NULL, HFILL}},
2286
16
        {&hf_ubx_cfg_sbas_scanmode_prn130,
2287
16
            {"PRN 130", "ubx.cfg.sbas.scanmode.prn130",
2288
16
                FT_UINT32, BASE_HEX, NULL, 0x00000400, NULL, HFILL}},
2289
16
        {&hf_ubx_cfg_sbas_scanmode_prn129,
2290
16
            {"PRN 129", "ubx.cfg.sbas.scanmode.prn129",
2291
16
                FT_UINT32, BASE_HEX, NULL, 0x00000200, NULL, HFILL}},
2292
16
        {&hf_ubx_cfg_sbas_scanmode_prn128,
2293
16
            {"PRN 128", "ubx.cfg.sbas.scanmode.prn128",
2294
16
                FT_UINT32, BASE_HEX, NULL, 0x00000100, NULL, HFILL}},
2295
16
        {&hf_ubx_cfg_sbas_scanmode_prn127,
2296
16
            {"PRN 127", "ubx.cfg.sbas.scanmode.prn127",
2297
16
                FT_UINT32, BASE_HEX, NULL, 0x00000080, NULL, HFILL}},
2298
16
        {&hf_ubx_cfg_sbas_scanmode_prn126,
2299
16
            {"PRN 126", "ubx.cfg.sbas.scanmode.prn126",
2300
16
                FT_UINT32, BASE_HEX, NULL, 0x00000040, NULL, HFILL}},
2301
16
        {&hf_ubx_cfg_sbas_scanmode_prn125,
2302
16
            {"PRN 125", "ubx.cfg.sbas.scanmode.prn125",
2303
16
                FT_UINT32, BASE_HEX, NULL, 0x00000020, NULL, HFILL}},
2304
16
        {&hf_ubx_cfg_sbas_scanmode_prn124,
2305
16
            {"PRN 124", "ubx.cfg.sbas.scanmode.prn124",
2306
16
                FT_UINT32, BASE_HEX, NULL, 0x00000010, NULL, HFILL}},
2307
16
        {&hf_ubx_cfg_sbas_scanmode_prn123,
2308
16
            {"PRN 123", "ubx.cfg.sbas.scanmode.prn123",
2309
16
                FT_UINT32, BASE_HEX, NULL, 0x00000008, NULL, HFILL}},
2310
16
        {&hf_ubx_cfg_sbas_scanmode_prn122,
2311
16
            {"PRN 122", "ubx.cfg.sbas.scanmode.prn122",
2312
16
                FT_UINT32, BASE_HEX, NULL, 0x00000004, NULL, HFILL}},
2313
16
        {&hf_ubx_cfg_sbas_scanmode_prn121,
2314
16
            {"PRN 121", "ubx.cfg.sbas.scanmode.prn121",
2315
16
                FT_UINT32, BASE_HEX, NULL, 0x00000002, NULL, HFILL}},
2316
16
        {&hf_ubx_cfg_sbas_scanmode_prn120,
2317
16
            {"PRN 120", "ubx.cfg.sbas.scanmode.prn120",
2318
16
                FT_UINT32, BASE_HEX, NULL, 0x00000001, NULL, HFILL}},
2319
2320
        // UBX-MON-RF
2321
16
        {&hf_ubx_mon_rf,
2322
16
            {"UBX-MON-RF", "ubx.mon.rf",
2323
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2324
16
        {&hf_ubx_mon_rf_version,
2325
16
            {"Version", "ubx.mon.rf.version",
2326
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2327
16
        {&hf_ubx_mon_rf_nblocks,
2328
16
            {"Number of RF blocks", "ubx.mon.rf.nblocks",
2329
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2330
16
        {&hf_ubx_mon_rf_reserved0,
2331
16
            {"Reserved 0", "ubx.mon.rf.reserved0",
2332
16
                FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2333
16
        {&hf_ubx_mon_rf_blockid,
2334
16
            {"Block ID", "ubx.mon.rf.blockid",
2335
16
                FT_UINT8, BASE_DEC, VALS(UBX_RF_BLOCK_ID), 0x0, NULL, HFILL}},
2336
16
        {&hf_ubx_mon_rf_flags,
2337
16
            {"Flags", "ubx.mon.rf.flags",
2338
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2339
16
        {&hf_ubx_mon_rf_jammingstate,
2340
16
            {"Jamming State", "ubx.mon.rf.jammingstate",
2341
16
                FT_UINT8, BASE_DEC, VALS(UBX_JAMMING_STATE), 0x3, NULL, HFILL}},
2342
16
        {&hf_ubx_mon_rf_antstatus,
2343
16
            {"Antenna Status", "ubx.mon.rf.antstatus",
2344
16
                FT_UINT8, BASE_DEC, VALS(UBX_ANTENNA_STATUS), 0x0, NULL, HFILL}},
2345
16
        {&hf_ubx_mon_rf_antpower,
2346
16
            {"Antenna Power", "ubx.mon.rf.antpower",
2347
16
                FT_UINT8, BASE_DEC, VALS(UBX_ANTENNA_POWER), 0x0, NULL, HFILL}},
2348
16
        {&hf_ubx_mon_rf_poststatus,
2349
16
            {"POST Status", "ubx.mon.rf.poststatus",
2350
16
                FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2351
16
        {&hf_ubx_mon_rf_reserved1,
2352
16
            {"Reserved 1", "ubx.mon.rf.reserved1",
2353
16
                FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2354
16
        {&hf_ubx_mon_rf_noiseperms,
2355
16
            {"Noise Level", "ubx.mon.rf.noiseperms",
2356
16
                FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2357
16
        {&hf_ubx_mon_rf_agccnt,
2358
16
            {"AGC Monitor", "ubx.mon.rf.agccnt",
2359
16
                FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2360
16
        {&hf_ubx_mon_rf_cwsuppression,
2361
16
            {"CW Suppression", "ubx.mon.rf.cwsuppression",
2362
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2363
16
        {&hf_ubx_mon_rf_ofsi,
2364
16
            {"Imbalance of I-part", "ubx.mon.rf.ofsi",
2365
16
                FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2366
16
        {&hf_ubx_mon_rf_magi,
2367
16
            {"Magnitude of I-part", "ubx.mon.rf.magi",
2368
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2369
16
        {&hf_ubx_mon_rf_ofsq,
2370
16
            {"Imbalance of Q-part", "ubx.mon.rf.ofsq",
2371
16
                FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2372
16
        {&hf_ubx_mon_rf_magq,
2373
16
            {"Magnitude of Q-part", "ubx.mon.rf.magq",
2374
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2375
16
        {&hf_ubx_mon_rf_reserved2,
2376
16
            {"Reserved 2", "ubx.mon.rf.reserved2",
2377
16
                FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2378
2379
        // NAV-DOP
2380
16
        {&hf_ubx_nav_dop,
2381
16
            {"UBX-NAV-DOP", "ubx.nav.dop",
2382
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2383
16
        {&hf_ubx_nav_dop_itow,
2384
16
            {"iTOW", "ubx.nav.dop.itow",
2385
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}},
2386
16
        {&hf_ubx_nav_dop_gdop,
2387
16
            {"Geometric DOP", "ubx.nav.dop.gdop",
2388
16
                FT_UINT16, BASE_CUSTOM, CF_FUNC(&fmt_dop), 0x0, NULL, HFILL}},
2389
16
        {&hf_ubx_nav_dop_pdop,
2390
16
            {"Position DOP", "ubx.nav.dop.pdop",
2391
16
                FT_UINT16, BASE_CUSTOM, CF_FUNC(&fmt_dop), 0x0, NULL, HFILL}},
2392
16
        {&hf_ubx_nav_dop_tdop,
2393
16
            {"Time DOP", "ubx.nav.dop.tdop",
2394
16
                FT_UINT16, BASE_CUSTOM, CF_FUNC(&fmt_dop), 0x0, NULL, HFILL}},
2395
16
        {&hf_ubx_nav_dop_vdop,
2396
16
            {"Vertical DOP", "ubx.nav.dop.vdop",
2397
16
                FT_UINT16, BASE_CUSTOM, CF_FUNC(&fmt_dop), 0x0, NULL, HFILL}},
2398
16
        {&hf_ubx_nav_dop_hdop,
2399
16
            {"Horizontal DOP", "ubx.nav.dop.hdop",
2400
16
                FT_UINT16, BASE_CUSTOM, CF_FUNC(&fmt_dop), 0x0, NULL, HFILL}},
2401
16
        {&hf_ubx_nav_dop_ndop,
2402
16
            {"Northing DOP", "ubx.nav.dop.ndop",
2403
16
                FT_UINT16, BASE_CUSTOM, CF_FUNC(&fmt_dop), 0x0, NULL, HFILL}},
2404
16
        {&hf_ubx_nav_dop_edop,
2405
16
            {"Easting DOP", "ubx.nav.dop.edop",
2406
16
                FT_UINT16, BASE_CUSTOM, CF_FUNC(&fmt_dop), 0x0, NULL, HFILL}},
2407
2408
        // NAV-EOE
2409
16
        {&hf_ubx_nav_eoe,
2410
16
            {"UBX-NAV-EOE", "ubx.nav.eoe",
2411
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2412
16
        {&hf_ubx_nav_eoe_itow,
2413
16
            {"iTOW", "ubx.nav.eoe.itow",
2414
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}},
2415
2416
        // NAV-ODO
2417
16
        {&hf_ubx_nav_odo,
2418
16
            {"UBX-NAV-ODO", "ubx.nav.odo",
2419
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2420
16
        {&hf_ubx_nav_odo_version,
2421
16
            {"Version", "ubx.nav.odo.version",
2422
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2423
16
        {&hf_ubx_nav_odo_reserved1,
2424
16
            {"Reserved", "ubx.nav.odo.reserved1",
2425
16
                FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2426
16
        {&hf_ubx_nav_odo_itow,
2427
16
            {"iTOW", "ubx.nav.odo.itow",
2428
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}},
2429
16
        {&hf_ubx_nav_odo_distance,
2430
16
            {"Ground distance since last reset", "ubx.nav.odo.distance",
2431
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_meter_meters), 0x0, NULL, HFILL}},
2432
16
        {&hf_ubx_nav_odo_totaldistance,
2433
16
            {"Total cumulative ground distance", "ubx.nav.odo.totaldistance",
2434
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_meter_meters), 0x0, NULL, HFILL}},
2435
16
        {&hf_ubx_nav_odo_distancestd,
2436
16
            {"Ground distance accuracy (1-sigma)", "ubx.nav.odo.distancestd",
2437
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_meter_meters), 0x0, NULL, HFILL}},
2438
2439
        // NAV-POSECEF
2440
16
        {&hf_ubx_nav_posecef,
2441
16
            {"UBX-NAV-POSECEF", "ubx.nav.posecef",
2442
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2443
16
        {&hf_ubx_nav_posecef_itow,
2444
16
            {"iTOW", "ubx.nav.posecef.itow",
2445
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}},
2446
16
        {&hf_ubx_nav_posecef_ecefx,
2447
16
            {"ECEF X coordinate", "ubx.nav.posecef.ecefx",
2448
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_centimeters), 0x0, NULL, HFILL}},
2449
16
        {&hf_ubx_nav_posecef_ecefy,
2450
16
            {"ECEF Y coordinate", "ubx.nav.posecef.ecefy",
2451
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_centimeters), 0x0, NULL, HFILL}},
2452
16
        {&hf_ubx_nav_posecef_ecefz,
2453
16
            {"ECEF Z coordinate", "ubx.nav.posecef.ecefz",
2454
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_centimeters), 0x0, NULL, HFILL}},
2455
16
        {&hf_ubx_nav_posecef_pacc,
2456
16
            {"Position accuracy estimate", "ubx.nav.posecef.pacc",
2457
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_centimeters), 0x0, NULL, HFILL}},
2458
2459
        // NAV-PVT
2460
16
        {&hf_ubx_nav_pvt,
2461
16
            {"UBX-NAV-PVT", "ubx.nav.pvt",
2462
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2463
16
        {&hf_ubx_nav_pvt_itow,
2464
16
            {"iTOW", "ubx.nav.pvt.itow",
2465
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}},
2466
16
        {&hf_ubx_nav_pvt_year,
2467
16
            {"Year", "ubx.nav.pvt.year",
2468
16
                FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2469
16
        {&hf_ubx_nav_pvt_month,
2470
16
            {"Month", "ubx.nav.pvt.month",
2471
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2472
16
        {&hf_ubx_nav_pvt_day,
2473
16
            {"Day", "ubx.nav.pvt.day",
2474
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2475
16
        {&hf_ubx_nav_pvt_hour,
2476
16
            {"Hour", "ubx.nav.pvt.hour",
2477
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2478
16
        {&hf_ubx_nav_pvt_min,
2479
16
            {"Minute", "ubx.nav.pvt.min",
2480
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2481
16
        {&hf_ubx_nav_pvt_sec,
2482
16
            {"Seconds", "ubx.nav.pvt.sec",
2483
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2484
16
        {&hf_ubx_nav_pvt_valid,
2485
16
            {"Validity flags", "ubx.nav.pvt.valid",
2486
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2487
16
        {&hf_ubx_nav_pvt_validmag,
2488
16
            {"Valid magnetic declination", "ubx.nav.pvt.valid.validmag",
2489
16
                FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL}},
2490
16
        {&hf_ubx_nav_pvt_fullyresolved,
2491
16
            {"UTC time of day fully resolved", "ubx.nav.pvt.valid.fullyresolved",
2492
16
                FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL}},
2493
16
        {&hf_ubx_nav_pvt_validtime,
2494
16
            {"valid UTC time of day", "ubx.nav.pvt.valid.validtime",
2495
16
                FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}},
2496
16
        {&hf_ubx_nav_pvt_validdate,
2497
16
            {"valid UTC date", "ubx.nav.pvt.valid.validdate",
2498
16
                FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}},
2499
16
        {&hf_ubx_nav_pvt_tacc,
2500
16
            {"Time accuracy estimate", "ubx.nav.pvt.tacc",
2501
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_nanoseconds), 0x0, NULL, HFILL}},
2502
16
        {&hf_ubx_nav_pvt_nano,
2503
16
            {"UTC fraction of second", "ubx.nav.pvt.nano",
2504
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_nanoseconds), 0x0, NULL, HFILL}},
2505
16
        {&hf_ubx_nav_pvt_fixtype,
2506
16
            {"GNSS fix type", "ubx.nav.pvt.fixtype",
2507
16
                FT_UINT8, BASE_DEC, VALS(UBX_GNSS_FIX_TYPE), 0x0, NULL, HFILL}},
2508
16
        {&hf_ubx_nav_pvt_flags,
2509
16
            {"Fix status flags", "ubx.nav.pvt.flags",
2510
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2511
16
        {&hf_ubx_nav_pvt_headvehvalid,
2512
16
            {"heading of vehicle is valid", "ubx.nav.pvt.flags.headvehvalid",
2513
16
                FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL}},
2514
16
        {&hf_ubx_nav_pvt_psmstate,
2515
16
            {"PSM state", "ubx.nav.pvt.flags.psmstate",
2516
16
                FT_UINT8, BASE_DEC, NULL, 0x1c, NULL, HFILL}},
2517
16
        {&hf_ubx_nav_pvt_diffsoln,
2518
16
            {"differential corrections were applied", "ubx.nav.pvt.flags.diffsoln",
2519
16
                FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}},
2520
16
        {&hf_ubx_nav_pvt_gnssfixok,
2521
16
            {"valid fix", "ubx.nav.pvt.flags.gnssfixok",
2522
16
                FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}},
2523
16
        {&hf_ubx_nav_pvt_flags2,
2524
16
            {"Additional flags", "ubx.nav.pvt.flags2",
2525
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2526
16
        {&hf_ubx_nav_pvt_confirmedtime,
2527
16
            {"UTC time of day could be confirmed", "ubx.nav.pvt.flags2.confirmedtime",
2528
16
                FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL}},
2529
16
        {&hf_ubx_nav_pvt_confirmeddate,
2530
16
            {"UTC date could be validated", "ubx.nav.pvt.flags2.confirmeddate",
2531
16
                FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL}},
2532
16
        {&hf_ubx_nav_pvt_confirmedavai,
2533
16
            {"information about UTC date and time of day validity confirmation is available", "ubx.nav.pvt.flags2.confirmedavai",
2534
16
                FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL}},
2535
16
        {&hf_ubx_nav_pvt_numsv,
2536
16
            {"Number of satellite vehicles used in Nav solution", "ubx.nav.pvt.numsv",
2537
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2538
16
        {&hf_ubx_nav_pvt_lon,
2539
16
            {"Longitude", "ubx.nav.pvt.lon",
2540
16
                FT_INT32, BASE_CUSTOM, CF_FUNC(&fmt_lat_lon), 0x0, NULL, HFILL}},
2541
16
        {&hf_ubx_nav_pvt_lat,
2542
16
            {"Latitude", "ubx.nav.pvt.lat",
2543
16
                FT_INT32, BASE_CUSTOM, CF_FUNC(&fmt_lat_lon), 0x0, NULL, HFILL}},
2544
16
        {&hf_ubx_nav_pvt_height,
2545
16
            {"Height above ellipsoid", "ubx.nav.pvt.height",
2546
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_millimeters), 0x0, NULL, HFILL}},
2547
16
        {&hf_ubx_nav_pvt_hmsl,
2548
16
            {"Height above mean sea level", "ubx.nav.pvt.hmsl",
2549
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_millimeters), 0x0, NULL, HFILL}},
2550
16
        {&hf_ubx_nav_pvt_hacc,
2551
16
            {"Horizontal accuracy estimate", "ubx.nav.pvt.hacc",
2552
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_millimeters), 0x0, NULL, HFILL}},
2553
16
        {&hf_ubx_nav_pvt_vacc,
2554
16
            {"Vertical accuracy estimate", "ubx.nav.pvt.vacc",
2555
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_millimeters), 0x0, NULL, HFILL}},
2556
16
        {&hf_ubx_nav_pvt_veln,
2557
16
            {"NED north velocity", "ubx.nav.pvt.veln",
2558
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_mm_s), 0x0, NULL, HFILL}},
2559
16
        {&hf_ubx_nav_pvt_vele,
2560
16
            {"NED east velocity", "ubx.nav.pvt.vele",
2561
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_mm_s), 0x0, NULL, HFILL}},
2562
16
        {&hf_ubx_nav_pvt_veld,
2563
16
            {"NED down velocity", "ubx.nav.pvt.veld",
2564
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_mm_s), 0x0, NULL, HFILL}},
2565
16
        {&hf_ubx_nav_pvt_gspeed,
2566
16
            {"Ground speed (2-D)", "ubx.nav.pvt.gspeed",
2567
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_mm_s), 0x0, NULL, HFILL}},
2568
16
        {&hf_ubx_nav_pvt_headmot,
2569
16
            {"Heading of motion (2-D)", "ubx.nav.pvt.headmot",
2570
16
                FT_INT32, BASE_CUSTOM, CF_FUNC(&fmt_heading), 0x0, NULL, HFILL}},
2571
16
        {&hf_ubx_nav_pvt_sacc,
2572
16
            {"Speed accuracy estimate", "ubx.nav.pvt.sacc",
2573
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_mm_s), 0x0, NULL, HFILL}},
2574
16
        {&hf_ubx_nav_pvt_headacc,
2575
16
            {"Heading accuracy estimate", "ubx.nav.pvt.headacc",
2576
16
                FT_UINT32, BASE_CUSTOM, CF_FUNC(&fmt_heading_acc), 0x0, NULL, HFILL}},
2577
16
        {&hf_ubx_nav_pvt_pdop,
2578
16
            {"Position DOP", "ubx.nav.pvt.pdop",
2579
16
                FT_UINT16, BASE_CUSTOM, CF_FUNC(&fmt_dop), 0x0, NULL, HFILL}},
2580
16
        {&hf_ubx_nav_pvt_lastcorrectionage,
2581
16
            {"Age of the most recently received differential correction", "ubx.nav.pvt.lastcorrectionage",
2582
16
                FT_UINT16, BASE_DEC, VALS(UBX_LAST_CORRECTION_AGE), 0x001e, NULL, HFILL}},
2583
16
        {&hf_ubx_nav_pvt_invalidllh,
2584
16
            {"Invalid lon, lat, height, and hMSL", "ubx.nav.pvt.invalidllh",
2585
16
                FT_BOOLEAN, 16, NULL, 0x0001, NULL, HFILL}},
2586
16
        {&hf_ubx_nav_pvt_reserved1,
2587
16
            {"Reserved 1", "ubx.nav.pvt.reserved1",
2588
16
                FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2589
16
        {&hf_ubx_nav_pvt_headveh,
2590
16
            {"Heading of vehicle (2-D)", "ubx.nav.pvt.headveh",
2591
16
                FT_INT32, BASE_CUSTOM, CF_FUNC(&fmt_heading), 0x0, NULL, HFILL}},
2592
16
        {&hf_ubx_nav_pvt_magdec,
2593
16
            {"Magnetic declination", "ubx.nav.pvt.magdec",
2594
16
                FT_INT16, BASE_CUSTOM, CF_FUNC(&fmt_decl), 0x0, NULL, HFILL}},
2595
16
        {&hf_ubx_nav_pvt_magacc,
2596
16
            {"Magnetic declination accuracy", "ubx.nav.pvt.magacc",
2597
16
                FT_UINT16, BASE_CUSTOM, CF_FUNC(&fmt_decl_acc), 0x0, NULL, HFILL}},
2598
2599
        // NAV-RELPOSNED
2600
16
        {&hf_ubx_nav_relposned,
2601
16
            {"UBX-NAV-RELPOSNED", "ubx.nav.relposned",
2602
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2603
16
        {&hf_ubx_nav_relposned_version,
2604
16
            {"Version", "ubx.nav.relposned.version",
2605
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2606
16
        {&hf_ubx_nav_relposned_reserved0,
2607
16
            {"Reserved 0", "ubx.nav.relposned.reserved0",
2608
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2609
16
        {&hf_ubx_nav_relposned_refstationid,
2610
16
            {"Ref Station ID", "ubx.nav.relposned.refstationid",
2611
16
                FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2612
16
        {&hf_ubx_nav_relposned_itow,
2613
16
            {"iTOW", "ubx.nav.relposned.itow",
2614
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}},
2615
16
        {&hf_ubx_nav_relposned_relposn,
2616
16
            {"Relative Position North", "ubx.nav.relposned.relposn",
2617
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_centimeters), 0x0, NULL, HFILL}},
2618
16
        {&hf_ubx_nav_relposned_relpose,
2619
16
            {"Relative Position East", "ubx.nav.relposned.relpose",
2620
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_centimeters), 0x0, NULL, HFILL}},
2621
16
        {&hf_ubx_nav_relposned_relposd,
2622
16
            {"Relative Position Down", "ubx.nav.relposned.relposd",
2623
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_centimeters), 0x0, NULL, HFILL}},
2624
16
        {&hf_ubx_nav_relposned_relposlength,
2625
16
            {"Relative Position Length", "ubx.nav.relposned.relposlength",
2626
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_centimeters), 0x0, NULL, HFILL}},
2627
16
        {&hf_ubx_nav_relposned_relposheading,
2628
16
            {"Relative Position Heading", "ubx.nav.relposned.relposheading",
2629
16
                FT_INT32, BASE_CUSTOM, CF_FUNC(&fmt_heading), 0x0, NULL, HFILL}},
2630
16
        {&hf_ubx_nav_relposned_reserved1,
2631
16
            {"Reserved 1", "ubx.nav.relposned.reserved1",
2632
16
                FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2633
16
        {&hf_ubx_nav_relposned_relposhpn,
2634
16
            {"High-precision Relative Position North", "ubx.nav.relposned.relposhpn",
2635
16
                FT_INT8, BASE_CUSTOM, CF_FUNC(&fmt_relpos_hp), 0x0, NULL, HFILL}},
2636
16
        {&hf_ubx_nav_relposned_relposhpe,
2637
16
            {"High-precision Relative Position East", "ubx.nav.relposned.relposhpe",
2638
16
                FT_INT8, BASE_CUSTOM, CF_FUNC(&fmt_relpos_hp), 0x0, NULL, HFILL}},
2639
16
        {&hf_ubx_nav_relposned_relposhpd,
2640
16
            {"High-precision Relative Position Down", "ubx.nav.relposned.relposhpd",
2641
16
                FT_INT8, BASE_CUSTOM, CF_FUNC(&fmt_relpos_hp), 0x0, NULL, HFILL}},
2642
16
        {&hf_ubx_nav_relposned_relposhplength,
2643
16
            {"High-precision Relative Position Length", "ubx.nav.relposned.relposhplength",
2644
16
                FT_INT8, BASE_CUSTOM, CF_FUNC(&fmt_relpos_hp), 0x0, NULL, HFILL}},
2645
16
        {&hf_ubx_nav_relposned_accn,
2646
16
            {"Relative Position North Accuracy", "ubx.nav.relposned.accn",
2647
16
                FT_UINT32, BASE_CUSTOM, CF_FUNC(&fmt_relpos_acc), 0x0, NULL, HFILL}},
2648
16
        {&hf_ubx_nav_relposned_acce,
2649
16
            {"Relative Position East Accuracy", "ubx.nav.relposned.acce",
2650
16
                FT_UINT32, BASE_CUSTOM, CF_FUNC(&fmt_relpos_acc), 0x0, NULL, HFILL}},
2651
16
        {&hf_ubx_nav_relposned_accd,
2652
16
            {"Relative Position Down Accuracy", "ubx.nav.relposned.accd",
2653
16
                FT_UINT32, BASE_CUSTOM, CF_FUNC(&fmt_relpos_acc), 0x0, NULL, HFILL}},
2654
16
        {&hf_ubx_nav_relposned_acclength,
2655
16
            {"Relative Position Length Accuracy", "ubx.nav.relposned.acclength",
2656
16
                FT_UINT32, BASE_CUSTOM, CF_FUNC(&fmt_relpos_acc), 0x0, NULL, HFILL}},
2657
16
        {&hf_ubx_nav_relposned_accheading,
2658
16
            {"Relative Position Heading Accuracy", "ubx.nav.relposned.accheading",
2659
16
                FT_UINT32, BASE_CUSTOM, CF_FUNC(&fmt_heading_acc), 0x0, NULL, HFILL}},
2660
16
        {&hf_ubx_nav_relposned_reserved2,
2661
16
            {"Reserved 2", "ubx.nav.relposned.reserved2",
2662
16
                FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2663
16
        {&hf_ubx_nav_relposned_flags,
2664
16
            {"Flags", "ubx.nav.relposned.flags",
2665
16
                FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2666
16
        {&hf_ubx_nav_relposned_gnssfixok,
2667
16
            {"Valid Fix", "ubx.nav.relposned.gnssfixok",
2668
16
                FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}},
2669
16
        {&hf_ubx_nav_relposned_diffsoln,
2670
16
            {"Differential Corrections Were Applied", "ubx.nav.relposned.diffsoln",
2671
16
                FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL}},
2672
16
        {&hf_ubx_nav_relposned_relposvalid,
2673
16
            {"Relative Position Valid", "ubx.nav.relposned.relposvalid",
2674
16
                FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL}},
2675
16
        {&hf_ubx_nav_relposned_carrsoln,
2676
16
            {"Carrier Phase Range Solution Status", "ubx.nav.relposned.carrsoln",
2677
16
                FT_UINT32, BASE_DEC, VALS(UBX_CARRSOLN), 0x18, NULL, HFILL}},
2678
16
        {&hf_ubx_nav_relposned_ismoving,
2679
16
            {"Is Moving", "ubx.nav.relposned.ismoving",
2680
16
                FT_BOOLEAN, 32, NULL, 0x00000020, NULL, HFILL}},
2681
16
        {&hf_ubx_nav_relposned_refposmiss,
2682
16
            {"Extrapolated Reference Position", "ubx.nav.relposned.refposmiss",
2683
16
                FT_BOOLEAN, 32, NULL, 0x00000040, NULL, HFILL}},
2684
16
        {&hf_ubx_nav_relposned_refobsmiss,
2685
16
            {"Extrapolated Reference Observations", "ubx.nav.relposned.refobsmiss",
2686
16
                FT_BOOLEAN, 32, NULL, 0x00000080, NULL, HFILL}},
2687
16
        {&hf_ubx_nav_relposned_relposheadingvalid,
2688
16
            {"Relative Position Heading Valid", "ubx.nav.relposned.relposheadingvalid",
2689
16
                FT_BOOLEAN, 32, NULL, 0x00000100, NULL, HFILL}},
2690
16
        {&hf_ubx_nav_relposned_relposnormalized,
2691
16
            {"Relative Position Normalized", "ubx.nav.relposned.refposnormalized",
2692
16
                FT_BOOLEAN, 32, NULL, 0x00000200, NULL, HFILL}},
2693
16
        {&hf_ubx_nav_relposned_relposn_full,
2694
16
            {"Relative Position North + High-precision", "ubx.nav.relposned.relposn_full",
2695
16
                FT_INT64, BASE_CUSTOM, CF_FUNC(&fmt_relpos_full), 0x0, NULL, HFILL}},
2696
16
        {&hf_ubx_nav_relposned_relpose_full,
2697
16
            {"Relative Position East + High-precision", "ubx.nav.relposned.relpose_full",
2698
16
                FT_INT64, BASE_CUSTOM, CF_FUNC(&fmt_relpos_full), 0x0, NULL, HFILL}},
2699
16
        {&hf_ubx_nav_relposned_relposd_full,
2700
16
            {"Relative Position Down + High-precision", "ubx.nav.relposned.relposd_full",
2701
16
                FT_INT64, BASE_CUSTOM, CF_FUNC(&fmt_relpos_full), 0x0, NULL, HFILL}},
2702
16
        {&hf_ubx_nav_relposned_relposlength_full,
2703
16
            {"Relative Position Length + High-precision", "ubx.nav.relposned.relposlength_full",
2704
16
                FT_INT64, BASE_CUSTOM, CF_FUNC(&fmt_relpos_full), 0x0, NULL, HFILL}},
2705
2706
        // NAV-SAT
2707
16
        {&hf_ubx_nav_sat,
2708
16
            {"UBX-NAV-SAT", "ubx.nav.sat",
2709
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2710
16
        {&hf_ubx_nav_sat_itow,
2711
16
            {"iTOW", "ubx.nav.sat.itow",
2712
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}},
2713
16
        {&hf_ubx_nav_sat_version,
2714
16
            {"Version", "ubx.nav.sat.version",
2715
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2716
16
        {&hf_ubx_nav_sat_num_svs,
2717
16
            {"Number of satellites", "ubx.nav.sat.num_svs",
2718
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2719
16
        {&hf_ubx_nav_sat_reserved1,
2720
16
            {"Reserved", "ubx.nav.sat.reserved1",
2721
16
                FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2722
16
        {&hf_ubx_nav_sat_gnss_id,
2723
16
            {"GNSS ID", "ubx.nav.sat.gnss_id",
2724
16
                FT_UINT8, BASE_DEC, VALS(UBX_GNSS_ID), 0x0, NULL, HFILL}},
2725
16
        {&hf_ubx_nav_sat_sv_id,
2726
16
            {"SV ID", "ubx.nav.sat.sv_id",
2727
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2728
16
        {&hf_ubx_nav_sat_cn0,
2729
16
            {"C/N0", "ubx.nav.sat.cn0",
2730
16
                FT_UINT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_dbhz), 0x0, NULL, HFILL}},
2731
16
        {&hf_ubx_nav_sat_elev,
2732
16
            {"Elevation", "ubx.nav.sat.elev",
2733
16
                FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2734
16
        {&hf_ubx_nav_sat_azim,
2735
16
            {"Azimuth", "ubx.nav.sat.azim",
2736
16
                FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2737
16
        {&hf_ubx_nav_sat_pr_res,
2738
16
            {"Pseudorange residual", "ubx.nav.sat.pr_res",
2739
16
                FT_INT16, BASE_CUSTOM, CF_FUNC(&fmt_pr_res), 0x0, NULL, HFILL}},
2740
16
        {&hf_ubx_nav_sat_flags,
2741
16
            {"Bitmask", "ubx.nav.sat.flags",
2742
16
                FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2743
16
        {&hf_ubx_nav_sat_quality_ind,
2744
16
            {"Signal quality indicator", "ubx.nav.sat.flags.quality_ind",
2745
16
                FT_UINT32, BASE_HEX, VALS(UBX_SIGNAL_QUALITY_INDICATOR), 0x00000007, NULL, HFILL}},
2746
16
        {&hf_ubx_nav_sat_sv_used,
2747
16
            {"Signal used for navigation", "ubx.nav.sat.flags.sv_used",
2748
16
                FT_UINT32, BASE_HEX, NULL, 0x00000008, NULL, HFILL}},
2749
16
        {&hf_ubx_nav_sat_health,
2750
16
            {"Signal health", "ubx.nav.sat.flags.health",
2751
16
                FT_UINT32, BASE_HEX, VALS(UBX_SIGNAL_HEALTH), 0x00000030, NULL, HFILL}},
2752
16
        {&hf_ubx_nav_sat_diff_corr,
2753
16
            {"Differential correction available", "ubx.nav.sat.flags.diff_corr",
2754
16
                FT_UINT32, BASE_HEX, NULL, 0x00000040, NULL, HFILL}},
2755
16
        {&hf_ubx_nav_sat_smoothed,
2756
16
            {"Carrier smoothed pseudorange used", "ubx.nav.sat.flags.smoothed",
2757
16
                FT_UINT32, BASE_HEX, NULL, 0x00000080, NULL, HFILL}},
2758
16
        {&hf_ubx_nav_sat_orbit_src,
2759
16
            {"Orbit source", "ubx.nav.sat.flags.orbit_src",
2760
16
                FT_UINT32, BASE_HEX, VALS(UBX_ORBIT_SOURCE), 0x00000700, NULL, HFILL}},
2761
16
        {&hf_ubx_nav_sat_eph_avail,
2762
16
            {"Ephemeris available", "ubx.nav.sat.flags.eph_avail",
2763
16
                FT_UINT32, BASE_HEX, NULL, 0x00000800, NULL, HFILL}},
2764
16
        {&hf_ubx_nav_sat_alm_avail,
2765
16
            {"Almanac available", "ubx.nav.sat.flags.alm_avail",
2766
16
                FT_UINT32, BASE_HEX, NULL, 0x00001000, NULL, HFILL}},
2767
16
        {&hf_ubx_nav_sat_ano_avail,
2768
16
            {"AssistNow Offline data available", "ubx.nav.sat.flags.ano_avail",
2769
16
                FT_UINT32, BASE_HEX, NULL, 0x00002000, NULL, HFILL}},
2770
16
        {&hf_ubx_nav_sat_aop_avail,
2771
16
            {"AssistNow Autonomous data available", "ubx.nav.sat.flags.aop_avail",
2772
16
                FT_UINT32, BASE_HEX, NULL, 0x00004000, NULL, HFILL}},
2773
16
        {&hf_ubx_nav_sat_sbas_corr_used,
2774
16
            {"SBAS corrections used", "ubx.nav.sat.flags.sbas_corr_used",
2775
16
                FT_UINT32, BASE_HEX, NULL, 0x00010000, NULL, HFILL}},
2776
16
        {&hf_ubx_nav_sat_rtcm_corr_used,
2777
16
            {"RTCM corrections used", "ubx.nav.sat.flags.rtcm_corr_used",
2778
16
                FT_UINT32, BASE_HEX, NULL, 0x00020000, NULL, HFILL}},
2779
16
        {&hf_ubx_nav_sat_slas_corr_used,
2780
16
            {"QZSS SLAS corrections used", "ubx.nav.sat.flags.slas_corr_used",
2781
16
                FT_UINT32, BASE_HEX, NULL, 0x00040000, NULL, HFILL}},
2782
16
        {&hf_ubx_nav_sat_spartn_corr_used,
2783
16
            {"SPARTN corrections used", "ubx.nav.sat.flags.spartn_corr_used",
2784
16
                FT_UINT32, BASE_HEX, NULL, 0x00080000, NULL, HFILL}},
2785
16
        {&hf_ubx_nav_sat_pr_corr_used,
2786
16
            {"Pseudorange corrections used", "ubx.nav.sat.flags.pr_corr_used",
2787
16
                FT_UINT32, BASE_HEX, NULL, 0x00100000, NULL, HFILL}},
2788
16
        {&hf_ubx_nav_sat_cr_corr_used,
2789
16
            {"Carrier range corrections used", "ubx.nav.sat.flags.cr_corr_used",
2790
16
                FT_UINT32, BASE_HEX, NULL, 0x00200000, NULL, HFILL}},
2791
16
        {&hf_ubx_nav_sat_do_corr_used,
2792
16
            {"Range rate (Doppler) corrections used", "ubx.nav.sat.flags.do_corr_used",
2793
16
                FT_UINT32, BASE_HEX, NULL, 0x00400000, NULL, HFILL}},
2794
2795
        // NAV-SBAS
2796
16
        {&hf_ubx_nav_sbas,
2797
16
            {"UBX-NAV-SBAS", "ubx.nav.sbas",
2798
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2799
16
        {&hf_ubx_nav_sbas_itow,
2800
16
            {"iTOW", "ubx.nav.sbas.itow",
2801
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}},
2802
16
        {&hf_ubx_nav_sbas_geo,
2803
16
            {"GEO PRN", "ubx.nav.sbas.geo",
2804
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2805
16
        {&hf_ubx_nav_sbas_mode,
2806
16
            {"SBAS Mode", "ubx.nav.sbas.mode",
2807
16
                FT_UINT8, BASE_DEC, VALS(UBX_SBAS_MODE), 0x0, NULL, HFILL}},
2808
16
        {&hf_ubx_nav_sbas_sys,
2809
16
            {"SBAS System", "ubx.nav.sbas.sys",
2810
16
                FT_INT8, BASE_DEC, VALS(UBX_SBAS_SYSTEM), 0x0, NULL, HFILL}},
2811
16
        {&hf_ubx_nav_sbas_service,
2812
16
            {"SBAS Services available", "ubx.nav.sbas.service",
2813
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2814
16
        {&hf_ubx_nav_sbas_service_ranging,
2815
16
            {"GEO may be used as ranging source", "ubx.nav.sbas.service.ranging",
2816
16
                FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}},
2817
16
        {&hf_ubx_nav_sbas_service_corrections,
2818
16
            {"GEO is providing correction data", "ubx.nav.sbas.service.corrections",
2819
16
                FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}},
2820
16
        {&hf_ubx_nav_sbas_service_integrity,
2821
16
            {"GEO is providing integrity", "ubx.nav.sbas.service.integrity",
2822
16
                FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL}},
2823
16
        {&hf_ubx_nav_sbas_service_testmode,
2824
16
            {"GEO is in test mode", "ubx.nav.sbas.service.testmode",
2825
16
                FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL}},
2826
16
        {&hf_ubx_nav_sbas_service_bad,
2827
16
            {"Problem with signal or broadcast data indicated", "ubx.nav.sbas.service.bad",
2828
16
                FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL}},
2829
16
        {&hf_ubx_nav_sbas_cnt,
2830
16
            {"Number of SV data following", "ubx.nav.sbas.cnt",
2831
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2832
16
        {&hf_ubx_nav_sbas_reserved1,
2833
16
            {"Reserved", "ubx.nav.sbas.reserved1",
2834
16
                FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2835
16
        {&hf_ubx_nav_sbas_sv_id,
2836
16
            {"SV ID", "ubx.nav.sbas.sv_id",
2837
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2838
16
        {&hf_ubx_nav_sbas_flags,
2839
16
            {"Flags", "ubx.nav.sbas.flags",
2840
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2841
16
        {&hf_ubx_nav_sbas_udre,
2842
16
            {"Monitoring status", "ubx.nav.sbas.udre",
2843
16
                FT_UINT8, BASE_DEC, VALS(UDREI_EVALUATION), 0x0, NULL, HFILL}},
2844
16
        {&hf_ubx_nav_sbas_sv_sys,
2845
16
            {"System", "ubx.nav.sbas.sv_sys",
2846
16
                FT_INT8, BASE_DEC, VALS(UBX_SBAS_SYSTEM), 0x0, NULL, HFILL}},
2847
16
        {&hf_ubx_nav_sbas_sv_service,
2848
16
            {"Service", "ubx.nav.sbas.sv_service",
2849
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2850
16
        {&hf_ubx_nav_sbas_reserved2,
2851
16
            {"Reserved", "ubx.nav.sbas.reserved2",
2852
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2853
16
        {&hf_ubx_nav_sbas_prc,
2854
16
            {"Pseudo Range correction", "ubx.nav.sbas.prc",
2855
16
                FT_INT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_centimeter_centimeters), 0x0, NULL, HFILL}},
2856
16
        {&hf_ubx_nav_sbas_reserved3,
2857
16
            {"Reserved", "ubx.nav.sbas.reserved3",
2858
16
                FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2859
16
        {&hf_ubx_nav_sbas_ic,
2860
16
            {"Ionosphere correction", "ubx.nav.sbas.ic",
2861
16
                FT_INT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_centimeter_centimeters), 0x0, NULL, HFILL}},
2862
2863
        // NAV-TIMEGPS
2864
16
        {&hf_ubx_nav_timegps,
2865
16
            {"UBX-NAV-TIMEGPS", "ubx.nav.timegps",
2866
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2867
16
        {&hf_ubx_nav_timegps_itow,
2868
16
            {"iTOW", "ubx.nav.timegps.itow",
2869
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}},
2870
16
        {&hf_ubx_nav_timegps_ftow,
2871
16
            {"fTOW", "ubx.nav.timegps.ftow",
2872
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_nanoseconds), 0x0, NULL, HFILL}},
2873
16
        {&hf_ubx_nav_timegps_week,
2874
16
            {"GPS week", "ubx.nav.timegps.week",
2875
16
                FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2876
16
        {&hf_ubx_nav_timegps_leaps,
2877
16
            {"GPS leap seconds", "ubx.nav.timegps.leaps",
2878
16
                FT_INT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_seconds), 0x0, NULL, HFILL}},
2879
16
        {&hf_ubx_nav_timegps_valid,
2880
16
            {"Validity flags", "ubx.nav.timegps.valid",
2881
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2882
16
        {&hf_ubx_nav_timegps_towvalid,
2883
16
            {"Valid GPS time of week", "ubx.nav.timegps.valid.towvalid",
2884
16
                FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}},
2885
16
        {&hf_ubx_nav_timegps_weekvalid,
2886
16
            {"Valid GPS week number", "ubx.nav.timegps.valid.weekvalid",
2887
16
                FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}},
2888
16
        {&hf_ubx_nav_timegps_leapsvalid,
2889
16
            {"Valid GPS leap seconds", "ubx.nav.timegps.valid.leapsvalid",
2890
16
                FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL}},
2891
16
        {&hf_ubx_nav_timegps_tacc,
2892
16
            {"Time accuracy estimate", "ubx.nav.timegps.tacc",
2893
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_seconds), 0x0, NULL, HFILL}},
2894
2895
        // NAV-TIMEUTC
2896
16
        {&hf_ubx_nav_timeutc,
2897
16
            {"UBX-NAV-TIMEUTC", "ubx.nav.timeutc",
2898
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2899
16
        {&hf_ubx_nav_timeutc_itow,
2900
16
            {"iTOW", "ubx.nav.timeutc.itow",
2901
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}},
2902
16
        {&hf_ubx_nav_timeutc_tacc,
2903
16
            {"Time accuracy estimate (UTC)", "ubx.nav.timeutc.tacc",
2904
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_nanoseconds), 0x0, NULL, HFILL}},
2905
16
        {&hf_ubx_nav_timeutc_nano,
2906
16
            {"Fraction of second (UTC)", "ubx.nav.timeutc.nano",
2907
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_nanoseconds), 0x0, NULL, HFILL}},
2908
16
        {&hf_ubx_nav_timeutc_year,
2909
16
            {"Year", "ubx.nav.timeutc.year",
2910
16
                FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2911
16
        {&hf_ubx_nav_timeutc_month,
2912
16
            {"Month", "ubx.nav.timeutc.month",
2913
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2914
16
        {&hf_ubx_nav_timeutc_day,
2915
16
            {"Day", "ubx.nav.timeutc.day",
2916
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2917
16
        {&hf_ubx_nav_timeutc_hour,
2918
16
            {"Hour of day", "ubx.nav.timeutc.hour",
2919
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2920
16
        {&hf_ubx_nav_timeutc_min,
2921
16
            {"Minute of hour", "ubx.nav.timeutc.min",
2922
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2923
16
        {&hf_ubx_nav_timeutc_sec,
2924
16
            {"Seconds of minute", "ubx.nav.timeutc.sec",
2925
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2926
16
        {&hf_ubx_nav_timeutc_valid,
2927
16
            {"Validity flags", "ubx.nav.timeutc.valid",
2928
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2929
16
        {&hf_ubx_nav_timeutc_validtow,
2930
16
            {"Valid Time of Week", "ubx.nav.timeutc.valid.validtow",
2931
16
                FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}},
2932
16
        {&hf_ubx_nav_timeutc_validwkn,
2933
16
            {"Valid Week Number", "ubx.nav.timeutc.valid.validwkn",
2934
16
                FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}},
2935
16
        {&hf_ubx_nav_timeutc_validutc,
2936
16
            {"Valid UTC Time", "ubx.nav.timeutc.valid.validutc",
2937
16
                FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL}},
2938
16
        {&hf_ubx_nav_timeutc_utcstandard,
2939
16
            {"utcStandard", "ubx.nav.timeutc.valid.utcstandard",
2940
16
                FT_UINT8, BASE_DEC, VALS(UBX_UTC_STD_ID), 0xf0, NULL, HFILL}},
2941
2942
        // NAV-VELECEF
2943
16
        {&hf_ubx_nav_velecef,
2944
16
            {"UBX-NAV-VELECEF", "ubx.nav.velecef",
2945
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2946
16
        {&hf_ubx_nav_velecef_itow,
2947
16
            {"iTOW", "ubx.nav.velecef.itow",
2948
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_seconds), 0x0, NULL, HFILL}},
2949
16
        {&hf_ubx_nav_velecef_ecefvx,
2950
16
            {"ECEF X velocity", "ubx.nav.velecef.ecefvx",
2951
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_cm_s), 0x0, NULL, HFILL}},
2952
16
        {&hf_ubx_nav_velecef_ecefvy,
2953
16
            {"ECEF Y velocity", "ubx.nav.velecef.ecefvy",
2954
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_cm_s), 0x0, NULL, HFILL}},
2955
16
        {&hf_ubx_nav_velecef_ecefvz,
2956
16
            {"ECEF Z velocity", "ubx.nav.velecef.ecefvz",
2957
16
                FT_INT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_cm_s), 0x0, NULL, HFILL}},
2958
16
        {&hf_ubx_nav_velecef_sacc,
2959
16
            {"Speed accuracy estimate", "ubx.nav.velecef.sacc",
2960
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_cm_s), 0x0, NULL, HFILL}},
2961
2962
        // RXM-MEASX
2963
16
        {&hf_ubx_rxm_measx,
2964
16
            {"UBX-RXM-MEASX", "ubx.rxm.measx",
2965
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
2966
16
        {&hf_ubx_rxm_measx_version,
2967
16
            {"Message version", "ubx.rxm.measx.version",
2968
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2969
16
        {&hf_ubx_rxm_measx_reserved1,
2970
16
            {"Reserved", "ubx.rxm.measx.reserved1",
2971
16
                FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2972
16
        {&hf_ubx_rxm_measx_gpstow,
2973
16
            {"GPS measurement reference time", "ubx.rxm.measx.gpstow",
2974
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}},
2975
16
        {&hf_ubx_rxm_measx_glotow,
2976
16
            {"GLONASS measurement reference time", "ubx.rxm.measx.glotow",
2977
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}},
2978
16
        {&hf_ubx_rxm_measx_bdstow,
2979
16
            {"BeiDou measurement reference time", "ubx.rxm.measx.bdstow",
2980
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}},
2981
16
        {&hf_ubx_rxm_measx_reserved2,
2982
16
            {"Reserved", "ubx.rxm.measx.reserved2",
2983
16
                FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2984
16
        {&hf_ubx_rxm_measx_qzsstow,
2985
16
            {"QZSS measurement reference time", "ubx.rxm.measx.qzsstow",
2986
16
                FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}},
2987
16
        {&hf_ubx_rxm_measx_gpstowacc,
2988
16
            {"GPS measurement reference time accuracy", "ubx.rxm.measx.gpstowacc",
2989
16
                FT_UINT16, BASE_CUSTOM, CF_FUNC(&fmt_towacc), 0x0, NULL, HFILL}},
2990
16
        {&hf_ubx_rxm_measx_glotowacc,
2991
16
            {"GLONASS measurement reference time accuracy", "ubx.rxm.measx.glotowacc",
2992
16
                FT_UINT16, BASE_CUSTOM, CF_FUNC(&fmt_towacc), 0x0, NULL, HFILL}},
2993
16
        {&hf_ubx_rxm_measx_bdstowacc,
2994
16
            {"BeiDou measurement reference time accuracy", "ubx.rxm.measx.bdstowacc",
2995
16
                FT_UINT16, BASE_CUSTOM, CF_FUNC(&fmt_towacc), 0x0, NULL, HFILL}},
2996
16
        {&hf_ubx_rxm_measx_reserved3,
2997
16
            {"Reserved", "ubx.rxm.measx.reserved3",
2998
16
                FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2999
16
        {&hf_ubx_rxm_measx_qzsstowacc,
3000
16
            {"QZSS measurement reference time accuracy", "ubx.rxm.measx.qzsstowacc",
3001
16
                FT_UINT16, BASE_CUSTOM, CF_FUNC(&fmt_towacc), 0x0, NULL, HFILL}},
3002
16
        {&hf_ubx_rxm_measx_numsv,
3003
16
            {"Number of satellites in repeated block", "ubx.rxm.measx.numsv",
3004
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
3005
16
        {&hf_ubx_rxm_measx_flags_towset,
3006
16
            {"TOW set", "ubx.rxm.measx.flags.towset",
3007
16
                FT_BOOLEAN, 8, NULL, 0x03, NULL, HFILL}},
3008
16
        {&hf_ubx_rxm_measx_reserved4,
3009
16
            {"Reserved", "ubx.rxm.measx.reserved4",
3010
16
                FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}},
3011
16
        {&hf_ubx_rxm_measx_gnssid,
3012
16
            {"GNSS ID", "ubx.rxm.measx.gnssid",
3013
16
                FT_UINT8, BASE_DEC, VALS(UBX_GNSS_ID), 0x0, NULL, HFILL}},
3014
16
        {&hf_ubx_rxm_measx_svid,
3015
16
            {"Satellite ID", "ubx.rxm.measx.svid",
3016
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
3017
16
        {&hf_ubx_rxm_measx_cn0,
3018
16
            {"C/N0", "ubx.rxm.measx.cn0",
3019
16
                FT_UINT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_dbhz), 0x0, NULL, HFILL}},
3020
16
        {&hf_ubx_rxm_measx_mpathindic,
3021
16
            {"multipath index", "ubx.rxm.measx.mpathindic",
3022
16
                FT_UINT8, BASE_DEC, VALS(UBX_RXM_MEASX_MULTIPATH_INDEX), 0x0, NULL, HFILL}},
3023
16
        {&hf_ubx_rxm_measx_dopplerms,
3024
16
            {"Doppler measurement", "ubx.rxm.measx.dopplerms",
3025
16
                FT_INT32, BASE_CUSTOM, CF_FUNC(&fmt_dopplerms), 0x0, NULL, HFILL}},
3026
16
        {&hf_ubx_rxm_measx_dopplerhz,
3027
16
            {"Doppler measurement", "ubx.rxm.measx.dopplerhz",
3028
16
                FT_INT32, BASE_CUSTOM, CF_FUNC(&fmt_dopplerhz), 0x0, NULL, HFILL}},
3029
16
        {&hf_ubx_rxm_measx_wholechips,
3030
16
            {"whole value of the code phase measurement", "ubx.rxm.measx.wholechips",
3031
16
                FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
3032
16
        {&hf_ubx_rxm_measx_fracchips,
3033
16
            {"fractional value of the code phase measurement", "ubx.rxm.measx.fracchips",
3034
16
                FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
3035
16
        {&hf_ubx_rxm_measx_codephase,
3036
16
            {"Code phase", "ubx.rxm.measx.codephase",
3037
16
                FT_UINT32, BASE_CUSTOM, CF_FUNC(&fmt_codephase), 0x0, NULL, HFILL}},
3038
16
        {&hf_ubx_rxm_measx_intcodephase,
3039
16
            {"integer (part of) the code phase", "ubx.rxm.measx.intcodephase",
3040
16
                FT_UINT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}},
3041
16
        {&hf_ubx_rxm_measx_pseurangermserr,
3042
16
            {"pseudorange RMS error index", "ubx.rxm.measx.pseurangermserr",
3043
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
3044
16
        {&hf_ubx_rxm_measx_reserved5,
3045
16
            {"Reserved", "ubx.rxm.measx.reserved5",
3046
16
                FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
3047
3048
        // RXM-RAWX
3049
16
        {&hf_ubx_rxm_rawx,
3050
16
            {"UBX-RXM-RAWX", "ubx.rxm.rawx",
3051
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
3052
16
        {&hf_ubx_rxm_rawx_rcvtow,
3053
16
            {"Measurement time of week in receiver local time", "ubx.rxm.rawx.rcvtow",
3054
16
                FT_DOUBLE, BASE_DEC|BASE_UNIT_STRING, UNS(&units_seconds), 0x0, NULL, HFILL}},
3055
16
        {&hf_ubx_rxm_rawx_week,
3056
16
            {"GPS week number in receiver local time", "ubx.rxm.rawx.week",
3057
16
                FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
3058
16
        {&hf_ubx_rxm_rawx_leaps,
3059
16
            {"GPS leap seconds", "ubx.rxm.rawx.leaps",
3060
16
                FT_INT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_seconds), 0x0, NULL, HFILL}},
3061
16
        {&hf_ubx_rxm_rawx_nummeas,
3062
16
            {"Number of measurements to follow", "ubx.rxm.rawx.nummeas",
3063
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
3064
16
        {&hf_ubx_rxm_rawx_recstat,
3065
16
            {"Receiver tracking status bitfield", "ubx.rxm.rawx.recstat",
3066
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
3067
16
        {&hf_ubx_rxm_rawx_recstat_leapsec,
3068
16
            {"Leap seconds have been determined", "ubx.rxm.rawx.recstat.leapsec",
3069
16
                FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}},
3070
16
        {&hf_ubx_rxm_rawx_recstat_clkreset,
3071
16
            {"Clock reset applied", "ubx.rxm.rawx.recstat.clkreset",
3072
16
                FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}},
3073
16
        {&hf_ubx_rxm_rawx_version,
3074
16
            {"Message version", "ubx.rxm.rawx.version",
3075
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
3076
16
        {&hf_ubx_rxm_rawx_reserved1,
3077
16
            {"Reserved", "ubx.rxm.rawx.reserved1",
3078
16
                FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
3079
16
        {&hf_ubx_rxm_rawx_prmes,
3080
16
            {"Pseudorange measurement", "ubx.rxm.rawx.prmes",
3081
16
                FT_DOUBLE, BASE_DEC|BASE_UNIT_STRING, UNS(&units_meter_meters), 0x0, NULL, HFILL}},
3082
16
        {&hf_ubx_rxm_rawx_cpmes,
3083
16
            {"Carrier phase measurement", "ubx.rxm.rawx.cpmes",
3084
16
                FT_DOUBLE, BASE_DEC|BASE_UNIT_STRING, UNS(&units_cycle_cycles), 0x0, NULL, HFILL}},
3085
16
        {&hf_ubx_rxm_rawx_domes,
3086
16
            {"Doppler measurement", "ubx.rxm.rawx.domes",
3087
16
                FT_FLOAT, BASE_DEC|BASE_UNIT_STRING, UNS(&units_hz), 0x0, NULL, HFILL}},
3088
16
        {&hf_ubx_rxm_rawx_gnssid,
3089
16
            {"GNSS ID", "ubx.rxm.rawx.gnssid",
3090
16
                FT_UINT8, BASE_DEC, VALS(UBX_GNSS_ID), 0x0, NULL, HFILL}},
3091
16
        {&hf_ubx_rxm_rawx_svid,
3092
16
            {"Satellite ID", "ubx.rxm.rawx.svid",
3093
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
3094
16
        {&hf_ubx_rxm_rawx_sigid,
3095
16
            {"Signal ID", "ubx.rxm.rawx.sigid",
3096
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
3097
16
        {&hf_ubx_rxm_rawx_freqid,
3098
16
            {"Frequency ID", "ubx.rxm.rawx.freqid",
3099
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
3100
16
        {&hf_ubx_rxm_rawx_locktime,
3101
16
            {"Carrier phase locktime counter", "ubx.rxm.rawx.locktime",
3102
16
                FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}},
3103
16
        {&hf_ubx_rxm_rawx_cn0,
3104
16
            {"C/N0", "ubx.rxm.rawx.cn0",
3105
16
                FT_UINT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_dbhz), 0x0, NULL, HFILL}},
3106
16
        {&hf_ubx_rxm_rawx_prstdev,
3107
16
            {"Estimated pseudorange measurement standard deviation", "ubx.rxm.rawx.prstdev",
3108
16
                FT_UINT8, BASE_CUSTOM, CF_FUNC(&fmt_prstdev), 0x0f, NULL, HFILL}},
3109
16
        {&hf_ubx_rxm_rawx_cpstdev,
3110
16
            {"Estimated carrier phase measurement standard deviation", "ubx.rxm.rawx.cpstdev",
3111
16
                FT_UINT8, BASE_CUSTOM, CF_FUNC(&fmt_cpstdev), 0x0f, NULL, HFILL}},
3112
16
        {&hf_ubx_rxm_rawx_dostdev,
3113
16
            {"Estimated Doppler measurement standard deviation", "ubx.rxm.rawx.dostdev",
3114
16
                FT_UINT8, BASE_CUSTOM, CF_FUNC(&fmt_dostdev), 0x0f, NULL, HFILL}},
3115
16
        {&hf_ubx_rxm_rawx_trkstat,
3116
16
            {"Tracking status bitfield", "ubx.rxm.rawx.trkstat",
3117
16
                FT_UINT8, BASE_HEX, NULL, 0x0f, NULL, HFILL}},
3118
16
        {&hf_ubx_rxm_rawx_trkstat_prvalid,
3119
16
            {"Pseudorange valid", "ubx.rxm.rawx.trkstat.prvalid",
3120
16
                FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}},
3121
16
        {&hf_ubx_rxm_rawx_trkstat_cpvalid,
3122
16
            {"Carrier phase valid", "ubx.rxm.rawx.trkstat.cpvalid",
3123
16
                FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}},
3124
16
        {&hf_ubx_rxm_rawx_trkstat_halfcyc,
3125
16
            {"Half cycle valid", "ubx.rxm.rawx.trkstat.halfcyc",
3126
16
                FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL}},
3127
16
        {&hf_ubx_rxm_rawx_trkstat_subhalfcyc,
3128
16
            {"Half cycle subtracted from phase", "ubx.rxm.rawx.trkstat.subhalfcyc",
3129
16
                FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL}},
3130
16
        {&hf_ubx_rxm_rawx_reserved2,
3131
16
            {"Reserved", "ubx.rxm.rawx.reserved2",
3132
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
3133
3134
        // RXM-SFRBX
3135
16
        {&hf_ubx_rxm_sfrbx,
3136
16
            {"UBX-RXM-SFRBX", "ubx.rxm.sfrbx",
3137
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
3138
16
        {&hf_ubx_rxm_sfrbx_gnssid,
3139
16
            {"GNSS ID", "ubx.rxm.sfrbx.gnssid",
3140
16
                FT_UINT8, BASE_DEC, VALS(UBX_GNSS_ID), 0x0, NULL, HFILL}},
3141
16
        {&hf_ubx_rxm_sfrbx_svid,
3142
16
            {"Satellite ID", "ubx.rxm.sfrbx.svid",
3143
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
3144
16
        {&hf_ubx_rxm_sfrbx_sigid,
3145
16
            {"Signal identifier", "ubx.rxm.sfrbx.sigid",
3146
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
3147
16
        {&hf_ubx_rxm_sfrbx_freqid,
3148
16
            {"Frequency identifier", "ubx.rxm.sfrbx.freqid",
3149
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
3150
16
        {&hf_ubx_rxm_sfrbx_numwords,
3151
16
            {"Number of data words", "ubx.rxm.sfrbx.numwords",
3152
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
3153
16
        {&hf_ubx_rxm_sfrbx_chn,
3154
16
            {"Tracking channel number", "ubx.rxm.sfrbx.chn",
3155
16
                FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
3156
16
        {&hf_ubx_rxm_sfrbx_version,
3157
16
            {"Message version", "ubx.rxm.sfrbx.version",
3158
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
3159
16
        {&hf_ubx_rxm_sfrbx_dwrd,
3160
16
            {"Data words (little endian)", "ubx.rxm.sfrbx.dwrd",
3161
16
                FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}},
3162
16
        {&hf_ubx_rxm_sfrbx_reserved1,
3163
16
            {"Reserved 1", "ubx.rxm.sfrbx.reserved1",
3164
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
3165
16
        {&hf_ubx_rxm_sfrbx_reserved2,
3166
16
            {"Reserved 2", "ubx.rxm.sfrbx.reserved2",
3167
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
3168
16
        {&hf_ubx_rxm_sfrbx_reserved3,
3169
16
            {"Reserved 3", "ubx.rxm.sfrbx.reserved3",
3170
16
                FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
3171
16
    };
3172
3173
16
    expert_module_t *expert_ubx;
3174
3175
16
    static ei_register_info ei[] = {
3176
16
        {&ei_ubx_chksum, {"ubx.chksum", PI_CHECKSUM, PI_WARN, "Chksum", EXPFILL}},
3177
16
    };
3178
3179
16
    static int *ett_part[] = {
3180
16
        &ett_ubx,
3181
16
        &ett_ubx_ack_ack,
3182
16
        &ett_ubx_ack_nak,
3183
16
        &ett_ubx_cfg_gnss,
3184
16
        &ett_ubx_cfg_sbas,
3185
16
        &ett_ubx_cfg_sbas_mode,
3186
16
        &ett_ubx_cfg_sbas_scanmode,
3187
16
        &ett_ubx_mon_rf,
3188
16
        &ett_ubx_mon_rf_flags,
3189
16
        &ett_ubx_nav_dop,
3190
16
        &ett_ubx_nav_eoe,
3191
16
        &ett_ubx_nav_odo,
3192
16
        &ett_ubx_nav_posecef,
3193
16
        &ett_ubx_nav_pvt,
3194
16
        &ett_ubx_nav_pvt_datetime,
3195
16
        &ett_ubx_nav_pvt_valid,
3196
16
        &ett_ubx_nav_pvt_flags,
3197
16
        &ett_ubx_nav_pvt_flags2,
3198
16
        &ett_ubx_nav_relposned,
3199
16
        &ett_ubx_nav_relposned_flags,
3200
16
        &ett_ubx_nav_sat,
3201
16
        &ett_ubx_nav_sat_flags,
3202
16
        &ett_ubx_nav_sbas,
3203
16
        &ett_ubx_nav_sbas_service,
3204
16
        &ett_ubx_nav_timegps,
3205
16
        &ett_ubx_nav_timegps_tow,
3206
16
        &ett_ubx_nav_timegps_valid,
3207
16
        &ett_ubx_nav_timeutc,
3208
16
        &ett_ubx_nav_timeutc_valid,
3209
16
        &ett_ubx_nav_velecef,
3210
16
        &ett_ubx_rxm_measx,
3211
16
        &ett_ubx_rxm_rawx,
3212
16
        &ett_ubx_rxm_rawx_recstat,
3213
16
        &ett_ubx_rxm_rawx_trkstat,
3214
16
        &ett_ubx_rxm_sfrbx,
3215
16
    };
3216
3217
16
    static int *ett[array_length(ett_part)
3218
16
        + array_length(ett_ubx_nav_sat_sv_info)
3219
16
        + array_length(ett_ubx_cfg_gnss_block)
3220
16
        + array_length(ett_ubx_nav_sbas_sv_info)
3221
16
        + array_length(ett_ubx_rxm_rawx_meas)
3222
16
        + array_length(ett_ubx_rxm_measx_meas)
3223
16
        + array_length(ett_ubx_mon_rf_rf_info)];
3224
3225
    // fill ett with elements from ett_part,
3226
    // pointers to ett_ubx_nav_sat_sv_info elements,
3227
    // pointers to ett_ubx_cfg_gnss_block elements,
3228
    // pointers to ett_ubx_nav_sbas_sv_info elements,
3229
    // pointers to ett_ubx_rxm_rawx_meas elements,
3230
    // pointers to ett_ubx_rxm_measx_meas elements, and
3231
    // pointers to ett_ubx_mon_rf_rf_info elements
3232
16
    size_t i;
3233
576
    for (i = 0; i < array_length(ett_part); i++) {
3234
560
        ett[i] = ett_part[i];
3235
560
    }
3236
4.09k
    for (i = 0; i < array_length(ett_ubx_nav_sat_sv_info); i++) {
3237
4.08k
        ett[i + array_length(ett_part)] = &ett_ubx_nav_sat_sv_info[i];
3238
4.08k
    }
3239
4.09k
    for (i = 0; i < array_length(ett_ubx_cfg_gnss_block); i++) {
3240
4.08k
        ett[i + array_length(ett_part) + array_length(ett_ubx_nav_sat_sv_info)]
3241
4.08k
            = &ett_ubx_cfg_gnss_block[i];
3242
4.08k
    }
3243
4.09k
    for (i = 0; i < array_length(ett_ubx_nav_sbas_sv_info); i++) {
3244
4.08k
        ett[i + array_length(ett_part) + array_length(ett_ubx_nav_sat_sv_info)
3245
4.08k
            + array_length(ett_ubx_cfg_gnss_block)]
3246
4.08k
            = &ett_ubx_nav_sbas_sv_info[i];
3247
4.08k
    }
3248
4.09k
    for (i = 0; i < array_length(ett_ubx_rxm_rawx_meas); i++) {
3249
4.08k
        ett[i + array_length(ett_part) + array_length(ett_ubx_nav_sat_sv_info)
3250
4.08k
            + array_length(ett_ubx_cfg_gnss_block)
3251
4.08k
            + array_length(ett_ubx_nav_sbas_sv_info)]
3252
4.08k
            = &ett_ubx_rxm_rawx_meas[i];
3253
4.08k
    }
3254
4.09k
    for (i = 0; i < array_length(ett_ubx_rxm_measx_meas); i++) {
3255
4.08k
        ett[i + array_length(ett_part) + array_length(ett_ubx_nav_sat_sv_info)
3256
4.08k
            + array_length(ett_ubx_cfg_gnss_block)
3257
4.08k
            + array_length(ett_ubx_nav_sbas_sv_info)
3258
4.08k
            + array_length(ett_ubx_rxm_rawx_meas)]
3259
4.08k
            = &ett_ubx_rxm_measx_meas[i];
3260
4.08k
    }
3261
4.09k
    for (i = 0; i < array_length(ett_ubx_mon_rf_rf_info); i++) {
3262
4.08k
        ett[i + array_length(ett_part) + array_length(ett_ubx_nav_sat_sv_info)
3263
4.08k
            + array_length(ett_ubx_cfg_gnss_block)
3264
4.08k
            + array_length(ett_ubx_nav_sbas_sv_info)
3265
4.08k
            + array_length(ett_ubx_rxm_rawx_meas)
3266
4.08k
            + array_length(ett_ubx_rxm_measx_meas)]
3267
4.08k
            = &ett_ubx_mon_rf_rf_info[i];
3268
4.08k
    }
3269
3270
16
    proto_ubx = proto_register_protocol("UBX Protocol", "UBX", "ubx");
3271
3272
16
    ubx_handle = register_dissector("ubx", dissect_ubx, proto_ubx);
3273
3274
16
    proto_register_field_array(proto_ubx, hf, array_length(hf));
3275
16
    proto_register_subtree_array(ett, array_length(ett));
3276
3277
16
    expert_ubx = expert_register_protocol(proto_ubx);
3278
16
    expert_register_field_array(expert_ubx, ei, array_length(ei));
3279
3280
16
    ubx_class_id_dissector_table = register_dissector_table("ubx.msg_class_id",
3281
16
            "UBX Message Class & ID", proto_ubx, FT_UINT16, BASE_HEX);
3282
16
    ubx_gnssid_dissector_table = register_dissector_table("ubx.rxm.sfrbx.gnssid",
3283
16
            "UBX-RXM-SFRBX GNSS Type ID", proto_ubx,
3284
16
            FT_UINT8, BASE_DEC);
3285
16
}
3286
3287
16
void proto_reg_handoff_ubx(void) {
3288
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_ack_ack,       UBX_ACK_ACK);
3289
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_ack_nak,       UBX_ACK_NAK);
3290
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_cfg_gnss,      UBX_CFG_GNSS);
3291
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_cfg_sbas,      UBX_CFG_SBAS);
3292
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_mon_rf,        UBX_MON_RF);
3293
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_nav_dop,       UBX_NAV_DOP);
3294
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_nav_eoe,       UBX_NAV_EOE);
3295
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_nav_odo,       UBX_NAV_ODO);
3296
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_nav_posecef,   UBX_NAV_POSECEF);
3297
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_nav_pvt,       UBX_NAV_PVT);
3298
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_nav_relposned, UBX_NAV_RELPOSNED);
3299
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_nav_sat,       UBX_NAV_SAT);
3300
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_nav_sbas,      UBX_NAV_SBAS);
3301
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_nav_timegps,   UBX_NAV_TIMEGPS);
3302
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_nav_timeutc,   UBX_NAV_TIMEUTC);
3303
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_nav_velecef,   UBX_NAV_VELECEF);
3304
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_rxm_measx,     UBX_RXM_MEASX);
3305
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_rxm_rawx,      UBX_RXM_RAWX);
3306
16
    UBX_REGISTER_DISSECTOR(dissect_ubx_rxm_sfrbx,     UBX_RXM_SFRBX);
3307
16
}