add listen and fix

This commit is contained in:
DashyFox 2023-10-17 17:35:02 +03:00
parent 63e8328755
commit 791d90ee00
3 changed files with 54 additions and 40 deletions

View File

@ -35,7 +35,6 @@ void IR_Decoder::writeToBuffer(bool bit) {
//const auto testval = bufferBitSizeMax; //const auto testval = bufferBitSizeMax;
if ((bufBitPos >= (8 * msgBytes) - syncBits) && !isMsgAvaliable) { if ((bufBitPos >= (8 * msgBytes) - syncBits) && !isMsgAvaliable) {
switch ((rawBuffer[0] >> 5) & IR_MASK_MSG_TYPE) { switch ((rawBuffer[0] >> 5) & IR_MASK_MSG_TYPE) {
case IR_MSG_ACCEPT: case IR_MSG_ACCEPT:
if (bufBitPos >= ((msgBytes + addrBytes + crcBytes) * (8 + 3)) - syncBits) { if (bufBitPos >= ((msgBytes + addrBytes + crcBytes) * (8 + 3)) - syncBits) {
const uint8_t dataSize = msgBytes + addrBytes; const uint8_t dataSize = msgBytes + addrBytes;
@ -67,11 +66,9 @@ void IR_Decoder::writeToBuffer(bool bit) {
const uint8_t dataSize = (rawBuffer[0] & IR_MASK_MSG_INFO); const uint8_t dataSize = (rawBuffer[0] & IR_MASK_MSG_INFO);
isRawAvaliable = true; isRawAvaliable = true;
isMsgAvaliable = crcCheck(dataSize); isMsgAvaliable = crcCheck(dataSize);
if (isMsgAvaliable && checkAddr(3, 4) if (isMsgAvaliable && checkAddr(3, 4)) {
) {
gotData._isAvaliable = true; gotData._isAvaliable = true;
gotData._set(dataBuffer, (dataSize)+crcBytes, crcValue, errorCounter, riseSyncTime); gotData._set(dataBuffer, (dataSize)+crcBytes, crcValue, errorCounter, riseSyncTime);
} else { } else {
gotRawData._isAvaliable = true; gotRawData._isAvaliable = true;
gotRawData._set(dataBuffer, (dataSize)+crcBytes, crcValue, errorCounter, riseSyncTime); gotRawData._set(dataBuffer, (dataSize)+crcBytes, crcValue, errorCounter, riseSyncTime);
@ -171,6 +168,10 @@ uint16_t IR_Decoder::ceil_div(uint16_t val, uint16_t divider) {
return ret; return ret;
} }
void IR_Decoder::listen(){
if(isRecive && micros()-prevRise > IR_timeout*2) {isRecive = false;}
}
//////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////// isr /////////////////////////////////////////// //////////////////////////////////// isr ///////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////
@ -180,6 +181,7 @@ void IR_Decoder::isr() { // в прерывании вызываем isr()
if (isPairSending) return; if (isPairSending) return;
if (micros() - prevRise > IR_timeout) { // первый if (micros() - prevRise > IR_timeout) { // первый
isRecive = true;
isPreamb = true; isPreamb = true;
frontCounter = preambFronts - 1U; frontCounter = preambFronts - 1U;
errorCounter = 0; errorCounter = 0;

View File

@ -36,6 +36,8 @@ public:
// @return Буффер переполнился // @return Буффер переполнился
bool isOverflow() { return isBufferOverflow; }; bool isOverflow() { return isBufferOverflow; };
bool isReciving() { return isRecive; };
void listen();
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
@ -43,15 +45,15 @@ public:
friend IR_Decoder; friend IR_Decoder;
protected: protected:
bool _isAvaliable = false; bool _isAvaliable = false;
uint8_t _msgType; uint8_t _msgType = 0;
uint16_t _addrFrom = 0; uint16_t _addrFrom = 0;
uint16_t _addrTo = 0; uint16_t _addrTo = 0;
uint8_t* _data = nullptr; uint8_t* _data = nullptr;
uint8_t _dataRawSize = 0; uint8_t _dataRawSize = 0;
uint16_t _crcPackVal; uint16_t _crcPackVal = 0;
uint16_t _crcCalcVal; uint16_t _crcCalcVal = 0;
uint16_t _errCount; uint16_t _errCount = 0;
uint16_t _bitPeriod; uint16_t _bitPeriod = 0;
void _set(uint8_t* ptr, uint8_t len, uint16_t crc, uint16_t err, uint16_t rTime) { void _set(uint8_t* ptr, uint8_t len, uint16_t crc, uint16_t err, uint16_t rTime) {
_crcCalcVal = crc; _crcCalcVal = crc;
@ -65,6 +67,7 @@ public:
ini(); ini();
_isAvaliable = true; _isAvaliable = true;
} }
private: private:
virtual void ini(); virtual void ini();
@ -97,6 +100,7 @@ public:
String printData(uint8_t mode = 10) { String printData(uint8_t mode = 10) {
return printBytes(data(), dataSize(), mode); return printBytes(data(), dataSize(), mode);
} }
~Data(){};
private: private:
void ini() override { void ini() override {
_addrFrom = (_data[1] << 8) | _data[2]; _addrFrom = (_data[1] << 8) | _data[2];
@ -105,9 +109,9 @@ public:
} }
}; };
class RawData : public Data { // class RawData : public Data {
}; // };
class Accept : public InputData { class Accept : public InputData {
public: public:
@ -135,10 +139,12 @@ public:
friend IR_Decoder; friend IR_Decoder;
private: private:
bool _isAvaliable = false; bool _isAvaliable = false;
uint16_t _tune; uint16_t _errCount = 0;
uint16_t _tune = 0;
public: public:
bool avaliable() { return _isAvaliable; }; bool avaliable() { return _isAvaliable; };
uint16_t getTune() { return _tune; }; uint16_t getTune() { return _tune; };
uint16_t errorCount() { return _errCount; };
void resetAvaliable() { _isAvaliable = false; }; void resetAvaliable() { _isAvaliable = false; };
private: private:
void _set(uint16_t val) { void _set(uint16_t val) {
@ -148,7 +154,8 @@ public:
}; };
Data gotData; Data gotData;
RawData gotRawData; Data gotRawData;
// RawData gotRawData;
Accept gotAccept; Accept gotAccept;
Request gotRequest; Request gotRequest;
RawTune gotTune; RawTune gotTune;
@ -159,6 +166,9 @@ private:
bool isPairSending = false; bool isPairSending = false;
bool IsPairSendLOW = false; bool IsPairSendLOW = false;
volatile bool isRecive = false;
bool isWaitingAccept = false; bool isWaitingAccept = false;
uint16_t addrWaitingFrom = 0; uint16_t addrWaitingFrom = 0;

View File

@ -106,7 +106,7 @@ const auto viewValue = bitTime;
class IR_FOX { class IR_FOX {
private: private:
bool isSending = false; bool isSending = false;
public: protected:
uint8_t crc8(uint8_t* data, uint8_t start, uint8_t end, uint8_t poly) { //TODO: сделать возможность межбайтовой проверки uint8_t crc8(uint8_t* data, uint8_t start, uint8_t end, uint8_t poly) { //TODO: сделать возможность межбайтовой проверки
uint8_t crc = 0xff; uint8_t crc = 0xff;
size_t i, j; size_t i, j;
@ -121,6 +121,7 @@ public:
} }
return crc; return crc;
} }
public:
String printBytes(uint8_t* d, uint8_t s, uint8_t mode = 10) { String printBytes(uint8_t* d, uint8_t s, uint8_t mode = 10) {
String str = ""; String str = "";
uint8_t control = bitPerByte; uint8_t control = bitPerByte;
@ -151,4 +152,5 @@ public:
str += " "; str += " ";
return str; return str;
} }
}; };