Skip to content

Commit 70e0224

Browse files
committed
Add odometer configuration methods - update ODO callback example
1 parent aee357c commit 70e0224

File tree

5 files changed

+124
-2
lines changed

5 files changed

+124
-2
lines changed

examples/Callbacks/CallbackExample2_NAV_ODO/CallbackExample2_NAV_ODO.ino

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
Configuring the GNSS to automatically send odometer reports over I2C and display the data using a callback
33
By: Paul Clark
44
SparkFun Electronics
5-
Date: December 30th, 2020
5+
Date: March 20th, 2023
66
License: MIT. See license file for more information.
77
88
This example shows how to configure the u-blox GNSS to send odometer reports automatically
@@ -75,6 +75,27 @@ void setup()
7575

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

78+
//By default, the odometer is disabled. We need to enable it.
79+
//We can enable it using the default settings:
80+
myGNSS.enableOdometer();
81+
82+
//Or we can configure it using our own settings, by performing a read-modify-write:
83+
uint8_t flags; // Odometer/Low-speed COG filter flags
84+
uint8_t odoCfg; // Odometer filter settings
85+
uint8_t cogMaxSpeed; // Speed below which course-over-ground (COG) is computed with the low-speed COG filter : m/s * 0.1
86+
uint8_t cogMaxPosAcc; // Maximum acceptable position accuracy for computing COG with the low-speed COG filter
87+
uint8_t velLpGain; // Velocity low-pass filter level
88+
uint8_t cogLpGain; // COG low-pass filter level
89+
90+
if (myGNSS.getOdometerConfig(&flags, &odoCfg, &cogMaxSpeed, &cogMaxPosAcc, &velLpGain, &cogLpGain))
91+
{
92+
flags = UBX_CFG_ODO_USE_ODO; // Enable the odometer
93+
odoCfg = UBX_CFG_ODO_CAR; // Use the car profile (others are RUN, CYCLE, SWIM, CUSTOM)
94+
myGNSS.setOdometerConfig(flags, odoCfg, cogMaxSpeed, cogMaxPosAcc, velLpGain, cogLpGain); // Set the configuration
95+
}
96+
else
97+
Serial.println("Could not read odometer config!");
98+
7899
//myGNSS.resetOdometer(); //Uncomment this line to reset the odometer
79100

80101
myGNSS.setAutoNAVODOcallbackPtr(&printODOdata); // Enable automatic NAV ODO messages with callback to printODOdata

keywords.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,9 @@ setDynamicModel KEYWORD2
204204
getDynamicModel KEYWORD2
205205

206206
resetOdometer KEYWORD2
207+
enableOdometer KEYWORD2
208+
getOdometerConfig KEYWORD2
209+
setOdometerConfig KEYWORD2
207210

208211
enableGNSS KEYWORD2
209212
isGNSSenabled KEYWORD2
@@ -901,6 +904,17 @@ VAL_CFG_SUBSEC_ANTCONF LITERAL1
901904
VAL_CFG_SUBSEC_LOGCONF LITERAL1
902905
VAL_CFG_SUBSEC_FTSCONF LITERAL1
903906

907+
UBX_CFG_ODO_USE_ODO LITERAL1
908+
UBX_CFG_ODO_USE_COG LITERAL1
909+
UBX_CFG_ODO_OUT_LP_VEL LITERAL1
910+
UBX_CFG_ODO_OUT_LP_COG LITERAL1
911+
912+
UBX_CFG_ODO_RUN LITERAL1
913+
UBX_CFG_ODO_CYCLE LITERAL1
914+
UBX_CFG_ODO_SWIM LITERAL1
915+
UBX_CFG_ODO_CAR LITERAL1
916+
UBX_CFG_ODO_CUSTOM LITERAL1
917+
904918
DYN_MODEL_PORTABLE LITERAL1
905919
DYN_MODEL_STATIONARY LITERAL1
906920
DYN_MODEL_PEDESTRIAN LITERAL1

