Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/cli_commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -1026,7 +1026,7 @@ region save
**Parameters:**
- `value`: `0` for continuous tracking, or a period. The value can be postfixed with `s`, `m`, `h` or `d` to specify the unit (seconds by default).

**Note:** A periodic acquisition stops after receiving a valid fix, then resumes after the configured period.
**Note:** A periodic acquisition stops after receiving a valid fix, then resumes after the configured period. Without a fix it stops after 5 minutes, or after 15 minutes until the first fix since boot (`GPS_PERIODIC_ACQUISITION_TIMEOUT_MS`, `GPS_FIRST_FIX_TIMEOUT_MS`).

---

Expand Down
16 changes: 12 additions & 4 deletions src/helpers/sensors/MicroNMEALocationProvider.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@
#ifndef GPS_PERIODIC_ACQUISITION_TIMEOUT_MS
#define GPS_PERIODIC_ACQUISITION_TIMEOUT_MS 300000UL
#endif
// limit for the periodic window before the first fix since boot (cold start can be long,
// a full almanac takes 12.5 min); 0 = keep searching until a fix
#ifndef GPS_FIRST_FIX_TIMEOUT_MS
#define GPS_FIRST_FIX_TIMEOUT_MS 900000UL
#endif

// in periodic mode, keep reading after the first valid fix until enough satellites
// are used or the settle time has elapsed
Expand Down Expand Up @@ -363,10 +368,13 @@ class MicroNMEALocationProvider : public LocationProvider {
}
}

// no timeout until a first fix has been obtained (cold start can be long)
if (_acquiringPeriodically && _lastFix.valid &&
(uint32_t)(millis() - _acquisitionStarted) >= GPS_PERIODIC_ACQUISITION_TIMEOUT_MS) {
finishPeriodicAcquisition();
// a longer limit until a first fix has been obtained (cold start can be long)
if (_acquiringPeriodically) {
const uint32_t limit = _lastFix.valid ? GPS_PERIODIC_ACQUISITION_TIMEOUT_MS
: GPS_FIRST_FIX_TIMEOUT_MS;
if (limit > 0 && (uint32_t)(millis() - _acquisitionStarted) >= limit) {
finishPeriodicAcquisition();
}
}

updateTime();
Expand Down