#pragma once #include "IR_DecoderRaw.h" #include "PacketTypes.h" #include "IR_Encoder.h" class IR_Decoder : public IR_DecoderRaw { uint32_t acceptSendTimer; bool isWaitingAcceptSend; uint16_t addrAcceptSendTo; uint16_t acceptDelay = 75; uint8_t acceptCustomByte; public: PacketTypes::Data gotData; PacketTypes::DataBack gotBackData; PacketTypes::Accept gotAccept; PacketTypes::Request gotRequest; IR_Decoder(const uint8_t isrPin, uint16_t addr, IR_Encoder* encPair = nullptr) : IR_DecoderRaw(isrPin, addr, encPair) {} void tick() { IR_DecoderRaw::tick(); if (available()) { #ifdef IRDEBUG_INFO Serial.println("PARSING RAW DATA"); #endif isWaitingAcceptSend = false; switch (packInfo.buffer[0] >> 5 & IR_MASK_MSG_TYPE) { case IR_MSG_DATA_ACCEPT: case IR_MSG_DATA_NOACCEPT: gotData.set(&packInfo, id); break; case IR_MSG_BACK: case IR_MSG_BACK_TO: gotBackData.set(&packInfo, id); break; case IR_MSG_REQUEST: gotRequest.set(&packInfo, id); break; case IR_MSG_ACCEPT: gotAccept.set(&packInfo, id); break; default: break; } if (gotData.isAvailable && (gotData.getMsgType() == IR_MSG_DATA_ACCEPT)) { acceptSendTimer = millis(); addrAcceptSendTo = gotData.getAddrFrom(); acceptCustomByte = crc8(gotData.getDataPrt(), 0, gotData.getDataSize(), poly1); if (addrAcceptSendTo && addrAcceptSendTo < IR_Broadcast) isWaitingAcceptSend = true; } } if (isWaitingAcceptSend && millis() - acceptSendTimer > 75) { encoder->sendAccept(addrAcceptSendTo, acceptCustomByte); isWaitingAcceptSend = false; } } void setAcceptDelay(uint16_t acceptDelay) { this->acceptDelay = acceptDelay; } uint16_t getAcceptDelay() { return this->acceptDelay; } };