Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/compile-sketch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
board:
# Uno
# https://github.com/arduino/ArduinoCore-avr/blob/master/boards.txt
- fqbn: arduino:avr:uno
- fqbn: arduino:avr:mega
platforms: |
- name: arduino:avr
source-url: https://downloads.arduino.cc/packages/package_index.json
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
Configuring the GNSS to automatically send odometer reports over I2C and display the data using a callback
By: Paul Clark
SparkFun Electronics
Date: December 30th, 2020
Date: March 20th, 2023
License: MIT. See license file for more information.

This example shows how to configure the u-blox GNSS to send odometer reports automatically
Expand Down Expand Up @@ -75,6 +75,27 @@ void setup()

myGNSS.setNavigationFrequency(1); //Produce one solution per second

//By default, the odometer is disabled. We need to enable it.
//We can enable it using the default settings:
myGNSS.enableOdometer();

//Or we can configure it using our own settings, by performing a read-modify-write:
uint8_t flags; // Odometer/Low-speed COG filter flags
uint8_t odoCfg; // Odometer filter settings
uint8_t cogMaxSpeed; // Speed below which course-over-ground (COG) is computed with the low-speed COG filter : m/s * 0.1
uint8_t cogMaxPosAcc; // Maximum acceptable position accuracy for computing COG with the low-speed COG filter
uint8_t velLpGain; // Velocity low-pass filter level
uint8_t cogLpGain; // COG low-pass filter level

if (myGNSS.getOdometerConfig(&flags, &odoCfg, &cogMaxSpeed, &cogMaxPosAcc, &velLpGain, &cogLpGain))
{
flags = UBX_CFG_ODO_USE_ODO; // Enable the odometer
odoCfg = UBX_CFG_ODO_CAR; // Use the car profile (others are RUN, CYCLE, SWIM, CUSTOM)
myGNSS.setOdometerConfig(flags, odoCfg, cogMaxSpeed, cogMaxPosAcc, velLpGain, cogLpGain); // Set the configuration
}
else
Serial.println("Could not read odometer config!");

//myGNSS.resetOdometer(); //Uncomment this line to reset the odometer

myGNSS.setAutoNAVODOcallbackPtr(&printODOdata); // Enable automatic NAV ODO messages with callback to printODOdata
Expand Down
46 changes: 46 additions & 0 deletions keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,9 @@ setDynamicModel KEYWORD2
getDynamicModel KEYWORD2

resetOdometer KEYWORD2
enableOdometer KEYWORD2
getOdometerConfig KEYWORD2
setOdometerConfig KEYWORD2

enableGNSS KEYWORD2
isGNSSenabled KEYWORD2
Expand Down Expand Up @@ -809,6 +812,7 @@ SFE_UBLOX_FILTER_NMEA_GST LITERAL1
SFE_UBLOX_FILTER_NMEA_GSV LITERAL1
SFE_UBLOX_FILTER_NMEA_RLM LITERAL1
SFE_UBLOX_FILTER_NMEA_RMC LITERAL1
SFE_UBLOX_FILTER_NMEA_THS LITERAL1
SFE_UBLOX_FILTER_NMEA_TXT LITERAL1
SFE_UBLOX_FILTER_NMEA_VLW LITERAL1
SFE_UBLOX_FILTER_NMEA_VTG LITERAL1
Expand Down Expand Up @@ -845,25 +849,56 @@ SFE_UBLOX_FILTER_RTCM_TYPE4072_1 LITERAL1

