diff options
Diffstat (limited to 'src/components/datetime')
| -rw-r--r-- | src/components/datetime/DateTimeController.cpp | 43 | ||||
| -rw-r--r-- | src/components/datetime/DateTimeController.h | 19 |
2 files changed, 32 insertions, 30 deletions
diff --git a/src/components/datetime/DateTimeController.cpp b/src/components/datetime/DateTimeController.cpp index 2656764..3d7df5a 100644 --- a/src/components/datetime/DateTimeController.cpp +++ b/src/components/datetime/DateTimeController.cpp @@ -14,7 +14,7 @@ namespace { DateTime::DateTime(Controllers::Settings& settingsController) : settingsController {settingsController} { } -void DateTime::SetCurrentTime(std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> t) { +void DateTime::SetCurrentTime(std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds> t) { this->currentDateTime = t; UpdateTime(previousSystickCounter); // Update internal state without updating the time } @@ -31,7 +31,7 @@ void DateTime::SetTime( }; 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)); + currentDateTime = std::chrono::time_point_cast<std::chrono::seconds>(std::chrono::system_clock::from_time_t(std::mktime(&tm))); NRF_LOG_INFO("%d %d %d ", day, month, year); NRF_LOG_INFO("%d %d %d ", hour, minute, second); @@ -39,7 +39,7 @@ void DateTime::SetTime( UpdateTime(systickCounter); NRF_LOG_INFO("* %d %d %d ", this->hour, this->minute, this->second); - NRF_LOG_INFO("* %d %d %d ", this->day, this->month, this->year); + NRF_LOG_INFO("* %d %d %d ", this->day, ((int)this->month), this->year); decltype(currentDateTime - previousDateTime) timeDifference; @@ -56,27 +56,20 @@ void DateTime::SetTime( void DateTime::UpdateTime(uint32_t systickCounter) { // Handle systick counter overflow - uint32_t systickDelta = 0; - if (systickCounter < previousSystickCounter) { - systickDelta = 0xffffff - previousSystickCounter; - systickDelta += systickCounter + 1; - } else { - systickDelta = systickCounter - previousSystickCounter; - } + uint32_t systickDelta = (systickCounter - previousSystickCounter) & 0xffffff; + previousSystickCounter = systickCounter; /* * 1000 ms = 1024 ticks */ - auto correctedDelta = systickDelta / 1024; - auto rest = (systickDelta - (correctedDelta * 1024)); - if (systickCounter >= rest) { - previousSystickCounter = systickCounter - rest; - } else { - previousSystickCounter = 0xffffff - (rest - systickCounter); - } + // auto newSeconds = systickDelta >> 10; + // auto rest = systickDelta & ((1 << 10)-1); + subsecondTicks += systickDelta & ((1 << 10)-1); + systickDelta = (systickDelta >> 10) + (subsecondTicks >> 10); + subsecondTicks &= ((1 << 10)-1); - currentDateTime += std::chrono::seconds(correctedDelta); - uptime += std::chrono::seconds(correctedDelta); + currentDateTime += std::chrono::seconds(systickDelta); + uptime += std::chrono::seconds(systickDelta); auto dp = date::floor<date::days>(currentDateTime); auto time = date::make_time(currentDateTime - dp); @@ -100,15 +93,15 @@ void DateTime::UpdateTime(uint32_t systickCounter) { isHourAlreadyNotified = false; } - if ((minute == 0 || minute == 30) && !isHalfHourAlreadyNotified) { - isHalfHourAlreadyNotified = true; + if (minute%chimePeriod) { + hasChimed = false; + } else if (!hasChimed) { if (systemTask != nullptr) { - systemTask->PushMessage(System::Messages::OnNewHalfHour); + systemTask->PushMessage(System::Messages::OnChime); + hasChimed = true; } - } else if (minute != 0 && minute != 30) { - isHalfHourAlreadyNotified = false; } - + // Notify new day to SystemTask if (hour == 0 and not isMidnightAlreadyNotified) { isMidnightAlreadyNotified = true; diff --git a/src/components/datetime/DateTimeController.h b/src/components/datetime/DateTimeController.h index 00bbc2e..ca7320c 100644 --- a/src/components/datetime/DateTimeController.h +++ b/src/components/datetime/DateTimeController.h @@ -60,12 +60,17 @@ namespace Pinetime { uint8_t Seconds() const { return second; } + uint8_t Deciseconds() const { + uint16_t x = subsecondTicks; + x *= 10; + return x >> 10; + } const char* MonthShortToString() const; const char* DayOfWeekShortToString() const; static const char* MonthShortToStringLow(Months month); - std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> CurrentDateTime() const { + std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds> CurrentDateTime() const { return currentDateTime; } std::chrono::seconds Uptime() const { @@ -73,7 +78,7 @@ namespace Pinetime { } void Register(System::SystemTask* systemTask); - void SetCurrentTime(std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> t); + void SetCurrentTime(std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds> t); std::string FormattedTime(); private: @@ -84,14 +89,18 @@ namespace Pinetime { uint8_t hour = 0; uint8_t minute = 0; uint8_t second = 0; + uint16_t subsecondTicks = 0; - uint32_t previousSystickCounter = 0; - std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> currentDateTime; + uint32_t previousSystickCounter = 0; // FIXME: This could probably be 16 bits? + std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds> currentDateTime; std::chrono::seconds uptime {0}; bool isMidnightAlreadyNotified = false; bool isHourAlreadyNotified = true; - bool isHalfHourAlreadyNotified = true; + bool hasChimed = true; + public: + uint8_t chimePeriod = 5; + private: System::SystemTask* systemTask = nullptr; Controllers::Settings& settingsController; }; |
