diff --git a/keywords.txt b/keywords.txt index 293d0ae..1dd8706 100644 --- a/keywords.txt +++ b/keywords.txt @@ -16,12 +16,18 @@ UBX_ESF_MEAS_sensorData_t KEYWORD1 UBX_ESF_RAW_sensorData_t KEYWORD1 UBX_ESF_STATUS_sensorStatus_t KEYWORD1 +UBX_CFG_PRT_data_t KEYWORD1 +UBX_CFG_RATE_data_t KEYWORD1 +UBX_CFG_TP5_data_t KEYWORD1 UBX_CFG_ITFM_data_t KEYWORD1 +UBX_CFG_TMODE3_data_t KEYWORD1 + UBX_MON_RF_data_t KEYWORD1 UBX_MON_HW_data_t KEYWORD1 UBX_MON_HW2_data_t KEYWORD1 UBX_NAV_POSECEF_data_t KEYWORD1 +UBX_NAV_POSLLH_data_t KEYWORD1 UBX_NAV_STATUS_data_t KEYWORD1 UBX_NAV_DOP_data_t KEYWORD1 UBX_NAV_ATT_data_t KEYWORD1 @@ -32,8 +38,10 @@ UBX_NAV_VELNED_data_t KEYWORD1 UBX_NAV_HPPOSECEF_data_t KEYWORD1 UBX_NAV_HPPOSLLH_data_t KEYWORD1 UBX_NAV_PVAT_data_t KEYWORD1 +UBX_NAV_TIMEUTC_data_t KEYWORD1 UBX_NAV_CLOCK_data_t KEYWORD1 UBX_NAV_SAT_data_t KEYWORD1 +UBX_NAV_SVIN_data_t KEYWORD1 UBX_NAV_RELPOSNED_data_t KEYWORD1 UBX_NAV_TIMELS_data_t KEYWORD1 UBX_NAV_AOPSTATUS_data_t KEYWORD1 @@ -52,6 +60,9 @@ UBX_ESF_MEAS_data_t KEYWORD1 UBX_ESF_RAW_data_t KEYWORD1 UBX_ESF_STATUS_data_t KEYWORD1 +UBX_MGA_ACK_DATA0_t KEYWORD1 +UBX_MGA_DBD_data_t KEYWORD1 + UBX_HNR_PVT_data_t KEYWORD1 UBX_HNR_ATT_data_t KEYWORD1 UBX_HNR_INS_data_t KEYWORD1 diff --git a/library.properties b/library.properties index 0d36c41..b598d40 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=SparkFun u-blox GNSS Arduino Library -version=2.2.10 +version=2.2.11 author=SparkFun Electronics maintainer=SparkFun Electronics sentence=Library for I2C, Serial and SPI Communication with u-blox GNSS modules

