diff --git a/lib/libesp32/berry_tasmota/src/be_gpio_lib.c b/lib/libesp32/berry_tasmota/src/be_gpio_lib.c index e13d8a3f3..f76130969 100644 --- a/lib/libesp32/berry_tasmota/src/be_gpio_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_gpio_lib.c @@ -32,7 +32,7 @@ extern void gp_set_frequency(int32_t pin, int32_t frequency); BE_FUNC_CTYPE_DE extern int gp_get_duty(int32_t pin); BE_FUNC_CTYPE_DECLARE(gp_get_duty, "i", "i"); extern int gp_get_duty_resolution(int32_t pin); BE_FUNC_CTYPE_DECLARE(gp_get_duty_resolution, "i", "i"); -extern int gp_add_virtual_button(int32_t index, int32_t state); BE_FUNC_CTYPE_DECLARE(gp_add_virtual_button, "i", "ii"); +extern int gp_add_virtual_button(int32_t state); BE_FUNC_CTYPE_DECLARE(gp_add_virtual_button, "i", "i"); extern void gp_remove_virtual_button(int32_t index); BE_FUNC_CTYPE_DECLARE(gp_remove_virtual_button, "", "i"); extern void gp_set_virtual_button_state(int32_t index, int32_t state); BE_FUNC_CTYPE_DECLARE(gp_set_virtual_button_state, "", "ii"); diff --git a/tasmota/berry/drivers/pi4ioe5v6408_M5Stack_UnitC6L.be b/tasmota/berry/drivers/pi4ioe5v6408_M5Stack_UnitC6L.be index 261356b03..47cc396bc 100644 --- a/tasmota/berry/drivers/pi4ioe5v6408_M5Stack_UnitC6L.be +++ b/tasmota/berry/drivers/pi4ioe5v6408_M5Stack_UnitC6L.be @@ -51,11 +51,8 @@ class PI4IOE5V6408_UnitC6L : I2C_Driver self.write_bit(0x05, 6, 1) # enable SX_ANT_SW self.write_bit(0x05, 5, 1) # enable SX_LNA_EN - # Get virtual button index - var vp = gpio.add_virtual_button(-1, 0) - if vp >= 0 - self.virtual_buttons[0] = vp - end + # Get virtual button index or -1 + self.virtual_buttons[0] = gpio.add_virtual_button(0) tasmota.add_driver(self) # register this driver end diff --git a/tasmota/tasmota_support/support_button_v4.ino b/tasmota/tasmota_support/support_button_v4.ino index eea626807..8ea47d25d 100644 --- a/tasmota/tasmota_support/support_button_v4.ino +++ b/tasmota/tasmota_support/support_button_v4.ino @@ -90,34 +90,19 @@ void ButtonTouchFlag(uint32_t button_bit) { /*------------------------------------------------------------------------------------------*/ -int ButtonAddVirtualPin(int index, uint32_t state) { - if (-1 == index) { // Request next slot - index = 0; - for (uint32_t i = 0; i < MAX_KEYS_SET; i++) { - if (ButtonUsed(i)) { - index++; // Find first free slot - } else { - break; - } +int ButtonAddVirtualPin(uint32_t state) { + int index = 0; + for (uint32_t i = 0; i < MAX_KEYS_SET; i++) { + if (ButtonUsed(i)) { + index++; // Find first free slot + } else { + break; } } if (index >= MAX_KEYS_SET) { return -1; // All slots are used } - bool button_used = (Button.used); - bitSet(Button.used, index); // This pin is used - ButtonSetVirtualPinState(index, state); // Virtual hardware pin state - if (!state) { ButtonInvertFlag(index); } // Set inverted flag - // last_state[index] must be 1 to indicate no button pressed - Button.last_state[index] = (bitRead(Button.virtual_pin, index) != bitRead(Button.inverted_mask, index)); - Button.debounced_state[index] = Button.last_state[index]; - if (!button_used) { - ButtonTickerAttach(); - } - - AddLog(LOG_LEVEL_DEBUG, PSTR("BTN: Add vButton%d, State %d"), index +1, Button.last_state[index]); - - return index; + return ButtonAddVirtualPinAt(index, state); } void ButtonRemoveVirtualPin(int index) { @@ -278,6 +263,23 @@ void ButtonTickerAttach(void) { } } +int ButtonAddVirtualPinAt(int index, uint32_t state) { + bool button_used = (Button.used); + bitSet(Button.used, index); // This pin is used + ButtonSetVirtualPinState(index, state); // Virtual hardware pin state + if (!state) { ButtonInvertFlag(index); } // Set inverted flag + // last_state[index] must be 1 to indicate no button pressed + Button.last_state[index] = (bitRead(Button.virtual_pin, index) != bitRead(Button.inverted_mask, index)); + Button.debounced_state[index] = Button.last_state[index]; + if (!button_used) { + ButtonTickerAttach(); + } + + AddLog(LOG_LEVEL_DEBUG, PSTR("BTN: Add vButton%d, State %d"), index +1, Button.last_state[index]); + + return index; +} + void ButtonInit(void) { bool ac_detect = (Settings->button_debounce % 10 == 9); Button.used = 0; @@ -313,7 +315,7 @@ void ButtonInit(void) { XdrvMailbox.index = i; if (XdrvCall(FUNC_ADD_BUTTON)) { bool state = (XdrvMailbox.index &1); - ButtonAddVirtualPin(i, state); + ButtonAddVirtualPinAt(i, state); } } Button.debounced_state[i] = Button.last_state[i]; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_gpio.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_gpio.ino index b25ff45cb..d027db0e0 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_gpio.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_gpio.ino @@ -279,11 +279,11 @@ extern "C" { return GetPin(pin) % 32; } - // gpio.add_virtual_button(index:int, state:int) -> int + // gpio.add_virtual_button(state:int) -> int // - extern int gp_add_virtual_button(int32_t index, int32_t state); - extern int gp_add_virtual_button(int32_t index, int32_t state) { - return ButtonAddVirtualPin(index, state); + extern int gp_add_virtual_button(int32_t state); + extern int gp_add_virtual_button(int32_t state) { + return ButtonAddVirtualPin(state); } // gpio.remove_virtual_button(index:int) -> nil