INSTINCT Code Coverage Report


Directory: src/
File: util/Vendor/Ublox/UbloxTypes.hpp
Date: 2025-02-07 16:54:41
Exec Total Coverage
Lines: 3 5 60.0%
Functions: 3 4 75.0%
Branches: 0 2 0.0%

Line Branch Exec Source
1 // This file is part of INSTINCT, the INS Toolkit for Integrated
2 // Navigation Concepts and Training by the Institute of Navigation of
3 // the University of Stuttgart, Germany.
4 //
5 // This Source Code Form is subject to the terms of the Mozilla Public
6 // License, v. 2.0. If a copy of the MPL was not distributed with this
7 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9 /// @file UbloxTypes.hpp
10 /// @brief Type Definitions for Ublox messages
11 /// @author T. Topp (topp@ins.uni-stuttgart.de)
12 /// @date 2020-05-19
13
14 #pragma once
15
16 #include <string>
17 #include <array>
18 #include <optional>
19 #include <bitset>
20 #include <vector>
21 #include <cstdint>
22 #include <fmt/ostream.h>
23
24 #include "Navigation/GNSS/Core/SatelliteIdentifier.hpp"
25
26 namespace NAV::vendor::ublox
27 {
28 /// @brief Error detection modes available
29 enum ErrorDetectionMode : uint8_t
30 {
31 ERRORDETECTIONMODE_NONE, ///< No error detection is used
32 ERRORDETECTIONMODE_CHECKSUM, ///< 16-bit checksum is used
33 };
34
35 /// @brief Enumeration of the available asynchronous ASCII talker IDs.
36 enum NmeaTalkerID : uint8_t
37 {
38 NMEA_TALKER_ID_OFF = 0, ///< Asynchronous output is turned off.
39 NMEA_TALKER_ID_GP = 1, ///< GPS, SBAS, QZSS
40 NMEA_TALKER_ID_GL = 2, ///< GLONASS
41 NMEA_TALKER_ID_GA = 3, ///< Galileo
42 NMEA_TALKER_ID_GB = 4, ///< BeiDou
43 NMEA_TALKER_ID_GN = 5 ///< Any combination of GNSS
44 };
45
46 /// @brief NMEA Message Type.
47 enum NmeaMessageClass : uint8_t
48 {
49 NMEA_MSG_CLASS_STANDARD = 0xF0, ///< Standard Messages
50 NMEA_MSG_CLASS_PUBX = 0xF1 ///< PUBX Messages
51 };
52
53 /// @brief NMEA Standard Messages.
54 /// Class ID = 0xF0
55 enum NmeaStandardMessages : uint8_t
56 {
57 NMEA_STANDARD_MSG_DTM = 0x0A, ///< Datum Reference
58 NMEA_STANDARD_MSG_GBQ = 0x44, ///< Poll a standard message (if the current Talker ID is GB)
59 NMEA_STANDARD_MSG_GBS = 0x09, ///< GNSS Satellite Fault Detection
60 NMEA_STANDARD_MSG_GGA = 0x00, ///< Global positioning system fix data
61 NMEA_STANDARD_MSG_GLL = 0x01, ///< Latitude and longitude, with time of position fix and status
62 NMEA_STANDARD_MSG_GLQ = 0x43, ///< Poll a standard message (if the current Talker ID is GL)
63 NMEA_STANDARD_MSG_GNQ = 0x42, ///< Poll a standard message (if the current Talker ID is GN)
64 NMEA_STANDARD_MSG_GNS = 0x0D, ///< GNSS fix data
65 NMEA_STANDARD_MSG_GPQ = 0x40, ///< Poll a standard message (if the current Talker ID is GP)
66 NMEA_STANDARD_MSG_GRS = 0x06, ///< GNSS Range Residuals
67 NMEA_STANDARD_MSG_GSA = 0x02, ///< GNSS DOP and Active Satellites
68 NMEA_STANDARD_MSG_GST = 0x07, ///< GNSS Pseudo Range Error Statistics
69 NMEA_STANDARD_MSG_GSV = 0x03, ///< GNSS Satellites in View
70 NMEA_STANDARD_MSG_RMC = 0x04, ///< Recommended Minimum data
71 NMEA_STANDARD_MSG_TXT = 0x41, ///< Text Transmission
72 NMEA_STANDARD_MSG_VLW = 0x0F, ///< Dual ground/water distance
73 NMEA_STANDARD_MSG_VTG = 0x05, ///< Course over ground and Ground speed
74 NMEA_STANDARD_MSG_ZDA = 0x08 ///< Time and Date
75 };
76
77 /// @brief NMEA PUBX Messages.
78 /// Class ID = 0xF1
79 enum NmeaPubxMessages : uint8_t
80 {
81 NMEA_PUBX_MSG_CONFIG = 0x41, ///< Set Protocols and Baudrate
82 NMEA_PUBX_MSG_POSITION = 0x00, ///< Lat/Long Position Data
83 NMEA_PUBX_MSG_RATE = 0x40, ///< Set NMEA message output rate
84 NMEA_PUBX_MSG_SVSTATUS = 0x03, ///< Satellite Status
85 NMEA_PUBX_MSG_TIME = 0x04 ///< Time of Day and Clock Information
86 };
87
88 /// @brief The available UBX Class IDs
89 enum UbxClass : uint8_t
90 {
91 UBX_CLASS_NONE = 0x00, ///< No Message Class specified
92 UBX_CLASS_NAV = 0x01, ///< Navigation Results Messages: Position, Speed, Time, Acceleration, Heading, DOP, SVs used
93 UBX_CLASS_RXM = 0x02, ///< Receiver Manager Messages: Satellite Status, RTC Status
94 UBX_CLASS_INF = 0x04, ///< Information Messages: Printf-Style Messages, with IDs such as Error, Warning, Notice
95 UBX_CLASS_ACK = 0x05, ///< Ack/Nak Messages: Acknowledge or Reject messages to UBX-CFG input messages
96 UBX_CLASS_CFG = 0x06, ///< Configuration Input Messages: Configure the receiver
97 UBX_CLASS_UPD = 0x09, ///< Firmware Update Messages: Memory/Flash erase/write, Reboot, Flash identification, etc.
98 UBX_CLASS_MON = 0x0A, ///< Monitoring Messages: Communication Status, CPU Load, Stack Usage, Task Status
99 UBX_CLASS_AID [[deprecated]] = 0x0B, ///< AssistNow Aiding Messages: Ephemeris, Almanac, other A-GPS data input
100 UBX_CLASS_TIM = 0x0D, ///< Timing Messages: Time Pulse Output, Time Mark Results
101 UBX_CLASS_ESF = 0x10, ///< External Sensor Fusion Messages: External Sensor Measurements and Status Information
102 UBX_CLASS_MGA = 0x13, ///< Multiple GNSS Assistance Messages: Assistance data for various GNSS
103 UBX_CLASS_LOG = 0x21, ///< Logging Messages: Log creation, deletion, info and retrieval
104 UBX_CLASS_SEC = 0x27, ///< Security Feature Messages
105 UBX_CLASS_HNR = 0x28 ///< High Rate Navigation Results Messages: High rate time, position, speed, heading
106 };
107
108 /// @brief The available ACK Messages
109 enum UbxAckMessages : uint8_t
110 {
111 /// Message Acknowledged (Length = 2; Type = Output)
112 UBX_ACK_ACK = 0x01,
113 /// Message Not-Acknowledged (Length = 2; Type = Output)
114 UBX_ACK_NAK = 0x00
115 };
116
117 /// @brief Message Acknowledged
118 ///
119 /// Output upon processing of an input message. ACK Message is sent as soon as possible but at least within one second.
120 struct UbxAckAck
121 {
122 uint8_t clsID = 0; ///< Class ID of the Acknowledged Message
123 uint8_t msgID = 0; ///< Message ID of the Acknowledged Message
124 };
125
126 /// @brief Message Not-Acknowledged
127 ///
128 /// Output upon processing of an input message. NAK Message is sent as soon as possible but at least within one second.
129 struct UbxAckNak
130 {
131 uint8_t clsID = 0; ///< Class ID of the Not-Acknowledged Message
132 uint8_t msgID = 0; ///< Message ID of the Not-Acknowledged Message
133 };
134
135 /// @brief The available CFG Messages
136 enum UbxCfgMessages : uint8_t
137 {
138 /// Antenna Control Settings (Length = 4; Type = Get/Set)
139 UBX_CFG_ANT = 0x13,
140 /// Get/Set data batching configuration (Length = 8; Type = Get/Set)
141 UBX_CFG_BATCH = 0x93,
142 /// Clear, Save and Load configurations (Length = (12) or (13); Type = Command)
143 UBX_CFG_CFG = 0x09,
144 /// - Set User-defined Datum. (Length = 44; Type = Set)
145 /// - The currently defined Datum (Length = 52; Type = Get)
146 UBX_CFG_DAT = 0x06,
147 /// DGNSS configuration (Length = 4; Type = Get/Set)
148 UBX_CFG_DGNSS = 0x70,
149 /// Disciplined oscillator configuration (Length = 4 + 32*numOsc; Type = Get/Set)
150 UBX_CFG_DOSC = 0x61,
151 /// External synchronization source configuration (Length = 4 + 36*numSources; Type = Get/Set)
152 UBX_CFG_ESRC = 0x60,
153 /// Geofencing configuration (Length = 8 + 12*numFences; Type = Get/Set)
154 UBX_CFG_GEOFENCE = 0x69,
155 /// GNSS system configuration (Length = 4 + 8*numConfigBlocks; Type = Get/Set)
156 UBX_CFG_GNSS = 0x3E,
157 /// High Navigation Rate Settings (Length = 4; Type = Get/Set)
158 UBX_CFG_HNR = 0x5C,
159 /// - Poll configuration for one protocol (Length = 1; Type = Poll Request)
160 /// - Information message configuration (Length = 0 + 10*N; Type = Get/Set)
161 UBX_CFG_INF = 0x02,
162 /// Jamming/Interference Monitor configuration (Length = 8; Type = Get/Set)
163 UBX_CFG_ITFM = 0x39,
164 /// Data Logger Configuration (Length = 12; Type = Get/Set)
165 UBX_CFG_LOGFILTER = 0x47,
166 /// - Poll a message configuration (Length = 2; Type = Poll Request)
167 /// - Set Message Rate(s) (Length = 8; Type = Get/Set)
168 /// - Set Message Rate (Length = 3; Type = Get/Set)
169 UBX_CFG_MSG = 0x01,
170 /// Navigation Engine Settings (Length = 36; Type = Get/Set)
171 UBX_CFG_NAV5 = 0x24,
172 /// - Navigation Engine Expert Settings (Length = 40; Type = Get/Set)
173 /// - Navigation Engine Expert Settings (Length = 40; Type = Get/Set)
174 /// - Navigation Engine Expert Settings (Length = 44; Type = Get/Set)
175 UBX_CFG_NAVX5 = 0x23,
176 /// - NMEA protocol configuration (deprecated) (Length = 4; Type = Get/Set)
177 /// - NMEA protocol configuration V0 (deprecated) (Length = 12; Type = Get/Set)
178 /// - Extended NMEA protocol configuration V1 (Length = 20; Type = Get/Set)
179 UBX_CFG_NMEA = 0x17,
180 /// Odometer, Low-speed COG Engine Settings (Length = 20; Type = Get/Set)
181 UBX_CFG_ODO = 0x1E,
182 /// - Extended Power Management configuration (Length = 44; Type = Get/Set)
183 /// - Extended Power Management configuration (Length = 48; Type = Get/Set)
184 /// - Extended Power Management configuration (Length = 48; Type = Get/Set)
185 UBX_CFG_PM2 = 0x3B,
186 /// Power Mode Setup (Length = 8; Type = Get/Set)
187 UBX_CFG_PMS = 0x86,
188 /// - Polls the configuration for one I/O Port (Length = 1; Type = Poll Request)
189 /// - Port Configuration for UART (Length = 20; Type = Get/Set)
190 /// - Port Configuration for USB Port (Length = 20; Type = Get/Set)
191 /// - Port Configuration for SPI Port (Length = 20; Type = Get/Set)
192 /// - Port Configuration for DDC Port (Length = 20; Type = Get/Set)
193 UBX_CFG_PRT = 0x00,
194 /// Put receiver in a defined power state (Length = 8; Type = Set)
195 UBX_CFG_PWR = 0x57,
196 /// Navigation/Measurement Rate Settings (Length = 6; Type = Get/Set)
197 UBX_CFG_RATE = 0x08,
198 /// Contents of Remote Inventory (Length = 1 + 1*N; Type = Get/Set)
199 UBX_CFG_RINV = 0x34,
200 /// Reset Receiver / Clear Backup Data Structures (Length = 4; Type = Command)
201 UBX_CFG_RST = 0x04,
202 /// - RXM configuration (Length = 2; Type = Get/Set)
203 /// - RXM configuration (Length = 2; Type = Get/Set)
204 UBX_CFG_RXM = 0x11,
205 /// SBAS Configuration (Length = 8; Type = Get/Set)
206 UBX_CFG_SBAS = 0x16,
207 /// SLAS Configuration (Length = 4; Type = Get/Set)
208 UBX_CFG_SLAS = 0x8D,
209 /// Synchronization manager configuration (Length = 20; Type = Get/Set)
210 UBX_CFG_SMGR = 0x62,
211 /// Time Mode Settings 2 (Length = 28; Type = Get/Set)
212 UBX_CFG_TMODE2 = 0x3D,
213 /// Time Mode Settings 3 (Length = 40; Type = Get/Set)
214 UBX_CFG_TMODE3 = 0x71,
215 /// - Poll Time Pulse Parameters for Time Pulse 0 (Length = 0; Type = Poll Request)
216 /// - Poll Time Pulse Parameters (Length = 1; Type = Poll Request)
217 /// - Time Pulse Parameters (Length = 32; Type = Get/Set)
218 /// - Time Pulse Parameters (Length = 32; Type = Get/Se
219 UBX_CFG_TP5 = 0x31,
220 /// TX buffer time slots configuration (Length = 16; Type = Set)
221 UBX_CFG_TXSLOT = 0x53,
222 /// USB Configuration (Length = 108; Type = Get/Set)
223 UBX_CFG_USB = 0x1B,
224 };
225
226 /// @brief The available ESF Messages
227 enum UbxEsfMessages : uint8_t
228 {
229 /// Vehicle dynamics information (Length = 36; Type = Periodic/Polled)
230 UBX_ESF_INS = 0x15,
231 /// External Sensor Fusion Measurements (Length = (8 + 4*numMeas) or (12 + 4*numMeas); Type = Input/Output)
232 UBX_ESF_MEAS = 0x02,
233 /// Raw sensor measurements (Length = 4 + 8*N; Type = Output)
234 UBX_ESF_RAW = 0x03,
235 /// External Sensor Fusion (ESF) status information (Length = 16 + 4*numSens; Type = Periodic/Polled)
236 UBX_ESF_STATUS = 0x10,
237 };
238
239 /// @brief Vehicle dynamics information
240 ///
241 /// This message outputs information about the vehicle dynamics.
242 /// For ADR products (in protocol versions less than 19.2), the output dynamics
243 /// information (angular rates and accelerations) is expressed with respect to the
244 /// vehicle-frame. More information can be found in the ADR Navigation Output
245 /// section.
246 /// For ADR products, the output dynamics information (angular rates and
247 /// accelerations) is expressed with respect to the vehicle-frame. More information
248 /// can be found in the ADR Navigation Output section.
249 /// For UDR products, the output dynamics information (angular rates and
250 /// accelerations) are expressed with respect to the body-frame. More information
251 /// can be found in the UDR Navigation Output section.
252 struct UbxEsfIns
253 {
254 std::bitset<4UL * 8UL> bitfield0; ///< Bitfield (zAccelValid, yAccelValid, xAccelValid, zAngRateValid, yAngRateValid, xAngRateValid, version)
255 std::array<uint8_t, 4> reserved1{}; ///< Reserved
256 uint32_t iTOW = 0; ///< GPS time of week of the navigation epoch. See the description of iTOW for details. [ms]
257 int32_t xAngRate = 0; ///< Compensated x-axis angular rate. [deg/s * 1e-3]
258 int32_t yAngRate = 0; ///< Compensated y-axis angular rate. [deg/s * 1e-3]
259 int32_t zAngRate = 0; ///< Compensated z-axis angular rate. [deg/s * 1e-3]
260 int32_t xAccel = 0; ///< Compensated x-axis acceleration (gravity-free). [m/s^2 * 1e-2]
261 int32_t yAccel = 0; ///< Compensated y-axis acceleration (gravity-free). [m/s^2 * 1e-2]
262 int32_t zAccel = 0; ///< Compensated z-axis acceleration (gravity-free). [m/s^2 * 1e-2]
263 };
264
265 /// @brief External Sensor Fusion Measurements
266 ///
267 /// Possible data types for the data field are described in the ESF Measurement Data section.
268 struct UbxEsfMeas
269 {
270 uint32_t timeTag = 0; ///< Time tag of measurement generated by external sensor
271 std::bitset<2UL * 8UL> flags; ///< Flags. Set all unused bits to zero (timeMarkSent, timeMarkEdge, calibTtagValid, numMeas)
272 uint16_t id = 0; ///< Identification number of data provider
273 std::vector<uint32_t> data; ///< data (see graphic below)
274 std::optional<std::vector<uint32_t>> calibTtag; ///< Receiver local time calibrated. This field must not be supplied when calibTtagValid is set to 0. [ms]
275 };
276
277 /// @brief Raw sensor measurements
278 ///
279 /// The message contains measurements from the active inertial sensors
280 /// connected to the GNSS chip. Possible data types for the data field are
281 /// accelerometer, gyroscope and temperature readings as described in the ESF
282 /// Measurement Data section.
283 /// Note that the rate selected in UBX-CFG-MSG is not respected. If a positive rate is
284 /// selected then all raw measurements will be output.
285 /// See also Raw Sensor Measurement Data.
286 struct UbxEsfRaw
287 {
288 /// @brief Repeated data in this message
289 struct UbxEsfRawData
290 {
291 uint32_t data = 0; ///< data. Same as in UBX-ESF-MEAS (see graphic below)
292 uint32_t sTtag = 0; ///< sensor time tag
293 };
294
295 std::array<uint8_t, 4> reserved1{}; ///< Reserved
296 std::vector<UbxEsfRawData> data; ///< Repeated block
297 };
298
299 /// @brief External Sensor Fusion (ESF) status information
300 struct UbxEsfStatus
301 {
302 /// @brief Repeated data in this message
303 struct UbxEsfStatusSensor
304 {
305 std::bitset<1UL * 8UL> sensStatus1; ///< Sensor status, part 1 (seegraphic below)
306 std::bitset<1UL * 8UL> sensStatus2; ///< Sensor status, part 2 (seegraphic below)
307 uint8_t freq = 0; ///< Observation frequency [Hz]
308 std::bitset<1UL * 8UL> faults; ///< Sensor faults (see graphic below)
309 };
310
311 uint32_t iTOW = 0; ///< GPS time of week of the navigation epoch. See the description of iTOW for details. [ms]
312 uint8_t version = 0; ///< Message version (2 for this version)
313 std::array<uint8_t, 7> reserved1{}; ///< Reserved
314 /// Fusion mode:0: Initialization mode: receiver is initializing some unknown values required for doing sensor fusion
315 /// 1: Fusion mode: GNSS and sensor data are used for navigation solution computation
316 /// 2: Suspended fusion mode: sensor fusion is temporarily disabled due to e.g. invalid sensor data or detected ferry
317 /// 3: Disabled fusion mode: sensor fusion is permanently disabled until receiver reset due e.g. to sensor error More details can be found in the Fusion Modes section.
318 uint8_t fusionMode = 0;
319 std::array<uint8_t, 2> reserved2{}; ///< Reserved
320 uint8_t numSens = 0; ///< Number of sensors
321 std::vector<UbxEsfStatusSensor> sensors; ///< Repeated block
322 };
323
324 /// @brief The available HNR Messages
325 enum UbxHnrMessages : uint8_t
326 {
327 /// Vehicle dynamics information (Length = 36; Type = Periodic/Polled)
328 UBX_HNR_INS = 0x02,
329 /// High Rate Output of PVT Solution (Length = 72; Type = Periodic/Polled)
330 UBX_HNR_PVT = 0x00,
331 };
332
333 /// @brief The available INF Messages
334 enum UbxInfMessages : uint8_t
335 {
336 /// ASCII output with debug contents (Length = 0 + 1*N; Type = Output)
337 UBX_INF_DEBUG = 0x04,
338 /// ASCII output with error contents (Length = 0 + 1*N; Type = Output)
339 UBX_INF_ERROR = 0x00,
340 /// ASCII output with informational contents (Length = 0 + 1*N; Type = Output)
341 UBX_INF_NOTICE = 0x02,
342 /// ASCII output with test contents (Length = 0 + 1*N; Type = Output)
343 UBX_INF_TEST = 0x03,
344 /// ASCII output with warning contents (Length = 0 + 1*N; Type = Output)
345 UBX_INF_WARNING = 0x01,
346 };
347
348 /// @brief The available LOG Messages
349 enum UbxLogMessages : uint8_t
350 {
351 /// Batched data (Length = 100; Type = Polled)
352 UBX_LOG_BATCH = 0x11,
353 /// Create Log File (Length = 8; Type = Command)
354 UBX_LOG_CREATE = 0x07,
355 /// Erase Logged Data (Length = 0; Type = Command)
356 UBX_LOG_ERASE = 0x03,
357 /// - Find index of a log entry based on a given time (Length = 12; Type = Input)
358 /// - Response to FINDTIME request (Length = 8; Type = Output)
359 UBX_LOG_FINDTIME = 0x0E,
360 /// - Poll for log information (Length = 0; Type = Poll Request)
361 /// - Log information (Length = 48; Type = Output)
362 UBX_LOG_INFO = 0x08,
363 /// Request batch data (Length = 4; Type = Command)
364 UBX_LOG_RETRIEVEBATCH = 0x10,
365 /// Odometer log entry (Length = 32; Type = Output)
366 UBX_LOG_RETRIEVEPOSEXTRA = 0x0F,
367 /// Position fix log entry (Length = 40; Type = Output)
368 UBX_LOG_RETRIEVEPOS = 0x0B,
369 /// Byte string log entry (Length = 16 + 1*byteCount; Type = )
370 UBX_LOG_RETRIEVESTRING = 0x0D,
371 /// Request log data (Length = 12; Type = Command)
372 UBX_LOG_RETRIEVE = 0x09,
373 /// Store arbitrary string in on-board flash (Length = 0 + 1*N; Type = Command)
374 UBX_LOG_STRING = 0x04,
375 };
376
377 /// @brief The available MGA Messages
378 enum UbxMgaMessages : uint8_t
379 {
380 /// Multiple GNSS Acknowledge message (Length = 8; Type = Output)
381 UBX_MGA_ACK_DATA0 = 0x60,
382 /// Multiple GNSS AssistNow Offline Assistance (Length = 76; Type = Input)
383 UBX_MGA_ANO = 0x20,
384 /// BDS Ephemeris Assistance (Length = 88; Type = Input)
385 UBX_MGA_BDS_EPH = 0x03,
386 /// BDS Almanac Assistance (Length = 40; Type = Input)
387 UBX_MGA_BDS_ALM = 0x03,
388 /// BDS Health Assistance (Length = 68; Type = Input)
389 UBX_MGA_BDS_HEALTH = 0x03,
390 /// BDS UTC Assistance (Length = 20; Type = Input)
391 UBX_MGA_BDS_UTC = 0x03,
392 /// BDS Ionospheric Assistance (Length = 16; Type = Input)
393 UBX_MGA_BDS_IONO = 0x03,
394 /// - Poll the Navigation Database (Length = 0; Type = Poll Request)
395 /// - Navigation Database Dump Entry (Length = 12 + 1*N; Type = Input/Output)
396 UBX_MGA_DBD = 0x80,
397 /// Transfer MGA-ANO data block to flash (Length = 6 + 1*size; Type = Input)
398 UBX_MGA_FLASH_DATA = 0x21,
399 /// Finish flashing MGA-ANO data (Length = 2; Type = Input)
400 UBX_MGA_FLASH_STOP = 0x21,
401 /// Acknowledge last FLASH-DATA or -STOP (Length = 6; Type = Output)
402 UBX_MGA_FLASH_ACK = 0x21,
403 /// Galileo Ephemeris Assistance (Length = 76; Type = Input)
404 UBX_MGA_GAL_EPH = 0x02,
405 /// Galileo Almanac Assistance (Length = 32; Type = Input)
406 UBX_MGA_GAL_ALM = 0x02,
407 /// Galileo GPS time offset assistance (Length = 12; Type = Input)
408 UBX_MGA_GAL_TIMEOFFSET = 0x02,
409 /// Galileo UTC Assistance (Length = 20; Type = Input)
410 UBX_MGA_GAL_UTC = 0x02,
411 /// GLONASS Ephemeris Assistance (Length = 48; Type = Input)
412 UBX_MGA_GLO_EPH = 0x06,
413 /// GLONASS Almanac Assistance (Length = 36; Type = Input)
414 UBX_MGA_GLO_ALM = 0x06,
415 /// GLONASS Auxiliary Time Offset Assistance (Length = 20; Type = Input)
416 UBX_MGA_GLO_TIMEOFFSET = 0x06,
417 /// GPS Ephemeris Assistance (Length = 68; Type = Input)
418 UBX_MGA_GPS_EPH = 0x00,
419 /// GPS Almanac Assistance (Length = 36; Type = Input)
420 UBX_MGA_GPS_ALM = 0x00,
421 /// GPS Health Assistance (Length = 40; Type = Input)
422 UBX_MGA_GPS_HEALTH = 0x00,
423 /// GPS UTC Assistance (Length = 20; Type = Input)
424 UBX_MGA_GPS_UTC = 0x00,
425 /// GPS Ionosphere Assistance (Length = 16; Type = Input)
426 UBX_MGA_GPS_IONO = 0x00,
427 /// Initial Position Assistance (Length = 20; Type = Input)
428 UBX_MGA_INI_POS_XYZ = 0x40,
429 /// Initial Position Assistance (Length = 20; Type = Input)
430 UBX_MGA_INI_POS_LLH = 0x40,
431 /// Initial Time Assistance (Length = 24; Type = Input)
432 UBX_MGA_INI_TIME_UTC = 0x40,
433 /// Initial Time Assistance (Length = 24; Type = Input)
434 UBX_MGA_INI_TIME_GNSS = 0x40,
435 /// Initial Clock Drift Assistance (Length = 12; Type = Input)
436 UBX_MGA_INI_CLKD = 0x40,
437 /// Initial Frequency Assistance (Length = 12; Type = Input)
438 UBX_MGA_INI_FREQ = 0x40,
439 /// Earth Orientation Parameters Assistance (Length = 72; Type = Input)
440 UBX_MGA_INI_EOP = 0x40,
441 /// QZSS Ephemeris Assistance (Length = 68; Type = Input)
442 UBX_MGA_QZSS_EPH = 0x05,
443 /// QZSS Almanac Assistance (Length = 36; Type = Input)
444 UBX_MGA_QZSS_ALM = 0x05,
445 /// QZSS Health Assistance (Length = 12; Type = Input)
446 UBX_MGA_QZSS_HEALTH = 0x05,
447 };
448
449 /// @brief The available MON Messages
450 enum UbxMonMessages : uint8_t
451 {
452 /// Data batching buffer status (Length = 12; Type = Polled)
453 UBX_MON_BATCH = 0x32,
454 /// Information message major GNSS selection (Length = 8; Type = Polled)
455 UBX_MON_GNSS = 0x28,
456 /// Extended Hardware Status (Length = 28; Type = Periodic/Polled)
457 UBX_MON_HW2 = 0x0B,
458 /// Hardware Status (Length = 60; Type = Periodic/Polled)
459 UBX_MON_HW = 0x09,
460 /// I/O Subsystem Status (Length = 0 + 20*N; Type = Periodic/Polled)
461 UBX_MON_IO = 0x02,
462 /// Message Parse and Process Status (Length = 120; Type = Periodic/Polled)
463 UBX_MON_MSGPP = 0x06,
464 /// - Poll Request for installed patches (Length = 0; Type = Poll Request)
465 /// - Output information about installed patches (Length = 4 + 16*nEntries; Type = Polled)
466 UBX_MON_PATCH = 0x27,
467 /// Receiver Buffer Status (Length = 24; Type = Periodic/Polled)
468 UBX_MON_RXBUFF = 0x07,
469 /// Receiver Status Information (Length = 1; Type = Output)
470 UBX_MON_RXR = 0x21,
471 /// Synchronization Manager Status (Length = 16; Type = Periodic/Polled)
472 UBX_MON_SMGR = 0x2E,
473 /// Transmitter Buffer Status (Length = 28; Type = Periodic/Polled)
474 UBX_MON_TXBUFF = 0x08,
475 /// - Poll Receiver/Software Version (Length = 0; Type = Poll Request)
476 /// - Receiver/Software Version (Length = 40 + 30*N; Type = Polled)
477 UBX_MON_VER = 0x04,
478 };
479
480 /// @brief The available NAV Messages
481 enum UbxNavMessages : uint8_t
482 {
483 /// AssistNow Autonomous Status (Length = 16; Type = Periodic/Polled)
484 UBX_NAV_AOPSTATUS = 0x60,
485 /// Attitude Solution (Length = 32; Type = Periodic/Polled)
486 UBX_NAV_ATT = 0x05,
487 /// Clock Solution (Length = 20; Type = Periodic/Polled)
488 UBX_NAV_CLOCK = 0x22,
489 /// DGPS Data Used for NAV (Length = 16 + 12*numCh; Type = Periodic/Polled)
490 UBX_NAV_DGPS = 0x31,
491 /// Dilution of precision (Length = 18; Type = Periodic/Polled)
492 UBX_NAV_DOP = 0x04,
493 /// End Of Epoch (Length = 4; Type = Periodic)
494 UBX_NAV_EOE = 0x61,
495 /// Geofencing status (Length = 8 + 2*numFences; Type = Periodic/Polled)
496 UBX_NAV_GEOFENCE = 0x39,
497 /// High Precision Position Solution in ECEF (Length = 28; Type = Periodic/Polled)
498 UBX_NAV_HPPOSECEF = 0x13,
499 /// High Precision Geodetic Position Solution (Length = 36; Type = Periodic/Polled)
500 UBX_NAV_HPPOSLLH = 0x14,
501 /// Odometer Solution (Length = 20; Type = Periodic/Polled)
502 UBX_NAV_ODO = 0x09,
503 /// GNSS Orbit Database Info (Length = 8 + 6*numSv; Type = Periodic/Polled)
504 UBX_NAV_ORB = 0x34,
505 /// Position Solution in ECEF (Length = 20; Type = Periodic/Polled)
506 UBX_NAV_POSECEF = 0x01,
507 /// Geodetic Position Solution (Length = 28; Type = Periodic/Polled)
508 UBX_NAV_POSLLH = 0x02,
509 /// Navigation Position Velocity Time Solution (Length = 92; Type = Periodic/Polled)
510 UBX_NAV_PVT = 0x07,
511 /// Relative Positioning Information in NED frame (Length = 40; Type = Periodic/Polled)
512 UBX_NAV_RELPOSNED = 0x3C,
513 /// Reset odometer (Length = 0; Type = Command)
514 UBX_NAV_RESETODO = 0x10,
515 /// Satellite Information (Length = 8 + 12*numSvs; Type = Periodic/Polled)
516 UBX_NAV_SAT = 0x35,
517 /// SBAS Status Data (Length = 12 + 12*cnt; Type = Periodic/Polled)
518 UBX_NAV_SBAS = 0x32,
519 /// QZSS L1S SLAS Status Data (Length = 20 + 8*cnt; Type = Periodic/Polled)
520 UBX_NAV_SLAS = 0x42,
521 /// Navigation Solution Information (Length = 52; Type = Periodic/Polled)
522 UBX_NAV_SOL = 0x06,
523 /// Receiver Navigation Status (Length = 16; Type = Periodic/Polled)
524 UBX_NAV_STATUS = 0x03,
525 /// Space Vehicle Information (Length = 8 + 12*numCh; Type = Periodic/Polled)
526 UBX_NAV_SVINFO = 0x30,
527 /// Survey-in data (Length = 40; Type = Periodic/Polled)
528 UBX_NAV_SVIN = 0x3B,
529 /// BDS Time Solution (Length = 20; Type = Periodic/Polled)
530 UBX_NAV_TIMEBDS = 0x24,
531 /// Galileo Time Solution (Length = 20; Type = Periodic/Polled)
532 UBX_NAV_TIMEGAL = 0x25,
533 /// GLO Time Solution (Length = 20; Type = Periodic/Polled)
534 UBX_NAV_TIMEGLO = 0x23,
535 /// GPS Time Solution (Length = 16; Type = Periodic/Polled)
536 UBX_NAV_TIMEGPS = 0x20,
537 /// Leap second event information (Length = 24; Type = Periodic/Polled)
538 UBX_NAV_TIMELS = 0x26,
539 /// UTC Time Solution (Length = 20; Type = Periodic/Polled)
540 UBX_NAV_TIMEUTC = 0x21,
541 /// Velocity Solution in ECEF (Length = 20; Type = Periodic/Polled)
542 UBX_NAV_VELECEF = 0x11,
543 /// Velocity Solution in NED (Length = 36; Type = Periodic/Polled)
544 UBX_NAV_VELNED = 0x12,
545 };
546
547 /// @brief Attitude Solution
548 ///
549 /// This message outputs the attitude solution as roll, pitch and heading angles.
550 /// More details about vehicle attitude can be found in the Vehicle Attitude Output
551 /// (ADR) section for ADR products.
552 /// More details about vehicle attitude can be found in the Vehicle Attitude Output
553 /// (UDR) section for UDR products.
554 struct UbxNavAtt
555 {
556 uint32_t iTOW = 0; ///< GPS time of week of the navigation epoch [ms]. See the description of iTOW for details.
557 uint8_t version = 0; ///< Message version (0 for this version)
558 std::array<uint8_t, 3> reserved1{}; ///< Reserved
559 int32_t roll = 0; ///< Vehicle roll [deg * 1e-5]
560 int32_t pitch = 0; ///< Vehicle pitch [deg * 1e-5]
561 int32_t heading = 0; ///< Vehicle heading [deg * 1e-5]
562 uint32_t accRoll = 0; ///< Vehicle roll accuracy [deg * 1e-5] (if null, roll angle is not available).
563 uint32_t accPitch = 0; ///< Vehicle pitch accuracy [deg * 1e-5] (if null, pitch angle is not available).
564 uint32_t accHeading = 0; ///< Vehicle heading accuracy [deg * 1e-5] (if null, heading angle is not available).
565 };
566
567 /// @brief Position Solution in ECEF
568 ///
569 /// See important comments concerning validity of position given in section
570 /// Navigation Output Filters.
571 struct UbxNavPosecef
572 {
573 uint32_t iTOW = 0; ///< GPS time of week of the navigation epoch [ms]. See the description of iTOW for details.
574 int32_t ecefX = 0; ///< ECEF X coordinate [cm]
575 int32_t ecefY = 0; ///< ECEF Y coordinate [cm]
576 int32_t ecefZ = 0; ///< ECEF Z coordinate [cm]
577 uint32_t pAcc = 0; ///< Position Accuracy Estimate [cm]
578 };
579
580 /// @brief Geodetic Position Solution
581 ///
582 /// See important comments concerning validity of position given in section
583 /// Navigation Output Filters.
584 /// This message outputs the Geodetic position in the currently selected ellipsoid.
585 /// The default is the WGS84 Ellipsoid, but can be changed with the message UBX-CFG-DAT.
586 struct UbxNavPosllh
587 {
588 uint32_t iTOW = 0; ///< GPS time of week of the navigation epoch [ms]. See the description of iTOW for details.
589 int32_t lon = 0; ///< Longitude [deg * 1e-7]
590 int32_t lat = 0; ///< Latitude [deg * 1e-7]
591 int32_t height = 0; ///< Height above ellipsoid [mm]
592 int32_t hMSL = 0; ///< Height above mean sea level [mm]
593 uint32_t hAcc = 0; ///< Horizontal accuracy estimate [mm]
594 uint32_t vAcc = 0; ///< Vertical accuracy estimate [mm]
595 };
596
597 /// @brief Velocity Solution in NED
598 ///
599 /// See important comments concerning validity of position given in section Navigation Output Filters.
600 struct UbxNavVelned
601 {
602 uint32_t iTOW = 0; ///< GPS time of week of the navigation epoch [ms]. See the description of iTOW for details.
603 int32_t velN = 0; ///< North velocity component [cm/s]
604 int32_t velE = 0; ///< East velocity component [cm/s]
605 int32_t velD = 0; ///< Down velocity component [cm/s]
606 uint32_t speed = 0; ///< Speed (3-D)
607 uint32_t gSpeed = 0; ///< Ground speed (2-D)
608 int32_t heading = 0; ///< Heading of motion 2-D [deg * 1e-5]
609 uint32_t sAcc = 0; ///< Speed accuracy Estimation [cm/s]
610 uint32_t cAcc = 0; ///< Course / Heading accuracy estimation [deg * 1e-5]
611 };
612
613 /// @brief The available RXM Messages
614 enum UbxRxmMessages : uint8_t
615 {
616 /// Indoor Messaging System Information (Length = 4 + 44*numTx; Type = Periodic/Polled)
617 UBX_RXM_IMES = 0x61,
618 /// - Satellite Measurements for RRLP (Length = 44 + 24*numSV; Type = Periodic/Polled)
619 UBX_RXM_MEASX = 0x14,
620 /// - Requests a Power Management task (Length = 8; Type = Command)
621 /// - Requests a Power Management task (Length = 16; Type = Command)
622 UBX_RXM_PMREQ = 0x41,
623 /// - Multi-GNSS Raw Measurement Data (Length = 16 + 32*numMeas; Type = Periodic/Polled)
624 /// - Multi-GNSS Raw Measurement Data (Length = 16 + 32*numMeas; Type = Periodic/Polled)
625 UBX_RXM_RAWX = 0x15,
626 /// - Galileo SAR Short-RLM report (Length = 16; Type = Output)
627 /// - Galileo SAR Long-RLM report (Length = 28; Type = Output)
628 UBX_RXM_RLM = 0x59,
629 /// RTCM input status (Length = 8; Type = Output)
630 UBX_RXM_RTCM = 0x32,
631 /// - Broadcast Navigation Data Subframe (Length = 8 + 4*numWords; Type = Output)
632 /// - Broadcast Navigation Data Subframe (Length = 8 + 4*numWords; Type = Output)
633 UBX_RXM_SFRBX = 0x13,
634 /// SV Status Info (Length = 8 + 6*numSV; Type = Periodic/Polled)
635 UBX_RXM_SVSI = 0x20,
636 };
637
638 /// @brief Multi-GNSS Raw Measurement Data
639 ///
640 /// This message contains the information needed to be able to generate a RINEX 3 multi-GNSS observation file.
641 /// This message contains pseudorange, Doppler, carrier phase, phase lock and
642 /// signal quality information for GNSS satellites once signals have been
643 /// synchronized. This message supports all active GNSS.
644 struct UbxRxmRawx
645 {
646 /// @brief Repeated data in this message
647 struct UbxRxmRawxData
648 {
649 /// Pseudorange measurement [m].
650 /// GLONASS inter frequency channel delays are compensated with an internal calibration table.
651 double prMes = 0.0;
652 /// Carrier phase measurement [cycles].
653 /// The carrier phase initial ambiguity is initialized using an approximate
654 /// value to make the magnitude of the phase close to the pseudorange measurement.
655 /// Clock resets are applied to both phase and code measurements in accordance with the RINEX specification.
656 double cpMes = 0.0;
657 float doMes = 0.0F; ///< Doppler measurement (positive sign for approaching satellites) [Hz]
658 uint8_t gnssId = 0; ///< GNSS identifier (see Satellite Numbering for a list of identifiers)
659 uint8_t svId = 0; ///< Satellite identifier (see Satellite Numbering)
660 uint8_t sigId = 0; ///< New style signal identifier (see Signal Identifiers).(not supported in protocol versions less than 27)
661 uint8_t freqId = 0; ///< Only used for GLONASS: This is the frequency slot + 7 (range from 0 to 13)
662 uint16_t locktime = 0; ///< Carrier phase locktime counter [ms] (maximum 64500ms)
663 uint8_t cno = 0; ///< Carrier-to-noise density ratio (signal strength) [dB-Hz]
664 std::bitset<1UL * 8UL> prStdev; ///< Estimated pseudorange measurement standard deviation [m * 0.01*2^n] (see graphic below)
665 std::bitset<1UL * 8UL> cpStdev; ///< Estimated carrier phase measurement standard deviation [cycles * 0.004] (note a raw value of 0x0F indicates the value is invalid) (see graphic below)
666 std::bitset<1UL * 8UL> doStdev; ///< Estimated Doppler measurement standard deviation. [Hz * 0.002*2^n] (see graphic below)
667 std::bitset<1UL * 8UL> trkStat; ///< Tracking status bitfield (see graphic below)
668 uint8_t reserved2 = 0; ///< Reserved
669
670 /// @brief Pseudorange valid
671 28669 [[nodiscard]] bool prValid() const { return trkStat[0]; }
672
673 /// @brief Carrier phase valid
674 28669 [[nodiscard]] bool cpValid() const { return trkStat[1]; }
675
676 /// @brief Half cycle valid
677 28590 [[nodiscard]] bool halfCycValid() const { return trkStat[2]; }
678
679 /// @brief Half cycle subtracted from phase
680 [[nodiscard]] bool subHalfSubtractedFromPhase() const { return trkStat[3]; }
681 };
682
683 /// Measurement time of week in receiverblocal time approximately aligned to the GPS time system.
684 /// The receiver local time of week, week number and leap second information can be used to translate the
685 /// time to other time systems. More information about the difference in time systems can be found in RINEX 3
686 /// documentation. For a receiver operating in GLONASS only mode, UTC time can be determined by subtracting the leapS field
687 /// from GPS time regardless of whether the GPS leap seconds are valid. [s]
688 double rcvTow = 0.0;
689 uint16_t week = 0; ///< GPS week number in receiver local time [weeks]
690 /// GPS leap seconds (GPS-UTC). This field represents the receiver's best knowledge of the leap seconds offset.
691 /// A flag is given in the recStat bitfield to indicate if the leap seconds are known.
692 int8_t leapS = 0;
693 uint8_t numMeas = 0; ///< Number of measurements to follow
694 std::bitset<1UL * 8UL> recStat; ///< Receiver tracking status bitfield (see graphic below)
695 uint8_t version = 0; ///< Message version (0x01 for this version).
696 std::array<uint8_t, 2> reserved1{}; ///< Reserved
697 std::vector<UbxRxmRawxData> data; ///< Repeated block
698 };
699
700 /// @brief Broadcast Navigation Data Subframe
701 ///
702 /// This message reports a complete subframe of broadcast navigation data
703 /// decoded from a single signal. The number of data words reported in each
704 /// message depends on the nature of the signal.
705 /// See the section on Broadcast Navigation Data for further details.
706 struct UbxRxmSfrbx
707 {
708 uint8_t gnssId = 0; ///< GNSS identifier (see Satellite Numbering)
709 uint8_t svId = 0; ///< Satellite identifier (see Satellite Numbering)
710 uint8_t sigId = 0; ///< Signal identifier
711 uint8_t freqId = 0; ///< Only used for GLONASS: This is the frequency slot + 7 (range from 0 to 13)
712 uint8_t numWords = 0; ///< The number of data words contained in this message (0..16)
713 uint8_t chn = 0; ///< The tracking channel number the message was received on
714 uint8_t version = 0; ///< Message version (0x01 for this version)
715 uint8_t reserved0 = 0; ///< Reserved
716 std::vector<uint32_t> dwrd; ///< The data words
717
718 // TODO: Make this into functions
719 // uint8_t subFrameId = 0; ///< bit 20-22 of word 2/dwrd[1]. 3 bits subframe id (HOW = Handover Word) of GPS
720 // uint8_t wrdType = 0; ///< bit 3-8 of dwrd[0]. 6 bits word types of Galileo I/NAV
721 };
722
723 /// @brief The available SEC Messages
724 enum UbxSecMessages : uint8_t
725 {
726 /// Unique Chip ID (Length = 9; Type = Output)
727 UBX_SEC_UNIQID = 0x03,
728 };
729
730 /// @brief The available TIM Messages
731 enum UbxTimMessages : uint8_t
732 {
733 /// Oscillator frequency changed notification (Length = 32; Type = Periodic/Polled)
734 UBX_TIM_FCHG = 0x16,
735 /// Host oscillator control (Length = 8; Type = Input)
736 UBX_TIM_HOC = 0x17,
737 /// Source measurement (Length = 12 + 24*numMeas; Type = Input/Output)
738 UBX_TIM_SMEAS = 0x13,
739 /// Survey-in data (Length = 28; Type = Periodic/Polled)
740 UBX_TIM_SVIN = 0x04,
741 /// Time mark data (Length = 28; Type = Periodic/Polled)
742 UBX_TIM_TM2 = 0x03,
743 /// Time Pulse Time and Frequency Data (Length = 56; Type = Periodic)
744 UBX_TIM_TOS = 0x12,
745 /// Time Pulse Timedata (Length = 16; Type = Periodic/Polled)
746 UBX_TIM_TP = 0x01,
747 /// - Stop calibration (Length = 1; Type = Command)
748 /// - VCO calibration extended command (Length = 12; Type = Command)
749 /// - Results of the calibration (Length = 12; Type = Periodic/Polled)
750 UBX_TIM_VCOCAL = 0x15,
751 /// Sourced Time Verification (Length = 20; Type = Periodic/Polled)
752 UBX_TIM_VRFY = 0x06,
753 };
754
755 /// @brief The available UPD Messages
756 enum UbxUpdMessages : uint8_t
757 {
758 /// - Poll Backup File Restore Status (Length = 0; Type = Poll Request)
759 /// - Create Backup File in Flash (Length = 4; Type = Command)
760 /// - Clear Backup in Flash (Length = 4; Type = command)
761 /// - Backup File Creation Acknowledge (Length = 8; Type = Output)
762 /// - System Restored from Backup (Length = 8; Type = Output)
763 UBX_UPD_SOS = 0x14,
764 };
765
766 /// @brief Get the UBX Msg Class From String object
767 ///
768 /// @param[in] className String of the UBX Class
769 /// @return The UBX class
770 [[nodiscard]] UbxClass getMsgClassFromString(const std::string& className);
771
772 /// @brief Get the UBX Msg Id From String object
773 /// @param[in] msgClass The Ubx Msg Class to search in
774 /// @param[in] idName String of the Msg Id
775 /// @return The Msg Id integer
776 [[nodiscard]] uint8_t getMsgIdFromString(UbxClass msgClass, const std::string& idName);
777
778 /// @brief Get the UBX Msg Id From String objects
779 /// @param[in] className String of the UBX class
780 /// @param[in] idName String of the Msg Id
781 /// @return The Msg Id integer
782 [[nodiscard]] uint8_t getMsgIdFromString(const std::string& className, const std::string& idName);
783
784 /// @brief Get the a string from a UBX Msg Class
785 /// @param[in] msgClass The Ubx Msg Class
786 /// @return The Msg Class string
787 [[nodiscard]] std::string getStringFromMsgClass(UbxClass msgClass);
788
789 /// @brief Get the a string from a UBX Msg Id
790 /// @param[in] msgClass The Ubx Msg Class to search in
791 /// @param[in] msgId Msg Id
792 /// @return The Msg Id string
793 [[nodiscard]] std::string getStringFromMsgId(UbxClass msgClass, uint8_t msgId);
794
795 /// @brief Get the GNSS Satellite System from gnssId
796 /// @param gnssId Ublox gnssId
797 [[nodiscard]] SatelliteSystem getSatSys(uint8_t gnssId);
798
799 /// @brief Get the GNSS code from gnssId and sigId
800 /// @param gnssId Ublox gnssId
801 /// @param sigId Ublox sigId
802 /// @return The Code object
803 [[nodiscard]] Code getCode(uint8_t gnssId, uint8_t sigId);
804
805 } // namespace NAV::vendor::ublox
806
807 /// @brief Stream insertion operator overload
808 /// @param[in, out] os Output stream object to stream the time into
809 /// @param[in] obj Object to print
810 /// @return Returns the output stream object in order to chain stream insertions
811 std::ostream& operator<<(std::ostream& os, const NAV::vendor::ublox::UbxClass& obj);
812
813 #ifndef DOXYGEN_IGNORE
814
815 template<>
816 struct fmt::formatter<NAV::vendor::ublox::ErrorDetectionMode> : ostream_formatter
817 {};
818 template<>
819 struct fmt::formatter<NAV::vendor::ublox::NmeaTalkerID> : ostream_formatter
820 {};
821 template<>
822 struct fmt::formatter<NAV::vendor::ublox::NmeaMessageClass> : ostream_formatter
823 {};
824 template<>
825 struct fmt::formatter<NAV::vendor::ublox::NmeaStandardMessages> : ostream_formatter
826 {};
827 template<>
828 struct fmt::formatter<NAV::vendor::ublox::NmeaPubxMessages> : ostream_formatter
829 {};
830
831 /// @brief Formatter for UbxClass
832 template<>
833 struct fmt::formatter<NAV::vendor::ublox::UbxClass> : fmt::formatter<std::string>
834 {
835 /// @brief Defines how to format SatelliteSystem structs
836 /// @param[in] ubxClass Struct to format
837 /// @param[in, out] ctx Format context
838 /// @return Output iterator
839 template<typename FormatContext>
840 auto format(const NAV::vendor::ublox::UbxClass& ubxClass, FormatContext& ctx) const
841 {
842 return fmt::formatter<std::string>::format(NAV::vendor::ublox::getStringFromMsgClass(ubxClass), ctx);
843 }
844 };
845
846 template<>
847 struct fmt::formatter<NAV::vendor::ublox::UbxAckMessages> : ostream_formatter
848 {};
849 template<>
850 struct fmt::formatter<NAV::vendor::ublox::UbxCfgMessages> : ostream_formatter
851 {};
852 template<>
853 struct fmt::formatter<NAV::vendor::ublox::UbxEsfMessages> : ostream_formatter
854 {};
855 template<>
856 struct fmt::formatter<NAV::vendor::ublox::UbxHnrMessages> : ostream_formatter
857 {};
858 template<>
859 struct fmt::formatter<NAV::vendor::ublox::UbxInfMessages> : ostream_formatter
860 {};
861 template<>
862 struct fmt::formatter<NAV::vendor::ublox::UbxLogMessages> : ostream_formatter
863 {};
864 template<>
865 struct fmt::formatter<NAV::vendor::ublox::UbxMgaMessages> : ostream_formatter
866 {};
867 template<>
868 struct fmt::formatter<NAV::vendor::ublox::UbxMonMessages> : ostream_formatter
869 {};
870 template<>
871 struct fmt::formatter<NAV::vendor::ublox::UbxNavMessages> : ostream_formatter
872 {};
873 template<>
874 struct fmt::formatter<NAV::vendor::ublox::UbxRxmMessages> : ostream_formatter
875 {};
876 template<>
877 struct fmt::formatter<NAV::vendor::ublox::UbxSecMessages> : ostream_formatter
878 {};
879 template<>
880 struct fmt::formatter<NAV::vendor::ublox::UbxTimMessages> : ostream_formatter
881 {};
882 template<>
883 struct fmt::formatter<NAV::vendor::ublox::UbxUpdMessages> : ostream_formatter
884 {};
885
886 #endif
887