summaryrefslogtreecommitdiff
path: root/src/Components
diff options
context:
space:
mode:
authorJF <jf@codingfield.com>2020-01-18 13:56:25 +0100
committerJF <jf@codingfield.com>2020-01-18 13:56:25 +0100
commitb34ff32f76f355866c3bd267dcc687c0d1958d29 (patch)
treee734a9f9f1048f4230b308772c0c471f8c6ad83f /src/Components
parent8daa830ee0d33d54c0fa98bd30aadf28187d3462 (diff)
DateTimeController is now updated in the system task.
It runs every 1s in Running mode, and every 1h in sleep mode. This should allow to keep the watch on time for more than 4 hours.
Diffstat (limited to 'src/Components')
-rw-r--r--src/Components/DateTime/DateTimeController.cpp58
-rw-r--r--src/Components/DateTime/DateTimeController.h8
2 files changed, 56 insertions, 10 deletions
diff --git a/src/Components/DateTime/DateTimeController.cpp b/src/Components/DateTime/DateTimeController.cpp
index 1c15642e..cd512705 100644
--- a/src/Components/DateTime/DateTimeController.cpp
+++ b/src/Components/DateTime/DateTimeController.cpp
@@ -1,16 +1,56 @@
#include "DateTimeController.h"
+#include <date/date.h>
+#include <libraries/log/nrf_log.h>
using namespace Pinetime::Controllers;
-void DateTime::UpdateTime(uint16_t year, Months month, uint8_t day, Days dayOfWeek, uint8_t hour, uint8_t minute,
- uint8_t second) {
- this->year = year;
- this->month = month;
- this->dayOfWeek = dayOfWeek;
- this->day = day;
- this->hour = hour;
- this->minute = minute;
- this->second = second;
+void DateTime::SetTime(uint16_t year, uint8_t month, uint8_t day, uint8_t dayOfWeek, uint8_t hour, uint8_t minute,
+ uint8_t second, uint32_t systickCounter) {
+
+ currentDateTime = {};
+ currentDateTime += date::years( year-1970);
+ currentDateTime += date::days( day - 1);
+ currentDateTime += date::months( month - 1);
+
+ currentDateTime += std::chrono::hours(hour);
+ currentDateTime += std::chrono::minutes (minute);
+ currentDateTime += std::chrono::seconds (second);
+
+ currentDateTime -= std::chrono::hours(3); // TODO WHYYYY?
+ NRF_LOG_INFO("%d %d %d ", day, month, year);
+ NRF_LOG_INFO("%d %d %d ", hour, minute, second);
+ previousSystickCounter = systickCounter;
+ 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);
+
+
+}
+
+void DateTime::UpdateTime(uint32_t systickCounter) {
+ uint32_t systickDelta = 0;
+ if(systickCounter < previousSystickCounter) {
+ systickDelta = 0xffffff - previousSystickCounter;
+ systickDelta += systickCounter + 1;
+ } else {
+ systickDelta = systickCounter - previousSystickCounter;
+ }
+
+ previousSystickCounter = systickCounter;
+ currentDateTime += std::chrono::milliseconds(systickDelta);
+
+ auto dp = date::floor<date::days>(currentDateTime);
+ auto time = date::make_time(currentDateTime-dp);
+ auto yearMonthDay = date::year_month_day(dp);
+
+ year = (int)yearMonthDay.year();
+ month = static_cast<Months>((unsigned)yearMonthDay.month());
+ day = (unsigned)yearMonthDay.day();
+ dayOfWeek = static_cast<Days>(date::weekday(yearMonthDay).iso_encoding());
+
+ hour = time.hours().count();
+ minute = time.minutes().count();
+ second = time.seconds().count();
}
diff --git a/src/Components/DateTime/DateTimeController.h b/src/Components/DateTime/DateTimeController.h
index edbb46c7..632fafe6 100644
--- a/src/Components/DateTime/DateTimeController.h
+++ b/src/Components/DateTime/DateTimeController.h
@@ -1,6 +1,7 @@
#pragma once
#include <cstdint>
+#include <chrono>
namespace Pinetime {
namespace Controllers {
@@ -9,7 +10,8 @@ namespace Pinetime {
enum class Days : uint8_t {Unknown, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
enum class Months : uint8_t {Unknown, January, February, March, April, May, June, July, August, September, October, November, December};
- void UpdateTime(uint16_t year, Months month, uint8_t day, Days dayOfWeek, uint8_t hour, uint8_t minute, uint8_t second);
+ void SetTime(uint16_t year, uint8_t month, uint8_t day, uint8_t dayOfWeek, uint8_t hour, uint8_t minute, uint8_t second, uint32_t systickCounter);
+ void UpdateTime(uint32_t systickCounter);
uint16_t Year() const { return year; }
Months Month() const { return month; }
uint8_t Day() const { return day; }
@@ -25,6 +27,10 @@ namespace Pinetime {
uint8_t hour = 0;
uint8_t minute = 0;
uint8_t second = 0;
+
+ uint32_t previousSystickCounter = 0;
+ std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> currentDateTime;
+
};
}
} \ No newline at end of file