@@ -62,6 +62,7 @@ mp_obj_t mpcallback_new (mp_obj_t parent, mp_obj_t handler, const mp_cb_methods_
6262 self -> handler = handler ;
6363 self -> parent = parent ;
6464 self -> methods = (mp_cb_methods_t * )methods ;
65+ self -> isenabled = true;
6566 // remove any old callback if present
6667 mpcallback_remove (self -> parent );
6768 mp_obj_list_append (& MP_STATE_PORT (mpcallback_obj_list ), self );
@@ -79,6 +80,16 @@ mpcallback_obj_t *mpcallback_find (mp_obj_t parent) {
7980 return NULL ;
8081}
8182
83+ void mpcallback_wake_all (void ) {
84+ // re-enable all active callback objects one by one
85+ for (mp_uint_t i = 0 ; i < MP_STATE_PORT (mpcallback_obj_list ).len ; i ++ ) {
86+ mpcallback_obj_t * callback_obj = ((mpcallback_obj_t * )(MP_STATE_PORT (mpcallback_obj_list ).items [i ]));
87+ if (callback_obj -> isenabled ) {
88+ callback_obj -> methods -> enable (callback_obj -> parent );
89+ }
90+ }
91+ }
92+
8293void mpcallback_remove (const mp_obj_t parent ) {
8394 mpcallback_obj_t * callback_obj ;
8495 if ((callback_obj = mpcallback_find (parent ))) {
@@ -158,6 +169,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(callback_init_obj, 1, callback_init);
158169STATIC mp_obj_t callback_enable (mp_obj_t self_in ) {
159170 mpcallback_obj_t * self = self_in ;
160171 self -> methods -> enable (self -> parent );
172+ self -> isenabled = true;
161173 return mp_const_none ;
162174}
163175STATIC MP_DEFINE_CONST_FUN_OBJ_1 (callback_enable_obj , callback_enable );
@@ -167,6 +179,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(callback_enable_obj, callback_enable);
167179STATIC mp_obj_t callback_disable (mp_obj_t self_in ) {
168180 mpcallback_obj_t * self = self_in ;
169181 self -> methods -> disable (self -> parent );
182+ self -> isenabled = false;
170183 return mp_const_none ;
171184}
172185STATIC MP_DEFINE_CONST_FUN_OBJ_1 (callback_disable_obj , callback_disable );
0 commit comments