diff --git a/IR-Protocol.ino b/IR-Protocol.ino index 1897beb..943ebf1 100644 --- a/IR-Protocol.ino +++ b/IR-Protocol.ino @@ -116,7 +116,7 @@ Timer t1(730, millis, []() { break; case 30: - encForward.sendBackTo(targetAddr, data0, sizeof(data0)); + encForward.sendBackTo(targetAddr); break; case 31: encForward.sendBackTo(targetAddr, data1, sizeof(data1)); @@ -227,9 +227,6 @@ void loop() { //test void status(IR_Decoder& dec) { - - - if (dec.gotData.available()) { String str; if (/* dec.gotData.getDataPrt()[1] */1) { @@ -279,6 +276,56 @@ void status(IR_Decoder& dec) { // obj->resetAvailable(); Serial.write(str.c_str()); } + + if (dec.gotBackData.available()) { + String str; + if (/* dec.gotData.getDataPrt()[1] */1) { + str += ("BackData on pin "); str += (dec.isrPin); str += "\n"; + + uint8_t msg = dec.gotBackData.getMsgRAW(); + str += (" MSG: "); + for (size_t i = 0; i < 8; i++) { + if (i == 3) str += " "; + str += (msg >> (7 - i)) & 1U; + } + + str += "\n"; + + str += (" DATA SIZE: "); str += (dec.gotBackData.getDataSize()); str += "\n"; + str += (" ADDRESS FROM: "); str += (dec.gotBackData.getAddrFrom()); str += "\n"; + // str += (" ADDRESS TO: "); str += (dec.gotBackData.getAddrTo()); str += "\n"; + // str += (" CRC PACK: "); str += (dec.gotBackData.getCrcIN()); str += "\n"; + // str += (" CRC CALC: "); str += (dec.gotBackData.getCrcCALC()); str += "\n"; + str += "\n"; + + for (size_t i = 0; i < min(10, dec.gotBackData.getDataSize()); i++) { + switch (i) { + // case 0: + // str += (" ADDR: "); + // break; + // case 1: + // str += (" CMD: "); + // break; + + default: + str += (" Data["); str += (i); str += ("]: "); + break; + } + str += (dec.gotBackData.getDataPrt()[i]); str += "\n"; + } + + + str += ("\n*******ErrAll: "); str += (dec.gotBackData.getErrorCount()); str += "\n"; + str += ("**ErrDistance: "); str += ((int)(dec.gotBackData.getErrorHighSignal() - dec.gotBackData.getErrorLowSignal())); str += "\n"; + + str += "\n"; + } else { + str += ("SELF"); str += "\n"; + str += "\n"; + } + // obj->resetAvailable(); + Serial.write(str.c_str()); + } } diff --git a/IR_Decoder.h b/IR_Decoder.h index 1de1d0e..1370d12 100644 --- a/IR_Decoder.h +++ b/IR_Decoder.h @@ -4,219 +4,43 @@ class IR_Decoder : public IR_DecoderRaw { 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) { } - Data gotData; - void tick() { IR_DecoderRaw::tick(); if (available()) { + #ifdef IRDEBUG_INFO Serial.println("PARSING RAW DATA"); - + #endif + bool isNeenAccept = false; switch (packInfo.buffer[0] >> 5 & IR_MASK_MSG_TYPE) { - case IR_MSG_DATA_NOACCEPT: - gotData.set(&packInfo); - break; case IR_MSG_DATA_ACCEPT: + isNeenAccept = true; + case IR_MSG_DATA_NOACCEPT: + gotData.set(&packInfo, id); break; case IR_MSG_BACK: - break; 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; } + + } } }; - -// class IDataPack : protected IR_FOX { -// friend IR_Decoder; -// public: -// IDataPack(IR_Decoder* dec) : dec(dec) {}; - -// public: -// bool available() { if (isAvailable) { isAvailable = false; return true; } else { return isAvailable; }; }; -// virtual uint8_t getMsgInfo() { return msgPtr[0] & IR_MASK_MSG_INFO; }; -// virtual uint8_t getMsgType() { return (msgPtr[0] >> 5) & IR_MASK_MSG_TYPE; }; -// virtual uint8_t getMsgRAW() { return msgPtr[0]; }; -// virtual uint16_t getErrorCount() { return err.all(); }; -// virtual uint8_t getErrorLowSignal() { return err.lowSignal; }; -// virtual uint8_t getErrorHighSignal() { return err.highSignal; }; -// virtual uint8_t getErrorOther() { return err.other; }; -// // uint16_t getCrcIN() { return crcPtr[0] << 8 | crcPtr[1]; }; -// // uint16_t getCrcCALC() { return crcCalcVal; }; -// virtual uint16_t getTunerTime() { return bitPeriod; }; -// void resetAvailable() { isAvailable = false; }; - -// protected: -// inline static uint8_t data[dataByteSizeMax] { 0 }; - -// inline static uint8_t* msgPtr; -// inline static uint8_t* addrFromPtr; -// inline static uint8_t* addrToPtr; -// inline static uint8_t* dataPtr; -// inline static uint8_t* crcPtr; - -// inline static ErrorsStruct err; -// inline static uint8_t packRawSize; -// inline static uint16_t bitPeriod; -// inline static uint16_t crcCalcVal; - -// IR_Decoder* dec; -// bool isAvailable = false; -// virtual bool checkAddress(PackOutInfo* packInfo) { -// bool ret; -// uint8_t targetAddrOffset = packInfo->offsets.addrToOffset; -// uint16_t address = (packInfo->ptr[targetAddrOffset] << 8) | (packInfo->ptr[targetAddrOffset + 1]); -// checkaddressRuleApply(address, dec->id, ret); -// return ret; -// }; -// virtual void onPackAddressCorrect(PackOutInfo* packInfo) { -// memset(IDataPack::data, 0, dataByteSizeMax); -// memcpy(data, packInfo->ptr, min(packInfo->packSize, dataByteSizeMax)); -// err = packInfo->err; -// bitPeriod = packInfo->rTime; -// crcCalcVal = packInfo->crc; -// packRawSize = packInfo->packSize; - -// msgPtr = (data + packInfo->offsets.msgOffset); -// addrFromPtr = (data + packInfo->offsets.addrFromOffset); -// addrToPtr = (data + packInfo->offsets.addrToOffset); -// dataPtr = (data + packInfo->offsets.dataOffset); -// crcPtr = (data + packInfo->offsets.crcOffset); -// } - -// virtual void onPackAddressIncorrect(PackOutInfo* packInfo) {} -// virtual void afterSet() {} - -// void set(PackOutInfo packInfo, bool isNeedAddressCheck) { -// isAvailable = false; -// if (!isNeedAddressCheck || checkAddress(&packInfo)) { -// onPackAddressCorrect(&packInfo); -// #ifdef IRDEBUG_INFO -// Serial.println(" OK "); -// #endif -// isAvailable = true; -// } else { -// onPackAddressIncorrect(&packInfo); -// #ifdef IRDEBUG_INFO -// Serial.println(" NOT MY "); -// #endif -// } -// afterSet(); -// } -// }; - -// public: -// /////////////////////////////////////////////////////////////////////////////////////////////////////////// -// class HasAddrFrom { -// public: -// virtual uint16_t getAddrFrom() { return IDataPack::addrFromPtr[0] << 8 | IDataPack::addrFromPtr[1]; }; -// }; - -// class HasAddrTo { -// public: -// virtual uint16_t getAddrTo() { return IDataPack::addrToPtr[0] << 8 | IDataPack::addrToPtr[1]; }; -// }; - -// class HasData { -// public: -// virtual uint8_t getDataSize() { return (uint8_t)(IDataPack::crcPtr - IDataPack::dataPtr); }; -// virtual uint8_t* getDataPrt() { return IDataPack::dataPtr; }; -// virtual uint8_t getDataRawSize() { return IDataPack::packRawSize; }; -// virtual uint8_t* getDataRawPtr() { return IDataPack::data; }; -// }; -// class IAcceptable { -// public: -// virtual bool isNeedAccept(); -// }; -// class AnyData : public IDataPack, public HasAddrFrom, public HasAddrTo, public HasData { -// using IDataPack::IDataPack; -// }; -// /////////////////////////////////////////////////////////////////////////////////////////////////////////// - -// class Data : public AnyData, public IAcceptable { -// using AnyData::AnyData; -// public: -// bool isNeedAccept() override { return ((IDataPack::msgPtr[0] >> 5) & IR_MASK_MSG_TYPE) == IR_MSG_DATA_ACCEPT; }; -// private: -// void afterSet() override { -// if (Data::IDataPack::isAvailable && isNeedAccept()) { -// dec->addrWaitingSendgTo = getAddrFrom(); -// dec->startWaitingSendToTime = millis(); -// dec->isWaitingAcceptSend = true; -// Serial.print("\n Need to accept to "); -// Serial.println(dec->addrWaitingSendgTo); -// } -// } -// }; - -// class BackData : public AnyData { -// using AnyData::AnyData; -// public: -// bool isAddressed() { return IDataPack::msgPtr[0] & 0b00010000; }; -// uint8_t getMsgInfo() { return IDataPack::msgPtr[0] & (IR_MASK_MSG_INFO >> 1); }; -// uint16_t getAddrTo() override { -// if (isAddressed()) { -// return IDataPack::addrToPtr[0] << 8 | IDataPack::addrToPtr[1]; -// } else { -// return IR_Broadcast; -// } -// }; -// }; - -// class Accept : public IDataPack, public HasAddrFrom { -// using IDataPack::IDataPack; -// public: - -// private: -// bool checkAddress(PackOutInfo* packInfo) override { -// bool ret; -// uint8_t targetAddrOffset = packInfo->offsets.addrFromOffset; -// uint16_t address = (packInfo->ptr[targetAddrOffset] << 8) | (packInfo->ptr[targetAddrOffset + 1]); -// ret = address == dec->addrWaitingFrom; -// return ret; -// } -// }; - -// class Request : public IDataPack, public HasAddrFrom, public HasAddrTo { -// using IDataPack::IDataPack; -// public: - -// private: -// // void afterSet() override { -// // if (isAvailable) { -// // dec->isWaitingAcceptSend = true; -// // dec->addrWaitingSendgTo = getAddrFrom(); -// // Serial.print("\n Need to accept to "); -// // Serial.println(dec->addrWaitingSendgTo); -// // } -// // } -// }; - -// class RawTune { -// friend IR_Decoder; -// public: -// bool available() { return isAvailable; }; -// uint16_t getTunerTime() { return bitPeriod; }; -// void resetAvailable() { isAvailable = false; }; -// protected: -// bool isAvailable; -// uint16_t bitPeriod; - -// void set(uint16_t time) { -// bitPeriod = time; -// isAvailable = true; -// } -// }; - -// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index 63c1659..401da09 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -69,7 +69,7 @@ void IR_DecoderRaw::firstRX() { void IR_DecoderRaw::listenStart() { if (isRecive && ((micros() - prevRise) > IR_timeout * 2)) { - Serial.print("\nlis>"); + // Serial.print("\nlis>"); isRecive = false; firstRX(); } @@ -99,7 +99,7 @@ void IR_DecoderRaw::tick() { #endif isRecive = true; isWrongPack = false; - } + } } if (preambFrontCounter > 0) { // в преамбуле @@ -357,11 +357,15 @@ void IR_DecoderRaw::writeToBuffer(bool bit) { if (!isAvailable && isData && !isWrongPack) { if (i_dataBuffer == 8 * msgBytes) {// Ппервый байт packSize = dataBuffer[0] & IR_MASK_MSG_INFO; + #ifdef IRDEBUG_INFO Serial.print(" ["); Serial.print(packSize); Serial.print("] "); + #endif } if (packSize && (i_dataBuffer == packSize * bitPerByte)) { // Конец + #ifdef IRDEBUG_INFO Serial.print(" END DATA "); + #endif packInfo.buffer = dataBuffer; packInfo.crc = crcValue; diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 0848086..1737913 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -127,7 +127,7 @@ void IR_Encoder::_sendBack(bool isAdressed, uint16_t addrTo, uint8_t* data, uint uint8_t packSize = msgBytes + addrBytes + (isAdressed ? addrBytes : 0) + min(1, len) + crcBytes; uint8_t msgType = - (IR_MSG_BACK << 5) | (isAdressed << 4U) | ((packSize) & (IR_MASK_MSG_INFO >> 1)); + ((isAdressed ? IR_MSG_BACK_TO : IR_MSG_BACK)<<5) | ((packSize) & (IR_MASK_MSG_INFO >> 1)); // формирование массива // msg_type diff --git a/IR_config.h b/IR_config.h index f2a315c..e3adc1d 100644 --- a/IR_config.h +++ b/IR_config.h @@ -48,55 +48,55 @@ msg type: #define IR_MSG_ 5U // | 101..... | = ?? #define IR_MSG_DATA_NOACCEPT 6U // | 110..... | = данные, не требующие подтверждения #define IR_MSG_DATA_ACCEPT 7U // | 111..... | = данные требующие подтверждения - /*   // ---------- +;/*   // ---------- - /```````````````````` подтверждение ```````````````````\      /``````````````````````````````````````` запрос ``````````````````````````````````\ -                                                                                                                        - {``````````} [````````````````````````] [``````````````]      {``````````} [````````````````````````] [````````````````````````] [``````````````] - { msg type } [ addr_from uint16_t ] [ CRC Bytes ]      { msg type } [ addr_from uint16_t ] [ addr_to uint16_t ] [ CRC Bytes ] - {..........} [........................] [..............]      {..........} [........................] [........................] [..............] -                                                                                                                                                   - { 001..... } [addr_from_H][addr_from_L] [ crc1 ][ crc2 ]      { 010..... } [addr_from_H][addr_from_L] [addr_from_H][addr_from_L] [ crc1 ][ crc2 ] - |     0            1           2           3       4          |     0            1           2              3           4           5       6     - \__________________________________________/       |          \_____________________________________________________________________/       |     - |                                                  |          |                                                                             |     - \__________________________________________________/          \_____________________________________________________________________________/     +/```````````````````` подтверждение ```````````````````\      /``````````````````````````````````````` запрос ``````````````````````````````````\ +                                                                                                                       +{``````````} [````````````````````````] [``````````````]      {``````````} [````````````````````````] [````````````````````````] [``````````````] +{ msg type } [ addr_from uint16_t ] [ CRC Bytes ]      { msg type } [ addr_from uint16_t ] [ addr_to uint16_t ] [ CRC Bytes ] +{..........} [........................] [..............]      {..........} [........................] [........................] [..............] +                                                                                                                                                  +{ 001..... } [addr_from_H][addr_from_L] [ crc1 ][ crc2 ]      { 010..... } [addr_from_H][addr_from_L] [addr_from_H][addr_from_L] [ crc1 ][ crc2 ] +|     0            1           2           3       4          |     0            1           2              3           4           5       6     +\__________________________________________/       |          \_____________________________________________________________________/       |     +|                                                  |          |                                                                             |     +\__________________________________________________/          \_____________________________________________________________________________/     - /`````````````````````` Задний сигнал машинки без адресации ``````````````````````\        В (IR_MASK_MSG_INFO & 15U) содержится количество байт -                                                                                            сквозных команд, максимум 15 - {``````````} [````````````````````````] [````````````````````````] [``````````````]        Если полезных байт информации нет, отправляется один - { msg type } [ addr_from uint16_t ] [====== data bytes ======] [ CRC Bytes ]        байт нулей - {..........} [........................] [........................] [..............]         -                                                                                             - { 0000xxxx } [addr_from_H][addr_from_L] [data_H][data_n..][data_L] [ crc1 ][ crc2 ]         - |     0           1            2            3                         |       |             - \_____________________________________________________________________/       |             - |                                                                             |             - \_____________________________________________________________________________/             +/`````````````````````` Задний сигнал машинки без адресации ``````````````````````\        В (IR_MASK_MSG_INFO & 15U) содержится количество байт +                                                                                           сквозных команд, максимум 15 +{``````````} [````````````````````````] [````````````````````````] [``````````````]        Если полезных байт информации нет, отправляется один +{ msg type } [ addr_from uint16_t ] [====== data bytes ======] [ CRC Bytes ]        байт нулей +{..........} [........................] [........................] [..............]         +                                                                                            +{ 0000xxxx } [addr_from_H][addr_from_L] [data_H][data_n..][data_L] [ crc1 ][ crc2 ]         +|     0           1            2            3                         |       |             +\_____________________________________________________________________/       |             +|                                                                             |             +\_____________________________________________________________________________/             - /```````````````````````````````````` Задний сигнал машинки с адресацией ````````````````````````````````````\  -                                                                                      - {``````````} [````````````````````````] [````````````````````````] [````````````````````````] [``````````````]  - { msg type } [ addr_from uint16_t ] [ addr_to uint16_t ] [====== data bytes ======] [ CRC Bytes ]  - {..........} [........................] [........................] [........................] [..............]  -                                                                                                                 - { 0001xxxx } [addr_from_H][addr_from_L] [addr_from_H][addr_from_L] [data_H][data_n..][data_L] [ crc1 ][ crc2 ]  - |     0           1            2              3           4            5                         |       |      - \________________________________________________________________________________________________/       |      - |                                                                                                        |      - \________________________________________________________________________________________________________/      +/```````````````````````````````````` Задний сигнал машинки с адресацией ````````````````````````````````````\  +                                                                                     +{``````````} [````````````````````````] [````````````````````````] [````````````````````````] [``````````````]  +{ msg type } [ addr_from uint16_t ] [ addr_to uint16_t ] [====== data bytes ======] [ CRC Bytes ]  +{..........} [........................] [........................] [........................] [..............]  +                                                                                                                +{ 0001xxxx } [addr_from_H][addr_from_L] [addr_from_H][addr_from_L] [data_H][data_n..][data_L] [ crc1 ][ crc2 ]  +|     0           1            2              3           4            5                         |       |      +\________________________________________________________________________________________________/       |      +|                                                                                                        |      +\________________________________________________________________________________________________________/      - */ +*/ #define IR_MASK_MSG_TYPE 0b00000111 #define IR_MASK_MSG_INFO 0b00011111 - /* - /////////////////////////////////////////////////////////////////////////////////////*/ +/* +/////////////////////////////////////////////////////////////////////////////////////*/ typedef uint16_t crc_t; #define bytePerPack 16 // колличество байтов в пакете @@ -167,16 +167,15 @@ public: uint16_t rTime = 0; }; -protected: - ErrorsStruct errors; - - void checkaddressRuleApply(uint16_t address, uint16_t id, bool& flag) { + static void checkaddressRuleApply(uint16_t address, uint16_t id, bool& flag) { flag = false; flag |= id == 0; flag |= address == id; flag |= address >= IR_Broadcast; } +protected: + ErrorsStruct errors; uint8_t crc8(uint8_t* data, uint8_t start, uint8_t end, uint8_t poly) { //TODO: сделать возможность межбайтовой проверки uint8_t crc = 0xff; size_t i, j; diff --git a/PacketTypes.h b/PacketTypes.h index c2ec819..d5bbce2 100644 --- a/PacketTypes.h +++ b/PacketTypes.h @@ -1,86 +1,312 @@ #pragma once #include "IR_config.h" -class IOffsets { -protected: - uint8_t msgOffset; - uint8_t addressFromOffset; - uint8_t addressToOffset; - uint8_t DataOffset; -}; - -class IPackInfo { -public: - IR_FOX::PackInfo* packInfo; -}; - -class IBaseEmptyPack : virtual public IOffsets, virtual public IPackInfo { -}; - class IR_Decoder; -class IEmptyPack : virtual protected IBaseEmptyPack { - friend IR_Decoder; - bool isAvailable; +namespace PacketTypes { + class BasePack { + friend IR_Decoder; + protected: + bool isAvailable; + bool isRawAvailable; + bool isNeedAccept; -protected: - virtual void set(IR_FOX::PackInfo *packInfo) { - IBaseEmptyPack::IPackInfo::packInfo = packInfo; - Serial.print(" SET "); + uint8_t msgOffset; + uint8_t addressFromOffset; + uint8_t addressToOffset; + uint8_t DataOffset; - Serial.print("\n*******ErrAll: "); Serial.println(packInfo->err.all()); - Serial.print("**ErrDistance: "); Serial.println((int)(packInfo->err.highSignal - packInfo->err.lowSignal)); + IR_FOX::PackInfo* packInfo; + uint16_t id; - isAvailable = true; - } + virtual bool checkAddress(); + void set(IR_FOX::PackInfo* packInfo, uint16_t id) { + this->packInfo = packInfo; + this->id = id; -public: - virtual bool available() { - if (isAvailable) { - isAvailable = false; - return true; - } else { - return false; + if (isAvailable = checkAddress()) { + isAvailable = true; + isRawAvailable = true; + Serial.print(" OK "); + } else { + isRawAvailable = true; + Serial.print(" NOT-OK "); + } + } + + + static uint16_t _getAddrFrom(BasePack* obj) { + return (obj->packInfo->buffer[obj->addressFromOffset] << 8) | obj->packInfo->buffer[obj->addressFromOffset + 1]; + }; + static uint16_t _getAddrTo(BasePack* obj) { + return (obj->packInfo->buffer[obj->addressToOffset] << 8) | obj->packInfo->buffer[obj->addressToOffset + 1]; + }; + + static uint8_t _getDataSize(BasePack* obj) { + return obj->packInfo->packSize - crcBytes - obj->DataOffset; + }; + static uint8_t* _getDataPrt(BasePack* obj) { + return obj->packInfo->buffer + obj->DataOffset; + }; + static uint8_t _getDataRawSize(BasePack* obj) { + return obj->packInfo->packSize; + }; + static uint8_t* _getDataRawPtr(BasePack* obj) { + return obj->packInfo->buffer; + }; + + + public: + bool available() { if (isAvailable) { isAvailable = false; isRawAvailable = false; return true; } else { return false; } }; + bool availableRaw() { if (isRawAvailable) { isRawAvailable = false; return true; } else { return false; } }; + uint8_t getMsgInfo() { return packInfo->buffer[0] & IR_MASK_MSG_INFO; }; + uint8_t getMsgType() { return (packInfo->buffer[0] >> 5) & IR_MASK_MSG_TYPE; }; + uint8_t getMsgRAW() { return packInfo->buffer[0]; }; + uint16_t getErrorCount() { return packInfo->err.all(); }; + uint8_t getErrorLowSignal() { return packInfo->err.lowSignal; }; + uint8_t getErrorHighSignal() { return packInfo->err.highSignal; }; + uint8_t getErrorOther() { return packInfo->err.other; }; + uint16_t getTunerTime() { return packInfo->rTime; }; + }; + + + class Data : public BasePack { + public: + Data() { + msgOffset = 0; + addressFromOffset = 1; + addressToOffset = 3; + DataOffset = 5; + } + + uint16_t getAddrFrom() { return _getAddrFrom(this); }; + uint16_t getAddrTo() { return _getAddrTo(this); }; + + uint8_t getDataSize() { return _getDataSize(this); }; + uint8_t* getDataPrt() { return _getDataPrt(this); }; + uint8_t getDataRawSize() { return _getDataRawSize(this); }; + uint8_t* getDataRawPtr() { return _getDataRawPtr(this); }; + + private: + bool checkAddress() override { + bool ret; + IR_FOX::checkaddressRuleApply(getAddrTo(), this->id, ret); + return ret; } }; - virtual uint8_t getMsgInfo() { return packInfo->buffer[0] & IR_MASK_MSG_INFO; }; - virtual uint8_t getMsgType() { return (packInfo->buffer[0] >> 5) & IR_MASK_MSG_TYPE; }; - virtual uint8_t getMsgRAW() { return packInfo->buffer[0]; }; - virtual uint16_t getErrorCount() { return packInfo->err.all(); }; - virtual uint8_t getErrorLowSignal() { return packInfo->err.lowSignal; }; - virtual uint8_t getErrorHighSignal() { return packInfo->err.highSignal; }; - virtual uint8_t getErrorOther() { return packInfo->err.other; }; - virtual uint16_t getTunerTime() { return packInfo->rTime; }; -}; -class IHasAddresFrom : virtual protected IBaseEmptyPack { -public: - virtual uint16_t getAddrFrom() { return (packInfo->buffer[addressFromOffset]<<8) | packInfo->buffer[addressFromOffset + 1]; }; -}; + class DataBack : public BasePack { + public: + DataBack() { + msgOffset = 0; + addressFromOffset = 1; + addressToOffset = 3; + DataOffset = 3; + } -class IHasAddresTo : virtual protected IBaseEmptyPack { -public: - virtual uint16_t getAddrTo() { return (packInfo->buffer[addressToOffset]<<8) | packInfo->buffer[addressToOffset + 1]; }; -}; + uint16_t getAddrFrom() { return _getAddrFrom(this); }; + uint16_t getAddrTo() { return _getAddrTo(this); }; -class IHasAddresData : virtual protected IBaseEmptyPack { -public: - virtual uint8_t getDataSize() { return &(packInfo->buffer[packInfo->packSize - 2]) - &(packInfo->buffer[DataOffset]); }; // TODO: - virtual uint8_t* getDataPrt() { return packInfo->buffer + DataOffset; }; - virtual uint8_t getDataRawSize() { return packInfo->packSize; }; - virtual uint8_t* getDataRawPtr() { return packInfo->buffer; }; -}; + uint8_t getDataSize() { return _getDataSize(this); }; + uint8_t* getDataPrt() { return _getDataPrt(this); }; + uint8_t getDataRawSize() { return _getDataRawSize(this); }; + uint8_t* getDataRawPtr() { return _getDataRawPtr(this); }; + private: + bool checkAddress() override { + bool ret; + if (getMsgType() == IR_MSG_BACK_TO) { + DataOffset = 5; + IR_FOX::checkaddressRuleApply((packInfo->buffer[addressToOffset] << 8) | packInfo->buffer[addressToOffset + 1], this->id, ret); + } else { + DataOffset = 3; + ret = true; + } + return ret; + } + }; + class Accept : public BasePack { + public: + Accept() { + msgOffset = 0; + addressFromOffset = 1; + DataOffset = 1; + } -class Data : - virtual public IEmptyPack, - virtual public IHasAddresFrom, - virtual public IHasAddresTo, - virtual public IHasAddresData { -public: - Data() { - msgOffset = 0; - addressFromOffset = 1; - addressToOffset = 3; - DataOffset = 5; - } -}; \ No newline at end of file + uint16_t getAddrFrom() { return _getAddrFrom(this); }; + private: + bool checkAddress() override { return true; } + }; + + class Request : public BasePack { + public: + Request() { + msgOffset = 0; + addressFromOffset = 1; + addressToOffset = 3; + DataOffset = 3; + } + + uint16_t getAddrFrom() { return _getAddrFrom(this); }; + uint16_t getAddrTo() { return _getAddrTo(this); }; + + private: + bool checkAddress() override { + bool ret; + IR_FOX::checkaddressRuleApply(getAddrTo(), this->id, ret); + return ret; + } + }; + +} + +// class IOffsets { +// protected: +// uint8_t msgOffset; +// uint8_t addressFromOffset; +// uint8_t addressToOffset; +// uint8_t DataOffset; +// }; + +// class IPackInfo { +// public: +// IR_FOX::PackInfo* packInfo; +// }; + +// class IBaseEmptyPack : virtual public IOffsets, virtual public IPackInfo { +// }; + +// class IR_Decoder; +// class IEmptyPack : virtual protected IBaseEmptyPack, virtual public IR_FOX { +// friend IR_Decoder; +// bool isAvailable; +// bool isRawAvailable; +// bool isNeedAccept; + +// protected: +// uint16_t id; + +// virtual bool checkAddress() {}; + +// virtual void set(IR_FOX::PackInfo* packInfo, uint16_t id, bool isNeedAccept = false) { +// IBaseEmptyPack::IPackInfo::packInfo = packInfo; +// this->id = id; +// this->isNeedAccept = isNeedAccept; + +// if (isAvailable = checkAddress()) { +// isAvailable = true; +// isRawAvailable = true; +// Serial.print(" OK "); +// } else { +// isRawAvailable = true; +// Serial.print(" NOT-OK "); +// } +// } + +// public: +// virtual bool available() { if (isAvailable) { isAvailable = false; isRawAvailable = false; return true; } else { return false; } }; +// virtual bool availableRaw() { if (isRawAvailable) { isRawAvailable = false; return true; } else { return false; } }; +// virtual uint8_t getMsgInfo() { return packInfo->buffer[0] & IR_MASK_MSG_INFO; }; +// virtual uint8_t getMsgType() { return (packInfo->buffer[0] >> 5) & IR_MASK_MSG_TYPE; }; +// virtual uint8_t getMsgRAW() { return packInfo->buffer[0]; }; +// virtual uint16_t getErrorCount() { return packInfo->err.all(); }; +// virtual uint8_t getErrorLowSignal() { return packInfo->err.lowSignal; }; +// virtual uint8_t getErrorHighSignal() { return packInfo->err.highSignal; }; +// virtual uint8_t getErrorOther() { return packInfo->err.other; }; +// virtual uint16_t getTunerTime() { return packInfo->rTime; }; +// }; + +// class IHasAddresFrom : virtual protected IBaseEmptyPack { +// public: +// virtual uint16_t getAddrFrom() { return (packInfo->buffer[addressFromOffset] << 8) | packInfo->buffer[addressFromOffset + 1]; }; +// }; + +// class IHasAddresTo : virtual protected IBaseEmptyPack { +// public: +// virtual uint16_t getAddrTo() { return (packInfo->buffer[addressToOffset] << 8) | packInfo->buffer[addressToOffset + 1]; }; +// }; + +// class IHasAddresData : virtual protected IBaseEmptyPack { +// public: +// virtual uint8_t getDataSize() { return packInfo->packSize - crcBytes - DataOffset; }; +// virtual uint8_t* getDataPrt() { return packInfo->buffer + DataOffset; }; +// virtual uint8_t getDataRawSize() { return packInfo->packSize; }; +// virtual uint8_t* getDataRawPtr() { return packInfo->buffer; }; +// }; + +// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// class Data : +// virtual public IEmptyPack, +// virtual public IHasAddresFrom, +// virtual public IHasAddresTo, +// virtual public IHasAddresData { +// public: +// Data() { +// msgOffset = 0; +// addressFromOffset = 1; +// addressToOffset = 3; +// DataOffset = 5; +// } +// protected: +// bool checkAddress() override { +// bool ret; +// checkaddressRuleApply(getAddrTo(), this->id, ret); +// return ret; +// } +// }; + +// class DataBack : +// virtual public IEmptyPack, +// virtual public IHasAddresFrom, +// virtual public IHasAddresData { +// public: +// DataBack() { +// msgOffset = 0; +// addressFromOffset = 1; +// addressToOffset = 3; +// DataOffset = 3; +// } +// protected: +// bool checkAddress() override { +// bool ret; +// if (getMsgType() == IR_MSG_BACK_TO) { +// DataOffset = 5; +// checkaddressRuleApply((packInfo->buffer[addressToOffset] << 8) | packInfo->buffer[addressToOffset + 1], this->id, ret); +// } else { +// DataOffset = 3; +// ret = true; +// } +// return ret; +// } +// }; + +// class Request : +// virtual public IEmptyPack, +// virtual public IHasAddresFrom, +// virtual public IHasAddresTo { +// public: +// Request() { +// msgOffset = 0; +// addressFromOffset = 1; +// addressToOffset = 3; +// DataOffset = 3; +// } +// protected: +// bool checkAddress() override { +// bool ret; +// checkaddressRuleApply(getAddrTo(), this->id, ret); +// return ret; +// } +// }; + +// class Accept : +// virtual public IEmptyPack, +// virtual public IHasAddresFrom { +// public: +// Accept() { +// msgOffset = 0; +// addressFromOffset = 1; +// DataOffset = 1; +// } +// protected: +// };