From 69fb18420fa25f1bb7f23cfc98c0c29d656fc848 Mon Sep 17 00:00:00 2001 From: Christian Stehno Date: Sun, 2 Apr 2023 00:32:55 +0200 Subject: [PATCH 1/2] Add new methods for power save modes --- src/SparkFun_u-blox_GNSS_Arduino_Library.cpp | 60 ++++++++++++++++++++ src/SparkFun_u-blox_GNSS_Arduino_Library.h | 24 ++++++++ 2 files changed, 84 insertions(+) diff --git a/src/SparkFun_u-blox_GNSS_Arduino_Library.cpp b/src/SparkFun_u-blox_GNSS_Arduino_Library.cpp index 460dbce..cdccde7 100644 --- a/src/SparkFun_u-blox_GNSS_Arduino_Library.cpp +++ b/src/SparkFun_u-blox_GNSS_Arduino_Library.cpp @@ -17369,6 +17369,21 @@ bool SFE_UBLOX_GNSS::getDiffSoln(uint16_t maxWait) return (packetUBXNAVPVT->data.flags.bits.diffSoln); } +// Get power save mode from NAV-PVT +bool SFE_UBLOX_GNSS::getNAVPVTPSMMode(uint16_t maxWait) +{ + if (packetUBXNAVPVT == NULL) + initPacketUBXNAVPVT(); // Check that RAM has been allocated for the PVT data + if (packetUBXNAVPVT == NULL) // Bail if the RAM allocation failed + return 0; + + if (packetUBXNAVPVT->moduleQueried.moduleQueried1.bits.psmState== false) + getPVT(maxWait); + packetUBXNAVPVT->moduleQueried.moduleQueried1.bits.psmState= false; // Since we are about to give this to user, mark this data as stale + packetUBXNAVPVT->moduleQueried.moduleQueried1.bits.all = false; + return (packetUBXNAVPVT->data.flags.bits.psmState); +} + // Get whether head vehicle valid or not bool SFE_UBLOX_GNSS::getHeadVehValid(uint16_t maxWait) { @@ -18523,3 +18538,48 @@ int8_t SFE_UBLOX_GNSS::extractSignedChar(ubxPacket *msg, uint16_t spotToStart) stSignedByte.unsignedByte = extractByte(msg, spotToStart); return (stSignedByte.signedByte); } + +boolean SFE_UBLOX_GNSS::setPMS(sfe_ublox_pms_mode_e mode, uint16_t period, uint16_t onTime, uint16_t maxWait) +{ + // INVALID only valid in response + if (mode == SFE_UBLOX_PMS_MODE_INVALID) + return false; + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_PMS; + packetCfg.len = 8; + packetCfg.startingSpot = 0; + + packetCfg.payload[0] = 0x0; //message version + packetCfg.payload[1] = mode; + // only valid if mode==SFE_UBLOX_PMS_MODE_INTERVAL + if (mode == SFE_UBLOX_PMS_MODE_INTERVAL) + { + packetCfg.payload[2] = period >> 8; + packetCfg.payload[3] = period & 0xff; + packetCfg.payload[4] = onTime >> 8; + packetCfg.payload[5] = onTime & 0xff; + } + else + { + packetCfg.payload[2] = 0; + packetCfg.payload[3] = 0; + packetCfg.payload[4] = 0; + packetCfg.payload[5] = 0; + } + packetCfg.payload[6] = 0x0; //reserved + packetCfg.payload[7] = 0x0; //reserved + return sendCommand(&packetCfg, maxWait); +} + +boolean SFE_UBLOX_GNSS::setRXM(sfe_ublox_rxm_mode_e mode, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_RXM; + packetCfg.len = 2; + packetCfg.startingSpot = 0; + + packetCfg.payload[0] = 0x0; //reserved + packetCfg.payload[1] = mode; //low power mode + + return sendCommand(&packetCfg, maxWait); +} diff --git a/src/SparkFun_u-blox_GNSS_Arduino_Library.h b/src/SparkFun_u-blox_GNSS_Arduino_Library.h index c83f002..af87672 100644 --- a/src/SparkFun_u-blox_GNSS_Arduino_Library.h +++ b/src/SparkFun_u-blox_GNSS_Arduino_Library.h @@ -581,6 +581,25 @@ enum sfe_ublox_dgnss_mode_e SFE_UBLOX_DGNSS_MODE_FIXED // Ambiguities are fixed whenever possible }; +// Values for UBX-CFG-PMS +enum sfe_ublox_pms_mode_e +{ + SFE_UBLOX_PMS_MODE_FULLPOWER = 0, + SFE_UBLOX_PMS_MODE_BALANCED, + SFE_UBLOX_PMS_MODE_INTERVAL, + SFE_UBLOX_PMS_MODE_AGGRESSIVE_1HZ, + SFE_UBLOX_PMS_MODE_AGGRESSIVE_2HZ, + SFE_UBLOX_PMS_MODE_AGGRESSIVE_4HZ, + SFE_UBLOX_PMS_MODE_INVALID = 0xff +}; + +//Values for UBX-CFG-RXM +enum sfe_ublox_rxm_mode_e +{ + SFE_UBLOX_CFG_RXM_CONTINUOUS = 0, + SFE_UBLOX_CFG_RXM_POWERSAVE = 1 +}; + //-=-=-=-=- #ifndef MAX_PAYLOAD_SIZE @@ -1396,6 +1415,7 @@ class SFE_UBLOX_GNSS uint8_t getFixType(uint16_t maxWait = defaultMaxWait); // Returns the type of fix: 0=no, 3=3D, 4=GNSS+Deadreckoning bool getGnssFixOk(uint16_t maxWait = defaultMaxWait); // Get whether we have a valid fix (i.e within DOP & accuracy masks) + bool getNAVPVTPSMMode(uint16_t maxWait = defaultMaxWait); // Not fully documented power save mode value bool getDiffSoln(uint16_t maxWait = defaultMaxWait); // Get whether differential corrections were applied bool getHeadVehValid(uint16_t maxWait = defaultMaxWait); uint8_t getCarrierSolutionType(uint16_t maxWait = defaultMaxWait); // Returns RTK solution: 0=no, 1=float solution, 2=fixed solution @@ -1542,6 +1562,10 @@ class SFE_UBLOX_GNSS bool setNMEAGNZDAcallbackPtr(void (*callbackPointerPtr)(NMEA_ZDA_data_t *)); // Enable a callback on the arrival of a GNZDA message #endif + // Power Mode Setup. Values period and onTime are only valid if mode is SFE_UBLOX_PMS_MODE_INTERVAL + boolean setPMS(sfe_ublox_pms_mode_e mode, uint16_t period=0, uint16_t onTime=0, uint16_t maxWait = defaultMaxWait); + boolean setRXM(sfe_ublox_rxm_mode_e mode, uint16_t maxWait = defaultMaxWait); + // Functions to extract signed and unsigned 8/16/32-bit data from a ubxPacket // From v2.0: These are public. The user can call these to extract data from custom packets uint64_t extractLongLong(ubxPacket *msg, uint16_t spotToStart); // Combine eight bytes from payload into uint64_t From 222f95a673c54cffa30c9f55c377de6e6a387afc Mon Sep 17 00:00:00 2001 From: Christian Stehno Date: Sun, 2 Apr 2023 00:55:00 +0200 Subject: [PATCH 2/2] Add keyword file for Arduino --- keywords.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/keywords.txt b/keywords.txt index 6f1b29e..a5599c2 100644 --- a/keywords.txt +++ b/keywords.txt @@ -563,6 +563,7 @@ getConfirmedDate KEYWORD2 getConfirmedTime KEYWORD2 getFixType KEYWORD2 getGnssFixOk KEYWORD2 +getNAVPVTPSMMode KEYWORD2 getDiffSoln KEYWORD2 getHeadVehValid KEYWORD2 getCarrierSolutionType KEYWORD2 @@ -677,6 +678,9 @@ getLatestNMEAGNZDA KEYWORD2 setNMEAGNZDAcallback KEYWORD2 setNMEAGNZDAcallbackPtr KEYWORD2 +setPMS KEYWORD2 +setRXM KEYWORD2 + extractLong KEYWORD2 extractSignedLong KEYWORD2 extractInt KEYWORD2 @@ -889,3 +893,14 @@ SFE_UBLOX_MAIN_TALKER_ID_GQ LITERAL1 SFE_UBLOX_DGNSS_MODE_FLOAT LITERAL1 SFE_UBLOX_DGNSS_MODE_FIXED LITERAL1 + +SFE_UBLOX_PMS_MODE_FULLPOWER LITERAL1 +SFE_UBLOX_PMS_MODE_BALANCED LITERAL1 +SFE_UBLOX_PMS_MODE_INTERVAL LITERAL1 +SFE_UBLOX_PMS_MODE_AGGRESSIVE_1HZ LITERAL1 +SFE_UBLOX_PMS_MODE_AGGRESSIVE_2HZ LITERAL1 +SFE_UBLOX_PMS_MODE_AGGRESSIVE_4HZ LITERAL1 +SFE_UBLOX_PMS_MODE_INVALID LITERAL1 + +SFE_UBLOX_CFG_RXM_CONTINUOUS LITERAL1 +SFE_UBLOX_CFG_RXM_POWERSAVE LITERAL1