From 0502bc370dcdce6c106632511e32f3ca7713ae2f Mon Sep 17 00:00:00 2001 From: Florent Date: Sun, 5 Oct 2025 19:23:52 +0200 Subject: [PATCH 1/9] CommonCLI: gps management commands --- examples/simple_repeater/MyMesh.cpp | 38 +++++++++++++++++++ examples/simple_repeater/MyMesh.h | 6 +++ src/helpers/CommonCLI.cpp | 13 +++++++ src/helpers/CommonCLI.h | 4 ++ src/helpers/sensors/LocationProvider.h | 1 + .../sensors/MicroNMEALocationProvider.h | 10 +++++ 6 files changed, 72 insertions(+) diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index df945d45..93175eb6 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -758,6 +758,44 @@ void MyMesh::removeNeighbor(const uint8_t *pubkey, int key_len) { #endif } +void MyMesh::gpsGetStatus(char * reply) { + LocationProvider * l = sensors.getLocationProvider(); + if (l != NULL) { + bool status = l->isActive(); + bool sync = l->isValid(); + int sats = l->satellitesCount(); + if (status) { + sprintf(reply, "on, %s, %d sats", sync?"fix":"no fix", sats); + } else { + strcpy(reply, "off"); + } + } else { + strcpy(reply, "Can't find GPS"); + } +} + +void MyMesh::gpsStart() { + LocationProvider * l = sensors.getLocationProvider(); + if (l != NULL) { + l->begin(); + l->reset(); + } +} + +void MyMesh::gpsStop() { + LocationProvider * l = sensors.getLocationProvider(); + if (l != NULL) { + l->stop(); + } +} + +void MyMesh::gpsSyncTime() { + LocationProvider * l = sensors.getLocationProvider(); + if (l != NULL) { + l->syncTime(); + } +} + void MyMesh::saveIdentity(const mesh::LocalIdentity &new_id) { self_id = new_id; #if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) diff --git a/examples/simple_repeater/MyMesh.h b/examples/simple_repeater/MyMesh.h index 05a8d13b..19bef70e 100644 --- a/examples/simple_repeater/MyMesh.h +++ b/examples/simple_repeater/MyMesh.h @@ -176,6 +176,12 @@ public: void formatNeighborsReply(char *reply) override; void removeNeighbor(const uint8_t* pubkey, int key_len) override; + // Gps mgmt cli callbacks + void gpsGetStatus(char * reply) override; + void gpsStart() override; + void gpsStop() override; + void gpsSyncTime() override; + mesh::LocalIdentity& getSelfId() override { return self_id; } void saveIdentity(const mesh::LocalIdentity& new_id) override; diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index 68acdf2b..e674cbc2 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -401,6 +401,19 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch sprintf(reply, "%s (Build: %s)", _callbacks->getFirmwareVer(), _callbacks->getBuildDate()); } else if (memcmp(command, "board", 5) == 0) { sprintf(reply, "%s", _board->getManufacturerName()); +#if ENV_INCLUDE_GPS == 1 + } else if (memcmp(command, "gps on", 6) == 0) { + _callbacks->gpsStart(); + strcpy(reply, "ok"); + } else if (memcmp(command, "gps off", 7) == 0) { + _callbacks->gpsStop(); + strcpy(reply, "ok"); + } else if (memcmp(command, "gps sync", 8) == 0) { + _callbacks->gpsSyncTime(); + strcpy(reply, "Waiting fix ..."); + } else if (memcmp(command, "gps", 3) == 0) { + _callbacks->gpsGetStatus(reply); +#endif } else if (memcmp(command, "log start", 9) == 0) { _callbacks->setLoggingOn(true); strcpy(reply, " logging on"); diff --git a/src/helpers/CommonCLI.h b/src/helpers/CommonCLI.h index ff8ff50e..08e5f988 100644 --- a/src/helpers/CommonCLI.h +++ b/src/helpers/CommonCLI.h @@ -50,6 +50,10 @@ public: virtual void saveIdentity(const mesh::LocalIdentity& new_id) = 0; virtual void clearStats() = 0; virtual void applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) = 0; + virtual void gpsGetStatus(char * reply) {} + virtual void gpsStart() {} + virtual void gpsStop() {} + virtual void gpsSyncTime() {} }; class CommonCLI { diff --git a/src/helpers/sensors/LocationProvider.h b/src/helpers/sensors/LocationProvider.h index f93dec48..f1c934e5 100644 --- a/src/helpers/sensors/LocationProvider.h +++ b/src/helpers/sensors/LocationProvider.h @@ -21,4 +21,5 @@ public: virtual void begin() = 0; virtual void stop() = 0; virtual void loop() = 0; + virtual bool isActive() = 0; }; diff --git a/src/helpers/sensors/MicroNMEALocationProvider.h b/src/helpers/sensors/MicroNMEALocationProvider.h index ec82f25e..16344108 100644 --- a/src/helpers/sensors/MicroNMEALocationProvider.h +++ b/src/helpers/sensors/MicroNMEALocationProvider.h @@ -78,6 +78,16 @@ public : } } + bool isActive() override { + // directly read the enable pin if present as gps can be + // activated/deactivated outside of here ... + if (_pin_en != -1) { + return digitalRead(_pin_en) == PIN_GPS_EN_ACTIVE; + } else { + return true; // no enable so must be active + } + } + void syncTime() override { nmea.clear(); LocationProvider::syncTime(); } long getLatitude() override { return nmea.getLatitude(); } long getLongitude() override { return nmea.getLongitude(); } From e4f2d63b0abd850fe602e0ab045c6147ff2f4037 Mon Sep 17 00:00:00 2001 From: Florent Date: Sun, 5 Oct 2025 20:31:25 +0200 Subject: [PATCH 2/9] cli_gps: use sensormanger to toggle gps on/off to keep state coherent --- examples/simple_repeater/MyMesh.cpp | 44 +++++++++++++------ examples/simple_repeater/MyMesh.h | 3 ++ src/helpers/sensors/LocationProvider.h | 2 +- .../sensors/MicroNMEALocationProvider.h | 2 +- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index 93175eb6..e5a8b6b3 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -761,11 +761,15 @@ void MyMesh::removeNeighbor(const uint8_t *pubkey, int key_len) { void MyMesh::gpsGetStatus(char * reply) { LocationProvider * l = sensors.getLocationProvider(); if (l != NULL) { - bool status = l->isActive(); - bool sync = l->isValid(); + bool enabled = l->isEnabled(); // is EN pin on ? + bool active = gpsGetState(); // is enabled at SensorManager level ? + bool fix = l->isValid(); // has fix ? int sats = l->satellitesCount(); - if (status) { - sprintf(reply, "on, %s, %d sats", sync?"fix":"no fix", sats); + if (enabled) { + sprintf(reply, "on, %s, %s, %d sats", + active?"active":"deactivated", + fix?"fix":"no fix", + sats); } else { strcpy(reply, "off"); } @@ -774,19 +778,33 @@ void MyMesh::gpsGetStatus(char * reply) { } } -void MyMesh::gpsStart() { - LocationProvider * l = sensors.getLocationProvider(); - if (l != NULL) { - l->begin(); - l->reset(); +bool MyMesh::gpsGetState() { + int num = sensors.getNumSettings(); + for (int i = 0; i < num; i++) { + if (strcmp(sensors.getSettingName(i), "gps") == 0) { + return !strcmp(sensors.getSettingValue(i), "1"); + } } + return false; +} + +void MyMesh::gpsSetState(bool value) { + // toggle GPS on/off + int num = sensors.getNumSettings(); + for (int i = 0; i < num; i++) { + if (strcmp(sensors.getSettingName(i), "gps") == 0) { + sensors.setSettingValue("gps", value?"1":"0"); + break; + } + } +} + +void MyMesh::gpsStart() { + gpsSetState(true); } void MyMesh::gpsStop() { - LocationProvider * l = sensors.getLocationProvider(); - if (l != NULL) { - l->stop(); - } + gpsSetState(false); } void MyMesh::gpsSyncTime() { diff --git a/examples/simple_repeater/MyMesh.h b/examples/simple_repeater/MyMesh.h index 19bef70e..880d1043 100644 --- a/examples/simple_repeater/MyMesh.h +++ b/examples/simple_repeater/MyMesh.h @@ -142,6 +142,9 @@ protected: void onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender_idx, const uint8_t* secret, uint8_t* data, size_t len) override; bool onPeerPathRecv(mesh::Packet* packet, int sender_idx, const uint8_t* secret, uint8_t* path, uint8_t path_len, uint8_t extra_type, uint8_t* extra, uint8_t extra_len) override; + bool gpsGetState(); + void gpsSetState(bool value); + public: MyMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables); diff --git a/src/helpers/sensors/LocationProvider.h b/src/helpers/sensors/LocationProvider.h index f1c934e5..81d08652 100644 --- a/src/helpers/sensors/LocationProvider.h +++ b/src/helpers/sensors/LocationProvider.h @@ -21,5 +21,5 @@ public: virtual void begin() = 0; virtual void stop() = 0; virtual void loop() = 0; - virtual bool isActive() = 0; + virtual bool isEnabled() = 0; }; diff --git a/src/helpers/sensors/MicroNMEALocationProvider.h b/src/helpers/sensors/MicroNMEALocationProvider.h index 16344108..fb29fd79 100644 --- a/src/helpers/sensors/MicroNMEALocationProvider.h +++ b/src/helpers/sensors/MicroNMEALocationProvider.h @@ -78,7 +78,7 @@ public : } } - bool isActive() override { + bool isEnabled() override { // directly read the enable pin if present as gps can be // activated/deactivated outside of here ... if (_pin_en != -1) { From 7be65c148eac7d2f5b95b68b47c9db994a5ecd5a Mon Sep 17 00:00:00 2001 From: Florent de Lamotte Date: Mon, 6 Oct 2025 10:25:10 +0200 Subject: [PATCH 3/9] cli_gps: remove callbacks and add generic sensor set/get. --- examples/simple_repeater/MyMesh.cpp | 56 --------------------- examples/simple_repeater/MyMesh.h | 9 ---- src/helpers/CommonCLI.cpp | 77 ++++++++++++++++++++++++++--- src/helpers/CommonCLI.h | 8 +-- 4 files changed, 74 insertions(+), 76 deletions(-) diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index e5a8b6b3..df945d45 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -758,62 +758,6 @@ void MyMesh::removeNeighbor(const uint8_t *pubkey, int key_len) { #endif } -void MyMesh::gpsGetStatus(char * reply) { - LocationProvider * l = sensors.getLocationProvider(); - if (l != NULL) { - bool enabled = l->isEnabled(); // is EN pin on ? - bool active = gpsGetState(); // is enabled at SensorManager level ? - bool fix = l->isValid(); // has fix ? - int sats = l->satellitesCount(); - if (enabled) { - sprintf(reply, "on, %s, %s, %d sats", - active?"active":"deactivated", - fix?"fix":"no fix", - sats); - } else { - strcpy(reply, "off"); - } - } else { - strcpy(reply, "Can't find GPS"); - } -} - -bool MyMesh::gpsGetState() { - int num = sensors.getNumSettings(); - for (int i = 0; i < num; i++) { - if (strcmp(sensors.getSettingName(i), "gps") == 0) { - return !strcmp(sensors.getSettingValue(i), "1"); - } - } - return false; -} - -void MyMesh::gpsSetState(bool value) { - // toggle GPS on/off - int num = sensors.getNumSettings(); - for (int i = 0; i < num; i++) { - if (strcmp(sensors.getSettingName(i), "gps") == 0) { - sensors.setSettingValue("gps", value?"1":"0"); - break; - } - } -} - -void MyMesh::gpsStart() { - gpsSetState(true); -} - -void MyMesh::gpsStop() { - gpsSetState(false); -} - -void MyMesh::gpsSyncTime() { - LocationProvider * l = sensors.getLocationProvider(); - if (l != NULL) { - l->syncTime(); - } -} - void MyMesh::saveIdentity(const mesh::LocalIdentity &new_id) { self_id = new_id; #if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) diff --git a/examples/simple_repeater/MyMesh.h b/examples/simple_repeater/MyMesh.h index 880d1043..05a8d13b 100644 --- a/examples/simple_repeater/MyMesh.h +++ b/examples/simple_repeater/MyMesh.h @@ -142,9 +142,6 @@ protected: void onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender_idx, const uint8_t* secret, uint8_t* data, size_t len) override; bool onPeerPathRecv(mesh::Packet* packet, int sender_idx, const uint8_t* secret, uint8_t* path, uint8_t path_len, uint8_t extra_type, uint8_t* extra, uint8_t extra_len) override; - bool gpsGetState(); - void gpsSetState(bool value); - public: MyMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables); @@ -179,12 +176,6 @@ public: void formatNeighborsReply(char *reply) override; void removeNeighbor(const uint8_t* pubkey, int key_len) override; - // Gps mgmt cli callbacks - void gpsGetStatus(char * reply) override; - void gpsStart() override; - void gpsStop() override; - void gpsSyncTime() override; - mesh::LocalIdentity& getSelfId() override { return self_id; } void saveIdentity(const mesh::LocalIdentity& new_id) override; diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index e674cbc2..ee029ec3 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -128,6 +128,27 @@ void CommonCLI::savePrefs() { _callbacks->savePrefs(); } +const char* CommonCLI::sensorGetCustomVar(const char* key) { + int num = sensors.getNumSettings(); + for (int i = 0; i < num; i++) { + if (strcmp(sensors.getSettingName(i), key) == 0) { + return sensors.getSettingValue(i); + } + } + return NULL; +} + +bool CommonCLI::sensorSetCustomVar(const char* key, const char* value) { + int num = sensors.getNumSettings(); + for (int i = 0; i < num; i++) { + if (strcmp(sensors.getSettingName(i), key) == 0) { + sensors.setSettingValue(key, value); + return true; + } + } + return false; +} + void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, char* reply) { if (memcmp(command, "reboot", 6) == 0) { _board->reboot(); // doesn't return @@ -401,18 +422,60 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch sprintf(reply, "%s (Build: %s)", _callbacks->getFirmwareVer(), _callbacks->getBuildDate()); } else if (memcmp(command, "board", 5) == 0) { sprintf(reply, "%s", _board->getManufacturerName()); + } else if (memcmp(command, "sensor get ", 11) == 0) { + const char* key = command + 11; + const char* val = sensorGetCustomVar(key); + if (val != NULL) { + strcpy(reply, val); + } else { + strcpy(reply, "can't find custom var"); + } + } else if (memcmp(command, "sensor set ", 11) == 0) { + const char* args = &command[11]; + const char* value = strchr(args,' ') + 1; + char key [value-args+1]; + strncpy(key, args, value-args-1); + if (sensorSetCustomVar(key, value)) { + strcpy(reply, "ok"); + } else { + strcpy(reply, "can't find custom var"); + } #if ENV_INCLUDE_GPS == 1 } else if (memcmp(command, "gps on", 6) == 0) { - _callbacks->gpsStart(); - strcpy(reply, "ok"); + if (sensorSetCustomVar("gps", "1")) { + strcpy(reply, "ok"); + } else { + strcpy(reply, "gps toggle not found"); + } } else if (memcmp(command, "gps off", 7) == 0) { - _callbacks->gpsStop(); - strcpy(reply, "ok"); + if (sensorSetCustomVar("gps", "0")) { + strcpy(reply, "ok"); + } else { + strcpy(reply, "gps toggle not found"); + } } else if (memcmp(command, "gps sync", 8) == 0) { - _callbacks->gpsSyncTime(); - strcpy(reply, "Waiting fix ..."); + LocationProvider * l = sensors.getLocationProvider(); + if (l != NULL) { + l->syncTime(); + } } else if (memcmp(command, "gps", 3) == 0) { - _callbacks->gpsGetStatus(reply); + LocationProvider * l = sensors.getLocationProvider(); + if (l != NULL) { + bool enabled = l->isEnabled(); // is EN pin on ? + bool fix = l->isValid(); // has fix ? + int sats = l->satellitesCount(); + bool active = !strcmp(sensorGetCustomVar("gps"), "1"); + if (enabled) { + sprintf(reply, "on, %s, %s, %d sats", + active?"active":"deactivated", + fix?"fix":"no fix", + sats); + } else { + strcpy(reply, "off"); + } + } else { + strcpy(reply, "Can't find GPS"); + } #endif } else if (memcmp(command, "log start", 9) == 0) { _callbacks->setLoggingOn(true); diff --git a/src/helpers/CommonCLI.h b/src/helpers/CommonCLI.h index 08e5f988..d3e3a19d 100644 --- a/src/helpers/CommonCLI.h +++ b/src/helpers/CommonCLI.h @@ -2,6 +2,7 @@ #include "Mesh.h" #include +#include struct NodePrefs { // persisted to file float airtime_factor; @@ -50,10 +51,6 @@ public: virtual void saveIdentity(const mesh::LocalIdentity& new_id) = 0; virtual void clearStats() = 0; virtual void applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) = 0; - virtual void gpsGetStatus(char * reply) {} - virtual void gpsStart() {} - virtual void gpsStop() {} - virtual void gpsSyncTime() {} }; class CommonCLI { @@ -67,6 +64,9 @@ class CommonCLI { void savePrefs(); void loadPrefsInt(FILESYSTEM* _fs, const char* filename); + const char* sensorGetCustomVar(const char* key); + bool sensorSetCustomVar(const char* key, const char* value); + public: CommonCLI(mesh::MainBoard& board, mesh::RTCClock& rtc, NodePrefs* prefs, CommonCLICallbacks* callbacks) : _board(&board), _rtc(&rtc), _prefs(prefs), _callbacks(callbacks) { } From 341b69e3c949cf5c52d5f51f4668fe52ccfaf7a6 Mon Sep 17 00:00:00 2001 From: Florent de Lamotte Date: Mon, 6 Oct 2025 14:08:16 +0200 Subject: [PATCH 4/9] sensor list command --- src/helpers/CommonCLI.cpp | 27 ++++++++++++++++++- .../sensors/EnvironmentSensorManager.cpp | 25 ++++++++++------- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index ee029ec3..e20de609 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -439,7 +439,32 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch strcpy(reply, "ok"); } else { strcpy(reply, "can't find custom var"); - } + } + } else if (memcmp(command, "sensor list", 11) == 0) { + char* dp = reply; + int start = 0; + int end = sensors.getNumSettings(); + if (strlen(command) > 11) { + start = _atoi(command+12); + } + if (start >= end) { + strcpy(reply, "no custom var"); + } else { + sprintf(dp, "%d vars\n", end); + dp = strchr(dp, 0); + int i; + for (i = start; i < end && (dp-reply < 134); i++) { + sprintf(dp, "%s=%s\n", + sensors.getSettingName(i), + sensors.getSettingValue(i)); + dp = strchr(dp, 0); + } + if (i < end) { + sprintf(dp, "... next:%d", i); + } else { + *(dp-1) = 0; // remove last CR + } + } #if ENV_INCLUDE_GPS == 1 } else if (memcmp(command, "gps on", 6) == 0) { if (sensorSetCustomVar("gps", "1")) { diff --git a/src/helpers/sensors/EnvironmentSensorManager.cpp b/src/helpers/sensors/EnvironmentSensorManager.cpp index 99605ff3..aa51c85a 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.cpp +++ b/src/helpers/sensors/EnvironmentSensorManager.cpp @@ -387,27 +387,34 @@ bool EnvironmentSensorManager::querySensors(uint8_t requester_permissions, Cayen int EnvironmentSensorManager::getNumSettings() const { + int settings = 0; #if ENV_INCLUDE_GPS - return gps_detected ? 1 : 0; // only show GPS setting if GPS is detected - #else - return 0; + if (gps_detected) settings++; // only show GPS setting if GPS is detected #endif + return settings; } const char* EnvironmentSensorManager::getSettingName(int i) const { + int settings = 0; #if ENV_INCLUDE_GPS - return (gps_detected && i == 0) ? "gps" : NULL; - #else - return NULL; + if (gps_detected && i == settings++) { + return "gps"; + } #endif + // convenient way to add params (needed for some tests) +// if (i == settings++) return "param.2"; + return NULL; } const char* EnvironmentSensorManager::getSettingValue(int i) const { + int settings = 0; #if ENV_INCLUDE_GPS - if (gps_detected && i == 0) { - return gps_active ? "1" : "0"; - } + if (gps_detected && i == settings++) { + return gps_active ? "1" : "0"; + } #endif + // convenient way to add params ... +// if (i == settings++) return "2"; return NULL; } From 6ed8e9d5142715b61a22fed6dc8627fb3b3476cc Mon Sep 17 00:00:00 2001 From: Florent de Lamotte Date: Mon, 6 Oct 2025 15:12:03 +0200 Subject: [PATCH 5/9] gps_cli: gps state is now saved and restored upon reboot --- examples/simple_repeater/MyMesh.cpp | 15 ++++++++ examples/simple_repeater/MyMesh.h | 4 +++ src/helpers/CommonCLI.cpp | 53 +++++++++++++---------------- src/helpers/CommonCLI.h | 6 ++-- src/helpers/SensorManager.h | 21 ++++++++++++ 5 files changed, 66 insertions(+), 33 deletions(-) diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index b2b47ac3..1c6c0d77 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -631,7 +631,12 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc _prefs.bridge_pkt_src = 0; // logTx _prefs.bridge_baud = 115200; // baud rate _prefs.bridge_channel = 1; // channel 1 + StrHelper::strncpy(_prefs.bridge_secret, "LVSITANOS", sizeof(_prefs.bridge_secret)); + + // GPS defaults + _prefs.gps_enabled = 0; + _prefs.gps_interval = 0; } void MyMesh::begin(FILESYSTEM *fs) { @@ -653,8 +658,18 @@ void MyMesh::begin(FILESYSTEM *fs) { updateAdvertTimer(); updateFloodAdvertTimer(); + +#if ENV_INCLUDE_GPS == 1 + applyGpsPrefs(); +#endif } +#if ENV_INCLUDE_GPS == 1 +void MyMesh::applyGpsPrefs() { + sensors.setSettingByKey("gps", _prefs.gps_enabled?"1":"0"); +} +#endif + void MyMesh::applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) { set_radio_at = futureMillis(2000); // give CLI reply some time to be sent back, before applying temp radio params pending_freq = freq; diff --git a/examples/simple_repeater/MyMesh.h b/examples/simple_repeater/MyMesh.h index d77b74d8..ca85d1a4 100644 --- a/examples/simple_repeater/MyMesh.h +++ b/examples/simple_repeater/MyMesh.h @@ -159,6 +159,10 @@ public: _cli.savePrefs(_fs); } +#if ENV_INCLUDE_GPS == 1 + void applyGpsPrefs(); +#endif + void applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) override; bool formatFileSystem() override; void sendSelfAdvertisement(int delay_millis) override; diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index e6f8a3a6..2efdd00a 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -62,8 +62,12 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) { file.read((uint8_t *)&_prefs->bridge_delay, sizeof(_prefs->bridge_delay)); // 128 file.read((uint8_t *)&_prefs->bridge_pkt_src, sizeof(_prefs->bridge_pkt_src)); // 130 file.read((uint8_t *)&_prefs->bridge_baud, sizeof(_prefs->bridge_baud)); // 131 - file.read((uint8_t *)&_prefs->bridge_channel, sizeof(_prefs->bridge_channel)); // 132 - file.read((uint8_t *)&_prefs->bridge_secret, sizeof(_prefs->bridge_secret)); // 133 + file.read((uint8_t *)&_prefs->bridge_channel, sizeof(_prefs->bridge_channel)); // 135 + file.read((uint8_t *)&_prefs->bridge_secret, sizeof(_prefs->bridge_secret)); // 136 + file.read(pad, 4); // 152 + file.read((uint8_t *)&_prefs->gps_enabled, sizeof(_prefs->gps_enabled)); // 156 + file.read((uint8_t *)&_prefs->gps_interval, sizeof(_prefs->gps_interval)); // 157 + // 161 // sanitise bad pref values _prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f); @@ -84,6 +88,8 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) { _prefs->bridge_baud = constrain(_prefs->bridge_baud, 9600, 115200); _prefs->bridge_channel = constrain(_prefs->bridge_channel, 0, 14); + _prefs->gps_enabled = constrain(_prefs->gps_enabled, 0, 1); + file.close(); } } @@ -131,8 +137,12 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) { file.write((uint8_t *)&_prefs->bridge_delay, sizeof(_prefs->bridge_delay)); // 128 file.write((uint8_t *)&_prefs->bridge_pkt_src, sizeof(_prefs->bridge_pkt_src)); // 130 file.write((uint8_t *)&_prefs->bridge_baud, sizeof(_prefs->bridge_baud)); // 131 - file.write((uint8_t *)&_prefs->bridge_channel, sizeof(_prefs->bridge_channel)); // 132 - file.write((uint8_t *)&_prefs->bridge_secret, sizeof(_prefs->bridge_secret)); // 133 + file.write((uint8_t *)&_prefs->bridge_channel, sizeof(_prefs->bridge_channel)); // 135 + file.write((uint8_t *)&_prefs->bridge_secret, sizeof(_prefs->bridge_secret)); // 136 + file.write(pad, 4); // 152 + file.write((uint8_t *)&_prefs->gps_enabled, sizeof(_prefs->gps_enabled)); // 156 + file.write((uint8_t *)&_prefs->gps_interval, sizeof(_prefs->gps_interval)); // 157 + // 161 file.close(); } @@ -147,27 +157,6 @@ void CommonCLI::savePrefs() { _callbacks->savePrefs(); } -const char* CommonCLI::sensorGetCustomVar(const char* key) { - int num = sensors.getNumSettings(); - for (int i = 0; i < num; i++) { - if (strcmp(sensors.getSettingName(i), key) == 0) { - return sensors.getSettingValue(i); - } - } - return NULL; -} - -bool CommonCLI::sensorSetCustomVar(const char* key, const char* value) { - int num = sensors.getNumSettings(); - for (int i = 0; i < num; i++) { - if (strcmp(sensors.getSettingName(i), key) == 0) { - sensors.setSettingValue(key, value); - return true; - } - } - return false; -} - void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, char* reply) { if (memcmp(command, "reboot", 6) == 0) { _board->reboot(); // doesn't return @@ -527,7 +516,7 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch sprintf(reply, "%s", _board->getManufacturerName()); } else if (memcmp(command, "sensor get ", 11) == 0) { const char* key = command + 11; - const char* val = sensorGetCustomVar(key); + const char* val = sensors.getSettingByKey(key); if (val != NULL) { strcpy(reply, val); } else { @@ -538,7 +527,7 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch const char* value = strchr(args,' ') + 1; char key [value-args+1]; strncpy(key, args, value-args-1); - if (sensorSetCustomVar(key, value)) { + if (sensors.setSettingByKey(key, value)) { strcpy(reply, "ok"); } else { strcpy(reply, "can't find custom var"); @@ -570,13 +559,17 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch } #if ENV_INCLUDE_GPS == 1 } else if (memcmp(command, "gps on", 6) == 0) { - if (sensorSetCustomVar("gps", "1")) { + if (sensors.setSettingByKey("gps", "1")) { + _prefs->gps_enabled = 1; + savePrefs(); strcpy(reply, "ok"); } else { strcpy(reply, "gps toggle not found"); } } else if (memcmp(command, "gps off", 7) == 0) { - if (sensorSetCustomVar("gps", "0")) { + if (sensors.setSettingByKey("gps", "0")) { + _prefs->gps_enabled = 0; + savePrefs(); strcpy(reply, "ok"); } else { strcpy(reply, "gps toggle not found"); @@ -592,7 +585,7 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch bool enabled = l->isEnabled(); // is EN pin on ? bool fix = l->isValid(); // has fix ? int sats = l->satellitesCount(); - bool active = !strcmp(sensorGetCustomVar("gps"), "1"); + bool active = !strcmp(sensors.getSettingByKey("gps"), "1"); if (enabled) { sprintf(reply, "on, %s, %s, %d sats", active?"active":"deactivated", diff --git a/src/helpers/CommonCLI.h b/src/helpers/CommonCLI.h index 14e249de..07523643 100644 --- a/src/helpers/CommonCLI.h +++ b/src/helpers/CommonCLI.h @@ -38,6 +38,9 @@ struct NodePrefs { // persisted to file uint32_t bridge_baud; // 9600, 19200, 38400, 57600, 115200 (default 115200) uint8_t bridge_channel; // 1-14 (ESP-NOW only) char bridge_secret[16]; // for XOR encryption of bridge packets (ESP-NOW only) + // Gps settings + uint8_t gps_enabled; + uint32_t gps_interval; // in seconds }; class CommonCLICallbacks { @@ -83,9 +86,6 @@ class CommonCLI { void savePrefs(); void loadPrefsInt(FILESYSTEM* _fs, const char* filename); - const char* sensorGetCustomVar(const char* key); - bool sensorSetCustomVar(const char* key, const char* value); - public: CommonCLI(mesh::MainBoard& board, mesh::RTCClock& rtc, NodePrefs* prefs, CommonCLICallbacks* callbacks) : _board(&board), _rtc(&rtc), _prefs(prefs), _callbacks(callbacks) { } diff --git a/src/helpers/SensorManager.h b/src/helpers/SensorManager.h index 1ace6220..38c1d806 100644 --- a/src/helpers/SensorManager.h +++ b/src/helpers/SensorManager.h @@ -23,4 +23,25 @@ public: virtual const char* getSettingValue(int i) const { return NULL; } virtual bool setSettingValue(const char* name, const char* value) { return false; } virtual LocationProvider* getLocationProvider() { return NULL; } + + // Helper functions to manage setting by keys (useful in many places ...) + const char* getSettingByKey(const char* key) { + int num = getNumSettings(); + for (int i = 0; i < num; i++) { + if (strcmp(getSettingName(i), key) == 0) { + return getSettingValue(i); + } + } + return NULL; + } + + bool setSettingByKey(const char* key, const char* value) { + int num = getNumSettings(); + for (int i = 0; i < num; i++) { + if (strcmp(getSettingName(i), key) == 0) { + return setSettingValue(key, value); + } + } + return false; + } }; From 9e3c2fc9d9f75cdcda0106529d5cae51eecfab5c Mon Sep 17 00:00:00 2001 From: Florent de Lamotte Date: Mon, 6 Oct 2025 15:30:18 +0200 Subject: [PATCH 6/9] gps_cli: gps also restored on sensors and rooms --- examples/simple_repeater/MyMesh.cpp | 6 ------ examples/simple_repeater/MyMesh.h | 10 ++++++---- examples/simple_room_server/MyMesh.cpp | 4 ++++ examples/simple_room_server/MyMesh.h | 6 ++++++ examples/simple_sensor/SensorMesh.cpp | 4 ++++ examples/simple_sensor/SensorMesh.h | 5 +++++ 6 files changed, 25 insertions(+), 10 deletions(-) diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index 1c6c0d77..f7153da3 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -664,12 +664,6 @@ void MyMesh::begin(FILESYSTEM *fs) { #endif } -#if ENV_INCLUDE_GPS == 1 -void MyMesh::applyGpsPrefs() { - sensors.setSettingByKey("gps", _prefs.gps_enabled?"1":"0"); -} -#endif - void MyMesh::applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) { set_radio_at = futureMillis(2000); // give CLI reply some time to be sent back, before applying temp radio params pending_freq = freq; diff --git a/examples/simple_repeater/MyMesh.h b/examples/simple_repeater/MyMesh.h index ca85d1a4..c45c141d 100644 --- a/examples/simple_repeater/MyMesh.h +++ b/examples/simple_repeater/MyMesh.h @@ -135,6 +135,12 @@ protected: return _prefs.multi_acks; } +#if ENV_INCLUDE_GPS == 1 + void applyGpsPrefs() { + sensors.setSettingByKey("gps", _prefs.gps_enabled?"1":"0"); + } +#endif + void onAnonDataRecv(mesh::Packet* packet, const uint8_t* secret, const mesh::Identity& sender, uint8_t* data, size_t len) override; int searchPeersByHash(const uint8_t* hash) override; void getPeerSharedSecret(uint8_t* dest_secret, int peer_idx) override; @@ -159,10 +165,6 @@ public: _cli.savePrefs(_fs); } -#if ENV_INCLUDE_GPS == 1 - void applyGpsPrefs(); -#endif - void applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) override; bool formatFileSystem() override; void sendSelfAdvertisement(int delay_millis) override; diff --git a/examples/simple_room_server/MyMesh.cpp b/examples/simple_room_server/MyMesh.cpp index 89f2afb3..d9a36397 100644 --- a/examples/simple_room_server/MyMesh.cpp +++ b/examples/simple_room_server/MyMesh.cpp @@ -632,6 +632,10 @@ void MyMesh::begin(FILESYSTEM *fs) { updateAdvertTimer(); updateFloodAdvertTimer(); + +#if ENV_INCLUDE_GPS == 1 + applyGpsPrefs(); +#endif } void MyMesh::applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) { diff --git a/examples/simple_room_server/MyMesh.h b/examples/simple_room_server/MyMesh.h index b2df60c3..60ef1e73 100644 --- a/examples/simple_room_server/MyMesh.h +++ b/examples/simple_room_server/MyMesh.h @@ -149,6 +149,12 @@ protected: bool onPeerPathRecv(mesh::Packet* packet, int sender_idx, const uint8_t* secret, uint8_t* path, uint8_t path_len, uint8_t extra_type, uint8_t* extra, uint8_t extra_len) override; void onAckRecv(mesh::Packet* packet, uint32_t ack_crc) override; +#if ENV_INCLUDE_GPS == 1 + void applyGpsPrefs() { + sensors.setSettingByKey("gps", _prefs.gps_enabled?"1":"0"); + } +#endif + public: MyMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables); diff --git a/examples/simple_sensor/SensorMesh.cpp b/examples/simple_sensor/SensorMesh.cpp index ba41ca45..00da006a 100644 --- a/examples/simple_sensor/SensorMesh.cpp +++ b/examples/simple_sensor/SensorMesh.cpp @@ -697,6 +697,10 @@ void SensorMesh::begin(FILESYSTEM* fs) { updateAdvertTimer(); updateFloodAdvertTimer(); + +#if ENV_INCLUDE_GPS == 1 + applyGpsPrefs(); +#endif } bool SensorMesh::formatFileSystem() { diff --git a/examples/simple_sensor/SensorMesh.h b/examples/simple_sensor/SensorMesh.h index d26bcb14..cdc3940c 100644 --- a/examples/simple_sensor/SensorMesh.h +++ b/examples/simple_sensor/SensorMesh.h @@ -149,4 +149,9 @@ private: void sendAlert(const ClientInfo* c, Trigger* t); + #if ENV_INCLUDE_GPS == 1 + void applyGpsPrefs() { + sensors.setSettingByKey("gps", _prefs.gps_enabled?"1":"0"); + } +#endif }; From 76dcfbb23a50cd026a78a9719f54bd0bba81dc39 Mon Sep 17 00:00:00 2001 From: Florent Date: Sat, 11 Oct 2025 15:29:17 +0200 Subject: [PATCH 7/9] gpsCli: use parseTextParts --- src/helpers/CommonCLI.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index 2efdd00a..6616a056 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -518,15 +518,16 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch const char* key = command + 11; const char* val = sensors.getSettingByKey(key); if (val != NULL) { - strcpy(reply, val); + sprintf(reply, "> %s", val); } else { - strcpy(reply, "can't find custom var"); + strcpy(reply, "null"); } } else if (memcmp(command, "sensor set ", 11) == 0) { - const char* args = &command[11]; - const char* value = strchr(args,' ') + 1; - char key [value-args+1]; - strncpy(key, args, value-args-1); + strcpy(tmp, &command[11]); + const char *parts[2]; + int num = mesh::Utils::parseTextParts(tmp, parts, 2, ' '); + const char *key = (num > 0) ? parts[0] : ""; + const char *value = (num > 1) ? parts[1] : "null"; if (sensors.setSettingByKey(key, value)) { strcpy(reply, "ok"); } else { From f6064b41e9cdd5faac3a080d028640062b1aaa43 Mon Sep 17 00:00:00 2001 From: Florent Date: Sat, 11 Oct 2025 18:00:57 +0200 Subject: [PATCH 8/9] gps_cli: set node location based on gps --- src/helpers/CommonCLI.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index 6616a056..cc63cfeb 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -580,6 +580,11 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch if (l != NULL) { l->syncTime(); } + } else if (memcmp(command, "gps setloc", 10) == 0) { + _prefs->node_lat = sensors.node_lat; + _prefs->node_lon = sensors.node_lon; + savePrefs(); + strcpy(reply, "ok"); } else if (memcmp(command, "gps", 3) == 0) { LocationProvider * l = sensors.getLocationProvider(); if (l != NULL) { From bf1da43d7dd6395badfe81f57e29f0403e5bcb27 Mon Sep 17 00:00:00 2001 From: Florent Date: Sat, 11 Oct 2025 19:00:02 +0200 Subject: [PATCH 9/9] gps_cli: gps advert to control advert location policy --- examples/simple_repeater/MyMesh.cpp | 12 ++++++-- examples/simple_room_server/MyMesh.cpp | 12 ++++++-- examples/simple_sensor/SensorMesh.cpp | 12 ++++++-- src/helpers/CommonCLI.cpp | 39 ++++++++++++++++++++++++-- src/helpers/CommonCLI.h | 5 ++++ 5 files changed, 72 insertions(+), 8 deletions(-) diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index f7153da3..de8072f1 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -289,8 +289,16 @@ mesh::Packet *MyMesh::createSelfAdvert() { uint8_t app_data[MAX_ADVERT_DATA_SIZE]; uint8_t app_data_len; { - AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name, _prefs.node_lat, _prefs.node_lon); - app_data_len = builder.encodeTo(app_data); + if (_prefs.advert_loc_policy == ADVERT_LOC_NONE) { + AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name); + app_data_len = builder.encodeTo(app_data); + } else if (_prefs.advert_loc_policy == ADVERT_LOC_SHARE) { + AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name, sensors.node_lat, sensors.node_lon); + app_data_len = builder.encodeTo(app_data); + } else { + AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name, _prefs.node_lat, _prefs.node_lon); + app_data_len = builder.encodeTo(app_data); + } } return createAdvert(self_id, app_data, app_data_len); diff --git a/examples/simple_room_server/MyMesh.cpp b/examples/simple_room_server/MyMesh.cpp index d9a36397..00736820 100644 --- a/examples/simple_room_server/MyMesh.cpp +++ b/examples/simple_room_server/MyMesh.cpp @@ -116,8 +116,16 @@ mesh::Packet *MyMesh::createSelfAdvert() { uint8_t app_data[MAX_ADVERT_DATA_SIZE]; uint8_t app_data_len; { - AdvertDataBuilder builder(ADV_TYPE_ROOM, _prefs.node_name, _prefs.node_lat, _prefs.node_lon); - app_data_len = builder.encodeTo(app_data); + if (_prefs.advert_loc_policy == ADVERT_LOC_NONE) { + AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name); + app_data_len = builder.encodeTo(app_data); + } else if (_prefs.advert_loc_policy == ADVERT_LOC_SHARE) { + AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name, sensors.node_lat, sensors.node_lon); + app_data_len = builder.encodeTo(app_data); + } else { + AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name, _prefs.node_lat, _prefs.node_lon); + app_data_len = builder.encodeTo(app_data); + } } return createAdvert(self_id, app_data, app_data_len); diff --git a/examples/simple_sensor/SensorMesh.cpp b/examples/simple_sensor/SensorMesh.cpp index 00da006a..97d95d5f 100644 --- a/examples/simple_sensor/SensorMesh.cpp +++ b/examples/simple_sensor/SensorMesh.cpp @@ -241,8 +241,16 @@ mesh::Packet* SensorMesh::createSelfAdvert() { uint8_t app_data[MAX_ADVERT_DATA_SIZE]; uint8_t app_data_len; { - AdvertDataBuilder builder(ADV_TYPE_SENSOR, _prefs.node_name, _prefs.node_lat, _prefs.node_lon); - app_data_len = builder.encodeTo(app_data); + if (_prefs.advert_loc_policy == ADVERT_LOC_NONE) { + AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name); + app_data_len = builder.encodeTo(app_data); + } else if (_prefs.advert_loc_policy == ADVERT_LOC_SHARE) { + AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name, sensors.node_lat, sensors.node_lon); + app_data_len = builder.encodeTo(app_data); + } else { + AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name, _prefs.node_lat, _prefs.node_lon); + app_data_len = builder.encodeTo(app_data); + } } return createAdvert(self_id, app_data, app_data_len); diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index cc63cfeb..757180f8 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -67,7 +67,10 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) { file.read(pad, 4); // 152 file.read((uint8_t *)&_prefs->gps_enabled, sizeof(_prefs->gps_enabled)); // 156 file.read((uint8_t *)&_prefs->gps_interval, sizeof(_prefs->gps_interval)); // 157 - // 161 + if (file.read((uint8_t *)&_prefs->advert_loc_policy, sizeof (_prefs->advert_loc_policy)) == -1) { + _prefs->advert_loc_policy = ADVERT_LOC_PREFS; // default value + } // 161 + // 162 // sanitise bad pref values _prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f); @@ -89,6 +92,7 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) { _prefs->bridge_channel = constrain(_prefs->bridge_channel, 0, 14); _prefs->gps_enabled = constrain(_prefs->gps_enabled, 0, 1); + _prefs->advert_loc_policy = constrain(_prefs->advert_loc_policy, 0, 2); file.close(); } @@ -142,7 +146,8 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) { file.write(pad, 4); // 152 file.write((uint8_t *)&_prefs->gps_enabled, sizeof(_prefs->gps_enabled)); // 156 file.write((uint8_t *)&_prefs->gps_interval, sizeof(_prefs->gps_interval)); // 157 - // 161 + file.write((uint8_t *)&_prefs->advert_loc_policy, sizeof(_prefs->advert_loc_policy)); // 161 + // 162 file.close(); } @@ -585,6 +590,36 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch _prefs->node_lon = sensors.node_lon; savePrefs(); strcpy(reply, "ok"); + } else if (memcmp(command, "gps advert", 10) == 0) { + if (strlen(command) == 10) { + switch (_prefs->advert_loc_policy) { + case ADVERT_LOC_NONE: + strcpy(reply, "> none"); + break; + case ADVERT_LOC_PREFS: + strcpy(reply, "> prefs"); + break; + case ADVERT_LOC_SHARE: + strcpy(reply, "> share"); + break; + default: + strcpy(reply, "error"); + } + } else if (memcmp(command+11, "none", 4) == 0) { + _prefs->advert_loc_policy = ADVERT_LOC_NONE; + savePrefs(); + strcpy(reply, "ok"); + } else if (memcmp(command+11, "share", 5) == 0) { + _prefs->advert_loc_policy = ADVERT_LOC_SHARE; + savePrefs(); + strcpy(reply, "ok"); + } else if (memcmp(command+11, "prefs", 4) == 0) { + _prefs->advert_loc_policy = ADVERT_LOC_PREFS; + savePrefs(); + strcpy(reply, "ok"); + } else { + strcpy(reply, "error"); + } } else if (memcmp(command, "gps", 3) == 0) { LocationProvider * l = sensors.getLocationProvider(); if (l != NULL) { diff --git a/src/helpers/CommonCLI.h b/src/helpers/CommonCLI.h index 07523643..68489913 100644 --- a/src/helpers/CommonCLI.h +++ b/src/helpers/CommonCLI.h @@ -8,6 +8,10 @@ #define WITH_BRIDGE #endif +#define ADVERT_LOC_NONE 0 +#define ADVERT_LOC_SHARE 1 +#define ADVERT_LOC_PREFS 2 + struct NodePrefs { // persisted to file float airtime_factor; char node_name[32]; @@ -41,6 +45,7 @@ struct NodePrefs { // persisted to file // Gps settings uint8_t gps_enabled; uint32_t gps_interval; // in seconds + uint8_t advert_loc_policy; }; class CommonCLICallbacks {