Ersa Wearable Platform
Embedded smartwatch firmware and application framework
Loading...
Searching...
No Matches
calendar_time.h
Go to the documentation of this file.
1#pragma once
2
3#include <stdint.h>
4#include <stdio.h>
5#include <string.h>
6#include <time.h>
7
8namespace ersa::common {
9
12public:
14 constexpr CalendarTime() = default;
16 constexpr CalendarTime(uint16_t y, uint8_t m, uint8_t d, uint8_t h, uint8_t min, uint8_t s)
17 : year_(y), month_(m), day_(d), hour_(h), minute_(min), second_(s) {}
19 explicit CalendarTime(uint32_t epoch) { fromEpoch(epoch); }
21 CalendarTime(const char* date, const char* time) { fromBuildStrings(date, time); }
22
23 constexpr uint16_t year() const { return year_; }
24 constexpr uint8_t month() const { return month_; }
25 constexpr uint8_t day() const { return day_; }
26 constexpr uint8_t hour() const { return hour_; }
27 constexpr uint8_t minute() const { return minute_; }
28 constexpr uint8_t second() const { return second_; }
29 constexpr bool isValid() const {
30 return year_ >= 2000 && year_ <= 2199 && month_ >= 1 && month_ <= 12 &&
31 day_ >= 1 && day_ <= daysInMonth(year_, month_) && hour_ <= 23 &&
32 minute_ <= 59 && second_ <= 59;
33 }
36 uint8_t dayOfTheWeek() const;
39 uint32_t unixtime() const;
40
41private:
42 static constexpr bool leap(uint16_t y) {
43 return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0);
44 }
45 static constexpr uint8_t daysInMonth(uint16_t y, uint8_t m) {
46 return m == 2 ? (leap(y) ? 29 : 28) :
47 (m == 4 || m == 6 || m == 9 || m == 11 ? 30 : 31);
48 }
49 int64_t daysSinceEpoch() const;
50 void fromEpoch(uint32_t epoch) {
51 const time_t raw = static_cast<time_t>(epoch);
52 struct tm value{};
53 if (!gmtime_r(&raw, &value)) return;
54 year_ = static_cast<uint16_t>(value.tm_year + 1900);
55 month_ = static_cast<uint8_t>(value.tm_mon + 1);
56 day_ = static_cast<uint8_t>(value.tm_mday);
57 hour_ = static_cast<uint8_t>(value.tm_hour);
58 minute_ = static_cast<uint8_t>(value.tm_min);
59 second_ = static_cast<uint8_t>(value.tm_sec);
60 }
61 void fromBuildStrings(const char* date, const char* time) {
62 if (!date || !time) return;
63 static constexpr const char* months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
64 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
65 char monthName[4]{};
66 unsigned d = 0, y = 0, h = 0, m = 0, s = 0;
67 if (sscanf(date, "%3s %u %u", monthName, &d, &y) != 3 ||
68 sscanf(time, "%u:%u:%u", &h, &m, &s) != 3) return;
69 for (uint8_t i = 0; i < 12; ++i) {
70 if (strcmp(monthName, months[i]) == 0) {
71 year_ = static_cast<uint16_t>(y); month_ = static_cast<uint8_t>(i + 1);
72 day_ = static_cast<uint8_t>(d); hour_ = static_cast<uint8_t>(h);
73 minute_ = static_cast<uint8_t>(m); second_ = static_cast<uint8_t>(s);
74 return;
75 }
76 }
77 }
78
80 uint8_t month_{0}, day_{0}, hour_{0}, minute_{0}, second_{0};
81};
82
83} // namespace ersa::common
84
Definition calendar_time.h:11
uint8_t month_
Definition calendar_time.h:80
constexpr uint8_t minute() const
Definition calendar_time.h:27
uint8_t dayOfTheWeek() const
Definition calendar_time.cpp:17
CalendarTime(uint32_t epoch)
Definition calendar_time.h:19
constexpr uint8_t hour() const
Definition calendar_time.h:26
uint16_t year_
Definition calendar_time.h:79
constexpr uint8_t day() const
Definition calendar_time.h:25
uint8_t minute_
Definition calendar_time.h:80
static constexpr uint8_t daysInMonth(uint16_t y, uint8_t m)
Definition calendar_time.h:45
constexpr uint8_t second() const
Definition calendar_time.h:28
uint8_t day_
Definition calendar_time.h:80
uint8_t hour_
Definition calendar_time.h:80
constexpr CalendarTime(uint16_t y, uint8_t m, uint8_t d, uint8_t h, uint8_t min, uint8_t s)
Definition calendar_time.h:16
CalendarTime(const char *date, const char *time)
Definition calendar_time.h:21
uint32_t unixtime() const
Definition calendar_time.cpp:22
static constexpr bool leap(uint16_t y)
Definition calendar_time.h:42
constexpr CalendarTime()=default
constexpr uint16_t year() const
Definition calendar_time.h:23
void fromBuildStrings(const char *date, const char *time)
Definition calendar_time.h:61
constexpr bool isValid() const
Definition calendar_time.h:29
void fromEpoch(uint32_t epoch)
Definition calendar_time.h:50
int64_t daysSinceEpoch() const
Definition calendar_time.cpp:5
uint8_t second_
Definition calendar_time.h:80
constexpr uint8_t month() const
Definition calendar_time.h:24
Definition calendar_time.h:8