UBX_NAV_ATT LITERAL1
UBX_NAV_CLOCK LITERAL1
UBX_NAV_COV LITERAL1
UBX_NAV_DOP LITERAL1
UBX_NAV_EELL LITERAL1
UBX_NAV_EOE LITERAL1
UBX_NAV_GEOFENCE LITERAL1
UBX_NAV_HPPOSECEF LITERAL1
UBX_NAV_HPPOSLLH LITERAL1
UBX_NAV_ODO LITERAL1
UBX_NAV_ORB LITERAL1
UBX_NAV_PL LITERAL1
UBX_NAV_POSECEF LITERAL1
UBX_NAV_POSLLH LITERAL1
UBX_NAV_PVT LITERAL1
UBX_NAV_PVAT LITERAL1
UBX_NAV_RELPOSNED LITERAL1
UBX_NAV_RESETODO LITERAL1
UBX_NAV_SAT LITERAL1
UBX_NAV_SBAS LITERAL1
UBX_NAV_SIG LITERAL1
UBX_NAV_SLAS LITERAL1
UBX_NAV_STATUS LITERAL1
UBX_NAV_SVIN LITERAL1
UBX_NAV_TIMEBDS LITERAL1
UBX_NAV_TIMEGAL LITERAL1
UBX_NAV_TIMEGLO LITERAL1
UBX_NAV_TIMEGPS LITERAL1
UBX_NAV_TIMELS LITERAL1
UBX_NAV_TIMEUTC LITERAL1
UBX_NAV_VELECEF LITERAL1
UBX_NAV_VELNED LITERAL1

UBX_MON_COMMS LITERAL1
UBX_MON_HW2 LITERAL1
UBX_MON_HW3 LITERAL1
UBX_MON_HW LITERAL1
UBX_MON_IO LITERAL1
UBX_MON_MSGPP LITERAL1
UBX_MON_RF LITERAL1
UBX_MON_RXBUF LITERAL1
UBX_MON_RXR LITERAL1
UBX_MON_SPAN LITERAL1
UBX_MON_SYS LITERAL1
UBX_MON_TXBUF LITERAL1

UBX_RXM_PMP LITERAL1
UBX_RXM_COR LITERAL1
UBX_RXM_MEASX LITERAL1
UBX_RXM_RAWX LITERAL1
UBX_RXM_RLM LITERAL1
UBX_RXM_RTCM LITERAL1
UBX_RXM_SFRBX LITERAL1
UBX_RXM_SPARTN LITERAL1
UBX_RXM_QZSSL6 LITERAL1
Expand Down Expand Up @@ -901,6 +936,17 @@ VAL_CFG_SUBSEC_ANTCONF LITERAL1
VAL_CFG_SUBSEC_LOGCONF LITERAL1
VAL_CFG_SUBSEC_FTSCONF LITERAL1

UBX_CFG_ODO_USE_ODO LITERAL1
UBX_CFG_ODO_USE_COG LITERAL1
UBX_CFG_ODO_OUT_LP_VEL LITERAL1
UBX_CFG_ODO_OUT_LP_COG LITERAL1

UBX_CFG_ODO_RUN LITERAL1
UBX_CFG_ODO_CYCLE LITERAL1
UBX_CFG_ODO_SWIM LITERAL1
UBX_CFG_ODO_CAR LITERAL1
UBX_CFG_ODO_CUSTOM LITERAL1

