Skip to content

Commit cbfb0f8

Browse files
committed
tests: Add screenshot method for testdisplay
This allows to take a screenshot at any point in test execution, e.g. see basic_slider.py start and final screenshots.
1 parent f51f81f commit cbfb0f8

File tree

5 files changed

+75
-41
lines changed

5 files changed

+75
-41
lines changed

tests/api/basic.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
# RGB colors, layout aligment and events.
1212

1313

14-
async def demo(scr, display=None):
14+
async def buttons(scr, display=None):
1515
def get_button(scr, text, align, color):
1616
_btn = lv.button(scr)
1717
_btn.set_size(lv.pct(25), lv.pct(10))
@@ -41,7 +41,7 @@ def button_cb(event, name):
4141
)
4242

4343
await asyncio.sleep_ms(500) # await so the frame can be rendered
44-
display._save_frame = False
44+
await display.screenshot()
4545
print("EVENT TEST:")
4646
for _btn, name in _all_btns:
4747
_btn.send_event(lv.EVENT.CLICKED, None)
@@ -60,5 +60,5 @@ def button_cb(event, name):
6060
except Exception:
6161
display_config = testrunner.display_config
6262

63-
testrunner.run(demo, __file__, disp_config=display_config)
63+
testrunner.run(buttons, __file__, disp_config=display_config)
6464
testrunner.devicereset()

tests/api/basic_indev.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
# RGB colors, layout aligment and events.
1212

1313

14-
async def demo(scr, display=None):
14+
async def buttons(scr, display=None):
1515
def get_button(scr, text, align, color):
1616
_btn = lv.button(scr)
1717
_btn.set_size(lv.pct(25), lv.pct(10))
@@ -41,8 +41,7 @@ def button_cb(event, name):
4141
)
4242

4343
await asyncio.sleep_ms(500) # await so the frame can be rendered
44-
display._save_frame = False
45-
44+
await display.screenshot()
4645
print("EVENT TEST:")
4746
for _btn, name in _all_btns:
4847
_btn.send_event(lv.EVENT.CLICKED, None)
@@ -78,5 +77,5 @@ def button_cb(event, name):
7877
except Exception:
7978
display_config = testrunner.display_config
8079

81-
testrunner.run(demo, __file__, disp_config=display_config)
80+
testrunner.run(buttons, __file__, disp_config=display_config)
8281
testrunner.devicereset()

tests/api/basic_slider.py

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,52 +11,52 @@
1111
# RGB colors, layout aligment and events.
1212

1313

14-
async def demo(scr, display=None):
15-
def get_button(scr, text, align, color):
14+
async def sliders(scr, display=None):
15+
def get_slider(scr, text, align, color):
1616
scr.set_style_pad_all(10, 0)
17-
_btn = lv.slider(scr)
18-
_btn.set_width(lv.pct(75))
19-
_btn.set_height(lv.pct(10))
20-
_lab = lv.label(_btn)
17+
slider = lv.slider(scr)
18+
slider.set_width(lv.pct(75))
19+
slider.set_height(lv.pct(10))
20+
_lab = lv.label(slider)
2121
_lab.set_text(text)
2222
_lab.set_style_text_color(lv.color_white(), 0)
2323
_lab.center()
24-
_btn.set_style_align(align, 0)
25-
_btn.set_style_bg_color(lv.color_make(*color), lv.PART.INDICATOR)
26-
_btn.set_style_bg_color(lv.color_make(*color), lv.PART.MAIN)
27-
_btn.set_style_bg_color(lv.color_make(*color), lv.PART.KNOB)
28-
return _btn, text
24+
slider.set_style_align(align, 0)
25+
slider.set_style_bg_color(lv.color_make(*color), lv.PART.INDICATOR)
26+
slider.set_style_bg_color(lv.color_make(*color), lv.PART.MAIN)
27+
slider.set_style_bg_color(lv.color_make(*color), lv.PART.KNOB)
28+
return slider, text
2929

