@@ -2569,6 +2569,129 @@ 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+ //  NOTE: Querying the device before the duration is complete, for example by "getLatitude()" will wake it up!
2574+ //  Returns true if command has not been not acknowledged.
2575+ //  Returns false if command has not been acknowledged or maxWait = 0.
2576+ boolean SFE_UBLOX_GPS::powerOff (uint32_t  durationInMs, uint16_t  maxWait)
2577+ {
2578+  //  use durationInMs = 0 for infinite duration
2579+  if  (_printDebug == true )
2580+  {
2581+  _debugSerial->print (F (" Powering off for " 
2582+  _debugSerial->print (durationInMs);
2583+  _debugSerial->println ("  ms" 
2584+  }
2585+ 
2586+  //  Power off device using UBX-RXM-PMREQ
2587+  packetCfg.cls  = UBX_CLASS_RXM; //  0x02
2588+  packetCfg.id  = UBX_RXM_PMREQ; //  0x41
2589+  packetCfg.len  = 8 ;
2590+  packetCfg.startingSpot  = 0 ;
2591+ 
2592+  //  duration
2593+  //  big endian to little endian, switch byte order
2594+  payloadCfg[0 ] = (durationInMs >> (8 *0 )) & 0xff ;
2595+  payloadCfg[1 ] = (durationInMs >> (8 *1 )) & 0xff ;
2596+  payloadCfg[2 ] = (durationInMs >> (8 *2 )) & 0xff ;
2597+  payloadCfg[3 ] = (durationInMs >> (8 *3 )) & 0xff ;
2598+ 
2599+  payloadCfg[4 ] = 0x02 ; // Flags : set the backup bit
2600+  payloadCfg[5 ] = 0x00 ; // Flags
2601+  payloadCfg[6 ] = 0x00 ; // Flags
2602+  payloadCfg[7 ] = 0x00 ; // Flags
2603+ 
2604+  if  (maxWait != 0 )
2605+  {
2606+  //  check for "not acknowledged" command
2607+  return  (sendCommand (&packetCfg, maxWait) != SFE_UBLOX_STATUS_COMMAND_NACK);
2608+  }
2609+  else 
2610+  {
2611+  sendCommand (&packetCfg, maxWait);
2612+  return  false ; //  can't tell if command not acknowledged if maxWait = 0
2613+  }
2614+ }
2615+ 
2616+ //  Powers off the GPS device for a given duration to reduce power consumption.
2617+ //  While powered off it can be woken up by creating a falling or rising voltage edge on the specified pin.
2618+ //  NOTE: The GPS seems to be sensitve to signals on the pins while powered off. Works best when Microcontroller is in deepsleep.
2619+ //  NOTE: Querying the device before the duration is complete, for example by "getLatitude()" will wake it up!
2620+ //  Returns true if command has not been not acknowledged.
2621+ //  Returns false if command has not been acknowledged or maxWait = 0.
2622+ boolean SFE_UBLOX_GPS::powerOffWithInterrupt (uint32_t  durationInMs, uint32_t  wakeupSources, boolean forceWhileUsb, uint16_t  maxWait)
2623+ {
2624+  //  use durationInMs = 0 for infinite duration
2625+  if  (_printDebug == true )
2626+  {
2627+  _debugSerial->print (F (" Powering off for " 
2628+  _debugSerial->print (durationInMs);
2629+  _debugSerial->println ("  ms" 
2630+  }
2631+ 
2632+  //  Power off device using UBX-RXM-PMREQ
2633+  packetCfg.cls  = UBX_CLASS_RXM; //  0x02
2634+  packetCfg.id  = UBX_RXM_PMREQ; //  0x41
2635+  packetCfg.len  = 16 ;
2636+  packetCfg.startingSpot  = 0 ;
2637+ 
2638+  payloadCfg[0 ] = 0x00 ; //  message version
2639+ 
2640+  //  bytes 1-3 are reserved - and must be set to zero
2641+  payloadCfg[1 ] = 0x00 ;
2642+  payloadCfg[2 ] = 0x00 ;
2643+  payloadCfg[3 ] = 0x00 ;
2644+ 
2645+  //  duration
2646+  //  big endian to little endian, switch byte order
2647+  payloadCfg[4 ] = (durationInMs >> (8 *0 )) & 0xff ;
2648+  payloadCfg[5 ] = (durationInMs >> (8 *1 )) & 0xff ;
2649+  payloadCfg[6 ] = (durationInMs >> (8 *2 )) & 0xff ;
2650+  payloadCfg[7 ] = (durationInMs >> (8 *3 )) & 0xff ;
2651+ 
2652+  //  flags
2653+ 
2654+  //  disables USB interface when powering off, defaults to true
2655+  if  (forceWhileUsb)
2656+  {
2657+  payloadCfg[8 ] = 0x06 ; //  force | backup
2658+  }
2659+  else 
2660+  {
2661+  payloadCfg[8 ] = 0x02 ; //  backup only (leave the force bit clear - module will stay on if USB is connected)
2662+  }
2663+ 
2664+  payloadCfg[9 ] = 0x00 ;
2665+  payloadCfg[10 ] = 0x00 ;
2666+  payloadCfg[11 ] = 0x00 ;
2667+ 
2668+  //  wakeUpSources
2669+ 
2670+  //  wakeupPin mapping, defaults to VAL_RXM_PMREQ_WAKEUPSOURCE_EXTINT0
2671+ 
2672+  //  Possible values are:
2673+  //  VAL_RXM_PMREQ_WAKEUPSOURCE_UARTRX
2674+  //  VAL_RXM_PMREQ_WAKEUPSOURCE_EXTINT0
2675+  //  VAL_RXM_PMREQ_WAKEUPSOURCE_EXTINT1
2676+  //  VAL_RXM_PMREQ_WAKEUPSOURCE_SPICS
2677+ 
2678+  payloadCfg[12 ] = (wakeupSources >> (8 *0 )) & 0xff ;
2679+  payloadCfg[13 ] = (wakeupSources >> (8 *1 )) & 0xff ;
2680+  payloadCfg[14 ] = (wakeupSources >> (8 *2 )) & 0xff ;
2681+  payloadCfg[15 ] = (wakeupSources >> (8 *3 )) & 0xff ;
2682+ 
2683+  if  (maxWait != 0 )
2684+  {
2685+  //  check for "not acknowledged" command
2686+  return  (sendCommand (&packetCfg, maxWait) != SFE_UBLOX_STATUS_COMMAND_NACK);
2687+  }
2688+  else 
2689+  {
2690+  sendCommand (&packetCfg, maxWait);
2691+  return  false ; //  can't tell if command not acknowledged if maxWait = 0
2692+  }
2693+ }
2694+ 
25722695// Change the dynamic platform model using UBX-CFG-NAV5
25732696// Possible values are:
25742697// PORTABLE,STATIONARY,PEDESTRIAN,AUTOMOTIVE,SEA,
0 commit comments