DYN_MODEL_PORTABLE LITERAL1
DYN_MODEL_STATIONARY LITERAL1
DYN_MODEL_PEDESTRIAN LITERAL1
Expand Down
2 changes: 1 addition & 1 deletion library.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name=SparkFun u-blox GNSS v3
version=3.0.3
version=3.0.4
author=SparkFun Electronics <techsupport@sparkfun.com>
maintainer=SparkFun Electronics <sparkfun.com>
sentence=Library for I2C, Serial and SPI Communication with u-blox GNSS modules<br/><br/>
Expand Down
21 changes: 21 additions & 0 deletions src/u-blox_Class_and_ID.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ const uint8_t UBX_NMEA_GST = 0x07; // GxGST (GNSS Pseudo Range Error Statistics)
const uint8_t UBX_NMEA_GSV = 0x03; // GxGSV (GNSS satellites in view)
const uint8_t UBX_NMEA_RLM = 0x0B; // GxRMC (Return link message (RLM))
const uint8_t UBX_NMEA_RMC = 0x04; // GxRMC (Recommended minimum data)
const uint8_t UBX_NMEA_THS = 0x0E; // GxTHS (True heading and status)
const uint8_t UBX_NMEA_TXT = 0x41; // GxTXT (text transmission)
const uint8_t UBX_NMEA_VLW = 0x0F; // GxVLW (dual ground/water distance)
const uint8_t UBX_NMEA_VTG = 0x05; // GxVTG (course over ground and Ground speed)
Expand Down Expand Up @@ -237,7 +238,9 @@ const uint8_t UBX_MON_VER = 0x04; // Receiver/Software Version. Used for obtai
// The following are used to configure the NAV UBX messages (navigation results messages). Descriptions from UBX messages overview (ZED_F9P Interface Description Document page 35-36)
const uint8_t UBX_NAV_ATT = 0x05; // Vehicle "Attitude" Solution
const uint8_t UBX_NAV_CLOCK = 0x22; // Clock Solution
const uint8_t UBX_NAV_COV = 0x36; // Covariance matrices
const uint8_t UBX_NAV_DOP = 0x04; // Dilution of precision
const uint8_t UBX_NAV_EELL = 0x3D; // Position error ellipse parameters
const uint8_t UBX_NAV_EOE = 0x61; // End of Epoch
const uint8_t UBX_NAV_GEOFENCE = 0x39; // Geofencing status. Used to poll the geofence status
const uint8_t UBX_NAV_HPPOSECEF = 0x13; // High Precision Position Solution in ECEF. Used to find our positional accuracy (high precision).
Expand All @@ -252,6 +255,8 @@ const uint8_t UBX_NAV_PVAT = 0x17; // Navigation position velocity attitude
const uint8_t UBX_NAV_RELPOSNED = 0x3C; // Relative Positioning Information in NED frame
const uint8_t UBX_NAV_RESETODO = 0x10; // Reset odometer
const uint8_t UBX_NAV_SAT = 0x35; // Satellite Information
const uint8_t UBX_NAV_SBAS = 0x32; // SBAS subsystem
const uint8_t UBX_NAV_SLAS = 0x42; // QZSS L1S SLAS status data
const uint8_t UBX_NAV_SIG = 0x43; // Signal Information
const uint8_t UBX_NAV_STATUS = 0x03; // Receiver Navigation Status
const uint8_t UBX_NAV_SVIN = 0x3B; // Survey-in data. Used for checking Survey In status
Expand Down Expand Up @@ -338,6 +343,22 @@ const uint8_t COM_TYPE_NMEA = (1 << 1);
const uint8_t COM_TYPE_RTCM3 = (1 << 5);
const uint8_t COM_TYPE_SPARTN = (1 << 6);

// Odometer configuration - flags
const uint8_t UBX_CFG_ODO_USE_ODO = (1 << 0);
const uint8_t UBX_CFG_ODO_USE_COG = (1 << 1);
const uint8_t UBX_CFG_ODO_OUT_LP_VEL = (1 << 2);
const uint8_t UBX_CFG_ODO_OUT_LP_COG = (1 << 3);

// Odometer configuration - odoCfg
enum odoCfg_e
{
UBX_CFG_ODO_RUN = 0,
UBX_CFG_ODO_CYCLE,
UBX_CFG_ODO_SWIM,
UBX_CFG_ODO_CAR,
UBX_CFG_ODO_CUSTOM,
};

// Configuration Sub-Section mask definitions for saveConfigSelective (UBX-CFG-CFG)
const uint32_t VAL_CFG_SUBSEC_IOPORT = 0x00000001; // ioPort - communications port settings (causes IO system reset!)
const uint32_t VAL_CFG_SUBSEC_MSGCONF = 0x00000002; // msgConf - message configuration
Expand Down
78 changes: 78 additions & 0 deletions src/u-blox_GNSS.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ DevUBLOXGNSS::DevUBLOXGNSS(void)
_logNMEA.all = 0; // Default to passing no NMEA messages to the file buffer
_processNMEA.all = SFE_UBLOX_FILTER_NMEA_ALL; // Default to passing all NMEA messages to processNMEA
_logRTCM.all = 0; // Default to passing no RTCM messages to the file buffer

