mirror of
https://github.com/arendst/Tasmota.git
synced 2026-09-11 09:13:17 +00:00
Simplify berry virtual buttons
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user