Add informSearchFailed method to update GPS power state handling (#10394)

This commit is contained in:
Ben Meadors
2026-05-05 10:12:50 -05:00
committed by GitHub
parent d559af8477
commit 603cce2988
3 changed files with 17 additions and 3 deletions
+5 -2
View File
@@ -1017,10 +1017,13 @@ void GPS::up()
setPowerState(GPS_ACTIVE); setPowerState(GPS_ACTIVE);
} }
// We've got a GPS lock. Enter a low power state, potentially. // We've finished a GPS search cycle (lock or timeout). Enter a low power state, potentially.
void GPS::down() void GPS::down()
{ {
scheduling.informGotLock(); if (hasValidLocation)
scheduling.informGotLock();
else
scheduling.informSearchFailed();
uint32_t predictedSearchDuration = scheduling.predictedSearchDurationMs(); uint32_t predictedSearchDuration = scheduling.predictedSearchDurationMs();
uint32_t sleepTime = scheduling.msUntilNextSearch(); uint32_t sleepTime = scheduling.msUntilNextSearch();
uint32_t updateInterval = Default::getConfiguredOrDefaultMs(config.position.gps_update_interval); uint32_t updateInterval = Default::getConfiguredOrDefaultMs(config.position.gps_update_interval);
+10
View File
@@ -17,6 +17,16 @@ void GPSUpdateScheduling::informGotLock()
updateLockTimePrediction(); updateLockTimePrediction();
} }
// Search finished without obtaining a fix. We still need to mark the end time so
// the next sleep is timed correctly, but we must not feed the timeout duration
// into predictedMsToGetLock — doing so poisons msUntilNextSearch() and causes
// down() to fall into GPS_IDLE, leaving the chip awake on subsequent indoor cycles.
void GPSUpdateScheduling::informSearchFailed()
{
searchEndedMs = millis();
LOG_DEBUG("GPS search ended without fix after %us", (searchEndedMs - searchStartedMs) / 1000);
}
// Clear old lock-time prediction data. // Clear old lock-time prediction data.
// When re-enabling GPS with user button. // When re-enabling GPS with user button.
void GPSUpdateScheduling::reset() void GPSUpdateScheduling::reset()
+2 -1
View File
@@ -8,7 +8,8 @@ class GPSUpdateScheduling
public: public:
// Marks the time of these events, for calculation use // Marks the time of these events, for calculation use
void informSearching(); void informSearching();
void informGotLock(); // Predicted lock-time is recalculated here void informGotLock(); // Predicted lock-time is recalculated here
void informSearchFailed(); // Search ended without a fix; prediction is left untouched
void reset(); // Reset the prediction - after GPS::disable() / GPS::enable() void reset(); // Reset the prediction - after GPS::disable() / GPS::enable()
bool isUpdateDue(); // Is it time to begin searching for a GPS position? bool isUpdateDue(); // Is it time to begin searching for a GPS position?