Skip to content

Commit c70fe0c

Browse files
committed
working on display and input drivers
1 parent 8e628cd commit c70fe0c

File tree

16 files changed

+1429
-97
lines changed

16 files changed

+1429
-97
lines changed

driver/display/ili9341.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
from micropython import const # NOQA
33

44
import lvgl as lv # NOQA
5-
import lcd_bus # NOQA
65
import display_driver_framework
76

87

driver/display/sdl_display.py

Lines changed: 170 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,104 @@
11
import lvgl as lv # NOQA
22
import display_driver_framework
3-
4-
3+
from micropython import const
4+
5+
# Window has been shown
6+
_SDL_WINDOWEVENT_SHOWN = const(1)
7+
# Window has been hidden
8+
_SDL_WINDOWEVENT_HIDDEN = const(2)
9+
# Window has been exposed and should be redrawn
10+
_SDL_WINDOWEVENT_EXPOSED = const(3)
11+
# Window has been moved to data1, data2
12+
_SDL_WINDOWEVENT_MOVED = const(4)
13+
# Window has been resized to data1xdata2
14+
_SDL_WINDOWEVENT_RESIZED = const(5)
15+
# The window size has changed, either as
16+
# a result of an API call or through the
17+
# system or user changing the window size.
18+
_SDL_WINDOWEVENT_SIZE_CHANGED = const(6)
19+
# Window has been minimized
20+
_SDL_WINDOWEVENT_MINIMIZED = const(7)
21+
# Window has been maximized
22+
_SDL_WINDOWEVENT_MAXIMIZED = const(8)
23+
# Window has been restored to normal size and position
24+
_SDL_WINDOWEVENT_RESTORED = const(9)
25+
# Window has gained mouse focus
26+
_SDL_WINDOWEVENT_ENTER = const(10)
27+
# Window has lost mouse focus
28+
_SDL_WINDOWEVENT_LEAVE = const(11)
29+
# Window has gained keyboard focus
30+
_SDL_WINDOWEVENT_FOCUS_GAINED = const(12)
31+
# Window has lost keyboard focus
32+
_SDL_WINDOWEVENT_FOCUS_LOST = const(13)
33+
# The window manager requests that the window be closed
34+
_SDL_WINDOWEVENT_CLOSE = const(14)
35+
# Window is being offered a focus (should SetWindowInputFocus()
36+
# on itself or a subwindow, or ignore)
37+
_SDL_WINDOWEVENT_TAKE_FOCUS = const(15)
38+
# Window has been moved to display data1.
39+
_SDL_WINDOWEVENT_DISPLAY_CHANGED = const(16)
40+
41+
_SDL_PIXELFORMAT_RGB888 = const(0x16161804)
42+
_SDL_PIXELFORMAT_BGR24 = const(0x17401803)
43+
_SDL_PIXELFORMAT_RGB565 = const(0x15151002)
44+
45+
46+
47+
'''
48+
SDL_WINDOWEVENT = 0x200
49+
50+
SDL_KEYDOWN = 0x300
51+
SDL_KEYUP = 0x301
52+
53+
54+
SDL_MOUSEMOTION = 0x400
55+
SDL_MOUSEBUTTONDOWN = 0x401
56+
SDL_MOUSEBUTTONUP = 0x402
57+
SDL_MOUSEWHEEL = 0x403
58+
59+
60+
SDL_JOYAXISMOTION = 0x600
61+
SDL_JOYBALLMOTION = 0x601
62+
SDL_JOYHATMOTION = 0x602
63+
SDL_JOYBUTTONDOWN = 0x603
64+
SDL_JOYBUTTONUP = 0x604
65+
66+
67+
68+
69+
70+
71+
SDL_RELEASED = 0
72+
SDL_PRESSED = 1
73+
74+
'''
575
class SDL(display_driver_framework.DisplayDriver):
676

