summaryrefslogtreecommitdiff
path: root/src/Components/DateTime
diff options
context:
space:
mode:
authorJF <jf@codingfield.com>2020-01-31 20:01:33 +0100
committerJF <jf@codingfield.com>2020-01-31 20:01:33 +0100
commitbe7be86033164ba20c2f92e0dae9677adbd42025 (patch)
treeebcdecb992e2e3728544a7900bfb1d9a2c6eb293 /src/Components/DateTime
parentdff0d747c4252c17be182d4b25c4342b778ca65a (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')
-rw-r--r--src/Components/DateTime/DateTimeController.cpp15
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);