summaryrefslogtreecommitdiff
path: root/src/components/datetime
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/datetime')
-rw-r--r--src/components/datetime/DateTimeController.cpp6
-rw-r--r--src/components/datetime/DateTimeController.h53
2 files changed, 59 insertions, 0 deletions
diff --git a/src/components/datetime/DateTimeController.cpp b/src/components/datetime/DateTimeController.cpp
index 4dc16329..8aab49ec 100644
--- a/src/components/datetime/DateTimeController.cpp
+++ b/src/components/datetime/DateTimeController.cpp
@@ -36,6 +36,7 @@ void DateTime::SetTime(uint16_t year,
/* .tm_mon = */ month - 1,
/* .tm_year = */ year - 1900,
};
+
tm.tm_isdst = -1; // Use DST value from local time zone
currentDateTime = std::chrono::system_clock::from_time_t(std::mktime(&tm));
@@ -50,6 +51,11 @@ void DateTime::SetTime(uint16_t year,
systemTask->PushMessage(System::Messages::OnNewTime);
}
+void DateTime::SetTimeZone(uint8_t timezone, uint8_t dst) {
+ tzOffset = timezone;
+ dstOffset = dst;
+}
+
void DateTime::UpdateTime(uint32_t systickCounter) {
// Handle systick counter overflow
uint32_t systickDelta = 0;
diff --git a/src/components/datetime/DateTimeController.h b/src/components/datetime/DateTimeController.h
index 81319d15..681bafbf 100644
--- a/src/components/datetime/DateTimeController.h
+++ b/src/components/datetime/DateTimeController.h
@@ -38,6 +38,18 @@ namespace Pinetime {
uint8_t minute,
uint8_t second,
uint32_t systickCounter);
+
+ /*
+ * setter corresponding to the BLE Set Local Time characteristic.
+ *
+ * used to update difference between utc and local time (see UtcOffset())
+ *
+ * parameters are in quarters of an our. Following the BLE CTS specification,
+ * timezone is expected to be constant over DST which will be reported in
+ * dst field.
+ */
+ void SetTimeZone(uint8_t timezone, uint8_t dst);
+
void UpdateTime(uint32_t systickCounter);
uint16_t Year() const {
return year;
@@ -61,6 +73,42 @@ namespace Pinetime {
return second;
}
+ /*
+ * returns the offset between local time and UTC in quarters of an hour
+ *
+ * Availability of this field depends on wether the companion app
+ * supports the BLE CTS Local Time Characteristic. Expect it to be 0
+ * if not.
+ */
+ uint8_t UtcOffset() const {
+ return tzOffset + dstOffset;
+ }
+
+ /*
+ * returns the offset between the (dst independent) local time zone and UTC
+ * in quarters of an hour
+ *
+ * Availability of this field depends on wether the companion app
+ * supports the BLE CTS Local Time Characteristic. Expect it to be 0
+ * if not.
+ */
+ uint8_t TzOffset() const {
+ return tzOffset;
+ }
+
+ /*
+ * returns the offset between the local time zone and local time
+ * in quarters of an hour
+ * if != 0, DST is in effect, if == 0 not.
+ *
+ * Availability of this field depends on wether the companion app
+ * supports the BLE CTS Local Time Characteristic. Expect it to be 0
+ * if not.
+ */
+ uint8_t DstOffset() const {
+ return dstOffset;
+ }
+
const char* MonthShortToString() const;
const char* DayOfWeekShortToString() const;
static const char* MonthShortToStringLow(Months month);
@@ -69,6 +117,9 @@ namespace Pinetime {
std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> CurrentDateTime() const {
return currentDateTime;
}
+ std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> UTCDateTime() const {
+ return currentDateTime - std::chrono::seconds((tzOffset + dstOffset) * 15 * 60);
+ }
std::chrono::seconds Uptime() const {
return uptime;
}
@@ -85,6 +136,8 @@ namespace Pinetime {
uint8_t hour = 0;
uint8_t minute = 0;
uint8_t second = 0;
+ uint8_t tzOffset = 0;
+ uint8_t dstOffset = 0;
uint32_t previousSystickCounter = 0;
std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> currentDateTime;