From 6085a4f00373ff0f7a820280f0d5fc475c497114 Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Fri, 3 Jul 2026 16:57:15 -0700 Subject: [PATCH] fix(nrf52): keep BLE active during reset cleanup (#10873) --- src/graphics/draw/MenuHandler.cpp | 3 ++- src/modules/AdminModule.cpp | 7 ++++--- src/modules/SystemCommandsModule.cpp | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 4453c02ee..23e0c7b5f 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -1696,16 +1696,17 @@ void menuHandler::resetNodeDBMenu() bannerOptions.optionsCount = 3; bannerOptions.bannerCallback = [](int selected) -> void { if (selected == 1 || selected == 2) { - disableBluetooth(); screen->setFrames(Screen::FOCUS_DEFAULT); } if (selected == 1) { LOG_INFO("Initiate node-db reset"); nodeDB->resetNodes(); + disableBluetooth(); rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); } else if (selected == 2) { LOG_INFO("Initiate node-db reset but keeping favorites"); nodeDB->resetNodes(1); + disableBluetooth(); rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); } else if (selected == 0) { menuQueue = NodeBaseMenu; diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp index 261944845..7c7e12907 100644 --- a/src/modules/AdminModule.cpp +++ b/src/modules/AdminModule.cpp @@ -418,22 +418,22 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta break; } case meshtastic_AdminMessage_factory_reset_config_tag: { - disableBluetooth(); LOG_INFO("Initiate factory config reset"); + // Keep BLE active while reset cleanup performs nRF flash operations. nodeDB->factoryReset(); LOG_INFO("Factory config reset finished, rebooting soon"); + disableBluetooth(); reboot(DEFAULT_REBOOT_SECONDS); break; } case meshtastic_AdminMessage_factory_reset_device_tag: { - disableBluetooth(); LOG_INFO("Initiate full factory reset"); nodeDB->factoryReset(true); + disableBluetooth(); reboot(DEFAULT_REBOOT_SECONDS); break; } case meshtastic_AdminMessage_nodedb_reset_tag: { - disableBluetooth(); LOG_INFO("Initiate node-db reset"); // CLIENT_BASE, ROUTER and ROUTER_LATE are able to preserve the remaining hop count when relaying a packet via a // favorited node, so ensure that their favorites are kept on reset @@ -441,6 +441,7 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta isOneOf(config.device.role, meshtastic_Config_DeviceConfig_Role_CLIENT_BASE, meshtastic_Config_DeviceConfig_Role_ROUTER, meshtastic_Config_DeviceConfig_Role_ROUTER_LATE); nodeDB->resetNodes(rolePreference ? rolePreference : r->nodedb_reset); + disableBluetooth(); reboot(DEFAULT_REBOOT_SECONDS); break; } diff --git a/src/modules/SystemCommandsModule.cpp b/src/modules/SystemCommandsModule.cpp index 7e07414cd..5c4babb19 100644 --- a/src/modules/SystemCommandsModule.cpp +++ b/src/modules/SystemCommandsModule.cpp @@ -117,9 +117,9 @@ int SystemCommandsModule::handleInputEvent(const InputEvent *event) return true; // factory reset case INPUT_BROKER_FACTORY_RST: - disableBluetooth(); LOG_INFO("Initiate full factory reset"); nodeDB->factoryReset(true); + disableBluetooth(); // reboot(DEFAULT_REBOOT_SECONDS); LOG_INFO("Reboot in %d seconds", DEFAULT_REBOOT_SECONDS); if (screen)