bit generator

This commit is contained in:
2024-02-07 18:00:13 +03:00
parent e0fbc8502d
commit 8d5b2f6e3c
2 changed files with 62 additions and 27 deletions

View File

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

View File

@ -64,10 +64,23 @@ private:
volatile uint8_t dataFrontCounter; volatile uint8_t dataFrontCounter;
volatile uint8_t syncFrontCounter; volatile uint8_t syncFrontCounter;
// uint8_t bitSequence[2]; struct BitSequence {
// volatile uint32_t toggle_counter; 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;