Skip to content
This repository was archived by the owner on Jan 28, 2021. It is now read-only.

Commit 9c43e96

Browse files
committed
implemented Power On/Off (UBX-RXM-PMREQ)
1 parent cd6b4dc commit 9c43e96

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

src/SparkFun_Ublox_Arduino_Library.cpp

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2569,6 +2569,113 @@ uint8_t SFE_UBLOX_GPS::getPowerSaveMode(uint16_t maxWait)
25692569
return (payloadCfg[1]); // Return the low power mode
25702570
}
25712571

2572+
// Powers off the GPS device for a given duration to reduce power consumption.
2573+
// WARNING: Querying the device before the duration is complete, for example by "getLatitude()" will wake it up!
2574+
boolean SFE_UBLOX_GPS::powerOff(uint32_t durationInMs, uint16_t maxWait)
2575+
{
2576+
// use durationInMs = 0 for infinite duration
2577+
if (_printDebug == true)
2578+
{
2579+
_debugSerial->print(F("Powering off for "));
2580+
_debugSerial->print(durationInMs);
2581+
_debugSerial->println(" ms");
2582+
}
2583+
2584+
// Power off device using UBX-RXM-PMREQ
2585+
packetCfg.cls = UBX_CLASS_RXM; // 0x02
2586+
packetCfg.id = UBX_RXM_PMREQ; // 0x41
2587+
packetCfg.len = 8;
2588+
packetCfg.startingSpot = 0;
2589+
2590+
// duration
2591+
// big endian to little endian, switch byte order
2592+
payloadCfg[0] = (durationInMs >> (8*0)) & 0xff;
2593+
payloadCfg[1] = (durationInMs >> (8*1)) & 0xff;
2594+
payloadCfg[2] = (durationInMs >> (8*2)) & 0xff;
2595+
payloadCfg[3] = (durationInMs >> (8*3)) & 0xff;
2596+
2597+
// check for "not acknowledged" command
2598+
return (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_COMMAND_NACK);
2599+
}
2600+
2601+
// Powers off the GPS device for a given duration to reduce power consumption.
2602+
// While powered off it can be woken up by creating a falling or rising voltage edge on the specified pin.
2603+
// WARNING: Querying the device before the duration is complete, for example by "getLatitude()" will wake it up!
2604+
boolean SFE_UBLOX_GPS::powerOffWithInterrupt(uint32_t durationInMs, uint8_t wakeupPin, boolean forceWhileUsb, uint16_t maxWait)
2605+
{
2606+
// use durationInMs = 0 for infinite duration
2607+
if (_printDebug == true)
2608+
{
2609+
_debugSerial->print(F("Powering off for "));
2610+
_debugSerial->print(durationInMs);
2611+
_debugSerial->println(" ms");
2612+
}
2613+
2614+
// Power off device using UBX-RXM-PMREQ
2615+
packetCfg.cls = UBX_CLASS_RXM; // 0x02
2616+
packetCfg.id = UBX_RXM_PMREQ; // 0x41
2617+
packetCfg.len = 16;
2618+
packetCfg.startingSpot = 0;
2619+
2620+
payloadCfg[0] = 0x00; // message version
2621+
// bytes 1-3 are reserved
2622+
2623+
// duration
2624+
// big endian to little endian, switch byte order
2625+
payloadCfg[4] = (durationInMs >> (8*0)) & 0xff;
2626+
payloadCfg[5] = (durationInMs >> (8*1)) & 0xff;
2627+
payloadCfg[6] = (durationInMs >> (8*2)) & 0xff;
2628+
payloadCfg[7] = (durationInMs >> (8*3)) & 0xff;
2629+
2630+
// flags
2631+
payloadCfg[8] = 0x00;
2632+
payloadCfg[9] = 0x00;
2633+
payloadCfg[10] = 0x00;
2634+
2635+
// disables USB interface when powering off, defaults to true
2636+
if (forceWhileUsb)
2637+
{
2638+
payloadCfg[11] = 0x04;
2639+
}
2640+
else
2641+
{
2642+
payloadCfg[11] = 0x02;
2643+
}
2644+
2645+
// wakeUpSources
2646+
payloadCfg[12] = 0x00;
2647+
payloadCfg[13] = 0x00;
2648+
payloadCfg[14] = 0x00;
2649+
2650+
// wakeupPin mapping, defaults to EXINT0, limited to one pin for now
2651+
// last byte of wakeUpSources
2652+
uint8_t terminatingByte;
2653+
2654+
switch (wakeupPin)
2655+
{
2656+
case 0: // UART RX
2657+
terminatingByte = 0x08; // 0000 1000
2658+
break;
2659+
2660+
case 1: // EXINT 0
2661+
terminatingByte = 0x20; // 0010 0000
2662+
break;
2663+
2664+
case 2: // EXINT 1
2665+
terminatingByte = 0x40; // 0100 0000
2666+
break;
2667+
2668+
case 3: // SPI CS
2669+
terminatingByte = 0x80; // 1000 0000
2670+
break;
2671+
}
2672+
2673+
payloadCfg[15] = terminatingByte;
2674+
2675+
// check for "not acknowledged" command
2676+
return (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_COMMAND_NACK);
2677+
}
2678+
25722679
//Change the dynamic platform model using UBX-CFG-NAV5
25732680
//Possible values are:
25742681
//PORTABLE,STATIONARY,PEDESTRIAN,AUTOMOTIVE,SEA,

src/SparkFun_Ublox_Arduino_Library.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,8 @@ class SFE_UBLOX_GPS
641641

642642
boolean powerSaveMode(bool power_save = true, uint16_t maxWait = 1100);
643643
uint8_t getPowerSaveMode(uint16_t maxWait = 1100); // Returns 255 if the sendCommand fails
644+
boolean powerOff(uint32_t durationInMs, uint16_t maxWait = 1100);
645+
boolean powerOffWithInterrupt(uint32_t durationInMs, uint8_t wakeupPin = 1, boolean forceWhileUsb = true, uint16_t maxWait = 1100);
644646

645647
//Change the dynamic platform model using UBX-CFG-NAV5
646648
boolean setDynamicModel(dynModel newDynamicModel = DYN_MODEL_PORTABLE, uint16_t maxWait = 1100);

0 commit comments

Comments
 (0)