fix(l2): the top button wakes the screen at once, switches it off on letting go

A press that silenced the alarm, took a screenshot or woke the screen doesn't
also switch the screen off when it's let go.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-10-25 21:33:59 +01:00
co-authored by Claude Sonnet 5.5
parent 9c40c83f4a
commit e6ae1d63b8
+15 -5
View File
@@ -220,10 +220,12 @@ void UITask::loop() {
sampleHistory(); sampleHistory();
// USER (BOOT, side) button: Home's clock page; held and let go, mutes / unmutes, also with the // USER (BOOT, side) button: Home's clock page; held and let go, mutes / unmutes, also with the
// screen off, which it doesn't wake. WAKE (top) button: screen off / on. // screen off, which it doesn't wake. WAKE (top) button: screen on at once, off on letting
// go (a press that silenced the alarm, took a screenshot or woke the screen doesn't
// also switch it off when let go).
// Either one silences a ringing alarm first. Held in the first 8 s (once the // Either one silences a ringing alarm first. Held in the first 8 s (once the
// screen is up -- held at power-on it's the ESP32's download mode): CLI rescue. // screen is up -- held at power-on it's the ESP32's download mode): CLI rescue.
bool btn_click = false, btn_hold = false, wake_press = false; bool btn_click = false, btn_hold = false, wake_press = false, wake_release = false;
#ifdef PIN_USER_BTN #ifdef PIN_USER_BTN
int ev = user_btn.check(); int ev = user_btn.check();
btn_click = ev == BUTTON_EVENT_CLICK; btn_click = ev == BUTTON_EVENT_CLICK;
@@ -231,7 +233,7 @@ void UITask::loop() {
#elif defined(SIM_PLATFORM) && defined(__EMSCRIPTEN__) #elif defined(SIM_PLATFORM) && defined(__EMSCRIPTEN__)
btn_click = s_sim_btn_click; btn_click = s_sim_btn_click;
btn_hold = s_sim_btn_hold; btn_hold = s_sim_btn_hold;
wake_press = s_sim_wake; wake_press = wake_release = s_sim_wake; // the page's button is a click
s_sim_btn_click = s_sim_btn_hold = s_sim_wake = false; s_sim_btn_click = s_sim_btn_hold = s_sim_wake = false;
#endif #endif
#if defined(SEEED_WIO_TRACKER_L2) #if defined(SEEED_WIO_TRACKER_L2)
@@ -239,6 +241,7 @@ void UITask::loop() {
_next_wake_poll_ms = millis() + 50; _next_wake_poll_ms = millis() + 50;
bool down = board.readWakeButton(); bool down = board.readWakeButton();
wake_press = down && !_wake_down; wake_press = down && !_wake_down;
wake_release = !down && _wake_down;
_wake_down = down; _wake_down = down;
} }
#endif #endif
@@ -246,19 +249,26 @@ void UITask::loop() {
// A long hold only arms the mute, which happens on letting go -- so holding // A long hold only arms the mute, which happens on letting go -- so holding
// the side button a bit long before the top one doesn't mute as well. // the side button a bit long before the top one doesn't mute as well.
static bool mute_armed = false; static bool mute_armed = false;
static bool wake_used = false; // this press of the top button did something already
bool shot = false, mute = false; bool shot = false, mute = false;
#ifdef PIN_USER_BTN #ifdef PIN_USER_BTN
bool side_down = user_btn.isPressed(); bool side_down = user_btn.isPressed();
if (wake_press && side_down) { user_btn.cancelClick(); shot = true; mute_armed = false; } if (wake_press && side_down) { user_btn.cancelClick(); shot = true; mute_armed = false; wake_used = true; }
if (mute_armed && !side_down) { mute_armed = false; mute = true; } if (mute_armed && !side_down) { mute_armed = false; mute = true; }
#elif defined(SIM_PLATFORM) && defined(__EMSCRIPTEN__) #elif defined(SIM_PLATFORM) && defined(__EMSCRIPTEN__)
shot = s_sim_shot; shot = s_sim_shot;
s_sim_shot = false; s_sim_shot = false;
if (mute_armed) { mute_armed = false; mute = true; } // the page sends the hold on release if (mute_armed) { mute_armed = false; mute = true; } // the page sends the hold on release
#endif #endif
if (wake_press && _core->clock.isRinging()) wake_used = true;
const bool wake_now = wake_press && _asleep && !wake_used;
if (wake_now) wake_used = true; // its release must not put it back to sleep
const bool sleep_now = wake_release && !wake_used && !_asleep;
if (wake_release) wake_used = false;
if (shot) { if (!_asleep) takeScreenshot(); } if (shot) { if (!_asleep) takeScreenshot(); }
else if ((btn_click || btn_hold || wake_press) && _core->clock.isRinging()) dismissRing(); else if ((btn_click || btn_hold || wake_press) && _core->clock.isRinging()) dismissRing();
else if (wake_press) { if (_asleep) wake(); else sleep(); } else if (wake_now) wake();
else if (sleep_now) sleep();
else if (btn_hold && millis() - _ui_started_ms < 8000) { // held in the first 8 s: CLI rescue, as on the L1 else if (btn_hold && millis() - _ui_started_ms < 8000) { // held in the first 8 s: CLI rescue, as on the L1
the_mesh.enterCLIRescue(); the_mesh.enterCLIRescue();
showToast("CLI rescue on the USB serial", 4000); showToast("CLI rescue on the USB serial", 4000);