diff options
| author | Michele Bini <michele.bini@gmail.com> | 2022-04-17 11:13:41 (GMT) |
|---|---|---|
| committer | Michele Bini <michele.bini@gmail.com> | 2022-04-17 13:16:10 (GMT) |
| commit | aca605d4fb4040cc80c1acf101023aa86e7694ba (patch) | |
| tree | 5f83db7a5bfbf05d732121bb95ca383243cc8eaf | |
| parent | c372ba1908bb861d7f05d057c7fc25202c34bbe3 (diff) | |
Differentiate time adjustment (< 3h for example time zone change when crossing a border or because of daylight saving) and time setting (for example when the firmware is booted for the first time and the companion app sends the time)
| -rw-r--r-- | src/components/alarm/AlarmController.cpp | 19 | ||||
| -rw-r--r-- | src/components/alarm/AlarmController.h | 1 | ||||
| -rw-r--r-- | src/components/datetime/DateTimeController.cpp | 33 | ||||
| -rw-r--r-- | src/systemtask/Messages.h | 65 | ||||
| -rw-r--r-- | src/systemtask/SystemTask.cpp | 5 |
5 files changed, 79 insertions, 44 deletions
diff --git a/src/components/alarm/AlarmController.cpp b/src/components/alarm/AlarmController.cpp index c86ff73..5432e75 100644 --- a/src/components/alarm/AlarmController.cpp +++ b/src/components/alarm/AlarmController.cpp @@ -44,6 +44,25 @@ void AlarmController::SetAlarmTime(uint8_t alarmHr, uint8_t alarmMin) { minutes = alarmMin; } +void AlarmController::OnAdjustTime() { + + if (state != AlarmState::Set) { + return; + } + + xTimerStop(alarmAppTimer, 0); + auto now = dateTimeController.CurrentDateTime(); + + if (now > alarmTime) { + xTimerChangePeriod(alarmAppTimer, 1, 0); + } else { + auto mSecToAlarm = std::chrono::duration_cast<std::chrono::milliseconds>(alarmTime - now).count(); + xTimerChangePeriod(alarmAppTimer, APP_TIMER_TICKS(mSecToAlarm), 0); + } + + xTimerStart(alarmAppTimer, 0); +} + void AlarmController::ScheduleAlarm() { // Determine the next time the alarm needs to go off and set the timer xTimerStop(alarmAppTimer, 0); diff --git a/src/components/alarm/AlarmController.h b/src/components/alarm/AlarmController.h index 099de8b..6ad220f 100644 --- a/src/components/alarm/AlarmController.h +++ b/src/components/alarm/AlarmController.h @@ -33,6 +33,7 @@ namespace Pinetime { void SetAlarmTime(uint8_t alarmHr, uint8_t alarmMin); void ScheduleAlarm(); + void OnAdjustTime(); void DisableAlarm(); void SetOffAlarmNow(); uint32_t SecondsToAlarm(); diff --git a/src/components/datetime/DateTimeController.cpp b/src/components/datetime/DateTimeController.cpp index 3bfbdc7..2656764 100644 --- a/src/components/datetime/DateTimeController.cpp +++ b/src/components/datetime/DateTimeController.cpp @@ -30,6 +30,7 @@ void DateTime::SetTime( /* .tm_year = */ year - 1900, }; tm.tm_isdst = -1; // Use DST value from local time zone + auto previousDateTime = currentDateTime; currentDateTime = std::chrono::system_clock::from_time_t(std::mktime(&tm)); NRF_LOG_INFO("%d %d %d ", day, month, year); @@ -40,7 +41,17 @@ void DateTime::SetTime( NRF_LOG_INFO("* %d %d %d ", this->hour, this->minute, this->second); NRF_LOG_INFO("* %d %d %d ", this->day, this->month, this->year); - systemTask->PushMessage(System::Messages::OnNewTime); + decltype(currentDateTime - previousDateTime) timeDifference; + + if (currentDateTime > previousDateTime) { + timeDifference = currentDateTime - previousDateTime; + } else { + timeDifference = previousDateTime - currentDateTime; + } + + using namespace std::chrono_literals; + + systemTask->PushMessage(timeDifference < 3h ? System::Messages::OnAdjustTime : System::Messages::OnNewTime); } void DateTime::UpdateTime(uint32_t systickCounter) { @@ -129,16 +140,16 @@ std::string DateTime::FormattedTime() { // Return time as a string in 12- or 24-hour format char buff[9]; if (settingsController.GetClockType() == ClockType::H12) { - uint8_t hour12; - const char* amPmStr; - if (hour < 12) { - hour12 = (hour == 0) ? 12 : hour; - amPmStr = "AM"; - } else { - hour12 = (hour == 12) ? 12 : hour - 12; - amPmStr = "PM"; - } - sprintf(buff, "%i:%02i %s", hour12, minute, amPmStr); + uint8_t hour12; + const char* amPmStr; + if (hour < 12) { + hour12 = (hour == 0) ? 12 : hour; + amPmStr = "AM"; + } else { + hour12 = (hour == 12) ? 12 : hour - 12; + amPmStr = "PM"; + } + sprintf(buff, "%i:%02i %s", hour12, minute, amPmStr); } else { sprintf(buff, "%02i:%02i", hour, minute); } diff --git a/src/systemtask/Messages.h b/src/systemtask/Messages.h index 2e3456a..3648142 100644 --- a/src/systemtask/Messages.h +++ b/src/systemtask/Messages.h @@ -2,36 +2,37 @@ namespace Pinetime { namespace System { - enum class Messages { - GoToSleep, - GoToRunning, - TouchWakeUp, - OnNewTime, - OnNewNotification, - OnTimerDone, - OnNewCall, - BleConnected, - UpdateTimeOut, - BleFirmwareUpdateStarted, - BleFirmwareUpdateFinished, - OnTouchEvent, - HandleButtonEvent, - HandleButtonTimerEvent, - OnDisplayTaskSleeping, - EnableSleeping, - DisableSleeping, - OnNewDay, - OnNewHour, - OnNewHalfHour, - OnChargingEvent, - OnPairing, - SetOffAlarm, - StopRinging, - MeasureBatteryTimerExpired, - BatteryPercentageUpdated, - StartFileTransfer, - StopFileTransfer, - BleRadioEnableToggle - }; - } + enum class Messages { + GoToSleep, + GoToRunning, + TouchWakeUp, + OnNewTime, + OnAdjustTime, + OnNewNotification, + OnTimerDone, + OnNewCall, + BleConnected, + UpdateTimeOut, + BleFirmwareUpdateStarted, + BleFirmwareUpdateFinished, + OnTouchEvent, + HandleButtonEvent, + HandleButtonTimerEvent, + OnDisplayTaskSleeping, + EnableSleeping, + DisableSleeping, + OnNewDay, + OnNewHour, + OnNewHalfHour, + OnChargingEvent, + OnPairing, + SetOffAlarm, + StopRinging, + MeasureBatteryTimerExpired, + BatteryPercentageUpdated, + StartFileTransfer, + StopFileTransfer, + BleRadioEnableToggle + }; + } } diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 7e34b23..760f216 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -284,9 +284,12 @@ void SystemTask::Work() { heartRateApp.PushMessage(Pinetime::Applications::HeartRateTask::Messages::GoToSleep); break; case Messages::OnNewTime: + case Messages::OnAdjustTime: ReloadIdleTimer(); displayApp.PushMessage(Pinetime::Applications::Display::Messages::UpdateDateTime); - if (alarmController.State() == Controllers::AlarmController::AlarmState::Set) { + if (message == Messages::OnAdjustTime) { + alarmController.OnAdjustTime(); + } else { alarmController.ScheduleAlarm(); } break; |
