From b7e0445451d2fa6600275ee2038386e84ca7b199 Mon Sep 17 00:00:00 2001 From: mikecarper Date: Tue, 25 Aug 2026 23:47:40 -0700 Subject: [PATCH] fix: default advert location to stored preferences --- docs/cli_commands.md | 4 +++- docs/gps_tracking.md | 4 ++++ examples/simple_repeater/MyMesh.cpp | 2 +- examples/simple_room_server/MyMesh.cpp | 2 +- examples/simple_sensor/SensorMesh.cpp | 2 +- src/helpers/CommonCLI.h | 4 +++- .../test_config_serializer.cpp | 20 +++++++++++++++++++ 7 files changed, 33 insertions(+), 5 deletions(-) diff --git a/docs/cli_commands.md b/docs/cli_commands.md index 7a9027d4..ce8c30e9 100644 --- a/docs/cli_commands.md +++ b/docs/cli_commands.md @@ -3239,7 +3239,9 @@ sleep, this command schedules a sync and wakes it; after `gps off`, it reports - `share`: share gps location (from SensorManager) - `prefs`: location stored in node's lat and lon settings -**Default:** `prefs` +**Default:** `prefs` on every repeater, room-server, and sensor build that uses +the common advert policy. A previously saved `none`, `share`, or `prefs` choice +still overrides the first-boot default after an update. --- diff --git a/docs/gps_tracking.md b/docs/gps_tracking.md index 649d0340..a9e8acad 100644 --- a/docs/gps_tracking.md +++ b/docs/gps_tracking.md @@ -119,6 +119,10 @@ Policies: - `share`: use the live/shared sensor manager location - `prefs`: use the stored node latitude and longitude preferences +`prefs` is the first-boot default for every repeater, room-server, and sensor +build. Firmware updates retain an explicitly saved policy from the existing +preferences filesystem. + Telemetry GPS can be fresh while advert location is fixed or disabled, depending on this policy. diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index 39086051..caf10c20 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -3319,7 +3319,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc // GPS defaults _prefs.gps_enabled = 0; _prefs.gps_interval = 0; - _prefs.advert_loc_policy = ADVERT_LOC_PREFS; + _prefs.advert_loc_policy = DEFAULT_ADVERT_LOC_POLICY; // MQTT/WiFi/timezone/radio_watchdog defaults live in /mqtt_prefs now (see applyMQTTDefaults). diff --git a/examples/simple_room_server/MyMesh.cpp b/examples/simple_room_server/MyMesh.cpp index 23d77e74..809a56d9 100644 --- a/examples/simple_room_server/MyMesh.cpp +++ b/examples/simple_room_server/MyMesh.cpp @@ -1212,7 +1212,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc // GPS defaults _prefs.gps_enabled = 0; _prefs.gps_interval = 0; - _prefs.advert_loc_policy = ADVERT_LOC_PREFS; + _prefs.advert_loc_policy = DEFAULT_ADVERT_LOC_POLICY; #if defined(USE_SX1262) || defined(USE_SX1268) || defined(USE_LR1110) \ || defined(USE_LR2021) || defined(SX126X_RX_BOOSTED_GAIN) \ diff --git a/examples/simple_sensor/SensorMesh.cpp b/examples/simple_sensor/SensorMesh.cpp index 56880994..e27a112c 100644 --- a/examples/simple_sensor/SensorMesh.cpp +++ b/examples/simple_sensor/SensorMesh.cpp @@ -953,7 +953,7 @@ SensorMesh::SensorMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::Millise // GPS defaults _prefs.gps_enabled = 0; _prefs.gps_interval = 0; - _prefs.advert_loc_policy = ADVERT_LOC_PREFS; + _prefs.advert_loc_policy = DEFAULT_ADVERT_LOC_POLICY; _prefs.radio_fem_rxgain = 1; _prefs.radio_fem_txgain = 0; diff --git a/src/helpers/CommonCLI.h b/src/helpers/CommonCLI.h index 7a7cd61c..22aba42c 100644 --- a/src/helpers/CommonCLI.h +++ b/src/helpers/CommonCLI.h @@ -29,6 +29,8 @@ #define ADVERT_LOC_SHARE 1 #define ADVERT_LOC_PREFS 2 +static constexpr uint8_t DEFAULT_ADVERT_LOC_POLICY = ADVERT_LOC_PREFS; + #define LOOP_DETECT_OFF 0 #define LOOP_DETECT_MINIMAL 1 #define LOOP_DETECT_MODERATE 2 @@ -149,7 +151,7 @@ public: // Gps settings uint8_t gps_enabled = 0; uint32_t gps_interval = 0; // seconds; 0 uses the 1-second default - uint8_t advert_loc_policy = 0; + uint8_t advert_loc_policy = DEFAULT_ADVERT_LOC_POLICY; uint32_t discovery_mod_timestamp = 0; float adc_multiplier = 0; char owner_info[120] = {}; diff --git a/test/test_config_serializer/test_config_serializer.cpp b/test/test_config_serializer/test_config_serializer.cpp index 03a17a32..a8c2cbee 100644 --- a/test/test_config_serializer/test_config_serializer.cpp +++ b/test/test_config_serializer/test_config_serializer.cpp @@ -192,6 +192,26 @@ TEST(ConfigSerializer, LoadSerial_IgnoreUnknowns) { EXPECT_TRUE(match); } +TEST(NodePrefs, AdvertLocationDefaultsToStoredPrefs) { + NodePrefs prefs; + EXPECT_EQ(ADVERT_LOC_PREFS, prefs.advert_loc_policy); + EXPECT_EQ(ADVERT_LOC_PREFS, DEFAULT_ADVERT_LOC_POLICY); + + // An explicit privacy choice remains persistent and is not replaced by + // the first-boot default when preferences are loaded. + prefs.advert_loc_policy = ADVERT_LOC_NONE; + MockPrintStream output; + ASSERT_TRUE(prefs.saveSerial(output)); + + std::string serialised(reinterpret_cast(output.getBytes()), + output.getLength()); + MockInputStream input(serialised.c_str()); + NodePrefs loaded; + ASSERT_EQ(ADVERT_LOC_PREFS, loaded.advert_loc_policy); + ASSERT_TRUE(loaded.loadSerial(input)); + EXPECT_EQ(ADVERT_LOC_NONE, loaded.advert_loc_policy); +} + TEST(NodePrefs, FemGainSettingsRoundTrip) { NodePrefs saved; saved.radio_fem_rxgain = 0;