aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorljahn <36698527+ljahn@users.noreply.github.com>2025-01-21 09:10:41 +0100
committerGitHub <noreply@github.com>2025-01-21 09:10:41 +0100
commitdbe8820834fda6b0fc818d68c104924b463e0d9c (patch)
treef4538baa5b3b402d68c10a271e79094b53392337
parent3e23ee7c782904debabe3eb76ceba05f1e903be4 (diff)
Alarm: Simplify alarm alerting screen (#2211)
Simplify alarm alerting screen and fix bug with alerting on time value change SetAlerting creates an lv_task to automatically call StopAlerting after one minute. This task will call an invalid function reference and lead to a crash under the following condition: All exit paths but the time value change (so not considering this fix) call StopAlerting themselves, which also terminates the lv_task. However, the value change callback only calls DisableAlarm, because its normal use case is for setting up an alarm, where you have to re-confirm enabling the alarm after every change you make. DisableAlarm still sets isAlerting in the alarmController to false, probably because someone thought a currently alerting but also disabled alarm makes no sense, this was introduced in a0cd439. That causes the destructor of Alarm to think there is nothing to do regarding the alerting when the alarm screen is dismissed. Therefore it does not call StopAlerting and the lv_task is left with an invalid function pointer, because Alarm does not exist anymore once the lv_task finally goes to call the callback function
-rw-r--r--src/components/alarm/AlarmController.cpp1
-rw-r--r--src/displayapp/screens/Alarm.cpp12
2 files changed, 10 insertions, 3 deletions
diff --git a/src/components/alarm/AlarmController.cpp b/src/components/alarm/AlarmController.cpp
index 7dbfb0e3..4ae42c08 100644
--- a/src/components/alarm/AlarmController.cpp
+++ b/src/components/alarm/AlarmController.cpp
@@ -111,7 +111,6 @@ uint32_t AlarmController::SecondsToAlarm() const {
void AlarmController::DisableAlarm() {
xTimerStop(alarmTimer, 0);
- isAlerting = false;
if (alarm.isEnabled) {
alarm.isEnabled = false;
alarmChanged = true;
diff --git a/src/displayapp/screens/Alarm.cpp b/src/displayapp/screens/Alarm.cpp
index b1e67363..4cf43921 100644
--- a/src/displayapp/screens/Alarm.cpp
+++ b/src/displayapp/screens/Alarm.cpp
@@ -77,7 +77,7 @@ Alarm::Alarm(Controllers::AlarmController& alarmController,
btnStop = lv_btn_create(lv_scr_act(), nullptr);
btnStop->user_data = this;
lv_obj_set_event_cb(btnStop, btnEventHandler);
- lv_obj_set_size(btnStop, 115, 50);
+ lv_obj_set_size(btnStop, 240, 70);
lv_obj_align(btnStop, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
lv_obj_set_style_local_bg_color(btnStop, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED);
txtStop = lv_label_create(btnStop, nullptr);
@@ -203,6 +203,10 @@ void Alarm::UpdateAlarmTime() {
void Alarm::SetAlerting() {
lv_obj_set_hidden(enableSwitch, true);
+ lv_obj_set_hidden(btnRecur, true);
+ lv_obj_set_hidden(btnInfo, true);
+ hourCounter.HideControls();
+ minuteCounter.HideControls();
lv_obj_set_hidden(btnStop, false);
taskStopAlarm = lv_task_create(StopAlarmTaskCallback, pdMS_TO_TICKS(60 * 1000), LV_TASK_PRIO_MID, this);
motorController.StartRinging();
@@ -218,8 +222,12 @@ void Alarm::StopAlerting() {
taskStopAlarm = nullptr;
}
wakeLock.Release();
- lv_obj_set_hidden(enableSwitch, false);
lv_obj_set_hidden(btnStop, true);
+ hourCounter.ShowControls();
+ minuteCounter.ShowControls();
+ lv_obj_set_hidden(btnInfo, false);
+ lv_obj_set_hidden(btnRecur, false);
+ lv_obj_set_hidden(enableSwitch, false);
}
void Alarm::SetSwitchState(lv_anim_enable_t anim) {