createLock(); // Create the lock semaphore - if needed
}

DevUBLOXGNSS::~DevUBLOXGNSS(void)
Expand All @@ -88,6 +90,8 @@ DevUBLOXGNSS::~DevUBLOXGNSS(void)
delete[] spiBuffer; // Created with new[]
spiBuffer = nullptr;
}

deleteLock(); // Delete the lock semaphore - if required
}

// Stop all automatic message processing. Free all used RAM
Expand Down Expand Up @@ -2140,6 +2144,8 @@ bool DevUBLOXGNSS::logThisNMEA()
logMe = true;
if ((nmeaAddressField[3] == 'R') && (nmeaAddressField[4] == 'M') && (nmeaAddressField[5] == 'C') && (_logNMEA.bits.UBX_NMEA_RMC == 1))
logMe = true;
if ((nmeaAddressField[3] == 'T') && (nmeaAddressField[4] == 'H') && (nmeaAddressField[5] == 'S') && (_logNMEA.bits.UBX_NMEA_THS == 1))
logMe = true;
if ((nmeaAddressField[3] == 'T') && (nmeaAddressField[4] == 'X') && (nmeaAddressField[5] == 'T') && (_logNMEA.bits.UBX_NMEA_TXT == 1))
logMe = true;
if ((nmeaAddressField[3] == 'V') && (nmeaAddressField[4] == 'L') && (nmeaAddressField[5] == 'W') && (_logNMEA.bits.UBX_NMEA_VLW == 1))
Expand Down Expand Up @@ -2198,6 +2204,8 @@ bool DevUBLOXGNSS::isNMEAHeaderValid()
return (true);
if ((nmeaAddressField[3] == 'R') && (nmeaAddressField[4] == 'M') && (nmeaAddressField[5] == 'C'))
return (true);
if ((nmeaAddressField[3] == 'T') && (nmeaAddressField[4] == 'H') && (nmeaAddressField[5] == 'S'))
return (true);
if ((nmeaAddressField[3] == 'T') && (nmeaAddressField[4] == 'X') && (nmeaAddressField[5] == 'T'))
return (true);
if ((nmeaAddressField[3] == 'V') && (nmeaAddressField[4] == 'L') && (nmeaAddressField[5] == 'W'))
Expand Down Expand Up @@ -2251,6 +2259,8 @@ bool DevUBLOXGNSS::processThisNMEA()
return (true);
if ((nmeaAddressField[3] == 'R') && (nmeaAddressField[4] == 'M') && (nmeaAddressField[5] == 'C') && (_processNMEA.bits.UBX_NMEA_RMC == 1))
return (true);
if ((nmeaAddressField[3] == 'T') && (nmeaAddressField[4] == 'H') && (nmeaAddressField[5] == 'S') && (_processNMEA.bits.UBX_NMEA_THS == 1))
return (true);
if ((nmeaAddressField[3] == 'T') && (nmeaAddressField[4] == 'X') && (nmeaAddressField[5] == 'T') && (_processNMEA.bits.UBX_NMEA_TXT == 1))
return (true);
if ((nmeaAddressField[3] == 'V') && (nmeaAddressField[4] == 'L') && (nmeaAddressField[5] == 'W') && (_processNMEA.bits.UBX_NMEA_VLW == 1))
Expand Down Expand Up @@ -7786,6 +7796,72 @@ bool DevUBLOXGNSS::resetOdometer(uint16_t maxWait)
return (sendCommand(&packetCfg, maxWait, true) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK
}

// Enable / disable the odometer
bool DevUBLOXGNSS::enableOdometer(bool enable, uint8_t layer, uint16_t maxWait)
{
return setVal8(UBLOX_CFG_ODO_USE_ODO, (uint8_t)enable, layer, maxWait);
}

