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;
};
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--; }
}

View File

@ -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;