Merge pull request #1156 from csrutil/persist-gps
Persist GPS enabled state to preferences
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user