1
1
import lvgl as lv # NOQA
2
2
import micropython # NOQA
3
3
import sys
4
+ import time
4
5
5
6
try :
6
7
from machine import Timer # NOQA
11
12
raise RuntimeError ("Missing machine.Timer implementation!" )
12
13
13
14
15
+ TASK_HANDLER_STARTED = 0x00
16
+ TASK_HANDLER_FINISHED = 0x01
17
+
14
18
_default_timer_id = 0
15
19
16
20
if sys .platform in ('pyboard' , 'rp2' ):
17
21
_default_timer_id = - 1
18
22
19
23
24
+ class _DefaultUserData (object ):
25
+ pass
26
+
27
+
20
28
def _default_exception_hook (e ):
21
29
sys .print_exception (e )
22
30
TaskHandler ._current_instance .deinit () # NOQA
@@ -30,7 +38,6 @@ def __init__(
30
38
duration = 33 ,
31
39
timer_id = _default_timer_id ,
32
40
max_scheduled = 2 ,
33
- refresh_cb = None ,
34
41
exception_hook = _default_exception_hook
35
42
):
36
43
if TaskHandler ._current_instance is not None :
@@ -41,8 +48,9 @@ def __init__(
41
48
42
49
TaskHandler ._current_instance = self
43
50
51
+ self ._callbacks = []
52
+
44
53
self .duration = duration
45
- self .refresh_cb = refresh_cb
46
54
self .exception_hook = exception_hook
47
55
48
56
self ._timer = Timer (timer_id )
@@ -58,6 +66,27 @@ def __init__(
58
66
)
59
67
self ._scheduled = 0
60
68
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
+
61
90
def deinit (self ):
62
91
self ._timer .deinit ()
63
92
TaskHandler ._current_instance = None
@@ -74,13 +103,57 @@ def is_running(cls):
74
103
75
104
def _task_handler (self , _ ):
76
105
try :
77
- if lv ._nesting .value == 0 :
78
- lv .task_handler ()
106
+ self ._scheduled -= 1
79
107
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 )
82
156
83
- self ._scheduled -= 1
84
157
except Exception as e :
85
158
if self .exception_hook :
86
159
self .exception_hook (e )
0 commit comments