// Read the odometer configuration
bool DevUBLOXGNSS::getOdometerConfig(uint8_t *flags, uint8_t *odoCfg, uint8_t *cogMaxSpeed, uint8_t *cogMaxPosAcc, uint8_t *velLpGain, uint8_t *cogLpGain, uint8_t layer, uint16_t maxWait)
{
bool result = newCfgValget(layer);
result &= addCfgValget(UBLOX_CFG_ODO_USE_ODO);
result &= addCfgValget(UBLOX_CFG_ODO_USE_COG);
result &= addCfgValget(UBLOX_CFG_ODO_OUTLPVEL);
result &= addCfgValget(UBLOX_CFG_ODO_OUTLPCOG);
result &= addCfgValget(UBLOX_CFG_ODO_PROFILE);
result &= addCfgValget(UBLOX_CFG_ODO_COGMAXSPEED);
result &= addCfgValget(UBLOX_CFG_ODO_COGMAXPOSACC);
result &= addCfgValget(UBLOX_CFG_ODO_VELLPGAIN);
result &= addCfgValget(UBLOX_CFG_ODO_COGLPGAIN);
result &= sendCfgValget(maxWait);

if (result)
{
uint8_t flagsBit = 0;
uint8_t flagsByte = 0;
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_USE_ODO, &flagsBit, 1);
if (flagsBit)
flagsByte |= UBX_CFG_ODO_USE_ODO;
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_USE_COG, &flagsBit, 1);
if (flagsBit)
flagsByte |= UBX_CFG_ODO_USE_COG;
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_OUTLPVEL, &flagsBit, 1);
if (flagsBit)
flagsByte |= UBX_CFG_ODO_OUT_LP_VEL;
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_OUTLPCOG, &flagsBit, 1);
if (flagsBit)
flagsByte |= UBX_CFG_ODO_OUT_LP_COG;
*flags = flagsByte;

result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_PROFILE, odoCfg, 1);
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_COGMAXSPEED, cogMaxSpeed, 1);
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_COGMAXPOSACC, cogMaxPosAcc, 1);
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_VELLPGAIN, velLpGain, 1);
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_COGLPGAIN, cogLpGain, 1);
}

return result;
}

// Configure the odometer
bool DevUBLOXGNSS::setOdometerConfig(uint8_t flags, uint8_t odoCfg, uint8_t cogMaxSpeed, uint8_t cogMaxPosAcc, uint8_t velLpGain, uint8_t cogLpGain, uint8_t layer, uint16_t maxWait)
{
bool result = newCfgValset(layer);
result &= addCfgValset8(UBLOX_CFG_ODO_USE_ODO, flags & UBX_CFG_ODO_USE_ODO ? 1 : 0);
result &= addCfgValset8(UBLOX_CFG_ODO_USE_COG, flags & UBX_CFG_ODO_USE_COG ? 1 : 0);
result &= addCfgValset8(UBLOX_CFG_ODO_OUTLPVEL, flags & UBX_CFG_ODO_OUT_LP_VEL ? 1 : 0);
result &= addCfgValset8(UBLOX_CFG_ODO_OUTLPCOG, flags & UBX_CFG_ODO_OUT_LP_COG ? 1 : 0);
result &= addCfgValset8(UBLOX_CFG_ODO_PROFILE, odoCfg);
result &= addCfgValset8(UBLOX_CFG_ODO_COGMAXSPEED, cogMaxSpeed);
result &= addCfgValset8(UBLOX_CFG_ODO_COGMAXPOSACC, cogMaxPosAcc);
result &= addCfgValset8(UBLOX_CFG_ODO_VELLPGAIN, velLpGain);
result &= addCfgValset8(UBLOX_CFG_ODO_COGLPGAIN, cogLpGain);
result &= sendCfgValset(maxWait);
return result;
}

