Skip to content

Commit 4f649a8

Browse files
Riksu9000JF002
authored andcommitted
Improved alarm alert handling
1 parent e332be0 commit 4f649a8

3 files changed

Lines changed: 41 additions & 10 deletions

File tree

src/displayapp/DisplayApp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction)
379379
currentScreen = std::make_unique<Screens::Timer>(this, timerController);
380380
break;
381381
case Apps::Alarm:
382-
currentScreen = std::make_unique<Screens::Alarm>(this, alarmController, settingsController);
382+
currentScreen = std::make_unique<Screens::Alarm>(this, alarmController, settingsController, *systemTask);
383383
break;
384384

385385
// Settings

src/displayapp/screens/Alarm.cpp

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,20 @@ using namespace Pinetime::Applications::Screens;
2323
using Pinetime::Controllers::AlarmController;
2424

2525
static void btnEventHandler(lv_obj_t* obj, lv_event_t event) {
26-
Alarm* screen = static_cast<Alarm*>(obj->user_data);
26+
auto* screen = static_cast<Alarm*>(obj->user_data);
2727
screen->OnButtonEvent(obj, event);
2828
}
2929

30-
Alarm::Alarm(DisplayApp* app, Controllers::AlarmController& alarmController, Pinetime::Controllers::Settings& settingsController)
31-
: Screen(app), alarmController {alarmController}, settingsController {settingsController} {
30+
static void StopAlarmTaskCallback(lv_task_t* task) {
31+
auto* screen = static_cast<Alarm*>(task->user_data);
32+
screen->StopAlerting();
33+
}
34+
35+
Alarm::Alarm(DisplayApp* app,
36+
Controllers::AlarmController& alarmController,
37+
Pinetime::Controllers::Settings& settingsController,
38+
System::SystemTask& systemTask)
39+
: Screen(app), alarmController {alarmController}, settingsController {settingsController}, systemTask {systemTask} {
3240

3341
time = lv_label_create(lv_scr_act(), nullptr);
3442
lv_obj_set_style_local_text_font(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76);
@@ -122,17 +130,16 @@ Alarm::Alarm(DisplayApp* app, Controllers::AlarmController& alarmController, Pin
122130
}
123131

124132
Alarm::~Alarm() {
133+
if (alarmController.State() == AlarmController::AlarmState::Alerting) {
134+
StopAlerting();
135+
}
125136
lv_obj_clean(lv_scr_act());
126137
}
127138

128139
void Alarm::OnButtonEvent(lv_obj_t* obj, lv_event_t event) {
129140
using Pinetime::Controllers::AlarmController;
130141
if (event == LV_EVENT_CLICKED) {
131142
if (obj == btnStop) {
132-
if (alarmController.State() == AlarmController::AlarmState::Alerting) {
133-
alarmController.StopAlerting();
134-
}
135-
SetSwitchState(LV_ANIM_OFF);
136143
StopAlerting();
137144
return;
138145
}
@@ -205,9 +212,18 @@ bool Alarm::OnButtonPushed() {
205212
HideInfo();
206213
return true;
207214
}
215+
if (alarmController.State() == AlarmController::AlarmState::Alerting) {
216+
StopAlerting();
217+
return true;
218+
}
208219
return false;
209220
}
210221

222+
bool Alarm::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
223+
// Don't allow closing the screen by swiping while the alarm is alerting
224+
return alarmController.State() == AlarmController::AlarmState::Alerting && event == TouchEvents::SwipeDown;
225+
}
226+
211227
void Alarm::UpdateAlarmTime() {
212228
if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) {
213229
switch (alarmHours) {
@@ -237,9 +253,18 @@ void Alarm::UpdateAlarmTime() {
237253
void Alarm::SetAlerting() {
238254
lv_obj_set_hidden(enableSwitch, true);
239255
lv_obj_set_hidden(btnStop, false);
256+
taskStopAlarm = lv_task_create(StopAlarmTaskCallback, pdMS_TO_TICKS(60 * 1000), LV_TASK_PRIO_MID, this);
257+
systemTask.PushMessage(System::Messages::DisableSleeping);
240258
}
241259

242260
void Alarm::StopAlerting() {
261+
alarmController.StopAlerting();
262+
SetSwitchState(LV_ANIM_OFF);
263+
if (taskStopAlarm != nullptr) {
264+
lv_task_del(taskStopAlarm);
265+
taskStopAlarm = nullptr;
266+
}
267+
systemTask.PushMessage(System::Messages::EnableSleeping);
243268
lv_obj_set_hidden(enableSwitch, false);
244269
lv_obj_set_hidden(btnStop, true);
245270
}

src/displayapp/screens/Alarm.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,28 +27,34 @@ namespace Pinetime {
2727
namespace Screens {
2828
class Alarm : public Screen {
2929
public:
30-
Alarm(DisplayApp* app, Controllers::AlarmController& alarmController, Pinetime::Controllers::Settings& settingsController);
30+
Alarm(DisplayApp* app,
31+
Controllers::AlarmController& alarmController,
32+
Pinetime::Controllers::Settings& settingsController,
33+
System::SystemTask& systemTask);
3134
~Alarm() override;
3235
void SetAlerting();
3336
void OnButtonEvent(lv_obj_t* obj, lv_event_t event);
3437
bool OnButtonPushed() override;
38+
bool OnTouchEvent(TouchEvents event) override;
39+
void StopAlerting();
3540

3641
private:
3742
uint8_t alarmHours;
3843
uint8_t alarmMinutes;
3944
Controllers::AlarmController& alarmController;
4045
Controllers::Settings& settingsController;
46+
System::SystemTask& systemTask;
4147

4248
lv_obj_t *time, *lblampm, *btnStop, *txtStop, *btnMinutesUp, *btnMinutesDown, *btnHoursUp, *btnHoursDown, *txtMinUp,
4349
*txtMinDown, *txtHrUp, *txtHrDown, *btnRecur, *txtRecur, *btnInfo, *txtInfo, *enableSwitch;
4450
lv_obj_t* txtMessage = nullptr;
4551
lv_obj_t* btnMessage = nullptr;
52+
lv_task_t* taskStopAlarm = nullptr;
4653

4754
enum class EnableButtonState { On, Off, Alerting };
4855
void SetRecurButtonState();
4956
void SetSwitchState(lv_anim_enable_t anim);
5057
void SetAlarm();
51-
void StopAlerting();
5258
void ShowInfo();
5359
void HideInfo();
5460
void ToggleRecurrence();

0 commit comments

Comments
 (0)