diff --git a/examples/companion_radio/UITask.cpp b/examples/companion_radio/UITask.cpp index f4e3fb0b..675972dc 100644 --- a/examples/companion_radio/UITask.cpp +++ b/examples/companion_radio/UITask.cpp @@ -266,7 +266,7 @@ void UITask::buttonHandler() { digitalWrite(PIN_STATUS_LED, LOW); delay(10); #endif - _board->powerOff(); + shutdown(); // without restart } } btn_state_change_time = millis(); @@ -278,6 +278,30 @@ void UITask::buttonHandler() { #endif } + +/* hardware-agnostic pre-shutdown activity should be done here +*/ +void UITask::shutdown(bool restart){ + + #ifdef PIN_BUZZER + /* note: we have a choice here - + we can do a blocking buzzer.loop() with non-deterministic consequences + or we can set a flag and delay the shutdown for a couple of seconds + while a non-blocking buzzer.loop() plays out in UITask::loop() + */ + buzzer.shutdown(); + uint32_t buzzer_timer = millis(); // fail-safe shutdown + while (buzzer.isPlaying() && (millis() - 2500) < buzzer_timer) + buzzer.loop(); + + #endif // PIN_BUZZER + + if (restart) + _board->reboot(); + else + _board->powerOff(); +} + void UITask::loop() { buttonHandler(); userLedHandler(); diff --git a/examples/companion_radio/UITask.h b/examples/companion_radio/UITask.h index 134b5a16..d774e54c 100644 --- a/examples/companion_radio/UITask.h +++ b/examples/companion_radio/UITask.h @@ -39,7 +39,6 @@ class UITask { void buttonHandler(); void userLedHandler(); void renderBatteryIndicator(uint16_t batteryMilliVolts); - public: @@ -55,5 +54,6 @@ public: void msgRead(int msgcount); void newMsg(uint8_t path_len, const char* from_name, const char* text, int msgcount); void soundBuzzer(UIEventType bet = UIEventType::none); + void shutdown(bool restart = false); void loop(); };