From de925142b222ce518c0311e1ba6119c98a8bc7ad Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 16 Feb 2022 22:07:18 +0100 Subject: [PATCH] lvgl updates and M5Stack Fire button support --- .../berry_tasmota/src/be_display_lib.cpp | 2 +- tasmota/berry/lvgl_examples/lv.be | 2 +- .../berry/lvgl_examples/lv_3_touch_buttons.be | 86 +++++++++++++++++++ .../berry/lvgl_examples/lv_tasmota_info.be | 12 ++- 4 files changed, 93 insertions(+), 9 deletions(-) create mode 100644 tasmota/berry/lvgl_examples/lv_3_touch_buttons.be diff --git a/lib/libesp32/berry_tasmota/src/be_display_lib.cpp b/lib/libesp32/berry_tasmota/src/be_display_lib.cpp index 59a52e122..bd6370345 100644 --- a/lib/libesp32/berry_tasmota/src/be_display_lib.cpp +++ b/lib/libesp32/berry_tasmota/src/be_display_lib.cpp @@ -13,7 +13,7 @@ extern int be_ntv_display_start(bvm *vm); extern int be_ntv_display_dimmer(bvm *vm); extern void be_ntv_display_touch_update(int32_t touches, int32_t raw_x, int32_t raw_y, int32_t gesture); - BE_FUNC_CTYPE_DECLARE(be_ntv_display_touch_update, "", "iiii[ii]") + BE_FUNC_CTYPE_DECLARE(be_ntv_display_touch_update, "", "iiii") /* @const_object_info_begin module display (scope: global) { diff --git a/tasmota/berry/lvgl_examples/lv.be b/tasmota/berry/lvgl_examples/lv.be index 0809988d5..24b70f0d0 100644 --- a/tasmota/berry/lvgl_examples/lv.be +++ b/tasmota/berry/lvgl_examples/lv.be @@ -93,7 +93,7 @@ tasmota.add_driver(ws) import lv_tasmota_info var info = lv_tasmota_info(scr) info.set_pos(0, stat_line.get_height()) -info.set_size(hres - 80, 30) +info.set_size(hres - 80 + 1, 40) tasmota.add_driver(info) # logs diff --git a/tasmota/berry/lvgl_examples/lv_3_touch_buttons.be b/tasmota/berry/lvgl_examples/lv_3_touch_buttons.be new file mode 100644 index 000000000..354c17313 --- /dev/null +++ b/tasmota/berry/lvgl_examples/lv_3_touch_buttons.be @@ -0,0 +1,86 @@ +# lv_touch_3_buttons +# +# Handles a simple case with 3 physical buttons below the screen, like in M5Stack +# +# LVGL must be already started to get the screen coordinates. +# Touches are simulated as actual touch screen: +# x: is spread at coordinates: 1/6, 1/2, 5/6 +# y: 10 pixels from botton + +class lv_touch_3_buttons + var gpios # (array) physical GPIO numbers for each button, -1 in not assigned + var x_coords # (array) x coordinates for each button + var y_coords # (array) y coordinates for each button + var active_low # (bool) true if button is active low + # prevous values + var touched, x, y # previous values (bool, int, int) to be repeated when not touched + + static ACTIVE_HIGH = false + static ACTIVE_LOW = true + + # Arguments: + # Physical GPIOs, generally through `gpio.pin(gpio.INPUT, 0), gpio.pin(gpio.INPUT, 1), gpio.pin(gpio.INPUT, 2)` + # + # Pre-condition: + # LVGL must be already started + def init(btn1, btn2, btn3, active_low) + # set current values + self.x = 0 + self.y = 0 + self.touched = false + # + self.active_low = active_low + self.gpios = [-1, -1, -1] + # store only valid gpios + btn1 = int(btn1) + if btn1 >= 0 self.gpios[0] = btn1 end + btn2 = int(btn2) + if btn2 >= 0 self.gpios[1] = btn2 end + btn3 = int(btn3) + if btn3 >= 0 self.gpios[2] = btn3 end + + # compute coordinates + var hres = lv.get_hor_res() + var vres = lv.get_ver_res() # should be 240 + self.x_coords = [ hres / 6, hres / 2, hres * 5 / 6] + self.y_coords = [ vres - 10, vres - 10, vres - 10] + end + + # scan every 50ms + def every_50ms() + import display + + var i = 0 + var x, y + var touched = false # is there any button pressed + while i < size(self.gpios) + var gp = self.gpios[i] + if gp >= 0 # skip invalid gpio + var in = bool(gpio.digital_read(gp)) + in = self.active_low ? !in : in # invert if active low + if in && !touched # first button touched + x = self.x_coords[i] + y = self.y_coords[i] + end + touched = touched || in + end + i += 1 + end + + # if touched, change x/y + if touched + self.x = x + self.y = y + end + self.touched = touched + # return values + display.touch_update(self.touched ? 1 : 0, self.x, self.y, 0) + end +end + +return lv_touch_3_buttons + +#- +lv_btn3 = lv_touch_3_buttons(gpio.pin(gpio.INPUT, 0), gpio.pin(gpio.INPUT, 1), gpio.pin(gpio.INPUT, 2), lv_touch_3_buttons.ACTIVE_LOW) +tasmota.add_driver(lv_btn3) +-# \ No newline at end of file diff --git a/tasmota/berry/lvgl_examples/lv_tasmota_info.be b/tasmota/berry/lvgl_examples/lv_tasmota_info.be index f9ac23c37..250e7b417 100644 --- a/tasmota/berry/lvgl_examples/lv_tasmota_info.be +++ b/tasmota/berry/lvgl_examples/lv_tasmota_info.be @@ -9,19 +9,17 @@ class lv_tasmota_info : lv.label self.set_width(parent.get_width()) self.set_pos(0, 0) - # self.set_style_bg_color(lv.color(0x000000), lv.PART_MAIN | lv.STATE_DEFAULT) - self.set_style_bg_opa(0, lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_bg_color(lv.color(0x000000), lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_bg_opa(100, lv.PART_MAIN | lv.STATE_DEFAULT) self.move_background() - # self.set_style_border_opa(255, lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_border_opa(255, lv.PART_MAIN | lv.STATE_DEFAULT) self.set_style_radius(0, lv.PART_MAIN | lv.STATE_DEFAULT) self.set_style_pad_all(2, lv.PART_MAIN | lv.STATE_DEFAULT) - # self.set_style_border_color(lv.color(0x0099EE), lv.PART_MAIN | lv.STATE_DEFAULT) - self.set_style_border_width(0, lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_border_color(lv.color(0x0099EE), lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_border_width(1, lv.PART_MAIN | lv.STATE_DEFAULT) self.set_style_text_color(lv.color(0xFFFFFF), lv.PART_MAIN | lv.STATE_DEFAULT) self.set_long_mode(lv.LABEL_LONG_CLIP) - # var roboto12 = lv.font_robotocondensed_latin1(12) - # self.set_style_text_font(roboto12, lv.PART_MAIN | lv.STATE_DEFAULT) var lg_font = lv.font_montserrat(14) self.set_style_text_font(lg_font, lv.PART_MAIN | lv.STATE_DEFAULT)