From 3501f620a30adb245b9bc00ff4b99b7c39f1bfcc Mon Sep 17 00:00:00 2001 From: Carlos Valdes Date: Sun, 21 Jun 2026 15:17:09 +0200 Subject: [PATCH] fix: restore fixed position into localPosition on boot (#10670) * NodeDB: restore fixed position into localPosition at boot Fixed-position nodes without a GPS stop broadcasting their position (and publishing MQTT map reports) after a reboot. On boot localPosition is empty, and NodeDB::hasValidPosition() for the local node only inspects localPosition, not the persisted node position. PositionModule therefore never sends a position, so the lazy localPosition backfill in getPositionPacket() never runs and localPosition stays at (0,0) indefinitely. Restore the configured fixed position into localPosition during NodeDB construction so position broadcasts and map reports resume automatically after a reboot. * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Ben Meadors Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/mesh/NodeDB.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index 27c498e97..802621f70 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -590,6 +590,16 @@ NodeDB::NodeDB() moduleConfig.mqtt.map_report_settings.publish_interval_secs = default_map_publish_interval_secs; } + // If a fixed position is configured, restore the persisted position into localPosition at boot. + // This keeps position broadcasts / MQTT map reports working after reboot on GPS-less nodes. + if (config.position.fixed_position) { + meshtastic_PositionLite fixedPos; + if (copyNodePosition(getNodeNum(), fixedPos) && (fixedPos.latitude_i != 0 || fixedPos.longitude_i != 0)) { + setLocalPosition(TypeConversions::ConvertToPosition(fixedPos)); + LOG_INFO("Restored fixed position to localPosition: lat=%d lon=%d", fixedPos.latitude_i, fixedPos.longitude_i); + } + } + // Ensure that the neighbor info update interval is coerced to the minimum moduleConfig.neighbor_info.update_interval = Default::getConfiguredOrMinimumValue(moduleConfig.neighbor_info.update_interval, min_neighbor_info_broadcast_secs);