added Fixed antibeat support

This commit is contained in:
2023-10-28 11:39:03 +02:00
parent f842815435
commit 5fc9592886
2 changed files with 17 additions and 5 deletions

View File

@@ -24,6 +24,7 @@ void AddSimple(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId,
rule->targetMeyPinId = targetMeyPinId; rule->targetMeyPinId = targetMeyPinId;
rule->toggle = false; rule->toggle = false;
rule->inverse = false; rule->inverse = false;
rule->lastPinState = false;
PutRule(rule); PutRule(rule);
} }
@@ -38,6 +39,7 @@ void AddToggle(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId,
rule->targetMeyPinId = targetMeyPinId; rule->targetMeyPinId = targetMeyPinId;
rule->toggle = true; rule->toggle = true;
rule->inverse = false; rule->inverse = false;
rule->lastPinState = false;
PutRule(rule); PutRule(rule);
} }
@@ -52,6 +54,7 @@ void AddToggleInverse(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t target
rule->targetMeyPinId = targetMeyPinId; rule->targetMeyPinId = targetMeyPinId;
rule->toggle = true; rule->toggle = true;
rule->inverse = true; rule->inverse = true;
rule->lastPinState = false;
PutRule(rule); 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) 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) if (rule->inverse)
pinState = !pinState; pinState = !pinState;
if (rule->toggle) if (rule->toggle)
pinState = (currentPinState->getPinState(rule->targetMeyPinId) ^ true); pinState = (currentRemotePinInfo->getPinState(rule->targetMeyPinId) ^ true);
BroadcastTriggerMeyPinCanPackage(rule->targetDevId, rule->targetMeyPinId, pinState); BroadcastTriggerMeyPinCanPackage(rule->targetDevId, rule->targetMeyPinId, pinState);
currentPinState->setPinState(rule->targetMeyPinId, pinState); currentRemotePinInfo->setPinState(rule->targetMeyPinId, pinState);
} }
void HandleTriggered(can_frame *frame) void HandleTriggered(can_frame *frame)

View File

@@ -13,6 +13,8 @@ struct Rule
bool toggle; bool toggle;
bool inverse; bool inverse;
Rule *nextRule = NULL; Rule *nextRule = NULL;
bool lastPinState = false;
bool triggeredOnce = false;
void AddRule(Rule *rule) void AddRule(Rule *rule)
{ {