Skip to content

Commit d39f656

Browse files
committed
updates frameworks and busses
This is the start of the work for adding SDL as a display bus. It is going to function like the RGBBus when finished. I added a display driver to handle SDL using the built in drivers in LVGL. I do not like how this driver works because it doesn't allow the user to handle setting the buffer sizes and things of that nature. It removes all flexability and it could cause an issue if trying to run LVGL on something like an omega onion. I am trying to remove those limitations.
1 parent 7130a78 commit d39f656

25 files changed

+2413
-855
lines changed

button_framework.pyi

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
from typing import Optional, ClassVar
2+
from typing import TYPE_CHECKING
3+
4+
5+
if TYPE_CHECKING:
6+
import lvgl as lv # NOQA
7+
import display_driver_framework
8+
9+
10+
class ButtonDriver:
11+
_instance_counter: ClassVar[int] = ...
12+
id: int = ...
13+
_disp_drv: display_driver_framework.DisplayDriver = ...
14+
_last_button: int = ...
15+
_current_state: int = ...
16+
_indev_drv: lv.indev_t = ...
17+
18+
19+
def set_button_points(self, *points) -> None:
20+
"""
21+
:param points: this is a varargs (*args) parameter.
22+
Example of use:
23+
24+
button_driver.set_button_points(
25+
(lv.point_t(dict(x=0, y=0)), lv.point_t(dict(x=100, y=50))),
26+
(lv.point_t(dict(x=0, y=55)), lv.point_t(dict(x=100, y=110))),
27+
(lv.point_t(dict(x=0, y=115)), lv.point_t(dict(x=100, y=170)))
28+
)
29+
30+
You do not need to worry about keeping a reference to the points.
31+
This is done internally in the driver. You do however need to
32+
keep a reference to the driver.
33+
"""
34+
35+
def __init__(self):
36+
...
37+
38+
def _get_button(self) -> Optional[int]:
39+
"""
40+
Reads the botton
41+
42+
This function needs to return the id of the button that is pressed.
43+
In order for this to work you need to add the points to a coorsponding
44+
software button that you make. The id is going to be the index number
45+
of the points you have set.
46+
47+
:return: None if there is no button pressed or the id of the button
48+
49+
:raises: NotImplimentedError if the method is not overridden
50+
in the button driver
51+
"""
52+
...
53+
54+
def _read(self, drv, data) -> bool: # NOQA
55+
...
56+
57+
def get_type(self) -> int:
58+
...
59+
60+
def read(self) -> None:
61+
...
62+
63+
def send_event(self, code, param):
64+
...
65+
66+
def remove_event(self, index):
67+
...
68+
69+
def get_event_dsc(self, index):
70+
...
71+
72+
def get_event_count(self):
73+
...
74+
75+
def add_event_cb(self, event_cb, filter, user_data):
76+
...
77+
78+
def search_obj(self, point):
79+
...
80+
81+
def delete_read_timer(self):
82+
...
83+
84+
def get_read_timer(self):
85+
...
86+
87+
def get_active_obj(self):
88+
...
89+
90+
def wait_release(self):
91+
...
92+
93+
def get_vect(self, point):
94+
...
95+
96+
def get_scroll_obj(self):
97+
...
98+
99+
def get_scroll_dir(self):
100+
...
101+
102+
def get_gesture_dir(self):
103+
...
104+
105+
def get_point(self, point):
106+
...
107+
108+
def get_state(self):
109+
...
110+
111+
def enable(self, en):
112+
...
113+
114+
def get_group(self):
115+
...
116+
117+
def set_group(self, group):
118+
...
119+
120+
def set_cursor(self, cur_obj):
121+
...
122+
123+
def reset_long_press(self):
124+
...
125+
126+
def reset(self, obj):
127+
...
128+
129+
def get_disp(self):
130+
...
131+
132+
@staticmethod
133+
def active():
134+
...

