Skip to content

Commit 9cd0def

Browse files
authored
Merge pull request #662 from mruss77/basic-alarm-app
Basic alarm app
2 parents 3eb7377 + b9e5684 commit 9cd0def

14 files changed

Lines changed: 537 additions & 2 deletions

File tree

src/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,7 @@ list(APPEND SOURCE_FILES
421421
displayapp/screens/BatteryInfo.cpp
422422
displayapp/screens/Steps.cpp
423423
displayapp/screens/Timer.cpp
424+
displayapp/screens/Alarm.cpp
424425
displayapp/Colors.cpp
425426

426427
## Settings
@@ -477,6 +478,7 @@ list(APPEND SOURCE_FILES
477478
components/motor/MotorController.cpp
478479
components/settings/Settings.cpp
479480
components/timer/TimerController.cpp
481+
components/alarm/AlarmController.cpp
480482
components/fs/FS.cpp
481483
drivers/Cst816s.cpp
482484
FreeRTOS/port.c
@@ -543,6 +545,7 @@ list(APPEND RECOVERY_SOURCE_FILES
543545
components/firmwarevalidator/FirmwareValidator.cpp
544546
components/settings/Settings.cpp
545547
components/timer/TimerController.cpp
548+
components/alarm/AlarmController.cpp
546549
drivers/Cst816s.cpp
547550
FreeRTOS/port.c
548551
FreeRTOS/port_cmsis_systick.c
@@ -615,6 +618,7 @@ set(INCLUDE_FILES
615618
displayapp/screens/Metronome.h
616619
displayapp/screens/Motion.h
617620
displayapp/screens/Timer.h
621+
displayapp/screens/Alarm.h
618622
displayapp/Colors.h
619623
drivers/St7789.h
620624
drivers/SpiNorFlash.h
@@ -647,6 +651,7 @@ set(INCLUDE_FILES
647651
components/ble/HeartRateService.h
648652
components/settings/Settings.h
649653
components/timer/TimerController.h
654+
components/alarm/AlarmController.h
650655
drivers/Cst816s.h
651656
FreeRTOS/portmacro.h
652657
FreeRTOS/portmacro_cmsis.h
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/* Copyright (C) 2021 mruss77, Florian
2+
3+
This file is part of InfiniTime.
4+
5+
InfiniTime is free software: you can redistribute it and/or modify
6+
it under the terms of the GNU General Public License as published
7+
by the Free Software Foundation, either version 3 of the License, or
8+
(at your option) any later version.
9+
10+
InfiniTime is distributed in the hope that it will be useful,
11+
but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
GNU General Public License for more details.
14+
15+
You should have received a copy of the GNU General Public License
16+
along with this program. If not, see <https://www.gnu.org/licenses/>.
17+
*/
18+
#include "AlarmController.h"
19+
#include "systemtask/SystemTask.h"
20+
#include "app_timer.h"
21+
#include "task.h"
22+
#include <chrono>
23+
24+
using namespace Pinetime::Controllers;
25+
using namespace std::chrono_literals;
26+
27+
AlarmController::AlarmController(Controllers::DateTime& dateTimeController) : dateTimeController {dateTimeController} {
28+
}
29+
30+
APP_TIMER_DEF(alarmAppTimer);
31+
32+
namespace {
33+
void SetOffAlarm(void* p_context) {
34+
auto* controller = static_cast<Pinetime::Controllers::AlarmController*>(p_context);
35+
if (controller != nullptr) {
36+
controller->SetOffAlarmNow();
37+
}
38+
}
39+
}
40+
41+
void AlarmController::Init(System::SystemTask* systemTask) {
42+
app_timer_create(&alarmAppTimer, APP_TIMER_MODE_SINGLE_SHOT, SetOffAlarm);
43+
this->systemTask = systemTask;
44+
}
45+
46+
void AlarmController::SetAlarmTime(uint8_t alarmHr, uint8_t alarmMin) {
47+
hours = alarmHr;
48+
minutes = alarmMin;
49+
}
50+
51+
void AlarmController::ScheduleAlarm() {
52+
// Determine the next time the alarm needs to go off and set the app_timer
53+
app_timer_stop(alarmAppTimer);
54+
55+
auto now = dateTimeController.CurrentDateTime();
56+
alarmTime = now;
57+
time_t ttAlarmTime = std::chrono::system_clock::to_time_t(alarmTime);
58+
tm* tmAlarmTime = std::localtime(&ttAlarmTime);
59+
60+
// If the time being set has already passed today,the alarm should be set for tomorrow
61+
if (hours < dateTimeController.Hours() || (hours == dateTimeController.Hours() && minutes <= dateTimeController.Minutes())) {
62+
tmAlarmTime->tm_mday += 1;
63+
// tm_wday doesn't update automatically
64+
tmAlarmTime->tm_wday = (tmAlarmTime->tm_wday + 1) % 7;
65+
}
66+
67+
tmAlarmTime->tm_hour = hours;
68+
tmAlarmTime->tm_min = minutes;
69+
tmAlarmTime->tm_sec = 0;
70+
71+
// if alarm is in weekday-only mode, make sure it shifts to the next weekday
72+
if (recurrence == RecurType::Weekdays) {
73+
if (tmAlarmTime->tm_wday == 0) { // Sunday, shift 1 day
74+
tmAlarmTime->tm_mday += 1;
75+
} else if (tmAlarmTime->tm_wday == 6) { // Saturday, shift 2 days
76+
tmAlarmTime->tm_mday += 2;
77+
}
78+
}
79+
tmAlarmTime->tm_isdst = -1; // use system timezone setting to determine DST
80+
81+
// now can convert back to a time_point
82+
alarmTime = std::chrono::system_clock::from_time_t(std::mktime(tmAlarmTime));
83+
auto mSecToAlarm = std::chrono::duration_cast<std::chrono::milliseconds>(alarmTime - now).count();
84+
app_timer_start(alarmAppTimer, APP_TIMER_TICKS(mSecToAlarm), this);
85+
86+
state = AlarmState::Set;
87+
}
88+
89+
uint32_t AlarmController::SecondsToAlarm() {
90+
return std::chrono::duration_cast<std::chrono::seconds>(alarmTime - dateTimeController.CurrentDateTime()).count();
91+
}
92+
93+
void AlarmController::DisableAlarm() {
94+
app_timer_stop(alarmAppTimer);
95+
state = AlarmState::Not_Set;
96+
}
97+
98+
void AlarmController::SetOffAlarmNow() {
99+
state = AlarmState::Alerting;
100+
systemTask->PushMessage(System::Messages::SetOffAlarm);
101+
}
102+
103+
void AlarmController::StopAlerting() {
104+
systemTask->PushMessage(System::Messages::StopRinging);
105+
106+
// Alarm state is off unless this is a recurring alarm
107+
if (recurrence == RecurType::None) {
108+
state = AlarmState::Not_Set;
109+
} else {
110+
state = AlarmState::Set;
111+
// set next instance
112+
ScheduleAlarm();
113+
}
114+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/* Copyright (C) 2021 mruss77, Florian
2+
3+
This file is part of InfiniTime.
4+
5+
InfiniTime is free software: you can redistribute it and/or modify
6+
it under the terms of the GNU General Public License as published
7+
by the Free Software Foundation, either version 3 of the License, or
8+
(at your option) any later version.
9+
10+
InfiniTime is distributed in the hope that it will be useful,
11+
but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
GNU General Public License for more details.
14+
15+
You should have received a copy of the GNU General Public License
16+
along with this program. If not, see <https://www.gnu.org/licenses/>.
17+
*/
18+
#pragma once
19+
20+
#include <cstdint>
21+
#include "app_timer.h"
22+
#include "components/datetime/DateTimeController.h"
23+
24+
namespace Pinetime {
25+
namespace System {
26+
class SystemTask;
27+
}
28+
namespace Controllers {
29+
class AlarmController {
30+
public:
31+
AlarmController(Controllers::DateTime& dateTimeController);
32+
33+
void Init(System::SystemTask* systemTask);
34+
void SetAlarmTime(uint8_t alarmHr, uint8_t alarmMin);
35+
void ScheduleAlarm();
36+
void DisableAlarm();
37+
void SetOffAlarmNow();
38+
uint32_t SecondsToAlarm();
39+
void StopAlerting();
40+
enum class AlarmState { Not_Set, Set, Alerting };
41+
enum class RecurType { None, Daily, Weekdays };
42+
uint8_t Hours() const {
43+
return hours;
44+
}
45+
uint8_t Minutes() const {
46+
return minutes;
47+
}
48+
AlarmState State() const {
49+
return state;
50+
}
51+
RecurType Recurrence() const {
52+
return recurrence;
53+
}
54+
void SetRecurrence(RecurType recurType) {
55+
recurrence = recurType;
56+
}
57+
58+
private:
59+
Controllers::DateTime& dateTimeController;
60+
System::SystemTask* systemTask = nullptr;
61+
uint8_t hours = 7;
62+
uint8_t minutes = 0;
63+
std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> alarmTime;
64+
AlarmState state = AlarmState::Not_Set;
65+
RecurType recurrence = RecurType::None;
66+
};
67+
}
68+
}

src/displayapp/Apps.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ namespace Pinetime {
1212
NotificationsPreview,
1313
Notifications,
1414
Timer,
15+
Alarm,
1516
FlashLight,
1617
BatteryInfo,
1718
Music,

src/displayapp/DisplayApp.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <displayapp/screens/HeartRate.h>
44
#include <displayapp/screens/Motion.h>
55
#include <displayapp/screens/Timer.h>
6+
#include <displayapp/screens/Alarm.h>
67
#include "components/battery/BatteryController.h"
78
#include "components/ble/BleController.h"
89
#include "components/datetime/DateTimeController.h"
@@ -90,6 +91,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
9091
Pinetime::Controllers::MotorController& motorController,
9192
Pinetime::Controllers::MotionController& motionController,
9293
Pinetime::Controllers::TimerController& timerController,
94+
Pinetime::Controllers::AlarmController& alarmController,
9395
Pinetime::Controllers::TouchHandler& touchHandler)
9496
: lcd {lcd},
9597
lvgl {lvgl},
@@ -104,6 +106,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
104106
motorController {motorController},
105107
motionController {motionController},
106108
timerController {timerController},
109+
alarmController {alarmController},
107110
touchHandler {touchHandler} {
108111
}
109112

@@ -202,6 +205,13 @@ void DisplayApp::Refresh() {
202205
LoadApp(Apps::Timer, DisplayApp::FullRefreshDirections::Down);
203206
}
204207
break;
208+
case Messages::AlarmTriggered:
209+
if (currentApp == Apps::Alarm) {
210+
auto* alarm = static_cast<Screens::Alarm*>(currentScreen.get());
211+
alarm->SetAlerting();
212+
} else {
213+
LoadApp(Apps::Alarm, DisplayApp::FullRefreshDirections::None);
214+
}
205215
case Messages::TouchEvent: {
206216
if (state != States::Running) {
207217
break;
@@ -334,6 +344,9 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction)
334344
case Apps::Timer:
335345
currentScreen = std::make_unique<Screens::Timer>(this, timerController);
336346
break;
347+
case Apps::Alarm:
348+
currentScreen = std::make_unique<Screens::Alarm>(this, alarmController);
349+
break;
337350

338351
// Settings
339352
case Apps::QuickSettings:

src/displayapp/DisplayApp.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
#include "components/settings/Settings.h"
1515
#include "displayapp/screens/Screen.h"
1616
#include "components/timer/TimerController.h"
17+
#include "components/alarm/AlarmController.h"
1718
#include "touchhandler/TouchHandler.h"
19+
1820
#include "Messages.h"
1921

2022
namespace Pinetime {
@@ -57,6 +59,7 @@ namespace Pinetime {
5759
Pinetime::Controllers::MotorController& motorController,
5860
Pinetime::Controllers::MotionController& motionController,
5961
Pinetime::Controllers::TimerController& timerController,
62+
Pinetime::Controllers::AlarmController& alarmController,
6063
Pinetime::Controllers::TouchHandler& touchHandler);
6164
void Start();
6265
void PushMessage(Display::Messages msg);
@@ -82,6 +85,7 @@ namespace Pinetime {
8285
Pinetime::Controllers::MotorController& motorController;
8386
Pinetime::Controllers::MotionController& motionController;
8487
Pinetime::Controllers::TimerController& timerController;
88+
Pinetime::Controllers::AlarmController& alarmController;
8589
Pinetime::Controllers::TouchHandler& touchHandler;
8690

8791
Pinetime::Controllers::FirmwareValidator validator;

src/displayapp/Messages.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ namespace Pinetime {
1414
BleFirmwareUpdateStarted,
1515
UpdateTimeOut,
1616
DimScreen,
17-
RestoreBrightness
17+
RestoreBrightness,
18+
AlarmTriggered
1819
};
1920
}
2021
}

0 commit comments

Comments
 (0)