30-
buttons = [
30+
sliders = [
3131
("RED", lv.ALIGN.TOP_MID, (255, 0, 0)),
3232
("GREEN", lv.ALIGN.BOTTOM_MID, (0, 255, 0)),
3333
("BLUE", lv.ALIGN.CENTER, (0, 0, 255)),
3434
]
3535

36-
def button_cb(event, name, slider):
36+
def slider_cb(event, name, slider):
3737
if slider.get_value() == 100:
3838
print(f"{name} VALUE: {slider.get_value()}")
3939

40-
_all_btns = [get_button(scr, *btn) for btn in buttons]
40+
_all_objs = [get_slider(scr, *slider) for slider in sliders]
4141

42-
for btn, name in _all_btns:
43-
btn.add_event_cb(
44-
lambda event, button_name=name, slider=btn: button_cb(
42+
for sld, name in _all_objs:
43+
sld.add_event_cb(
44+
lambda event, button_name=name, slider=sld: slider_cb(
4545
event, button_name, slider
4646
),
4747
lv.EVENT.VALUE_CHANGED,
4848
None,
4949
)
5050

5151
await asyncio.sleep_ms(500) # await so the frame can be rendered
52-
display._save_frame = False
52+
await display.screenshot()
5353

5454
# simulate touch events
5555
if display:
5656
print("INDEV + SLIDER TEST:")
5757
display.debug_indev(press=False)
5858
display.debug_display(False)
59-
for _btn, name in _all_btns:
59+
for _btn, name in _all_objs:
6060
pos = _btn.get_x(), _btn.get_y()
6161
pos2 = _btn.get_x2(), _btn.get_y2()
6262
x1, y1 = pos
@@ -65,7 +65,8 @@ def button_cb(event, name, slider):
6565
await display.swipe(x1 + 5, y_mid, x2 + (y2 - y1), y_mid, ms=500)
6666
await asyncio.sleep_ms(100)
6767

68-
return _all_btns
68+
await display.screenshot("final")
69+
return _all_objs
6970

7071

7172
__file__ = globals().get("__file__", "test")
@@ -78,5 +79,5 @@ def button_cb(event, name, slider):
7879
except Exception:
7980
display_config = testrunner.display_config
8081

81-
testrunner.run(demo, __file__, disp_config=display_config)
82+
testrunner.run(sliders, __file__, disp_config=display_config)
8283
testrunner.devicereset()

tests/testdisplay.py

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,18 @@ def __init__(
6868
len(self._frame_buffer1),
6969
render_mode,
7070
)
71+
if hasattr(display_drv, "set_frame_buffer"):
72+
display_drv.set_frame_buffer(self._frame_buffer1)
7173
self.indev_test = lv.indev_create()
7274
self.indev_test.set_display(lv.display_get_default())
7375
self.indev_test.set_group(lv.group_get_default())
7476
# TODO: test other types of indev
75-
self.indev_test.set_type(lv.INDEV_TYPE.POINTER)
77+
if pointer in ("sim", "interactive"):
78+
_indev_type = lv.INDEV_TYPE.POINTER
79+
else:
80+
_indev_type = getattr(lv.INDEV_TYPE, pointer.upper())
81+
82+
self.indev_test.set_type(_indev_type)
7683
if hasattr(display_drv, "read_cb") and pointer != "sim":
7784
self.indev_test.set_read_cb(display_drv.read_cb)
7885

@@ -89,14 +96,14 @@ def __init__(
8996
self.mouse = lv.sdl_mouse_create()
9097
self.keyboard = lv.sdl_keyboard_create()
9198
self.keyboard.set_group(self.group)
92-
if pointer == "sim":
93-
self.indev = lv.indev_create()
94-
self.indev.set_display(self.lv_display_int)
95-
self.indev.set_group(self.group)
96-
self.indev.set_type(lv.INDEV_TYPE.POINTER)
99+
if pointer in ("sim", "encoder"):
100+
self.indev_test = lv.indev_create()
101+
self.indev_test.set_display(self.lv_display_int)
102+
self.indev_test.set_group(self.group)
103+
self.indev_test.set_type(lv.INDEV_TYPE.POINTER)
97104
# NOTE: only one indev pointer allowed, use the keyboard
98105
# for interactive control
99-
self.indev.set_read_cb(self._read_cb)
106+
self.indev_test.set_read_cb(self._read_cb)
100107

101108
def set_test_name(self, name):
102109
self.display_drv.test_name = name
@@ -171,6 +178,10 @@ def _read_cb(self, indev, data):
171178
print(f"[RELEASED]: ({self._x},{self._y})")
172179
data.state = self._dstate
173180

181+
def screenshot(self, name="screenshot"):
182+
if hasattr(self.display_drv, "screenshot"):
183+
return self.display_drv.screenshot(name)
184+
174185

175186
class DummyDisplay:
176187
def __init__(self, width=240, height=320, color_format=lv.COLOR_FORMAT.RGB565):
@@ -182,8 +193,11 @@ def __init__(self, width=240, height=320, color_format=lv.COLOR_FORMAT.RGB565):
182193
self.test_name = "testframe"
183194
self._header_set = False
184195
self._save_frame = sys.platform in ["darwin", "linux"]
196+
# TODO: use framebuf for snapshot
185197
self._debug = True
186-
self._pbuff = bytearray(self.color_size)
198+
if self._save_frame:
199+
self._pbuff = bytearray(self.color_size)
200+
self._save_frame = False
187201

188202
@property
189203
def debug(self):
@@ -216,7 +230,27 @@ def save_frame(self, data, w, h):
216230
pi += self.color_size
217231
except Exception:
218232
print(pi)
219-
# fr.write(data)
233+
234+
async def screenshot(self, name="screenshot"):
235+
_debug = self._debug
236+
self._debug = False
237+
self._save_frame = False
238+
239+
# Reset
240+
self._rst_scr = lv.obj()
241+
c_scr = lv.screen_active()
242+
lv.screen_load(self._rst_scr)
243+
await asyncio.sleep_ms(100)
244+
245+
# Load test screen
246+
self._save_frame = sys.platform in ["darwin", "linux"]
247+
self._header_set = False
248+
self.test_name = f"{self.test_name}@{name}"
249+
lv.screen_load(c_scr)
250+
await asyncio.sleep_ms(100)
251+
252+
self._debug = _debug
253+
self._save_frame = sys.platform in ["darwin", "linux"]
220254

221255
def _shasum_frame(self, data):
222256
_hash = hashlib.sha256()
@@ -287,7 +321,7 @@ def get_display(
287321
alloc_buffer = lambda buffersize: memoryview(bytearray(buffer_size))
288322

289323
factor = 10 ### Must be 1 if using an RGBBus
290-
double_buf = True ### Must be False if using an RGBBus
324+
double_buf = False ### Must be False if using an RGBBus
291325

292326
buffer_size = disp.width * disp.height * (disp.color_depth // 8) // factor
293327

tests/testrunner.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
_mode = "interactive"
1313

1414

15-
async def run_test(func, display=None):
15+
async def run_test(func, display=None, **kwargs):
1616
import lvgl as lv # noqa
1717

1818
lv.init()
@@ -21,7 +21,7 @@ async def run_test(func, display=None):
2121
scr.set_style_bg_color(lv.color_black(), 0)
2222
lv.screen_load(scr)
2323

24-
resp = await func(scr, display)
24+
resp = await func(scr, display, **kwargs)
2525
return scr, resp
2626

2727

@@ -48,7 +48,7 @@ async def _run(func, disp_config=disp_config, **kwargs):
4848
await run_test(func, display)
4949
await asyncio.sleep_ms(100)
5050
elif display.mode == "interactive":
51-
await run_test(func, display)
51+
await run_test(func, display, **kwargs)
5252
if _int == "-id":
5353
while True:
5454
try:

0 commit comments

Comments
 (0)