11import lvgl as lv # NOQA
22import micropython # NOQA
33import sys
4+ import time
45
56try :
67from machine import Timer # NOQA
1112raise RuntimeError ("Missing machine.Timer implementation!" )
1213
1314
15+ TASK_HANDLER_STARTED = 0x00
16+ TASK_HANDLER_FINISHED = 0x01
17+
1418_default_timer_id = 0
1519
1620if sys .platform in ('pyboard' ,'rp2' ):
1721_default_timer_id = - 1
1822
1923
24+ class _DefaultUserData (object ):
25+ pass
26+
27+
2028def _default_exception_hook (e ):
2129sys .print_exception (e )
2230TaskHandler ._current_instance .deinit ()# NOQA
@@ -30,7 +38,6 @@ def __init__(
3038duration = 33 ,
3139timer_id = _default_timer_id ,
3240max_scheduled = 2 ,
33- refresh_cb = None ,
3441exception_hook = _default_exception_hook
3542 ):
3643if TaskHandler ._current_instance is not None :
@@ -41,8 +48,9 @@ def __init__(
4148
4249TaskHandler ._current_instance = self
4350
51+ self ._callbacks = []
52+
4453self .duration = duration
45- self .refresh_cb = refresh_cb
4654self .exception_hook = exception_hook
4755
4856self ._timer = Timer (timer_id )
@@ -58,6 +66,27 @@ def __init__(
5866 )
5967self ._scheduled = 0
6068
69+ def add_event_cb (self ,callback ,event ,user_data = _DefaultUserData ):
70+ for i , (cb ,evt ,data )in enumerate (self ._callbacks ):
71+ if cb == callback :
72+ evt = event
73+ if user_data != _DefaultUserData :
74+ data = user_data
75+
76+ self ._callbacks [i ]= (cb ,evt ,data )
77+ break
78+ else :
79+ if user_data == _DefaultUserData :
80+ user_data = None
81+
82+ self ._callbacks .append ((callback ,event ,user_data ))
83+
84+ def remove_event_cb (self ,callback ):
85+ for i ,obj in self ._callbacks :
86+ if obj [0 ]== callback :
87+ self ._callbacks .remove (obj )
88+ break
89+
6190def deinit (self ):
6291self ._timer .deinit ()
6392TaskHandler ._current_instance = None
@@ -74,13 +103,57 @@ def is_running(cls):
74103
75104def _task_handler (self ,_ ):
76105try :
77- if lv ._nesting .value == 0 :
78- lv .task_handler ()
106+ self ._scheduled -= 1
79107
80- if self .refresh_cb :
81- self .refresh_cb ()
108+ if lv ._nesting .value == 0 :
109+ start_time = time .ticks_ms ()
110+
111+ run_update = True
112+ for cb ,evt ,data in self ._callbacks :
113+ if not evt ^ TASK_HANDLER_STARTED :
114+ continue
115+
116+ try :
117+ if cb (TASK_HANDLER_STARTED ,data )is False :
118+ run_update = False
119+
120+ except Exception as err :# NOQA
121+ if (
122+ self .exception_hook and
123+ self .exception_hook != _default_exception_hook
124+ ):
125+ self .exception_hook (err )
126+ else :
127+ sys .print_exception (err )
128+
129+ stop_time = time .ticks_ms ()
130+
131+ ticks_diff = time .ticks_diff (stop_time ,start_time )
132+ lv .tick_inc (ticks_diff )
133+
134+ if run_update :
135+ lv .task_handler ()
136+ start_time = time .ticks_ms ()
137+
138+ for cb ,evt ,data in self ._callbacks :
139+ if not evt ^ TASK_HANDLER_FINISHED :
140+ continue
141+
142+ try :
143+ cb (TASK_HANDLER_FINISHED ,data )
144+ except Exception as err :# NOQA
145+ if (
146+ self .exception_hook and
147+ self .exception_hook != _default_exception_hook
148+ ):
149+ self .exception_hook (err )
150+ else :
151+ sys .print_exception (err )
152+
153+ stop_time = time .ticks_ms ()
154+ ticks_diff = time .ticks_diff (stop_time ,start_time )
155+ lv .tick_inc (ticks_diff )
82156
83- self ._scheduled -= 1
84157except Exception as e :
85158if self .exception_hook :
86159self .exception_hook (e )