777
def __init__(
878
self,
9-
display_width=480,
10-
display_height=320,
79+
data_bus,
80+
display_width,
81+
display_height,
82+
frame_buffer1=None,
83+
frame_buffer2=None,
84+
reset_pin=None,
85+
reset_state=display_driver_framework.STATE_HIGH,
86+
power_pin=None,
87+
power_on_state=display_driver_framework.STATE_HIGH,
88+
backlight_pin=None,
89+
backlight_on_state=display_driver_framework.STATE_HIGH,
1190
offset_x=0,
1291
offset_y=0,
92+
color_byte_order=display_driver_framework.BYTE_ORDER_RGB,
1393
color_space=lv.COLOR_FORMAT.RGB888,
94+
rgb565_byte_swap=False
1495
):
15-
1696
super().__init__(
1797
data_bus=None,
1898
display_width=display_width,
1999
display_height=display_height,
20-
frame_buffer1=None,
21-
frame_buffer2=None,
100+
frame_buffer1=frame_buffer1,
101+
frame_buffer2=frame_buffer2,
22102
reset_pin=None,
23103
reset_state=display_driver_framework.STATE_HIGH,
24104
power_pin=None,
@@ -32,6 +112,8 @@ def __init__(
32112
rgb565_byte_swap=False
33113
)
34114

115+
self._data_bus = data_bus
116+
35117
try:
36118
import task_handler # NOQA
37119

@@ -40,29 +122,94 @@ def __init__(
40122
except ImportError:
41123
self._task_handler = None
42124

43-
self._disp_drv = lv.sdl_window_create(self.display_width, self.display_height)
125+
buffer_size = lv.color_format_get_size(color_space)
126+
buffer_size *= display_width * display_height
127+
128+
if frame_buffer1 is None:
129+
frame_buffer1 = data_bus.allocate_framebuffer(buffer_size, 0)
130+
if frame_buffer2 is None:
131+
frame_buffer2 = data_bus.allocate_framebuffer(buffer_size, 0)
44132

45-
buf_size = display_width * display_height
46-
buf_size *= lv.color_format_get_size(
47-
self._disp_drv.get_color_format()
133+
self._frame_buffer1 = frame_buffer1
134+
self._frame_buffer2 = frame_buffer2
135+
136+
self._disp_drv = lv.display_create(display_width, display_height)
137+
138+
self._disp_drv.set_color_format(color_space)
139+
self._disp_drv.set_driver_data(self)
140+
141+
data_bus.init(
142+
display_width,
143+
display_height,
144+
lv.color_format_get_size(color_space) * 8,
145+
buffer_size,
146+
False
48147
)
49148

50-
buf1 = self._disp_drv.buf_1
51-
buf2 = self._disp_drv.buf_2
149+
self._disp_drv.set_flush_cb(self._flush_cb)
52150

53-
if buf1.data_size > 0:
54-
buf1 = buf1.data.__dereference__(buf_size)
55-
else:
56-
buf1 = None
57-
if buf2.data_size > 0:
58-
buf2 = buf2.data.__dereference__(buf_size)
151+
self._disp_drv.set_buffers(
152+
frame_buffer1,
153+
frame_buffer2,
154+
len(frame_buffer1),
155+
lv.DISPLAY_RENDER_MODE.DIRECT
156+
)
157+
158+
self._ignore_size_chg = False
159+
160+
data_bus.register_callback(self._flush_ready_cb)
161+
162+
self._data_bus.register_window_callback(self._windows_event_cb)
163+
self._disp_drv.add_event_cb(self._res_chg_event_cb, lv.EVENT.RESOLUTION_CHANGED, None)
164+
self._disp_drv.add_event_cb(self._release_disp_cb, lv.EVENT.DELETE)
165+
166+
def _res_chg_event_cb(self, e):
167+
bpp = lv.color_format_get_size(self._disp_drv.get_color_format()) * 8
168+
disp = e.get.current_target()
169+
170+
hor_res = disp.get_horizontal_resolution()
171+
ver_res = disp.get_vertical_resolution()
172+
173+
if bpp == 32:
174+
px_format = _SDL_PIXELFORMAT_RGB888
175+
elif bpp == 24:
176+
px_format = _SDL_PIXELFORMAT_BGR24
177+
elif bpp == 16:
178+
px_format = _SDL_PIXELFORMAT_RGB565
59179
else:
60-
buf2 = None
180+
return
181+
182+
buf_size = int(hor_res * ver_res * bpp / 8)
61183

62-
self._frame_buffer1 = buf1
63-
self._frame_buffer2 = buf2
184+
self._frame_buffer1 = self._data_bus.realloc_buffer(buf_size, 1)
185+
self._frame_buffer2 = self._data_bus.realloc_buffer(buf_size, 2)
186+
187+
disp.set_buffers(
188+
self._frame_buffer1,
189+
self._frame_buffer2,
190+
len(self._frame_buffer1),
191+
lv.DISPLAY_RENDER_MODE.DIRECT
192+
)
64193

65-
self._disp_drv.set_offset(self._offset_x, self._offset_y)
194+
self._data_bus.set_window_size(hor_res, ver_res, px_format, self._ignore_size_chg)
195+
196+
def _windows_event_cb(self, kwargs):
197+
event = kwargs['event']
198+
199+
if event == _SDL_WINDOWEVENT_RESIZED:
200+
width = kwargs['data1']
201+
height = kwargs['data2']
202+
self._ignore_size_chg = True
203+
self._disp_drv.set_resolution(width, height)
204+
self._ignore_size_chg = False
205+
lv.refr_now(self._disp_drv)
206+
elif event in (_SDL_WINDOWEVENT_TAKE_FOCUS, _SDL_WINDOWEVENT_EXPOSED):
207+
lv.refr_now(self._disp_drv)
208+
elif event == _SDL_WINDOWEVENT_CLOSE:
209+
self._disp_drv.delete()
210+
211+
def _release_disp_cb(self, _):
212+
self._data_bus.deinit()
66213

67214
def set_offset(self, x, y):
68215
rot90 = lv.DISPLAY_ROTATION._90 # NOQA

driver/frozen/indev/button_framework.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33

44
lv_indev_get_driver_data
55
lv_indev_get_user_data
6-
7-
86
lv_indev_
97

108

driver/frozen/indev/keypad_framework.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,7 @@
22

33

44
class KeypadDriver:
5-
_instance_counter = 1
6-
7-
def __init__(self, touch_cal=None): # NOQA
8-
self.__class__._instance_counter += 1
9-
self.id = self.__class__._instance_counter
10-
self._cursors = []
11-
5+
def __init__(self): # NOQA
126
if not lv.is_initialized():
137
lv.init()
148

@@ -34,14 +28,14 @@ def __init__(self, touch_cal=None): # NOQA
3428

3529
def _get_key(self):
3630
# this method needs to be overridden.
37-
# the returned value from this method is going to be a keycode
31+
# the returned value from this method is going to be (state, keycode)
3832
# or None if no key event has occured
3933
raise NotImplementedError
4034

4135
def _read(self, drv, data): # NOQA
4236
key = self._get_key()
4337

44-
if key is None: # ignore no touch & multi touch
38+
if key is None: # ignore no key
4539
if self._current_state != lv.INDEV_STATE.RELEASED:
4640
self._current_state = lv.INDEV_STATE.RELEASED
4741
res = True
@@ -53,14 +47,23 @@ def _read(self, drv, data): # NOQA
5347
data.continue_reading = False
5448
return res
5549

50+
state, key = key
51+
5652
self._last_key = key
57-
self._current_state = data.state = lv.INDEV_STATE.PRESSED
53+
54+
if self._current_state == state == lv.INDEV_STATE.RELEASED:
55+
res = False
56+
data.continue_reading = False
57+
else:
58+
res = True
59+
data.continue_reading = True
60+
61+
self._current_state = state
5862

5963
data.key = self._last_key
6064
data.state = self._current_state
61-
data.continue_reading = True
6265

63-
return True
66+
return res
6467

6568
def get_type(self):
6669
return self._indev_drv.get_type()

driver/frozen/indev/pointer_framework.py

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ def _remap(value, old_min, old_max, new_min, new_max):
88
class PointerDriver:
99
_instance_counter = 1
1010

11+
PRESSED = lv.INDEV_STATE.PRESSED
12+
RELEASED = lv.INDEV_STATE.RELEASED
13+
1114
def get_width(self):
1215
return self._width
1316

@@ -39,7 +42,7 @@ def __init__(self, touch_cal=None): # NOQA
3942

4043
self._last_x = -1
4144
self._last_y = -1
42-
self._current_state = lv.INDEV_STATE.RELEASED
45+
self._current_state = self.RELEASED
4346

4447
self._height = height
4548
self._width = width
@@ -76,16 +79,16 @@ def is_calibrated(self):
7679

7780
def _get_coords(self):
7881
# this method needs to be overridden.
79-
# the returned value from this method is going to be a tuple of state, x, y
80-
# or None if no touch even has occured
82+
# the returned value from this method is going to be a tuple
83+
# of (state, x, y) or None if no touch even has occured
8184
raise NotImplementedError
8285

8386
def _read(self, drv, data): # NOQA
8487
coords = self._get_coords()
8588

8689
if coords is None: # ignore no touch & multi touch
87-
if self._current_state != lv.INDEV_STATE.RELEASED:
88-
self._current_state = lv.INDEV_STATE.RELEASED
90+
if self._current_state != self.RELEASED:
91+
self._current_state = self.RELEASED
8992
res = True
9093
else:
9194
res = False
@@ -100,7 +103,6 @@ def _read(self, drv, data): # NOQA
100103
state, x, y = coords
101104

102105
if None not in (x, y):
103-
104106
config = self._config
105107
orientation = self.get_rotation()
106108
left = config.left
@@ -136,19 +138,27 @@ def _read(self, drv, data): # NOQA
136138
self._last_y = ypos
137139

138140
if state is not None:
139-
if state:
140-
self._current_state = lv.INDEV_STATE.PRESSED
141+
if self._current_state == state == self.RELEASED:
142+
res = False
143+
data.continue_reading = False
141144
else:
142-
self._current_state = lv.INDEV_STATE.RELEASED
145+
res = True
146+
data.continue_reading = True
147+
148+
self._current_state = state
149+
150+
elif self._current_state == self.RELEASED:
151+
res = False
152+
data.continue_reading = False
153+
else:
154+
data.continue_reading = True
155+
res = True
143156

144157
data.state = self._current_state
145158
data.point.x = self._last_x
146159
data.point.y = self._last_y
147160

148-
data.continue_reading = True
149-
# print("raw(x={0}, y={1}) point(x={2} y={3})".format(x, y, data.point.x, data.point.y)) # NOQA
150-
151-
return True
161+
return res
152162

153163
def get_type(self):
154164
return self._indev_drv.get_type()

driver/indev/ft6x36.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,4 +206,4 @@ def _get_coords(self):
206206
((buf[3] & _MSB_MASK) << 8) |
207207
(buf[4] & _LSB_MASK)
208208
)
209-
return x, y
209+
return self.PRESSED, x, y

0 commit comments

Comments
 (0)