Skip to content

Commit 5aa6ef7

Browse files
committed
Stop vibrating after 10s.
1 parent 49d95a9 commit 5aa6ef7

7 files changed

Lines changed: 47 additions & 25 deletions

File tree

src/components/timer/TimerController.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,15 @@ void TimerCallback(TimerHandle_t xTimer) {
88
controller->OnTimerEnd();
99
}
1010

11+
void SetTimerToStopRingingCallback(TimerHandle_t xTimer) {
12+
auto* controller = static_cast<TimerController*>(pvTimerGetTimerID(xTimer));
13+
controller->StopRinging();
14+
}
15+
1116
void TimerController::Init(Pinetime::System::SystemTask* systemTask) {
1217
this->systemTask = systemTask;
1318
timer = xTimerCreate("Timer", 1, pdFALSE, this, TimerCallback);
19+
stopRingingTimer = xTimerCreate("StopRingingTimer", 1, pdFALSE, this, SetTimerToStopRingingCallback);
1420
}
1521

1622
void TimerController::StartTimer(uint32_t duration) {
@@ -27,7 +33,7 @@ uint32_t TimerController::GetTimeRemaining() {
2733
case TimerState::Running:
2834
remainingTime = xTimerGetExpiryTime(timer) - xTaskGetTickCount();
2935
break;
30-
case TimerState::Alerting:
36+
case TimerState::Finished:
3137
remainingTime = xTaskGetTickCount() - xTimerGetExpiryTime(timer);
3238
break;
3339
}
@@ -36,15 +42,23 @@ uint32_t TimerController::GetTimeRemaining() {
3642

3743
void TimerController::StopTimer() {
3844
xTimerStop(timer, 0);
45+
if (state == TimerState::Finished) {
46+
StopRinging();
47+
}
3948
state = TimerState::Stopped;
4049
}
4150

4251
void TimerController::OnTimerEnd() {
43-
state = TimerState::Alerting;
52+
state = TimerState::Finished;
4453
systemTask->PushMessage(System::Messages::OnTimerDone);
54+
ringing = true;
55+
xTimerChangePeriod(stopRingingTimer, pdMS_TO_TICKS(10000), 0);
56+
xTimerStart(stopRingingTimer, 0);
4557
}
4658

47-
void TimerController::StopAlerting() {
48-
state = TimerState::Stopped;
49-
systemTask->PushMessage(System::Messages::StopRinging);
59+
void TimerController::StopRinging() {
60+
if (ringing) {
61+
systemTask->PushMessage(System::Messages::OnTimerDoneRinging);
62+
ringing = false;
63+
}
5064
}

src/components/timer/TimerController.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,9 @@ namespace Pinetime {
2222
uint32_t GetTimeRemaining();
2323

2424
void OnTimerEnd();
25+
void StopRinging();
2526

26-
void StopAlerting();
27-
28-
enum class TimerState { Stopped, Running, Alerting };
27+
enum class TimerState { Stopped, Running, Finished };
2928

3029
TimerState State() const {
3130
return state;
@@ -35,6 +34,8 @@ namespace Pinetime {
3534
System::SystemTask* systemTask = nullptr;
3635
TimerHandle_t timer;
3736
TimerState state = TimerState::Stopped;
37+
TimerHandle_t stopRingingTimer;
38+
bool ringing = false;
3839
};
3940
}
4041
}

src/displayapp/DisplayApp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ void DisplayApp::Refresh() {
185185
case Messages::TimerDone:
186186
if (currentApp == Apps::Timer) {
187187
auto* timer = static_cast<Screens::Timer*>(currentScreen.get());
188-
timer->SetTimerAlerting();
188+
timer->SetTimerFinished();
189189
} else {
190190
LoadApp(Apps::Timer, DisplayApp::FullRefreshDirections::Down);
191191
}

src/displayapp/screens/Timer.cpp

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <lvgl/lvgl.h>
66

77
using namespace Pinetime::Applications::Screens;
8+
using Pinetime::Controllers::TimerController;
89

910
static void btnEventHandler(lv_obj_t* obj, lv_event_t event) {
1011
auto* screen = static_cast<Timer*>(obj->user_data);
@@ -17,7 +18,7 @@ static void btnEventHandler(lv_obj_t* obj, lv_event_t event) {
1718
}
1819
}
1920

20-
Timer::Timer(DisplayApp* app, Controllers::TimerController& timerController) : Screen(app), timerController {timerController} {
21+
Timer::Timer(DisplayApp* app, TimerController& timerController) : Screen(app), timerController {timerController} {
2122
colonLabel = lv_label_create(lv_scr_act(), nullptr);
2223
lv_obj_set_style_local_text_font(colonLabel, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76);
2324
lv_obj_set_style_local_text_color(colonLabel, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
@@ -62,14 +63,14 @@ Timer::Timer(DisplayApp* app, Controllers::TimerController& timerController) : S
6263
lv_obj_align(txtPlayPause, btnPlayPause, LV_ALIGN_CENTER, 0, 0);
6364

6465
switch (timerController.State()) {
65-
case Controllers::TimerController::TimerState::Running:
66+
case TimerController::TimerState::Running:
6667
SetTimerRunning();
6768
break;
68-
case Controllers::TimerController::TimerState::Stopped:
69+
case TimerController::TimerState::Stopped:
6970
SetTimerStopped();
7071
break;
71-
case Controllers::TimerController::TimerState::Alerting:
72-
SetTimerAlerting();
72+
case TimerController::TimerState::Finished:
73+
SetTimerFinished();
7374
break;
7475
}
7576

@@ -90,7 +91,7 @@ void Timer::MaskReset() {
9091
buttonPressing = false;
9192
// A click event is processed before a release event,
9293
// so the release event would override the "Pause" text without this check
93-
if (timerController.State() == Controllers::TimerController::TimerState::Stopped) {
94+
if (timerController.State() == TimerController::TimerState::Stopped) {
9495
lv_label_set_text_static(txtPlayPause, "Start");
9596
}
9697
maskPosition = 0;
@@ -109,13 +110,13 @@ void Timer::UpdateMask() {
109110

110111
void Timer::Refresh() {
111112
switch (timerController.State()) {
112-
case Controllers::TimerController::TimerState::Running:
113-
case Controllers::TimerController::TimerState::Alerting: {
113+
case TimerController::TimerState::Running:
114+
case TimerController::TimerState::Finished: {
114115
uint32_t seconds = timerController.GetTimeRemaining() / 1000;
115116
minuteCounter.SetValue(seconds / 60);
116117
secondCounter.SetValue(seconds % 60);
117118
} break;
118-
case Controllers::TimerController::TimerState::Stopped:
119+
case TimerController::TimerState::Stopped:
119120
if (buttonPressing && xTaskGetTickCount() > pressTime + pdMS_TO_TICKS(150)) {
120121
lv_label_set_text_static(txtPlayPause, "Reset");
121122
maskPosition += 15;
@@ -131,7 +132,7 @@ void Timer::Refresh() {
131132
}
132133

133134
void Timer::UpdateColor() {
134-
lv_color_t color = timerController.State() == Controllers::TimerController::TimerState::Alerting ? LV_COLOR_RED : LV_COLOR_WHITE;
135+
lv_color_t color = timerController.State() == TimerController::TimerState::Finished ? LV_COLOR_RED : LV_COLOR_WHITE;
135136
lv_obj_set_style_local_text_color(colonLabel, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, color);
136137
minuteCounter.SetTextColor(color);
137138
secondCounter.SetTextColor(color);
@@ -145,7 +146,7 @@ void Timer::SetTimerRunning() {
145146
UpdateColor();
146147
}
147148

148-
void Timer::SetTimerAlerting() {
149+
void Timer::SetTimerFinished() {
149150
minuteCounter.HideControls();
150151
secondCounter.HideControls();
151152
lv_label_set_text_static(txtPlayPause, "Stop");
@@ -161,19 +162,19 @@ void Timer::SetTimerStopped() {
161162

162163
void Timer::ToggleRunning() {
163164
switch (timerController.State()) {
164-
case Controllers::TimerController::TimerState::Running: {
165+
case TimerController::TimerState::Running: {
165166
uint32_t seconds = timerController.GetTimeRemaining() / 1000;
166167
minuteCounter.SetValue(seconds / 60);
167168
secondCounter.SetValue(seconds % 60);
168169
}
169170
timerController.StopTimer();
170171
SetTimerStopped();
171172
break;
172-
case Controllers::TimerController::TimerState::Alerting:
173-
timerController.StopAlerting();
173+
case TimerController::TimerState::Finished:
174+
timerController.StopTimer();
174175
Reset();
175176
break;
176-
case Controllers::TimerController::TimerState::Stopped:
177+
case TimerController::TimerState::Stopped:
177178
if (secondCounter.GetValue() + minuteCounter.GetValue() > 0) {
178179
timerController.StartTimer((secondCounter.GetValue() + minuteCounter.GetValue() * 60) * 1000);
179180
Refresh();

src/displayapp/screens/Timer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ namespace Pinetime::Applications::Screens {
1919
void ToggleRunning();
2020
void ButtonPressed();
2121
void MaskReset();
22-
void SetTimerAlerting();
22+
void SetTimerFinished();
2323

2424
private:
2525
void SetTimerRunning();

src/systemtask/Messages.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace Pinetime {
99
OnNewTime,
1010
OnNewNotification,
1111
OnTimerDone,
12+
OnTimerDoneRinging,
1213
OnNewCall,
1314
BleConnected,
1415
UpdateTimeOut,

src/systemtask/SystemTask.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,11 @@ void SystemTask::Work() {
296296
}
297297
motorController.StartRinging();
298298
displayApp.PushMessage(Pinetime::Applications::Display::Messages::TimerDone);
299+
PushMessage(Messages::DisableSleeping);
300+
break;
301+
case Messages::OnTimerDoneRinging:
302+
motorController.StopRinging();
303+
PushMessage(Messages::EnableSleeping);
299304
break;
300305
case Messages::SetOffAlarm:
301306
if (state == SystemTaskState::Sleeping) {

0 commit comments

Comments
 (0)