@@ -182,6 +182,7 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_select_select_obj, 3, 4, select_select);
182182typedef struct _mp_obj_poll_t {
183183 mp_obj_base_t base ;
184184 mp_map_t poll_map ;
185+ int flags ;
185186} mp_obj_poll_t ;
186187
187188/// \method register(obj[, eventmask])
@@ -219,9 +220,7 @@ STATIC mp_obj_t poll_modify(mp_obj_t self_in, mp_obj_t obj_in, mp_obj_t eventmas
219220}
220221MP_DEFINE_CONST_FUN_OBJ_3 (poll_modify_obj , poll_modify );
221222
222- /// \method poll([timeout])
223- /// Timeout is in milliseconds.
224- STATIC mp_obj_t poll_poll (uint n_args , const mp_obj_t * args ) {
223+ STATIC mp_uint_t poll_poll_internal (uint n_args , const mp_obj_t * args ) {
225224 mp_obj_poll_t * self = args [0 ];
226225
227226 // work out timeout (its given already in ms)
@@ -239,33 +238,44 @@ STATIC mp_obj_t poll_poll(uint n_args, const mp_obj_t *args) {
239238 }
240239 }
241240
241+ self -> flags = flags ;
242+
242243 mp_uint_t start_tick = mp_hal_ticks_ms ();
244+ mp_uint_t n_ready ;
243245 for (;;) {
244246 // poll the objects
245- mp_uint_t n_ready = poll_map_poll (& self -> poll_map , NULL );
246-
247+ n_ready = poll_map_poll (& self -> poll_map , NULL );
247248 if (n_ready > 0 || (timeout != -1 && mp_hal_ticks_ms () - start_tick >= timeout )) {
248- // one or more objects are ready, or we had a timeout
249- mp_obj_list_t * ret_list = mp_obj_new_list (n_ready , NULL );
250- n_ready = 0 ;
251- for (mp_uint_t i = 0 ; i < self -> poll_map .alloc ; ++ i ) {
252- if (!MP_MAP_SLOT_IS_FILLED (& self -> poll_map , i )) {
253- continue ;
254- }
255- poll_obj_t * poll_obj = (poll_obj_t * )self -> poll_map .table [i ].value ;
256- if (poll_obj -> flags_ret != 0 ) {
257- mp_obj_t tuple [2 ] = {poll_obj -> obj , MP_OBJ_NEW_SMALL_INT (poll_obj -> flags_ret )};
258- ret_list -> items [n_ready ++ ] = mp_obj_new_tuple (2 , tuple );
259- if (flags & FLAG_ONESHOT ) {
260- // Don't poll next time, until new event flags will be set explicitly
261- poll_obj -> flags = 0 ;
262- }
263- }
264- }
265- return ret_list ;
249+ break ;
266250 }
267251 MICROPY_EVENT_POLL_HOOK
268252 }
253+
254+ return n_ready ;
255+ }
256+
257+ STATIC mp_obj_t poll_poll (uint n_args , const mp_obj_t * args ) {
258+ mp_obj_poll_t * self = args [0 ];
259+ mp_uint_t n_ready = poll_poll_internal (n_args , args );
260+
261+ // one or more objects are ready, or we had a timeout
262+ mp_obj_list_t * ret_list = mp_obj_new_list (n_ready , NULL );
263+ n_ready = 0 ;
264+ for (mp_uint_t i = 0 ; i < self -> poll_map .alloc ; ++ i ) {
265+ if (!MP_MAP_SLOT_IS_FILLED (& self -> poll_map , i )) {
266+ continue ;
267+ }
268+ poll_obj_t * poll_obj = (poll_obj_t * )self -> poll_map .table [i ].value ;
269+ if (poll_obj -> flags_ret != 0 ) {
270+ mp_obj_t tuple [2 ] = {poll_obj -> obj , MP_OBJ_NEW_SMALL_INT (poll_obj -> flags_ret )};
271+ ret_list -> items [n_ready ++ ] = mp_obj_new_tuple (2 , tuple );
272+ if (self -> flags & FLAG_ONESHOT ) {
273+ // Don't poll next time, until new event flags will be set explicitly
274+ poll_obj -> flags = 0 ;
275+ }
276+ }
277+ }
278+ return ret_list ;
269279}
270280MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (poll_poll_obj , 1 , 3 , poll_poll );
271281
0 commit comments