diff options
author | JF <jf@codingfield.com> | 2020-01-31 20:01:33 +0100 |
---|---|---|
committer | JF <jf@codingfield.com> | 2020-01-31 20:01:33 +0100 |
commit | be7be86033164ba20c2f92e0dae9677adbd42025 (patch) | |
tree | ebcdecb992e2e3728544a7900bfb1d9a2c6eb293 /src/Components/DateTime/DateTimeController.cpp | |
parent | dff0d747c4252c17be182d4b25c4342b778ca65a (diff) |
Improve clock accuraty and reduce clock drifting over time (before : 1/2h per day, now : 0 minutes in 24h).
Diffstat (limited to 'src/Components/DateTime/DateTimeController.cpp')
-rw-r--r-- | src/Components/DateTime/DateTimeController.cpp | 15 |
1 files changed, 13 insertions, 2 deletions
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<date::days>(currentDateTime); auto time = date::make_time(currentDateTime-dp); |