diff --git a/src/SparkFun_u-blox_GNSS_Arduino_Library.cpp b/src/SparkFun_u-blox_GNSS_Arduino_Library.cpp index 9063b09..d74ff8b 100644 --- a/src/SparkFun_u-blox_GNSS_Arduino_Library.cpp +++ b/src/SparkFun_u-blox_GNSS_Arduino_Library.cpp @@ -7320,6 +7320,36 @@ bool SFE_UBLOX_GNSS::getSurveyMode(uint16_t maxWait) return ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_RECEIVED); // We are expecting data and an ACK } +// Get the current TimeMode3 settings - these contain survey in statuses +bool SFE_UBLOX_GNSS::getSurveyMode(UBX_CFG_TMODE3_data_t *data, uint16_t maxWait) +{ + if (data == NULL) // Check if the user forgot to include the data pointer + return (false); // Bail + + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_TMODE3; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) // We are expecting data and an ACK + return (false); + + // Extract the data + data->version = extractByte(&packetCfg, 0); + data->flags.all = extractInt(&packetCfg, 2); + data->ecefXOrLat = extractSignedLong(&packetCfg, 4); + data->ecefYOrLon = extractSignedLong(&packetCfg, 8); + data->ecefZOrAlt = extractSignedLong(&packetCfg, 12); + data->ecefXOrLatHP = extractSignedChar(&packetCfg, 16); + data->ecefYOrLonHP = extractSignedChar(&packetCfg, 17); + data->ecefZOrAltHP = extractSignedChar(&packetCfg, 18); + data->fixedPosAcc = extractLong(&packetCfg, 20); + data->svinMinDur = extractLong(&packetCfg, 24); + data->svinAccLimit = extractLong(&packetCfg, 28); + + return (true); +} + // Control Survey-In for NEO-M8P bool SFE_UBLOX_GNSS::setSurveyMode(uint8_t mode, uint16_t observationTime, float requiredAccuracy, uint16_t maxWait) { diff --git a/src/SparkFun_u-blox_GNSS_Arduino_Library.h b/src/SparkFun_u-blox_GNSS_Arduino_Library.h index 5693334..a60ee2b 100644 --- a/src/SparkFun_u-blox_GNSS_Arduino_Library.h +++ b/src/SparkFun_u-blox_GNSS_Arduino_Library.h @@ -861,6 +861,7 @@ class SFE_UBLOX_GNSS // Functions used for RTK and base station setup bool getSurveyMode(uint16_t maxWait = defaultMaxWait); // Get the current TimeMode3 settings + bool getSurveyMode(UBX_CFG_TMODE3_data_t *data = NULL, uint16_t maxWait = defaultMaxWait); // Get the current TimeMode3 settings bool setSurveyMode(uint8_t mode, uint16_t observationTime, float requiredAccuracy, uint16_t maxWait = defaultMaxWait); // Control survey in mode bool setSurveyModeFull(uint8_t mode, uint32_t observationTime, float requiredAccuracy, uint16_t maxWait = defaultMaxWait); // Control survey in mode bool enableSurveyMode(uint16_t observationTime, float requiredAccuracy, uint16_t maxWait = defaultMaxWait); // Begin Survey-In for NEO-M8P / ZED-F9x diff --git a/src/u-blox_structs.h b/src/u-blox_structs.h index 105477f..019aebb 100644 --- a/src/u-blox_structs.h +++ b/src/u-blox_structs.h @@ -1754,6 +1754,35 @@ typedef struct } config2; } UBX_CFG_ITFM_data_t; +// UBX-CFG-TMODE3 (0x06 0x71): Time Mode Settings 3 +const uint16_t UBX_CFG_TMODE3_LEN = 40; + +typedef struct +{ + uint8_t version; // Message version (0x00 for this version) + uint8_t reserved1; + union + { + uint16_t all; + struct + { + uint16_t mode : 8; // Receiver Mode: 0 Disabled; 1 Survey In; 2 Fixed Mode (true ARP position information required); 3-255 Reserved + uint16_t lla : 1; // Position is given in LAT/LON/ALT (default is ECEF) + } bits; + } flags; + int32_t ecefXOrLat; // WGS84 ECEF X coordinate (or latitude) of the ARP position, depending on flags above: cm or deg*1e-7 + int32_t ecefYOrLon; // WGS84 ECEF Y coordinate (or latitude) of the ARP position, depending on flags above: cm or deg*1e-7 + int32_t ecefZOrAlt; // WGS84 ECEF Z coordinate (or altitude) of the ARP position, depending on flags above: cm + int8_t ecefXOrLatHP; // High-precision WGS84 ECEF X coordinate (or latitude) of the ARP position, depending on flags above: 0.1 mm or deg*1e-9 + int8_t ecefYOrLonHP; // High-precision WGS84 ECEF Y coordinate (or longitude) of the ARP position, depending on flags above: 0.1 mm or deg*1e-9 + int8_t ecefZOrAltHP; // High-precision WGS84 ECEF Z coordinate (or altitude) of the ARP position, depending on flags above: 0.1 mm + uint8_t reserved2; + uint32_t fixedPosAcc; // Fixed position 3D accuracy: 0.1 mm + uint32_t svinMinDur; // Survey-in minimum duration: s + uint32_t svinAccLimit; // Survey-in position accuracy limit: 0.1 mm + uint8_t reserved3[8]; +} UBX_CFG_TMODE3_data_t; + // MON-specific structs // UBX-MON-HW (0x0A 0x09): Hardware status