Skip to content

Commit 8736b3a

Browse files
committed
libs/m5ui: Use software timer for LVGL rendering tasks.
Signed-off-by: lbuque <[email protected]>
1 parent 127fcd6 commit 8736b3a

File tree

5 files changed

+67
-5
lines changed

5 files changed

+67
-5
lines changed

m5stack/cmodules/m5unified/m5unified_lvgl.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ mp_obj_t gfx_lvgl_init(mp_obj_t self) {
5151
#endif
5252

5353
lv_init();
54-
lvgl_timer = xTimerCreate("lvgl_timer", 10, pdTRUE, NULL, vTimerCallback);
54+
// lvgl_timer = xTimerCreate("lvgl_timer", pdMS_TO_TICKS(10), pdTRUE, NULL, vTimerCallback);
5555

56-
if (lvgl_timer == NULL || xTimerStart(lvgl_timer, 0) != pdPASS) {
57-
ESP_LOGE("LVGL", "Failed creating or starting LVGL timer!");
58-
}
56+
// if (lvgl_timer == NULL || xTimerStart(lvgl_timer, 0) != pdPASS) {
57+
// ESP_LOGE("LVGL", "Failed creating or starting LVGL timer!");
58+
// }
5959
return mp_const_none;
6060
}
6161

m5stack/libs/m5ui/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
_attrs = {
66
"init": "port",
77
"deinit": "port",
8+
"event_loop": "port",
89
"M5Arc": "arc",
910
"M5Bar": "bar",
1011
"M5Button": "button",

m5stack/libs/m5ui/port.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,64 @@
55
import lvgl as lv
66
import sys
77
import lv_utils
8+
import m5utils
9+
import micropython
810

911
_event_loop_instance = None
1012

1113

14+
class event_loop:
15+
_instance = None
16+
_initialized = False
17+
18+
def __new__(cls, freq=33, max_scheduled=2):
19+
if cls._instance is None:
20+
cls._instance = super().__new__(cls)
21+
return cls._instance
22+
23+
def __init__(self, freq=33, max_scheduled=2):
24+
# 防止重复初始化
25+
if self._initialized:
26+
return
27+
28+
self._initialized = True
29+
self.delay = 1000 // freq
30+
self.timer = m5utils.Timer(
31+
0, mode=m5utils.Timer.PERIODIC, period=self.delay, callback=self.timer_cb
32+
)
33+
self.max_scheduled = max_scheduled
34+
self.scheduled = 0
35+
36+
def timer_cb(self, t):
37+
lv.tick_inc(self.delay)
38+
if self.scheduled < self.max_scheduled:
39+
micropython.schedule(self.task_handler, 0)
40+
self.scheduled += 1
41+
42+
def task_handler(self, _):
43+
if lv._nesting.value == 0:
44+
lv.task_handler()
45+
self.scheduled -= 1
46+
47+
def deinit(self):
48+
if hasattr(self, "timer"):
49+
self.timer.deinit()
50+
event_loop._initialized = False
51+
event_loop._instance = None
52+
53+
@classmethod
54+
def get_instance(cls):
55+
"""获取单例实例"""
56+
if cls._instance is None:
57+
cls._instance = cls()
58+
return cls._instance
59+
60+
@classmethod
61+
def is_initialized(cls):
62+
"""检查是否已经初始化"""
63+
return cls._instance is not None and cls._initialized
64+
65+
1266
def _sdl_init(width=320, height=240):
1367
global _event_loop_instance
1468

@@ -71,6 +125,8 @@ def _m5_init():
71125
fs_drv = lv.fs_drv_t()
72126
lv_utils.fs_register(fs_drv, "S", 500)
73127

128+
event_loop()
129+
74130

75131
def init():
76132
if sys.platform == "esp32":
@@ -83,6 +139,7 @@ def deinit():
83139
if sys.platform == "esp32":
84140
import M5
85141

142+
event_loop().deinit()
86143
M5.Lcd.lvgl_deinit()
87144
lv.mp_lv_deinit_gc()
88145
else:

m5stack/modules/startup/tab5/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import lv_utils
99
from .launcher import Launcher, set_hal
1010
from .hal_tab5 import HALTab5
11+
import m5ui
1112

1213

1314
class Tab5_Startup:
@@ -50,3 +51,5 @@ def _init_lvgl(self):
5051

5152
fs_drv = lv.fs_drv_t()
5253
lv_utils.fs_register(fs_drv, "S", 500)
54+
55+
m5ui.event_loop() # start event loop

m5stack/modules/startup/tab5/launcher/launcher.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import lvgl as lv
2020
import asyncio
2121
import M5
22+
import m5ui
2223

2324

2425
class Launcher:
@@ -31,7 +32,7 @@ def __init__(self):
3132
asyncio.run(self._main())
3233
finally:
3334
print("Launcher cleanup complete")
34-
M5.Lcd.lvgl_deinit()
35+
m5ui.deinit()
3536

3637
def _init_background(self):
3738
screen = lv.screen_active()

0 commit comments

Comments
 (0)