Merge pull request #1156 from csrutil/persist-gps

Persist GPS enabled state to preferences
This commit is contained in:
ripplebiz
2025-12-02 21:50:21 +11:00
committed by GitHub
6 changed files with 50 additions and 3 deletions

View File

@@ -222,6 +222,8 @@ void DataStore::loadPrefsInt(const char *filename, NodePrefs& _prefs, double& no
file.read(pad, 2); // 78 file.read(pad, 2); // 78
file.read((uint8_t *)&_prefs.ble_pin, sizeof(_prefs.ble_pin)); // 80 file.read((uint8_t *)&_prefs.ble_pin, sizeof(_prefs.ble_pin)); // 80
file.read((uint8_t *)&_prefs.buzzer_quiet, sizeof(_prefs.buzzer_quiet)); // 84 file.read((uint8_t *)&_prefs.buzzer_quiet, sizeof(_prefs.buzzer_quiet)); // 84
file.read((uint8_t *)&_prefs.gps_enabled, sizeof(_prefs.gps_enabled)); // 85
file.read((uint8_t *)&_prefs.gps_interval, sizeof(_prefs.gps_interval)); // 86
file.close(); file.close();
} }
@@ -254,6 +256,8 @@ void DataStore::savePrefs(const NodePrefs& _prefs, double node_lat, double node_
file.write(pad, 2); // 78 file.write(pad, 2); // 78
file.write((uint8_t *)&_prefs.ble_pin, sizeof(_prefs.ble_pin)); // 80 file.write((uint8_t *)&_prefs.ble_pin, sizeof(_prefs.ble_pin)); // 80
file.write((uint8_t *)&_prefs.buzzer_quiet, sizeof(_prefs.buzzer_quiet)); // 84 file.write((uint8_t *)&_prefs.buzzer_quiet, sizeof(_prefs.buzzer_quiet)); // 84
file.write((uint8_t *)&_prefs.gps_enabled, sizeof(_prefs.gps_enabled)); // 85
file.write((uint8_t *)&_prefs.gps_interval, sizeof(_prefs.gps_interval)); // 86
file.close(); file.close();
} }

View File

