Skip to content

Commit abffe1a

Browse files
authored
Merge pull request #189 from hybridOL/main
Add commands for some powersave modes
2 parents 7005b05 + 222f95a commit abffe1a

3 files changed

+99
-0
lines changed

Diff for: keywords.txt

+15
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,7 @@ getConfirmedDate KEYWORD2
563563
getConfirmedTime KEYWORD2
564564
getFixType KEYWORD2
565565
getGnssFixOk KEYWORD2
566+
getNAVPVTPSMMode KEYWORD2
566567
getDiffSoln KEYWORD2
567568
getHeadVehValid KEYWORD2
568569
getCarrierSolutionType KEYWORD2
@@ -677,6 +678,9 @@ getLatestNMEAGNZDA KEYWORD2
677678
setNMEAGNZDAcallback KEYWORD2
678679
setNMEAGNZDAcallbackPtr KEYWORD2
679680

681+
setPMS KEYWORD2
682+
setRXM KEYWORD2
683+
680684
extractLong KEYWORD2
681685
extractSignedLong KEYWORD2
682686
extractInt KEYWORD2
@@ -889,3 +893,14 @@ SFE_UBLOX_MAIN_TALKER_ID_GQ LITERAL1
889893

890894
SFE_UBLOX_DGNSS_MODE_FLOAT LITERAL1
891895
SFE_UBLOX_DGNSS_MODE_FIXED LITERAL1
896+
897+
SFE_UBLOX_PMS_MODE_FULLPOWER LITERAL1
898+
SFE_UBLOX_PMS_MODE_BALANCED LITERAL1
899+
SFE_UBLOX_PMS_MODE_INTERVAL LITERAL1
900+
SFE_UBLOX_PMS_MODE_AGGRESSIVE_1HZ LITERAL1
901+
SFE_UBLOX_PMS_MODE_AGGRESSIVE_2HZ LITERAL1
902+
SFE_UBLOX_PMS_MODE_AGGRESSIVE_4HZ LITERAL1
903+
SFE_UBLOX_PMS_MODE_INVALID LITERAL1
904+
905+
SFE_UBLOX_CFG_RXM_CONTINUOUS LITERAL1
906+
SFE_UBLOX_CFG_RXM_POWERSAVE LITERAL1

Diff for: src/SparkFun_u-blox_GNSS_Arduino_Library.cpp

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

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

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)