From ff306e7fae08c514f736fb3d12c8898278127a0e Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 2 Apr 2024 14:13:39 +0300 Subject: [PATCH 01/69] upd --- IR_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IR_config.h b/IR_config.h index 9271d32..8d8555d 100644 --- a/IR_config.h +++ b/IR_config.h @@ -107,7 +107,7 @@ typedef uint16_t crc_t; #endif #ifndef subBufferSize -#define subBufferSize 35 //Буфер для складирования фронтов, пока их не обработают (передатчик) +#define subBufferSize 25 //Буфер для складирования фронтов, пока их не обработают (передатчик) #endif #define preambPulse 3 From 27a5b28a177d04279c147fe0c7a51ec6d0237632 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 16 Apr 2024 15:52:59 +0300 Subject: [PATCH 02/69] STM First Test --- IR-protocol.ino | 519 +++++++++++++++++++++++++++------------------- IR_DecoderRaw.cpp | 27 ++- IR_DecoderRaw.h | 16 +- IR_Encoder.cpp | 51 ++--- IR_Encoder.h | 55 +++-- IR_config.h | 4 +- 6 files changed, 375 insertions(+), 297 deletions(-) diff --git a/IR-protocol.ino b/IR-protocol.ino index 051759a..8364702 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -4,13 +4,18 @@ #include "MemoryCheck.h" /////////////// Pinout /////////////// -#define encForward_PIN 5 -#define encBackward_PIN 6 +#define encForward_PIN PB5 +#define encBackward_PIN PB4 -#define LoopOut 12 -#define ISR_Out 10 +#define dec1_PIN PB7 +#define dec2_PIN PB8 -#define TestOut 13 +#define LoopOut PB3 +// #define ISR_Out 10 + +// #define TestOut 13 + +#define SignalDetectLed PB15 //////////////// Ini ///////////////// @@ -19,173 +24,183 @@ //////////////// Var ///////////////// -IR_Decoder decForward(2, 555); -IR_Decoder decBackward(3, 777); +IR_Decoder decForward(PB7, 555); +IR_Decoder decBackward(PB8, 777); -IR_Encoder encForward(42/* , &decBackward */); +IR_Encoder encForward(42 /* , &decBackward */); // IR_Encoder encBackward(321, encBackward_PIN); // IR_Encoder encTree(325, A2); //////////////////////// Функции прерываний //////////////////////// -void decForwardISR() { +void decForwardISR() +{ decForward.isr(); + // Serial.println("ISR"); } -// void decBackwardISR() { -// decBackward.isr(); -// } +void decBackwardISR() +{ + decBackward.isr(); + // Serial.println("ISR"); +} -static uint8_t* portOut; -ISR(TIMER2_COMPA_vect) { +static uint8_t *portOut; + +void EncoderISR() +{ encForward.isr(); // encBackward.isr(); // encTree.isr(); - //TODO: Сделать выбор порта - *portOut = (*portOut & 0b11001111) | - ( - encForward.ir_out_virtual << 5U - // | encBackward.ir_out_virtual << 6U - // | encTree.ir_out_virtual << 2U - ); + // TODO: Сделать выбор порта + // *portOut = (*portOut & 0b11001111) | + // ( + // encForward.ir_out_virtual << 5U + // // | encBackward.ir_out_virtual << 6U + // // | encTree.ir_out_virtual << 2U + // ); + digitalWrite(PB5, encForward.ir_out_virtual); } ///////////////////////////////////////////////////////////////////// -uint8_t data0 [] = { }; -uint8_t data1 [] = { 42 }; -uint8_t data2 [] = { 42 , 127 }; -uint8_t data3 [] = { 42 , 127, 137 }; -uint8_t data4 [] = { 42 , 127, 137, 255 }; +uint8_t data0[] = {}; +uint8_t data1[] = {42}; +uint8_t data2[] = {42, 127}; +uint8_t data3[] = {42, 127, 137}; +uint8_t data4[] = {42, 127, 137, 255}; uint32_t loopTimer; uint8_t sig = 0; uint16_t targetAddr = IR_Broadcast; -Timer t1(500, millis, []() { +Timer t1(500, millis, []() + { + // Serial.println(sig); - // Serial.println(sig); + switch (sig) + { + case 0: + encForward.sendData(targetAddr); + break; + case 1: + encForward.sendData(targetAddr, data1, sizeof(data1)); + break; + case 2: + encForward.sendData(targetAddr, data2, sizeof(data2)); + break; + case 3: + encForward.sendData(targetAddr, data3, sizeof(data3)); + break; + case 4: + encForward.sendData(targetAddr, data4, sizeof(data4)); + break; - switch (sig) { - case 0: - encForward.sendData(targetAddr); - break; - case 1: - encForward.sendData(targetAddr, data1, sizeof(data1)); - break; - case 2: - encForward.sendData(targetAddr, data2, sizeof(data2)); - break; - case 3: - encForward.sendData(targetAddr, data3, sizeof(data3)); - break; - case 4: - encForward.sendData(targetAddr, data4, sizeof(data4)); - break; + case 10: + encForward.sendData(targetAddr, data0, sizeof(data0), true); + break; + case 11: + encForward.sendData(targetAddr, data1, sizeof(data1), true); + break; + case 12: + encForward.sendData(targetAddr, data2, sizeof(data2), true); + break; + case 13: + encForward.sendData(targetAddr, data3, sizeof(data3), true); + break; + case 14: + encForward.sendData(targetAddr, data4, sizeof(data4), true); + break; - case 10: - encForward.sendData(targetAddr, data0, sizeof(data0), true); - break; - case 11: - encForward.sendData(targetAddr, data1, sizeof(data1), true); - break; - case 12: - encForward.sendData(targetAddr, data2, sizeof(data2), true); - break; - case 13: - encForward.sendData(targetAddr, data3, sizeof(data3), true); - break; - case 14: - encForward.sendData(targetAddr, data4, sizeof(data4), true); - break; + case 20: + encForward.sendBack(); + break; + case 21: + encForward.sendBack(data1, sizeof(data1)); + break; + case 22: + encForward.sendBack(data2, sizeof(data2)); + break; + case 23: + encForward.sendBack(data3, sizeof(data3)); + break; + case 24: + encForward.sendBack(data4, sizeof(data4)); + break; + case 30: + encForward.sendBackTo(targetAddr); + break; + case 31: + encForward.sendBackTo(targetAddr, data1, sizeof(data1)); + break; + case 32: + encForward.sendBackTo(targetAddr, data2, sizeof(data2)); + break; + case 33: + encForward.sendBackTo(targetAddr, data3, sizeof(data3)); + break; + case 34: + encForward.sendBackTo(targetAddr, data4, sizeof(data4)); + break; + case 41: + encForward.sendRequest(targetAddr); + break; + case 42: + encForward.sendAccept(targetAddr); + break; - case 20: - encForward.sendBack(); - break; - case 21: - encForward.sendBack(data1, sizeof(data1)); - break; - case 22: - encForward.sendBack(data2, sizeof(data2)); - break; - case 23: - encForward.sendBack(data3, sizeof(data3)); - break; - case 24: - encForward.sendBack(data4, sizeof(data4)); - break; + default: + break; + } + // encBackward.sendData(IR_Broadcast, data2); + // encTree.sendData(IR_Broadcast, rawData3); + }); +Timer t2(500, millis, []() + { digitalToggle(LED_BUILTIN); }); - case 30: - encForward.sendBackTo(targetAddr); - break; - case 31: - encForward.sendBackTo(targetAddr, data1, sizeof(data1)); - break; - case 32: - encForward.sendBackTo(targetAddr, data2, sizeof(data2)); - break; - case 33: - encForward.sendBackTo(targetAddr, data3, sizeof(data3)); - break; - case 34: - encForward.sendBackTo(targetAddr, data4, sizeof(data4)); - break; - - case 41: - encForward.sendRequest(targetAddr); - break; - case 42: - encForward.sendAccept(targetAddr); - break; - - - default: - break; - } - // encBackward.sendData(IR_Broadcast, data2); - // encTree.sendData(IR_Broadcast, rawData3); -}); -Timer t2(500, millis, []() { - digitalToggle(13); -}); +Timer signalDetectTimer; ///////////////////////////////////////////////////////////////////// -void setup() { - IR_Encoder::timerSetup(); - portOut = &PORTD; +void setup() +{ + // disableDebugPorts(); + + Timer3.setPeriod(1000000U / carrierFrec / 2); + // Timer3.attachCompare1Interrupt(EncoderISR); + + Timer1.setMode(1,timer_mode::TIMER_INPUT_CAPTURE); Serial.begin(SERIAL_SPEED); Serial.println(F(INFO)); - pinMode(A0, INPUT_PULLUP); - pinMode(A1, INPUT_PULLUP); - pinMode(A2, INPUT_PULLUP); - pinMode(A3, INPUT_PULLUP); + // pinMode(A0, INPUT_PULLUP); + // pinMode(A1, INPUT_PULLUP); + // pinMode(A2, INPUT_PULLUP); + // pinMode(A3, INPUT_PULLUP); pinMode(LoopOut, OUTPUT); - pinMode(ISR_Out, OUTPUT); + pinMode(SignalDetectLed, OUTPUT); + // pinMode(ISR_Out, OUTPUT); pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); - pinMode(8, OUTPUT); - pinMode(9, OUTPUT); - pinMode(11, OUTPUT); - pinMode(13, OUTPUT); + // pinMode(8, OUTPUT); + // pinMode(9, OUTPUT); + // pinMode(11, OUTPUT); + // pinMode(13, OUTPUT); pinMode(encForward_PIN, OUTPUT); pinMode(encBackward_PIN, OUTPUT); - pinMode(13, OUTPUT); - - + pinMode(LED_BUILTIN, OUTPUT); // IR_DecoderRaw* blindFromForward [] { &decForward, &decBackward }; // encForward.setBlindDecoders(blindFromForward, sizeof(blindFromForward) / sizeof(IR_DecoderRaw*)); - - attachInterrupt(0, decForwardISR, CHANGE); // D2 - // attachInterrupt(1, decBackwardISR, CHANGE); // D3 + attachInterrupt(dec1_PIN, decForwardISR, CHANGE); // D2 + // attachInterrupt(dec2_PIN, decBackwardISR, CHANGE); // D3 } -void loop() { +void loop() +{ digitalToggle(LoopOut); Timer::tick(); @@ -195,61 +210,80 @@ void loop() { status(decForward); // status(decBackward); - // Serial.println(micros() - loopTimer); // loopTimer = micros(); // delayMicroseconds(120*5); - if (Serial.available()) { + if (Serial.available()) + { uint8_t in = Serial.parseInt(); - switch (in) { - case 100: - targetAddr = IR_Broadcast; - break; - case 101: - targetAddr = 555; - break; - case 102: - targetAddr = 777; - break; + switch (in) + { + case 100: + targetAddr = IR_Broadcast; + break; + case 101: + targetAddr = 555; + break; + case 102: + targetAddr = 777; + break; - default: - sig = in; - break; + default: + sig = in; + break; } } } +void detectSignal() +{ + digitalWrite(SignalDetectLed, HIGH); + signalDetectTimer.delay(50, millis, []() + { digitalWrite(SignalDetectLed, LOW); }); +} - - - - -//test -void status(IR_Decoder& dec) { - if (dec.gotData.available()) { +// test +void status(IR_Decoder &dec) +{ + if (dec.gotData.available()) + { + detectSignal(); String str; - if (/* dec.gotData.getDataPrt()[1] */1) { - str += ("Data on pin "); str += (dec.isrPin); str += "\n"; + if (/* dec.gotData.getDataPrt()[1] */ 1) + { + str += ("Data on pin "); + str += (dec.isrPin); + str += "\n"; uint8_t msg = dec.gotData.getMsgRAW(); str += (" MSG: "); - for (size_t i = 0; i < 8; i++) { - if (i == 3) str += " "; + for (size_t i = 0; i < 8; i++) + { + if (i == 3) + str += " "; str += (msg >> (7 - i)) & 1U; } str += "\n"; - str += (" DATA SIZE: "); str += (dec.gotData.getDataSize()); str += "\n"; - str += (" ADDRESS FROM: "); str += (dec.gotData.getAddrFrom()); str += "\n"; - str += (" ADDRESS TO: "); str += (dec.gotData.getAddrTo()); str += "\n"; + str += (" DATA SIZE: "); + str += (dec.gotData.getDataSize()); + str += "\n"; + str += (" ADDRESS FROM: "); + str += (dec.gotData.getAddrFrom()); + str += "\n"; + str += (" ADDRESS TO: "); + str += (dec.gotData.getAddrTo()); + str += "\n"; // str += (" CRC PACK: "); str += (dec.gotData.getCrcIN()); str += "\n"; // str += (" CRC CALC: "); str += (dec.gotData.getCrcCALC()); str += "\n"; str += "\n"; - for (size_t i = 0; i < min(10, dec.gotData.getDataSize()); i++) { - switch (i) { + for (size_t i = 0; i < min(10, dec.gotData.getDataSize()); i++) + { + switch (i) + { // case 0: // str += (" ADDR: "); // break; @@ -257,49 +291,71 @@ void status(IR_Decoder& dec) { // str += (" CMD: "); // break; - default: - str += (" Data["); str += (i); str += ("]: "); - break; + default: + str += (" Data["); + str += (i); + str += ("]: "); + break; } - str += (dec.gotData.getDataPrt()[i]); str += "\n"; + str += (dec.gotData.getDataPrt()[i]); + str += "\n"; } - - str += ("\n*******ErrAll: "); str += (dec.gotData.getErrorCount()); str += "\n"; - str += ("**ErrDistance: "); str += ((int)(dec.gotData.getErrorHighSignal() - dec.gotData.getErrorLowSignal())); str += "\n"; + str += ("\n*******ErrAll: "); + str += (dec.gotData.getErrorCount()); + str += "\n"; + str += ("**ErrDistance: "); + str += ((int)(dec.gotData.getErrorHighSignal() - dec.gotData.getErrorLowSignal())); + str += "\n"; str += "\n"; - } else { - str += ("SELF"); str += "\n"; + } + else + { + str += ("SELF"); + str += "\n"; str += "\n"; } // obj->resetAvailable(); Serial.write(str.c_str()); } - if (dec.gotBackData.available()) { + if (dec.gotBackData.available()) + { + detectSignal(); String str; - if (/* dec.gotData.getDataPrt()[1] */1) { - str += ("BackData on pin "); str += (dec.isrPin); str += "\n"; + 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 += " "; + 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 += (" 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) { + for (size_t i = 0; i < min(10, dec.gotBackData.getDataSize()); i++) + { + switch (i) + { // case 0: // str += (" ADDR: "); // break; @@ -307,98 +363,135 @@ void status(IR_Decoder& dec) { // str += (" CMD: "); // break; - default: - str += (" Data["); str += (i); str += ("]: "); - break; + default: + str += (" Data["); + str += (i); + str += ("]: "); + break; } - str += (dec.gotBackData.getDataPrt()[i]); str += "\n"; + 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*******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"; + } + else + { + str += ("SELF"); + str += "\n"; str += "\n"; } // obj->resetAvailable(); Serial.write(str.c_str()); } - if (dec.gotAccept.available()) { + if (dec.gotAccept.available()) + { + detectSignal(); String str; - if (/* dec.gotData.getDataPrt()[1] */1) { - str += ("Accept on pin "); str += (dec.isrPin); str += "\n"; + if (/* dec.gotData.getDataPrt()[1] */ 1) + { + str += ("Accept on pin "); + str += (dec.isrPin); + str += "\n"; uint8_t msg = dec.gotAccept.getMsgRAW(); str += (" MSG: "); - for (size_t i = 0; i < 8; i++) { - if (i == 3) str += " "; + for (size_t i = 0; i < 8; i++) + { + if (i == 3) + str += " "; str += (msg >> (7 - i)) & 1U; } str += "\n"; // str += (" DATA SIZE: "); str += (dec.gotAccept.getDataSize()); str += "\n"; - str += (" ADDRESS FROM: "); str += (dec.gotAccept.getAddrFrom()); str += "\n"; + str += (" ADDRESS FROM: "); + str += (dec.gotAccept.getAddrFrom()); + str += "\n"; // str += (" ADDRESS TO: "); str += (dec.gotAccept.getAddrTo()); str += "\n"; // str += (" CRC PACK: "); str += (dec.gotAccept.getCrcIN()); str += "\n"; // str += (" CRC CALC: "); str += (dec.gotAccept.getCrcCALC()); str += "\n"; str += "\n"; - str += (" Data: "); str += (dec.gotAccept.getCustomByte()); + str += (" Data: "); + str += (dec.gotAccept.getCustomByte()); - - - str += ("\n\n*******ErrAll: "); str += (dec.gotAccept.getErrorCount()); str += "\n"; - str += ("**ErrDistance: "); str += ((int)(dec.gotAccept.getErrorHighSignal() - dec.gotAccept.getErrorLowSignal())); str += "\n"; + str += ("\n\n*******ErrAll: "); + str += (dec.gotAccept.getErrorCount()); + str += "\n"; + str += ("**ErrDistance: "); + str += ((int)(dec.gotAccept.getErrorHighSignal() - dec.gotAccept.getErrorLowSignal())); + str += "\n"; str += "\n"; - } else { - str += ("SELF"); str += "\n"; + } + else + { + str += ("SELF"); + str += "\n"; str += "\n"; } // obj->resetAvailable(); Serial.write(str.c_str()); } - if (dec.gotRequest.available()) { + if (dec.gotRequest.available()) + { + detectSignal(); String str; - if (/* dec.gotData.getDataPrt()[1] */1) { - str += ("Request on pin "); str += (dec.isrPin); str += "\n"; + if (/* dec.gotData.getDataPrt()[1] */ 1) + { + str += ("Request on pin "); + str += (dec.isrPin); + str += "\n"; uint8_t msg = dec.gotRequest.getMsgRAW(); str += (" MSG: "); - for (size_t i = 0; i < 8; i++) { - if (i == 3) str += " "; + for (size_t i = 0; i < 8; i++) + { + if (i == 3) + str += " "; str += (msg >> (7 - i)) & 1U; } str += "\n"; // str += (" DATA SIZE: "); str += (dec.gotRequest.getDataSize()); str += "\n"; - str += (" ADDRESS FROM: "); str += (dec.gotRequest.getAddrFrom()); str += "\n"; - str += (" ADDRESS TO: "); str += (dec.gotRequest.getAddrTo()); str += "\n"; + str += (" ADDRESS FROM: "); + str += (dec.gotRequest.getAddrFrom()); + str += "\n"; + str += (" ADDRESS TO: "); + str += (dec.gotRequest.getAddrTo()); + str += "\n"; // str += (" CRC PACK: "); str += (dec.gotRequest.getCrcIN()); str += "\n"; // str += (" CRC CALC: "); str += (dec.gotRequest.getCrcCALC()); str += "\n"; str += "\n"; - - str += ("\n*******ErrAll: "); str += (dec.gotRequest.getErrorCount()); str += "\n"; - str += ("**ErrDistance: "); str += ((int)(dec.gotRequest.getErrorHighSignal() - dec.gotRequest.getErrorLowSignal())); str += "\n"; + str += ("\n*******ErrAll: "); + str += (dec.gotRequest.getErrorCount()); + str += "\n"; + str += ("**ErrDistance: "); + str += ((int)(dec.gotRequest.getErrorHighSignal() - dec.gotRequest.getErrorLowSignal())); + str += "\n"; str += "\n"; - } else { - str += ("SELF"); str += "\n"; + } + else + { + str += ("SELF"); + str += "\n"; str += "\n"; } // obj->resetAvailable(); Serial.write(str.c_str()); } - - } - - diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index 8b2ffce..f368ccc 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -1,7 +1,7 @@ #include "IR_DecoderRaw.h" #include "IR_Encoder.h" -IR_DecoderRaw::IR_DecoderRaw(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair = nullptr) : isrPin(isrPin), encoder(encPair) +IR_DecoderRaw::IR_DecoderRaw(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair) : isrPin(isrPin), encoder(encPair) { id = addr; prevRise = prevFall = prevPrevFall = prevPrevRise = 0; @@ -9,6 +9,13 @@ IR_DecoderRaw::IR_DecoderRaw(const uint8_t isrPin, uint16_t addr, IR_Encoder *en { encPair->decPair = this; } + +#ifdef IRDEBUG + pinMode(wrHigh, OUTPUT); + pinMode(wrLow, OUTPUT); + pinMode(writeOp, OUTPUT); + pinMode(errOut, OUTPUT); +#endif } //////////////////////////////////// isr /////////////////////////////////////////// @@ -19,7 +26,7 @@ void IR_DecoderRaw::isr() return; subBuffer[currentSubBufferIndex].next = nullptr; - subBuffer[currentSubBufferIndex].dir = (PIND >> isrPin) & 1; + subBuffer[currentSubBufferIndex].dir = digitalRead(isrPin); subBuffer[currentSubBufferIndex].time = micros(); if (firstUnHandledFront == nullptr) @@ -95,17 +102,16 @@ void IR_DecoderRaw::listenStart() void IR_DecoderRaw::tick() { FrontStorage currentFront; - uint8_t oldSREG = SREG; - cli(); + noInterrupts(); listenStart(); if (firstUnHandledFront == nullptr) { isSubBufferOverflow = false; - SREG = oldSREG; + interrupts(); return; } // Если данных нет - ничего не делаем currentFront = *((FrontStorage *)firstUnHandledFront); // найти следующий необработанный фронт/спад - SREG = oldSREG; + interrupts(); if (currentFront.next == nullptr) { isRecive = false; @@ -161,7 +167,7 @@ void IR_DecoderRaw::tick() { if (isPreamb) { // первый фронт после - // gotTune.set(riseSyncTime); + // gotTune.set(riseSyncTime); } isPreamb = false; } @@ -187,7 +193,7 @@ void IR_DecoderRaw::tick() if (aroundRise(risePeriod)) { // тактирование есть, сигнал хороший - без ошибок(?) - if (highTime > riseTimeMin >> 1) + if (highTime > riseTimeMin / 2U) { // 1 #ifdef IRDEBUG digitalWrite(wrHigh, 1); @@ -344,13 +350,12 @@ void IR_DecoderRaw::tick() digitalWrite(writeOp, isPreamb); #endif //////////////////////////////////////////////////////////////////////////////////////////////////////////// - oldSREG = SREG; - cli(); + // noInterrupts(); if (firstUnHandledFront != nullptr) { firstUnHandledFront = firstUnHandledFront->next; // переместить флаг на следующий элемент для обработки (next or nullptr) } - SREG = oldSREG; + // interrupts(); } void IR_DecoderRaw::writeToBuffer(bool bit) diff --git a/IR_DecoderRaw.h b/IR_DecoderRaw.h index 82912e6..9e02c0a 100644 --- a/IR_DecoderRaw.h +++ b/IR_DecoderRaw.h @@ -1,15 +1,15 @@ #pragma once #include "IR_config.h" -// #define IRDEBUG +#define IRDEBUG #ifdef IRDEBUG -#define wrHigh A3 // Запись HIGH инициирована // green -#define wrLow A3 // Запись LOW инициирована // blue -#define writeOp 13 // Операция записи, 1 пульс для 0 и 2 для 1 // orange +#define wrHigh PA1 // Запись HIGH инициирована // green +#define wrLow PA0 // Запись LOW инициирована // blue +#define writeOp PA5 // Операция записи, 1 пульс для 0 и 2 для 1 // orange // Исправленные ошибки // purle // 1 пульс: fix -#define errOut A3 +#define errOut PA4 #endif ///////////////////////////////////////////////////////////////////////////////////////////////// @@ -58,10 +58,10 @@ public: bool isOverflow() { return isBufferOverflow; }; // Буффер переполнился bool isSubOverflow() { - uint8_t oldSREG = SREG; - cli(); + + // noInterrupts(); volatile bool ret = isSubBufferOverflow; - SREG = oldSREG; + // interrupts(); return ret; }; bool isReciving() { return isBufferOverflow; }; // Возвращает true, если происходит приём пакета diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 2eff385..cfea755 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -5,7 +5,7 @@ #define ISR_Out 10 #define TestOut 13 -IR_Encoder::IR_Encoder(uint16_t addr, IR_DecoderRaw *decPair = nullptr) +IR_Encoder::IR_Encoder(uint16_t addr, IR_DecoderRaw *decPair) { id = addr; this->decPair = decPair; @@ -40,7 +40,7 @@ IR_Encoder::~IR_Encoder() delete[] bitHigh; }; -void IR_Encoder::sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept = false) +void IR_Encoder::sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept) { uint8_t *dataPtr = new uint8_t[1]; dataPtr[0] = dataByte; @@ -48,7 +48,7 @@ void IR_Encoder::sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept = f delete[] dataPtr; } -void IR_Encoder::sendData(uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0, bool needAccept = false) +void IR_Encoder::sendData(uint16_t addrTo, uint8_t *data, uint8_t len, bool needAccept) { if (len > bytePerPack) { @@ -92,7 +92,7 @@ void IR_Encoder::sendData(uint16_t addrTo, uint8_t *data = nullptr, uint8_t len rawSend(sendBuffer, packSize); } -void IR_Encoder::sendAccept(uint16_t addrTo, uint8_t customByte = 0) +void IR_Encoder::sendAccept(uint16_t addrTo, uint8_t customByte) { constexpr uint8_t packsize = msgBytes + addrBytes + 1U + crcBytes; memset(sendBuffer, 0x00, dataByteSizeMax); @@ -141,12 +141,12 @@ void IR_Encoder::sendBack(uint8_t data) { _sendBack(false, 0, &data, 1); } -void IR_Encoder::sendBack(uint8_t *data = nullptr, uint8_t len = 0) +void IR_Encoder::sendBack(uint8_t *data , uint8_t len) { _sendBack(false, 0, data, len); } -void IR_Encoder::sendBackTo(uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0) +void IR_Encoder::sendBackTo(uint16_t addrTo, uint8_t *data, uint8_t len) { _sendBack(true, addrTo, data, len); } @@ -210,7 +210,7 @@ void IR_Encoder::rawSend(uint8_t *ptr, uint8_t len) setDecoder_isSending(); - cli(); + // noInterrupts(); sendLen = len; toggleCounter = preambToggle; // Первая генерация для первого signal @@ -227,7 +227,7 @@ void IR_Encoder::rawSend(uint8_t *ptr, uint8_t len) currentBitSequence = bitHigh; isSending = true; - sei(); + // interrupts(); } void IR_Encoder::isr() @@ -332,32 +332,6 @@ void IR_Encoder::isr() } } -void old() -{ /////////////////////////////////////////////////////// - // void IR_Encoder::rawSend(uint8_t* ptr, uint8_t len) { - // /*tmp*/bool LOW_FIRST = false;/*tmp*/ - - // if (decoders != nullptr) { decoders->isPairSending = true; } - - // bool prev = 1; - // bool next; - - // send_EMPTY(preambPulse); // преамбула - // for (uint16_t byteNum = 0; byteNum < len; byteNum++) { - // sendByte(ptr[byteNum], &prev, LOW_FIRST); - // if (byteNum < len - 1) { - // next = ptr[byteNum + 1] & (LOW_FIRST ? 0b00000001 : 0b10000000); - // } else { - // next = 0; - // } - // addSync(&prev, &next); - // } - - // if (decoders != nullptr) { decoders->isPairSending = false; } - - // } -} - void IR_Encoder::sendByte(uint8_t byte, bool *prev, bool LOW_FIRST) { uint8_t mask = LOW_FIRST ? 0b00000001 : 0b10000000; @@ -395,7 +369,7 @@ void IR_Encoder::addSync(bool *prev, bool *next) } } -void IR_Encoder::send_HIGH(bool prevBite = 1) +void IR_Encoder::send_HIGH(bool prevBite) { // if (/* prevBite */1) { @@ -422,3 +396,10 @@ void IR_Encoder::send_EMPTY(uint8_t count) // } // meanderBlock(bitPauseTakts * 2 + bitActiveTakts, halfPeriod, 0); //TODO: Отодвинуть преамбулу } + +uint8_t* IR_Encoder::bitHigh = new uint8_t[2]{ + (bitPauseTakts * 2) * 2 - 1, + (bitActiveTakts) * 2 - 1}; +uint8_t* IR_Encoder::bitLow = new uint8_t[2]{ + (bitPauseTakts + bitActiveTakts) * 2 - 1, + (bitPauseTakts) * 2 - 1}; \ No newline at end of file diff --git a/IR_Encoder.h b/IR_Encoder.h index a7972d4..434cf75 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -20,31 +20,33 @@ public: /// @param decPair Приёмник, для которого отключается приём в момент передачи передатчиком IR_Encoder(uint16_t addr, IR_DecoderRaw *decPair = nullptr); - static void timerSetup() - { - // TIMER2 Ini - uint8_t oldSREG = SREG; // Save global interupts settings - cli(); - // DDRB |= (1 << PORTB3); //OC2A (17) - TCCR2A = 0; - TCCR2B = 0; + // static void timerSetup() + // { + // // // TIMER2 Ini + // // uint8_t oldSREG = SREG; // Save global interupts settings + // // cli(); + // // // DDRB |= (1 << PORTB3); //OC2A (17) + // // TCCR2A = 0; + // // TCCR2B = 0; - // TCCR2A |= (1 << COM2A0); //Переключение состояния + // // // TCCR2A |= (1 << COM2A0); //Переключение состояния - TCCR2A |= (1 << WGM21); // Clear Timer On Compare (Сброс по совпадению) - TCCR2B |= (1 << CS20); // Предделитель 1 - TIMSK2 |= (1 << OCIE2A); // Прерывание по совпадению + // // TCCR2A |= (1 << WGM21); // Clear Timer On Compare (Сброс по совпадению) + // // TCCR2B |= (1 << CS20); // Предделитель 1 + // // TIMSK2 |= (1 << OCIE2A); // Прерывание по совпадению - OCR2A = /* 465 */ ((F_CPU / (38000 * 2)) - 2); // 38кГц + // // OCR2A = /* 465 */ ((F_CPU / (38000 * 2)) - 2); // 38кГц - SREG = oldSREG; // Return interrupt settings - } - static void timerOFFSetup() - { - TIMSK2 &= ~(1 << OCIE2A); // Прерывание по совпадению выкл - } + // // SREG = oldSREG; // Return interrupt settings - void IR_Encoder::setBlindDecoders(IR_DecoderRaw *decoders[], uint8_t count); + + // } + // static void timerOFFSetup() + // { + // TIMSK2 &= ~(1 << OCIE2A); // Прерывание по совпадению выкл + // } + + void setBlindDecoders(IR_DecoderRaw *decoders[], uint8_t count); void rawSend(uint8_t *ptr, uint8_t len); void sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept = false); @@ -63,9 +65,9 @@ public: volatile bool ir_out_virtual; private: - void IR_Encoder::_sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len); + void _sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len); - void IR_Encoder::setDecoder_isSending(); + void setDecoder_isSending(); void sendByte(uint8_t byte, bool *prev, bool LOW_FIRST); void addSync(bool *prev, bool *next); void send_HIGH(bool = 1); @@ -105,12 +107,9 @@ private: uint8_t low; uint8_t high; }; - static inline uint8_t *bitHigh = new uint8_t[2]{ - (bitPauseTakts * 2) * 2 - 1, - (bitActiveTakts) * 2 - 1}; - static inline uint8_t *bitLow = new uint8_t[2]{ - (bitPauseTakts + bitActiveTakts) * 2 - 1, - (bitPauseTakts) * 2 - 1}; + static uint8_t *bitHigh; + static uint8_t *bitLow; uint8_t *currentBitSequence = bitLow; volatile SignalPart signal; }; + diff --git a/IR_config.h b/IR_config.h index 8d8555d..e7dee11 100644 --- a/IR_config.h +++ b/IR_config.h @@ -1,7 +1,7 @@ #pragma once #include -// #define IRDEBUG_INFO +#define IRDEBUG_INFO /*////////////////////////////////////////////////////////////////////////////////////// Для работы в паре положить декодер в энкодер @@ -107,7 +107,7 @@ typedef uint16_t crc_t; #endif #ifndef subBufferSize -#define subBufferSize 25 //Буфер для складирования фронтов, пока их не обработают (передатчик) +#define subBufferSize 11 //Буфер для складирования фронтов, пока их не обработают (передатчик) #endif #define preambPulse 3 From d774f87f7a7a316e017ebca873830c73777376bd Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 16 Apr 2024 15:58:35 +0300 Subject: [PATCH 03/69] BRUTEFORCE --- IR_DecoderRaw.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index f368ccc..3a8d296 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -495,6 +495,34 @@ void IR_DecoderRaw::writeToBuffer(bool bit) isRecive = false; isAvailable = crcCheck(packSize - crcBytes, crcValue); + + if (!isAvailable) // Исправление первого бита // Очень большая затычка... + for (size_t i = 0; i < packSize; ++i) + { + for (int j = 0; j < 8; ++j) + { + // инвертируем бит + dataBuffer[i] ^= 1 << j; + + isAvailable = crcCheck(packSize - crcBytes, crcValue); + // обратно инвертируем бит в исходное состояние + + if (isAvailable) + { + Serial.println("!!!INV!!!"); + goto OUT_BRUTEFORCE; + } + else + { + dataBuffer[i] ^= 1 << j; + } + } + } + OUT_BRUTEFORCE:; + // { + // dataBuffer[0] |= 0b10000000; + // isAvailable = crcCheck(packSize - crcBytes, crcValue); + // } } } From e5983c8367de152f82d94ba38c7ff0deeed7c852 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 16 Apr 2024 16:00:23 +0300 Subject: [PATCH 04/69] modified: IR-protocol.ino --- IR-protocol.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IR-protocol.ino b/IR-protocol.ino index 8364702..511edf9 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -167,7 +167,7 @@ void setup() Timer3.setPeriod(1000000U / carrierFrec / 2); // Timer3.attachCompare1Interrupt(EncoderISR); - Timer1.setMode(1,timer_mode::TIMER_INPUT_CAPTURE); + // Timer1.setMode(1,timer_mode::TIMER_INPUT_CAPTURE); Serial.begin(SERIAL_SPEED); Serial.println(F(INFO)); From fd62972717e490ac3ec48e855707b66dd2b4b448 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 16 Apr 2024 16:01:50 +0300 Subject: [PATCH 05/69] modified: IR-protocol.ino --- IR-protocol.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IR-protocol.ino b/IR-protocol.ino index 8364702..511edf9 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -167,7 +167,7 @@ void setup() Timer3.setPeriod(1000000U / carrierFrec / 2); // Timer3.attachCompare1Interrupt(EncoderISR); - Timer1.setMode(1,timer_mode::TIMER_INPUT_CAPTURE); + // Timer1.setMode(1,timer_mode::TIMER_INPUT_CAPTURE); Serial.begin(SERIAL_SPEED); Serial.println(F(INFO)); From 9643670942e6c3a37679d03cc2fb114be9b26f87 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 16 Apr 2024 17:28:16 +0300 Subject: [PATCH 06/69] upd --- IR-protocol.ino | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/IR-protocol.ino b/IR-protocol.ino index 511edf9..16e57e4 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -7,11 +7,13 @@ #define encForward_PIN PB5 #define encBackward_PIN PB4 -#define dec1_PIN PB7 +#define dec1_PIN PA8 #define dec2_PIN PB8 -#define LoopOut PB3 -// #define ISR_Out 10 +#define LoopOut PB12 + +#define ISR_1_Out PB6 +#define ISR_2_Out PB7 // #define TestOut 13 @@ -24,8 +26,8 @@ //////////////// Var ///////////////// -IR_Decoder decForward(PB7, 555); -IR_Decoder decBackward(PB8, 777); +IR_Decoder decForward(dec1_PIN, 555); +IR_Decoder decBackward(dec2_PIN, 777); IR_Encoder encForward(42 /* , &decBackward */); // IR_Encoder encBackward(321, encBackward_PIN); @@ -166,23 +168,20 @@ void setup() Timer3.setPeriod(1000000U / carrierFrec / 2); // Timer3.attachCompare1Interrupt(EncoderISR); - - // Timer1.setMode(1,timer_mode::TIMER_INPUT_CAPTURE); + Serial.begin(SERIAL_SPEED); Serial.println(F(INFO)); - // pinMode(A0, INPUT_PULLUP); - // pinMode(A1, INPUT_PULLUP); - // pinMode(A2, INPUT_PULLUP); - // pinMode(A3, INPUT_PULLUP); + pinMode(ISR_1_Out,OUTPUT); + pinMode(ISR_2_Out,OUTPUT); pinMode(LoopOut, OUTPUT); pinMode(SignalDetectLed, OUTPUT); // pinMode(ISR_Out, OUTPUT); - pinMode(2, INPUT_PULLUP); - pinMode(3, INPUT_PULLUP); + // pinMode(dec1_PIN, INPUT_PULLUP); + // pinMode(dec2_PIN, INPUT_PULLUP); // pinMode(8, OUTPUT); // pinMode(9, OUTPUT); From 0b888a58404c7ac773ffe7a99904a312d8434cef Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 16 Apr 2024 17:42:24 +0300 Subject: [PATCH 07/69] clean --- IR-protocol.ino | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/IR-protocol.ino b/IR-protocol.ino index 16e57e4..e14e88e 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -178,15 +178,11 @@ void setup() pinMode(LoopOut, OUTPUT); pinMode(SignalDetectLed, OUTPUT); - // pinMode(ISR_Out, OUTPUT); // pinMode(dec1_PIN, INPUT_PULLUP); // pinMode(dec2_PIN, INPUT_PULLUP); - // pinMode(8, OUTPUT); - // pinMode(9, OUTPUT); - // pinMode(11, OUTPUT); - // pinMode(13, OUTPUT); + pinMode(encForward_PIN, OUTPUT); pinMode(encBackward_PIN, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); From 99e523129dd5273b1b625fe8fd33b1eb5a5dfd80 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 16 Apr 2024 17:43:18 +0300 Subject: [PATCH 08/69] clean --- IR-protocol.ino | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/IR-protocol.ino b/IR-protocol.ino index 511edf9..e14e88e 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -7,11 +7,13 @@ #define encForward_PIN PB5 #define encBackward_PIN PB4 -#define dec1_PIN PB7 +#define dec1_PIN PA8 #define dec2_PIN PB8 -#define LoopOut PB3 -// #define ISR_Out 10 +#define LoopOut PB12 + +#define ISR_1_Out PB6 +#define ISR_2_Out PB7 // #define TestOut 13 @@ -24,8 +26,8 @@ //////////////// Var ///////////////// -IR_Decoder decForward(PB7, 555); -IR_Decoder decBackward(PB8, 777); +IR_Decoder decForward(dec1_PIN, 555); +IR_Decoder decBackward(dec2_PIN, 777); IR_Encoder encForward(42 /* , &decBackward */); // IR_Encoder encBackward(321, encBackward_PIN); @@ -166,28 +168,21 @@ void setup() Timer3.setPeriod(1000000U / carrierFrec / 2); // Timer3.attachCompare1Interrupt(EncoderISR); - - // Timer1.setMode(1,timer_mode::TIMER_INPUT_CAPTURE); + Serial.begin(SERIAL_SPEED); Serial.println(F(INFO)); - // pinMode(A0, INPUT_PULLUP); - // pinMode(A1, INPUT_PULLUP); - // pinMode(A2, INPUT_PULLUP); - // pinMode(A3, INPUT_PULLUP); + pinMode(ISR_1_Out,OUTPUT); + pinMode(ISR_2_Out,OUTPUT); pinMode(LoopOut, OUTPUT); pinMode(SignalDetectLed, OUTPUT); - // pinMode(ISR_Out, OUTPUT); - pinMode(2, INPUT_PULLUP); - pinMode(3, INPUT_PULLUP); + // pinMode(dec1_PIN, INPUT_PULLUP); + // pinMode(dec2_PIN, INPUT_PULLUP); + - // pinMode(8, OUTPUT); - // pinMode(9, OUTPUT); - // pinMode(11, OUTPUT); - // pinMode(13, OUTPUT); pinMode(encForward_PIN, OUTPUT); pinMode(encBackward_PIN, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); From 3b5045669b50ccf0fdc837c65cf14db99f27bba7 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 17 Apr 2024 09:58:32 +0300 Subject: [PATCH 09/69] upd --- .gitignore | 3 ++- IR-protocol.ino | 1 + IR_DecoderRaw.cpp | 2 ++ IR_config.h | 2 +- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 75ec3f0..04ae825 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.vscode/* \ No newline at end of file +.vscode/* +bin/* \ No newline at end of file diff --git a/IR-protocol.ino b/IR-protocol.ino index e14e88e..3520824 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -244,6 +244,7 @@ void status(IR_Decoder &dec) if (dec.gotData.available()) { detectSignal(); + Serial.println(micros()); String str; if (/* dec.gotData.getDataPrt()[1] */ 1) { diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index 3a8d296..43dcc0c 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -509,7 +509,9 @@ void IR_DecoderRaw::writeToBuffer(bool bit) if (isAvailable) { + #ifdef IRDEBUG_INFO Serial.println("!!!INV!!!"); + #endif goto OUT_BRUTEFORCE; } else diff --git a/IR_config.h b/IR_config.h index e7dee11..bf3053e 100644 --- a/IR_config.h +++ b/IR_config.h @@ -103,7 +103,7 @@ typedef uint16_t crc_t; #define bytePerPack 16 // колличество байтов в пакете #ifndef freeFrec -#define freeFrec true +#define freeFrec false #endif #ifndef subBufferSize From 4d12f77a8bccf06e37340ea91c63177a6ed60bb6 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 17 Apr 2024 11:08:31 +0300 Subject: [PATCH 10/69] json --- .gitignore | 3 ++- .vscode/arduino.json | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 .vscode/arduino.json diff --git a/.gitignore b/.gitignore index 04ae825..474dff0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .vscode/* -bin/* \ No newline at end of file +bin/* +!.vscode/arduino.json \ No newline at end of file diff --git a/.vscode/arduino.json b/.vscode/arduino.json new file mode 100644 index 0000000..e617ff1 --- /dev/null +++ b/.vscode/arduino.json @@ -0,0 +1,7 @@ +{ + "configuration": "device_variant=STM32F103C8,upload_method=STLinkMethod,cpu_speed=speed_72mhz,opt=osstd", + "board": "stm32duino:STM32F1:genericSTM32F103C", + "port": "COM17", + "output": "bin", + "prebuild": "if exist bin rd /s /q bin" +} \ No newline at end of file From 2972560b1317af2f68b117f033eee278bc1bfdaa Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 17 Apr 2024 11:09:22 +0300 Subject: [PATCH 11/69] json --- .gitignore | 3 ++- .vscode/launch.json | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 .vscode/launch.json diff --git a/.gitignore b/.gitignore index 474dff0..67b8ef7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .vscode/* bin/* -!.vscode/arduino.json \ No newline at end of file +!.vscode/arduino.json +!.vscode/launch.json \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..d4b3099 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + + { + "cwd": "${workspaceFolder}", + "executable": "${workspaceFolder}/bin/${workspaceFolderBasename}.ino.elf", + "name": "Debug with ST-Link", + "request": "launch", + "type": "cortex-debug", + "runToEntryPoint": "main", + "showDevDebugOutput": "raw", + "servertype": "stlink", + "armToolchainPath": "C://Program Files (x86)//Arm GNU Toolchain arm-none-eabi//13.2 Rel1//bin" + } + ] + } \ No newline at end of file From 03d74e30cdf5559d6ab02246479e03627963a131 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 17 Apr 2024 11:29:32 +0300 Subject: [PATCH 12/69] json --- .vscode/arduino.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.vscode/arduino.json b/.vscode/arduino.json index e617ff1..7c70ba3 100644 --- a/.vscode/arduino.json +++ b/.vscode/arduino.json @@ -3,5 +3,6 @@ "board": "stm32duino:STM32F1:genericSTM32F103C", "port": "COM17", "output": "bin", - "prebuild": "if exist bin rd /s /q bin" + "prebuild": "if exist bin rd /s /q bin", + "sketch": "IR-protocol.ino" } \ No newline at end of file From e334625864b2c2aced7423be58e6b0d40c3d353e Mon Sep 17 00:00:00 2001 From: DashyFox Date: Mon, 22 Apr 2024 11:20:53 +0300 Subject: [PATCH 13/69] STM works --- .gitignore | 3 +- .vscode/arduino.json | 4 +- IR-protocol.ino | 22 +- IR_DecoderRaw.cpp | 524 +++++++++++++++++++++++-------------------- IR_DecoderRaw.h | 47 ++-- IR_Encoder.cpp | 8 +- IR_config.h | 8 +- RingBuffer.h | 39 ++++ 8 files changed, 381 insertions(+), 274 deletions(-) create mode 100644 RingBuffer.h diff --git a/.gitignore b/.gitignore index 67b8ef7..8172f79 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .vscode/* bin/* !.vscode/arduino.json -!.vscode/launch.json \ No newline at end of file +!.vscode/launch.json +log/* \ No newline at end of file diff --git a/.vscode/arduino.json b/.vscode/arduino.json index 7c70ba3..fb0e740 100644 --- a/.vscode/arduino.json +++ b/.vscode/arduino.json @@ -1,6 +1,6 @@ { - "configuration": "device_variant=STM32F103C8,upload_method=STLinkMethod,cpu_speed=speed_72mhz,opt=osstd", - "board": "stm32duino:STM32F1:genericSTM32F103C", + "configuration": "pnum=BLUEPILL_F103C8,upload_method=swdMethod,xserial=none,usb=CDCgen,xusb=FS,opt=osstd,dbg=none,rtlib=nano", + "board": "STMicroelectronics:stm32:GenF1", "port": "COM17", "output": "bin", "prebuild": "if exist bin rd /s /q bin", diff --git a/IR-protocol.ino b/IR-protocol.ino index 3520824..2a1f9a7 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -72,7 +72,6 @@ uint8_t data4[] = {42, 127, 137, 255}; uint32_t loopTimer; uint8_t sig = 0; - uint16_t targetAddr = IR_Broadcast; Timer t1(500, millis, []() { @@ -157,17 +156,24 @@ Timer t1(500, millis, []() // encBackward.sendData(IR_Broadcast, data2); // encTree.sendData(IR_Broadcast, rawData3); }); -Timer t2(500, millis, []() - { digitalToggle(LED_BUILTIN); }); +// Timer t2(50, millis, []() +// { digitalToggle(LED_BUILTIN); }); Timer signalDetectTimer; ///////////////////////////////////////////////////////////////////// +HardwareTimer IR_Timer(TIM3); +HardwareTimer MicrosTimer(TIM1); + +void MicrosTimerISR(){ + +} + void setup() { - // disableDebugPorts(); + // MicrosTimer.setOve - Timer3.setPeriod(1000000U / carrierFrec / 2); - // Timer3.attachCompare1Interrupt(EncoderISR); + IR_Timer.setOverflow(carrierFrec*2, HERTZ_FORMAT); + IR_Timer.attachInterrupt(1, EncoderISR); Serial.begin(SERIAL_SPEED); @@ -276,7 +282,7 @@ void status(IR_Decoder &dec) // str += (" CRC CALC: "); str += (dec.gotData.getCrcCALC()); str += "\n"; str += "\n"; - for (size_t i = 0; i < min(10, dec.gotData.getDataSize()); i++) + for (size_t i = 0; i < min(uint8_t(10), dec.gotData.getDataSize()); i++) { switch (i) { @@ -348,7 +354,7 @@ void status(IR_Decoder &dec) // str += (" CRC CALC: "); str += (dec.gotBackData.getCrcCALC()); str += "\n"; str += "\n"; - for (size_t i = 0; i < min(10, dec.gotBackData.getDataSize()); i++) + for (size_t i = 0; i < min(uint8_t(10), dec.gotBackData.getDataSize()); i++) { switch (i) { diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index 43dcc0c..6fdae21 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -15,55 +15,47 @@ IR_DecoderRaw::IR_DecoderRaw(const uint8_t isrPin, uint16_t addr, IR_Encoder *en pinMode(wrLow, OUTPUT); pinMode(writeOp, OUTPUT); pinMode(errOut, OUTPUT); + pinMode(up, OUTPUT); + pinMode(down, OUTPUT); #endif } //////////////////////////////////// isr /////////////////////////////////////////// +volatile uint32_t time_; void IR_DecoderRaw::isr() { - if (isPairSending) - return; - - subBuffer[currentSubBufferIndex].next = nullptr; - subBuffer[currentSubBufferIndex].dir = digitalRead(isrPin); - subBuffer[currentSubBufferIndex].time = micros(); - - if (firstUnHandledFront == nullptr) + noInterrupts(); + // time_ = HAL_GetTick() * 1000 + ((SysTick->LOAD + 1 - SysTick->VAL) * 1000) / SysTick->LOAD + 1; + time_ = micros(); + interrupts(); + if (time_ < oldTime) { - firstUnHandledFront = &subBuffer[currentSubBufferIndex]; // Если нет необработанных данных - добавляем их - isSubBufferOverflow = false; - } - else - { - if (firstUnHandledFront == &subBuffer[currentSubBufferIndex]) - { // Если контроллер не успел обработать новый сигнал, принудительно пропускаем его - firstUnHandledFront = firstUnHandledFront->next; - isSubBufferOverflow = true; - -#ifdef IRDEBUG_INFO - // Serial.println(); - Serial.println(" ISR BUFFER OVERFLOW "); -// Serial.println(); +#ifdef IRDEBUG + Serial.print("\n"); + Serial.print("count: "); + Serial.println(wrongCounter++); + Serial.print("time: "); + Serial.println(time_); + Serial.print("oldTime: "); + Serial.println(oldTime); + Serial.print("sub: "); + Serial.println(max((uint32_t)time_, oldTime) - min((uint32_t)time_, oldTime)); #endif - } + time_ += 1000; } + oldTime = time_; - if (lastFront == nullptr) - { - lastFront = &subBuffer[currentSubBufferIndex]; - } - else - { - lastFront->next = &subBuffer[currentSubBufferIndex]; - lastFront = &subBuffer[currentSubBufferIndex]; - } + FrontStorage edge; + edge.dir = digitalRead(isrPin); + edge.time = time_; - currentSubBufferIndex == (subBufferSize - 1) ? currentSubBufferIndex = 0 : currentSubBufferIndex++; // Закольцовка буффера + subBuffer.push(edge); } //////////////////////////////////////////////////////////////////////////////////// +uint32_t wrCounter; void IR_DecoderRaw::firstRX() { @@ -86,6 +78,8 @@ void IR_DecoderRaw::firstRX() isPreamb = true; riseSyncTime = bitTime /* 1100 */; + wrCounter = 0; + memset(dataBuffer, 0x00, dataByteSizeMax); } @@ -98,56 +92,116 @@ void IR_DecoderRaw::listenStart() firstRX(); } } - void IR_DecoderRaw::tick() { FrontStorage currentFront; noInterrupts(); listenStart(); - if (firstUnHandledFront == nullptr) + FrontStorage *currentFrontPtr; + currentFrontPtr = subBuffer.pop(); + if (currentFrontPtr == nullptr) { isSubBufferOverflow = false; interrupts(); return; - } // Если данных нет - ничего не делаем - currentFront = *((FrontStorage *)firstUnHandledFront); // найти следующий необработанный фронт/спад + } // Если данных нет - ничего не делаем + currentFront = *currentFrontPtr; interrupts(); - if (currentFront.next == nullptr) - { - isRecive = false; - return; - } + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + if (currentFront.dir) + { // Если __/``` ↑ + if (currentFront.time - prevRise > riseTimeMax / 2 || highCount || lowCount) + { // комплексный фикс рваной единицы + risePeriod = currentFront.time - prevRise; + highTime = currentFront.time - prevFall; + lowTime = prevFall - prevRise; + prevRise = currentFront.time; + + if ( + risePeriod > UINT32_MAX - IR_timeout * 10 || + highTime > UINT32_MAX - IR_timeout * 10 || + lowTime > UINT32_MAX - IR_timeout * 10 || + prevRise > UINT32_MAX - IR_timeout * 10) + { +#ifdef IRDEBUG + errPulse(down, 50); + + // Serial.print("\n"); + + // Serial.print("risePeriod: "); + // Serial.println(risePeriod); + + // Serial.print("highTime: "); + // Serial.println(highTime); + + // Serial.print("lowTime: "); + // Serial.println(lowTime); + + // Serial.print("prevRise: "); + // Serial.println(prevRise); +#endif + } + } + else + { + errors.other++; + } + } + else + { // Если ```\__ ↓ + + if (currentFront.time - prevFall > riseTimeMin / 4) + { + prevFall = currentFront.time; + } + else + { + errors.other++; + } + } +#ifdef IRDEBUG + // goto END; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#endif + //---------------------------------------------------------------------------------- +#ifdef IRDEBUG + digitalWrite(errOut, currentFront.dir); +#endif + if (currentFront.time > prevRise && currentFront.time - prevRise > IR_timeout * 2 && !isRecive) { // первый - preambFrontCounter = preambFronts - 1U; - - if (!currentFront.dir) - { -#ifdef IRDEBUG_INFO -// Serial.print(" currentFront.time: "); Serial.print(currentFront.time); -// Serial.print(" currentFront.dir: "); Serial.print(currentFront.dir ? "UP" : "DOWN"); -// Serial.print(" next: "); Serial.print(currentFront.next == nullptr); -// Serial.print(" prevRise: "); Serial.print(prevRise); -// Serial.print(" SUB: "); Serial.println(currentFront.time - prevRise); +#ifdef IRDEBUG + errPulse(up, 50); + errPulse(down, 50); + errPulse(up, 150); + errPulse(down, 150); #endif - isRecive = true; - isWrongPack = false; - } + preambFrontCounter = preambFronts - 1U; + isPreamb = true; + + isRecive = true; + isWrongPack = false; } + //------------------------------------------------------------------------------------------------------- + if (preambFrontCounter) { // в преамбуле - uint32_t risePeriod; - risePeriod = currentFront.time - prevRise; +#ifdef IRDEBUG + Serial.print("risePeriod: "); + Serial.println(risePeriod); +#endif if (currentFront.dir && risePeriod < IR_timeout) { // __/``` ↑ и мы в внутри пакета - if (risePeriod < riseTimeMin << 1) + if (risePeriod < riseTimeMin / 2) { // fix рваной единицы preambFrontCounter += 2; errors.other++; +#ifdef IRDEBUG + errPulse(down, 350); +#endif } else { @@ -168,194 +222,182 @@ void IR_DecoderRaw::tick() if (isPreamb) { // первый фронт после // gotTune.set(riseSyncTime); + isPreamb = false; +#ifdef IRDEBUG + errPulse(up, 50); + errPulse(down, 50); +#endif + prevRise += risePeriod / 2; + // prevRise = currentFront.time + riseTime; + goto END; } - isPreamb = false; } + + if (isPreamb) + { + goto END; + } + if (risePeriod > IR_timeout || isBufferOverflow || risePeriod < riseTimeMin || isWrongPack) + // ~Мы в пределах таймаута и буффер не переполнен и fix дроблёных единиц + { + goto END; + } + // определить направление фронта if (currentFront.dir) { // Если __/``` ↑ - - uint16_t risePeriod = currentFront.time - prevRise; - uint16_t highTime = currentFront.time - prevFall; - uint16_t lowTime = prevFall - prevRise; - - int8_t highCount = 0; - int8_t lowCount = 0; - int8_t allCount = 0; + highCount = 0; + lowCount = 0; + allCount = 0; bool invertErr = false; - - if (!isPreamb) - { - if (risePeriod < IR_timeout && !isBufferOverflow && risePeriod > riseTimeMin && !isWrongPack) - { - // Мы в пределах таймаута и буффер не переполнен и fix дроблёных единиц - - if (aroundRise(risePeriod)) - { // тактирование есть, сигнал хороший - без ошибок(?) - - if (highTime > riseTimeMin / 2U) - { // 1 #ifdef IRDEBUG - digitalWrite(wrHigh, 1); -#endif - writeToBuffer(HIGH); - } - else - { // 0 -#ifdef IRDEBUG - digitalWrite(wrLow, 1); -#endif - writeToBuffer(LOW); - } - } - else - { // пропущены такты! сигнал средний // ошибка пропуска - highCount = ceil_div(highTime, riseTime); // предполагаемое колличество HIGH битов - lowCount = ceil_div(lowTime, riseTime); // предполагаемое колличество LOW битов - allCount = ceil_div(risePeriod, riseTime); // предполагаемое колличество всего битов + Serial.print("\n"); - if (highCount == 0 && highTime > riseTime / 3) - { // fix короткой единицы (?)после пропуска нулей(?) - highCount++; - errors.other++; -#ifdef IRDEBUG - errPulse(errOut, 2); -#endif - } + Serial.print("wrCounter: "); + Serial.println(wrCounter++); - if (lowCount + highCount > allCount) - { // fix ошибочных сдвигов - if (lowCount > highCount) - { // Лишние нули - lowCount = allCount - highCount; - errors.lowSignal += lowCount; -#ifdef IRDEBUG - errPulse(errOut, 3); -#endif - } - else if (lowCount < highCount) - { // Лишние единицы - highCount = allCount - lowCount; - errors.highSignal += highCount; -#ifdef IRDEBUG - errPulse(errOut, 4); -#endif - // неизвестный случай Инверсит след бит или соседние - // Очень редко - // TODO: Отловить проверить - } - else if (lowCount == highCount) - { - invertErr = true; - // Serial.print("..."); - errors.other += allCount; - } - // errorCounter += allCount; - } + Serial.print("risePeriod: "); + Serial.println(risePeriod); - // errorCounter += allCount; - // errors.other+=allCount; - if (lowCount < highCount) - { - errors.highSignal += highCount; - } - else - { - errors.lowSignal += lowCount; - } + Serial.print("highTime: "); + Serial.println(highTime); -#ifdef IRDEBUG - errPulse(errOut, 1); + Serial.print("lowTime: "); + Serial.println(lowTime); #endif - for (int8_t i = 0; i < lowCount && 8 - i; i++) - { // отправка LOW битов, если есть - if (i == lowCount - 1 && invertErr) - { - invertErr = false; - writeToBuffer(!LOW); -#ifdef IRDEBUG - digitalWrite(wrLow, 1); -#endif - } - else - { - writeToBuffer(LOW); -#ifdef IRDEBUG - digitalWrite(wrLow, 1); -#endif - } - } + if (aroundRise(risePeriod)) + { // тактирование есть, сигнал хороший - без ошибок(?) - for (int8_t i = 0; i < highCount && 8 - i; i++) - { // отправка HIGH битов, если есть - if (i == highCount - 1 && invertErr) - { - invertErr = false; - writeToBuffer(!HIGH); + if (highTime > lowTime) + { // 1 #ifdef IRDEBUG - digitalWrite(wrLow, 1); + errPulse(wrHigh, 1); #endif - } - else - { - writeToBuffer(HIGH); + writeToBuffer(HIGH); + } + else + { // 0 #ifdef IRDEBUG - digitalWrite(wrHigh, 1); -#endif - } - } - } -#ifdef IRDEBUG - digitalWrite(wrHigh, 0); - digitalWrite(wrLow, 0); + errPulse(wrLow, 1); #endif + writeToBuffer(LOW); } } - if (risePeriod > riseTimeMax / 2 || highCount || lowCount) - { // комплексный фикс рваной единицы - prevPrevRise = prevRise; - prevRise = currentFront.time; - } else - { - errors.other++; + { // пропущены такты! сигнал средний // ошибка пропуска + highCount = ceil_div(highTime, riseTime); // предполагаемое колличество HIGH битов + lowCount = ceil_div(lowTime, riseTime); // предполагаемое колличество LOW битов + allCount = ceil_div(risePeriod, riseTime); // предполагаемое колличество всего битов + + if (highCount == 0 && highTime > riseTime / 3) + { // fix короткой единицы (?)после пропуска нулей(?) + highCount++; + errors.other++; #ifdef IRDEBUG - errPulse(errOut, 5); + errPulse(up, 50); #endif + } + + if (lowCount + highCount > allCount) + { // fix ошибочных сдвигов + if (lowCount > highCount) + { // Лишние нули + lowCount = allCount - highCount; + errors.lowSignal += lowCount; +#ifdef IRDEBUG + // errPulse(errOut, 3); + errPulse(down, 40); + errPulse(up, 10); + errPulse(down, 40); +#endif + } + else if (lowCount < highCount) + { // Лишние единицы + highCount = allCount - lowCount; + errors.highSignal += highCount; +#ifdef IRDEBUG + errPulse(down, 10); + errPulse(up, 40); + errPulse(down, 10); +// errPulse(errOut, 4); +#endif + // неизвестный случай Инверсит след бит или соседние + // Очень редко + // TODO: Отловить проверить + } + else if (lowCount == highCount) + { +#ifdef IRDEBUG + errPulse(down, 40); + errPulse(up, 40); + errPulse(down, 40); +#endif + invertErr = true; + // Serial.print("..."); + errors.other += allCount; + } + // errorCounter += allCount; + } + + // errorCounter += allCount; + // errors.other+=allCount; + if (lowCount < highCount) + { + errors.highSignal += highCount; + } + else + { + errors.lowSignal += lowCount; + } + + // errPulse(errOut, 1); + + for (int8_t i = 0; i < lowCount && 8 - i; i++) + { // отправка LOW битов, если есть + if (i == lowCount - 1 && invertErr) + { + invertErr = false; + writeToBuffer(HIGH); +#ifdef IRDEBUG + errPulse(wrHigh, 1); +#endif + } + else + { + writeToBuffer(LOW); +#ifdef IRDEBUG + errPulse(wrLow, 1); +#endif + } + } + + for (int8_t i = 0; i < highCount && 8 - i; i++) + { // отправка HIGH битов, если есть + if (i == highCount - 1 && invertErr) + { + invertErr = false; + writeToBuffer(LOW); +#ifdef IRDEBUG + errPulse(wrLow, 1); +#endif + } + else + { + writeToBuffer(HIGH); +#ifdef IRDEBUG + errPulse(wrHigh, 1); +#endif + } + } } } else { // Если ```\__ ↓ - - if (currentFront.time - prevFall > riseTimeMin) - { - prevPrevFall = prevFall; - prevFall = currentFront.time; - } - else - { -#ifdef IRDEBUG -// errPulse(errOut, 5); -#endif - } } - if (isPreamb && preambFrontCounter <= 0) - { - prevRise = currentFront.time + riseTime; - } - -#ifdef IRDEBUG - digitalWrite(writeOp, isPreamb); -#endif - //////////////////////////////////////////////////////////////////////////////////////////////////////////// - // noInterrupts(); - if (firstUnHandledFront != nullptr) - { - firstUnHandledFront = firstUnHandledFront->next; // переместить флаг на следующий элемент для обработки (next or nullptr) - } - // interrupts(); +//////////////////////////////////////////////////////////////////////////////////////////////////////////// +END:; } void IR_DecoderRaw::writeToBuffer(bool bit) @@ -484,7 +526,7 @@ void IR_DecoderRaw::writeToBuffer(bool bit) if (packSize && (i_dataBuffer == packSize * bitPerByte)) { // Конец #ifdef IRDEBUG_INFO - Serial.print(" END DATA "); + Serial.print(" END DATA " + crcCheck(packSize - crcBytes, crcValue) ? "OK " : "ERR "); #endif packInfo.buffer = dataBuffer; @@ -496,35 +538,33 @@ void IR_DecoderRaw::writeToBuffer(bool bit) isRecive = false; isAvailable = crcCheck(packSize - crcBytes, crcValue); - if (!isAvailable) // Исправление первого бита // Очень большая затычка... - for (size_t i = 0; i < packSize; ++i) - { - for (int j = 0; j < 8; ++j) +#ifdef BRUTEFORCE_CHECK + if (!isAvailable) // Исправление первого бита // Очень большая затычка... + for (size_t i = 0; i < min(packSize - crcBytes*2, dataByteSizeMax); ++i) { - // инвертируем бит - dataBuffer[i] ^= 1 << j; - - isAvailable = crcCheck(packSize - crcBytes, crcValue); - // обратно инвертируем бит в исходное состояние - - if (isAvailable) - { - #ifdef IRDEBUG_INFO - Serial.println("!!!INV!!!"); - #endif - goto OUT_BRUTEFORCE; - } - else + for (int j = 0; j < 8; ++j) { + // инвертируем бит dataBuffer[i] ^= 1 << j; + + isAvailable = crcCheck(packSize - crcBytes, crcValue); + // обратно инвертируем бит в исходное состояние + + if (isAvailable) + { + #ifdef IRDEBUG_INFO + Serial.println("!!!INV!!!"); + #endif + goto OUT_BRUTEFORCE; + } + else + { + dataBuffer[i] ^= 1 << j; + } } } - } - OUT_BRUTEFORCE:; - // { - // dataBuffer[0] |= 0b10000000; - // isAvailable = crcCheck(packSize - crcBytes, crcValue); - // } + OUT_BRUTEFORCE:; +#endif } } diff --git a/IR_DecoderRaw.h b/IR_DecoderRaw.h index 9e02c0a..de56567 100644 --- a/IR_DecoderRaw.h +++ b/IR_DecoderRaw.h @@ -1,7 +1,8 @@ #pragma once #include "IR_config.h" +#include "RingBuffer.h" -#define IRDEBUG +// #define IRDEBUG #ifdef IRDEBUG #define wrHigh PA1 // Запись HIGH инициирована // green @@ -10,7 +11,11 @@ // Исправленные ошибки // purle // 1 пульс: fix #define errOut PA4 +#define up PA3 +#define down PA2 #endif +#define up PA3 +#define down PA2 ///////////////////////////////////////////////////////////////////////////////////////////////// @@ -54,6 +59,7 @@ public: void isr(); // Функция прерывания void tick(); // Обработка приёмника, необходима для работы + void tickOld(); bool isOverflow() { return isBufferOverflow; }; // Буффер переполнился bool isSubOverflow() @@ -82,23 +88,38 @@ private: uint16_t riseSyncTime = bitTime; // Подстраиваемое время бита в мкс //////////////////////////////////////////////////////////////////////// - volatile uint8_t currentSubBufferIndex; // Счетчик текущей позиции во вспомогательном буфере фронтов/спадов + volatile uint32_t currentSubBufferIndex; // Счетчик текущей позиции во вспомогательном буфере фронтов/спадов struct FrontStorage - { // Структура для хранения времени и направления фронта/спада - volatile uint32_t time = 0; // Время - volatile bool dir = false; // Направление (true = ↑; false = ↓) - volatile FrontStorage *next = nullptr; // Указатель на следующий связанный фронт/спад, или nullptr если конец + { // Структура для хранения времени и направления фронта/спада + volatile uint32_t time = 0; // Время + volatile bool dir = false; // Направление (true = ↑; false = ↓) + // volatile FrontStorage *next = nullptr; // Указатель на следующий связанный фронт/спад, или nullptr если конец }; volatile FrontStorage *lastFront = nullptr; // Указатель последнего фронта/спада volatile FrontStorage *firstUnHandledFront = nullptr; // Указатель первого необработанного фронта/спада - volatile FrontStorage subBuffer[subBufferSize]; // вспомогательный буфер для хранения необработанных фронтов/спадов + // volatile FrontStorage subBuffer[subBufferSize]; // вспомогательный буфер для хранения необработанных фронтов/спадов + + RingBuffer subBuffer; + //////////////////////////////////////////////////////////////////////// - uint8_t dataBuffer[dataByteSizeMax]{0}; // Буффер данных - uint32_t prevRise, prevPrevRise, prevFall, prevPrevFall; // Время предыдущих фронтов/спадов - uint16_t errorCounter = 0; // Счётчик ошибок - int8_t preambFrontCounter = 0; // Счётчик __/``` ↑ преамбулы - int16_t bufBitPos = 0; // Позиция для записи бита в буффер + uint8_t dataBuffer[dataByteSizeMax]{0}; // Буффер данных + volatile uint32_t prevRise, prevPrevRise, prevFall, prevPrevFall; // Время предыдущих фронтов/спадов + + volatile uint32_t risePeriod; + volatile uint32_t highTime; + volatile uint32_t lowTime; + + uint32_t oldTime; + uint16_t wrongCounter; + + int8_t highCount; + int8_t lowCount; + int8_t allCount; + + uint16_t errorCounter = 0; // Счётчик ошибок + int8_t preambFrontCounter = 0; // Счётчик __/``` ↑ преамбулы + int16_t bufBitPos = 0; // Позиция для записи бита в буффер private: void listenStart(); // @brief Слушатель для работы isReciving() @@ -129,7 +150,7 @@ private: /// @return Результат uint16_t ceil_div(uint16_t val, uint16_t divider); -#ifdef IRDEBUG +#if true //def IRDEBUG inline void errPulse(uint8_t pin, uint8_t count); inline void infoPulse(uint8_t pin, uint8_t count); #endif diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index cfea755..f97d05d 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -160,7 +160,7 @@ void IR_Encoder::_sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint memset(sendBuffer, 0x00, dataByteSizeMax); uint8_t dataStart = msgBytes + addrBytes + (isAdressed ? addrBytes : 0); - uint8_t packSize = msgBytes + addrBytes + (isAdressed ? addrBytes : 0) + min(1, len) + crcBytes; + uint8_t packSize = msgBytes + addrBytes + (isAdressed ? addrBytes : 0) + min(uint8_t(1), len) + crcBytes; uint8_t msgType = ((isAdressed ? IR_MSG_BACK_TO : IR_MSG_BACK) << 5) | ((packSize) & (IR_MASK_MSG_INFO >> 1)); @@ -398,8 +398,8 @@ void IR_Encoder::send_EMPTY(uint8_t count) } uint8_t* IR_Encoder::bitHigh = new uint8_t[2]{ - (bitPauseTakts * 2) * 2 - 1, + (bitPauseTakts) * 2 - 1, (bitActiveTakts) * 2 - 1}; uint8_t* IR_Encoder::bitLow = new uint8_t[2]{ - (bitPauseTakts + bitActiveTakts) * 2 - 1, - (bitPauseTakts) * 2 - 1}; \ No newline at end of file + (bitPauseTakts/2 + bitActiveTakts) * 2 - 1, + (bitPauseTakts) - 1}; \ No newline at end of file diff --git a/IR_config.h b/IR_config.h index bf3053e..3935d62 100644 --- a/IR_config.h +++ b/IR_config.h @@ -101,13 +101,14 @@ customByte - контрольная сумма принятых данных п /////////////////////////////////////////////////////////////////////////////////////*/ typedef uint16_t crc_t; +// #define BRUTEFORCE_CHECK // Перепроверяет пакет на 1 битные ошибки //TODO: зависает #define bytePerPack 16 // колличество байтов в пакете #ifndef freeFrec #define freeFrec false #endif #ifndef subBufferSize -#define subBufferSize 11 //Буфер для складирования фронтов, пока их не обработают (передатчик) +#define subBufferSize 5 //Буфер для складирования фронтов, пока их не обработают (передатчик) #endif #define preambPulse 3 @@ -134,12 +135,11 @@ typedef uint16_t crc_t; // В процессе работы значения будут отклонятся в соответствии с предыдущим битом #define bitActiveTakts 25U // длительность высокого уровня в тактах -#define bitPauseTakts 6U // длительность низкого уровня в тактах +#define bitPauseTakts 12U // длительность низкого уровня в тактах -#define bitTakts (bitActiveTakts+(bitPauseTakts*2U)) // Общая длительность бита в тактах +#define bitTakts (bitActiveTakts+bitPauseTakts) // Общая длительность бита в тактах #define bitTime (bitTakts*carrierPeriod) // Общая длительность бита #define tolerance 300U - class IR_FOX { public: struct PackOffsets { diff --git a/RingBuffer.h b/RingBuffer.h new file mode 100644 index 0000000..4e23bfe --- /dev/null +++ b/RingBuffer.h @@ -0,0 +1,39 @@ +#pragma once +#include "Arduino.h" +template +class RingBuffer { +public: + RingBuffer() : start(0), end(0) {} + + bool isFull() const { + return ((end + 1) % BufferSize) == start; + } + + bool isEmpty() const { + return start == end; + } + + void push(T element) { + noInterrupts(); + if (!isFull()) { + data[end] = element; + end = (end + 1) % BufferSize; + } + interrupts(); + } + + T* pop() { + noInterrupts(); + T* value = nullptr; + if (!isEmpty()) { + value = &data[start]; + start = (start + 1) % BufferSize; + } + interrupts(); + return value; + } + +private: + T data[BufferSize]; + unsigned int start, end; +}; \ No newline at end of file From 5cc4555bac25155432b52a77d175076eaf4beb2e Mon Sep 17 00:00:00 2001 From: DashyFox Date: Mon, 22 Apr 2024 11:26:11 +0300 Subject: [PATCH 14/69] upd --- IR_DecoderRaw.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index 6fdae21..7221c5c 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -112,7 +112,7 @@ void IR_DecoderRaw::tick() if (currentFront.dir) { // Если __/``` ↑ - if (currentFront.time - prevRise > riseTimeMax / 2 || highCount || lowCount) + if (currentFront.time - prevRise > riseTimeMax / 4 || highCount || lowCount) { // комплексный фикс рваной единицы risePeriod = currentFront.time - prevRise; highTime = currentFront.time - prevFall; @@ -537,7 +537,7 @@ void IR_DecoderRaw::writeToBuffer(bool bit) isRecive = false; isAvailable = crcCheck(packSize - crcBytes, crcValue); - + #ifdef BRUTEFORCE_CHECK if (!isAvailable) // Исправление первого бита // Очень большая затычка... for (size_t i = 0; i < min(packSize - crcBytes*2, dataByteSizeMax); ++i) From 16a626db223c89c15853a393a1192d9de26ec957 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Mon, 22 Apr 2024 12:52:41 +0300 Subject: [PATCH 15/69] BRUTEFORCE_CHECK --- IR_DecoderRaw.cpp | 4 ++-- IR_config.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index 7221c5c..2f2e581 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -540,14 +540,14 @@ void IR_DecoderRaw::writeToBuffer(bool bit) #ifdef BRUTEFORCE_CHECK if (!isAvailable) // Исправление первого бита // Очень большая затычка... - for (size_t i = 0; i < min(packSize - crcBytes*2, dataByteSizeMax); ++i) + for (size_t i = 0; i < min(uint16_t(packSize - crcBytes*2U), uint16_t(dataByteSizeMax)); ++i) { for (int j = 0; j < 8; ++j) { // инвертируем бит dataBuffer[i] ^= 1 << j; - isAvailable = crcCheck(packSize - crcBytes, crcValue); + isAvailable = crcCheck(min(uint16_t(packSize - crcBytes), uint16_t(dataByteSizeMax - 1U)), crcValue); // обратно инвертируем бит в исходное состояние if (isAvailable) diff --git a/IR_config.h b/IR_config.h index 3935d62..0edbf51 100644 --- a/IR_config.h +++ b/IR_config.h @@ -101,7 +101,7 @@ customByte - контрольная сумма принятых данных п /////////////////////////////////////////////////////////////////////////////////////*/ typedef uint16_t crc_t; -// #define BRUTEFORCE_CHECK // Перепроверяет пакет на 1 битные ошибки //TODO: зависает +#define BRUTEFORCE_CHECK // Перепроверяет пакет на 1 битные ошибки //TODO: зависает #define bytePerPack 16 // колличество байтов в пакете #ifndef freeFrec #define freeFrec false From 06d27f25907275406109dc3b8ad422728c32deb7 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Mon, 22 Apr 2024 16:50:26 +0300 Subject: [PATCH 16/69] upd --- IR-protocol.ino | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/IR-protocol.ino b/IR-protocol.ino index 2a1f9a7..8b113cc 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -4,20 +4,17 @@ #include "MemoryCheck.h" /////////////// Pinout /////////////// -#define encForward_PIN PB5 -#define encBackward_PIN PB4 +#define encForward_PIN PA0 +#define encBackward_PIN PA1 -#define dec1_PIN PA8 -#define dec2_PIN PB8 +#define dec1_PIN PB0 +#define dec2_PIN PB1 -#define LoopOut PB12 - -#define ISR_1_Out PB6 -#define ISR_2_Out PB7 +#define LoopOut PA7 // #define TestOut 13 -#define SignalDetectLed PB15 +#define SignalDetectLed PA6 //////////////// Ini ///////////////// @@ -179,13 +176,10 @@ void setup() Serial.begin(SERIAL_SPEED); Serial.println(F(INFO)); - pinMode(ISR_1_Out,OUTPUT); - pinMode(ISR_2_Out,OUTPUT); - pinMode(LoopOut, OUTPUT); pinMode(SignalDetectLed, OUTPUT); - // pinMode(dec1_PIN, INPUT_PULLUP); + pinMode(dec1_PIN, INPUT_PULLUP); // pinMode(dec2_PIN, INPUT_PULLUP); From e951111c53faad07409b876033a02d10d18833c5 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 23 Apr 2024 13:35:49 +0300 Subject: [PATCH 17/69] refactor --- IR-protocol.ino | 152 +++++++++++++++-------- IR_Decoder.cpp | 72 +++++++++++ IR_Decoder.h | 58 ++------- IR_DecoderRaw.cpp | 67 ++++++---- IR_DecoderRaw.h | 30 +---- IR_Encoder.cpp | 53 ++++---- IR_Encoder.h | 35 +----- IR_config.cpp | 27 ++++ IR_config.h | 36 ++---- PacketTypes.cpp | 107 ++++++++++++++++ PacketTypes.h | 308 ++++++---------------------------------------- 11 files changed, 443 insertions(+), 502 deletions(-) create mode 100644 IR_Decoder.cpp create mode 100644 IR_config.cpp create mode 100644 PacketTypes.cpp diff --git a/IR-protocol.ino b/IR-protocol.ino index 8b113cc..2a9556f 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -7,14 +7,36 @@ #define encForward_PIN PA0 #define encBackward_PIN PA1 -#define dec1_PIN PB0 -#define dec2_PIN PB1 +#define dec0_PIN PB0 +#define dec1_PIN PB1 +#define dec2_PIN PA2 +#define dec3_PIN PB3 +#define dec4_PIN PB4 +#define dec5_PIN PB5 +#define dec6_PIN PB6 +#define dec7_PIN PB7 +#define dec8_PIN PB8 +#define dec9_PIN PB9 +#define dec10_PIN PB10 +#define dec11_PIN PB11 +#define dec12_PIN PB12 +#define dec13_PIN PB13 +#define dec14_PIN PB14 +#define dec15_PIN PB15 #define LoopOut PA7 -// #define TestOut 13 +#define dec_ISR(n) \ + void dec_##n##_ISR() { dec##n.isr(); } +#define dec_Ini(n) \ + IR_Decoder dec##n(dec##n##_PIN, n); \ + dec_ISR(n) -#define SignalDetectLed PA6 +#define decPinMode(n) pinMode(dec##n##_PIN, INPUT_PULLUP); +#define decAttach(n) attachInterrupt(dec##n##_PIN, dec_##n##_ISR, CHANGE); +#define decSetup(n) /* decPinMode(n); */ decAttach(n); +#define decTick(n) dec##n.tick(); +#define decStat(n) rx_flag |= statusSimple(dec##n); //////////////// Ini ///////////////// @@ -23,43 +45,35 @@ //////////////// Var ///////////////// -IR_Decoder decForward(dec1_PIN, 555); -IR_Decoder decBackward(dec2_PIN, 777); - -IR_Encoder encForward(42 /* , &decBackward */); +IR_Encoder encForward(PA5, 42 /* , &decBackward */); // IR_Encoder encBackward(321, encBackward_PIN); // IR_Encoder encTree(325, A2); //////////////////////// Функции прерываний //////////////////////// -void decForwardISR() -{ - decForward.isr(); - // Serial.println("ISR"); -} - -void decBackwardISR() -{ - decBackward.isr(); - // Serial.println("ISR"); -} - -static uint8_t *portOut; - void EncoderISR() { - encForward.isr(); - // encBackward.isr(); - // encTree.isr(); - // TODO: Сделать выбор порта - // *portOut = (*portOut & 0b11001111) | - // ( - // encForward.ir_out_virtual << 5U - // // | encBackward.ir_out_virtual << 6U - // // | encTree.ir_out_virtual << 2U - // ); - digitalWrite(PB5, encForward.ir_out_virtual); + // Serial.println("EncoderISR"); + IR_Encoder::isr(); } + +//------------------------------------------------------------------- + +dec_Ini(0); +dec_Ini(1); +dec_Ini(2); +dec_Ini(3); +dec_Ini(4); +dec_Ini(5); +dec_Ini(6); +dec_Ini(7); +dec_Ini(8); +dec_Ini(9); +dec_Ini(10); +dec_Ini(11); +dec_Ini(12); +dec_Ini(13); + ///////////////////////////////////////////////////////////////////// uint8_t data0[] = {}; uint8_t data1[] = {42}; @@ -159,39 +173,44 @@ Timer t1(500, millis, []() Timer signalDetectTimer; ///////////////////////////////////////////////////////////////////// HardwareTimer IR_Timer(TIM3); -HardwareTimer MicrosTimer(TIM1); - -void MicrosTimerISR(){ - -} void setup() { // MicrosTimer.setOve - IR_Timer.setOverflow(carrierFrec*2, HERTZ_FORMAT); + IR_Timer.setOverflow(carrierFrec * 2, HERTZ_FORMAT); IR_Timer.attachInterrupt(1, EncoderISR); - + IR_Timer.resume(); Serial.begin(SERIAL_SPEED); Serial.println(F(INFO)); pinMode(LoopOut, OUTPUT); - pinMode(SignalDetectLed, OUTPUT); + // pinMode(SignalDetectLed, OUTPUT); pinMode(dec1_PIN, INPUT_PULLUP); // pinMode(dec2_PIN, INPUT_PULLUP); - pinMode(encForward_PIN, OUTPUT); pinMode(encBackward_PIN, OUTPUT); - pinMode(LED_BUILTIN, OUTPUT); // IR_DecoderRaw* blindFromForward [] { &decForward, &decBackward }; // encForward.setBlindDecoders(blindFromForward, sizeof(blindFromForward) / sizeof(IR_DecoderRaw*)); - attachInterrupt(dec1_PIN, decForwardISR, CHANGE); // D2 - // attachInterrupt(dec2_PIN, decBackwardISR, CHANGE); // D3 + decSetup(0); + decSetup(1); + decSetup(2); + decSetup(3); + decSetup(4); + decSetup(5); + decSetup(6); + decSetup(7); + decSetup(8); + decSetup(9); + decSetup(10); + decSetup(11); + decSetup(12); + decSetup(13); } void loop() @@ -199,10 +218,25 @@ void loop() digitalToggle(LoopOut); Timer::tick(); - decForward.tick(); - decBackward.tick(); + IR_Decoder::tick(); - status(decForward); + bool rx_flag; + decStat(0); + decStat(1); + decStat(2); + decStat(3); + decStat(4); + decStat(5); + decStat(6); + decStat(7); + decStat(8); + decStat(9); + decStat(10); + decStat(11); + decStat(12); + decStat(13); + + // status(decForward); // status(decBackward); // Serial.println(micros() - loopTimer); @@ -230,12 +264,28 @@ void loop() } } } +Timer statusSimpleDelay; +bool statusSimple(IR_Decoder &dec) +{ + bool ret; + if (ret = dec.gotData.available()) + { + Serial.print("DEC: "); + Serial.print(dec.getId()); + Serial.print(" err: "); + Serial.print(dec.gotData.getErrorCount()); + Serial.print("\n"); + statusSimpleDelay.delay(100, millis, []() + { Serial.print("\n\n\n\n"); }); + } + return ret; +} void detectSignal() { - digitalWrite(SignalDetectLed, HIGH); - signalDetectTimer.delay(50, millis, []() - { digitalWrite(SignalDetectLed, LOW); }); + // digitalWrite(SignalDetectLed, HIGH); + // signalDetectTimer.delay(50, millis, []() + // { digitalWrite(SignalDetectLed, LOW); }); } // test diff --git a/IR_Decoder.cpp b/IR_Decoder.cpp new file mode 100644 index 0000000..eb829a4 --- /dev/null +++ b/IR_Decoder.cpp @@ -0,0 +1,72 @@ +#include "IR_Decoder.h" + +std::list& IR_Decoder::get_dec_list() // определение функции +{ + static std::list dec_list; // статическая локальная переменная + return dec_list; // возвращается ссылка на переменную +} + +IR_Decoder::IR_Decoder(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair) + : IR_DecoderRaw(isrPin, addr, encPair) +{ + get_dec_list().push_back(this); +}; + +IR_Decoder::~IR_Decoder() +{ + IR_Decoder::get_dec_list().remove(this); +} + +void IR_Decoder::tick() +{ + for (const auto &element : IR_Decoder::get_dec_list()) + { + element->_tick(); + } +} + +void IR_Decoder::_tick() +{ + IR_DecoderRaw::tick(); + if (availableRaw()) + { +#ifdef IRDEBUG_INFO + Serial.println("PARSING RAW DATA"); +#endif + isWaitingAcceptSend = false; + switch (packInfo.buffer[0] >> 5 & IR_MASK_MSG_TYPE) + { + case IR_MSG_DATA_ACCEPT: + case IR_MSG_DATA_NOACCEPT: + gotData.set(&packInfo, id); + break; + case IR_MSG_BACK: + 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; + } + if (gotData.isAvailable && (gotData.getMsgType() == IR_MSG_DATA_ACCEPT)) + { + acceptSendTimer = millis(); + addrAcceptSendTo = gotData.getAddrFrom(); + acceptCustomByte = crc8(gotData.getDataPrt(), 0, gotData.getDataSize(), poly1); + if (addrAcceptSendTo && addrAcceptSendTo < IR_Broadcast) + isWaitingAcceptSend = true; + } + gotRaw.set(&packInfo, id); + } + if (isWaitingAcceptSend && millis() - acceptSendTimer > 75) + { + encoder->sendAccept(addrAcceptSendTo, acceptCustomByte); + isWaitingAcceptSend = false; + } +} \ No newline at end of file diff --git a/IR_Decoder.h b/IR_Decoder.h index d7555ea..49004d6 100644 --- a/IR_Decoder.h +++ b/IR_Decoder.h @@ -5,6 +5,11 @@ class IR_Decoder : public IR_DecoderRaw { +private: + // static std::list dec_list; + static std::list& get_dec_list(); + void _tick(); + uint32_t acceptSendTimer; bool isWaitingAcceptSend; uint16_t addrAcceptSendTo; @@ -19,59 +24,16 @@ public: PacketTypes::Request gotRequest; PacketTypes::BasePack gotRaw; - IR_Decoder(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair = nullptr) : IR_DecoderRaw(isrPin, addr, encPair) {} + IR_Decoder(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair = nullptr); + ~IR_Decoder(); - void tick() - { - IR_DecoderRaw::tick(); - if (availableRaw()) - { -#ifdef IRDEBUG_INFO - Serial.println("PARSING RAW DATA"); -#endif - isWaitingAcceptSend = false; - switch (packInfo.buffer[0] >> 5 & IR_MASK_MSG_TYPE) - { - case IR_MSG_DATA_ACCEPT: - case IR_MSG_DATA_NOACCEPT: - gotData.set(&packInfo, id); - break; - case IR_MSG_BACK: - 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; + static void tick(); - default: - break; - } - if (gotData.isAvailable && (gotData.getMsgType() == IR_MSG_DATA_ACCEPT)) - { - acceptSendTimer = millis(); - addrAcceptSendTo = gotData.getAddrFrom(); - acceptCustomByte = crc8(gotData.getDataPrt(), 0, gotData.getDataSize(), poly1); - if (addrAcceptSendTo && addrAcceptSendTo < IR_Broadcast) - isWaitingAcceptSend = true; - } - gotRaw.set(&packInfo, id); - } - if (isWaitingAcceptSend && millis() - acceptSendTimer > 75) - { - encoder->sendAccept(addrAcceptSendTo, acceptCustomByte); - isWaitingAcceptSend = false; - } - } - - void setAcceptDelay(uint16_t acceptDelay) + inline void setAcceptDelay(uint16_t acceptDelay) { this->acceptDelay = acceptDelay; } - uint16_t getAcceptDelay() + inline uint16_t getAcceptDelay() { return this->acceptDelay; } diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index 2f2e581..96d6b29 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -20,6 +20,27 @@ IR_DecoderRaw::IR_DecoderRaw(const uint8_t isrPin, uint16_t addr, IR_Encoder *en #endif } +bool IR_DecoderRaw::isSubOverflow() +{ + noInterrupts(); + volatile bool ret = isSubBufferOverflow; + interrupts(); + return ret; +} + +bool IR_DecoderRaw::availableRaw() + { + if (isAvailable) + { + isAvailable = false; + return true; + } + else + { + return false; + } + }; + //////////////////////////////////// isr /////////////////////////////////////////// volatile uint32_t time_; @@ -55,7 +76,6 @@ void IR_DecoderRaw::isr() //////////////////////////////////////////////////////////////////////////////////// -uint32_t wrCounter; void IR_DecoderRaw::firstRX() { @@ -77,9 +97,9 @@ void IR_DecoderRaw::firstRX() isPreamb = true; riseSyncTime = bitTime /* 1100 */; - +#ifdef IRDEBUG wrCounter = 0; - +#endif memset(dataBuffer, 0x00, dataByteSizeMax); } @@ -92,6 +112,7 @@ void IR_DecoderRaw::listenStart() firstRX(); } } + void IR_DecoderRaw::tick() { FrontStorage currentFront; @@ -539,31 +560,31 @@ void IR_DecoderRaw::writeToBuffer(bool bit) isAvailable = crcCheck(packSize - crcBytes, crcValue); #ifdef BRUTEFORCE_CHECK - if (!isAvailable) // Исправление первого бита // Очень большая затычка... - for (size_t i = 0; i < min(uint16_t(packSize - crcBytes*2U), uint16_t(dataByteSizeMax)); ++i) + if (!isAvailable) // Исправление первого бита // Очень большая затычка... + for (size_t i = 0; i < min(uint16_t(packSize - crcBytes * 2U), uint16_t(dataByteSizeMax)); ++i) + { + for (int j = 0; j < 8; ++j) { - for (int j = 0; j < 8; ++j) + // инвертируем бит + dataBuffer[i] ^= 1 << j; + + isAvailable = crcCheck(min(uint16_t(packSize - crcBytes), uint16_t(dataByteSizeMax - 1U)), crcValue); + // обратно инвертируем бит в исходное состояние + + if (isAvailable) + { +#ifdef IRDEBUG_INFO + Serial.println("!!!INV!!!"); +#endif + goto OUT_BRUTEFORCE; + } + else { - // инвертируем бит dataBuffer[i] ^= 1 << j; - - isAvailable = crcCheck(min(uint16_t(packSize - crcBytes), uint16_t(dataByteSizeMax - 1U)), crcValue); - // обратно инвертируем бит в исходное состояние - - if (isAvailable) - { - #ifdef IRDEBUG_INFO - Serial.println("!!!INV!!!"); - #endif - goto OUT_BRUTEFORCE; - } - else - { - dataBuffer[i] ^= 1 << j; - } } } - OUT_BRUTEFORCE:; + } + OUT_BRUTEFORCE:; #endif } } diff --git a/IR_DecoderRaw.h b/IR_DecoderRaw.h index de56567..2d2201d 100644 --- a/IR_DecoderRaw.h +++ b/IR_DecoderRaw.h @@ -34,18 +34,7 @@ class IR_DecoderRaw : virtual public IR_FOX protected: PackInfo packInfo; IR_Encoder *encoder; // Указатель на парный передатчик - bool availableRaw() - { - if (isAvailable) - { - isAvailable = false; - return true; - } - else - { - return false; - } - }; + bool availableRaw(); public: const uint8_t isrPin; // Пин прерывания @@ -59,18 +48,10 @@ public: void isr(); // Функция прерывания void tick(); // Обработка приёмника, необходима для работы - void tickOld(); - bool isOverflow() { return isBufferOverflow; }; // Буффер переполнился - bool isSubOverflow() - { - - // noInterrupts(); - volatile bool ret = isSubBufferOverflow; - // interrupts(); - return ret; - }; - bool isReciving() { return isBufferOverflow; }; // Возвращает true, если происходит приём пакета + inline bool isOverflow() { return isBufferOverflow; }; // Буффер переполнился + bool isSubOverflow(); + inline bool isReciving() { return isBufferOverflow; }; // Возвращает true, если происходит приём пакета ////////////////////////////////////////////////////////////////////////// private: @@ -150,7 +131,8 @@ private: /// @return Результат uint16_t ceil_div(uint16_t val, uint16_t divider); -#if true //def IRDEBUG +#ifdef IRDEBUG + uint32_t wrCounter; inline void errPulse(uint8_t pin, uint8_t count); inline void infoPulse(uint8_t pin, uint8_t count); #endif diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index f97d05d..931c443 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -5,8 +5,15 @@ #define ISR_Out 10 #define TestOut 13 -IR_Encoder::IR_Encoder(uint16_t addr, IR_DecoderRaw *decPair) +std::list& IR_Encoder::get_enc_list() // определение функции { + static std::list dec_list; // статическая локальная переменная + return dec_list; // возвращается ссылка на переменную +} + +IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair) +{ + this->pin = pin; id = addr; this->decPair = decPair; signal = noSignal; @@ -23,7 +30,10 @@ IR_Encoder::IR_Encoder(uint16_t addr, IR_DecoderRaw *decPair) { decPair->encoder = this; } + pinMode(pin,OUTPUT); + get_enc_list().push_back(this); }; + void IR_Encoder::setBlindDecoders(IR_DecoderRaw *decoders[], uint8_t count) { #if disablePairDec @@ -38,6 +48,7 @@ IR_Encoder::~IR_Encoder() { delete[] bitLow; delete[] bitHigh; + get_enc_list().remove(this); }; void IR_Encoder::sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept) @@ -141,6 +152,7 @@ void IR_Encoder::sendBack(uint8_t data) { _sendBack(false, 0, &data, 1); } + void IR_Encoder::sendBack(uint8_t *data , uint8_t len) { _sendBack(false, 0, data, len); @@ -230,12 +242,21 @@ void IR_Encoder::rawSend(uint8_t *ptr, uint8_t len) // interrupts(); } -void IR_Encoder::isr() +void IR_Encoder::isr(){ + // Serial.println(get_enc_list().size()); + for(const auto &element : get_enc_list()){ + element->_isr(); + } +} + +void IR_Encoder::_isr() { if (!isSending) return; ir_out_virtual = !ir_out_virtual && state; + digitalWrite(pin, ir_out_virtual); + if (toggleCounter) { @@ -369,34 +390,6 @@ void IR_Encoder::addSync(bool *prev, bool *next) } } -void IR_Encoder::send_HIGH(bool prevBite) -{ - - // if (/* prevBite */1) { - // meanderBlock(bitPauseTakts * 2, halfPeriod, LOW); - // meanderBlock(bitActiveTakts, halfPeriod, HIGH); - // } else { // более короткий HIGH после нуля - // meanderBlock(bitTakts - (bitActiveTakts - bitPauseTakts), halfPeriod, LOW); - // meanderBlock(bitActiveTakts - bitPauseTakts, halfPeriod, HIGH); - // } -} - -void IR_Encoder::send_LOW() -{ - // meanderBlock(bitPauseTakts, halfPeriod, LOW); - // meanderBlock(bitActiveTakts, halfPeriod, LOW); - // meanderBlock(bitPauseTakts, halfPeriod, HIGH); -} - -void IR_Encoder::send_EMPTY(uint8_t count) -{ - // for (size_t i = 0; i < count * 2; i++) { - // meanderBlock((bitPauseTakts * 2 + bitActiveTakts), halfPeriod, prevPreambBit); - // prevPreambBit = !prevPreambBit; - // } - // meanderBlock(bitPauseTakts * 2 + bitActiveTakts, halfPeriod, 0); //TODO: Отодвинуть преамбулу -} - uint8_t* IR_Encoder::bitHigh = new uint8_t[2]{ (bitPauseTakts) * 2 - 1, (bitActiveTakts) * 2 - 1}; diff --git a/IR_Encoder.h b/IR_Encoder.h index 434cf75..c5ace21 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -11,40 +11,14 @@ class IR_Encoder : IR_FOX public: private: uint16_t id; /// @brief Адрес передатчика - + uint8_t pin; public: /// @brief Класс передатчика /// @param addr Адрес передатчика /// @param pin Вывод передатчика - /// @param tune Подстройка несущей частоты /// @param decPair Приёмник, для которого отключается приём в момент передачи передатчиком - IR_Encoder(uint16_t addr, IR_DecoderRaw *decPair = nullptr); - - // static void timerSetup() - // { - // // // TIMER2 Ini - // // uint8_t oldSREG = SREG; // Save global interupts settings - // // cli(); - // // // DDRB |= (1 << PORTB3); //OC2A (17) - // // TCCR2A = 0; - // // TCCR2B = 0; - - // // // TCCR2A |= (1 << COM2A0); //Переключение состояния - - // // TCCR2A |= (1 << WGM21); // Clear Timer On Compare (Сброс по совпадению) - // // TCCR2B |= (1 << CS20); // Предделитель 1 - // // TIMSK2 |= (1 << OCIE2A); // Прерывание по совпадению - - // // OCR2A = /* 465 */ ((F_CPU / (38000 * 2)) - 2); // 38кГц - - // // SREG = oldSREG; // Return interrupt settings - - - // } - // static void timerOFFSetup() - // { - // TIMSK2 &= ~(1 << OCIE2A); // Прерывание по совпадению выкл - // } + IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair = nullptr); + static void isr(); void setBlindDecoders(IR_DecoderRaw *decoders[], uint8_t count); void rawSend(uint8_t *ptr, uint8_t len); @@ -59,13 +33,14 @@ public: void sendBack(uint8_t *data = nullptr, uint8_t len = 0); void sendBackTo(uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0); - void isr(); ~IR_Encoder(); volatile bool ir_out_virtual; private: + static std::list& get_enc_list(); void _sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len); + void _isr(); void setDecoder_isSending(); void sendByte(uint8_t byte, bool *prev, bool LOW_FIRST); diff --git a/IR_config.cpp b/IR_config.cpp new file mode 100644 index 0000000..518261d --- /dev/null +++ b/IR_config.cpp @@ -0,0 +1,27 @@ +#include "IR_config.h" + +void IR_FOX::checkAddressRuleApply(uint16_t address, uint16_t id, bool &flag) +{ + flag = false; + flag |= id == 0; + flag |= address == id; + flag |= address >= IR_Broadcast; +} + +uint8_t IR_FOX::crc8(uint8_t *data, uint8_t start, uint8_t end, uint8_t poly) +{ // TODO: сделать возможность межбайтовой проверки + uint8_t crc = 0xff; + size_t i, j; + for (i = start; i < end; i++) + { + crc ^= data[i]; + for (j = 0; j < 8; j++) + { + if ((crc & 0x80) != 0) + crc = (uint8_t)((crc << 1) ^ poly); + else + crc <<= 1; + } + } + return crc; +}; diff --git a/IR_config.h b/IR_config.h index 0edbf51..62882fc 100644 --- a/IR_config.h +++ b/IR_config.h @@ -1,7 +1,7 @@ #pragma once #include - -#define IRDEBUG_INFO +#include +// #define IRDEBUG_INFO /*////////////////////////////////////////////////////////////////////////////////////// Для работы в паре положить декодер в энкодер @@ -140,8 +140,12 @@ typedef uint16_t crc_t; #define bitTakts (bitActiveTakts+bitPauseTakts) // Общая длительность бита в тактах #define bitTime (bitTakts*carrierPeriod) // Общая длительность бита #define tolerance 300U + + + class IR_FOX { public: + struct PackOffsets { uint8_t msgOffset; uint8_t addrFromOffset; @@ -172,32 +176,14 @@ public: uint16_t rTime = 0; }; - static void checkAddressRuleApply(uint16_t address, uint16_t id, bool& flag) { - flag = false; - flag |= id == 0; - flag |= address == id; - flag |= address >= IR_Broadcast; - } - uint16_t getId() { return id; } - void setId(uint16_t id) { this->id = id; } + inline uint16_t getId() { return id; } + inline void setId(uint16_t id) { this->id = id; } + static void checkAddressRuleApply(uint16_t address, uint16_t id, bool& flag); protected: - ErrorsStruct errors; uint16_t id; - uint8_t crc8(uint8_t* data, uint8_t start, uint8_t end, uint8_t poly) { //TODO: сделать возможность межбайтовой проверки - uint8_t crc = 0xff; - size_t i, j; - for (i = start; i < end; i++) { - crc ^= data[i]; - for (j = 0; j < 8; j++) { - if ((crc & 0x80) != 0) - crc = (uint8_t)((crc << 1) ^ poly); - else - crc <<= 1; - } - } - return crc; - } + ErrorsStruct errors; + uint8_t crc8(uint8_t* data, uint8_t start, uint8_t end, uint8_t poly); }; diff --git a/PacketTypes.cpp b/PacketTypes.cpp new file mode 100644 index 0000000..d1c9dc4 --- /dev/null +++ b/PacketTypes.cpp @@ -0,0 +1,107 @@ +#include "PacketTypes.h" + +namespace PacketTypes +{ + bool BasePack::checkAddress() { return true; }; + void BasePack::set(IR_FOX::PackInfo *packInfo, uint16_t id) + { + this->packInfo = packInfo; + this->id = id; + + if (checkAddress()) + { + isAvailable = true; + isRawAvailable = true; +#ifdef IRDEBUG_INFO + Serial.print(" OK "); +#endif + } + else + { + isRawAvailable = true; +#ifdef IRDEBUG_INFO + Serial.print(" NOT-OK "); +#endif + } + } + + uint16_t BasePack::_getAddrFrom(BasePack *obj) + { + return (obj->packInfo->buffer[obj->addressFromOffset] << 8) | obj->packInfo->buffer[obj->addressFromOffset + 1]; + }; + uint16_t BasePack::_getAddrTo(BasePack *obj) + { + return (obj->packInfo->buffer[obj->addressToOffset] << 8) | obj->packInfo->buffer[obj->addressToOffset + 1]; + }; + + uint8_t BasePack::_getDataSize(BasePack *obj) + { + return obj->packInfo->packSize - crcBytes - obj->DataOffset; + }; + uint8_t *BasePack::_getDataPrt(BasePack *obj) + { + return obj->packInfo->buffer + obj->DataOffset; + }; + uint8_t BasePack::_getDataRawSize(BasePack *obj) + { + return obj->packInfo->packSize; + }; + + bool BasePack::available() + { + if (isAvailable) + { + isAvailable = false; + isRawAvailable = false; + return true; + } + else + { + return false; + } + }; + bool BasePack::availableRaw() + { + if (isRawAvailable) + { + isRawAvailable = false; + return true; + } + else + { + return false; + } + }; + + bool Data::checkAddress() + { + bool ret; + IR_FOX::checkAddressRuleApply(getAddrTo(), this->id, ret); + return ret; + } + + bool DataBack::checkAddress() + { + 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; + } + + bool Accept::checkAddress() { return true; } + + bool Request::checkAddress() + { + bool ret; + IR_FOX::checkAddressRuleApply(getAddrTo(), this->id, ret); + return ret; + } +} \ No newline at end of file diff --git a/PacketTypes.h b/PacketTypes.h index 07d24fd..ea37677 100644 --- a/PacketTypes.h +++ b/PacketTypes.h @@ -21,86 +21,28 @@ namespace PacketTypes IR_FOX::PackInfo *packInfo; uint16_t id; - virtual bool checkAddress() { return true; }; - void set(IR_FOX::PackInfo *packInfo, uint16_t id) - { - this->packInfo = packInfo; - this->id = id; + virtual bool checkAddress(); + void set(IR_FOX::PackInfo *packInfo, uint16_t id); - if (checkAddress()) - { - isAvailable = true; - isRawAvailable = true; -#ifdef IRDEBUG_INFO - Serial.print(" OK "); -#endif - } - else - { - isRawAvailable = true; -#ifdef IRDEBUG_INFO - Serial.print(" NOT-OK "); -#endif - } - } - - 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 uint16_t _getAddrFrom(BasePack *obj); + static uint16_t _getAddrTo(BasePack *obj); + static uint8_t _getDataSize(BasePack *obj); + static uint8_t *_getDataPrt(BasePack *obj); + static uint8_t _getDataRawSize(BasePack *obj); 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; }; - uint8_t *getDataRawPtr() { return packInfo->buffer; }; + bool available(); + bool availableRaw(); + + inline uint8_t getMsgInfo() { return packInfo->buffer[0] & IR_MASK_MSG_INFO; }; + inline uint8_t getMsgType() { return (packInfo->buffer[0] >> 5) & IR_MASK_MSG_TYPE; }; + inline uint8_t getMsgRAW() { return packInfo->buffer[0]; }; + inline uint16_t getErrorCount() { return packInfo->err.all(); }; + inline uint8_t getErrorLowSignal() { return packInfo->err.lowSignal; }; + inline uint8_t getErrorHighSignal() { return packInfo->err.highSignal; }; + inline uint8_t getErrorOther() { return packInfo->err.other; }; + inline uint16_t getTunerTime() { return packInfo->rTime; }; + inline uint8_t *getDataRawPtr() { return packInfo->buffer; }; }; class Data : public BasePack @@ -114,20 +56,15 @@ namespace PacketTypes DataOffset = 5; } - uint16_t getAddrFrom() { return _getAddrFrom(this); }; - uint16_t getAddrTo() { return _getAddrTo(this); }; + inline uint16_t getAddrFrom() { return _getAddrFrom(this); }; + inline uint16_t getAddrTo() { return _getAddrTo(this); }; - uint8_t getDataSize() { return _getDataSize(this); }; - uint8_t *getDataPrt() { return _getDataPrt(this); }; - uint8_t getDataRawSize() { return _getDataRawSize(this); }; + inline uint8_t getDataSize() { return _getDataSize(this); }; + inline uint8_t *getDataPrt() { return _getDataPrt(this); }; + inline uint8_t getDataRawSize() { return _getDataRawSize(this); }; private: - bool checkAddress() override - { - bool ret; - IR_FOX::checkAddressRuleApply(getAddrTo(), this->id, ret); - return ret; - } + bool checkAddress() override; }; class DataBack : public BasePack @@ -141,29 +78,15 @@ namespace PacketTypes DataOffset = 3; } - uint16_t getAddrFrom() { return _getAddrFrom(this); }; - uint16_t getAddrTo() { return _getAddrTo(this); }; + inline uint16_t getAddrFrom() { return _getAddrFrom(this); }; + inline uint16_t getAddrTo() { return _getAddrTo(this); }; - uint8_t getDataSize() { return _getDataSize(this); }; - uint8_t *getDataPrt() { return _getDataPrt(this); }; - uint8_t getDataRawSize() { return _getDataRawSize(this); }; + inline uint8_t getDataSize() { return _getDataSize(this); }; + inline uint8_t *getDataPrt() { return _getDataPrt(this); }; + inline uint8_t getDataRawSize() { return _getDataRawSize(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; - } + bool checkAddress() override; }; class Accept : public BasePack @@ -176,11 +99,11 @@ namespace PacketTypes DataOffset = 3; } - uint16_t getAddrFrom() { return _getAddrFrom(this); }; - uint8_t getCustomByte() { return packInfo->buffer[DataOffset]; }; + inline uint16_t getAddrFrom() { return _getAddrFrom(this); }; + inline uint8_t getCustomByte() { return packInfo->buffer[DataOffset]; }; private: - bool checkAddress() override { return true; } + bool checkAddress() override; }; class Request : public BasePack @@ -194,168 +117,11 @@ namespace PacketTypes DataOffset = 3; } - uint16_t getAddrFrom() { return _getAddrFrom(this); }; - uint16_t getAddrTo() { return _getAddrTo(this); }; + inline uint16_t getAddrFrom() { return _getAddrFrom(this); }; + inline uint16_t getAddrTo() { return _getAddrTo(this); }; private: - bool checkAddress() override - { - bool ret; - IR_FOX::checkAddressRuleApply(getAddrTo(), this->id, ret); - return ret; - } + bool checkAddress() override; }; } - -// 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: -// }; From 5a5142e0aaf8919a4f9bb3c1bc39988f94aeb4d6 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 23 Apr 2024 14:01:43 +0300 Subject: [PATCH 18/69] clean --- IR_DecoderRaw.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/IR_DecoderRaw.h b/IR_DecoderRaw.h index 2d2201d..ce1d5e3 100644 --- a/IR_DecoderRaw.h +++ b/IR_DecoderRaw.h @@ -14,8 +14,6 @@ #define up PA3 #define down PA2 #endif -#define up PA3 -#define down PA2 ///////////////////////////////////////////////////////////////////////////////////////////////// From e752d0fb50c4b29e57c95c86926bd973a1cb0649 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 23 Apr 2024 14:01:50 +0300 Subject: [PATCH 19/69] NVIC_SetPriority --- IR-protocol.ino | 1 + 1 file changed, 1 insertion(+) diff --git a/IR-protocol.ino b/IR-protocol.ino index 2a9556f..c7c019b 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -180,6 +180,7 @@ void setup() IR_Timer.setOverflow(carrierFrec * 2, HERTZ_FORMAT); IR_Timer.attachInterrupt(1, EncoderISR); + NVIC_SetPriority(IRQn_Type::TIM3_IRQn, 0); IR_Timer.resume(); Serial.begin(SERIAL_SPEED); From d46640b1458399f90540da9ee18328ef06ba7169 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 24 Apr 2024 10:34:57 +0300 Subject: [PATCH 20/69] refactor --- IR_Decoder.cpp | 4 +- IR_Decoder.h | 2 +- IR_DecoderRaw.cpp | 10 ++- IR_DecoderRaw.h | 6 +- IR_config.cpp | 6 ++ IR_config.h | 167 ++++++++++++++++++++++++---------------------- 6 files changed, 105 insertions(+), 90 deletions(-) diff --git a/IR_Decoder.cpp b/IR_Decoder.cpp index eb829a4..4f23b1f 100644 --- a/IR_Decoder.cpp +++ b/IR_Decoder.cpp @@ -6,8 +6,8 @@ std::list& IR_Decoder::get_dec_list() // определение ф return dec_list; // возвращается ссылка на переменную } -IR_Decoder::IR_Decoder(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair) - : IR_DecoderRaw(isrPin, addr, encPair) +IR_Decoder::IR_Decoder(const uint8_t pin, uint16_t addr, IR_Encoder *encPair) + : IR_DecoderRaw(pin, addr, encPair) { get_dec_list().push_back(this); }; diff --git a/IR_Decoder.h b/IR_Decoder.h index 49004d6..ba6b696 100644 --- a/IR_Decoder.h +++ b/IR_Decoder.h @@ -24,7 +24,7 @@ public: PacketTypes::Request gotRequest; PacketTypes::BasePack gotRaw; - IR_Decoder(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair = nullptr); + IR_Decoder(const uint8_t pin, uint16_t addr, IR_Encoder *encPair = nullptr); ~IR_Decoder(); static void tick(); diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index 96d6b29..997b54a 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -1,8 +1,9 @@ #include "IR_DecoderRaw.h" #include "IR_Encoder.h" -IR_DecoderRaw::IR_DecoderRaw(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair) : isrPin(isrPin), encoder(encPair) +IR_DecoderRaw::IR_DecoderRaw(const uint8_t pin, uint16_t addr, IR_Encoder *encPair) : encoder(encPair) { + setPin(pin); id = addr; prevRise = prevFall = prevPrevFall = prevPrevRise = 0; if (encPair != nullptr) @@ -46,6 +47,11 @@ volatile uint32_t time_; void IR_DecoderRaw::isr() { + + if(isPairSending){ + return; + } + noInterrupts(); // time_ = HAL_GetTick() * 1000 + ((SysTick->LOAD + 1 - SysTick->VAL) * 1000) / SysTick->LOAD + 1; time_ = micros(); @@ -68,7 +74,7 @@ void IR_DecoderRaw::isr() oldTime = time_; FrontStorage edge; - edge.dir = digitalRead(isrPin); + edge.dir = port->IDR & mask; edge.time = time_; subBuffer.push(edge); diff --git a/IR_DecoderRaw.h b/IR_DecoderRaw.h index ce1d5e3..7f3c696 100644 --- a/IR_DecoderRaw.h +++ b/IR_DecoderRaw.h @@ -35,14 +35,12 @@ protected: bool availableRaw(); public: - const uint8_t isrPin; // Пин прерывания - ////////////////////////////////////////////////////////////////////////// /// @brief Конструктор - /// @param isrPin Номер вывода прерывания/данных от приёмника (2 или 3 для atmega 328p) + /// @param pin Номер вывода прерывания/данных от приёмника (2 или 3 для atmega 328p) /// @param addr Адрес приёмника /// @param encPair Указатель на передатчик, работающий в паре - IR_DecoderRaw(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair = nullptr); + IR_DecoderRaw(const uint8_t pin, uint16_t addr, IR_Encoder *encPair = nullptr); void isr(); // Функция прерывания void tick(); // Обработка приёмника, необходима для работы diff --git a/IR_config.cpp b/IR_config.cpp index 518261d..9ddae25 100644 --- a/IR_config.cpp +++ b/IR_config.cpp @@ -1,5 +1,11 @@ #include "IR_config.h" +void IR_FOX::setPin(uint8_t pin){ + this->pin = pin; + port = digitalPinToPort(pin); + mask = digitalPinToBitMask(pin); +} + void IR_FOX::checkAddressRuleApply(uint16_t address, uint16_t id, bool &flag) { flag = false; diff --git a/IR_config.h b/IR_config.h index 62882fc..df654dd 100644 --- a/IR_config.h +++ b/IR_config.h @@ -6,8 +6,9 @@ Для работы в паре положить декодер в энкодер -*/// Адресация с 1 до 65 499 -#define IR_Broadcast 65000 // 65 500 ~ 65 535 - широковещательные пакеты (всем), возможно разделить на 35 типов +*/ +// Адресация с 1 до 65 499 +#define IR_Broadcast 65000 // 65 500 ~ 65 535 - широковещательные пакеты (всем), возможно разделить на 35 типов /* Адрес 0 запрещен и зарезервирован под NULL, либо тесты IR_MSG_ACCEPT с адреса 0 воспринимается всеми устройствами @@ -40,59 +41,59 @@ msg type:                                         // | xxx..... | = тип сообщения                                         // | ...xxxxx | = длина (максимум 31 бита)                                         //  ---------- */ -#define IR_MSG_BACK 0U // | 000...... | = Задний сигнал машинки -#define IR_MSG_ACCEPT 1U // | 001..... | = подтверждение -#define IR_MSG_REQUEST 2U // | 010..... | = запрос -#define IR_MSG_ 3U // | 011..... | = ?? -#define IR_MSG_BACK_TO 4U // | 100..... | = Задний сигнал машинки c адресацией -#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 ] [=== customByte ===] [ CRC Bytes ]      { msg type } [ addr_from uint16_t ] [ addr_to uint16_t ] [ CRC Bytes ] -{..........} [........................] [..................] [..............]      {..........} [........................] [........................] [..............] -                                                                                                                                                             -{ 001..... } [addr_from_H][addr_from_L] [=== customByte ===] [ crc1 ][ crc2 ]      { 010..... } [addr_from_H][addr_from_L] [addr_from_H][addr_from_L] [ crc1 ][ crc2 ] -|     0            1           2                  3              4       5          |     0            1           2              3           4           5       6     -\________________________________________________________________/       |          \_____________________________________________________________________/       |     -|                                                                        |          |                                                                             |     -\________________________________________________________________________/          \_____________________________________________________________________________/     - -customByte - контрольная сумма принятых данных по poly1 - - - -/`````````````````````` Задний сигнал машинки без адресации ``````````````````````\         -                                                                                            -{``````````} [````````````````````````] [````````````````````````] [``````````````]         -{ 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                         |       |      -\________________________________________________________________________________________________/       |      -|                                                                                                        |      -\________________________________________________________________________________________________________/      - -*/ +#define IR_MSG_BACK 0U // | 000...... | = Задний сигнал машинки +#define IR_MSG_ACCEPT 1U // | 001..... | = подтверждение +#define IR_MSG_REQUEST 2U // | 010..... | = запрос +#define IR_MSG_ 3U // | 011..... | = ?? +#define IR_MSG_BACK_TO 4U // | 100..... | = Задний сигнал машинки c адресацией +#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 ] [=== customByte ===] [ CRC Bytes ]      { msg type } [ addr_from uint16_t ] [ addr_to uint16_t ] [ CRC Bytes ] + {..........} [........................] [..................] [..............]      {..........} [........................] [........................] [..............] +                                                                                                                                                              + { 001..... } [addr_from_H][addr_from_L] [=== customByte ===] [ crc1 ][ crc2 ]      { 010..... } [addr_from_H][addr_from_L] [addr_from_H][addr_from_L] [ crc1 ][ crc2 ] + |     0            1           2                  3              4       5          |     0            1           2              3           4           5       6     + \________________________________________________________________/       |          \_____________________________________________________________________/       |     + |                                                                        |          |                                                                             |     + \________________________________________________________________________/          \_____________________________________________________________________________/     + + customByte - контрольная сумма принятых данных по poly1 + + + + /`````````````````````` Задний сигнал машинки без адресации ``````````````````````\         +                                                                                             + {``````````} [````````````````````````] [````````````````````````] [``````````````]         + { 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                         |       |      + \________________________________________________________________________________________________/       |      + |                                                                                                        |      + \________________________________________________________________________________________________________/      + + */ #define IR_MASK_MSG_TYPE 0b00000111 #define IR_MASK_MSG_INFO 0b00011111 @@ -101,14 +102,14 @@ customByte - контрольная сумма принятых данных п /////////////////////////////////////////////////////////////////////////////////////*/ typedef uint16_t crc_t; -#define BRUTEFORCE_CHECK // Перепроверяет пакет на 1 битные ошибки //TODO: зависает -#define bytePerPack 16 // колличество байтов в пакете +// #define BRUTEFORCE_CHECK // Перепроверяет пакет на 1 битные ошибки //TODO: зависает +#define bytePerPack 16 // колличество байтов в пакете #ifndef freeFrec #define freeFrec false #endif #ifndef subBufferSize -#define subBufferSize 5 //Буфер для складирования фронтов, пока их не обработают (передатчик) +#define subBufferSize 50 // Буфер для складирования фронтов, пока их не обработают (передатчик) #endif #define preambPulse 3 @@ -117,36 +118,35 @@ typedef uint16_t crc_t; ///////////////////////////////////////////////////////////////////////////////////// -#define bitPerByte 8U // Колличество бит в байте +#define bitPerByte 8U // Колличество бит в байте #define addrBytes 2 #define msgBytes 1 #define crcBytes 2 #define poly1 0x31 #define poly2 0x8C -#define syncBits 3U // количество битов синхронизации +#define syncBits 3U // количество битов синхронизации #define dataByteSizeMax (msgBytes + addrBytes + addrBytes + bytePerPack + crcBytes) -#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 bitPauseTakts 12U // длительность низкого уровня в тактах +#define bitActiveTakts 25U // длительность высокого уровня в тактах +#define bitPauseTakts 12U // длительность низкого уровня в тактах -#define bitTakts (bitActiveTakts+bitPauseTakts) // Общая длительность бита в тактах -#define bitTime (bitTakts*carrierPeriod) // Общая длительность бита +#define bitTakts (bitActiveTakts + bitPauseTakts) // Общая длительность бита в тактах +#define bitTime (bitTakts * carrierPeriod) // Общая длительность бита #define tolerance 300U - - -class IR_FOX { +class IR_FOX +{ public: - - struct PackOffsets { + struct PackOffsets + { uint8_t msgOffset; uint8_t addrFromOffset; uint8_t addrToOffset; @@ -154,36 +154,41 @@ public: uint8_t crcOffset; }; - struct ErrorsStruct { + struct ErrorsStruct + { uint8_t lowSignal = 0; uint8_t highSignal = 0; uint8_t other = 0; - void reset() { + void reset() + { lowSignal = 0; highSignal = 0; other = 0; } uint16_t all() { return lowSignal + highSignal + other; } - }; - struct PackInfo { - uint8_t* buffer = nullptr; + struct PackInfo + { + uint8_t *buffer = nullptr; uint8_t packSize = 0; uint16_t crc = 0; ErrorsStruct err; uint16_t rTime = 0; }; - inline uint16_t getId() { return id; } inline void setId(uint16_t id) { this->id = id; } - static void checkAddressRuleApply(uint16_t address, uint16_t id, bool& flag); + static void checkAddressRuleApply(uint16_t address, uint16_t id, bool &flag); + void setPin(uint8_t pin); + inline uint8_t getPin(){return pin;}; protected: uint16_t id; + uint8_t pin; + GPIO_TypeDef *port; + uint16_t mask; ErrorsStruct errors; - uint8_t crc8(uint8_t* data, uint8_t start, uint8_t end, uint8_t poly); - + uint8_t crc8(uint8_t *data, uint8_t start, uint8_t end, uint8_t poly); }; From 96f0ac623e942b53c494a43e3f9b6c69a854ef4d Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 24 Apr 2024 10:35:02 +0300 Subject: [PATCH 21/69] test --- IR-protocol.ino | 221 +++++++++++++++++++++++++++--------------------- 1 file changed, 126 insertions(+), 95 deletions(-) diff --git a/IR-protocol.ino b/IR-protocol.ino index c7c019b..3242940 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -4,9 +4,6 @@ #include "MemoryCheck.h" /////////////// Pinout /////////////// -#define encForward_PIN PA0 -#define encBackward_PIN PA1 - #define dec0_PIN PB0 #define dec1_PIN PB1 #define dec2_PIN PA2 @@ -44,16 +41,23 @@ #define SERIAL_SPEED 115200 //////////////// Var ///////////////// +// IR_Encoder encForward(PA5, 42 /* , &decBackward */); + +IR_Encoder enc0(PA5, 42 /* , &decBackward */); +IR_Encoder enc1(PA4, 127 /* , &decBackward */); +IR_Encoder enc2(PA3, 137 /* , &decBackward */); +IR_Encoder enc3(PA0, 777 /* , &decBackward */); +IR_Encoder enc10(PC15, 555 /* , &decBackward */); +// IR_Encoder enc11(PC14, 127 /* , &decBackward */); +// IR_Encoder enc12(PC13, 137 /* , &decBackward */); +// IR_Encoder enc13(PA12, 777 /* , &decBackward */); -IR_Encoder encForward(PA5, 42 /* , &decBackward */); -// IR_Encoder encBackward(321, encBackward_PIN); // IR_Encoder encTree(325, A2); //////////////////////// Функции прерываний //////////////////////// void EncoderISR() { - // Serial.println("EncoderISR"); IR_Encoder::isr(); } @@ -86,84 +90,94 @@ uint8_t sig = 0; uint16_t targetAddr = IR_Broadcast; Timer t1(500, millis, []() { + // Serial.println( digitalPinToBitMask(enc0.getPin()), BIN); + enc0.sendData(IR_Broadcast, data4, sizeof(data4)); + enc1.sendData(IR_Broadcast, data3, sizeof(data3)); + enc2.sendData(IR_Broadcast, data2, sizeof(data2)); + enc3.sendData(IR_Broadcast, data1, sizeof(data1)); + enc10.sendData(IR_Broadcast, data4, sizeof(data4)); + // enc11.sendData(IR_Broadcast, data3, sizeof(data3)); + // enc12.sendData(IR_Broadcast, data2, sizeof(data2)); + // enc13.sendData(IR_Broadcast, data1, sizeof(data1)); + // Serial.println(sig); - switch (sig) - { - case 0: - encForward.sendData(targetAddr); - break; - case 1: - encForward.sendData(targetAddr, data1, sizeof(data1)); - break; - case 2: - encForward.sendData(targetAddr, data2, sizeof(data2)); - break; - case 3: - encForward.sendData(targetAddr, data3, sizeof(data3)); - break; - case 4: - encForward.sendData(targetAddr, data4, sizeof(data4)); - break; + // switch (sig) + // { + // case 0: + // encForward.sendData(targetAddr); + // break; + // case 1: + // encForward.sendData(targetAddr, data1, sizeof(data1)); + // break; + // case 2: + // encForward.sendData(targetAddr, data2, sizeof(data2)); + // break; + // case 3: + // encForward.sendData(targetAddr, data3, sizeof(data3)); + // break; + // case 4: + // encForward.sendData(targetAddr, data4, sizeof(data4)); + // break; - case 10: - encForward.sendData(targetAddr, data0, sizeof(data0), true); - break; - case 11: - encForward.sendData(targetAddr, data1, sizeof(data1), true); - break; - case 12: - encForward.sendData(targetAddr, data2, sizeof(data2), true); - break; - case 13: - encForward.sendData(targetAddr, data3, sizeof(data3), true); - break; - case 14: - encForward.sendData(targetAddr, data4, sizeof(data4), true); - break; + // case 10: + // encForward.sendData(targetAddr, data0, sizeof(data0), true); + // break; + // case 11: + // encForward.sendData(targetAddr, data1, sizeof(data1), true); + // break; + // case 12: + // encForward.sendData(targetAddr, data2, sizeof(data2), true); + // break; + // case 13: + // encForward.sendData(targetAddr, data3, sizeof(data3), true); + // break; + // case 14: + // encForward.sendData(targetAddr, data4, sizeof(data4), true); + // break; - case 20: - encForward.sendBack(); - break; - case 21: - encForward.sendBack(data1, sizeof(data1)); - break; - case 22: - encForward.sendBack(data2, sizeof(data2)); - break; - case 23: - encForward.sendBack(data3, sizeof(data3)); - break; - case 24: - encForward.sendBack(data4, sizeof(data4)); - break; + // case 20: + // encForward.sendBack(); + // break; + // case 21: + // encForward.sendBack(data1, sizeof(data1)); + // break; + // case 22: + // encForward.sendBack(data2, sizeof(data2)); + // break; + // case 23: + // encForward.sendBack(data3, sizeof(data3)); + // break; + // case 24: + // encForward.sendBack(data4, sizeof(data4)); + // break; - case 30: - encForward.sendBackTo(targetAddr); - break; - case 31: - encForward.sendBackTo(targetAddr, data1, sizeof(data1)); - break; - case 32: - encForward.sendBackTo(targetAddr, data2, sizeof(data2)); - break; - case 33: - encForward.sendBackTo(targetAddr, data3, sizeof(data3)); - break; - case 34: - encForward.sendBackTo(targetAddr, data4, sizeof(data4)); - break; + // case 30: + // encForward.sendBackTo(targetAddr); + // break; + // case 31: + // encForward.sendBackTo(targetAddr, data1, sizeof(data1)); + // break; + // case 32: + // encForward.sendBackTo(targetAddr, data2, sizeof(data2)); + // break; + // case 33: + // encForward.sendBackTo(targetAddr, data3, sizeof(data3)); + // break; + // case 34: + // encForward.sendBackTo(targetAddr, data4, sizeof(data4)); + // break; - case 41: - encForward.sendRequest(targetAddr); - break; - case 42: - encForward.sendAccept(targetAddr); - break; + // case 41: + // encForward.sendRequest(targetAddr); + // break; + // case 42: + // encForward.sendAccept(targetAddr); + // break; - default: - break; - } + // default: + // break; + // } // encBackward.sendData(IR_Broadcast, data2); // encTree.sendData(IR_Broadcast, rawData3); }); @@ -192,23 +206,40 @@ void setup() pinMode(dec1_PIN, INPUT_PULLUP); // pinMode(dec2_PIN, INPUT_PULLUP); - pinMode(encForward_PIN, OUTPUT); - pinMode(encBackward_PIN, OUTPUT); + static IR_DecoderRaw *blind[]{ + &dec0, + &dec1, + &dec2, + &dec3, + &dec4, + &dec5, + &dec6, + &dec7, + &dec8, + &dec9, + &dec10, + &dec11, + &dec12, + &dec13, + }; - // IR_DecoderRaw* blindFromForward [] { &decForward, &decBackward }; - // encForward.setBlindDecoders(blindFromForward, sizeof(blindFromForward) / sizeof(IR_DecoderRaw*)); + enc0.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); + enc1.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); + enc2.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); + enc3.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); + enc10.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); decSetup(0); - decSetup(1); - decSetup(2); - decSetup(3); - decSetup(4); - decSetup(5); - decSetup(6); - decSetup(7); - decSetup(8); - decSetup(9); - decSetup(10); + // decSetup(1); + // decSetup(2); + // decSetup(3); + // decSetup(4); + // decSetup(5); + // decSetup(6); + // decSetup(7); + // decSetup(8); + // decSetup(9); + // decSetup(10); decSetup(11); decSetup(12); decSetup(13); @@ -300,7 +331,7 @@ void status(IR_Decoder &dec) if (/* dec.gotData.getDataPrt()[1] */ 1) { str += ("Data on pin "); - str += (dec.isrPin); + str += (dec.getPin()); str += "\n"; uint8_t msg = dec.gotData.getMsgRAW(); @@ -374,7 +405,7 @@ void status(IR_Decoder &dec) if (/* dec.gotData.getDataPrt()[1] */ 1) { str += ("BackData on pin "); - str += (dec.isrPin); + str += (dec.getPin()); str += "\n"; uint8_t msg = dec.gotBackData.getMsgRAW(); @@ -446,7 +477,7 @@ void status(IR_Decoder &dec) if (/* dec.gotData.getDataPrt()[1] */ 1) { str += ("Accept on pin "); - str += (dec.isrPin); + str += (dec.getPin()); str += "\n"; uint8_t msg = dec.gotAccept.getMsgRAW(); @@ -498,7 +529,7 @@ void status(IR_Decoder &dec) if (/* dec.gotData.getDataPrt()[1] */ 1) { str += ("Request on pin "); - str += (dec.isrPin); + str += (dec.getPin()); str += "\n"; uint8_t msg = dec.gotRequest.getMsgRAW(); From 373cd43b73f4d43129e45b9e3f949eda2540d80f Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 24 Apr 2024 10:35:55 +0300 Subject: [PATCH 22/69] opti --- IR_Encoder.cpp | 6 ++++-- IR_Encoder.h | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 931c443..9e1a2e7 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -13,7 +13,7 @@ std::list& IR_Encoder::get_enc_list() // определение ф IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair) { - this->pin = pin; + setPin(pin); id = addr; this->decPair = decPair; signal = noSignal; @@ -255,7 +255,9 @@ void IR_Encoder::_isr() return; ir_out_virtual = !ir_out_virtual && state; - digitalWrite(pin, ir_out_virtual); + + port->ODR &= ~(mask); + port->ODR |= mask & (ir_out_virtual ? (uint16_t)0xFFFF : (uint16_t)0x0000); if (toggleCounter) diff --git a/IR_Encoder.h b/IR_Encoder.h index c5ace21..16c1904 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -11,8 +11,8 @@ class IR_Encoder : IR_FOX public: private: uint16_t id; /// @brief Адрес передатчика - uint8_t pin; public: + /// @brief Класс передатчика /// @param addr Адрес передатчика /// @param pin Вывод передатчика From e37d4d79f1c908ef562da37999b487d2e2227145 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 24 Apr 2024 10:37:54 +0300 Subject: [PATCH 23/69] test --- IR-protocol.ino | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/IR-protocol.ino b/IR-protocol.ino index 3242940..b60281a 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -223,11 +223,11 @@ void setup() &dec13, }; - enc0.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); - enc1.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); - enc2.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); - enc3.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); - enc10.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); + // enc0.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); + // enc1.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); + // enc2.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); + // enc3.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); + // enc10.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); decSetup(0); // decSetup(1); From 2147bf0788dc0e518f435316c401ddd6270d1183 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 23 May 2024 14:39:47 +0300 Subject: [PATCH 24/69] upd --- IR_config.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/IR_config.cpp b/IR_config.cpp index 9ddae25..7acf1bc 100644 --- a/IR_config.cpp +++ b/IR_config.cpp @@ -4,6 +4,7 @@ void IR_FOX::setPin(uint8_t pin){ this->pin = pin; port = digitalPinToPort(pin); mask = digitalPinToBitMask(pin); + pinMode(pin, INPUT_PULLUP); } void IR_FOX::checkAddressRuleApply(uint16_t address, uint16_t id, bool &flag) From a958c1d3b2e3e9bba0428c676f58b22a2bf63404 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Mon, 27 May 2024 11:02:45 +0300 Subject: [PATCH 25/69] pin --- IR-protocol.ino | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/IR-protocol.ino b/IR-protocol.ino index b60281a..c305f44 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -43,11 +43,11 @@ //////////////// Var ///////////////// // IR_Encoder encForward(PA5, 42 /* , &decBackward */); -IR_Encoder enc0(PA5, 42 /* , &decBackward */); -IR_Encoder enc1(PA4, 127 /* , &decBackward */); -IR_Encoder enc2(PA3, 137 /* , &decBackward */); -IR_Encoder enc3(PA0, 777 /* , &decBackward */); -IR_Encoder enc10(PC15, 555 /* , &decBackward */); +IR_Encoder enc0(PA0, 42 /* , &decBackward */); +IR_Encoder enc1(PA1, 127 /* , &decBackward */); +IR_Encoder enc2(PA2, 137 /* , &decBackward */); +IR_Encoder enc3(PA3, 777 /* , &decBackward */); +// IR_Encoder enc10(PA4, 555 /* , &decBackward */); // IR_Encoder enc11(PC14, 127 /* , &decBackward */); // IR_Encoder enc12(PC13, 137 /* , &decBackward */); // IR_Encoder enc13(PA12, 777 /* , &decBackward */); @@ -95,7 +95,7 @@ Timer t1(500, millis, []() enc1.sendData(IR_Broadcast, data3, sizeof(data3)); enc2.sendData(IR_Broadcast, data2, sizeof(data2)); enc3.sendData(IR_Broadcast, data1, sizeof(data1)); - enc10.sendData(IR_Broadcast, data4, sizeof(data4)); + // enc10.sendData(IR_Broadcast, data4, sizeof(data4)); // enc11.sendData(IR_Broadcast, data3, sizeof(data3)); // enc12.sendData(IR_Broadcast, data2, sizeof(data2)); // enc13.sendData(IR_Broadcast, data1, sizeof(data1)); From 3057e78aebf1680321f0a4f8ee3be5ddefc26c12 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Mon, 27 May 2024 11:11:52 +0300 Subject: [PATCH 26/69] pin --- IR-protocol.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IR-protocol.ino b/IR-protocol.ino index c305f44..ad8d3f1 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -21,7 +21,7 @@ #define dec14_PIN PB14 #define dec15_PIN PB15 -#define LoopOut PA7 +#define LoopOut PC13 #define dec_ISR(n) \ void dec_##n##_ISR() { dec##n.isr(); } From c66d47e464f48b87dc75391c6fff7425bad2c6d7 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Mon, 8 Jul 2024 17:14:49 +0300 Subject: [PATCH 27/69] info --- IR_Encoder.cpp | 9 ++++++++- IR_config.h | 5 +++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 9e1a2e7..14a1087 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -397,4 +397,11 @@ uint8_t* IR_Encoder::bitHigh = new uint8_t[2]{ (bitActiveTakts) * 2 - 1}; uint8_t* IR_Encoder::bitLow = new uint8_t[2]{ (bitPauseTakts/2 + bitActiveTakts) * 2 - 1, - (bitPauseTakts) - 1}; \ No newline at end of file + (bitPauseTakts) - 1}; + +// uint8_t* IR_Encoder::bitHigh = new uint8_t[2]{ +// (bitPauseTakts) * 2 - 0, +// (bitActiveTakts) * 2 - 0}; +// uint8_t* IR_Encoder::bitLow = new uint8_t[2]{ +// (bitPauseTakts/2 + bitActiveTakts) * 2 - 0, +// (bitPauseTakts) - 0}; \ No newline at end of file diff --git a/IR_config.h b/IR_config.h index df654dd..8067be8 100644 --- a/IR_config.h +++ b/IR_config.h @@ -142,6 +142,11 @@ typedef uint16_t crc_t; #define bitTime (bitTakts * carrierPeriod) // Общая длительность бита #define tolerance 300U + constexpr uint16_t test_all_Time = bitTime; + constexpr uint16_t test_all_Takts = bitTakts*2; + constexpr uint16_t test_hi = ((bitPauseTakts) * 2 - 0 ) + ((bitActiveTakts) * 2 - 0); + constexpr uint16_t test_low = ((bitPauseTakts/2 + bitActiveTakts) * 2 - 0)+((bitPauseTakts) - 0); + class IR_FOX { public: From 784365181e99fae134a8b665b7fc25b09552f703 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 28 Aug 2024 18:00:18 +0300 Subject: [PATCH 28/69] default constructor and operator() for test --- IR_Decoder.cpp | 3 +++ IR_Decoder.h | 4 ++++ IR_DecoderRaw.cpp | 1 + IR_DecoderRaw.h | 1 + IR_Encoder.cpp | 8 ++++---- IR_Encoder.h | 6 +++--- 6 files changed, 16 insertions(+), 7 deletions(-) diff --git a/IR_Decoder.cpp b/IR_Decoder.cpp index 4f23b1f..0bb2711 100644 --- a/IR_Decoder.cpp +++ b/IR_Decoder.cpp @@ -6,12 +6,15 @@ std::list& IR_Decoder::get_dec_list() // определение ф return dec_list; // возвращается ссылка на переменную } +IR_Decoder::IR_Decoder(){}; IR_Decoder::IR_Decoder(const uint8_t pin, uint16_t addr, IR_Encoder *encPair) : IR_DecoderRaw(pin, addr, encPair) { get_dec_list().push_back(this); }; +void IR_Decoder::operator()() { isr(); } + IR_Decoder::~IR_Decoder() { IR_Decoder::get_dec_list().remove(this); diff --git a/IR_Decoder.h b/IR_Decoder.h index ba6b696..60c40cc 100644 --- a/IR_Decoder.h +++ b/IR_Decoder.h @@ -24,7 +24,11 @@ public: PacketTypes::Request gotRequest; PacketTypes::BasePack gotRaw; + IR_Decoder(); IR_Decoder(const uint8_t pin, uint16_t addr, IR_Encoder *encPair = nullptr); + + void operator()() ; + ~IR_Decoder(); static void tick(); diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index 997b54a..c38f964 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -1,6 +1,7 @@ #include "IR_DecoderRaw.h" #include "IR_Encoder.h" +IR_DecoderRaw::IR_DecoderRaw(){}; IR_DecoderRaw::IR_DecoderRaw(const uint8_t pin, uint16_t addr, IR_Encoder *encPair) : encoder(encPair) { setPin(pin); diff --git a/IR_DecoderRaw.h b/IR_DecoderRaw.h index 7f3c696..832df7f 100644 --- a/IR_DecoderRaw.h +++ b/IR_DecoderRaw.h @@ -36,6 +36,7 @@ protected: public: ////////////////////////////////////////////////////////////////////////// + IR_DecoderRaw(); /// @brief Конструктор /// @param pin Номер вывода прерывания/данных от приёмника (2 или 3 для atmega 328p) /// @param addr Адрес приёмника diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 14a1087..8464a46 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -11,6 +11,8 @@ std::list& IR_Encoder::get_enc_list() // определение ф return dec_list; // возвращается ссылка на переменную } +IR_Encoder::IR_Encoder(){}; + IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair) { setPin(pin); @@ -46,8 +48,6 @@ void IR_Encoder::setBlindDecoders(IR_DecoderRaw *decoders[], uint8_t count) IR_Encoder::~IR_Encoder() { - delete[] bitLow; - delete[] bitHigh; get_enc_list().remove(this); }; @@ -392,10 +392,10 @@ void IR_Encoder::addSync(bool *prev, bool *next) } } -uint8_t* IR_Encoder::bitHigh = new uint8_t[2]{ +uint8_t IR_Encoder::bitHigh[2] = { (bitPauseTakts) * 2 - 1, (bitActiveTakts) * 2 - 1}; -uint8_t* IR_Encoder::bitLow = new uint8_t[2]{ +uint8_t IR_Encoder::bitLow[2] = { (bitPauseTakts/2 + bitActiveTakts) * 2 - 1, (bitPauseTakts) - 1}; diff --git a/IR_Encoder.h b/IR_Encoder.h index 16c1904..f6a26c2 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -12,7 +12,7 @@ public: private: uint16_t id; /// @brief Адрес передатчика public: - + IR_Encoder(); /// @brief Класс передатчика /// @param addr Адрес передатчика /// @param pin Вывод передатчика @@ -82,8 +82,8 @@ private: uint8_t low; uint8_t high; }; - static uint8_t *bitHigh; - static uint8_t *bitLow; + static uint8_t bitHigh[2]; + static uint8_t bitLow[2]; uint8_t *currentBitSequence = bitLow; volatile SignalPart signal; }; From 2f4ac3ddf8001460c405f6fa93775f3a4c9cb642 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 29 Aug 2024 14:14:46 +0300 Subject: [PATCH 29/69] no default construct --- IR_Decoder.cpp | 13 ++-- IR_Decoder.h | 4 +- IR_DecoderRaw.cpp | 177 +++++++++++++++++++++++++++++++++++++++++++++- IR_DecoderRaw.h | 3 +- IR_Encoder.cpp | 3 +- IR_Encoder.h | 1 - 6 files changed, 188 insertions(+), 13 deletions(-) diff --git a/IR_Decoder.cpp b/IR_Decoder.cpp index 0bb2711..41afe3c 100644 --- a/IR_Decoder.cpp +++ b/IR_Decoder.cpp @@ -1,19 +1,22 @@ #include "IR_Decoder.h" -std::list& IR_Decoder::get_dec_list() // определение функции +std::list &IR_Decoder::get_dec_list() // определение функции { - static std::list dec_list; // статическая локальная переменная - return dec_list; // возвращается ссылка на переменную + static std::list dec_list; // статическая локальная переменная + return dec_list; // возвращается ссылка на переменную } -IR_Decoder::IR_Decoder(){}; +// IR_Decoder::IR_Decoder() {}; IR_Decoder::IR_Decoder(const uint8_t pin, uint16_t addr, IR_Encoder *encPair) : IR_DecoderRaw(pin, addr, encPair) { get_dec_list().push_back(this); }; -void IR_Decoder::operator()() { isr(); } +std::function IR_Decoder::operator()() +{ + return std::bind(&IR_Decoder::isr, this); +} IR_Decoder::~IR_Decoder() { diff --git a/IR_Decoder.h b/IR_Decoder.h index 60c40cc..bdd9df3 100644 --- a/IR_Decoder.h +++ b/IR_Decoder.h @@ -24,10 +24,10 @@ public: PacketTypes::Request gotRequest; PacketTypes::BasePack gotRaw; - IR_Decoder(); + // IR_Decoder(); IR_Decoder(const uint8_t pin, uint16_t addr, IR_Encoder *encPair = nullptr); - void operator()() ; + std::function operator()(); ~IR_Decoder(); diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index c38f964..c0ee268 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -1,7 +1,6 @@ #include "IR_DecoderRaw.h" #include "IR_Encoder.h" -IR_DecoderRaw::IR_DecoderRaw(){}; IR_DecoderRaw::IR_DecoderRaw(const uint8_t pin, uint16_t addr, IR_Encoder *encPair) : encoder(encPair) { setPin(pin); @@ -651,3 +650,179 @@ inline void IR_DecoderRaw::infoPulse(uint8_t pin, uint8_t count) } } #endif + +// Конструктор копирования + IR_DecoderRaw::IR_DecoderRaw(const IR_DecoderRaw& other) + : packInfo(other.packInfo), + encoder(other.encoder), // Если IR_Encoder имеет безопасный копируемый указатель + isAvailable(other.isAvailable), + packSize(other.packSize), + crcValue(other.crcValue), + isPairSending(other.isPairSending), + isRecive(other.isRecive), + isPreamb(other.isPreamb), + isSubBufferOverflow(other.isSubBufferOverflow), + isBufferOverflow(other.isBufferOverflow), + isWrongPack(other.isWrongPack), + riseSyncTime(other.riseSyncTime), + currentSubBufferIndex(other.currentSubBufferIndex), + subBuffer(other.subBuffer), // Копирование буфера + lastFront(other.lastFront), + firstUnHandledFront(other.firstUnHandledFront), + prevRise(other.prevRise), + prevPrevRise(other.prevPrevRise), + prevFall(other.prevFall), + prevPrevFall(other.prevPrevFall), + risePeriod(other.risePeriod), + highTime(other.highTime), + lowTime(other.lowTime), + oldTime(other.oldTime), + wrongCounter(other.wrongCounter), + highCount(other.highCount), + lowCount(other.lowCount), + allCount(other.allCount), + errorCounter(other.errorCounter), + preambFrontCounter(other.preambFrontCounter), + bufBitPos(other.bufBitPos), + isData(other.isData), + i_dataBuffer(other.i_dataBuffer), + nextControlBit(other.nextControlBit), + i_syncBit(other.i_syncBit), + err_syncBit(other.err_syncBit) + { + // Специфическое копирование, если нужно + } + + // Оператор копирующего присваивания + IR_DecoderRaw& IR_DecoderRaw::operator=(const IR_DecoderRaw& other) { + if (this != &other) { // Проверка на самоприсваивание + packInfo = other.packInfo; + encoder = other.encoder; + isAvailable = other.isAvailable; + packSize = other.packSize; + crcValue = other.crcValue; + isPairSending = other.isPairSending; + isRecive = other.isRecive; + isPreamb = other.isPreamb; + isSubBufferOverflow = other.isSubBufferOverflow; + isBufferOverflow = other.isBufferOverflow; + isWrongPack = other.isWrongPack; + riseSyncTime = other.riseSyncTime; + currentSubBufferIndex = other.currentSubBufferIndex; + subBuffer = other.subBuffer; + lastFront = other.lastFront; + firstUnHandledFront = other.firstUnHandledFront; + prevRise = other.prevRise; + prevPrevRise = other.prevPrevRise; + prevFall = other.prevFall; + prevPrevFall = other.prevPrevFall; + risePeriod = other.risePeriod; + highTime = other.highTime; + lowTime = other.lowTime; + oldTime = other.oldTime; + wrongCounter = other.wrongCounter; + highCount = other.highCount; + lowCount = other.lowCount; + allCount = other.allCount; + errorCounter = other.errorCounter; + preambFrontCounter = other.preambFrontCounter; + bufBitPos = other.bufBitPos; + isData = other.isData; + i_dataBuffer = other.i_dataBuffer; + nextControlBit = other.nextControlBit; + i_syncBit = other.i_syncBit; + err_syncBit = other.err_syncBit; + } + return *this; + } + + // Конструктор перемещения + IR_DecoderRaw::IR_DecoderRaw(IR_DecoderRaw&& other) + : packInfo(std::move(other.packInfo)), + encoder(other.encoder), + isAvailable(other.isAvailable), + packSize(other.packSize), + crcValue(other.crcValue), + isPairSending(other.isPairSending), + isRecive(other.isRecive), + isPreamb(other.isPreamb), + isSubBufferOverflow(other.isSubBufferOverflow), + isBufferOverflow(other.isBufferOverflow), + isWrongPack(other.isWrongPack), + riseSyncTime(other.riseSyncTime), + currentSubBufferIndex(other.currentSubBufferIndex), + subBuffer(std::move(other.subBuffer)), + lastFront(other.lastFront), + firstUnHandledFront(other.firstUnHandledFront), + prevRise(other.prevRise), + prevPrevRise(other.prevPrevRise), + prevFall(other.prevFall), + prevPrevFall(other.prevPrevFall), + risePeriod(other.risePeriod), + highTime(other.highTime), + lowTime(other.lowTime), + oldTime(other.oldTime), + wrongCounter(other.wrongCounter), + highCount(other.highCount), + lowCount(other.lowCount), + allCount(other.allCount), + errorCounter(other.errorCounter), + preambFrontCounter(other.preambFrontCounter), + bufBitPos(other.bufBitPos), + isData(other.isData), + i_dataBuffer(other.i_dataBuffer), + nextControlBit(other.nextControlBit), + i_syncBit(other.i_syncBit), + err_syncBit(other.err_syncBit) + { + other.encoder = nullptr; + other.lastFront = nullptr; + other.firstUnHandledFront = nullptr; + } + + // Оператор перемещающего присваивания + IR_DecoderRaw& IR_DecoderRaw::operator=(IR_DecoderRaw&& other) { + if (this != &other) { // Проверка на самоприсваивание + packInfo = std::move(other.packInfo); + encoder = other.encoder; + isAvailable = other.isAvailable; + packSize = other.packSize; + crcValue = other.crcValue; + isPairSending = other.isPairSending; + isRecive = other.isRecive; + isPreamb = other.isPreamb; + isSubBufferOverflow = other.isSubBufferOverflow; + isBufferOverflow = other.isBufferOverflow; + isWrongPack = other.isWrongPack; + riseSyncTime = other.riseSyncTime; + currentSubBufferIndex = other.currentSubBufferIndex; + subBuffer = std::move(other.subBuffer); + lastFront = other.lastFront; + firstUnHandledFront = other.firstUnHandledFront; + prevRise = other.prevRise; + prevPrevRise = other.prevPrevRise; + prevFall = other.prevFall; + prevPrevFall = other.prevPrevFall; + risePeriod = other.risePeriod; + highTime = other.highTime; + lowTime = other.lowTime; + oldTime = other.oldTime; + wrongCounter = other.wrongCounter; + highCount = other.highCount; + lowCount = other.lowCount; + allCount = other.allCount; + errorCounter = other.errorCounter; + preambFrontCounter = other.preambFrontCounter; + bufBitPos = other.bufBitPos; + isData = other.isData; + i_dataBuffer = other.i_dataBuffer; + nextControlBit = other.nextControlBit; + i_syncBit = other.i_syncBit; + err_syncBit = other.err_syncBit; + + other.encoder = nullptr; + other.lastFront = nullptr; + other.firstUnHandledFront = nullptr; + } + return *this; + } diff --git a/IR_DecoderRaw.h b/IR_DecoderRaw.h index 832df7f..90929e1 100644 --- a/IR_DecoderRaw.h +++ b/IR_DecoderRaw.h @@ -36,7 +36,6 @@ protected: public: ////////////////////////////////////////////////////////////////////////// - IR_DecoderRaw(); /// @brief Конструктор /// @param pin Номер вывода прерывания/данных от приёмника (2 или 3 для atmega 328p) /// @param addr Адрес приёмника @@ -133,4 +132,4 @@ private: inline void errPulse(uint8_t pin, uint8_t count); inline void infoPulse(uint8_t pin, uint8_t count); #endif -}; \ No newline at end of file +}; diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 8464a46..aec0744 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -11,7 +11,6 @@ std::list& IR_Encoder::get_enc_list() // определение ф return dec_list; // возвращается ссылка на переменную } -IR_Encoder::IR_Encoder(){}; IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair) { @@ -404,4 +403,4 @@ uint8_t IR_Encoder::bitLow[2] = { // (bitActiveTakts) * 2 - 0}; // uint8_t* IR_Encoder::bitLow = new uint8_t[2]{ // (bitPauseTakts/2 + bitActiveTakts) * 2 - 0, -// (bitPauseTakts) - 0}; \ No newline at end of file +// (bitPauseTakts) - 0}; diff --git a/IR_Encoder.h b/IR_Encoder.h index f6a26c2..b312415 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -12,7 +12,6 @@ public: private: uint16_t id; /// @brief Адрес передатчика public: - IR_Encoder(); /// @brief Класс передатчика /// @param addr Адрес передатчика /// @param pin Вывод передатчика From 04af094f4b4fa4cf312e4abe9e51ee1dbcad52a1 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 29 Aug 2024 14:25:09 +0300 Subject: [PATCH 30/69] opti --- IR_Encoder.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index aec0744..5c29fdf 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -52,10 +52,7 @@ IR_Encoder::~IR_Encoder() void IR_Encoder::sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept) { - uint8_t *dataPtr = new uint8_t[1]; - dataPtr[0] = dataByte; - sendData(addrTo, dataPtr, 1, needAccept); - delete[] dataPtr; + sendData(addrTo, &dataByte, 1, needAccept); } void IR_Encoder::sendData(uint16_t addrTo, uint8_t *data, uint8_t len, bool needAccept) From d4dd0e95fd2ef774d67c17a5b64c7358fd0262a8 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 29 Aug 2024 16:22:09 +0300 Subject: [PATCH 31/69] upd --- IR_DecoderRaw.cpp | 176 ---------------------------------------------- 1 file changed, 176 deletions(-) diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index c0ee268..997b54a 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -650,179 +650,3 @@ inline void IR_DecoderRaw::infoPulse(uint8_t pin, uint8_t count) } } #endif - -// Конструктор копирования - IR_DecoderRaw::IR_DecoderRaw(const IR_DecoderRaw& other) - : packInfo(other.packInfo), - encoder(other.encoder), // Если IR_Encoder имеет безопасный копируемый указатель - isAvailable(other.isAvailable), - packSize(other.packSize), - crcValue(other.crcValue), - isPairSending(other.isPairSending), - isRecive(other.isRecive), - isPreamb(other.isPreamb), - isSubBufferOverflow(other.isSubBufferOverflow), - isBufferOverflow(other.isBufferOverflow), - isWrongPack(other.isWrongPack), - riseSyncTime(other.riseSyncTime), - currentSubBufferIndex(other.currentSubBufferIndex), - subBuffer(other.subBuffer), // Копирование буфера - lastFront(other.lastFront), - firstUnHandledFront(other.firstUnHandledFront), - prevRise(other.prevRise), - prevPrevRise(other.prevPrevRise), - prevFall(other.prevFall), - prevPrevFall(other.prevPrevFall), - risePeriod(other.risePeriod), - highTime(other.highTime), - lowTime(other.lowTime), - oldTime(other.oldTime), - wrongCounter(other.wrongCounter), - highCount(other.highCount), - lowCount(other.lowCount), - allCount(other.allCount), - errorCounter(other.errorCounter), - preambFrontCounter(other.preambFrontCounter), - bufBitPos(other.bufBitPos), - isData(other.isData), - i_dataBuffer(other.i_dataBuffer), - nextControlBit(other.nextControlBit), - i_syncBit(other.i_syncBit), - err_syncBit(other.err_syncBit) - { - // Специфическое копирование, если нужно - } - - // Оператор копирующего присваивания - IR_DecoderRaw& IR_DecoderRaw::operator=(const IR_DecoderRaw& other) { - if (this != &other) { // Проверка на самоприсваивание - packInfo = other.packInfo; - encoder = other.encoder; - isAvailable = other.isAvailable; - packSize = other.packSize; - crcValue = other.crcValue; - isPairSending = other.isPairSending; - isRecive = other.isRecive; - isPreamb = other.isPreamb; - isSubBufferOverflow = other.isSubBufferOverflow; - isBufferOverflow = other.isBufferOverflow; - isWrongPack = other.isWrongPack; - riseSyncTime = other.riseSyncTime; - currentSubBufferIndex = other.currentSubBufferIndex; - subBuffer = other.subBuffer; - lastFront = other.lastFront; - firstUnHandledFront = other.firstUnHandledFront; - prevRise = other.prevRise; - prevPrevRise = other.prevPrevRise; - prevFall = other.prevFall; - prevPrevFall = other.prevPrevFall; - risePeriod = other.risePeriod; - highTime = other.highTime; - lowTime = other.lowTime; - oldTime = other.oldTime; - wrongCounter = other.wrongCounter; - highCount = other.highCount; - lowCount = other.lowCount; - allCount = other.allCount; - errorCounter = other.errorCounter; - preambFrontCounter = other.preambFrontCounter; - bufBitPos = other.bufBitPos; - isData = other.isData; - i_dataBuffer = other.i_dataBuffer; - nextControlBit = other.nextControlBit; - i_syncBit = other.i_syncBit; - err_syncBit = other.err_syncBit; - } - return *this; - } - - // Конструктор перемещения - IR_DecoderRaw::IR_DecoderRaw(IR_DecoderRaw&& other) - : packInfo(std::move(other.packInfo)), - encoder(other.encoder), - isAvailable(other.isAvailable), - packSize(other.packSize), - crcValue(other.crcValue), - isPairSending(other.isPairSending), - isRecive(other.isRecive), - isPreamb(other.isPreamb), - isSubBufferOverflow(other.isSubBufferOverflow), - isBufferOverflow(other.isBufferOverflow), - isWrongPack(other.isWrongPack), - riseSyncTime(other.riseSyncTime), - currentSubBufferIndex(other.currentSubBufferIndex), - subBuffer(std::move(other.subBuffer)), - lastFront(other.lastFront), - firstUnHandledFront(other.firstUnHandledFront), - prevRise(other.prevRise), - prevPrevRise(other.prevPrevRise), - prevFall(other.prevFall), - prevPrevFall(other.prevPrevFall), - risePeriod(other.risePeriod), - highTime(other.highTime), - lowTime(other.lowTime), - oldTime(other.oldTime), - wrongCounter(other.wrongCounter), - highCount(other.highCount), - lowCount(other.lowCount), - allCount(other.allCount), - errorCounter(other.errorCounter), - preambFrontCounter(other.preambFrontCounter), - bufBitPos(other.bufBitPos), - isData(other.isData), - i_dataBuffer(other.i_dataBuffer), - nextControlBit(other.nextControlBit), - i_syncBit(other.i_syncBit), - err_syncBit(other.err_syncBit) - { - other.encoder = nullptr; - other.lastFront = nullptr; - other.firstUnHandledFront = nullptr; - } - - // Оператор перемещающего присваивания - IR_DecoderRaw& IR_DecoderRaw::operator=(IR_DecoderRaw&& other) { - if (this != &other) { // Проверка на самоприсваивание - packInfo = std::move(other.packInfo); - encoder = other.encoder; - isAvailable = other.isAvailable; - packSize = other.packSize; - crcValue = other.crcValue; - isPairSending = other.isPairSending; - isRecive = other.isRecive; - isPreamb = other.isPreamb; - isSubBufferOverflow = other.isSubBufferOverflow; - isBufferOverflow = other.isBufferOverflow; - isWrongPack = other.isWrongPack; - riseSyncTime = other.riseSyncTime; - currentSubBufferIndex = other.currentSubBufferIndex; - subBuffer = std::move(other.subBuffer); - lastFront = other.lastFront; - firstUnHandledFront = other.firstUnHandledFront; - prevRise = other.prevRise; - prevPrevRise = other.prevPrevRise; - prevFall = other.prevFall; - prevPrevFall = other.prevPrevFall; - risePeriod = other.risePeriod; - highTime = other.highTime; - lowTime = other.lowTime; - oldTime = other.oldTime; - wrongCounter = other.wrongCounter; - highCount = other.highCount; - lowCount = other.lowCount; - allCount = other.allCount; - errorCounter = other.errorCounter; - preambFrontCounter = other.preambFrontCounter; - bufBitPos = other.bufBitPos; - isData = other.isData; - i_dataBuffer = other.i_dataBuffer; - nextControlBit = other.nextControlBit; - i_syncBit = other.i_syncBit; - err_syncBit = other.err_syncBit; - - other.encoder = nullptr; - other.lastFront = nullptr; - other.firstUnHandledFront = nullptr; - } - return *this; - } From 7c9529d42f58227b2c774b9ab8e59df461465342 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 29 Aug 2024 16:46:40 +0300 Subject: [PATCH 32/69] enable-disable func --- IR_Decoder.cpp | 27 +++++++++++++++++++++++- IR_Decoder.h | 5 ++++- IR_Encoder.cpp | 56 +++++++++++++++++++++++++++++++++++--------------- IR_Encoder.h | 5 ++++- 4 files changed, 73 insertions(+), 20 deletions(-) diff --git a/IR_Decoder.cpp b/IR_Decoder.cpp index 41afe3c..63d4d7a 100644 --- a/IR_Decoder.cpp +++ b/IR_Decoder.cpp @@ -7,12 +7,37 @@ std::list &IR_Decoder::get_dec_list() // определение ф } // IR_Decoder::IR_Decoder() {}; -IR_Decoder::IR_Decoder(const uint8_t pin, uint16_t addr, IR_Encoder *encPair) +IR_Decoder::IR_Decoder(const uint8_t pin, uint16_t addr, IR_Encoder *encPair, bool autoHandle) : IR_DecoderRaw(pin, addr, encPair) { get_dec_list().push_back(this); + if(autoHandle){ + enable(); + } }; +void IR_Decoder::enable() +{ + auto &dec_list = get_dec_list(); + if (std::find(dec_list.begin(), dec_list.end(), this) == dec_list.end()) + { + dec_list.push_back(this); + } + attachInterrupt(pin, (*this)(), CHANGE); +} + +void IR_Decoder::disable() +{ + detachInterrupt(pin); + auto &dec_list = get_dec_list(); + auto it = std::find(dec_list.begin(), dec_list.end(), this); + if (it != dec_list.end()) + { + dec_list.erase(it); + } +} + + std::function IR_Decoder::operator()() { return std::bind(&IR_Decoder::isr, this); diff --git a/IR_Decoder.h b/IR_Decoder.h index bdd9df3..27dca9f 100644 --- a/IR_Decoder.h +++ b/IR_Decoder.h @@ -25,10 +25,13 @@ public: PacketTypes::BasePack gotRaw; // IR_Decoder(); - IR_Decoder(const uint8_t pin, uint16_t addr, IR_Encoder *encPair = nullptr); + IR_Decoder(const uint8_t pin, uint16_t addr, IR_Encoder *encPair = nullptr, bool autoHandle = true); std::function operator()(); + void enable(); + void disable(); + ~IR_Decoder(); static void tick(); diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 5c29fdf..48dcb28 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -5,14 +5,13 @@ #define ISR_Out 10 #define TestOut 13 -std::list& IR_Encoder::get_enc_list() // определение функции +std::list &IR_Encoder::get_enc_list() // определение функции { - static std::list dec_list; // статическая локальная переменная - return dec_list; // возвращается ссылка на переменную + static std::list dec_list; // статическая локальная переменная + return dec_list; // возвращается ссылка на переменную } - -IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair) +IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool autoHandle) { setPin(pin); id = addr; @@ -22,8 +21,7 @@ IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair) #if disablePairDec if (decPair != nullptr) { - blindDecoders = new IR_DecoderRaw *[1] - { decPair }; + blindDecoders = new IR_DecoderRaw *[1]{decPair}; decodersCount = 1; } #endif @@ -31,10 +29,33 @@ IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair) { decPair->encoder = this; } - pinMode(pin,OUTPUT); - get_enc_list().push_back(this); + pinMode(pin, OUTPUT); + + if (autoHandle) + { + get_enc_list().push_back(this); + } }; +void IR_Encoder::enable() +{ + auto &enc_list = get_enc_list(); + if (std::find(enc_list.begin(), enc_list.end(), this) == enc_list.end()) + { + enc_list.push_back(this); + } +} + +void IR_Encoder::disable() +{ + auto &enc_list = get_enc_list(); + auto it = std::find(enc_list.begin(), enc_list.end(), this); + if (it != enc_list.end()) + { + enc_list.erase(it); + } +} + void IR_Encoder::setBlindDecoders(IR_DecoderRaw *decoders[], uint8_t count) { #if disablePairDec @@ -149,7 +170,7 @@ void IR_Encoder::sendBack(uint8_t data) _sendBack(false, 0, &data, 1); } -void IR_Encoder::sendBack(uint8_t *data , uint8_t len) +void IR_Encoder::sendBack(uint8_t *data, uint8_t len) { _sendBack(false, 0, data, len); } @@ -238,9 +259,11 @@ void IR_Encoder::rawSend(uint8_t *ptr, uint8_t len) // interrupts(); } -void IR_Encoder::isr(){ +void IR_Encoder::isr() +{ // Serial.println(get_enc_list().size()); - for(const auto &element : get_enc_list()){ + for (const auto &element : get_enc_list()) + { element->_isr(); } } @@ -254,7 +277,6 @@ void IR_Encoder::_isr() port->ODR &= ~(mask); port->ODR |= mask & (ir_out_virtual ? (uint16_t)0xFFFF : (uint16_t)0x0000); - if (toggleCounter) { @@ -389,11 +411,11 @@ void IR_Encoder::addSync(bool *prev, bool *next) } uint8_t IR_Encoder::bitHigh[2] = { - (bitPauseTakts) * 2 - 1, - (bitActiveTakts) * 2 - 1}; + (bitPauseTakts) * 2 - 1, + (bitActiveTakts) * 2 - 1}; uint8_t IR_Encoder::bitLow[2] = { - (bitPauseTakts/2 + bitActiveTakts) * 2 - 1, - (bitPauseTakts) - 1}; + (bitPauseTakts / 2 + bitActiveTakts) * 2 - 1, + (bitPauseTakts)-1}; // uint8_t* IR_Encoder::bitHigh = new uint8_t[2]{ // (bitPauseTakts) * 2 - 0, diff --git a/IR_Encoder.h b/IR_Encoder.h index b312415..eed42be 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -16,9 +16,12 @@ public: /// @param addr Адрес передатчика /// @param pin Вывод передатчика /// @param decPair Приёмник, для которого отключается приём в момент передачи передатчиком - IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair = nullptr); + IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair = nullptr, bool autoHandle = true); static void isr(); + void enable(); + void disable(); + void setBlindDecoders(IR_DecoderRaw *decoders[], uint8_t count); void rawSend(uint8_t *ptr, uint8_t len); From aa862d8f2c0f8c712bcc27624428598d3c5b1270 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 29 Aug 2024 17:06:10 +0300 Subject: [PATCH 33/69] default addr --- IR_Decoder.h | 2 +- IR_Encoder.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/IR_Decoder.h b/IR_Decoder.h index 27dca9f..bff9666 100644 --- a/IR_Decoder.h +++ b/IR_Decoder.h @@ -25,7 +25,7 @@ public: PacketTypes::BasePack gotRaw; // IR_Decoder(); - IR_Decoder(const uint8_t pin, uint16_t addr, IR_Encoder *encPair = nullptr, bool autoHandle = true); + IR_Decoder(const uint8_t pin, uint16_t addr = 0, IR_Encoder *encPair = nullptr, bool autoHandle = true); std::function operator()(); diff --git a/IR_Encoder.h b/IR_Encoder.h index eed42be..ee5df02 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -16,7 +16,7 @@ public: /// @param addr Адрес передатчика /// @param pin Вывод передатчика /// @param decPair Приёмник, для которого отключается приём в момент передачи передатчиком - IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair = nullptr, bool autoHandle = true); + IR_Encoder(uint8_t pin, uint16_t addr = 0, IR_DecoderRaw *decPair = nullptr, bool autoHandle = true); static void isr(); void enable(); From fd51a4935cf3b301290fd7f6de0e0940c23058c1 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 3 Sep 2024 17:35:35 +0300 Subject: [PATCH 34/69] small fix --- IR_Encoder.h | 2 +- IR_config.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/IR_Encoder.h b/IR_Encoder.h index ee5df02..27970a9 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -4,7 +4,7 @@ // TODO: Отложенная передача после завершения приема class IR_DecoderRaw; -class IR_Encoder : IR_FOX +class IR_Encoder : public IR_FOX { friend IR_DecoderRaw; diff --git a/IR_config.h b/IR_config.h index 8067be8..cd6ffdb 100644 --- a/IR_config.h +++ b/IR_config.h @@ -183,7 +183,7 @@ public: uint16_t rTime = 0; }; - inline uint16_t getId() { return id; } + inline uint16_t getId() const { return id; } inline void setId(uint16_t id) { this->id = id; } static void checkAddressRuleApply(uint16_t address, uint16_t id, bool &flag); void setPin(uint8_t pin); From 8f77c60cbad1bf292f3d9172bce360063bf5b68d Mon Sep 17 00:00:00 2001 From: DashyFox Date: Mon, 9 Sep 2024 10:40:47 +0300 Subject: [PATCH 35/69] .gitignore --- .gitignore | 1 - .vscode/arduino.json | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 8172f79..bf27854 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ .vscode/* bin/* -!.vscode/arduino.json !.vscode/launch.json log/* \ No newline at end of file diff --git a/.vscode/arduino.json b/.vscode/arduino.json index fb0e740..7a92b42 100644 --- a/.vscode/arduino.json +++ b/.vscode/arduino.json @@ -1,8 +1,5 @@ { - "configuration": "pnum=BLUEPILL_F103C8,upload_method=swdMethod,xserial=none,usb=CDCgen,xusb=FS,opt=osstd,dbg=none,rtlib=nano", "board": "STMicroelectronics:stm32:GenF1", "port": "COM17", - "output": "bin", - "prebuild": "if exist bin rd /s /q bin", - "sketch": "IR-protocol.ino" + "prebuild": "if exist bin rd /s /q bin" } \ No newline at end of file From da152c65eeca1b270f270921398d8c91445ec48f Mon Sep 17 00:00:00 2001 From: DashyFox Date: Fri, 20 Sep 2024 09:35:27 +0300 Subject: [PATCH 36/69] address space config --- IR_config.h | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/IR_config.h b/IR_config.h index cd6ffdb..4fb7581 100644 --- a/IR_config.h +++ b/IR_config.h @@ -8,19 +8,32 @@ */ // Адресация с 1 до 65 499 -#define IR_Broadcast 65000 // 65 500 ~ 65 535 - широковещательные пакеты (всем), возможно разделить на 35 типов +#define IR_Broadcast 65000 // 65 500 ~ 65 535 - широковещательные пакеты (всем) /* -Адрес 0 запрещен и зарезервирован под NULL, либо тесты -IR_MSG_ACCEPT с адреса 0 воспринимается всеми устройствами +*Адресное пространство: + Адрес 0 запрещен и зарезервирован под NULL, либо тесты + IR_MSG_ACCEPT с адреса 0 воспринимается всеми устройствами +*/ +//**** Контрольные точки ****** +#define IR_MAX_ADDR_CPU 64999 +#define IR_MIN_ADDR_CPU 32000 +// //***** Группы машинок ******** +// #define IR_MAX_CAR_GROUP 31999 +// #define IR_MIN_CAR_GROUP 30000 -Адресное пространство: - -Излучатели контрольных точек: 1000 ~ 1999 -Излучатели без обратной связиЖ 2000 ~ 2999 -Излучатели светофоров: 3000 ~ 3999 +// //********** FREE ************* +// #define IR_MAX_FREE 31999 +// #define IR_MIN_FREE 2000 +//********* Машинки *********** +#define IR_MAX_CAR 31999 +#define IR_MIN_CAR 100 +//***** Пульты управления ***** +#define IR_MAX_CONTROLLER 99 +#define IR_MIN_CONTROLLER 0 +/* /```````````````````````````````````````````````` data pack `````````````````````````````````````````````\                                                                                                                                             @@ -142,10 +155,10 @@ typedef uint16_t crc_t; #define bitTime (bitTakts * carrierPeriod) // Общая длительность бита #define tolerance 300U - constexpr uint16_t test_all_Time = bitTime; - constexpr uint16_t test_all_Takts = bitTakts*2; - constexpr uint16_t test_hi = ((bitPauseTakts) * 2 - 0 ) + ((bitActiveTakts) * 2 - 0); - constexpr uint16_t test_low = ((bitPauseTakts/2 + bitActiveTakts) * 2 - 0)+((bitPauseTakts) - 0); +constexpr uint16_t test_all_Time = bitTime; +constexpr uint16_t test_all_Takts = bitTakts * 2; +constexpr uint16_t test_hi = ((bitPauseTakts) * 2 - 0) + ((bitActiveTakts) * 2 - 0); +constexpr uint16_t test_low = ((bitPauseTakts / 2 + bitActiveTakts) * 2 - 0) + ((bitPauseTakts)-0); class IR_FOX { @@ -187,7 +200,7 @@ public: inline void setId(uint16_t id) { this->id = id; } static void checkAddressRuleApply(uint16_t address, uint16_t id, bool &flag); void setPin(uint8_t pin); - inline uint8_t getPin(){return pin;}; + inline uint8_t getPin() { return pin; }; protected: uint16_t id; From cf5a6641f45c52e77c3ca61a767691152cfda661 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 14 Nov 2024 15:07:28 +0300 Subject: [PATCH 37/69] Update arduino.json --- .vscode/arduino.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.vscode/arduino.json b/.vscode/arduino.json index 7a92b42..082eeca 100644 --- a/.vscode/arduino.json +++ b/.vscode/arduino.json @@ -1,5 +1,6 @@ { "board": "STMicroelectronics:stm32:GenF1", "port": "COM17", - "prebuild": "if exist bin rd /s /q bin" + "prebuild": "if exist bin rd /s /q bin", + "sketch": "IR-protocol.ino" } \ No newline at end of file From e6dbdcee744f211e1c5c40a10a3c687c34237b0c Mon Sep 17 00:00:00 2001 From: DashyFox Date: Mon, 23 Dec 2024 17:36:35 +0300 Subject: [PATCH 38/69] f401 MAKET --- .vscode/arduino.json | 5 +- IR-protocol.ino | 115 ++++++++++++++++++++++--------------------- IR_DecoderRaw.cpp | 2 +- 3 files changed, 62 insertions(+), 60 deletions(-) diff --git a/.vscode/arduino.json b/.vscode/arduino.json index 082eeca..d4b6514 100644 --- a/.vscode/arduino.json +++ b/.vscode/arduino.json @@ -1,6 +1,7 @@ { - "board": "STMicroelectronics:stm32:GenF1", + "board": "STMicroelectronics:stm32:GenF4", "port": "COM17", "prebuild": "if exist bin rd /s /q bin", - "sketch": "IR-protocol.ino" + "sketch": "IR-protocol.ino", + "configuration": "clock=25MHz,pnum=MAKET_F401RETX,upload_method=swdMethod,xserial=generic,usb=CDCgen,xusb=FS,opt=osstd,dbg=none,rtlib=nano" } \ No newline at end of file diff --git a/IR-protocol.ino b/IR-protocol.ino index ad8d3f1..56005d9 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -4,22 +4,22 @@ #include "MemoryCheck.h" /////////////// Pinout /////////////// -#define dec0_PIN PB0 -#define dec1_PIN PB1 -#define dec2_PIN PA2 -#define dec3_PIN PB3 -#define dec4_PIN PB4 -#define dec5_PIN PB5 -#define dec6_PIN PB6 -#define dec7_PIN PB7 -#define dec8_PIN PB8 -#define dec9_PIN PB9 -#define dec10_PIN PB10 -#define dec11_PIN PB11 -#define dec12_PIN PB12 -#define dec13_PIN PB13 -#define dec14_PIN PB14 -#define dec15_PIN PB15 +#define dec0_PIN PIN_KT1_IN +#define dec1_PIN PIN_KT2_IN +#define dec2_PIN PIN_KT3_IN +#define dec3_PIN PIN_KT4_IN +#define dec4_PIN PIN_KT5_IN +#define dec5_PIN PIN_KT6_IN +#define dec6_PIN PIN_KT7_IN +#define dec7_PIN PIN_KT8_IN +// #define dec8_PIN PB8 +// #define dec9_PIN PB9 +// #define dec10_PIN PB10 +// #define dec11_PIN PB11 +// #define dec12_PIN PB12 +// #define dec13_PIN PB13 +// #define dec14_PIN PB14 +// #define dec15_PIN PB15 #define LoopOut PC13 @@ -31,9 +31,9 @@ #define decPinMode(n) pinMode(dec##n##_PIN, INPUT_PULLUP); #define decAttach(n) attachInterrupt(dec##n##_PIN, dec_##n##_ISR, CHANGE); -#define decSetup(n) /* decPinMode(n); */ decAttach(n); +#define decSetup(n) decPinMode(n); decAttach(n); #define decTick(n) dec##n.tick(); -#define decStat(n) rx_flag |= statusSimple(dec##n); +#define decStat(n) rx_flag |= status/* Simple */(dec##n); //////////////// Ini ///////////////// @@ -43,10 +43,10 @@ //////////////// Var ///////////////// // IR_Encoder encForward(PA5, 42 /* , &decBackward */); -IR_Encoder enc0(PA0, 42 /* , &decBackward */); -IR_Encoder enc1(PA1, 127 /* , &decBackward */); -IR_Encoder enc2(PA2, 137 /* , &decBackward */); -IR_Encoder enc3(PA3, 777 /* , &decBackward */); +IR_Encoder enc0(PIN_KT8_OUT, 42 /* , &decBackward */); +// IR_Encoder enc1(PA1, 127 /* , &decBackward */); +// IR_Encoder enc2(PA2, 137 /* , &decBackward */); +// IR_Encoder enc3(PA3, 777 /* , &decBackward */); // IR_Encoder enc10(PA4, 555 /* , &decBackward */); // IR_Encoder enc11(PC14, 127 /* , &decBackward */); // IR_Encoder enc12(PC13, 137 /* , &decBackward */); @@ -71,12 +71,12 @@ dec_Ini(4); dec_Ini(5); dec_Ini(6); dec_Ini(7); -dec_Ini(8); -dec_Ini(9); -dec_Ini(10); -dec_Ini(11); -dec_Ini(12); -dec_Ini(13); +// dec_Ini(8); +// dec_Ini(9); +// dec_Ini(10); +// dec_Ini(11); +// dec_Ini(12); +// dec_Ini(13); ///////////////////////////////////////////////////////////////////// uint8_t data0[] = {}; @@ -91,10 +91,10 @@ uint16_t targetAddr = IR_Broadcast; Timer t1(500, millis, []() { // Serial.println( digitalPinToBitMask(enc0.getPin()), BIN); - enc0.sendData(IR_Broadcast, data4, sizeof(data4)); - enc1.sendData(IR_Broadcast, data3, sizeof(data3)); - enc2.sendData(IR_Broadcast, data2, sizeof(data2)); - enc3.sendData(IR_Broadcast, data1, sizeof(data1)); + // enc0.sendData(IR_Broadcast, data4, sizeof(data4)); + // enc1.sendData(IR_Broadcast, data3, sizeof(data3)); + // enc2.sendData(IR_Broadcast, data2, sizeof(data2)); + // enc3.sendData(IR_Broadcast, data1, sizeof(data1)); // enc10.sendData(IR_Broadcast, data4, sizeof(data4)); // enc11.sendData(IR_Broadcast, data3, sizeof(data3)); // enc12.sendData(IR_Broadcast, data2, sizeof(data2)); @@ -203,7 +203,7 @@ void setup() pinMode(LoopOut, OUTPUT); // pinMode(SignalDetectLed, OUTPUT); - pinMode(dec1_PIN, INPUT_PULLUP); + pinMode(dec0_PIN, INPUT_PULLUP); // pinMode(dec2_PIN, INPUT_PULLUP); static IR_DecoderRaw *blind[]{ @@ -215,34 +215,34 @@ void setup() &dec5, &dec6, &dec7, - &dec8, - &dec9, - &dec10, - &dec11, - &dec12, - &dec13, + // &dec8, + // &dec9, + // &dec10, + // &dec11, + // &dec12, + // &dec13, }; - // enc0.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); + enc0.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); // enc1.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); // enc2.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); // enc3.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); // enc10.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); decSetup(0); - // decSetup(1); - // decSetup(2); - // decSetup(3); - // decSetup(4); - // decSetup(5); - // decSetup(6); - // decSetup(7); + decSetup(1); + decSetup(2); + decSetup(3); + decSetup(4); + decSetup(5); + decSetup(6); + decSetup(7); // decSetup(8); // decSetup(9); // decSetup(10); - decSetup(11); - decSetup(12); - decSetup(13); + // decSetup(11); + // decSetup(12); + // decSetup(13); } void loop() @@ -261,12 +261,12 @@ void loop() decStat(5); decStat(6); decStat(7); - decStat(8); - decStat(9); - decStat(10); - decStat(11); - decStat(12); - decStat(13); + // decStat(8); + // decStat(9); + // decStat(10); + // decStat(11); + // decStat(12); + // decStat(13); // status(decForward); // status(decBackward); @@ -321,7 +321,7 @@ void detectSignal() } // test -void status(IR_Decoder &dec) +bool status(IR_Decoder &dec) { if (dec.gotData.available()) { @@ -572,4 +572,5 @@ void status(IR_Decoder &dec) // obj->resetAvailable(); Serial.write(str.c_str()); } + return false; } diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index 997b54a..c878447 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -58,7 +58,7 @@ void IR_DecoderRaw::isr() interrupts(); if (time_ < oldTime) { -#ifdef IRDEBUG +#ifdef IRDEBUG/* 1 */ Serial.print("\n"); Serial.print("count: "); Serial.println(wrongCounter++); From 341ff3a470fc514b61fce1e9f21a2f976b544c85 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 24 Dec 2024 15:00:20 +0300 Subject: [PATCH 39/69] Update IR_DecoderRaw.cpp --- IR_DecoderRaw.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index c878447..ef74883 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -47,7 +47,7 @@ volatile uint32_t time_; void IR_DecoderRaw::isr() { - + // Serial.print("ISR\n"); if(isPairSending){ return; } @@ -58,7 +58,8 @@ void IR_DecoderRaw::isr() interrupts(); if (time_ < oldTime) { -#ifdef IRDEBUG/* 1 */ + +#ifdef IRDEBUG Serial.print("\n"); Serial.print("count: "); Serial.println(wrongCounter++); From 7ef8158a008993fe9875b1877382a8ec53139225 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 25 Dec 2024 17:07:47 +0300 Subject: [PATCH 40/69] upd --- IR_Encoder.cpp | 10 +++++++--- IR_Encoder.h | 4 +++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 48dcb28..a6eb956 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -76,7 +76,11 @@ void IR_Encoder::sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept) sendData(addrTo, &dataByte, 1, needAccept); } -void IR_Encoder::sendData(uint16_t addrTo, uint8_t *data, uint8_t len, bool needAccept) +void IR_Encoder::sendData(uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0, bool needAccept = false){ + sendData(id, addrTo, data, len, needAccept); +} + +void IR_Encoder::sendData(uint16_t addrFrom, uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0, bool needAccept = false) { if (len > bytePerPack) { @@ -93,8 +97,8 @@ void IR_Encoder::sendData(uint16_t addrTo, uint8_t *data, uint8_t len, bool need sendBuffer[0] = msgType; // addr_self - sendBuffer[1] = id >> 8 & 0xFF; - sendBuffer[2] = id & 0xFF; + sendBuffer[1] = addrFrom >> 8 & 0xFF; + sendBuffer[2] = addrFrom & 0xFF; // addr_to sendBuffer[3] = addrTo >> 8 & 0xFF; diff --git a/IR_Encoder.h b/IR_Encoder.h index 27970a9..9145f68 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -10,7 +10,7 @@ class IR_Encoder : public IR_FOX public: private: - uint16_t id; /// @brief Адрес передатчика + // uint16_t id; /// @brief Адрес передатчика public: /// @brief Класс передатчика /// @param addr Адрес передатчика @@ -27,6 +27,8 @@ public: void sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept = false); void sendData(uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0, bool needAccept = false); + void sendData(uint16_t addrFrom, uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0, bool needAccept = false); + void sendAccept(uint16_t addrTo, uint8_t customByte = 0); void sendRequest(uint16_t addrTo); From 1ecc33e9c45954ddf77496bc2b13dca5314ed8fb Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 25 Dec 2024 17:13:28 +0300 Subject: [PATCH 41/69] hotfix --- IR_Encoder.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index a6eb956..57d8f37 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -76,11 +76,11 @@ void IR_Encoder::sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept) sendData(addrTo, &dataByte, 1, needAccept); } -void IR_Encoder::sendData(uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0, bool needAccept = false){ +void IR_Encoder::sendData(uint16_t addrTo, uint8_t *data, uint8_t len, bool needAccept){ sendData(id, addrTo, data, len, needAccept); } -void IR_Encoder::sendData(uint16_t addrFrom, uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0, bool needAccept = false) +void IR_Encoder::sendData(uint16_t addrFrom, uint16_t addrTo, uint8_t *data, uint8_t len, bool needAccept) { if (len > bytePerPack) { From 90c41cfe2ba37aeaa9935ab0c309be650feac6af Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 9 Jan 2025 09:32:14 +0300 Subject: [PATCH 42/69] ambigious fix --- .vscode/arduino.json | 2 +- IR_Encoder.cpp | 4 ++-- IR_Encoder.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.vscode/arduino.json b/.vscode/arduino.json index d4b6514..d14354b 100644 --- a/.vscode/arduino.json +++ b/.vscode/arduino.json @@ -3,5 +3,5 @@ "port": "COM17", "prebuild": "if exist bin rd /s /q bin", "sketch": "IR-protocol.ino", - "configuration": "clock=25MHz,pnum=MAKET_F401RETX,upload_method=swdMethod,xserial=generic,usb=CDCgen,xusb=FS,opt=osstd,dbg=none,rtlib=nano" + "configuration": "clock=25MHz,pnum=MAKET_F401RETX,upload_method=dfuMethod,xserial=generic,usb=CDCgen,xusb=FS,opt=osstd,dbg=none,rtlib=nano" } \ No newline at end of file diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 57d8f37..3dda9fb 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -77,10 +77,10 @@ void IR_Encoder::sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept) } void IR_Encoder::sendData(uint16_t addrTo, uint8_t *data, uint8_t len, bool needAccept){ - sendData(id, addrTo, data, len, needAccept); + sendDataFULL(id, addrTo, data, len, needAccept); } -void IR_Encoder::sendData(uint16_t addrFrom, uint16_t addrTo, uint8_t *data, uint8_t len, bool needAccept) +void IR_Encoder::sendDataFULL(uint16_t addrFrom, uint16_t addrTo, uint8_t *data, uint8_t len, bool needAccept) { if (len > bytePerPack) { diff --git a/IR_Encoder.h b/IR_Encoder.h index 9145f68..0aaec2c 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -27,7 +27,7 @@ public: void sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept = false); void sendData(uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0, bool needAccept = false); - void sendData(uint16_t addrFrom, uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0, bool needAccept = false); + void sendDataFULL(uint16_t addrFrom, uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0, bool needAccept = false); void sendAccept(uint16_t addrTo, uint8_t customByte = 0); From 0471b8cc8927b6712ca570e5916dbdae64650eb3 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 16 Jan 2025 16:58:33 +0300 Subject: [PATCH 43/69] begin() --- IR_Encoder.cpp | 19 +++++++++++++++++++ IR_Encoder.h | 3 +++ 2 files changed, 22 insertions(+) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 3dda9fb..f988ee4 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -37,6 +37,25 @@ IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool } }; + +void WEAK EncoderISR() +{ + IR_Encoder::isr(); +} + +HardwareTimer IR_Encoder::IR_Timer; + +inline HardwareTimer* IR_Encoder::get_IR_Timer(){return &IR_Encoder::IR_Timer;} + +void IR_Encoder::begin(HardwareTimer timer, uint8_t channel, IRQn_Type IRQn){ + IR_Timer = timer; + IR_Timer.setOverflow(carrierFrec * 2, HERTZ_FORMAT); + IR_Timer.attachInterrupt(channel, EncoderISR); + NVIC_SetPriority(IRQn, 0); + IR_Timer.resume(); +} + + void IR_Encoder::enable() { auto &enc_list = get_enc_list(); diff --git a/IR_Encoder.h b/IR_Encoder.h index 0aaec2c..0540fae 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -9,6 +9,7 @@ class IR_Encoder : public IR_FOX friend IR_DecoderRaw; public: + static HardwareTimer IR_Timer; private: // uint16_t id; /// @brief Адрес передатчика public: @@ -18,6 +19,8 @@ public: /// @param decPair Приёмник, для которого отключается приём в момент передачи передатчиком IR_Encoder(uint8_t pin, uint16_t addr = 0, IR_DecoderRaw *decPair = nullptr, bool autoHandle = true); static void isr(); + static void begin(HardwareTimer IR_Timer, uint8_t channel, IRQn_Type IRQn); + static HardwareTimer* get_IR_Timer(); void enable(); void disable(); From 79bb804bb424d1fb3927ac0f890b3dca57a302be Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 16 Jan 2025 16:58:38 +0300 Subject: [PATCH 44/69] Update IR-protocol.ino --- IR-protocol.ino | 94 ++++++++++++++++++++++++++++--------------------- 1 file changed, 53 insertions(+), 41 deletions(-) diff --git a/IR-protocol.ino b/IR-protocol.ino index 56005d9..1e9bb6b 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -4,14 +4,14 @@ #include "MemoryCheck.h" /////////////// Pinout /////////////// -#define dec0_PIN PIN_KT1_IN -#define dec1_PIN PIN_KT2_IN -#define dec2_PIN PIN_KT3_IN -#define dec3_PIN PIN_KT4_IN -#define dec4_PIN PIN_KT5_IN -#define dec5_PIN PIN_KT6_IN -#define dec6_PIN PIN_KT7_IN -#define dec7_PIN PIN_KT8_IN +#define dec0_PIN PIN_IR_DEC_FORWARD +// #define dec1_PIN PIN_KT2_IN +// #define dec2_PIN PIN_KT3_IN +// #define dec3_PIN PIN_KT4_IN +// #define dec4_PIN PIN_KT5_IN +// #define dec5_PIN PIN_KT6_IN +// #define dec6_PIN PIN_KT7_IN +// #define dec7_PIN PIN_KT8_IN // #define dec8_PIN PB8 // #define dec9_PIN PB9 // #define dec10_PIN PB10 @@ -43,7 +43,7 @@ //////////////// Var ///////////////// // IR_Encoder encForward(PA5, 42 /* , &decBackward */); -IR_Encoder enc0(PIN_KT8_OUT, 42 /* , &decBackward */); +IR_Encoder enc0(PIN_IR_ENC_FORWARD, 42 /* , &decBackward */); // IR_Encoder enc1(PA1, 127 /* , &decBackward */); // IR_Encoder enc2(PA2, 137 /* , &decBackward */); // IR_Encoder enc3(PA3, 777 /* , &decBackward */); @@ -59,18 +59,19 @@ IR_Encoder enc0(PIN_KT8_OUT, 42 /* , &decBackward */); void EncoderISR() { IR_Encoder::isr(); + digitalToggle(PIN_LED_BACKWARD); } //------------------------------------------------------------------- dec_Ini(0); -dec_Ini(1); -dec_Ini(2); -dec_Ini(3); -dec_Ini(4); -dec_Ini(5); -dec_Ini(6); -dec_Ini(7); +// dec_Ini(1); +// dec_Ini(2); +// dec_Ini(3); +// dec_Ini(4); +// dec_Ini(5); +// dec_Ini(6); +// dec_Ini(7); // dec_Ini(8); // dec_Ini(9); // dec_Ini(10); @@ -181,8 +182,8 @@ Timer t1(500, millis, []() // encBackward.sendData(IR_Broadcast, data2); // encTree.sendData(IR_Broadcast, rawData3); }); -// Timer t2(50, millis, []() -// { digitalToggle(LED_BUILTIN); }); +Timer t2(50, millis, []() + { digitalToggle(PIN_LED_SPECIAL_1); }); Timer signalDetectTimer; ///////////////////////////////////////////////////////////////////// @@ -197,10 +198,17 @@ void setup() NVIC_SetPriority(IRQn_Type::TIM3_IRQn, 0); IR_Timer.resume(); + pinMode(PIN_IR_DEC_FORWARD, INPUT_PULLUP); + pinMode(PIN_LED_BACKWARD, OUTPUT); + pinMode(PIN_LED_FORWARD, OUTPUT); + + pinMode(PIN_LED_SPECIAL_1, OUTPUT); // test + pinMode(PIN_LED_SPECIAL_2, OUTPUT); // test + Serial.begin(SERIAL_SPEED); Serial.println(F(INFO)); - pinMode(LoopOut, OUTPUT); + // pinMode(LoopOut, OUTPUT); // pinMode(SignalDetectLed, OUTPUT); pinMode(dec0_PIN, INPUT_PULLUP); @@ -208,13 +216,13 @@ void setup() static IR_DecoderRaw *blind[]{ &dec0, - &dec1, - &dec2, - &dec3, - &dec4, - &dec5, - &dec6, - &dec7, + // &dec1, + // &dec2, + // &dec3, + // &dec4, + // &dec5, + // &dec6, + // &dec7, // &dec8, // &dec9, // &dec10, @@ -230,13 +238,13 @@ void setup() // enc10.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); decSetup(0); - decSetup(1); - decSetup(2); - decSetup(3); - decSetup(4); - decSetup(5); - decSetup(6); - decSetup(7); + // decSetup(1); + // decSetup(2); + // decSetup(3); + // decSetup(4); + // decSetup(5); + // decSetup(6); + // decSetup(7); // decSetup(8); // decSetup(9); // decSetup(10); @@ -247,20 +255,21 @@ void setup() void loop() { - digitalToggle(LoopOut); + // digitalToggle(LoopOut); + digitalWrite(PIN_LED_SPECIAL_2, digitalRead(PIN_IR_DEC_FORWARD)); Timer::tick(); IR_Decoder::tick(); bool rx_flag; decStat(0); - decStat(1); - decStat(2); - decStat(3); - decStat(4); - decStat(5); - decStat(6); - decStat(7); + // decStat(1); + // decStat(2); + // decStat(3); + // decStat(4); + // decStat(5); + // decStat(6); + // decStat(7); // decStat(8); // decStat(9); // decStat(10); @@ -318,6 +327,9 @@ void detectSignal() // digitalWrite(SignalDetectLed, HIGH); // signalDetectTimer.delay(50, millis, []() // { digitalWrite(SignalDetectLed, LOW); }); + + digitalToggle(PIN_LED_FORWARD); + } // test From 591727546e1607595576dbe49f531d150eafda2b Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 16 Jan 2025 17:02:42 +0300 Subject: [PATCH 45/69] Update .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index bf27854..9403dff 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .vscode/* bin/* !.vscode/launch.json -log/* \ No newline at end of file +log/* +/.vscode From 98a21f5e56ffd6825bd84535bbc91806e43479ac Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 16 Jan 2025 17:02:51 +0300 Subject: [PATCH 46/69] Update arduino.json --- .vscode/arduino.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.vscode/arduino.json b/.vscode/arduino.json index d14354b..3d8ebd7 100644 --- a/.vscode/arduino.json +++ b/.vscode/arduino.json @@ -1,7 +1,5 @@ { "board": "STMicroelectronics:stm32:GenF4", "port": "COM17", - "prebuild": "if exist bin rd /s /q bin", - "sketch": "IR-protocol.ino", - "configuration": "clock=25MHz,pnum=MAKET_F401RETX,upload_method=dfuMethod,xserial=generic,usb=CDCgen,xusb=FS,opt=osstd,dbg=none,rtlib=nano" + "prebuild": "if exist bin rd /s /q bin" } \ No newline at end of file From b6b9d2c82093930d605c4bdcc594910146dcaa91 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 16 Jan 2025 17:51:21 +0300 Subject: [PATCH 47/69] enable/disable fix --- IR_Decoder.cpp | 2 ++ IR_Encoder.cpp | 12 ++++-------- IR_config.cpp | 1 - 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/IR_Decoder.cpp b/IR_Decoder.cpp index 63d4d7a..a8d5035 100644 --- a/IR_Decoder.cpp +++ b/IR_Decoder.cpp @@ -23,12 +23,14 @@ void IR_Decoder::enable() { dec_list.push_back(this); } + pinMode(pin, INPUT_PULLUP); attachInterrupt(pin, (*this)(), CHANGE); } void IR_Decoder::disable() { detachInterrupt(pin); + pinMode(pin, INPUT); auto &dec_list = get_dec_list(); auto it = std::find(dec_list.begin(), dec_list.end(), this); if (it != dec_list.end()) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index f988ee4..11af94e 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -29,7 +29,6 @@ IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool { decPair->encoder = this; } - pinMode(pin, OUTPUT); if (autoHandle) { @@ -37,12 +36,6 @@ IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool } }; - -void WEAK EncoderISR() -{ - IR_Encoder::isr(); -} - HardwareTimer IR_Encoder::IR_Timer; inline HardwareTimer* IR_Encoder::get_IR_Timer(){return &IR_Encoder::IR_Timer;} @@ -50,7 +43,7 @@ inline HardwareTimer* IR_Encoder::get_IR_Timer(){return &IR_Encoder::IR_Timer;} void IR_Encoder::begin(HardwareTimer timer, uint8_t channel, IRQn_Type IRQn){ IR_Timer = timer; IR_Timer.setOverflow(carrierFrec * 2, HERTZ_FORMAT); - IR_Timer.attachInterrupt(channel, EncoderISR); + IR_Timer.attachInterrupt(channel, IR_Encoder::isr); NVIC_SetPriority(IRQn, 0); IR_Timer.resume(); } @@ -63,6 +56,8 @@ void IR_Encoder::enable() { enc_list.push_back(this); } + pinMode(pin, OUTPUT); + } void IR_Encoder::disable() @@ -73,6 +68,7 @@ void IR_Encoder::disable() { enc_list.erase(it); } + pinMode(pin, INPUT); } void IR_Encoder::setBlindDecoders(IR_DecoderRaw *decoders[], uint8_t count) diff --git a/IR_config.cpp b/IR_config.cpp index 7acf1bc..9ddae25 100644 --- a/IR_config.cpp +++ b/IR_config.cpp @@ -4,7 +4,6 @@ void IR_FOX::setPin(uint8_t pin){ this->pin = pin; port = digitalPinToPort(pin); mask = digitalPinToBitMask(pin); - pinMode(pin, INPUT_PULLUP); } void IR_FOX::checkAddressRuleApply(uint16_t address, uint16_t id, bool &flag) From 71f58a49926fff1496a877bc6078c2c60b07b93a Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 16 Jan 2025 17:53:05 +0300 Subject: [PATCH 48/69] Revert "Update IR-protocol.ino" This reverts commit 79bb804bb424d1fb3927ac0f890b3dca57a302be. --- IR-protocol.ino | 94 +++++++++++++++++++++---------------------------- 1 file changed, 41 insertions(+), 53 deletions(-) diff --git a/IR-protocol.ino b/IR-protocol.ino index 1e9bb6b..56005d9 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -4,14 +4,14 @@ #include "MemoryCheck.h" /////////////// Pinout /////////////// -#define dec0_PIN PIN_IR_DEC_FORWARD -// #define dec1_PIN PIN_KT2_IN -// #define dec2_PIN PIN_KT3_IN -// #define dec3_PIN PIN_KT4_IN -// #define dec4_PIN PIN_KT5_IN -// #define dec5_PIN PIN_KT6_IN -// #define dec6_PIN PIN_KT7_IN -// #define dec7_PIN PIN_KT8_IN +#define dec0_PIN PIN_KT1_IN +#define dec1_PIN PIN_KT2_IN +#define dec2_PIN PIN_KT3_IN +#define dec3_PIN PIN_KT4_IN +#define dec4_PIN PIN_KT5_IN +#define dec5_PIN PIN_KT6_IN +#define dec6_PIN PIN_KT7_IN +#define dec7_PIN PIN_KT8_IN // #define dec8_PIN PB8 // #define dec9_PIN PB9 // #define dec10_PIN PB10 @@ -43,7 +43,7 @@ //////////////// Var ///////////////// // IR_Encoder encForward(PA5, 42 /* , &decBackward */); -IR_Encoder enc0(PIN_IR_ENC_FORWARD, 42 /* , &decBackward */); +IR_Encoder enc0(PIN_KT8_OUT, 42 /* , &decBackward */); // IR_Encoder enc1(PA1, 127 /* , &decBackward */); // IR_Encoder enc2(PA2, 137 /* , &decBackward */); // IR_Encoder enc3(PA3, 777 /* , &decBackward */); @@ -59,19 +59,18 @@ IR_Encoder enc0(PIN_IR_ENC_FORWARD, 42 /* , &decBackward */); void EncoderISR() { IR_Encoder::isr(); - digitalToggle(PIN_LED_BACKWARD); } //------------------------------------------------------------------- dec_Ini(0); -// dec_Ini(1); -// dec_Ini(2); -// dec_Ini(3); -// dec_Ini(4); -// dec_Ini(5); -// dec_Ini(6); -// dec_Ini(7); +dec_Ini(1); +dec_Ini(2); +dec_Ini(3); +dec_Ini(4); +dec_Ini(5); +dec_Ini(6); +dec_Ini(7); // dec_Ini(8); // dec_Ini(9); // dec_Ini(10); @@ -182,8 +181,8 @@ Timer t1(500, millis, []() // encBackward.sendData(IR_Broadcast, data2); // encTree.sendData(IR_Broadcast, rawData3); }); -Timer t2(50, millis, []() - { digitalToggle(PIN_LED_SPECIAL_1); }); +// Timer t2(50, millis, []() +// { digitalToggle(LED_BUILTIN); }); Timer signalDetectTimer; ///////////////////////////////////////////////////////////////////// @@ -198,17 +197,10 @@ void setup() NVIC_SetPriority(IRQn_Type::TIM3_IRQn, 0); IR_Timer.resume(); - pinMode(PIN_IR_DEC_FORWARD, INPUT_PULLUP); - pinMode(PIN_LED_BACKWARD, OUTPUT); - pinMode(PIN_LED_FORWARD, OUTPUT); - - pinMode(PIN_LED_SPECIAL_1, OUTPUT); // test - pinMode(PIN_LED_SPECIAL_2, OUTPUT); // test - Serial.begin(SERIAL_SPEED); Serial.println(F(INFO)); - // pinMode(LoopOut, OUTPUT); + pinMode(LoopOut, OUTPUT); // pinMode(SignalDetectLed, OUTPUT); pinMode(dec0_PIN, INPUT_PULLUP); @@ -216,13 +208,13 @@ void setup() static IR_DecoderRaw *blind[]{ &dec0, - // &dec1, - // &dec2, - // &dec3, - // &dec4, - // &dec5, - // &dec6, - // &dec7, + &dec1, + &dec2, + &dec3, + &dec4, + &dec5, + &dec6, + &dec7, // &dec8, // &dec9, // &dec10, @@ -238,13 +230,13 @@ void setup() // enc10.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); decSetup(0); - // decSetup(1); - // decSetup(2); - // decSetup(3); - // decSetup(4); - // decSetup(5); - // decSetup(6); - // decSetup(7); + decSetup(1); + decSetup(2); + decSetup(3); + decSetup(4); + decSetup(5); + decSetup(6); + decSetup(7); // decSetup(8); // decSetup(9); // decSetup(10); @@ -255,21 +247,20 @@ void setup() void loop() { - // digitalToggle(LoopOut); - digitalWrite(PIN_LED_SPECIAL_2, digitalRead(PIN_IR_DEC_FORWARD)); + digitalToggle(LoopOut); Timer::tick(); IR_Decoder::tick(); bool rx_flag; decStat(0); - // decStat(1); - // decStat(2); - // decStat(3); - // decStat(4); - // decStat(5); - // decStat(6); - // decStat(7); + decStat(1); + decStat(2); + decStat(3); + decStat(4); + decStat(5); + decStat(6); + decStat(7); // decStat(8); // decStat(9); // decStat(10); @@ -327,9 +318,6 @@ void detectSignal() // digitalWrite(SignalDetectLed, HIGH); // signalDetectTimer.delay(50, millis, []() // { digitalWrite(SignalDetectLed, LOW); }); - - digitalToggle(PIN_LED_FORWARD); - } // test From ecfb3b5f98a83f3ab712540b8a449bd4f477e9e2 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Fri, 17 Jan 2025 19:11:05 +0300 Subject: [PATCH 49/69] downgrade --- IR_Encoder.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 11af94e..8a1c3a6 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -39,13 +39,16 @@ IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool HardwareTimer IR_Encoder::IR_Timer; inline HardwareTimer* IR_Encoder::get_IR_Timer(){return &IR_Encoder::IR_Timer;} - +// void Encoder_ISR(){ +// IR_Encoder::isr(); +// } void IR_Encoder::begin(HardwareTimer timer, uint8_t channel, IRQn_Type IRQn){ - IR_Timer = timer; - IR_Timer.setOverflow(carrierFrec * 2, HERTZ_FORMAT); - IR_Timer.attachInterrupt(channel, IR_Encoder::isr); - NVIC_SetPriority(IRQn, 0); - IR_Timer.resume(); + //TODO: check std::bind isr func + // IR_Timer = timer; + // IR_Timer.setOverflow(carrierFrec * 2, HERTZ_FORMAT); + // IR_Timer.attachInterrupt(channel, Encoder_ISR); + // NVIC_SetPriority(IRQn, 0); + // IR_Timer.resume(); } From 30ad816c2a85b1a07e2b731c9e632bcea067745f Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 22 Jan 2025 17:31:14 +0300 Subject: [PATCH 50/69] fix redifinded --- IR_config.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/IR_config.h b/IR_config.h index 4fb7581..f3f493a 100644 --- a/IR_config.h +++ b/IR_config.h @@ -57,9 +57,9 @@ msg type: #define IR_MSG_BACK 0U // | 000...... | = Задний сигнал машинки #define IR_MSG_ACCEPT 1U // | 001..... | = подтверждение #define IR_MSG_REQUEST 2U // | 010..... | = запрос -#define IR_MSG_ 3U // | 011..... | = ?? +// #define IR_MSG_ 3U // | 011..... | = ?? #define IR_MSG_BACK_TO 4U // | 100..... | = Задний сигнал машинки c адресацией -#define IR_MSG_ 5U // | 101..... | = ?? +// #define IR_MSG_ 5U // | 101..... | = ?? #define IR_MSG_DATA_NOACCEPT 6U // | 110..... | = данные, не требующие подтверждения #define IR_MSG_DATA_ACCEPT 7U // | 111..... | = данные требующие подтверждения ; /*   // ---------- From d1cb167aaff9cba607ab646e92ddd2df7ff16747 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 23 Jan 2025 09:41:10 +0300 Subject: [PATCH 51/69] no define --- .vscode/arduino.json | 4 +- IR-protocol.ino | 180 +++++++++++++++++++++---------------------- 2 files changed, 91 insertions(+), 93 deletions(-) diff --git a/.vscode/arduino.json b/.vscode/arduino.json index 3d8ebd7..b71ec64 100644 --- a/.vscode/arduino.json +++ b/.vscode/arduino.json @@ -1,5 +1,7 @@ { "board": "STMicroelectronics:stm32:GenF4", "port": "COM17", - "prebuild": "if exist bin rd /s /q bin" + "prebuild": "if exist bin rd /s /q bin", + "configuration": "clock=25MHz,pnum=MAKET_F401RETX,upload_method=swdMethod,xserial=generic,usb=CDCgen,xusb=FS,opt=osstd,dbg=none,rtlib=nano", + "sketch": "IR-protocol.ino" } \ No newline at end of file diff --git a/IR-protocol.ino b/IR-protocol.ino index 56005d9..631cf55 100644 --- a/IR-protocol.ino +++ b/IR-protocol.ino @@ -23,18 +23,6 @@ #define LoopOut PC13 -#define dec_ISR(n) \ - void dec_##n##_ISR() { dec##n.isr(); } -#define dec_Ini(n) \ - IR_Decoder dec##n(dec##n##_PIN, n); \ - dec_ISR(n) - -#define decPinMode(n) pinMode(dec##n##_PIN, INPUT_PULLUP); -#define decAttach(n) attachInterrupt(dec##n##_PIN, dec_##n##_ISR, CHANGE); -#define decSetup(n) decPinMode(n); decAttach(n); -#define decTick(n) dec##n.tick(); -#define decStat(n) rx_flag |= status/* Simple */(dec##n); - //////////////// Ini ///////////////// #define INFO "IR_FOX TEST" @@ -63,20 +51,47 @@ void EncoderISR() //------------------------------------------------------------------- -dec_Ini(0); -dec_Ini(1); -dec_Ini(2); -dec_Ini(3); -dec_Ini(4); -dec_Ini(5); -dec_Ini(6); -dec_Ini(7); -// dec_Ini(8); -// dec_Ini(9); -// dec_Ini(10); -// dec_Ini(11); -// dec_Ini(12); -// dec_Ini(13); +IR_Decoder dec0(dec0_PIN, 0); +void dec_0_ISR() { dec0.isr(); } + +IR_Decoder dec1(dec1_PIN, 1); +void dec_1_ISR() { dec1.isr(); } + +IR_Decoder dec2(dec2_PIN, 2); +void dec_2_ISR() { dec2.isr(); } + +IR_Decoder dec3(dec3_PIN, 3); +void dec_3_ISR() { dec3.isr(); } + +IR_Decoder dec4(dec4_PIN, 4); +void dec_4_ISR() { dec4.isr(); } + +IR_Decoder dec5(dec5_PIN, 5); +void dec_5_ISR() { dec5.isr(); } + +IR_Decoder dec6(dec6_PIN, 6); +void dec_6_ISR() { dec6.isr(); } + +IR_Decoder dec7(dec7_PIN, 7); +void dec_7_ISR() { dec7.isr(); } + +// IR_Decoder dec8(dec8_PIN, 8); +// void dec_8_ISR() { dec8.isr(); } + +// IR_Decoder dec9(dec9_PIN, 9); +// void dec_9_ISR() { dec9.isr(); } + +// IR_Decoder dec10(dec10_PIN, 10); +// void dec_10_ISR() { dec10.isr(); } + +// IR_Decoder dec11(dec11_PIN, 11); +// void dec_11_ISR() { dec11.isr(); } + +// IR_Decoder dec12(dec12_PIN, 12); +// void dec_12_ISR() { dec12.isr(); } + +// IR_Decoder dec13(dec13_PIN, 13); +// void dec_13_ISR() { dec13.isr(); } ///////////////////////////////////////////////////////////////////// uint8_t data0[] = {}; @@ -88,6 +103,7 @@ uint8_t data4[] = {42, 127, 137, 255}; uint32_t loopTimer; uint8_t sig = 0; uint16_t targetAddr = IR_Broadcast; + Timer t1(500, millis, []() { // Serial.println( digitalPinToBitMask(enc0.getPin()), BIN); @@ -181,6 +197,7 @@ Timer t1(500, millis, []() // encBackward.sendData(IR_Broadcast, data2); // encTree.sendData(IR_Broadcast, rawData3); }); + // Timer t2(50, millis, []() // { digitalToggle(LED_BUILTIN); }); @@ -190,8 +207,6 @@ HardwareTimer IR_Timer(TIM3); void setup() { - // MicrosTimer.setOve - IR_Timer.setOverflow(carrierFrec * 2, HERTZ_FORMAT); IR_Timer.attachInterrupt(1, EncoderISR); NVIC_SetPriority(IRQn_Type::TIM3_IRQn, 0); @@ -201,79 +216,59 @@ void setup() Serial.println(F(INFO)); pinMode(LoopOut, OUTPUT); - // pinMode(SignalDetectLed, OUTPUT); pinMode(dec0_PIN, INPUT_PULLUP); - // pinMode(dec2_PIN, INPUT_PULLUP); + pinMode(dec1_PIN, INPUT_PULLUP); + pinMode(dec2_PIN, INPUT_PULLUP); + pinMode(dec3_PIN, INPUT_PULLUP); + pinMode(dec4_PIN, INPUT_PULLUP); + pinMode(dec5_PIN, INPUT_PULLUP); + pinMode(dec6_PIN, INPUT_PULLUP); + pinMode(dec7_PIN, INPUT_PULLUP); + // pinMode(dec8_PIN, INPUT_PULLUP); + // pinMode(dec9_PIN, INPUT_PULLUP); + // pinMode(dec10_PIN, INPUT_PULLUP); + // pinMode(dec11_PIN, INPUT_PULLUP); + // pinMode(dec12_PIN, INPUT_PULLUP); + // pinMode(dec13_PIN, INPUT_PULLUP); - static IR_DecoderRaw *blind[]{ - &dec0, - &dec1, - &dec2, - &dec3, - &dec4, - &dec5, - &dec6, - &dec7, - // &dec8, - // &dec9, - // &dec10, - // &dec11, - // &dec12, - // &dec13, - }; - - enc0.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); - // enc1.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); - // enc2.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); - // enc3.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); - // enc10.setBlindDecoders(blind, sizeof(blind) / sizeof(IR_DecoderRaw *)); - - decSetup(0); - decSetup(1); - decSetup(2); - decSetup(3); - decSetup(4); - decSetup(5); - decSetup(6); - decSetup(7); - // decSetup(8); - // decSetup(9); - // decSetup(10); - // decSetup(11); - // decSetup(12); - // decSetup(13); + attachInterrupt(dec0_PIN, dec_0_ISR, CHANGE); + attachInterrupt(dec1_PIN, dec_1_ISR, CHANGE); + attachInterrupt(dec2_PIN, dec_2_ISR, CHANGE); + attachInterrupt(dec3_PIN, dec_3_ISR, CHANGE); + attachInterrupt(dec4_PIN, dec_4_ISR, CHANGE); + attachInterrupt(dec5_PIN, dec_5_ISR, CHANGE); + attachInterrupt(dec6_PIN, dec_6_ISR, CHANGE); + attachInterrupt(dec7_PIN, dec_7_ISR, CHANGE); + // attachInterrupt(dec8_PIN, dec_8_ISR, CHANGE); + // attachInterrupt(dec9_PIN, dec_9_ISR, CHANGE); + // attachInterrupt(dec10_PIN, dec_10_ISR, CHANGE); + // attachInterrupt(dec11_PIN, dec_11_ISR, CHANGE); + // attachInterrupt(dec12_PIN, dec_12_ISR, CHANGE); + // attachInterrupt(dec13_PIN, dec_13_ISR, CHANGE); } void loop() { digitalToggle(LoopOut); Timer::tick(); - IR_Decoder::tick(); - bool rx_flag; - decStat(0); - decStat(1); - decStat(2); - decStat(3); - decStat(4); - decStat(5); - decStat(6); - decStat(7); - // decStat(8); - // decStat(9); - // decStat(10); - // decStat(11); - // decStat(12); - // decStat(13); - - // status(decForward); - // status(decBackward); - - // Serial.println(micros() - loopTimer); - // loopTimer = micros(); - // delayMicroseconds(120*5); + bool rx_flag = false; + rx_flag |= status(dec0); + rx_flag |= status(dec1); + rx_flag |= status(dec2); + rx_flag |= status(dec3); + rx_flag |= status(dec4); + rx_flag |= status(dec5); + rx_flag |= status(dec6); + rx_flag |= status(dec7); + // rx_flag |= status(dec8); + // rx_flag |= status(dec9); + // rx_flag |= status(dec10); + // rx_flag |= status(dec11); + // rx_flag |= status(dec12); + // rx_flag |= status(dec13); if (Serial.available()) { @@ -289,13 +284,14 @@ void loop() case 102: targetAddr = 777; break; - default: sig = in; break; } } } + + Timer statusSimpleDelay; bool statusSimple(IR_Decoder &dec) { @@ -326,7 +322,7 @@ bool status(IR_Decoder &dec) if (dec.gotData.available()) { detectSignal(); - Serial.println(micros()); + // Serial.println(micros()); String str; if (/* dec.gotData.getDataPrt()[1] */ 1) { From 1353ab6f75b48e8bc35ca313057d98c86577c096 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 28 Jan 2025 12:59:42 +0300 Subject: [PATCH 52/69] constexpr IR_ResponseDelay --- IR_Decoder.cpp | 2 +- IR_DecoderRaw.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/IR_Decoder.cpp b/IR_Decoder.cpp index a8d5035..b8381f5 100644 --- a/IR_Decoder.cpp +++ b/IR_Decoder.cpp @@ -97,7 +97,7 @@ void IR_Decoder::_tick() } gotRaw.set(&packInfo, id); } - if (isWaitingAcceptSend && millis() - acceptSendTimer > 75) + if (isWaitingAcceptSend && millis() - acceptSendTimer > acceptDelay) { encoder->sendAccept(addrAcceptSendTo, acceptCustomByte); isWaitingAcceptSend = false; diff --git a/IR_DecoderRaw.h b/IR_DecoderRaw.h index 90929e1..b5ad407 100644 --- a/IR_DecoderRaw.h +++ b/IR_DecoderRaw.h @@ -23,6 +23,7 @@ #define riseTimeMin (riseTime - riseTolerance) #define aroundRise(t) (riseTimeMin < t && t < riseTimeMax) #define IR_timeout (riseTimeMax * (8 + syncBits + 1)) // us // таймаут в 8 data + 3 sync + 1 +constexpr uint16_t IR_ResponseDelay = ((uint16_t)(((bitTime+riseTolerance) * (8 + syncBits + 1))*2.7735))/1000; class IR_Encoder; class IR_DecoderRaw : virtual public IR_FOX From 2db1ef780568f17b9f23c097fd0a19148b6651fe Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 28 Jan 2025 12:59:53 +0300 Subject: [PATCH 53/69] test --- IR_Decoder.h | 2 +- IR_Encoder.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/IR_Decoder.h b/IR_Decoder.h index bff9666..9f616f5 100644 --- a/IR_Decoder.h +++ b/IR_Decoder.h @@ -14,7 +14,7 @@ private: bool isWaitingAcceptSend; uint16_t addrAcceptSendTo; - uint16_t acceptDelay = 75; + uint16_t acceptDelay = IR_ResponseDelay; uint8_t acceptCustomByte; public: diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 8a1c3a6..84d2f90 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -247,6 +247,10 @@ void IR_Encoder::setDecoder_isSending() for (uint8_t i = 0; i < decodersCount; i++) { blindDecoders[i]->isPairSending ^= id; + // Serial.print("setDecoder_isSending() id = "); + // Serial.print(id); + // Serial.print(" isPairSending = "); + // Serial.println(blindDecoders[i]->isPairSending); } } } @@ -258,7 +262,7 @@ void IR_Encoder::rawSend(uint8_t *ptr, uint8_t len) // TODO: Обработка повторной отправки return; } - + // Serial.println("START"); setDecoder_isSending(); // noInterrupts(); @@ -314,7 +318,9 @@ void IR_Encoder::_isr() // сброс счетчиков // ... isSending = false; + Serial.println("STOP"); setDecoder_isSending(); + Serial.println(); return; break; From 444b84c31365f769366cf258c91895ebc45d9ece Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 28 Jan 2025 17:43:46 +0300 Subject: [PATCH 54/69] hide test prints --- IR_Encoder.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 84d2f90..75565d2 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -318,9 +318,9 @@ void IR_Encoder::_isr() // сброс счетчиков // ... isSending = false; - Serial.println("STOP"); + // Serial.println("STOP"); setDecoder_isSending(); - Serial.println(); + // Serial.println(); return; break; From 277985f79a97b1f6040e2a87ec42b0aef93bbc06 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 30 Jan 2025 16:17:45 +0300 Subject: [PATCH 55/69] update ir adress space --- .vscode/arduino.json | 4 +--- IR_config.h | 8 ++++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.vscode/arduino.json b/.vscode/arduino.json index b71ec64..3d8ebd7 100644 --- a/.vscode/arduino.json +++ b/.vscode/arduino.json @@ -1,7 +1,5 @@ { "board": "STMicroelectronics:stm32:GenF4", "port": "COM17", - "prebuild": "if exist bin rd /s /q bin", - "configuration": "clock=25MHz,pnum=MAKET_F401RETX,upload_method=swdMethod,xserial=generic,usb=CDCgen,xusb=FS,opt=osstd,dbg=none,rtlib=nano", - "sketch": "IR-protocol.ino" + "prebuild": "if exist bin rd /s /q bin" } \ No newline at end of file diff --git a/IR_config.h b/IR_config.h index f3f493a..a5f6c3e 100644 --- a/IR_config.h +++ b/IR_config.h @@ -15,7 +15,7 @@ IR_MSG_ACCEPT с адреса 0 воспринимается всеми устройствами */ //**** Контрольные точки ****** -#define IR_MAX_ADDR_CPU 64999 +#define IR_MAX_ADDR_CPU 63999 #define IR_MIN_ADDR_CPU 32000 // //***** Группы машинок ******** @@ -28,11 +28,11 @@ //********* Машинки *********** #define IR_MAX_CAR 31999 -#define IR_MIN_CAR 100 +#define IR_MIN_CAR 1 //***** Пульты управления ***** -#define IR_MAX_CONTROLLER 99 -#define IR_MIN_CONTROLLER 0 +#define IR_MAX_CONTROLLER 64999 +#define IR_MIN_CONTROLLER 64000 /* /```````````````````````````````````````````````` data pack `````````````````````````````````````````````\                                   From aa0b478229194b19c8944d4b53800ab59228222b Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 25 Feb 2025 15:17:09 +0300 Subject: [PATCH 56/69] faster for each --- IR_Encoder.cpp | 82 +++++++++++++++++++++++++++++++++++++------------- IR_Encoder.h | 5 +-- 2 files changed, 64 insertions(+), 23 deletions(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 75565d2..50c9e57 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -5,11 +5,8 @@ #define ISR_Out 10 #define TestOut 13 -std::list &IR_Encoder::get_enc_list() // определение функции -{ - static std::list dec_list; // статическая локальная переменная - return dec_list; // возвращается ссылка на переменную -} +IR_Encoder *IR_Encoder::head = nullptr; +IR_Encoder *IR_Encoder::last = nullptr; IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool autoHandle) { @@ -32,7 +29,15 @@ IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool if (autoHandle) { - get_enc_list().push_back(this); + if (IR_Encoder::head == nullptr) + { + IR_Encoder::head = this; + } + if (last != nullptr) + { + last->next = this; + } + last = this; } }; @@ -54,23 +59,60 @@ void IR_Encoder::begin(HardwareTimer timer, uint8_t channel, IRQn_Type IRQn){ void IR_Encoder::enable() { - auto &enc_list = get_enc_list(); - if (std::find(enc_list.begin(), enc_list.end(), this) == enc_list.end()) + bool exist = false; + IR_Encoder *current = IR_Encoder::head; + while (current != nullptr) { - enc_list.push_back(this); + exist = (current == this); + if (exist) break; + current = current->next; + } + if (!exist) + { + if (IR_Encoder::head == nullptr) + { + IR_Encoder::head = this; + last = this; + } + else + { + last->next = this; + last = this; + } + this->next = nullptr; // Указываем, что следующий за этим элементом — nullptr } pinMode(pin, OUTPUT); - } void IR_Encoder::disable() { - auto &enc_list = get_enc_list(); - auto it = std::find(enc_list.begin(), enc_list.end(), this); - if (it != enc_list.end()) + IR_Encoder *current = IR_Encoder::head; + IR_Encoder *prev = nullptr; + + while (current != nullptr) { - enc_list.erase(it); + if (current == this) break; + prev = current; + current = current->next; } + + if (current != nullptr) // Элемент найден в списке + { + if (prev != nullptr) + { + prev->next = current->next; // Убираем текущий элемент из списка + } + else + { + IR_Encoder::head = current->next; // Удаляемый элемент был первым + } + + if (current == last) + { + last = prev; // Если удаляется последний элемент, обновляем last + } + } + pinMode(pin, INPUT); } @@ -84,10 +126,7 @@ void IR_Encoder::setBlindDecoders(IR_DecoderRaw *decoders[], uint8_t count) blindDecoders = decoders; } -IR_Encoder::~IR_Encoder() -{ - get_enc_list().remove(this); -}; +IR_Encoder::~IR_Encoder(){}; void IR_Encoder::sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept) { @@ -287,10 +326,11 @@ void IR_Encoder::rawSend(uint8_t *ptr, uint8_t len) void IR_Encoder::isr() { - // Serial.println(get_enc_list().size()); - for (const auto &element : get_enc_list()) + IR_Encoder *current = IR_Encoder::head; + while (current != nullptr) { - element->_isr(); + current->_isr(); + current = current->next; } } diff --git a/IR_Encoder.h b/IR_Encoder.h index 0540fae..4676827 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -7,7 +7,9 @@ class IR_DecoderRaw; class IR_Encoder : public IR_FOX { friend IR_DecoderRaw; - + static IR_Encoder *head; + static IR_Encoder *last; + IR_Encoder *next; public: static HardwareTimer IR_Timer; private: @@ -45,7 +47,6 @@ public: volatile bool ir_out_virtual; private: - static std::list& get_enc_list(); void _sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len); void _isr(); From 6ba8fdffe43c88b92bed7940d743b91ff8a42b84 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 25 Feb 2025 18:05:10 +0300 Subject: [PATCH 57/69] auto begin --- IR_Encoder.cpp | 22 ++++++++++------------ IR_Encoder.h | 6 +++--- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 50c9e57..bd56b2d 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -40,20 +40,18 @@ IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool last = this; } }; + +HardwareTimer* IR_Encoder::IR_Timer = nullptr; -HardwareTimer IR_Encoder::IR_Timer; +inline HardwareTimer* IR_Encoder::get_IR_Timer(){return IR_Encoder::IR_Timer;} -inline HardwareTimer* IR_Encoder::get_IR_Timer(){return &IR_Encoder::IR_Timer;} -// void Encoder_ISR(){ -// IR_Encoder::isr(); -// } -void IR_Encoder::begin(HardwareTimer timer, uint8_t channel, IRQn_Type IRQn){ - //TODO: check std::bind isr func - // IR_Timer = timer; - // IR_Timer.setOverflow(carrierFrec * 2, HERTZ_FORMAT); - // IR_Timer.attachInterrupt(channel, Encoder_ISR); - // NVIC_SetPriority(IRQn, 0); - // IR_Timer.resume(); +void IR_Encoder::begin(HardwareTimer* timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority){ + IR_Timer = timer; + if(IR_Timer == nullptr) return; + IR_Timer->setOverflow(carrierFrec * 2, HERTZ_FORMAT); + IR_Timer->attachInterrupt(channel, IR_Encoder::isr); + NVIC_SetPriority(IRQn, priority); + IR_Timer->resume(); } diff --git a/IR_Encoder.h b/IR_Encoder.h index 4676827..21bac76 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -11,7 +11,7 @@ class IR_Encoder : public IR_FOX static IR_Encoder *last; IR_Encoder *next; public: - static HardwareTimer IR_Timer; + static HardwareTimer* IR_Timer; private: // uint16_t id; /// @brief Адрес передатчика public: @@ -21,7 +21,7 @@ public: /// @param decPair Приёмник, для которого отключается приём в момент передачи передатчиком IR_Encoder(uint8_t pin, uint16_t addr = 0, IR_DecoderRaw *decPair = nullptr, bool autoHandle = true); static void isr(); - static void begin(HardwareTimer IR_Timer, uint8_t channel, IRQn_Type IRQn); + static void begin(HardwareTimer* IR_Timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority); static HardwareTimer* get_IR_Timer(); void enable(); @@ -46,9 +46,9 @@ public: ~IR_Encoder(); volatile bool ir_out_virtual; + void _isr(); private: void _sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len); - void _isr(); void setDecoder_isSending(); void sendByte(uint8_t byte, bool *prev, bool LOW_FIRST); From 2d839d3ff8a8c825fba66bc6946887216cacb284 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 6 Mar 2025 17:05:37 +0300 Subject: [PATCH 58/69] HardwareTimer auto set support --- IR_Encoder.cpp | 4 ++-- IR_Encoder.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index bd56b2d..d2a9582 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -45,11 +45,11 @@ HardwareTimer* IR_Encoder::IR_Timer = nullptr; inline HardwareTimer* IR_Encoder::get_IR_Timer(){return IR_Encoder::IR_Timer;} -void IR_Encoder::begin(HardwareTimer* timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority){ +void IR_Encoder::begin(HardwareTimer* timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority, void(*isrCallback)()){ IR_Timer = timer; if(IR_Timer == nullptr) return; IR_Timer->setOverflow(carrierFrec * 2, HERTZ_FORMAT); - IR_Timer->attachInterrupt(channel, IR_Encoder::isr); + IR_Timer->attachInterrupt(channel, (isrCallback == nullptr ? IR_Encoder::isr : isrCallback)); NVIC_SetPriority(IRQn, priority); IR_Timer->resume(); } diff --git a/IR_Encoder.h b/IR_Encoder.h index 21bac76..e28914a 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -21,7 +21,7 @@ public: /// @param decPair Приёмник, для которого отключается приём в момент передачи передатчиком IR_Encoder(uint8_t pin, uint16_t addr = 0, IR_DecoderRaw *decPair = nullptr, bool autoHandle = true); static void isr(); - static void begin(HardwareTimer* IR_Timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority); + static void begin(HardwareTimer* timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority, void(*isrCallback)() = nullptr); static HardwareTimer* get_IR_Timer(); void enable(); From 403b8e68502f3f845c68a79ca8727d99b8e4090f Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 12 Mar 2025 15:38:33 +0300 Subject: [PATCH 59/69] isRecive fix --- IR_DecoderRaw.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IR_DecoderRaw.h b/IR_DecoderRaw.h index b5ad407..21c7790 100644 --- a/IR_DecoderRaw.h +++ b/IR_DecoderRaw.h @@ -48,7 +48,7 @@ public: inline bool isOverflow() { return isBufferOverflow; }; // Буффер переполнился bool isSubOverflow(); - inline bool isReciving() { return isBufferOverflow; }; // Возвращает true, если происходит приём пакета + inline bool isReciving() { return isRecive; }; // Возвращает true, если происходит приём пакета ////////////////////////////////////////////////////////////////////////// private: From 89d14919c938773a68e2988e2d61db9922ad2fa2 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 12 Mar 2025 16:15:35 +0300 Subject: [PATCH 60/69] fix isRecive --- IR_DecoderRaw.h | 2 +- IR_config.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/IR_DecoderRaw.h b/IR_DecoderRaw.h index 21c7790..8110251 100644 --- a/IR_DecoderRaw.h +++ b/IR_DecoderRaw.h @@ -48,7 +48,7 @@ public: inline bool isOverflow() { return isBufferOverflow; }; // Буффер переполнился bool isSubOverflow(); - inline bool isReciving() { return isRecive; }; // Возвращает true, если происходит приём пакета + volatile inline bool isReciving() { return isRecive; }; // Возвращает true, если происходит приём пакета ////////////////////////////////////////////////////////////////////////// private: diff --git a/IR_config.h b/IR_config.h index a5f6c3e..80893e4 100644 --- a/IR_config.h +++ b/IR_config.h @@ -122,7 +122,7 @@ typedef uint16_t crc_t; #endif #ifndef subBufferSize -#define subBufferSize 50 // Буфер для складирования фронтов, пока их не обработают (передатчик) +#define subBufferSize 250 // Буфер для складирования фронтов, пока их не обработают (передатчик) #endif #define preambPulse 3 From 021e1e290d751cbf1095aee579fa094b90e2f2f8 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 22 May 2025 12:08:22 +0300 Subject: [PATCH 61/69] fix isRX flag --- IR_DecoderRaw.cpp | 41 ++++++++++++++++++++++++++++++++++++++--- IR_DecoderRaw.h | 6 +++++- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index ef74883..d748143 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -112,16 +112,36 @@ void IR_DecoderRaw::firstRX() void IR_DecoderRaw::listenStart() { - if (isRecive && ((micros() - prevRise) > IR_timeout * 2)) + if (isReciveRaw && ((micros() - prevRise) > IR_timeout * 2)) { // Serial.print("\nlis>"); - isRecive = false; + isReciveRaw = false; firstRX(); } } + +// ---- быстрая проверка конца пакета --------------------------------- +inline void IR_DecoderRaw::checkTimeout() +{ + if (!isRecive) return; // уже не принимаем – нечего проверять + + if (micros() - lastEdgeTime > IR_timeout * 2U) + { + isRecive = false; // приём завершён + // firstRX(); // подготовка к новому пакету + lastEdgeTime = micros(); // защита от повторного срабатывания + } +} +// ==================================================================== + void IR_DecoderRaw::tick() { + // FrontStorage *currentFrontPtr; + // noInterrupts(); + // currentFrontPtr = subBuffer.pop(); + // interrupts(); + FrontStorage currentFront; noInterrupts(); listenStart(); @@ -130,12 +150,24 @@ void IR_DecoderRaw::tick() if (currentFrontPtr == nullptr) { isSubBufferOverflow = false; + checkTimeout(); // <--- новое место проверки interrupts(); return; } // Если данных нет - ничего не делаем currentFront = *currentFrontPtr; interrupts(); + // ---------- буфер пуст: фронтов нет, проверяем тайм-аут ---------- + // if (currentFrontPtr == nullptr) + // { + // isSubBufferOverflow = false; + // return; + // } + + // // ---------- есть фронт: продолжаем обработку ---------- + // FrontStorage currentFront = *currentFrontPtr; + lastEdgeTime = currentFront.time; // запоминаем любой фронт + //////////////////////////////////////////////////////////////////////////////////////////////////////////// if (currentFront.dir) @@ -197,7 +229,7 @@ void IR_DecoderRaw::tick() digitalWrite(errOut, currentFront.dir); #endif - if (currentFront.time > prevRise && currentFront.time - prevRise > IR_timeout * 2 && !isRecive) + if (currentFront.time > prevRise && currentFront.time - prevRise > IR_timeout * 2 && !isReciveRaw) { // первый #ifdef IRDEBUG errPulse(up, 50); @@ -209,6 +241,7 @@ void IR_DecoderRaw::tick() isPreamb = true; isRecive = true; + isReciveRaw = true; isWrongPack = false; } @@ -441,6 +474,7 @@ void IR_DecoderRaw::writeToBuffer(bool bit) if (isBufferOverflow || isPreamb || isWrongPack) { isRecive = false; + isReciveRaw = false; return; } @@ -564,6 +598,7 @@ void IR_DecoderRaw::writeToBuffer(bool bit) packInfo.rTime = riseSyncTime; isRecive = false; + isReciveRaw = false; isAvailable = crcCheck(packSize - crcBytes, crcValue); #ifdef BRUTEFORCE_CHECK diff --git a/IR_DecoderRaw.h b/IR_DecoderRaw.h index 8110251..5e9d2b0 100644 --- a/IR_DecoderRaw.h +++ b/IR_DecoderRaw.h @@ -65,6 +65,8 @@ private: uint16_t riseSyncTime = bitTime; // Подстраиваемое время бита в мкс + volatile uint32_t lastEdgeTime = 0; // время последнего фронта + //////////////////////////////////////////////////////////////////////// volatile uint32_t currentSubBufferIndex; // Счетчик текущей позиции во вспомогательном буфере фронтов/спадов @@ -100,7 +102,9 @@ private: int16_t bufBitPos = 0; // Позиция для записи бита в буффер private: - void listenStart(); // @brief Слушатель для работы isReciving() +bool isReciveRaw; + void listenStart(); + void checkTimeout(); // /// @brief Проверка CRC. Проверяет len байт со значением crc, пришедшим в пакете /// @param len Длина в байтах проверяемых данных From bc9563fbb579ddfbc006f464c39db87cfeb7c54a Mon Sep 17 00:00:00 2001 From: DashyFox Date: Fri, 23 May 2025 11:43:51 +0300 Subject: [PATCH 62/69] isReceive type --- IR_Decoder.cpp | 7 ++++++- IR_Decoder.h | 2 ++ IR_DecoderRaw.cpp | 9 +++++++++ IR_DecoderRaw.h | 7 ++++--- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/IR_Decoder.cpp b/IR_Decoder.cpp index b8381f5..211dfda 100644 --- a/IR_Decoder.cpp +++ b/IR_Decoder.cpp @@ -61,6 +61,7 @@ void IR_Decoder::tick() void IR_Decoder::_tick() { IR_DecoderRaw::tick(); + if (availableRaw()) { #ifdef IRDEBUG_INFO @@ -102,4 +103,8 @@ void IR_Decoder::_tick() encoder->sendAccept(addrAcceptSendTo, acceptCustomByte); isWaitingAcceptSend = false; } -} \ No newline at end of file +} + +bool IR_Decoder::isReceive(uint8_t type) { + return (msgTypeReceive & 0b11111000) && ((msgTypeReceive & IR_MASK_MSG_TYPE) == type); +} diff --git a/IR_Decoder.h b/IR_Decoder.h index 9f616f5..3344562 100644 --- a/IR_Decoder.h +++ b/IR_Decoder.h @@ -31,6 +31,8 @@ public: void enable(); void disable(); + + bool isReceive(uint8_t type); ~IR_Decoder(); diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index d748143..5cfd3ce 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -129,6 +129,7 @@ inline void IR_DecoderRaw::checkTimeout() if (micros() - lastEdgeTime > IR_timeout * 2U) { isRecive = false; // приём завершён + msgTypeReceive = 0; // firstRX(); // подготовка к новому пакету lastEdgeTime = micros(); // защита от повторного срабатывания } @@ -475,6 +476,7 @@ void IR_DecoderRaw::writeToBuffer(bool bit) { isRecive = false; isReciveRaw = false; + msgTypeReceive = 0; return; } @@ -599,6 +601,7 @@ void IR_DecoderRaw::writeToBuffer(bool bit) isRecive = false; isReciveRaw = false; + msgTypeReceive = 0; isAvailable = crcCheck(packSize - crcBytes, crcValue); #ifdef BRUTEFORCE_CHECK @@ -629,6 +632,12 @@ void IR_DecoderRaw::writeToBuffer(bool bit) OUT_BRUTEFORCE:; #endif } + + if (packSize && (i_dataBuffer == 8)) { + msgTypeReceive = (dataBuffer[0]>>5) | 0b11111000; + // SerialUSB.println(msgTypeReceive & IR_MASK_MSG_TYPE); + + } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/IR_DecoderRaw.h b/IR_DecoderRaw.h index 5e9d2b0..7361982 100644 --- a/IR_DecoderRaw.h +++ b/IR_DecoderRaw.h @@ -31,9 +31,10 @@ class IR_DecoderRaw : virtual public IR_FOX friend IR_Encoder; protected: - PackInfo packInfo; - IR_Encoder *encoder; // Указатель на парный передатчик - bool availableRaw(); +PackInfo packInfo; +uint8_t msgTypeReceive = 0; +IR_Encoder *encoder; // Указатель на парный передатчик +bool availableRaw(); public: ////////////////////////////////////////////////////////////////////////// From dec846728055f50c0a9fa6648b9924cecf460c7b Mon Sep 17 00:00:00 2001 From: DashyFox Date: Fri, 22 Aug 2025 15:33:19 +0300 Subject: [PATCH 63/69] max pack --- IR_Encoder.cpp | 15 +++++++++++++++ IR_config.h | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index d2a9582..f8ab807 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -139,6 +139,7 @@ void IR_Encoder::sendDataFULL(uint16_t addrFrom, uint16_t addrTo, uint8_t *data, { if (len > bytePerPack) { + Serial.println("IR Pack to big"); return; } constexpr uint8_t dataStart = msgBytes + addrBytes + addrBytes; @@ -168,6 +169,19 @@ void IR_Encoder::sendDataFULL(uint16_t addrFrom, uint16_t addrTo, uint8_t *data, sendBuffer[packSize - crcBytes] = crc8(sendBuffer, 0, packSize - crcBytes, poly1) & 0xFF; sendBuffer[packSize - crcBytes + 1] = crc8(sendBuffer, 0, packSize - crcBytes + 1, poly2) & 0xFF; + //* вывод итогового буфера + // Serial.print("IR SEND [len="); + // Serial.print(packSize); + // Serial.print("] : "); + // for (uint8_t i = 0; i < packSize; i++) + // { + // if (sendBuffer[i] < 0x10) + // Serial.print('0'); + // Serial.print(sendBuffer[i], HEX); + // Serial.print(' '); + // } + // Serial.println(); + // if (decPair != nullptr) { // decPair->isWaitingAccept = ((msgType >> 5) & IR_MASK_MSG_TYPE == IR_MSG_DATA_ACCEPT); // if (decPair->isWaitingAccept) { @@ -179,6 +193,7 @@ void IR_Encoder::sendDataFULL(uint16_t addrFrom, uint16_t addrTo, uint8_t *data, rawSend(sendBuffer, packSize); } + void IR_Encoder::sendAccept(uint16_t addrTo, uint8_t customByte) { constexpr uint8_t packsize = msgBytes + addrBytes + 1U + crcBytes; diff --git a/IR_config.h b/IR_config.h index 80893e4..4149f4a 100644 --- a/IR_config.h +++ b/IR_config.h @@ -52,7 +52,7 @@ msg type:                                         // | 01234567 |                                         //  ----------                                         // | xxx..... | = тип сообщения -                                        // | ...xxxxx | = длина (максимум 31 бита) +                                        // | ...xxxxx | = длина (максимум 31 бита) - не больше 24 байт на тело пакета                                         //  ---------- */ #define IR_MSG_BACK 0U // | 000...... | = Задний сигнал машинки #define IR_MSG_ACCEPT 1U // | 001..... | = подтверждение @@ -116,7 +116,7 @@ msg type: typedef uint16_t crc_t; // #define BRUTEFORCE_CHECK // Перепроверяет пакет на 1 битные ошибки //TODO: зависает -#define bytePerPack 16 // колличество байтов в пакете +#define bytePerPack (31) // колличество байтов в пакете #ifndef freeFrec #define freeFrec false #endif From 38f3ecac3ad9ce4acad9826f297f903ef9d179bf Mon Sep 17 00:00:00 2001 From: DashyFox Date: Mon, 25 Aug 2025 13:01:58 +0300 Subject: [PATCH 64/69] isBusy --- IR_Encoder.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/IR_Encoder.h b/IR_Encoder.h index e28914a..8910c12 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -42,6 +42,8 @@ public: void sendBack(uint8_t *data = nullptr, uint8_t len = 0); void sendBackTo(uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0); + inline bool isBusy() const { return isSending;} + ~IR_Encoder(); volatile bool ir_out_virtual; From 7bf71d1d52025e169883e71c5482d71ff43bdddd Mon Sep 17 00:00:00 2001 From: DashyFox Date: Fri, 5 Sep 2025 18:24:19 +0300 Subject: [PATCH 65/69] calculateSendTime (need to fix) --- IR_Encoder.cpp | 141 +++++++++++++++++++++++++++++++++++++++++++------ IR_Encoder.h | 39 ++++++++++---- 2 files changed, 155 insertions(+), 25 deletions(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index f8ab807..9393188 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -38,6 +38,8 @@ IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool last->next = this; } last = this; + + pinMode(pin, OUTPUT); } }; @@ -126,21 +128,21 @@ void IR_Encoder::setBlindDecoders(IR_DecoderRaw *decoders[], uint8_t count) IR_Encoder::~IR_Encoder(){}; -void IR_Encoder::sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept) +IR_SendResult IR_Encoder::sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept) { - sendData(addrTo, &dataByte, 1, needAccept); + return sendData(addrTo, &dataByte, 1, needAccept); } -void IR_Encoder::sendData(uint16_t addrTo, uint8_t *data, uint8_t len, bool needAccept){ - sendDataFULL(id, addrTo, data, len, needAccept); +IR_SendResult IR_Encoder::sendData(uint16_t addrTo, uint8_t *data, uint8_t len, bool needAccept){ + return sendDataFULL(id, addrTo, data, len, needAccept); } -void IR_Encoder::sendDataFULL(uint16_t addrFrom, uint16_t addrTo, uint8_t *data, uint8_t len, bool needAccept) +IR_SendResult IR_Encoder::sendDataFULL(uint16_t addrFrom, uint16_t addrTo, uint8_t *data, uint8_t len, bool needAccept) { if (len > bytePerPack) { Serial.println("IR Pack to big"); - return; + return IR_SendResult(false, 0); } constexpr uint8_t dataStart = msgBytes + addrBytes + addrBytes; memset(sendBuffer, 0x00, dataByteSizeMax); @@ -191,10 +193,14 @@ void IR_Encoder::sendDataFULL(uint16_t addrFrom, uint16_t addrTo, uint8_t *data, // отправка rawSend(sendBuffer, packSize); + + // Возвращаем результат отправки + uint32_t sendTime = calculateSendTime(packSize); + return IR_SendResult(true, sendTime); } -void IR_Encoder::sendAccept(uint16_t addrTo, uint8_t customByte) +IR_SendResult IR_Encoder::sendAccept(uint16_t addrTo, uint8_t customByte) { constexpr uint8_t packsize = msgBytes + addrBytes + 1U + crcBytes; memset(sendBuffer, 0x00, dataByteSizeMax); @@ -215,9 +221,13 @@ void IR_Encoder::sendAccept(uint16_t addrTo, uint8_t customByte) sendBuffer[5] = crc8(sendBuffer, 0, 5, poly2) & 0xFF; rawSend(sendBuffer, packsize); + + // Возвращаем результат отправки + uint32_t sendTime = calculateSendTime(packsize); + return IR_SendResult(true, sendTime); } -void IR_Encoder::sendRequest(uint16_t addrTo) +IR_SendResult IR_Encoder::sendRequest(uint16_t addrTo) { constexpr uint8_t packsize = msgBytes + addrBytes + addrBytes + crcBytes; memset(sendBuffer, 0x00, dataByteSizeMax); @@ -237,28 +247,32 @@ void IR_Encoder::sendRequest(uint16_t addrTo) sendBuffer[6] = crc8(sendBuffer, 0, 6, poly2) & 0xFF; rawSend(sendBuffer, packsize); + + // Возвращаем результат отправки + uint32_t sendTime = calculateSendTime(packsize); + return IR_SendResult(true, sendTime); } -void IR_Encoder::sendBack(uint8_t data) +IR_SendResult IR_Encoder::sendBack(uint8_t data) { - _sendBack(false, 0, &data, 1); + return _sendBack(false, 0, &data, 1); } -void IR_Encoder::sendBack(uint8_t *data, uint8_t len) +IR_SendResult IR_Encoder::sendBack(uint8_t *data, uint8_t len) { - _sendBack(false, 0, data, len); + return _sendBack(false, 0, data, len); } -void IR_Encoder::sendBackTo(uint16_t addrTo, uint8_t *data, uint8_t len) +IR_SendResult IR_Encoder::sendBackTo(uint16_t addrTo, uint8_t *data, uint8_t len) { - _sendBack(true, addrTo, data, len); + return _sendBack(true, addrTo, data, len); } -void IR_Encoder::_sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len) +IR_SendResult IR_Encoder::_sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len) { if (len > bytePerPack) { - return; + return IR_SendResult(false, 0); } memset(sendBuffer, 0x00, dataByteSizeMax); uint8_t dataStart = msgBytes + addrBytes + (isAdressed ? addrBytes : 0); @@ -290,6 +304,10 @@ void IR_Encoder::_sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint // отправка rawSend(sendBuffer, packSize); + + // Возвращаем результат отправки + uint32_t sendTime = calculateSendTime(packSize); + return IR_SendResult(true, sendTime); } void IR_Encoder::setDecoder_isSending() @@ -314,6 +332,12 @@ void IR_Encoder::rawSend(uint8_t *ptr, uint8_t len) // TODO: Обработка повторной отправки return; } + + // Проверка на переполнение буфера + if (len > dataByteSizeMax) + { + return; + } // Serial.println("START"); setDecoder_isSending(); @@ -498,6 +522,91 @@ uint8_t IR_Encoder::bitLow[2] = { (bitPauseTakts / 2 + bitActiveTakts) * 2 - 1, (bitPauseTakts)-1}; +uint32_t IR_Encoder::calculateSendTime(uint8_t packSize) const +{ + // Расчет времени отправки пакета в миллисекундах + + // Время преамбулы: preambPulse * 2 фронта * bitTakts тактов + uint32_t preambTime = preambPulse * 2 * bitTakts; + + // Время данных: количество бит * bitTakts тактов + uint32_t dataTime = packSize * 8 * bitTakts; + + // Время синхронизации: syncBits * 2 фронта * bitTakts тактов + uint32_t syncTime = syncBits * 2 * bitTakts; + + // Общее время в тактах + uint32_t totalTakts = preambTime + dataTime + syncTime; + + // Конвертируем в миллисекунды + // carrierPeriod - период несущей в микросекундах + // totalTakts * carrierPeriod / 1000 = время в миллисекундах + uint32_t sendTimeMs = (totalTakts * carrierPeriod) / 1000; + + return sendTimeMs; +} + +// Функции для тестирования времени отправки без фактической отправки + +uint32_t IR_Encoder::testSendTime(uint16_t addrTo, uint8_t dataByte, bool needAccept) const +{ + return testSendTime(addrTo, &dataByte, 1, needAccept); +} + +uint32_t IR_Encoder::testSendTime(uint16_t addrTo, uint8_t *data, uint8_t len, bool needAccept) const +{ + return testSendTimeFULL(id, addrTo, data, len, needAccept); +} + +uint32_t IR_Encoder::testSendTimeFULL(uint16_t addrFrom, uint16_t addrTo, uint8_t *data, uint8_t len, bool needAccept) const +{ + if (len > bytePerPack) + { + return 0; // Возвращаем 0 для недопустимого размера + } + + uint8_t packSize = msgBytes + addrBytes + addrBytes + len + crcBytes; + return calculateSendTime(packSize); +} + +uint32_t IR_Encoder::testSendAccept(uint16_t addrTo, uint8_t customByte) const +{ + constexpr uint8_t packsize = msgBytes + addrBytes + 1U + crcBytes; + return calculateSendTime(packsize); +} + +uint32_t IR_Encoder::testSendRequest(uint16_t addrTo) const +{ + constexpr uint8_t packsize = msgBytes + addrBytes + addrBytes + crcBytes; + return calculateSendTime(packsize); +} + +uint32_t IR_Encoder::testSendBack(uint8_t data) const +{ + return testSendBack(false, 0, &data, 1); +} + +uint32_t IR_Encoder::testSendBack(uint8_t *data, uint8_t len) const +{ + return testSendBack(false, 0, data, len); +} + +uint32_t IR_Encoder::testSendBackTo(uint16_t addrTo, uint8_t *data, uint8_t len) const +{ + return testSendBack(true, addrTo, data, len); +} + +uint32_t IR_Encoder::testSendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len) const +{ + if (len > bytePerPack) + { + return 0; // Возвращаем 0 для недопустимого размера + } + + uint8_t packSize = msgBytes + addrBytes + (isAdressed ? addrBytes : 0) + min(uint8_t(1), len) + crcBytes; + return calculateSendTime(packSize); +} + // uint8_t* IR_Encoder::bitHigh = new uint8_t[2]{ // (bitPauseTakts) * 2 - 0, // (bitActiveTakts) * 2 - 0}; diff --git a/IR_Encoder.h b/IR_Encoder.h index 8910c12..39b0334 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -3,6 +3,15 @@ // TODO: Отложенная передача после завершения приема +// Структура для возврата результата отправки +struct IR_SendResult { + bool success; // Флаг успешности отправки + uint32_t sendTimeMs; // Время отправки пакета в миллисекундах + + IR_SendResult(bool success = false, uint32_t sendTimeMs = 0) + : success(success), sendTimeMs(sendTimeMs) {} +}; + class IR_DecoderRaw; class IR_Encoder : public IR_FOX { @@ -30,17 +39,27 @@ public: void setBlindDecoders(IR_DecoderRaw *decoders[], uint8_t count); void rawSend(uint8_t *ptr, uint8_t len); - void sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept = false); - void sendData(uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0, bool needAccept = false); - void sendDataFULL(uint16_t addrFrom, uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0, bool needAccept = false); + IR_SendResult sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept = false); + IR_SendResult sendData(uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0, bool needAccept = false); + IR_SendResult sendDataFULL(uint16_t addrFrom, uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0, bool needAccept = false); - void sendAccept(uint16_t addrTo, uint8_t customByte = 0); - void sendRequest(uint16_t addrTo); + IR_SendResult sendAccept(uint16_t addrTo, uint8_t customByte = 0); + IR_SendResult sendRequest(uint16_t addrTo); - void sendBack(uint8_t data); - void sendBack(uint8_t *data = nullptr, uint8_t len = 0); - void sendBackTo(uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0); + IR_SendResult sendBack(uint8_t data); + IR_SendResult sendBack(uint8_t *data = nullptr, uint8_t len = 0); + IR_SendResult sendBackTo(uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0); + + // Функция для тестирования времени отправки без фактической отправки + uint32_t testSendTime(uint16_t addrTo, uint8_t dataByte, bool needAccept = false) const; + uint32_t testSendTime(uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0, bool needAccept = false) const; + uint32_t testSendTimeFULL(uint16_t addrFrom, uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0, bool needAccept = false) const; + uint32_t testSendAccept(uint16_t addrTo, uint8_t customByte = 0) const; + uint32_t testSendRequest(uint16_t addrTo) const; + uint32_t testSendBack(uint8_t data) const; + uint32_t testSendBack(uint8_t *data = nullptr, uint8_t len = 0) const; + uint32_t testSendBackTo(uint16_t addrTo, uint8_t *data = nullptr, uint8_t len = 0) const; inline bool isBusy() const { return isSending;} @@ -50,11 +69,13 @@ public: void _isr(); private: - void _sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len); + IR_SendResult _sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len); void setDecoder_isSending(); void sendByte(uint8_t byte, bool *prev, bool LOW_FIRST); void addSync(bool *prev, bool *next); + uint32_t calculateSendTime(uint8_t packSize) const; + uint32_t testSendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len) const; void send_HIGH(bool = 1); void send_LOW(); void send_EMPTY(uint8_t count); From e9c568aed251036ae5caba07d13c10e0a68615ce Mon Sep 17 00:00:00 2001 From: DashyFox Date: Fri, 17 Oct 2025 17:25:09 +0300 Subject: [PATCH 66/69] grammar fix --- IR_DecoderRaw.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IR_DecoderRaw.h b/IR_DecoderRaw.h index 7361982..6ce973a 100644 --- a/IR_DecoderRaw.h +++ b/IR_DecoderRaw.h @@ -49,7 +49,7 @@ public: inline bool isOverflow() { return isBufferOverflow; }; // Буффер переполнился bool isSubOverflow(); - volatile inline bool isReciving() { return isRecive; }; // Возвращает true, если происходит приём пакета + volatile inline bool isReceiving() { return isRecive; }; // Возвращает true, если происходит приём пакета ////////////////////////////////////////////////////////////////////////// private: From d1c84ba18a25377e1e9e50ab41a6dee96e55f989 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Fri, 17 Oct 2025 17:28:01 +0300 Subject: [PATCH 67/69] no grammar fix --- IR_DecoderRaw.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IR_DecoderRaw.h b/IR_DecoderRaw.h index 6ce973a..7361982 100644 --- a/IR_DecoderRaw.h +++ b/IR_DecoderRaw.h @@ -49,7 +49,7 @@ public: inline bool isOverflow() { return isBufferOverflow; }; // Буффер переполнился bool isSubOverflow(); - volatile inline bool isReceiving() { return isRecive; }; // Возвращает true, если происходит приём пакета + volatile inline bool isReciving() { return isRecive; }; // Возвращает true, если происходит приём пакета ////////////////////////////////////////////////////////////////////////// private: From 8a0d7f8dbaf3b27a14be3b7e1b48c4b92f4fd9e7 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Fri, 6 Feb 2026 16:06:23 +0300 Subject: [PATCH 68/69] carrierPauseIfIdle/carrierResume --- IR_Encoder.cpp | 26 +++++++++++++++++++++++++- IR_Encoder.h | 5 +++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 9393188..357dc60 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -7,6 +7,7 @@ IR_Encoder *IR_Encoder::head = nullptr; IR_Encoder *IR_Encoder::last = nullptr; +volatile bool IR_Encoder::carrierStopPending = false; IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool autoHandle) { @@ -47,13 +48,34 @@ HardwareTimer* IR_Encoder::IR_Timer = nullptr; inline HardwareTimer* IR_Encoder::get_IR_Timer(){return IR_Encoder::IR_Timer;} +void IR_Encoder::carrierResume() { + if (IR_Timer != nullptr) + IR_Timer->resume(); +} + +void IR_Encoder::carrierPauseIfIdle() { + for (IR_Encoder *p = head; p != nullptr; p = p->next) + if (p->isSending) + return; + if (IR_Timer != nullptr) + IR_Timer->pause(); +} + +void IR_Encoder::tick() { + if (!carrierStopPending) + return; + carrierStopPending = false; + carrierPauseIfIdle(); +} + void IR_Encoder::begin(HardwareTimer* timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority, void(*isrCallback)()){ IR_Timer = timer; if(IR_Timer == nullptr) return; + IR_Timer->pause(); IR_Timer->setOverflow(carrierFrec * 2, HERTZ_FORMAT); IR_Timer->attachInterrupt(channel, (isrCallback == nullptr ? IR_Encoder::isr : isrCallback)); NVIC_SetPriority(IRQn, priority); - IR_Timer->resume(); + IR_Timer->pause(); } @@ -338,6 +360,7 @@ void IR_Encoder::rawSend(uint8_t *ptr, uint8_t len) { return; } + IR_Encoder::carrierResume(); // Serial.println("START"); setDecoder_isSending(); @@ -397,6 +420,7 @@ void IR_Encoder::_isr() isSending = false; // Serial.println("STOP"); setDecoder_isSending(); + carrierStopPending = true; // Serial.println(); return; break; diff --git a/IR_Encoder.h b/IR_Encoder.h index 39b0334..a2ca8ac 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -32,6 +32,8 @@ public: static void isr(); static void begin(HardwareTimer* timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority, void(*isrCallback)() = nullptr); static HardwareTimer* get_IR_Timer(); + /** Call from main loop/tick: if ISR requested carrier stop, pause timer here (not in ISR). */ + static void tick(); void enable(); void disable(); @@ -69,6 +71,9 @@ public: void _isr(); private: + static volatile bool carrierStopPending; + static void carrierResume(); + static void carrierPauseIfIdle(); IR_SendResult _sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len); void setDecoder_isSending(); From fc1a3bacef62d70adfc8d6ca2ebb91c14e008423 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 11 Mar 2026 16:57:55 +0300 Subject: [PATCH 69/69] upd --- IR_Encoder.cpp | 184 ++++++++++++++++++++++++++++++++++++++++++++++++- IR_Encoder.h | 24 ++++++- IR_config.h | 2 + 3 files changed, 208 insertions(+), 2 deletions(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 357dc60..ba663ae 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -1,5 +1,6 @@ #include "IR_Encoder.h" #include "IR_DecoderRaw.h" +#include #define LoopOut 12 #define ISR_Out 10 @@ -45,6 +46,9 @@ IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool }; HardwareTimer* IR_Encoder::IR_Timer = nullptr; +IR_Encoder::ExternalTxStartFn IR_Encoder::externalTxStartFn = nullptr; +IR_Encoder::ExternalTxBusyFn IR_Encoder::externalTxBusyFn = nullptr; +void *IR_Encoder::externalTxCtx = nullptr; inline HardwareTimer* IR_Encoder::get_IR_Timer(){return IR_Encoder::IR_Timer;} @@ -78,6 +82,164 @@ void IR_Encoder::begin(HardwareTimer* timer, uint8_t channel, IRQn_Type IRQn, ui IR_Timer->pause(); } +void IR_Encoder::beginClockOnly(HardwareTimer *timer) +{ + IR_Timer = timer; + if (IR_Timer == nullptr) + return; + IR_Timer->pause(); + IR_Timer->setOverflow(carrierFrec * 2, HERTZ_FORMAT); + IR_Timer->pause(); +} + +void IR_Encoder::setExternalTxBackend(ExternalTxStartFn startFn, ExternalTxBusyFn busyFn, void *ctx) +{ + externalTxStartFn = startFn; + externalTxBusyFn = busyFn; + externalTxCtx = ctx; +} + +void IR_Encoder::externalFinishSend() +{ + if (!isSending) + return; + + // Force output low. + if (port != nullptr) { + port->BSRR = ((uint32_t)mask) << 16; + } + + isSending = false; + setDecoder_isSending(); +} + +size_t IR_Encoder::buildGateRuns(const uint8_t *packet, uint8_t len, IR_TxGateRun *outRuns, size_t maxRuns) +{ + if (packet == nullptr || outRuns == nullptr || maxRuns == 0) + { + return 0; + } + if (len == 0 || len > dataByteSizeMax) + { + return 0; + } + + // Copy into fixed-size buffer to match original encoder behavior (safe reads past sendLen). + uint8_t sendBufferLocal[dataByteSizeMax] = {0}; + memcpy(sendBufferLocal, packet, len); + + uint8_t sendLenLocal = len; + uint8_t toggleCounterLocal = preambToggle; + uint8_t dataBitCounterLocal = bitPerByte - 1; + uint8_t dataByteCounterLocal = 0; + uint8_t preambFrontCounterLocal = preambPulse * 2 - 1; + uint8_t dataSequenceCounterLocal = bitPerByte * 2; + uint8_t syncSequenceCounterLocal = syncBits * 2; + bool syncLastBitLocal = false; + SignalPart signalLocal = preamb; + bool stateLocal = HIGH; + uint8_t *currentBitSequenceLocal = bitHigh; + + size_t runCount = 0; + + while (true) + { + const bool gate = stateLocal; + const uint16_t runLenTicks = (uint16_t)toggleCounterLocal + 1U; + + if (runCount > 0 && outRuns[runCount - 1].gate == gate) + { + outRuns[runCount - 1].lenTicks = (uint16_t)(outRuns[runCount - 1].lenTicks + runLenTicks); + } + else + { + if (runCount >= maxRuns) + { + return 0; + } + outRuns[runCount].gate = gate; + outRuns[runCount].lenTicks = runLenTicks; + runCount++; + } + + // Advance state to the next run boundary (equivalent to ISR iteration when toggleCounter == 0). + while (true) + { + switch (signalLocal) + { + case noSignal: + return runCount; + + case preamb: + if (preambFrontCounterLocal) + { + preambFrontCounterLocal--; + toggleCounterLocal = preambToggle; + break; + } + // End of preamble. + signalLocal = data; + stateLocal = !LOW; + continue; + + case data: + if (dataSequenceCounterLocal) + { + if (!(dataSequenceCounterLocal & 1U)) + { + currentBitSequenceLocal = ((sendBufferLocal[dataByteCounterLocal] >> dataBitCounterLocal) & 1U) ? bitHigh : bitLow; + dataBitCounterLocal--; + } + toggleCounterLocal = currentBitSequenceLocal[!stateLocal]; + dataSequenceCounterLocal--; + break; + } + // End of data byte. + syncLastBitLocal = ((sendBufferLocal[dataByteCounterLocal]) & 1U); + dataByteCounterLocal++; + dataBitCounterLocal = bitPerByte - 1; + dataSequenceCounterLocal = bitPerByte * 2; + signalLocal = sync; + continue; + + case sync: + if (syncSequenceCounterLocal) + { + if (!(syncSequenceCounterLocal & 1U)) + { + if (syncSequenceCounterLocal == 2) + { + currentBitSequenceLocal = ((sendBufferLocal[dataByteCounterLocal]) & 0b10000000) ? bitLow : bitHigh; + } + else + { + currentBitSequenceLocal = syncLastBitLocal ? bitLow : bitHigh; + syncLastBitLocal = !syncLastBitLocal; + } + } + toggleCounterLocal = currentBitSequenceLocal[!stateLocal]; + syncSequenceCounterLocal--; + break; + } + // End of sync. + signalLocal = data; + syncSequenceCounterLocal = syncBits * 2; + if (dataByteCounterLocal >= sendLenLocal) + { + signalLocal = noSignal; + } + continue; + + default: + return 0; + } + + stateLocal = !stateLocal; + break; + } + } +} + void IR_Encoder::enable() { @@ -360,6 +522,27 @@ void IR_Encoder::rawSend(uint8_t *ptr, uint8_t len) { return; } + + if (externalTxStartFn != nullptr) + { + if (externalTxBusyFn != nullptr && externalTxBusyFn(externalTxCtx)) + { + return; + } + + // Mark as sending and delegate actual signal output to external backend. + setDecoder_isSending(); + sendLen = len; + isSending = true; + + const bool ok = externalTxStartFn(externalTxCtx, this, ptr, len); + if (!ok) + { + isSending = false; + setDecoder_isSending(); + } + return; + } IR_Encoder::carrierResume(); // Serial.println("START"); setDecoder_isSending(); @@ -380,7 +563,6 @@ void IR_Encoder::rawSend(uint8_t *ptr, uint8_t len) state = HIGH; currentBitSequence = bitHigh; - isSending = true; // interrupts(); } diff --git a/IR_Encoder.h b/IR_Encoder.h index a2ca8ac..f1013de 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -21,6 +21,14 @@ class IR_Encoder : public IR_FOX IR_Encoder *next; public: static HardwareTimer* IR_Timer; + + struct IR_TxGateRun { + uint16_t lenTicks; // number of timer ticks at carrierFrec*2 + bool gate; // true: carrier enabled (output toggles), false: silent (output forced low) + }; + + using ExternalTxBusyFn = bool (*)(void *ctx); + using ExternalTxStartFn = bool (*)(void *ctx, IR_Encoder *enc, const uint8_t *packet, uint8_t len); private: // uint16_t id; /// @brief Адрес передатчика public: @@ -31,10 +39,21 @@ public: IR_Encoder(uint8_t pin, uint16_t addr = 0, IR_DecoderRaw *decPair = nullptr, bool autoHandle = true); static void isr(); static void begin(HardwareTimer* timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority, void(*isrCallback)() = nullptr); + /** Configure timer frequency for TX clock (carrierFrec*2) without attaching ISR. */ + static void beginClockOnly(HardwareTimer *timer); static HardwareTimer* get_IR_Timer(); /** Call from main loop/tick: if ISR requested carrier stop, pause timer here (not in ISR). */ static void tick(); + /** Optional: register external TX backend (e.g. DMA driver). */ + static void setExternalTxBackend(ExternalTxStartFn startFn, ExternalTxBusyFn busyFn, void *ctx); + + /** Called by external TX backend on actual end of transmission. */ + void externalFinishSend(); + + /** Build RLE runs of carrier gate for a packet (no HW access). */ + static size_t buildGateRuns(const uint8_t *packet, uint8_t len, IR_TxGateRun *outRuns, size_t maxRuns); + void enable(); void disable(); @@ -74,6 +93,10 @@ private: static volatile bool carrierStopPending; static void carrierResume(); static void carrierPauseIfIdle(); + + static ExternalTxStartFn externalTxStartFn; + static ExternalTxBusyFn externalTxBusyFn; + static void *externalTxCtx; IR_SendResult _sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len); void setDecoder_isSending(); @@ -123,4 +146,3 @@ private: uint8_t *currentBitSequence = bitLow; volatile SignalPart signal; }; - diff --git a/IR_config.h b/IR_config.h index 4149f4a..48ca2aa 100644 --- a/IR_config.h +++ b/IR_config.h @@ -201,6 +201,8 @@ public: static void checkAddressRuleApply(uint16_t address, uint16_t id, bool &flag); void setPin(uint8_t pin); inline uint8_t getPin() { return pin; }; + inline GPIO_TypeDef *getPort() const { return port; } + inline uint16_t getPinMask() const { return mask; } protected: uint16_t id;