Skip to content

Add commands for some powersave modes #189

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Oct 9, 2023
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
15 changes: 15 additions & 0 deletions keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -563,6 +563,7 @@ getConfirmedDate KEYWORD2
getConfirmedTime KEYWORD2
getFixType KEYWORD2
getGnssFixOk KEYWORD2
getNAVPVTPSMMode KEYWORD2
getDiffSoln KEYWORD2
getHeadVehValid KEYWORD2
getCarrierSolutionType KEYWORD2
Expand Down Expand Up @@ -677,6 +678,9 @@ getLatestNMEAGNZDA KEYWORD2
setNMEAGNZDAcallback KEYWORD2
setNMEAGNZDAcallbackPtr KEYWORD2

setPMS KEYWORD2
setRXM KEYWORD2

extractLong KEYWORD2
extractSignedLong KEYWORD2
extractInt KEYWORD2
Expand Down Expand Up @@ -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
60 changes: 60 additions & 0 deletions src/SparkFun_u-blox_GNSS_Arduino_Library.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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);
}
24 changes: 24 additions & 0 deletions src/SparkFun_u-blox_GNSS_Arduino_Library.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down