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 /src | |
| 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)
Diffstat (limited to 'src')
| -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; |