@@ -739,6 +739,8 @@ MyMesh::MyMesh(mesh::Radio &radio, mesh::RNG &rng, mesh::RTCClock &rtc, SimpleMe
_prefs.bw = LORA_BW; _prefs.bw = LORA_BW;
_prefs.cr = LORA_CR; _prefs.cr = LORA_CR;
_prefs.tx_power_dbm = LORA_TX_POWER; _prefs.tx_power_dbm = LORA_TX_POWER;
_prefs.gps_enabled = 0; // GPS disabled by default
_prefs.gps_interval = 0; // No automatic GPS updates by default
//_prefs.rx_delay_base = 10.0f; enable once new algo fixed //_prefs.rx_delay_base = 10.0f; enable once new algo fixed
} }
@@ -776,6 +778,8 @@ void MyMesh::begin(bool has_display) {
_prefs.sf = constrain(_prefs.sf, 5, 12); _prefs.sf = constrain(_prefs.sf, 5, 12);
_prefs.cr = constrain(_prefs.cr, 5, 8); _prefs.cr = constrain(_prefs.cr, 5, 8);
_prefs.tx_power_dbm = constrain(_prefs.tx_power_dbm, 1, MAX_LORA_TX_POWER); _prefs.tx_power_dbm = constrain(_prefs.tx_power_dbm, 1, MAX_LORA_TX_POWER);
_prefs.gps_enabled = constrain(_prefs.gps_enabled, 0, 1); // Ensure boolean 0 or 1
_prefs.gps_interval = constrain(_prefs.gps_interval, 0, 86400); // Max 24 hours
#ifdef BLE_PIN_CODE // 123456 by default #ifdef BLE_PIN_CODE // 123456 by default
if (_prefs.ble_pin == 0) { if (_prefs.ble_pin == 0) {
@@ -1521,6 +1525,17 @@ void MyMesh::handleCmdFrame(size_t len) {
*np++ = 0; // modify 'cmd_frame', replace ':' with null *np++ = 0; // modify 'cmd_frame', replace ':' with null
bool success = sensors.setSettingValue(sp, np); bool success = sensors.setSettingValue(sp, np);
if (success) { if (success) {
#if ENV_INCLUDE_GPS == 1
// Update node preferences for GPS settings
if (strcmp(sp, "gps") == 0) {
_prefs.gps_enabled = (np[0] == '1') ? 1 : 0;
savePrefs();
} else if (strcmp(sp, "gps_interval") == 0) {
uint32_t interval_seconds = atoi(np);
_prefs.gps_interval = constrain(interval_seconds, 0, 86400);
savePrefs();
}
#endif
writeOKFrame(); writeOKFrame();
} else { } else {
writeErrFrame(ERR_CODE_ILLEGAL_ARG); writeErrFrame(ERR_CODE_ILLEGAL_ARG);

View File

@@ -25,4 +25,6 @@ struct NodePrefs { // persisted to file
uint32_t ble_pin; uint32_t ble_pin;
uint8_t advert_loc_policy; uint8_t advert_loc_policy;
uint8_t buzzer_quiet; uint8_t buzzer_quiet;
uint8_t gps_enabled; // GPS enabled flag (0=disabled, 1=enabled)
uint32_t gps_interval; // GPS read interval in seconds
}; };

View File

@@ -537,6 +537,19 @@ void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* no
#endif #endif
_node_prefs = node_prefs; _node_prefs = node_prefs;
#if ENV_INCLUDE_GPS == 1
// Apply GPS preferences from stored prefs
if (_sensors != NULL && _node_prefs != NULL) {
_sensors->setSettingValue("gps", _node_prefs->gps_enabled ? "1" : "0");
if (_node_prefs->gps_interval > 0) {
char interval_str[12]; // Max: 24 hours = 86400 seconds (5 digits + null)
sprintf(interval_str, "%u", _node_prefs->gps_interval);
_sensors->setSettingValue("gps_interval", interval_str);
}
}
#endif
if (_display != NULL) { if (_display != NULL) {
_display->turnOn(); _display->turnOn();
} }
@@ -863,13 +876,16 @@ void UITask::toggleGPS() {
if (strcmp(_sensors->getSettingName(i), "gps") == 0) { if (strcmp(_sensors->getSettingName(i), "gps") == 0) {
if (strcmp(_sensors->getSettingValue(i), "1") == 0) { if (strcmp(_sensors->getSettingValue(i), "1") == 0) {
_sensors->setSettingValue("gps", "0"); _sensors->setSettingValue("gps", "0");
_node_prefs->gps_enabled = 0;
notify(UIEventType::ack); notify(UIEventType::ack);
showAlert("GPS: Disabled", 800); showAlert("GPS: Disabled", 800);
} else { } else {
_sensors->setSettingValue("gps", "1"); _sensors->setSettingValue("gps", "1");
_node_prefs->gps_enabled = 1;
notify(UIEventType::ack); notify(UIEventType::ack);
showAlert("GPS: Enabled", 800); showAlert("GPS: Enabled", 800);
} }
the_mesh.savePrefs();
_next_refresh = 0; _next_refresh = 0;
break; break;
} }

View File

@@ -521,6 +521,15 @@ bool EnvironmentSensorManager::setSettingValue(const char* name, const char* val
} }
return true; return true;
} }
if (strcmp(name, "gps_interval") == 0) {
uint32_t interval_seconds = atoi(value);
if (interval_seconds > 0) {
gps_update_interval_sec = interval_seconds;
} else {
gps_update_interval_sec = 1; // Default to 1 second if 0
}
return true;
}
#endif #endif
return false; // not supported return false; // not supported
} }
@@ -686,9 +695,9 @@ void EnvironmentSensorManager::loop() {
static long next_gps_update = 0; static long next_gps_update = 0;
#if ENV_INCLUDE_GPS #if ENV_INCLUDE_GPS
_location->loop();
if (millis() > next_gps_update) { if (millis() > next_gps_update) {
_location->loop();
if(gps_active){ if(gps_active){
#ifdef RAK_WISBLOCK_GPS #ifdef RAK_WISBLOCK_GPS
if ((i2cGPSFlag || serialGPSFlag) && _location->isValid()) { if ((i2cGPSFlag || serialGPSFlag) && _location->isValid()) {
@@ -708,7 +717,7 @@ void EnvironmentSensorManager::loop() {
} }
#endif #endif
} }
next_gps_update = millis() + 1000; next_gps_update = millis() + (gps_update_interval_sec * 1000);
} }
#endif #endif
} }

View File

@@ -25,6 +25,7 @@ protected:
bool gps_detected = false; bool gps_detected = false;
bool gps_active = false; bool gps_active = false;
uint32_t gps_update_interval_sec = 1; // Default 1 second
#if ENV_INCLUDE_GPS #if ENV_INCLUDE_GPS
LocationProvider* _location; LocationProvider* _location;