From 5fc959288656e9838b040a129bc34f4f3706215b Mon Sep 17 00:00:00 2001 From: meydin Date: Sat, 28 Oct 2023 11:39:03 +0200 Subject: [PATCH] added Fixed antibeat support --- Software/Switch/MeyRule.cpp | 20 +++++++++++++++----- Software/Switch/MeyRule.h | 2 ++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Software/Switch/MeyRule.cpp b/Software/Switch/MeyRule.cpp index 5211f90..8be74f5 100644 --- a/Software/Switch/MeyRule.cpp +++ b/Software/Switch/MeyRule.cpp @@ -24,6 +24,7 @@ void AddSimple(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, rule->targetMeyPinId = targetMeyPinId; rule->toggle = false; rule->inverse = false; + rule->lastPinState = false; PutRule(rule); } @@ -38,6 +39,7 @@ void AddToggle(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, rule->targetMeyPinId = targetMeyPinId; rule->toggle = true; rule->inverse = false; + rule->lastPinState = false; PutRule(rule); } @@ -52,6 +54,7 @@ void AddToggleInverse(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t target rule->targetMeyPinId = targetMeyPinId; rule->toggle = true; rule->inverse = true; + rule->lastPinState = false; PutRule(rule); } @@ -60,19 +63,26 @@ void AddToggleInverse(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t target void CheckRule(uint16_t deviceId, uint8_t dt, uint8_t state, Rule *rule) { - RemotePinInfo *currentPinState = remotePinInfo.FindOrAdd(rule->targetDevId); + RemotePinInfo *currentRemotePinInfo = remotePinInfo.FindOrAdd(rule->targetDevId); + if (currentRemotePinInfo == NULL) return; - if (currentPinState == NULL) return; + // check the new state with the last one. Needs to be done, as the UP switch might + // send it multiple times like "01 01" "01 01" for a single tip.(antibeat) + bool lastPinState = rule->lastPinState; + bool pinState = dt > 0; + + if (rule->triggeredOnce && lastPinState == pinState) return; + rule->lastPinState = pinState; + rule->triggeredOnce = true; - bool pinState = state > 0; if (rule->inverse) pinState = !pinState; if (rule->toggle) - pinState = (currentPinState->getPinState(rule->targetMeyPinId) ^ true); + pinState = (currentRemotePinInfo->getPinState(rule->targetMeyPinId) ^ true); BroadcastTriggerMeyPinCanPackage(rule->targetDevId, rule->targetMeyPinId, pinState); - currentPinState->setPinState(rule->targetMeyPinId, pinState); + currentRemotePinInfo->setPinState(rule->targetMeyPinId, pinState); } void HandleTriggered(can_frame *frame) diff --git a/Software/Switch/MeyRule.h b/Software/Switch/MeyRule.h index 2245767..f8c7150 100644 --- a/Software/Switch/MeyRule.h +++ b/Software/Switch/MeyRule.h @@ -13,6 +13,8 @@ struct Rule bool toggle; bool inverse; Rule *nextRule = NULL; + bool lastPinState = false; + bool triggeredOnce = false; void AddRule(Rule *rule) {