feat(gps): Do not start gps if lora region is unset (#10386)

* Disable gps thread on startup if lora region is unset

There is little reason to waste battery on the gps if the data cannot
yet be used.

* fix goobered merge

Refactor GPS enabling logic and remove duplicate code.

* trunk

---------

Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
This commit is contained in:
webgeek1234
2026-06-28 18:22:09 -05:00
committed by GitHub
co-authored by GitHub Jonathan Bennett
parent 29b3cfaeca
commit 9cef69a9d3
5 changed files with 27 additions and 0 deletions
+5
View File
@@ -2257,6 +2257,11 @@ int32_t GPS::disable()
return INT32_MAX;
}
bool GPS::isEnabled()
{
return enabled;
}
void GPS::toggleGpsMode()
{
if (config.position.gps_mode == meshtastic_Config_PositionConfig_GpsMode_ENABLED) {
+3
View File
@@ -98,6 +98,9 @@ class GPS : private concurrency::OSThread
// Disable the thread
int32_t disable() override;
// Returns if the thread is enabled
bool isEnabled();
// toggle between enabled/disabled
void toggleGpsMode();
+5
View File
@@ -214,6 +214,11 @@ static void applyLoraRegion(meshtastic_Config_LoRaConfig_RegionCode region, bool
snprintf(moduleConfig.mqtt.root, sizeof(moduleConfig.mqtt.root), "%s/%s", default_mqtt_root, myRegion->name);
changes |= SEGMENT_MODULECONFIG;
}
#if !MESHTASTIC_EXCLUDE_GPS
// Enable gps if it was previously disabled due to region not being set
if (gps != nullptr && !gps->isEnabled() && config.position.gps_mode == meshtastic_Config_PositionConfig_GpsMode_ENABLED)
gps->enable();
#endif
service->reloadConfig(changes);
}
+6
View File
@@ -971,6 +971,12 @@ void setup()
gps = GPS::createGps();
if (gps) {
gpsStatus->observe(&gps->newStatus);
// If lora region is unset, disable the gps thread
if (config.lora.region == meshtastic_Config_LoRaConfig_RegionCode_UNSET &&
config.position.gps_mode == meshtastic_Config_PositionConfig_GpsMode_ENABLED) {
gps->disable();
}
} else {
LOG_DEBUG("Run without GPS");
}
+8
View File
@@ -1020,6 +1020,14 @@ void AdminModule::handleSetConfig(const meshtastic_Config &c, bool fromOthers)
}
#endif
#if !MESHTASTIC_EXCLUDE_GPS
// Enable gps if it was previously disabled due to region not being set
if (!requiresReboot && config.lora.region != meshtastic_Config_LoRaConfig_RegionCode_UNSET && gps != nullptr &&
!gps->isEnabled() && config.position.gps_mode == meshtastic_Config_PositionConfig_GpsMode_ENABLED) {
gps->enable();
}
#endif
config.lora = validatedLora; // Finally, return the validated config back to the main config
break;