diff --git a/docs/custom-cli.md b/docs/custom-cli.md index 18df9bf4..c7237756 100644 --- a/docs/custom-cli.md +++ b/docs/custom-cli.md @@ -86,8 +86,6 @@ Legacy dotted aliases are also accepted: ### Board Battery Reporting -- `get battery.reporting`: shows whether board battery reporting is enabled. Support is board-dependent. -- `set battery.reporting on|off`: enables or disables battery voltage reporting on supported boards. This is currently useful for Heltec V3 boards where USB-only power can produce misleading battery readings. If your board needs this too, open an issue and support can be added board-by-board. - On repeater MQTT builds, background battery sampling used for MQTT/status history is rate-limited to about once per minute. Explicit status and telemetry requests still refresh the reading immediately. ### T-Beam 1W Fan Control diff --git a/docs/web-panel.md b/docs/web-panel.md index f1268be6..215ca16c 100644 --- a/docs/web-panel.md +++ b/docs/web-panel.md @@ -165,6 +165,30 @@ Notes: - the refresh buttons load the current value from the repeater - the save buttons send the matching CLI command immediately +## Ghost Node Mode + +Ghost Node Mode is a convenience control on `/app` for a repeater that should stay on Wi-Fi and MQTT, but should not actively behave like another nearby repeater. + +Typical use case: + +- an indoor or colocated MQTT observer where another repeater nearby is already doing the RF relay work +- a node you want feeding MQTT, web status, and troubleshooting data without also adding extra repeat traffic or adverts + +When enabled, Ghost Node Mode: + +- turns `repeat` off +- sets `advert.interval` to `0` +- sets `flood.advert.interval` to `0` +- leaves the local web panel and MQTT features running + +When disabled, the panel restores the prior repeat and advert settings if it still knows them from the current browser session. If not, it falls back to: + +- `repeat on` +- `advert.interval 60` +- `flood.advert.interval 12` + +This mode is useful when you want the device to observe and publish, not to act as an additional RF repeater. It does not create a separate firmware role; it is just a grouped web-panel shortcut for those existing settings. + ## MQTT Settings This section includes: diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index 585d9177..465981f2 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -1240,7 +1240,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc _prefs.advert_loc_policy = ADVERT_LOC_PREFS; _prefs.adc_multiplier = 0.0f; // 0.0f means use default board multiplier - _prefs.battery_reporting_enabled = 1; + _prefs.reserved_290 = 0; _prefs.fan_mode = 0; // auto _prefs.fan_timeout_secs = 30; @@ -1347,7 +1347,6 @@ void MyMesh::begin(FILESYSTEM *fs, ArchiveStorage* archive) { updateFloodAdvertTimer(); board.setAdcMultiplier(_prefs.adc_multiplier); - board.setBatteryReporting(_prefs.battery_reporting_enabled); #if defined(TBEAM_1W) auto& tbeam1w_board = static_cast(board); tbeam1w_board.setFanPostTxHoldMs(static_cast(_prefs.fan_timeout_secs) * 1000UL); @@ -1375,13 +1374,6 @@ void MyMesh::sendFloodScoped(const TransportKey& scope, mesh::Packet* pkt, uint3 uint16_t MyMesh::getBatteryMilliVolts(bool force_refresh) { constexpr unsigned long kBatterySampleIntervalMs = 60000UL; - if (board.supportsBatteryReporting() && !board.isBatteryReportingEnabled()) { - _battery_sample_valid = true; - _battery_mv_cache = 0; - next_battery_sample_ms = 0; - return 0; - } - if (force_refresh || !_battery_sample_valid || next_battery_sample_ms == 0 || millisHasNowPassed(next_battery_sample_ms)) { _battery_mv_cache = board.getBattMilliVolts(); _battery_sample_valid = true; diff --git a/examples/simple_room_server/MyMesh.cpp b/examples/simple_room_server/MyMesh.cpp index 193de845..88cc5570 100644 --- a/examples/simple_room_server/MyMesh.cpp +++ b/examples/simple_room_server/MyMesh.cpp @@ -652,8 +652,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc _prefs.gps_enabled = 0; _prefs.gps_interval = 0; _prefs.advert_loc_policy = ADVERT_LOC_PREFS; - _prefs.battery_reporting_enabled = 1; - + _prefs.reserved_290 = 0; next_post_idx = 0; next_client_idx = 0; next_push = 0; @@ -699,7 +698,6 @@ void MyMesh::begin(FILESYSTEM *fs) { updateFloodAdvertTimer(); board.setAdcMultiplier(_prefs.adc_multiplier); - board.setBatteryReporting(_prefs.battery_reporting_enabled); #if ENV_INCLUDE_GPS == 1 applyGpsPrefs(); diff --git a/examples/simple_sensor/SensorMesh.cpp b/examples/simple_sensor/SensorMesh.cpp index dd72cc95..cbd974e8 100644 --- a/examples/simple_sensor/SensorMesh.cpp +++ b/examples/simple_sensor/SensorMesh.cpp @@ -731,7 +731,7 @@ SensorMesh::SensorMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::Millise _prefs.gps_enabled = 0; _prefs.gps_interval = 0; _prefs.advert_loc_policy = ADVERT_LOC_PREFS; - _prefs.battery_reporting_enabled = 1; + _prefs.reserved_290 = 0; memset(default_scope.key, 0, sizeof(default_scope.key)); } @@ -771,7 +771,6 @@ void SensorMesh::begin(FILESYSTEM* fs) { updateFloodAdvertTimer(); board.setAdcMultiplier(_prefs.adc_multiplier); - board.setBatteryReporting(_prefs.battery_reporting_enabled); #if ENV_INCLUDE_GPS == 1 applyGpsPrefs(); diff --git a/release-notes.yml b/release-notes.yml index 7b7d762b..7ce3af72 100644 --- a/release-notes.yml +++ b/release-notes.yml @@ -418,6 +418,9 @@ releases: - type: fixed area: board-support text: "Reduced Heltec V3 battery-sense activity while MQTT and web features are active, while still keeping explicit status and telemetry requests on a fresh reading path." + - type: changed + area: board-support + text: "Removed the obsolete battery reporting toggle path and its stale CLI documentation now that repeater battery sampling is handled correctly without a board-level reporting disable switch." - type: docs area: docs text: "Updated the custom CLI docs to note that repeater MQTT background battery sampling is now rate-limited while explicit status and telemetry requests still refresh immediately." diff --git a/src/MeshCore.h b/src/MeshCore.h index 30bfa23d..3ab58b28 100644 --- a/src/MeshCore.h +++ b/src/MeshCore.h @@ -44,9 +44,6 @@ namespace mesh { class MainBoard { public: virtual uint16_t getBattMilliVolts() = 0; - virtual bool supportsBatteryReporting() const { return false; } - virtual bool setBatteryReporting(bool enabled) { (void)enabled; return false; } - virtual bool isBatteryReportingEnabled() const { return true; } virtual int getBatteryPercent() { return -1; } virtual bool isCharging() { return false; } virtual bool isVbusPresent() { return false; } diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index 9e2306e1..e7b8a5a0 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -87,8 +87,8 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) { file.read((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162 file.read((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166 file.read((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170 - if (file.available() >= (int)sizeof(_prefs->battery_reporting_enabled)) { - file.read((uint8_t *)&_prefs->battery_reporting_enabled, sizeof(_prefs->battery_reporting_enabled)); // 290 + if (file.available() >= (int)sizeof(_prefs->reserved_290)) { + file.read((uint8_t *)&_prefs->reserved_290, sizeof(_prefs->reserved_290)); // 290 reserved } if (file.available() >= (int)sizeof(_prefs->rx_boosted_gain)) { file.read((uint8_t *)&_prefs->rx_boosted_gain, sizeof(_prefs->rx_boosted_gain)); // 291 @@ -123,7 +123,6 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) { _prefs->bridge_channel = constrain(_prefs->bridge_channel, 0, 14); _prefs->powersaving_enabled = constrain(_prefs->powersaving_enabled, 0, 1); - _prefs->battery_reporting_enabled = constrain(_prefs->battery_reporting_enabled, 0, 1); _prefs->gps_enabled = constrain(_prefs->gps_enabled, 0, 1); _prefs->advert_loc_policy = constrain(_prefs->advert_loc_policy, 0, 2); @@ -192,7 +191,7 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) { file.write((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162 file.write((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166 file.write((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170 - file.write((uint8_t *)&_prefs->battery_reporting_enabled, sizeof(_prefs->battery_reporting_enabled)); // 290 + file.write((uint8_t *)&_prefs->reserved_290, sizeof(_prefs->reserved_290)); // 290 reserved file.write((uint8_t *)&_prefs->rx_boosted_gain, sizeof(_prefs->rx_boosted_gain)); // 291 file.write((uint8_t *)&_prefs->fan_mode, sizeof(_prefs->fan_mode)); // 292 file.write((uint8_t *)&_prefs->fan_timeout_secs, sizeof(_prefs->fan_timeout_secs)); // 293 diff --git a/src/helpers/CommonCLI.h b/src/helpers/CommonCLI.h index a3aaf541..dd413420 100644 --- a/src/helpers/CommonCLI.h +++ b/src/helpers/CommonCLI.h @@ -58,7 +58,7 @@ struct NodePrefs { // persisted to file uint32_t discovery_mod_timestamp; float adc_multiplier; char owner_info[120]; - uint8_t battery_reporting_enabled; // boolean + uint8_t reserved_290; // reserved to preserve on-disk prefs layout uint8_t rx_boosted_gain; // power settings uint8_t path_hash_mode; // which path mode to use when sending uint8_t loop_detect; diff --git a/variants/heltec_v3/HeltecV3Board.h b/variants/heltec_v3/HeltecV3Board.h index 7c64acad..3a6a39e3 100644 --- a/variants/heltec_v3/HeltecV3Board.h +++ b/variants/heltec_v3/HeltecV3Board.h @@ -22,13 +22,11 @@ class HeltecV3Board : public ESP32Board { private: bool adc_active_state; - bool battery_reporting_enabled; public: RefCountedDigitalPin periph_power; HeltecV3Board() : adc_active_state(false), - battery_reporting_enabled(true), periph_power(PIN_VEXT_EN) { } void begin() { @@ -83,10 +81,6 @@ public: } uint16_t getBattMilliVolts() override { - if (!battery_reporting_enabled) { - return 0; - } - analogReadResolution(10); digitalWrite(PIN_ADC_CTRL, adc_active_state); @@ -109,19 +103,6 @@ public: return mv; } - bool supportsBatteryReporting() const override { - return true; - } - - bool setBatteryReporting(bool enabled) override { - battery_reporting_enabled = enabled; - return true; - } - - bool isBatteryReportingEnabled() const override { - return battery_reporting_enabled; - } - const char* getManufacturerName() const override { return "Heltec V3"; }