addr check flag added

This commit is contained in:
DashyFox 2024-02-20 16:35:02 +03:00
parent 2afb7cff23
commit 024888e841
4 changed files with 105 additions and 74 deletions

View File

@ -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;
}

View File

@ -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 Установка и сброс начальных значений и флагов в готовность к приёму данных

View File

@ -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 {

View File

@ -1,5 +1,7 @@
#pragma once
#include <Arduino.h>
#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;
}