@@ -7790,6 +7790,72 @@ bool DevUBLOXGNSS::resetOdometer(uint16_t maxWait)
7790
7790
return (sendCommand(&packetCfg, maxWait, true) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK
7791
7791
}
7792
7792
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
+
7793
7859
uint32_t DevUBLOXGNSS::getEnableGNSSConfigKey(sfe_ublox_gnss_ids_e id)
7794
7860
{
7795
7861
const uint32_t gnssConfigKeys[(uint8_t)SFE_UBLOX_GNSS_ID_UNKNOWN] = {
@@ -15675,6 +15741,8 @@ int32_t DevUBLOXGNSS::getAltitude(uint16_t maxWait)
15675
15741
// Get the current altitude in mm according to mean sea level
15676
15742
// Ellipsoid model: https://www.esri.com/news/arcuser/0703/geoid1of3.html
15677
15743
// 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
15678
15746
int32_t DevUBLOXGNSS::getAltitudeMSL(uint16_t maxWait)
15679
15747
{
15680
15748
if (packetUBXNAVPVT == nullptr)
0 commit comments