diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index dd7291d..e187c44 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -13,9 +13,10 @@ IR_Encoder::IR_Encoder(uint16_t addr, uint8_t pin, uint8_t tune = 0, IR_Decoder* signal = noSignal; }; - - -IR_Encoder::~IR_Encoder() {}; +IR_Encoder::~IR_Encoder() { + delete [] bitHigh; + delete [] bitLow; +}; void IR_Encoder::sendACK(uint16_t addrTo, uint8_t addInfo, bool forAll = false) { uint8_t* ptr = new uint8_t[msgBytes + addrBytes + crcBytes] { 0 }; @@ -108,21 +109,28 @@ void IR_Encoder::_sendData(uint16_t addrTo, uint8_t* data, uint8_t len, uint8_t } void IR_Encoder::rawSend(uint8_t* ptr, uint8_t len) { + cli(); digitalToggle(9); digitalToggle(9); isSending = true; if (decoder != nullptr) { decoder->isPairSending = isSending; } - cli(); - // toggleCounter = bitTakts*2 - 1; - #define preambToggle ((bitPauseTakts * 2 + bitActiveTakts) * 2 - 1) - // #define preambToggle (3*2-1) - toggleCounter = preambToggle; - preambBitCounter = preambPulse; - dataBitCounter = 0; - syncBitCounter = 0; + // #define preambToggle 2*2-1 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + #define preambToggle ((bitPauseTakts * 2 + bitActiveTakts) * 2 - 1) //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + toggleCounter = preambToggle; // Первая генерация для первого signal + + preambBitCounter; + dataBitCounter = 3/* len * 8 */; + syncBitCounter = syncBits; + + preambFrontCounter = preambPulse * 2 - 1; // -1 за счёт генерации уже на этапе сразу после инициализации + dataFrontCounter = bitPerByte * 2; + syncFrontCounter; signal = preamb; isSending = true; state = HIGH; + + currentBit = bitHigh; sei(); } @@ -132,32 +140,43 @@ void IR_Encoder::isr() { ir_out_virtual = !ir_out_virtual && state; + if (toggleCounter == 0) { - if (!toggleCounter) { - - state = !state; - + IsrStart: switch (signal) { case noSignal: + isSending = false; return; break; case preamb: - toggleCounter = preambToggle; - if (!state) { // Низкий уровень - конец периода генерации - preambBitCounter--; - if (!preambBitCounter) { // Конец преамбулы, переход на следующий этап - isSending = false; - } + if (preambFrontCounter == 0) { // Конец преамбулы, переход на следующий signal + signal = data; + state = !LOW; // Инверсное состояние первой генерации следующего signal + goto IsrStart; // Применение новых параметров в этй же итерации прерывания + } else { + preambFrontCounter--; + toggleCounter = preambToggle; // Вторая и последующие генерации для этого signal } + break; case data: - signal = (SignalPart)(~signal); // 2 -> 253, 253 -> 2 + if (dataFrontCounter == 0) { // Конец преамбулы, переход на следующий signal + signal = noSignal; + // state = HIGH; + isSending = false; + } else { + toggleCounter = currentBit[!state]; + dataFrontCounter--; + } + + + // signal = (SignalPart)(~signal); // 2 -> 253, 253 -> 2 break; case sync: - signal = (SignalPart)(~signal); // 2 -> 253, 253 -> 2 + // signal = (SignalPart)(~signal); // 2 -> 253, 253 -> 2 break; default: @@ -165,6 +184,9 @@ void IR_Encoder::isr() { break; } + state = !state; + + } else { toggleCounter--; } } diff --git a/IR_Encoder.h b/IR_Encoder.h index 3cf5569..ae30c07 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -33,7 +33,7 @@ public: void isr(); ~IR_Encoder(); - volatile bool ir_out_virtual; + volatile bool ir_out_virtual; private: IR_Decoder* decoder; void _sendData(uint16_t addrTo, uint8_t* data, uint8_t len, uint8_t msgType); @@ -64,10 +64,23 @@ private: volatile uint8_t dataFrontCounter; volatile uint8_t syncFrontCounter; - // uint8_t bitSequence[2]; - // volatile uint32_t toggle_counter; + struct BitSequence { + 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 + }; + uint8_t* currentBit; - SignalPart signal; + // uint8_t bitSequence[2]; + + volatile SignalPart signal;