#include "MeyRule.h" #include "MeyCan.h" #include #include ; RemotePinInfo remotePinInfo = RemotePinInfo(); Rule *rules = NULL; void PutRule(Rule *rule) { if (rules == NULL) rules = rule; else rules->AddRule(rule); } void AddSimple(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId) { Rule *rule = new Rule(); rule->sourceDevId = sourceDevId; rule->sourceMeyPinId = sourceMeyPinId; rule->targetDevId = targetDevId; rule->targetMeyPinId = targetMeyPinId; rule->toggle = false; rule->inverse = false; PutRule(rule); } void AddToggle(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId) { Rule *rule = new Rule(); rule->sourceDevId = sourceDevId; rule->sourceMeyPinId = sourceMeyPinId; rule->targetDevId = targetDevId; rule->targetMeyPinId = targetMeyPinId; rule->toggle = true; rule->inverse = false; PutRule(rule); } void AddToggleInverse(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId) { Rule *rule = new Rule(); rule->sourceDevId = sourceDevId; rule->sourceMeyPinId = sourceMeyPinId; rule->targetDevId = targetDevId; rule->targetMeyPinId = targetMeyPinId; rule->toggle = true; rule->inverse = true; PutRule(rule); } void CheckRule(uint16_t deviceId, uint8_t dt, uint8_t state, Rule *rule) { RemotePinInfo *currentPinState = remotePinInfo.FindOrAdd(rule->targetDevId); if (currentPinState == NULL) return; bool pinState = state > 0; if (rule->inverse) pinState = !pinState; if (rule->toggle) pinState = (currentPinState->getPinState(rule->targetMeyPinId) ^ true); SendDoTriggerSwitchCanPackage(rule->targetDevId, rule->targetMeyPinId, pinState); // //digitalWrite(foundPinId->pin_id, pinState); // //foundPinId->pin_state = pinState; // currentPinState->setPinState(rule->targetMeyPinId, pinState); } void HandleRules(can_frame *frame) { if (rules == NULL) return; if (GetPackageType(frame->can_id) == SWITCH_TRIGGERED_CAN_ID) { uint16_t deviceId = GetDeviceId(frame->can_id); uint8_t dt = frame->data[1]; uint8_t state = frame->data[0]; rules->Traverse(deviceId, dt, state, CheckRule); } }