summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichele Bini <michele.bini@gmail.com>2022-06-06 22:32:23 (GMT)
committerMichele Bini <michele.bini@gmail.com>2022-06-06 23:10:01 (GMT)
commit4daaf656949a473d19cb5f4106ffa9a9cf038813 (patch)
tree42f1abbab930106bbe0300698f50c0b6d8d47732
parent4290b321a71ce85f8365ed6206d6e89d8a2404b5 (diff)
use tick-based duration type for computation
-rw-r--r--src/components/alarm/AlarmController.cpp23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/components/alarm/AlarmController.cpp b/src/components/alarm/AlarmController.cpp
index 596bcaf..94914bd 100644
--- a/src/components/alarm/AlarmController.cpp
+++ b/src/components/alarm/AlarmController.cpp
@@ -19,6 +19,12 @@
#include "systemtask/SystemTask.h"
#include "task.h"
#include <chrono>
+#include <ratio>
+#include <cstdint>
+
+namespace {
+ typedef std::chrono::duration< int64_t, std::ratio<1, configTICK_RATE_HZ> > ticks_t;
+}
using namespace Pinetime::Controllers;
using namespace std::chrono_literals;
@@ -44,22 +50,21 @@ void AlarmController::SetAlarmTime(uint8_t alarmHr, uint8_t alarmMin) {
}
void AlarmController::OnAdjustTime() {
-
if (state != AlarmState::Set) {
return;
}
- xTimerStop(alarmAppTimer, 0);
+ xTimerStop(alarmTimer, 0);
auto now = dateTimeController.CurrentDateTime();
- if (now > alarmTime) {
- xTimerChangePeriod(alarmAppTimer, 1, 0);
+ if (now >= alarmTime) {
+ xTimerChangePeriod(alarmTimer, 1, 0);
} else {
- auto mSecToAlarm = std::chrono::duration_cast<std::chrono::milliseconds>(alarmTime - now).count();
- xTimerChangePeriod(alarmAppTimer, APP_TIMER_TICKS(mSecToAlarm), 0);
+ auto ticksToAlarm = std::chrono::duration_cast<ticks_t>(alarmTime - now).count();
+ xTimerChangePeriod(alarmTimer, ++ticksToAlarm, 0);
}
- xTimerStart(alarmAppTimer, 0);
+ xTimerStart(alarmTimer, 0);
}
void AlarmController::ScheduleAlarm() {
@@ -94,8 +99,8 @@ void AlarmController::ScheduleAlarm() {
// now can convert back to a time_point
alarmTime = std::chrono::system_clock::from_time_t(std::mktime(tmAlarmTime));
- auto secondsToAlarm = std::chrono::duration_cast<std::chrono::seconds>(alarmTime - now).count();
- xTimerChangePeriod(alarmTimer, secondsToAlarm * configTICK_RATE_HZ, 0);
+ auto ticksToAlarm = std::chrono::duration_cast<ticks_t>(alarmTime - now).count();
+ xTimerChangePeriod(alarmTimer, ticksToAlarm, 0);
xTimerStart(alarmTimer, 0);
state = AlarmState::Set;