Skip to content

Commit 69fb184

Browse files
author
Christian Stehno
committed
Add new methods for power save modes
1 parent 3416a31 commit 69fb184

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed

Diff for: src/SparkFun_u-blox_GNSS_Arduino_Library.cpp

+60
Original file line numberDiff line numberDiff line change
@@ -17369,6 +17369,21 @@ bool SFE_UBLOX_GNSS::getDiffSoln(uint16_t maxWait)
1736917369
return (packetUBXNAVPVT->data.flags.bits.diffSoln);
1737017370
}
1737117371

17372+
// Get power save mode from NAV-PVT
17373+
bool SFE_UBLOX_GNSS::getNAVPVTPSMMode(uint16_t maxWait)
17374+
{
17375+
if (packetUBXNAVPVT == NULL)
17376+
initPacketUBXNAVPVT(); // Check that RAM has been allocated for the PVT data
17377+
if (packetUBXNAVPVT == NULL) // Bail if the RAM allocation failed
17378+
return 0;
17379+
17380+
if (packetUBXNAVPVT->moduleQueried.moduleQueried1.bits.psmState== false)
17381+
getPVT(maxWait);
17382+
packetUBXNAVPVT->moduleQueried.moduleQueried1.bits.psmState= false; // Since we are about to give this to user, mark this data as stale
17383+
packetUBXNAVPVT->moduleQueried.moduleQueried1.bits.all = false;
17384+
return (packetUBXNAVPVT->data.flags.bits.psmState);
17385+
}
17386+
1737217387
// Get whether head vehicle valid or not
1737317388
bool SFE_UBLOX_GNSS::getHeadVehValid(uint16_t maxWait)
1737417389
{
@@ -18523,3 +18538,48 @@ int8_t SFE_UBLOX_GNSS::extractSignedChar(ubxPacket *msg, uint16_t spotToStart)
1852318538
stSignedByte.unsignedByte = extractByte(msg, spotToStart);
1852418539
return (stSignedByte.signedByte);
1852518540
}
18541+
18542+
boolean SFE_UBLOX_GNSS::setPMS(sfe_ublox_pms_mode_e mode, uint16_t period, uint16_t onTime, uint16_t maxWait)
18543+
{
18544+
// INVALID only valid in response
18545+
if (mode == SFE_UBLOX_PMS_MODE_INVALID)
18546+
return false;
18547+
packetCfg.cls = UBX_CLASS_CFG;
18548+
packetCfg.id = UBX_CFG_PMS;
18549+
packetCfg.len = 8;
18550+
packetCfg.startingSpot = 0;
18551+
18552+
packetCfg.payload[0] = 0x0; //message version
18553+
packetCfg.payload[1] = mode;
18554+
// only valid if mode==SFE_UBLOX_PMS_MODE_INTERVAL
18555+
if (mode == SFE_UBLOX_PMS_MODE_INTERVAL)
18556+
{
18557+
packetCfg.payload[2] = period >> 8;
18558+
packetCfg.payload[3] = period & 0xff;
18559+
packetCfg.payload[4] = onTime >> 8;
18560+
packetCfg.payload[5] = onTime & 0xff;
18561+
}
18562+
else
18563+
{
18564+
packetCfg.payload[2] = 0;
18565+
packetCfg.payload[3] = 0;
18566+
packetCfg.payload[4] = 0;
18567+
packetCfg.payload[5] = 0;
18568+
}
18569+
packetCfg.payload[6] = 0x0; //reserved
18570+
packetCfg.payload[7] = 0x0; //reserved
18571+
return sendCommand(&packetCfg, maxWait);
18572+
}
18573+
18574+
boolean SFE_UBLOX_GNSS::setRXM(sfe_ublox_rxm_mode_e mode, uint16_t maxWait)
18575+
{
18576+
packetCfg.cls = UBX_CLASS_CFG;
18577+
packetCfg.id = UBX_CFG_RXM;
18578+
packetCfg.len = 2;
18579+
packetCfg.startingSpot = 0;
18580+
18581+
packetCfg.payload[0] = 0x0; //reserved
18582+
packetCfg.payload[1] = mode; //low power mode
18583+
18584+
return sendCommand(&packetCfg, maxWait);
18585+
}

Diff for: src/SparkFun_u-blox_GNSS_Arduino_Library.h

+24
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,25 @@ enum sfe_ublox_dgnss_mode_e
581581
SFE_UBLOX_DGNSS_MODE_FIXED // Ambiguities are fixed whenever possible
582582
};
583583

584+
// Values for UBX-CFG-PMS
585+
enum sfe_ublox_pms_mode_e
586+
{
587+
SFE_UBLOX_PMS_MODE_FULLPOWER = 0,
588+
SFE_UBLOX_PMS_MODE_BALANCED,
589+
SFE_UBLOX_PMS_MODE_INTERVAL,
590+
SFE_UBLOX_PMS_MODE_AGGRESSIVE_1HZ,
591+
SFE_UBLOX_PMS_MODE_AGGRESSIVE_2HZ,
592+
SFE_UBLOX_PMS_MODE_AGGRESSIVE_4HZ,
593+
SFE_UBLOX_PMS_MODE_INVALID = 0xff
594+
};
595+
596+
//Values for UBX-CFG-RXM
597+
enum sfe_ublox_rxm_mode_e
598+
{
599+
SFE_UBLOX_CFG_RXM_CONTINUOUS = 0,
600+
SFE_UBLOX_CFG_RXM_POWERSAVE = 1
601+
};
602+
584603
//-=-=-=-=-
585604

586605
#ifndef MAX_PAYLOAD_SIZE
@@ -1396,6 +1415,7 @@ class SFE_UBLOX_GNSS
13961415
uint8_t getFixType(uint16_t maxWait = defaultMaxWait); // Returns the type of fix: 0=no, 3=3D, 4=GNSS+Deadreckoning
13971416

13981417
bool getGnssFixOk(uint16_t maxWait = defaultMaxWait); // Get whether we have a valid fix (i.e within DOP & accuracy masks)
1418+
bool getNAVPVTPSMMode(uint16_t maxWait = defaultMaxWait); // Not fully documented power save mode value
13991419
bool getDiffSoln(uint16_t maxWait = defaultMaxWait); // Get whether differential corrections were applied
14001420
bool getHeadVehValid(uint16_t maxWait = defaultMaxWait);
14011421
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
15421562
bool setNMEAGNZDAcallbackPtr(void (*callbackPointerPtr)(NMEA_ZDA_data_t *)); // Enable a callback on the arrival of a GNZDA message
15431563
#endif
15441564

1565+
// Power Mode Setup. Values period and onTime are only valid if mode is SFE_UBLOX_PMS_MODE_INTERVAL
1566+
boolean setPMS(sfe_ublox_pms_mode_e mode, uint16_t period=0, uint16_t onTime=0, uint16_t maxWait = defaultMaxWait);
1567+
boolean setRXM(sfe_ublox_rxm_mode_e mode, uint16_t maxWait = defaultMaxWait);
1568+
15451569
// Functions to extract signed and unsigned 8/16/32-bit data from a ubxPacket
15461570
// From v2.0: These are public. The user can call these to extract data from custom packets
15471571
uint64_t extractLongLong(ubxPacket *msg, uint16_t spotToStart); // Combine eight bytes from payload into uint64_t

0 commit comments

Comments
 (0)