3030#include <string.h>
3131#include <sys/time.h>
3232
33+ #include "py/runtime.h"
34+ #include "lib/timeutils/timeutils.h"
3335#include "extmod/utime_mphal.h"
3436
37+ STATIC mp_obj_t time_localtime (size_t n_args , const mp_obj_t * args ) {
38+ timeutils_struct_time_t tm ;
39+ mp_int_t seconds ;
40+ if (n_args == 0 || args [0 ] == mp_const_none ) {
41+ struct timeval tv ;
42+ gettimeofday (& tv , NULL );
43+ seconds = tv .tv_sec ;
44+ } else {
45+ seconds = mp_obj_get_int (args [0 ]);
46+ }
47+ timeutils_seconds_since_2000_to_struct_time (seconds , & tm );
48+ mp_obj_t tuple [8 ] = {
49+ tuple [0 ] = mp_obj_new_int (tm .tm_year ),
50+ tuple [1 ] = mp_obj_new_int (tm .tm_mon ),
51+ tuple [2 ] = mp_obj_new_int (tm .tm_mday ),
52+ tuple [3 ] = mp_obj_new_int (tm .tm_hour ),
53+ tuple [4 ] = mp_obj_new_int (tm .tm_min ),
54+ tuple [5 ] = mp_obj_new_int (tm .tm_sec ),
55+ tuple [6 ] = mp_obj_new_int (tm .tm_wday ),
56+ tuple [7 ] = mp_obj_new_int (tm .tm_yday ),
57+ };
58+ return mp_obj_new_tuple (8 , tuple );
59+ }
60+ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (time_localtime_obj , 0 , 1 , time_localtime );
61+
62+ STATIC mp_obj_t time_mktime (mp_obj_t tuple ) {
63+ size_t len ;
64+ mp_obj_t * elem ;
65+ mp_obj_get_array (tuple , & len , & elem );
66+
67+ // localtime generates a tuple of len 8. CPython uses 9, so we accept both.
68+ if (len < 8 || len > 9 ) {
69+ nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_TypeError , "mktime needs a tuple of length 8 or 9 (%d given)" , len ));
70+ }
71+
72+ return mp_obj_new_int_from_uint (timeutils_mktime (mp_obj_get_int (elem [0 ]),
73+ mp_obj_get_int (elem [1 ]), mp_obj_get_int (elem [2 ]), mp_obj_get_int (elem [3 ]),
74+ mp_obj_get_int (elem [4 ]), mp_obj_get_int (elem [5 ])));
75+ }
76+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (time_mktime_obj , time_mktime );
77+
3578STATIC mp_obj_t time_time (void ) {
3679 struct timeval tv ;
3780 gettimeofday (& tv , NULL );
@@ -42,6 +85,8 @@ MP_DEFINE_CONST_FUN_OBJ_0(time_time_obj, time_time);
4285STATIC const mp_rom_map_elem_t time_module_globals_table [] = {
4386 { MP_ROM_QSTR (MP_QSTR___name__ ), MP_ROM_QSTR (MP_QSTR_utime ) },
4487
88+ { MP_ROM_QSTR (MP_QSTR_localtime ), MP_ROM_PTR (& time_localtime_obj ) },
89+ { MP_ROM_QSTR (MP_QSTR_mktime ), MP_ROM_PTR (& time_mktime_obj ) },
4590 { MP_ROM_QSTR (MP_QSTR_time ), MP_ROM_PTR (& time_time_obj ) },
4691 { MP_ROM_QSTR (MP_QSTR_sleep ), MP_ROM_PTR (& mp_utime_sleep_obj ) },
4792 { MP_ROM_QSTR (MP_QSTR_sleep_ms ), MP_ROM_PTR (& mp_utime_sleep_ms_obj ) },
0 commit comments