Simplify berry virtual buttons

This commit is contained in:
Theo Arends
2026-09-02 17:49:22 +02:00
parent d5f33ec1b6
commit da3e0d12cb
4 changed files with 33 additions and 34 deletions
+1 -1
View File
@@ -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");
@@ -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
+26 -24
View File
@@ -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];
@@ -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