11import lvgl as lv # NOQA
22import 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+ '''
575class 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
0 commit comments