uint32_t DevUBLOXGNSS::getEnableGNSSConfigKey(sfe_ublox_gnss_ids_e id)
{
const uint32_t gnssConfigKeys[(uint8_t)SFE_UBLOX_GNSS_ID_UNKNOWN] = {
Expand Down Expand Up @@ -15671,6 +15747,8 @@ int32_t DevUBLOXGNSS::getAltitude(uint16_t maxWait)
// Get the current altitude in mm according to mean sea level
// Ellipsoid model: https://www.esri.com/news/arcuser/0703/geoid1of3.html
// Difference between Ellipsoid Model and Mean Sea Level: https://eos-gnss.com/elevation-for-beginners/
// Also see: https://portal.u-blox.com/s/question/0D52p00008HKDSkCAP/what-geoid-model-is-used-and-where-is-this-calculated
// and: https://cddis.nasa.gov/926/egm96/egm96.html on 10x10 degree grid
int32_t DevUBLOXGNSS::getAltitudeMSL(uint16_t maxWait)
{
if (packetUBXNAVPVT == nullptr)
Expand Down
9 changes: 7 additions & 2 deletions src/u-blox_GNSS.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,9 +138,11 @@ class DevUBLOXGNSS
bool _UART2 = false; // Default to UART1

// These lock / unlock functions can be used if you have multiple tasks writing to the bus.
// The idea is that in a RTOS you override this class and the two functions in which you take and give a mutex.
// The idea is that in a RTOS you override this class and the functions in which you take and give a mutex.
virtual bool createLock(void) { return true; }
virtual bool lock(void) { return true; }
virtual void unlock(void) { }
virtual void deleteLock(void) { }

public:
void connectedToUART2(bool connected = true) { _UART2 = connected; }
Expand Down Expand Up @@ -391,8 +393,11 @@ class DevUBLOXGNSS
bool setDynamicModel(dynModel newDynamicModel = DYN_MODEL_PORTABLE, uint8_t layer = VAL_LAYER_RAM_BBR, uint16_t maxWait = kUBLOXGNSSDefaultMaxWait);
uint8_t getDynamicModel(uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = kUBLOXGNSSDefaultMaxWait); // Get the dynamic model - returns 255 if the sendCommand fails

// Reset the odometer
// Reset / enable / configure the odometer
bool resetOdometer(uint16_t maxWait = kUBLOXGNSSDefaultMaxWait); // Reset the odometer
bool enableOdometer(bool enable = true, uint8_t layer = VAL_LAYER_RAM_BBR, uint16_t maxWait = kUBLOXGNSSDefaultMaxWait); // Enable / disable the odometer
bool getOdometerConfig(uint8_t *flags, uint8_t *odoCfg, uint8_t *cogMaxSpeed, uint8_t *cogMaxPosAcc, uint8_t *velLpGain, uint8_t *cogLpGain, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = kUBLOXGNSSDefaultMaxWait); // Read the odometer configuration
bool setOdometerConfig(uint8_t flags, uint8_t odoCfg, uint8_t cogMaxSpeed, uint8_t cogMaxPosAcc, uint8_t velLpGain, uint8_t cogLpGain, uint8_t layer = VAL_LAYER_RAM_BBR, uint16_t maxWait = kUBLOXGNSSDefaultMaxWait); // Configure the odometer

// Enable/Disable individual GNSS systems using UBX-CFG-GNSS
// Note: you must leave at least one major GNSS enabled! If in doubt, enable GPS before disabling the others
Expand Down
4 changes: 3 additions & 1 deletion src/u-blox_external_typedefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ typedef struct
uint32_t UBX_NMEA_VLW : 1;
uint32_t UBX_NMEA_VTG : 1;
uint32_t UBX_NMEA_ZDA : 1;
uint32_t UBX_NMEA_THS : 1;
} bits;
};
} sfe_ublox_nmea_filtering_t;
Expand Down Expand Up @@ -159,7 +160,8 @@ typedef enum
SFE_UBLOX_FILTER_NMEA_TXT = 0x00040000,
SFE_UBLOX_FILTER_NMEA_VLW = 0x00080000,
SFE_UBLOX_FILTER_NMEA_VTG = 0x00100000,
SFE_UBLOX_FILTER_NMEA_ZDA = 0x00200000
SFE_UBLOX_FILTER_NMEA_ZDA = 0x00200000,
SFE_UBLOX_FILTER_NMEA_THS = 0x00400000,
} sfe_ublox_nmea_filtering_e;

// Define a struct to allow selective logging of RTCM messages
Expand Down