diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index ebf66a9f4a93cb658c79223c059e38d27e998331..68c3ce29f920a530c1f6cc2839413e9a45ca93c4 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -78,6 +78,7 @@ typedef _Bool bool; #define API_RTC_GET_SECONDS 0x50 #define API_RTC_SCHEDULE_ALARM 0x51 #define API_RTC_SET_MILLISECONDS 0x52 +#define API_RTC_GET_MILLISECONDS 0x53 #define API_LEDS_SET 0x60 #define API_LEDS_SET_HSV 0x61 @@ -1565,6 +1566,13 @@ API(API_FILE_MKDIR, int epic_file_mkdir(const char *dirname)); */ API(API_RTC_GET_SECONDS, uint32_t epic_rtc_get_seconds(void)); +/** + * Read the current RTC value. + * + * :return: Unix time in milliseconds + */ +API(API_RTC_GET_MILLISECONDS, uint64_t epic_rtc_get_milliseconds(void)); + /** * Sets the current RTC time in milliseconds */ diff --git a/epicardium/modules/rtc.c b/epicardium/modules/rtc.c index 8aa2e3f650cb236f8cae4de106bbcfaeca004333..de1ef70d26653a8b1f2441b8bf6a62a3d0124ef7 100644 --- a/epicardium/modules/rtc.c +++ b/epicardium/modules/rtc.c @@ -25,6 +25,16 @@ uint32_t epic_rtc_get_seconds(void) return sec; } +uint64_t epic_rtc_get_milliseconds(void) +{ + uint32_t sec, subsec; + + while (RTC_GetTime(&sec, &subsec) == E_BUSY) { + vTaskDelay(pdMS_TO_TICKS(4)); + } + return subsec * 1000ULL / 4096 + sec * 1000ULL; +} + void epic_rtc_set_milliseconds(uint64_t milliseconds) { uint32_t sec, subsec; diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h index e418c24db58105796aa5b2cb34a1d80acd82af3b..6b8ba593fe9f768605c935534f8dedf0c2103d1b 100644 --- a/pycardium/modules/qstrdefs.h +++ b/pycardium/modules/qstrdefs.h @@ -47,6 +47,7 @@ Q(ticks_diff) Q(localtime) Q(mktime) Q(time) +Q(time_ms) Q(set_time) Q(set_unix_time) diff --git a/pycardium/modules/utime.c b/pycardium/modules/utime.c index 4578d9971902cfd1d2a9e7edc0e5d939ad8a5a75..f02972d4934988272e34d84aac3b8737fe0829b4 100644 --- a/pycardium/modules/utime.c +++ b/pycardium/modules/utime.c @@ -42,6 +42,16 @@ static mp_obj_t time_time(void) } MP_DEFINE_CONST_FUN_OBJ_0(time_time_obj, time_time); + +static mp_obj_t time_time_ms(void) +{ + uint64_t milliseconds; + milliseconds = epic_rtc_get_milliseconds() - (EPOCH_OFFSET + TZONE_OFFSET) * 1000ULL; + return mp_obj_new_int_from_ull(milliseconds); +} +MP_DEFINE_CONST_FUN_OBJ_0(time_time_ms_obj, time_time_ms); + + static mp_obj_t time_localtime(size_t n_args, const mp_obj_t *args) { mp_int_t seconds; @@ -120,6 +130,7 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(time_alarm_obj, 1, 2, time_alarm); static const mp_rom_map_elem_t time_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_utime) }, { MP_ROM_QSTR(MP_QSTR_time), MP_ROM_PTR(&time_time_obj) }, + { MP_ROM_QSTR(MP_QSTR_time_ms), MP_ROM_PTR(&time_time_ms_obj) }, { MP_ROM_QSTR(MP_QSTR_set_time), MP_ROM_PTR(&time_set_time_obj) }, { MP_ROM_QSTR(MP_QSTR_set_unix_time), MP_ROM_PTR(&time_set_unix_time_obj) },