non virtual

This commit is contained in:
DashyFox 2024-02-27 10:28:20 +03:00
parent 1f62eb8c0a
commit 4d92acf15b
6 changed files with 411 additions and 311 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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