From be7be86033164ba20c2f92e0dae9677adbd42025 Mon Sep 17 00:00:00 2001 From: JF Date: Fri, 31 Jan 2020 20:01:33 +0100 Subject: Improve clock accuraty and reduce clock drifting over time (before : 1/2h per day, now : 0 minutes in 24h). --- src/Components/DateTime/DateTimeController.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'src/Components/DateTime') diff --git a/src/Components/DateTime/DateTimeController.cpp b/src/Components/DateTime/DateTimeController.cpp index cd512705..ed6d70fb 100644 --- a/src/Components/DateTime/DateTimeController.cpp +++ b/src/Components/DateTime/DateTimeController.cpp @@ -29,6 +29,7 @@ void DateTime::SetTime(uint16_t year, uint8_t month, uint8_t day, uint8_t dayOfW } void DateTime::UpdateTime(uint32_t systickCounter) { + // Handle systick counter overflow uint32_t systickDelta = 0; if(systickCounter < previousSystickCounter) { systickDelta = 0xffffff - previousSystickCounter; @@ -37,8 +38,18 @@ void DateTime::UpdateTime(uint32_t systickCounter) { systickDelta = systickCounter - previousSystickCounter; } - previousSystickCounter = systickCounter; - currentDateTime += std::chrono::milliseconds(systickDelta); + /* + * 1000 ms = 1024 ticks + */ + auto correctedDelta = systickDelta / 1024; + auto rest = (systickDelta - (correctedDelta*1024)); + if(systickCounter >= rest) { + previousSystickCounter = systickCounter - rest; + } else { + previousSystickCounter = 0xffffff - (rest - systickCounter); + } + + currentDateTime += std::chrono::seconds (correctedDelta); auto dp = date::floor(currentDateTime); auto time = date::make_time(currentDateTime-dp); -- cgit v1.2.3