diff --git a/IR-Protocol.ino b/IR-Protocol.ino index bc499f5..1897beb 100644 --- a/IR-Protocol.ino +++ b/IR-Protocol.ino @@ -230,58 +230,56 @@ void status(IR_Decoder& dec) { - // IR_DecoderRaw::AnyData* infoArr [] = { &dec.gotData, &dec.gotBackData }; - // for (auto&& obj : infoArr) { - // if (obj->available()) { - // String str; - // if (obj->getDataPrt()[1]) { - // str += ("Data on pin "); str += (dec.isrPin); str += "\n"; + if (dec.gotData.available()) { + String str; + if (/* dec.gotData.getDataPrt()[1] */1) { + str += ("Data on pin "); str += (dec.isrPin); str += "\n"; - // uint8_t msg = obj->getMsgRAW(); - // str += (" MSG: "); - // for (size_t i = 0; i < 8; i++) { - // if (i == 3) str += " "; - // str += (msg >> (7 - i)) & 1U; - // } + uint8_t msg = dec.gotData.getMsgRAW(); + str += (" MSG: "); + for (size_t i = 0; i < 8; i++) { + if (i == 3) str += " "; + str += (msg >> (7 - i)) & 1U; + } - // str += "\n"; + str += "\n"; - // str += (" DATA SIZE: "); str += (obj->getDataSize()); str += "\n"; - // str += (" ADDRESS FROM: "); str += (obj->getAddrFrom()); str += "\n"; - // str += (" ADDRESS TO: "); str += (obj->getAddrTo()); str += "\n"; - // // str += (" CRC PACK: "); str += (obj->getCrcIN()); str += "\n"; - // // str += (" CRC CALC: "); str += (obj->getCrcCALC()); str += "\n"; - // str += "\n"; + str += (" DATA SIZE: "); str += (dec.gotData.getDataSize()); str += "\n"; + str += (" ADDRESS FROM: "); str += (dec.gotData.getAddrFrom()); str += "\n"; + str += (" ADDRESS TO: "); str += (dec.gotData.getAddrTo()); str += "\n"; + // str += (" CRC PACK: "); str += (dec.gotData.getCrcIN()); str += "\n"; + // str += (" CRC CALC: "); str += (dec.gotData.getCrcCALC()); str += "\n"; + str += "\n"; - // for (size_t i = 0; i < obj->getDataSize(); i++) { - // switch (i) { - // // case 0: - // // str += (" ADDR: "); - // // break; - // // case 1: - // // str += (" CMD: "); - // // break; + for (size_t i = 0; i < min(10, dec.gotData.getDataSize()); i++) { + switch (i) { + // case 0: + // str += (" ADDR: "); + // break; + // case 1: + // str += (" CMD: "); + // break; - // default: - // str += (" Data["); str += (i); str += ("]: "); - // break; - // } - // str += (obj->getDataPrt()[i]); str += "\n"; - // } + default: + str += (" Data["); str += (i); str += ("]: "); + break; + } + str += (dec.gotData.getDataPrt()[i]); str += "\n"; + } - // str += ("\n*******ErrAll: "); str += (obj->getErrorCount()); str += "\n"; - // str += ("**ErrDistance: "); str += ((int)(obj->getErrorHighSignal() - obj->getErrorLowSignal())); str += "\n"; + str += ("\n*******ErrAll: "); str += (dec.gotData.getErrorCount()); str += "\n"; + str += ("**ErrDistance: "); str += ((int)(dec.gotData.getErrorHighSignal() - dec.gotData.getErrorLowSignal())); str += "\n"; - // str += "\n"; - // } else { - // str += ("SELF"); str += "\n"; - // str += "\n"; - // } - // obj->resetAvailable(); - // Serial.write(str.c_str()); - // } - // } + 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 4859f02..1de1d0e 100644 --- a/IR_Decoder.h +++ b/IR_Decoder.h @@ -4,11 +4,9 @@ class IR_Decoder : public IR_DecoderRaw { public: - IR_Decoder(const uint8_t isrPin, uint16_t addr, IR_Encoder* encPair = nullptr) : - IR_DecoderRaw(isrPin, addr, encPair), - gotData(Data(&packInfo)) { + IR_Decoder(const uint8_t isrPin, uint16_t addr, IR_Encoder* encPair = nullptr) : IR_DecoderRaw(isrPin, addr, encPair) { } - + Data gotData; void tick() { @@ -16,9 +14,9 @@ public: if (available()) { Serial.println("PARSING RAW DATA"); - switch (packInfo.buffer[0] & IR_MASK_MSG_TYPE) { + switch (packInfo.buffer[0] >> 5 & IR_MASK_MSG_TYPE) { case IR_MSG_DATA_NOACCEPT: - + gotData.set(&packInfo); break; case IR_MSG_DATA_ACCEPT: break; @@ -34,28 +32,10 @@ public: default: break; } - } } - - }; - - - - - - - - - - - - - - - // class IDataPack : protected IR_FOX { // friend IR_Decoder; // public: diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index 5849f22..d82a40e 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -96,6 +96,7 @@ void IR_DecoderRaw::tick() { // Serial.print(" SUB: "); Serial.println(currentFront.time - prevRise); #endif isRecive = true; + isWrongPack = false; } } @@ -326,6 +327,7 @@ void IR_DecoderRaw::writeToBuffer(bool bit) { #ifdef IRDEBUG_INFO Serial.print("****************"); #endif + isRecive = false; }; }//**************************************************************************************************// @@ -343,7 +345,7 @@ void IR_DecoderRaw::writeToBuffer(bool bit) { if (i_dataBuffer == ((msgBytes)*bitPerByte)) { Serial.print(" -> "); Serial.print(dataBuffer[0] & IR_MASK_MSG_INFO); Serial.print(" ->"); } if (i_dataBuffer == ((msgBytes + addrBytes) * bitPerByte)) { Serial.print(" |"); } if (i_dataBuffer == ((msgBytes + addrBytes + addrBytes) * bitPerByte)) { Serial.print(" ->"); } - if (i_dataBuffer == ((dataBuffer[0] & IR_MASK_MSG_INFO) * bitPerByte)) { Serial.print(" <-"); } + if (i_dataBuffer == (((dataBuffer[0] & IR_MASK_MSG_INFO)-2) * bitPerByte)) { Serial.print(" <-"); } } #endif @@ -353,7 +355,7 @@ void IR_DecoderRaw::writeToBuffer(bool bit) { Serial.print(" ["); Serial.print(packSize); Serial.print("] "); } - if (packSize && (i_dataBuffer == packSize*bitPerByte)) { // Конец + if (packSize && (i_dataBuffer == packSize * bitPerByte)) { // Конец Serial.print(" END DATA "); packInfo.buffer = dataBuffer; diff --git a/IR_config.h b/IR_config.h index 19fafa4..f2a315c 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 // колличество байтов в пакете @@ -147,8 +147,8 @@ public: struct ErrorsStruct { uint8_t lowSignal = 0; - uint8_t highSignal= 0; - uint8_t other= 0; + uint8_t highSignal = 0; + uint8_t other = 0; void reset() { lowSignal = 0; @@ -162,7 +162,7 @@ public: struct PackInfo { uint8_t* buffer = nullptr; uint8_t packSize = 0; - uint16_t crc= 0; + uint16_t crc = 0; ErrorsStruct err; uint16_t rTime = 0; }; @@ -170,7 +170,7 @@ public: protected: ErrorsStruct errors; - void checkaddressRuleApply(uint16_t address, uint16_t id, bool &flag) { + void checkaddressRuleApply(uint16_t address, uint16_t id, bool& flag) { flag = false; flag |= id == 0; flag |= address == id; diff --git a/PacketTypes.h b/PacketTypes.h index b75693a..c2ec819 100644 --- a/PacketTypes.h +++ b/PacketTypes.h @@ -2,7 +2,7 @@ #include "IR_config.h" class IOffsets { -public: +protected: uint8_t msgOffset; uint8_t addressFromOffset; uint8_t addressToOffset; @@ -14,14 +14,34 @@ public: IR_FOX::PackInfo* packInfo; }; -class IBaseEmptyPack : virtual public IOffsets, virtual public IPackInfo {}; +class IBaseEmptyPack : virtual public IOffsets, virtual public IPackInfo { +}; +class IR_Decoder; class IEmptyPack : virtual protected IBaseEmptyPack { + friend IR_Decoder; bool isAvailable; +protected: + virtual void set(IR_FOX::PackInfo *packInfo) { + IBaseEmptyPack::IPackInfo::packInfo = packInfo; + Serial.print(" SET "); + + Serial.print("\n*******ErrAll: "); Serial.println(packInfo->err.all()); + Serial.print("**ErrDistance: "); Serial.println((int)(packInfo->err.highSignal - packInfo->err.lowSignal)); + + isAvailable = true; + } + public: - IEmptyPack(IR_FOX::PackInfo* _packInfo) { packInfo = _packInfo; } - virtual bool available() { if (isAvailable) { isAvailable = false; return true; } else { return false; } }; + virtual bool available() { + if (isAvailable) { + isAvailable = 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]; }; @@ -33,27 +53,34 @@ public: }; class IHasAddresFrom : virtual protected IBaseEmptyPack { - virtual uint16_t getAddrFrom() { return packInfo->buffer[addressFromOffset] | packInfo->buffer[addressFromOffset + 1]; }; +public: + virtual uint16_t getAddrFrom() { return (packInfo->buffer[addressFromOffset]<<8) | packInfo->buffer[addressFromOffset + 1]; }; }; class IHasAddresTo : virtual protected IBaseEmptyPack { - virtual uint16_t getAddrTo() { return packInfo->buffer[addressToOffset] | packInfo->buffer[addressToOffset + 1]; }; +public: + virtual uint16_t getAddrTo() { return (packInfo->buffer[addressToOffset]<<8) | packInfo->buffer[addressToOffset + 1]; }; }; class IHasAddresData : virtual protected IBaseEmptyPack { - virtual uint8_t getDataSize() { return /* packInfo->buffer[packInfo->packSize-2] */0; };//TODO: +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; }; }; - class Data : virtual public IEmptyPack, - virtual public IHasAddresFrom { + virtual public IHasAddresFrom, + virtual public IHasAddresTo, + virtual public IHasAddresData { public: - Data(IR_FOX::PackInfo* packInfo) : IEmptyPack(packInfo) { + Data() { msgOffset = 0; + addressFromOffset = 1; + addressToOffset = 3; + DataOffset = 5; } }; \ No newline at end of file