2525 */
2626
2727#include "py/mpconfig.h"
28- #if MICROPY_PY_UTIME
29-
3028#include <unistd.h>
3129#include <errno.h>
3230#include <string.h>
3937#include "py/mphal.h"
4038#include "extmod/utime_mphal.h"
4139
42- #ifdef _WIN32
4340static inline int msec_sleep_tv (struct timeval * tv ) {
44- msec_sleep (tv -> tv_sec * 1000.0 + tv -> tv_usec / 1000.0 );
41+ usleep (tv -> tv_sec * 1000000 + tv -> tv_usec );
4542 return 0 ;
4643}
47- #define sleep_select (a ,b ,c ,d ,e ) msec_sleep_tv((e))
48- #else
49- #define sleep_select select
50- #endif
51-
52- // mingw32 defines CLOCKS_PER_SEC as ((clock_t)<somevalue>) but preprocessor does not handle casts
53- #if defined(__MINGW32__ ) && !defined(__MINGW64_VERSION_MAJOR )
54- #define MP_REMOVE_BRACKETSA (x )
55- #define MP_REMOVE_BRACKETSB (x ) MP_REMOVE_BRACKETSA x
56- #define MP_REMOVE_BRACKETSC (x ) MP_REMOVE_BRACKETSB x
57- #define MP_CLOCKS_PER_SEC MP_REMOVE_BRACKETSC(CLOCKS_PER_SEC)
58- #else
59- #define MP_CLOCKS_PER_SEC CLOCKS_PER_SEC
60- #endif
61-
62- #if defined(MP_CLOCKS_PER_SEC )
63- #define CLOCK_DIV (MP_CLOCKS_PER_SEC / 1000.0F)
64- #else
65- #error Unsupported clock() implementation
66- #endif
6744
6845STATIC mp_obj_t mod_time_time (void ) {
69- #if MICROPY_PY_BUILTINS_FLOAT
70- struct timeval tv ;
71- gettimeofday (& tv , NULL );
72- mp_float_t val = tv .tv_sec + (mp_float_t )tv .tv_usec / 1000000 ;
73- return mp_obj_new_float (val );
74- #else
7546 return mp_obj_new_int ((mp_int_t )time (NULL ));
76- #endif
7747}
7848STATIC MP_DEFINE_CONST_FUN_OBJ_0 (mod_time_time_obj , mod_time_time );
7949
80- // Note: this is deprecated since CPy3.3, but pystone still uses it.
81- STATIC mp_obj_t mod_time_clock (void ) {
82- #if MICROPY_PY_BUILTINS_FLOAT
83- // float cannot represent full range of int32 precisely, so we pre-divide
84- // int to reduce resolution, and then actually do float division hoping
85- // to preserve integer part resolution.
86- return mp_obj_new_float ((float )(clock () / 1000 ) / CLOCK_DIV );
87- #else
88- return mp_obj_new_int ((mp_int_t )clock ());
89- #endif
90- }
91- STATIC MP_DEFINE_CONST_FUN_OBJ_0 (mod_time_clock_obj , mod_time_clock );
92-
9350STATIC mp_obj_t mod_time_sleep (mp_obj_t arg ) {
94- #if MICROPY_PY_BUILTINS_FLOAT
95- struct timeval tv ;
96- mp_float_t val = mp_obj_get_float (arg );
97- double ipart ;
98- tv .tv_usec = round (modf (val , & ipart ) * 1000000 );
99- tv .tv_sec = ipart ;
100- int res ;
101- while (1 ) {
102- MP_THREAD_GIL_EXIT ();
103- res = sleep_select (0 , NULL , NULL , NULL , & tv );
104- MP_THREAD_GIL_ENTER ();
105- #if MICROPY_SELECT_REMAINING_TIME
106- // TODO: This assumes Linux behavior of modifying tv to the remaining
107- // time.
108- if (res != -1 || errno != EINTR ) {
109- break ;
110- }
111- if (MP_STATE_VM (mp_pending_exception ) != MP_OBJ_NULL ) {
112- return mp_const_none ;
113- }
114- //printf("select: EINTR: %ld:%ld\n", tv.tv_sec, tv.tv_usec);
115- #else
116- break ;
117- #endif
118- }
119- RAISE_ERRNO (res , errno );
120- #else
121- // TODO: Handle EINTR
12251 MP_THREAD_GIL_EXIT ();
12352 sleep (mp_obj_get_int (arg ));
12453 MP_THREAD_GIL_ENTER ();
125- #endif
12654 return mp_const_none ;
12755}
12856STATIC MP_DEFINE_CONST_FUN_OBJ_1 (mod_time_sleep_obj , mod_time_sleep );
@@ -145,16 +73,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_time_strftime_obj, 1, 2, mod_time
14573
14674STATIC const mp_rom_map_elem_t mp_module_time_globals_table [] = {
14775 { MP_ROM_QSTR (MP_QSTR___name__ ), MP_ROM_QSTR (MP_QSTR_utime ) },
148- { MP_ROM_QSTR (MP_QSTR_clock ), MP_ROM_PTR (& mod_time_clock_obj ) },
14976 { MP_ROM_QSTR (MP_QSTR_sleep ), MP_ROM_PTR (& mod_time_sleep_obj ) },
150- { MP_ROM_QSTR (MP_QSTR_sleep_ms ), MP_ROM_PTR (& mp_utime_sleep_ms_obj ) },
151- { MP_ROM_QSTR (MP_QSTR_sleep_us ), MP_ROM_PTR (& mp_utime_sleep_us_obj ) },
15277 { MP_ROM_QSTR (MP_QSTR_time ), MP_ROM_PTR (& mod_time_time_obj ) },
153- { MP_ROM_QSTR (MP_QSTR_ticks_ms ), MP_ROM_PTR (& mp_utime_ticks_ms_obj ) },
154- { MP_ROM_QSTR (MP_QSTR_ticks_us ), MP_ROM_PTR (& mp_utime_ticks_us_obj ) },
155- { MP_ROM_QSTR (MP_QSTR_ticks_cpu ), MP_ROM_PTR (& mp_utime_ticks_cpu_obj ) },
156- { MP_ROM_QSTR (MP_QSTR_ticks_add ), MP_ROM_PTR (& mp_utime_ticks_add_obj ) },
157- { MP_ROM_QSTR (MP_QSTR_ticks_diff ), MP_ROM_PTR (& mp_utime_ticks_diff_obj ) },
15878 { MP_ROM_QSTR (MP_QSTR_strftime ), MP_ROM_PTR (& mod_time_strftime_obj ) },
15979};
16080
@@ -165,4 +85,3 @@ const mp_obj_module_t mp_module_time = {
16585 .globals = (mp_obj_dict_t * )& mp_module_time_globals ,
16686};
16787
168- #endif // MICROPY_PY_UTIME
0 commit comments