Add timeout to ublox PMREQ command (#2851)

pull/2855/head^2
Jonathan Bennett 2023-10-01 20:39:18 -05:00 zatwierdzone przez GitHub
rodzic 5ecdbd0dbb
commit 50db2d0e9b
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
4 zmienionych plików z 14 dodań i 10 usunięć

Wyświetl plik

@ -433,7 +433,7 @@ GPS::~GPS()
notifyGPSSleepObserver.observe(&notifyGPSSleep);
}
void GPS::setGPSPower(bool on, bool standbyOnly)
void GPS::setGPSPower(bool on, bool standbyOnly, uint32_t sleepTime)
{
LOG_INFO("Setting GPS power=%d\n", on);
if (on) {
@ -483,6 +483,10 @@ void GPS::setGPSPower(bool on, bool standbyOnly)
if (!on) {
if (gnssModel == GNSS_MODEL_UBLOX) {
uint8_t msglen;
LOG_DEBUG("Sleep Time: %i\n", sleepTime);
for (int i = 0; i < 4; i++) {
gps->_message_PMREQ[0 + i] = sleepTime >> (i * 8); // Encode the sleep time in millis into the packet
}
msglen = gps->makeUBXPacket(0x02, 0x41, 0x08, gps->_message_PMREQ);
gps->_serial_gps->write(gps->UBXscratch, msglen);
}
@ -514,7 +518,7 @@ void GPS::setAwake(bool on)
LOG_DEBUG("WANT GPS=%d\n", on);
isAwake = on;
if (!enabled) { // short circuit if the user has disabled GPS
setGPSPower(false, false);
setGPSPower(false, false, 0);
return;
}
@ -532,12 +536,12 @@ void GPS::setAwake(bool on)
}
if ((int32_t)getSleepTime() - averageLockTime >
15 * 60 * 1000) { // 15 minutes is probably long enough to make a complete poweroff worth it.
setGPSPower(on, false);
setGPSPower(on, false, getSleepTime() - averageLockTime);
} else if ((int32_t)getSleepTime() - averageLockTime > 10000) { // 10 seconds is enough for standby
#ifdef GPS_UC6580
setGPSPower(on, false);
setGPSPower(on, false, getSleepTime() - averageLockTime);
#else
setGPSPower(on, true);
setGPSPower(on, true, getSleepTime() - averageLockTime);
#endif
} else if (averageLockTime > 20000) {
averageLockTime -= 1000; // eventually want to sleep again.
@ -899,7 +903,7 @@ GPS *GPS::createGps()
LOG_DEBUG("Using " NMEA_MSG_GXGSA " for 3DFIX and PDOP\n");
#endif
new_gps->setGPSPower(true, false);
new_gps->setGPSPower(true, false, 0);
#ifdef PIN_GPS_RESET
digitalWrite(PIN_GPS_RESET, GPS_RESET_MODE); // assert for 10ms

Wyświetl plik

@ -94,7 +94,7 @@ class GPS : private concurrency::OSThread
/** If !NULL we will use this serial port to construct our GPS */
static HardwareSerial *_serial_gps;
static const uint8_t _message_PMREQ[];
static uint8_t _message_PMREQ[];
static const uint8_t _message_CFG_RXM_PSM[];
static const uint8_t _message_CFG_RXM_ECO[];
static const uint8_t _message_CFG_PM2[];
@ -132,7 +132,7 @@ class GPS : private concurrency::OSThread
// Disable the thread
int32_t disable() override;
void setGPSPower(bool on, bool standbyOnly);
void setGPSPower(bool on, bool standbyOnly, uint32_t sleepTime);
/// Returns true if we have acquired GPS lock.
virtual bool hasLock();

Wyświetl plik

@ -1,4 +1,4 @@
const uint8_t GPS::_message_PMREQ[] PROGMEM = {
uint8_t GPS::_message_PMREQ[] PROGMEM = {
0x00, 0x00, // 4 bytes duration of request task
0x00, 0x00, // (milliseconds)
0x02, 0x00, // Task flag bitfield

Wyświetl plik

@ -175,7 +175,7 @@ void doDeepSleep(uint32_t msecToWake, bool skipPreflight = false)
nodeDB.saveToDisk();
// Kill GPS power completely (even if previously we just had it in sleep mode)
gps->setGPSPower(false, false);
gps->setGPSPower(false, false, 0);
setLed(false);