Hi! Hope you are all safe in these crazy times!
So I am following this tutorial https://blog.littlevgl.com/2019-01-08/hardware-button and https://docs.littlevgl.com/en/html/porting/indev.html#types-of-input-devices to get 3 physical buttons to work but I am using micropython.
I already can work with 1 button but I can’t figure out how to set an array to use 3.
Here is a snip of my code:
def __init__(self, button, group=None):
def input_callback(drv, data):
data.state = lv.INDEV_STATE.PR
data.state = lv.INDEV_STATE.REL
self.drv = lv.indev_drv_t()
self.drv.type = lv.INDEV_TYPE.BUTTON
self.drv.read_cb = input_callback
self.win_drv = lv.indev_drv_register(self.drv)
self.points = lv.point_t()
Any idea on how to solve this? My problem right now is in the 4 last lines of code. I want to set multiple points (3 different buttons)
That looks like a bug!
lv_indev_set_button_points C prototype in lvgl:
void lv_indev_set_button_points(lv_indev_t * indev, const lv_point_t * points);
points parameter is declared as a pointer and not as an array.
When a parameter is passed as an array in a C function, it hints Micropython Binding that this is an array of elements and not a pointer to a single element.
For example, lv_line_set_points receives
lv_point_t point_a as a parameter, and in Python
line.set_points receives a list of points.
@kisvegabor - In order to solve this, I suggest fixing the prototype of
Perhaps there are other similar cases where we would want to change from pointer to array parameter?
Aaaah I had the feeling that something was wrong… I had tried everything that I could remember to create a workable array… I even seen you talking about the line.set_points in other post and tried something similar, but no luck. Thank you @amirgon!
Any idea of how I can make a quick work around? I want to use 3 physical buttons but I don’t want to use the encoder version (due to program workflow). I would be grateful if someone could give me a hand.
Or any idea when the fix will be made?
Once again, thank you!
I’m not aware of a workaround, but the fix is so simple that you can implement it yourself very easily!
Just change the function prototype (on both H and C files) to:
void lv_indev_set_button_points(lv_indev_t * indev, const lv_point_t points);
lv_micropython. That’s it.
C doesn’t make a difference between passing an array vs. passing a *pointer, so changing the function prototype doesn’t require any additional change in the C code. It’s just a hint for the Micropython Binding script. When the script runs as part of the build process, it would generate
indev_set_button_points function that expects a list as the second argument.
After doing that (and making sure it really works), if you send a PR to lvgl we would very much appreciate it!
Thank you for the help @amirgon ! I’ll give it a try and post my results here after!
@amirgon I’ve just fixed it.