From 6f1b50a4cc6c232ee505a543f006abb1c6cd33cf Mon Sep 17 00:00:00 2001 From: Benji Dial Date: Fri, 19 Feb 2021 23:41:56 -0500 Subject: rtc fixes, time command --- src/user/knob/time.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/user/knob/time.c (limited to 'src/user/knob/time.c') diff --git a/src/user/knob/time.c b/src/user/knob/time.c new file mode 100644 index 0000000..e3bbb08 --- /dev/null +++ b/src/user/knob/time.c @@ -0,0 +1,57 @@ +#include +#include +#include + +uint8_t days_in_months[] = { + 31, 0, 31, 30, + 31, 30, 31, 31, + 30, 31, 30, 31 +}; + +struct time get_time() { + struct time t; + + const uint32_t ts = _get_timestamp(); + t.timestamp = ts; + + const uint32_t time_part = ts % 86400; + t.hour = time_part / 3600; + t.minute = (time_part / 60) % 60; + t.second = time_part % 60; + + uint32_t days = ts / 86400; + + uint32_t year = 2000; + while (days >= 1461) { + year += 4; + days -= 1461; + } + + days_in_months[1] = 28; + if (days >= 1096) { + t.year = year += 3; + days -= 1096; + } + else if (days >= 731) { + t.year = year += 2; + days -= 731; + } + else if (days >= 366) { + t.year = ++year; + days -= 366; + } + else { + t.year = year; + days_in_months[1] = 29; + } + + uint8_t m = 0; + while (days >= days_in_months[m]) { + days -= days_in_months[m]; + ++m; + } + + t.month = m + 1; + t.day = days + 1; + return t; +} \ No newline at end of file -- cgit v1.2.3