src/u-blox_Class_and_ID.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,22 @@ const uint8_t COM_TYPE_NMEA = (1 << 1);
338338
const uint8_t COM_TYPE_RTCM3 = (1 << 5);
339339
const uint8_t COM_TYPE_SPARTN = (1 << 6);
340340

341+
// Odometer configuration - flags
342+
const uint8_t UBX_CFG_ODO_USE_ODO = (1 << 0);
343+
const uint8_t UBX_CFG_ODO_USE_COG = (1 << 1);
344+
const uint8_t UBX_CFG_ODO_OUT_LP_VEL = (1 << 2);
345+
const uint8_t UBX_CFG_ODO_OUT_LP_COG = (1 << 3);
346+
347+
// Odometer configuration - odoCfg
348+
enum odoCfg_e
349+
{
350+
UBX_CFG_ODO_RUN = 0,
351+
UBX_CFG_ODO_CYCLE,
352+
UBX_CFG_ODO_SWIM,
353+
UBX_CFG_ODO_CAR,
354+
UBX_CFG_ODO_CUSTOM,
355+
};
356+
341357
// Configuration Sub-Section mask definitions for saveConfigSelective (UBX-CFG-CFG)
342358
const uint32_t VAL_CFG_SUBSEC_IOPORT = 0x00000001; // ioPort - communications port settings (causes IO system reset!)
343359
const uint32_t VAL_CFG_SUBSEC_MSGCONF = 0x00000002; // msgConf - message configuration

src/u-blox_GNSS.cpp

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7790,6 +7790,72 @@ bool DevUBLOXGNSS::resetOdometer(uint16_t maxWait)
77907790
return (sendCommand(&packetCfg, maxWait, true) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK
77917791
}
77927792

