From 024888e84166936a283c4e6e02262eb38f1fb8fb Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 20 Feb 2024 16:35:02 +0300 Subject: [PATCH] addr check flag added --- IR_Decoder.cpp | 113 ++++++++++++++++++++++++++++--------------------- IR_Decoder.h | 10 ++--- IR_Output.h | 49 +++++++++++++-------- IR_config.h | 7 ++- 4 files changed, 105 insertions(+), 74 deletions(-) diff --git a/IR_Decoder.cpp b/IR_Decoder.cpp index 6803bcc..98a493e 100644 --- a/IR_Decoder.cpp +++ b/IR_Decoder.cpp @@ -1,7 +1,7 @@ #include "IR_Decoder.h" #include "IR_Encoder.h" -#define IRDEBUG_INFO + #define checkAddr(h, l) (\ ((uint16_t)((dataBuffer[h] << 8) | dataBuffer[l]) == id) || \ @@ -360,26 +360,49 @@ void IR_Decoder::writeToBuffer(bool bit) { if ((i_dataBuffer >= (8 * msgBytes)) && !isCrcCorrect) { uint16_t crcValue; + uint8_t packSize; switch ((dataBuffer[0] >> 5) & IR_MASK_MSG_TYPE) { case IR_MSG_BACK: - packToOutClass( - (((dataBuffer[0] & (IR_MASK_MSG_INFO >> 1)) + crcBytes)), // packSize - gotData, // obj - PackOffsets { - 0, // msgOffset - 1, // addrFromOffset - NULL, // addrToOffset - 3, // dataOffset - NULL // crcOffset - } - ); + packSize = (dataBuffer[0] & (IR_MASK_MSG_INFO >> 1)) + crcBytes; + if (i_dataBuffer != packSize * bitPerByte) break; + + if ((dataBuffer[0] & 0b00010000)) { // С адресацией + packToOutClass( + packSize, // packSize + gotData, // obj + PackOffsets { + 0, // msgOffset + 1, // addrFromOffset + 3, // addrToOffset + 5, // dataOffset + NULL // crcOffset + }, + true + ); + } else { // Без адресации + packToOutClass( + packSize, // packSize + gotData, // obj + PackOffsets { + 0, // msgOffset + 1, // addrFromOffset + 3, // addrToOffset + 3, // dataOffset + NULL // crcOffset + }, + false + ); + } break; case IR_MSG_ACCEPT: + packSize = msgBytes + addrBytes + crcBytes; + if (i_dataBuffer != packSize * bitPerByte) break; + packToOutClass( - ((msgBytes + addrBytes + crcBytes)), // packSize - gotAccept, // obj + packSize, // packSize + gotAccept, // obj PackOffsets { 0, // msgOffset 1, // addrFromOffset @@ -391,9 +414,12 @@ void IR_Decoder::writeToBuffer(bool bit) { break; case IR_MSG_REQUEST: + packSize = msgBytes + addrBytes + addrBytes + crcBytes; + if (i_dataBuffer != packSize * bitPerByte) break; + packToOutClass( - ((msgBytes + addrBytes + addrBytes + crcBytes)), // packSize - gotRequest, // obj + packSize, // packSize + gotRequest, // obj PackOffsets { 0, // msgOffset 1, // addrFromOffset @@ -407,8 +433,11 @@ void IR_Decoder::writeToBuffer(bool bit) { case IR_MSG_DATA_ACCEPT: case IR_MSG_DATA_NOACCEPT: + packSize = (dataBuffer[0] & IR_MASK_MSG_INFO) + crcBytes; + if (i_dataBuffer != packSize * bitPerByte) break; + packToOutClass( - (((dataBuffer[0] & IR_MASK_MSG_INFO) + crcBytes)), // packSize + packSize, // packSize gotData, // obj PackOffsets { 0, // msgOffset @@ -427,41 +456,27 @@ void IR_Decoder::writeToBuffer(bool bit) { ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// } -void IR_Decoder::packToOutClass(uint8_t packSize, IDataPack& obj, PackOffsets offsets) { - - if (i_dataBuffer == packSize * bitPerByte) { - PackOutInfo packInfo; +void IR_Decoder::packToOutClass(uint8_t packSize, IDataPack& obj, PackOffsets offsets, bool isNeedAddressCheck = true) { + PackOutInfo packInfo; + #ifdef IRDEBUG_INFO + Serial.print(" IN "); + #endif + isCrcCorrect = crcCheck(packSize - crcBytes, packInfo.crc); + if (isCrcCorrect) { + packInfo.ptr = dataBuffer; + packInfo.packSize = packSize; + packInfo.offsets = offsets; + packInfo.offsets.crcOffset = packInfo.packSize - crcBytes; + packInfo.err = errors; + packInfo.rTime = riseSyncTime; + obj.set(packInfo, isNeedAddressCheck); + } else { #ifdef IRDEBUG_INFO - Serial.print(" IN "); + Serial.println(" CRC WRONG "); #endif - isCrcCorrect = crcCheck(packSize - crcBytes, packInfo.crc); - if (isCrcCorrect) { - // if ((addressForCheckOffset >= 0 ? checkAddr(addressForCheckOffset, addressForCheckOffset + 1) : 1)) {// адрес верен - // #ifdef IRDEBUG_INFO - // Serial.println(" OK "); - // #endif - - // } else { // адресс не верен - // #ifdef IRDEBUG_INFO - // Serial.println(" NOT MY "); - // #endif - // } - - packInfo.ptr = dataBuffer; - packInfo.packSize = packSize; - packInfo.offsets = offsets; - packInfo.offsets.crcOffset = packInfo.packSize - crcBytes; - packInfo.err = errors; - packInfo.rTime = riseSyncTime; - obj.set(packInfo); - } else { - #ifdef IRDEBUG_INFO - Serial.println(" CRC WRONG "); - #endif - } - - isRecive = false; } + + isRecive = false; } diff --git a/IR_Decoder.h b/IR_Decoder.h index 17f16cd..2fe387a 100644 --- a/IR_Decoder.h +++ b/IR_Decoder.h @@ -29,10 +29,10 @@ class IR_Decoder : private IR_FOX { public: uint16_t id; - Data gotData = Data(id); /// @brief Контейнер с данными - Data gotRawData = Data(id); - Accept gotAccept = Accept(id); /// @brief Контейнер с подтверждением - Request gotRequest = Request(id); /// @brief Контейнер с запросом + Data gotData = Data(&id); /// @brief Контейнер с данными + Data gotRawData = Data(&id); + Accept gotAccept = Accept(&addrWaitingFrom); /// @brief Контейнер с подтверждением + Request gotRequest = Request(&id); /// @brief Контейнер с запросом RawTune gotTune; /// @brief Контейнер с информацией подстройки const uint8_t isrPin; // Пин прерывания @@ -109,7 +109,7 @@ private: /// @brief Запиь бита в буффер, а так же проверка битов синхранизации и их фильтрация /// @param Бит данных void writeToBuffer(bool); - void packToOutClass(uint8_t packSize, IDataPack& obj, PackOffsets offsets); + void packToOutClass(uint8_t packSize, IDataPack& obj, PackOffsets offsets, bool isNeedAddressCheck = true); //////////////////////////////////////////////////////////////////////// /// @brief Установка и сброс начальных значений и флагов в готовность к приёму данных diff --git a/IR_Output.h b/IR_Output.h index ff5a9fe..a8ad807 100644 --- a/IR_Output.h +++ b/IR_Output.h @@ -5,7 +5,7 @@ class IR_Decoder; class IDataPack : protected IR_FOX { friend IR_Decoder; public: - IDataPack(uint16_t id) : id(id) {}; + IDataPack(uint16_t* id) : id(id) {}; public: bool avaliable() { return isAvaliable; }; @@ -22,7 +22,7 @@ public: void resetAvaliable() { isAvaliable = false; }; protected: - uint16_t id; + uint16_t* id; inline static uint8_t data[dataByteSizeMax] { 0 }; bool isAvaliable = false; @@ -38,14 +38,29 @@ protected: uint16_t bitPeriod; uint16_t crcCalcVal; - virtual bool checkAddress(PackOutInfo* packInfo) { return true; }; + virtual bool checkAddress(PackOutInfo* packInfo) { + bool ret; - void set(PackOutInfo packInfo) { + uint8_t targetAddrOffset = packInfo->offsets.addrToOffset; + uint16_t address = (packInfo->ptr[targetAddrOffset] << 8) | (packInfo->ptr[targetAddrOffset + 1]); - if (checkAddress(&packInfo)) { + checkaddressRuleApply(address, *id, ret); + + return ret; + }; + + void set(PackOutInfo packInfo, bool isNeedAddressCheck) { + + if (!isNeedAddressCheck || checkAddress(&packInfo)) { onPackAddressCorrect(&packInfo); + #ifdef IRDEBUG_INFO + Serial.println(" OK "); + #endif } else { onPackAddressIncorrect(&packInfo); + #ifdef IRDEBUG_INFO + Serial.println(" NOT MY "); + #endif } } @@ -81,19 +96,6 @@ public: uint8_t getDataRawSize() { return packRawSize; }; uint8_t* getDataRawPtr() { return data; }; bool isNeedAccept() { return ((msgPtr[0] >> 5) & IR_MASK_MSG_TYPE) == IR_MSG_DATA_ACCEPT; }; - -private: - bool checkAddress(PackOutInfo* packInfo) override { - bool ret; - - uint8_t addrOffset = packInfo->offsets.addrToOffset; - uint16_t address = (packInfo->ptr[addrOffset] << 8) | (packInfo->ptr[addrOffset + 1]); - - checkaddressRuleApply(address, id, ret); - - return ret; - } - }; // class RawData : public Data { @@ -103,6 +105,17 @@ class Accept : public IDataPack { using IDataPack::IDataPack; public: uint16_t getAddrFrom() { return addrFromPtr[0] << 8 | addrFromPtr[1]; }; +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 == *id; + + return ret; + } }; class Request : public IDataPack { diff --git a/IR_config.h b/IR_config.h index cc0ccfd..52097de 100644 --- a/IR_config.h +++ b/IR_config.h @@ -1,5 +1,7 @@ #pragma once #include + +#define IRDEBUG_INFO /*////////////////////////////////////////////////////////////////////////////////////// Для работы в паре положить декодер в энкодер @@ -38,7 +40,7 @@ msg type:                                         // | xxx..... | = тип сообщения                                         // | ...xxxxx | = длина (максимум 31 бита)                                         //  ---------- */ -#define IR_MSG_BACK 0U // | 000..... | = Задний сигнал машинки +#define IR_MSG_BACK 0U // | 0000B.... | = Задний сигнал машинки ;// // | \\\x---- | = нужна ли адресация ;// // | \\\-xxxx | = длина данных (Равна нулю при отсутствии сквозных команд) #define IR_MSG_ACCEPT 1U // | 001..... | = подтверждение @@ -173,8 +175,9 @@ 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; flag |= address >= IR_Broadcast; }