mirror of
https://github.com/Show-maket/IR-protocol.git
synced 2025-06-27 20:59:37 +00:00
bit generator
This commit is contained in:
@ -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--; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
21
IR_Encoder.h
21
IR_Encoder.h
@ -33,7 +33,7 @@ public:
|
|||||||
void isr();
|
void isr();
|
||||||
|
|
||||||
~IR_Encoder();
|
~IR_Encoder();
|
||||||
volatile bool ir_out_virtual;
|
volatile bool ir_out_virtual;
|
||||||
private:
|
private:
|
||||||
IR_Decoder* decoder;
|
IR_Decoder* decoder;
|
||||||
void _sendData(uint16_t addrTo, uint8_t* data, uint8_t len, uint8_t msgType);
|
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 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;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user