diff --git a/examples/companion_radio/AbstractUITask.h b/examples/companion_radio/AbstractUITask.h index 7a019e07..070ebf9b 100644 --- a/examples/companion_radio/AbstractUITask.h +++ b/examples/companion_radio/AbstractUITask.h @@ -148,5 +148,12 @@ public: // added later at the same slot would silently inherit the old one's bot/ // share target or notification melody. Default no-op. virtual void onChannelRemoved(uint8_t channel_idx) {} + // Single choke point for every controlled power-down (low-battery auto-off, + // long-press power-off, and now every board.reboot() caller too): flush + // prefs/RTC/contacts/trail before the board actually goes down or restarts, + // so no exit path can silently skip a pending write. restart=true reboots, + // false powers off. Every UI variant (ui-new/ui-tiny/ui-orig) implements + // this the same way -- see each's UITask::shutdown(). + virtual void shutdown(bool restart = false) = 0; virtual void loop() = 0; }; diff --git a/examples/companion_radio/MyMesh.cpp b/examples/companion_radio/MyMesh.cpp index 3509821c..dc59f454 100644 --- a/examples/companion_radio/MyMesh.cpp +++ b/examples/companion_radio/MyMesh.cpp @@ -2380,11 +2380,13 @@ void MyMesh::handleCmdFrame(size_t len) { writeOKFrame(); } } else if (cmd_frame[0] == CMD_REBOOT && memcmp(&cmd_frame[1], "reboot", 6) == 0) { - if (dirty_contacts_expiry) { // is there are pending dirty contacts write needed? - saveContacts(); + if (_ui) { + _ui->shutdown(true); + } else { + flushDirtyContacts(); + savePrefs(); + board.reboot(); } - savePrefs(); // flush any on-device setting change not yet persisted -- see UITask::shutdown()'s comment - board.reboot(); } else if (cmd_frame[0] == CMD_GET_BATT_AND_STORAGE) { uint8_t reply[11]; int i = 0; @@ -3192,8 +3194,13 @@ void MyMesh::checkCLIRescueCmd() { } } else if (strcmp(cli_command, "reboot") == 0) { - savePrefs(); // flush any on-device setting change not yet persisted -- see UITask::shutdown()'s comment - board.reboot(); // doesn't return + if (_ui) { + _ui->shutdown(true); + } else { + flushDirtyContacts(); + savePrefs(); // flush any on-device setting change not yet persisted -- see UITask::shutdown()'s comment + board.reboot(); // doesn't return + } } else { Serial.println(" Error: unknown command"); } diff --git a/examples/companion_radio/ui-new/SettingsScreen.h b/examples/companion_radio/ui-new/SettingsScreen.h index 66c0ee86..39287440 100644 --- a/examples/companion_radio/ui-new/SettingsScreen.h +++ b/examples/companion_radio/ui-new/SettingsScreen.h @@ -1018,9 +1018,8 @@ public: return true; } if (_selected == REBOOT && enter) { - _task->savePrefsIfDirty(_dirty); // don't lose pending edits across the restart _task->showAlert("Rebooting...", 800); - board.reboot(); + _task->shutdown(true); // flushes prefs/RTC/contacts/trail, then reboots -- single choke point return true; } if (_selected == KEYBOARD_TYPE && p && (left || right || enter)) {