7793+
// Enable / disable the odometer
7794+
bool DevUBLOXGNSS::enableOdometer(bool enable, uint8_t layer, uint16_t maxWait)
7795+
{
7796+
return setVal8(UBLOX_CFG_ODO_USE_ODO, (uint8_t)enable, layer, maxWait);
7797+
}
7798+
7799+
// Read the odometer configuration
7800+
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)
7801+
{
7802+
bool result = newCfgValget(layer);
7803+
result &= addCfgValget(UBLOX_CFG_ODO_USE_ODO);
7804+
result &= addCfgValget(UBLOX_CFG_ODO_USE_COG);
7805+
result &= addCfgValget(UBLOX_CFG_ODO_OUTLPVEL);
7806+
result &= addCfgValget(UBLOX_CFG_ODO_OUTLPCOG);
7807+
result &= addCfgValget(UBLOX_CFG_ODO_PROFILE);
7808+
result &= addCfgValget(UBLOX_CFG_ODO_COGMAXSPEED);
7809+
result &= addCfgValget(UBLOX_CFG_ODO_COGMAXPOSACC);
7810+
result &= addCfgValget(UBLOX_CFG_ODO_VELLPGAIN);
7811+
result &= addCfgValget(UBLOX_CFG_ODO_COGLPGAIN);
7812+
result &= sendCfgValget(maxWait);
7813+
7814+
if (result)
7815+
{
7816+
uint8_t flagsBit = 0;
7817+
uint8_t flagsByte = 0;
7818+
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_USE_ODO, &flagsBit, 1);
7819+
if (flagsBit)
7820+
flagsByte |= UBX_CFG_ODO_USE_ODO;
7821+
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_USE_COG, &flagsBit, 1);
7822+
if (flagsBit)
7823+
flagsByte |= UBX_CFG_ODO_USE_COG;
7824+
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_OUTLPVEL, &flagsBit, 1);
7825+
if (flagsBit)
7826+
flagsByte |= UBX_CFG_ODO_OUT_LP_VEL;
7827+
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_OUTLPCOG, &flagsBit, 1);
7828+
if (flagsBit)
7829+
flagsByte |= UBX_CFG_ODO_OUT_LP_COG;
7830+
*flags = flagsByte;
7831+
7832+
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_PROFILE, odoCfg, 1);
7833+
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_COGMAXSPEED, cogMaxSpeed, 1);
7834+
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_COGMAXPOSACC, cogMaxPosAcc, 1);
7835+
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_VELLPGAIN, velLpGain, 1);
7836+
result &= extractConfigValueByKey(&packetCfg, UBLOX_CFG_ODO_COGLPGAIN, cogLpGain, 1);
7837+
}
7838+
7839+
return result;
7840+
}
7841+
7842+
// Configure the odometer
7843+
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)
7844+
{
7845+
bool result = newCfgValset(layer);
7846+
result &= addCfgValset8(UBLOX_CFG_ODO_USE_ODO, flags & UBX_CFG_ODO_USE_ODO ? 1 : 0);
7847+
result &= addCfgValset8(UBLOX_CFG_ODO_USE_COG, flags & UBX_CFG_ODO_USE_COG ? 1 : 0);
7848+
result &= addCfgValset8(UBLOX_CFG_ODO_OUTLPVEL, flags & UBX_CFG_ODO_OUT_LP_VEL ? 1 : 0);
7849+
result &= addCfgValset8(UBLOX_CFG_ODO_OUTLPCOG, flags & UBX_CFG_ODO_OUT_LP_COG ? 1 : 0);
7850+
result &= addCfgValset8(UBLOX_CFG_ODO_PROFILE, odoCfg);
7851+
result &= addCfgValset8(UBLOX_CFG_ODO_COGMAXSPEED, cogMaxSpeed);
7852+
result &= addCfgValset8(UBLOX_CFG_ODO_COGMAXPOSACC, cogMaxPosAcc);
7853+
result &= addCfgValset8(UBLOX_CFG_ODO_VELLPGAIN, velLpGain);
7854+
result &= addCfgValset8(UBLOX_CFG_ODO_COGLPGAIN, cogLpGain);
7855+
result &= sendCfgValset(maxWait);
7856+
return result;
7857+
}
7858+
77937859
uint32_t DevUBLOXGNSS::getEnableGNSSConfigKey(sfe_ublox_gnss_ids_e id)
77947860
{
77957861
const uint32_t gnssConfigKeys[(uint8_t)SFE_UBLOX_GNSS_ID_UNKNOWN] = {
@@ -15675,6 +15741,8 @@ int32_t DevUBLOXGNSS::getAltitude(uint16_t maxWait)
1567515741
// Get the current altitude in mm according to mean sea level
1567615742
// Ellipsoid model: https://www.esri.com/news/arcuser/0703/geoid1of3.html
1567715743
// Difference between Ellipsoid Model and Mean Sea Level: https://eos-gnss.com/elevation-for-beginners/
15744+
// Also see: https://portal.u-blox.com/s/question/0D52p00008HKDSkCAP/what-geoid-model-is-used-and-where-is-this-calculated
15745+
// and: https://cddis.nasa.gov/926/egm96/egm96.html on 10x10 degree grid
1567815746
int32_t DevUBLOXGNSS::getAltitudeMSL(uint16_t maxWait)
1567915747
{
1568015748
if (packetUBXNAVPVT == nullptr)

src/u-blox_GNSS.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,8 +393,11 @@ class DevUBLOXGNSS
393393
bool setDynamicModel(dynModel newDynamicModel = DYN_MODEL_PORTABLE, uint8_t layer = VAL_LAYER_RAM_BBR, uint16_t maxWait = kUBLOXGNSSDefaultMaxWait);
394394
uint8_t getDynamicModel(uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = kUBLOXGNSSDefaultMaxWait); // Get the dynamic model - returns 255 if the sendCommand fails
395395

396-
// Reset the odometer
396+
// Reset / enable / configure the odometer
397397
bool resetOdometer(uint16_t maxWait = kUBLOXGNSSDefaultMaxWait); // Reset the odometer
398+
bool enableOdometer(bool enable = true, uint8_t layer = VAL_LAYER_RAM_BBR, uint16_t maxWait = kUBLOXGNSSDefaultMaxWait); // Enable / disable the odometer
399+
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
400+
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
398401

399402
// Enable/Disable individual GNSS systems using UBX-CFG-GNSS
400403
// Note: you must leave at least one major GNSS enabled! If in doubt, enable GPS before disabling the others

0 commit comments

Comments
 (0)