diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 92bb5ade7bbee771bcb7118a7a6233c2e52823fa..1ecdb831c8b12d7ce9dbab8559d8734b978a0908 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -81,6 +81,8 @@ typedef _Bool bool; #define API_RTC_SCHEDULE_ALARM 0x51 #define API_RTC_SET_MILLISECONDS 0x52 #define API_RTC_GET_MILLISECONDS 0x53 +#define API_RTC_GET_MONOTONIC_SECONDS 0x54 +#define API_RTC_GET_MONOTONIC_MILLISECONDS 0x55 #define API_LEDS_SET 0x60 #define API_LEDS_SET_HSV 0x61 @@ -1693,6 +1695,24 @@ API(API_FILE_MKDIR, int epic_file_mkdir(const char *dirname)); * === */ +/** + * Get the monotonic time in seconds. + * + * :return: monotonic time in seconds + */ +API(API_RTC_GET_MONOTONIC_SECONDS, + uint32_t epic_rtc_get_monotonic_seconds(void) +); + +/** + * Get the monotonic time in ms. + * + * :return: monotonic time in milliseconds + */ +API(API_RTC_GET_MONOTONIC_MILLISECONDS, + uint64_t epic_rtc_get_monotonic_milliseconds(void) +); + /** * Read the current RTC value. * diff --git a/epicardium/modules/rtc.c b/epicardium/modules/rtc.c index de1ef70d26653a8b1f2441b8bf6a62a3d0124ef7..b07fb6fcc3925e4a52b80b6f7feb3294dcf181f8 100644 --- a/epicardium/modules/rtc.c +++ b/epicardium/modules/rtc.c @@ -9,6 +9,18 @@ #include <stdint.h> +uint64_t monotonic_offset = 0; + +uint32_t epic_rtc_get_monotonic_seconds(void) +{ + return epic_rtc_get_seconds() + monotonic_offset / 1000ULL; +} + +uint64_t epic_rtc_get_monotonic_milliseconds(void) +{ + return epic_rtc_get_milliseconds() + monotonic_offset; +} + uint32_t epic_rtc_get_seconds(void) { uint32_t sec, subsec; @@ -38,6 +50,9 @@ uint64_t epic_rtc_get_milliseconds(void) void epic_rtc_set_milliseconds(uint64_t milliseconds) { uint32_t sec, subsec; + uint64_t old_milliseconds, new_milliseconds, diff; + + old_milliseconds = epic_rtc_get_milliseconds(); sec = milliseconds / 1000; subsec = (milliseconds % 1000); @@ -48,6 +63,11 @@ void epic_rtc_set_milliseconds(uint64_t milliseconds) ; while (RTC_EnableRTCE(MXC_RTC) == E_BUSY) ; + + new_milliseconds = epic_rtc_get_milliseconds(); + + diff = old_milliseconds - new_milliseconds; + monotonic_offset += diff; } void RTC_IRQHandler(void)