Apply busy radio settings and recover service starts automatically

Save valid busy RX, fast-switch and Companion tuple changes once, then
apply the latest accepted intent at a safe radio gap. Preserve checked-save
rollback, runtime RXEN intent, TempRadio ownership and exact remote reply
delivery. Repair failed preamble compensation without hiding uncertain saves.

Retry WebConfig, MQTT and NimBLE startup failures automatically. Preserve
explicit off choices, OTA ownership and the latest WiFi credentials through
cooperative shutdown. Add regression coverage and update command guides.

Validation: focused host transaction, rollback, ownership and lifecycle suites;
Full RAK4631, Heltec V4 R8 TFT and RC32 packages; representative room, sensor,
LR1110, LR2021, SX1276, STM32WL and ESP-NOW builds. Linked RAK crypto and OTA
workspace checks pass; its complete OTA image uses 712644/712704 bytes.
This commit is contained in:
mikecarper committed 2026-10-25 15:20:55 -07:00
1 parent fb73e3afac
commit 73c5f572eb
89 files changed
+2978 -816

No files matched your search

+3 -1
View File
@@ -82,7 +82,8 @@ public:
uint32_t _tx_power_retry_at = 0;
bool _common_save_result_known = false;
bool _common_save_succeeded = false;
struct Profiles { void loop() {} } _radio_profiles;
struct Profiles { void loop() {} void servicePendingTuning() {} } _radio_profiles;
Profiles& radioProfiles() { return _radio_profiles; }
struct MorseReply { void complete(const void*) {} } _morse_reply;
MorseReply& morseReply() { return _morse_reply; }
CommonCLI() { callbacks.owner = this; }
@@ -91,6 +92,7 @@ public:
void loop();
void applyAndSaveTxPower(int8_t, char*);
void servicePendingTxPower();
void servicePendingRxSettings() {}
bool trySavePrefs(PrefsSaveRouting::Scope scope = PrefsSaveRouting::Scope::Common);
void command(const char* text, char* reply) {
if (!strncmp(text, "set ", 4)) {