diff --git a/IR_Decoder.cpp b/IR_Decoder.cpp index d652c9b..40a80a1 100644 --- a/IR_Decoder.cpp +++ b/IR_Decoder.cpp @@ -31,9 +31,9 @@ void IR_Decoder::isr() { } else { if (firstUnHandledFront == &subBuffer[currentSubBufferIndex]) { // Если контроллер не успел обработать новый сигнал, принудительно пропускаем его firstUnHandledFront = firstUnHandledFront->next; - Serial.println(); - Serial.println("ERROR"); - Serial.println(); + // Serial.println(); + // Serial.println("ERROR"); + // Serial.println(); } } @@ -278,12 +278,12 @@ void IR_Decoder::writeToBuffer(bool bit) { isData = !isData; i_syncBit = 0; // сброс счетчика битов синхронизации err_syncBit = 0; // сброс счетчика ошибок синхронизации - Serial.print(" "); + // Serial.print(" "); } if (isData) { // Запись битов в dataBuffer - Serial.print(bit); + // Serial.print(bit); if (i_dataBuffer % 8 == 7) { // Serial.print("+"); @@ -314,7 +314,7 @@ void IR_Decoder::writeToBuffer(bool bit) { } ////////////////////// Проверка наличия битов синхранизации ////////////////////// isWrongPack = err_syncBit >= syncBits; - if (isWrongPack) Serial.print("****************"); + // if (isWrongPack) Serial.print("****************"); }//**************************************************************************************************// // Serial.print(bit); diff --git a/IR_Decoder.h b/IR_Decoder.h index 40ed47d..e2c58aa 100644 --- a/IR_Decoder.h +++ b/IR_Decoder.h @@ -21,8 +21,6 @@ #define aroundRise(t) (riseTimeMin < t && t < riseTimeMax) #define IR_timeout (riseTimeMax * (8 + syncBits +1)) // us // таймаут в 8 data + 3 sync + 1 -#define subBufferSize 7 //Буфер для складирования фронтов, пока их не обработают - class IR_Encoder; class IR_Decoder : private IR_FOX { @@ -179,8 +177,7 @@ private: const uint8_t isrPin; // Пин прерывания IR_Encoder* encoder; // Указатель на парный передатчик - bool isPairSending = false; // Флаг передачи парного передатчика - bool IsPairSendLOW = false; // + volatile uint16_t isPairSending = 0; // Флаг передачи парного передатчика volatile bool isRecive = false; // Флаг приёма diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 7f2800b..0a0cdd1 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -5,15 +5,16 @@ #define ISR_Out 10 #define TestOut 13 -IR_Encoder::IR_Encoder(uint16_t addr, uint8_t pin, uint8_t tune = 0, IR_Decoder* decPair) { +IR_Encoder::IR_Encoder(uint16_t addr, uint8_t pin, uint8_t decPairCount = 0, void* decPair = nullptr) { + // sendBuffer = new uint8_t[dataByteSizeMax] { 0 }; ir_out = pin; pinMode(ir_out, OUTPUT); - addrSelf = addr; - decoder = decPair; - carrierTune = tune; - halfPeriod = (carrierPeriod / 2) - carrierTune; - dataBitCounter = 0 - preambFronts; + id = addr; + + decoders = (IR_Decoder*)decPair; + decodersCount = decPairCount; + signal = noSignal; }; @@ -24,7 +25,7 @@ IR_Encoder::~IR_Encoder() { // delete [] sendBuffer; }; -void IR_Encoder::sendData(uint16_t addrTo, uint8_t* data, uint8_t len, bool needAccept = false) { +void IR_Encoder::sendData(uint16_t addrTo, uint8_t* data, uint8_t len, bool needAccept = false) { uint8_t packSize = msgBytes + addrBytes + addrBytes + len + crcBytes; uint8_t msgType = ((needAccept ? IR_MSG_DATA_ACCEPT : IR_MSG_DATA_NOACCEPT) << 5) | ((packSize - crcBytes) & IR_MASK_MSG_INFO); @@ -38,8 +39,8 @@ void IR_Encoder::sendACK(uint16_t addrTo, uint8_t addInfo, bool forAll = false) // addr_self if (!forAll) { - sendBuffer[1] = addrSelf >> 8 & 0xFF; - sendBuffer[2] = addrSelf & 0xFF; + sendBuffer[1] = id >> 8 & 0xFF; + sendBuffer[2] = id & 0xFF; } // data crc @@ -55,8 +56,8 @@ void IR_Encoder::sendRequest(uint16_t addrTo, uint8_t addInfo) { sendBuffer[0] |= addInfo & IR_MASK_MSG_INFO; // addr_self - sendBuffer[1] = addrSelf >> 8 & 0xFF; - sendBuffer[2] = addrSelf & 0xFF; + sendBuffer[1] = id >> 8 & 0xFF; + sendBuffer[2] = id & 0xFF; //addr_to sendBuffer[3] = addrTo >> 8 & 0xFF; @@ -80,8 +81,8 @@ void IR_Encoder::_sendData(uint16_t addrTo, uint8_t* data, uint8_t len, uint8_t sendBuffer[0] = msgType; // addr_self - sendBuffer[1] = addrSelf >> 8 & 0xFF; - sendBuffer[2] = addrSelf & 0xFF; + sendBuffer[1] = id >> 8 & 0xFF; + sendBuffer[2] = id & 0xFF; // addr_to sendBuffer[3] = addrTo >> 8 & 0xFF; @@ -95,33 +96,39 @@ void IR_Encoder::_sendData(uint16_t addrTo, uint8_t* data, uint8_t len, uint8_t sendBuffer[packSize - crcBytes] = crc8(sendBuffer, 0, packSize - crcBytes, poly1) & 0xFF; sendBuffer[packSize - crcBytes + 1] = crc8(sendBuffer, 0, packSize - crcBytes + 1, poly2) & 0xFF; - if (decoder != nullptr) { - decoder->isWaitingAccept = ((msgType >> 5) & IR_MASK_MSG_TYPE == IR_MSG_DATA_ACCEPT); - decoder->addrWaitingFrom = addrTo; + if (decoders != nullptr) { + decoders->isWaitingAccept = ((msgType >> 5) & IR_MASK_MSG_TYPE == IR_MSG_DATA_ACCEPT); + decoders->addrWaitingFrom = addrTo; } // отправка rawSend(sendBuffer, packSize); } +void IR_Encoder::setDecoder_isSending() { + if (decodersCount && decoders != nullptr) { + for (uint8_t i = 0; i < decodersCount; i++) { + (decoders + i)->isPairSending ^= id; + } + + } +} + void IR_Encoder::rawSend(uint8_t* ptr, uint8_t len) { - if(isSending){ + if (isSending) { //TODO: Обработка повторной отправки return; } - digitalToggle(9); digitalToggle(9); - // memset(sendBuffer, 0x00, dataByteSizeMax); - // memcpy(sendBuffer, ptr, len); + + sendLen = len; - // *sendBuffer = 0b10010011; + isSending = true; + // setDecoder_isSending(); + decoders->isPairSending ^= id; cli(); - if (decoder != nullptr) { decoder->isPairSending = isSending; } - // #define preambToggle 2*2-1 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - #define preambToggle ((bitPauseTakts * 2 + bitActiveTakts) * 2 - 1) //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - toggleCounter = preambToggle; // Первая генерация для первого signal dataBitCounter = bitPerByte - 1; @@ -152,9 +159,12 @@ void IR_Encoder::isr() { IsrStart: switch (signal) { case noSignal: + signal = preamb; // сброс счетчиков // ... isSending = false; + // setDecoder_isSending(); + decoders->isPairSending ^= id; return; break; @@ -228,7 +238,7 @@ void old() {/////////////////////////////////////////////////////// // void IR_Encoder::rawSend(uint8_t* ptr, uint8_t len) { // /*tmp*/bool LOW_FIRST = false;/*tmp*/ - // if (decoder != nullptr) { decoder->isPairSending = true; } + // if (decoders != nullptr) { decoders->isPairSending = true; } // bool prev = 1; // bool next; @@ -244,7 +254,7 @@ void old() {/////////////////////////////////////////////////////// // addSync(&prev, &next); // } - // if (decoder != nullptr) { decoder->isPairSending = false; } + // if (decoders != nullptr) { decoders->isPairSending = false; } // } } diff --git a/IR_Encoder.h b/IR_Encoder.h index 3070a86..5d2e36d 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -10,11 +10,9 @@ class IR_Encoder : IR_FOX { public: uint8_t ir_out; /// @brief Вывод передатчика - uint16_t addrSelf; /// @brief Адрес передатчика + uint16_t id; /// @brief Адрес передатчика private: - uint8_t carrierTune; /// @brief Подстройка несущей частоты - uint8_t halfPeriod; /// @brief полупериод несущей частоты public: @@ -23,7 +21,7 @@ public: /// @param pin Вывод передатчика /// @param tune Подстройка несущей частоты /// @param decPair Приёмник, для которого отключается приём в момент передачи передатчиком - IR_Encoder(uint16_t addr, uint8_t pin, uint8_t tune, IR_Decoder* decPair = nullptr); + IR_Encoder(uint16_t addr, uint8_t pin, uint8_t decPairCount = 0, void* decPair = nullptr); template void sendData(uint16_t addrTo, T& data, bool needAccept = false); @@ -36,7 +34,7 @@ public: ~IR_Encoder(); volatile bool ir_out_virtual; private: - IR_Decoder* decoder; + void IR_Encoder::setDecoder_isSending(); void _sendData(uint16_t addrTo, uint8_t* data, uint8_t len, uint8_t msgType); void sendByte(uint8_t byte, bool* prev, bool LOW_FIRST); void addSync(bool* prev, bool* next); @@ -51,13 +49,13 @@ private: sync = 3 }; + IR_Decoder* decoders; + uint8_t decodersCount; + uint8_t sendLen; uint8_t sendBuffer[dataByteSizeMax] { 0 }; /// @brief Буффер данных для отправки - // uint8_t volatile bool isSending = false; - // volatile bool genState = HIGH; - volatile bool state; /// @brief Текущий уровень генерации volatile uint8_t dataByteCounter; diff --git a/IR_config.h b/IR_config.h index c4eaacb..40b3236 100644 --- a/IR_config.h +++ b/IR_config.h @@ -76,13 +76,9 @@ typedef uint16_t crc_t; #ifndef freeFrec #define freeFrec true #endif +#define subBufferSize 17 //Буфер для складирования фронтов, пока их не обработают (передатчик) -//#define carrierTune 4 #define preambPulse 3 -// 8 для gyverCore -// 4~5 для arduino nano - - ///////////////////////////////////////////////////////////////////////////////////// @@ -95,27 +91,21 @@ typedef uint16_t crc_t; #define syncBits 3U // количество битов синхронизации #define dataByteSizeMax (msgBytes + addrBytes + addrBytes + bytePerPack + crcBytes) - // размер msg в битах // размер короткой посылки в битах -// #define dataBitSize ((8 + syncBits) * dataByteSizeMax) // размер посылки с данными в битах -// #define bufferBitSizeMax (dataBitSize) // Размер буффера в битах -//const auto x = bufferBitSizeMax; -#define preambFronts (preambPulse*2) // количество фронтов преамбулы +#define preambFronts (preambPulse*2) // количество фронтов преамбулы (Приём) +#define preambToggle ((bitPauseTakts * 2 + bitActiveTakts) * 2 - 1) // колличество переключений преамбулы (Передача) -#define carrierFrec 38000U // частота несущей -#define carrierPeriod (1000000U/carrierFrec) // период несущей в us +#define carrierFrec 38000U // частота несущей (Приём/Передача) +#define carrierPeriod (1000000U/carrierFrec) // период несущей в us (Приём) // В процессе работы значения будут отклонятся в соответствии с предыдущим битом -#define bitActiveTakts 25U // длительность высокого уровня в тактах +#define bitActiveTakts 25U // длительность высокого уровня в тактах #define bitPauseTakts 6U // длительность низкого уровня в тактах #define bitTakts (bitActiveTakts+(bitPauseTakts*2U)) // Общая длительность бита в тактах #define bitTime (bitTakts*carrierPeriod) // Общая длительность бита #define tolerance 300U - #define preambToggle ((bitPauseTakts * 2 + bitActiveTakts) * 2 - 1) - - class IR_FOX { private: bool isSending = false;