Fix adding virtual switches

This commit is contained in:
Theo Arends 2023-02-15 11:06:53 +01:00
parent fcec5a5b7b
commit 31f5b79bf8
3 changed files with 22 additions and 16 deletions

View File

@ -74,13 +74,9 @@ void SwitchSetVirtualPinState(uint32_t index, uint32_t state) {
bitWrite(Switch.virtual_pin, index, state);
}
void SwitchSetState(uint32_t index, uint32_t state) {
// Set debounced pin state to be used by late detected switches
if (!bitRead(Switch.used, index)) {
bitSet(Switch.used, index);
AddLog(LOG_LEVEL_DEBUG, PSTR("SWT: Add vSwitch%d, State %d"), index +1, state);
}
Switch.debounced_state[index] = state;
uint8_t SwitchLastState(uint32_t index) {
// Get last state
return Switch.last_state[index];
}
uint8_t SwitchGetState(uint32_t index) {
@ -88,9 +84,17 @@ uint8_t SwitchGetState(uint32_t index) {
return Switch.debounced_state[index];
}
uint8_t SwitchLastState(uint32_t index) {
// Get last state
return Switch.last_state[index];
void SwitchSetState(uint32_t index, uint32_t state) {
// Set debounced pin state to be used by late detected switches
if (!bitRead(Switch.used, index)) {
for (uint32_t i = 0; i <= index; i++) {
if (!bitRead(Switch.used, i)) {
bitSet(Switch.used, i);
AddLog(LOG_LEVEL_DEBUG, PSTR("SWT: Add vSwitch%d, State %d"), i +1, Switch.debounced_state[i]);
}
}
}
Switch.debounced_state[index] = state;
}
/*------------------------------------------------------------------------------------------*/

View File

@ -848,10 +848,11 @@ void TuyaProcessStatePacket(void) {
if (Tuya.buffer[dpidStart + 4]) { PowerOff = true; }
}
} else if (fnId >= TUYA_MCU_FUNC_SWT1 && fnId <= TUYA_MCU_FUNC_SWT4) {
uint32_t switch_state = SwitchGetState(fnId - TUYA_MCU_FUNC_SWT1);
AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: RX Switch-%d --> MCU State: %d Current State:%d"),fnId - TUYA_MCU_FUNC_SWT1 + 1,Tuya.buffer[dpidStart + 4], switch_state);
uint32_t switch_index = fnId - TUYA_MCU_FUNC_SWT1;
uint32_t switch_state = SwitchGetState(switch_index);
AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: RX Switch-%d --> MCU State: %d Current State:%d"), switch_index +1, Tuya.buffer[dpidStart + 4], switch_state);
if (switch_state != Tuya.buffer[dpidStart + 4]) {
SwitchSetState(fnId - TUYA_MCU_FUNC_SWT1, Tuya.buffer[dpidStart + 4]);
SwitchSetState(switch_index, Tuya.buffer[dpidStart + 4]);
}
}
if (PowerOff) { Tuya.ignore_dimmer_cmd_timeout = millis() + 250; }

View File

@ -1639,10 +1639,11 @@ void TuyaProcessRxedDP(uint8_t dpid, uint8_t type, uint8_t *data, int dpDataLen)
if (value) { PowerOff = true; }
}
} else if (fnId >= TUYA_MCU_FUNC_SWT1 && fnId <= TUYA_MCU_FUNC_SWT4) {
uint32_t switch_state = SwitchGetState(fnId - TUYA_MCU_FUNC_SWT1);
AddLog(LOG_LEVEL_DEBUG, PSTR("T:fn%d Switch%d --> M%d T%d"),fnId, fnId - TUYA_MCU_FUNC_SWT1 + 1, value, switch_state);
uint32_t switch_index = fnId - TUYA_MCU_FUNC_SWT1;
uint32_t switch_state = SwitchGetState(switch_index);
AddLog(LOG_LEVEL_DEBUG, PSTR("T:fn%d Switch%d --> M%d T%d"), fnId, switch_index +1, value, switch_state);
if (switch_state != value) {
SwitchSetState(fnId - TUYA_MCU_FUNC_SWT1, value);
SwitchSetState(switch_index, value);
}
}
//if (PowerOff) { pTuya->ignore_dimmer_cmd_timeout = millis() + 250; }