driver/display/rgb_display.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import display_driver_framework
2+
3+
4+
class RGBDisplay(display_driver_framework.DisplayDriver):
5+
6+
def _dummy_set_memory_location(self, *_, **__):
7+
return 0x00
8+
9+
def set_rotation(self, value):
10+
self._disp_drv.set_orientation(value)
11+
self._rotation = value
Lines changed: 155 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,155 @@
1-
# lv_indev_set_button_points
2-
# LV_INDEV_TYPE_BUTTON
3-
# btn_id
1+
import lvgl as lv # NOQA
2+
3+
4+
lv_indev_get_driver_data
5+
lv_indev_get_user_data
6+
7+
8+
lv_indev_
9+
10+
11+
class ButtonDriver:
12+
_instance_counter = 1
13+
14+
def __init__(self, touch_cal=None): # NOQA
15+
self.__class__._instance_counter += 1
16+
self.id = self.__class__._instance_counter
17+
self._cursors = []
18+
19+
if not lv.is_initialized():
20+
lv.init()
21+
22+
disp = lv.display_get_default()
23+
24+
if disp is None:
25+
raise RuntimeError(
26+
'the display driver must be initilized before the button driver'
27+
)
28+
29+
self._disp_drv = disp.get_driver_data()
30+
31+
self._last_button = -1
32+
self._button_points = []
33+
self._current_state = lv.INDEV_STATE.RELEASED
34+
35+
indev_drv = lv.indev_t()
36+
indev_drv.init() # NOQA
37+
indev_drv.type = lv.INDEV_TYPE.BUTTON
38+
indev_drv.read_cb = self._read
39+
self._indev_drv = indev_drv.register() # NOQA
40+
self._indev_drv.set_driver_data(self)
41+
self._indev_drv.set_disp(disp)
42+
43+
def set_button_points(self, *points):
44+
self._indev_drv.set_button_points(list(points))
45+
self._button_points = list(points)
46+
47+
def _get_button(self):
48+
# this method needs to be overridden.
49+
# the returned value from this method is going to be a keycode
50+
# or None if no key event has occured
51+
raise NotImplementedError
52+
53+
def _read(self, drv, data): # NOQA
54+
button = self._get_button()
55+
56+
if button is None: # ignore no touch & multi touch
57+
if self._current_state != lv.INDEV_STATE.RELEASED:
58+
self._current_state = lv.INDEV_STATE.RELEASED
59+
res = True
60+
else:
61+
res = False
62+
63+
data.enc_diff = self._last_button
64+
data.state = self._current_state
65+
data.continue_reading = False
66+
return res
67+
68+
self._last_button = button
69+
self._current_state = data.state = lv.INDEV_STATE.PRESSED
70+
71+
data.btn_id = self._last_button
72+
data.state = self._current_state
73+
data.continue_reading = True
74+
75+
return True
76+
77+
def get_type(self):
78+
return self._indev_drv.get_type()
79+
80+
def read(self):
81+
self._indev_drv.read()
82+
83+
def send_event(self, code, param):
84+
return self._indev_drv.send_event(code, param)
85+
86+
def remove_event(self, index):
87+
return self._indev_drv.remove_event(index)
88+
89+
def get_event_dsc(self, index):
90+
return self._indev_drv.get_event_dsc(index)
91+
92+
def get_event_count(self):
93+
return self._indev_drv.get_event_count()
94+
95+
def add_event_cb(self, event_cb, filter, user_data):
96+
self._indev_drv.add_event_cb(event_cb, filter, user_data)
97+
98+
def search_obj(self, point):
99+
return self._indev_drv.search_obj(point)
100+
101+
def delete_read_timer(self):
102+
self._indev_drv.delete_read_timer()
103+
104+
def get_read_timer(self):
105+
return self._indev_drv.get_read_timer()
106+
107+
def get_active_obj(self):
108+
return self._indev_drv.get_active_obj()
109+
110+
def wait_release(self):
111+
self._indev_drv.wait_release()
112+
113+
def get_vect(self, point):
114+
self._indev_drv.get_vect(point)
115+
116+
def get_scroll_obj(self):
117+
return self._indev_drv.get_scroll_obj()
118+
119+
def get_scroll_dir(self):
120+
return self._indev_drv.get_scroll_dir()
121+
122+
def get_gesture_dir(self):
123+
return self._indev_drv.get_gesture_dir()
124+
125+
def get_point(self, point):
126+
self._indev_drv.get_point(point)
127+
128+
def get_state(self):
129+
return self._indev_drv.get_state()
130+
131+
def enable(self, en):
132+
self._indev_drv.enable(en)
133+
134+
def get_group(self):
135+
return self._indev_drv.get_group()
136+
137+
def set_group(self, group):
138+
self._indev_drv.set_group(group)
139+
140+
def set_cursor(self, cur_obj):
141+
self._indev_drv.set_cursor(cur_obj)
142+
143+
def reset_long_press(self):
144+
self._indev_drv.reset_long_press()
145+
146+
def reset(self, obj):
147+
self._indev_drv.reset(obj)
148+
149+
def get_disp(self):
150+
return self._disp_drv
151+
152+
@staticmethod
153+
def active():
154+
indev = lv.indev_active()
155+
return indev.get_driver_data()

0 commit comments

Comments
 (0)