signal generator

This commit is contained in:
2024-02-08 17:18:33 +03:00
parent 8d5b2f6e3c
commit b272b6031c
5 changed files with 82 additions and 42 deletions

View File

@ -1,7 +1,12 @@
#include "IR_Encoder.h"
#include "IR_Decoder.h"
#define LoopOut 12
#define ISR_Out 10
#define TestOut 13
IR_Encoder::IR_Encoder(uint16_t addr, uint8_t pin, uint8_t tune = 0, IR_Decoder* decPair) {
sendBuffer = new uint8_t[dataByteSizeMax] { 0 };
ir_out = pin;
pinMode(ir_out, OUTPUT);
addrSelf = addr;
@ -16,6 +21,7 @@ IR_Encoder::IR_Encoder(uint16_t addr, uint8_t pin, uint8_t tune = 0, IR_Decoder*
IR_Encoder::~IR_Encoder() {
delete [] bitHigh;
delete [] bitLow;
delete [] sendBuffer;
};
void IR_Encoder::sendACK(uint16_t addrTo, uint8_t addInfo, bool forAll = false) {
@ -109,74 +115,105 @@ 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);
memset(sendBuffer, 0x00, dataByteSizeMax);
memcpy(sendBuffer, ptr, len);
sendLen = len;
// *sendBuffer = 0b10010011;
isSending = true;
cli();
if (decoder != nullptr) { decoder->isPairSending = isSending; }
// #define preambToggle 2*2-1 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#define preambToggle ((bitPauseTakts * 2 + bitActiveTakts) * 2 - 1) //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
toggleCounter = preambToggle; // Первая генерация для первого signal
preambBitCounter;
dataBitCounter = 3/* len * 8 */;
syncBitCounter = syncBits;
dataBitCounter = bitPerByte - 1;
dataByteCounter = 0;
preambFrontCounter = preambPulse * 2 - 1; // -1 за счёт генерации уже на этапе сразу после инициализации
dataFrontCounter = bitPerByte * 2;
syncFrontCounter;
dataSequenceCounter = bitPerByte * 2;
syncSequenceCounter = syncBits * 2;
signal = preamb;
isSending = true;
state = HIGH;
currentBit = bitHigh;
currentBitSequence = bitHigh;
sei();
}
void IR_Encoder::isr() {
if (!isSending) return;
ir_out_virtual = !ir_out_virtual && state;
if (toggleCounter == 0) {
if (toggleCounter) {
toggleCounter--;
} else {
IsrStart:
switch (signal) {
case noSignal:
// сброс счетчиков
// ...
isSending = false;
return;
break;
case preamb:
if (preambFrontCounter == 0) { // Конец преамбулы, переход на следующий signal
if (preambFrontCounter) {
preambFrontCounter--;
toggleCounter = preambToggle; // Вторая и последующие генерации для этого signal
} else {// Конец преамбулы, переход на следующий signal
signal = data;
state = !LOW; // Инверсное состояние первой генерации следующего signal
goto IsrStart; // Применение новых параметров в этй же итерации прерывания
} else {
preambFrontCounter--;
toggleCounter = preambToggle; // Вторая и последующие генерации для этого signal
}
break;
case data:
if (dataFrontCounter == 0) { // Конец преамбулы, переход на следующий signal
signal = noSignal;
// state = HIGH;
isSending = false;
} else {
toggleCounter = currentBit[!state];
dataFrontCounter--;
if (dataSequenceCounter) {
if (!(dataSequenceCounter & 1U)) { // если чётный - смена бита
currentBitSequence = ((sendBuffer[dataByteCounter] >> dataBitCounter) & 1U) ? bitHigh : bitLow; // определение текущего бита
dataBitCounter--;
}
toggleCounter = currentBitSequence[!state];
dataSequenceCounter--;
} else { // Конец data, переход на следующий signal
syncLastBit = !((sendBuffer[dataByteCounter]) & 1U);
dataByteCounter++;
dataBitCounter = bitPerByte - 1;
dataSequenceCounter = bitPerByte * 2;
signal = sync;
goto IsrStart; // Применение новых параметров в этй же итерации прерывания
}
// signal = (SignalPart)(~signal); // 2 -> 253, 253 -> 2
break;
case sync:
// signal = (SignalPart)(~signal); // 2 -> 253, 253 -> 2
if (syncSequenceCounter) {
if (!(syncSequenceCounter & 1U)) { // если чётный - смена бита
if (syncSequenceCounter == 2) { // Если последний бит
currentBitSequence = ((sendBuffer[dataByteCounter]) & 0b10000000) ? bitLow : bitHigh;
} else {
currentBitSequence = syncLastBit ? bitLow : bitHigh; // определение текущего бита
syncLastBit = !syncLastBit;
}
}
toggleCounter = currentBitSequence[!state];
syncSequenceCounter--;
} else { // Конец sync, переход на следующий signal
signal = data;
syncSequenceCounter = syncBits * 2;
if (dataByteCounter >= sendLen) { // определение конца данных
signal = noSignal;
}
goto IsrStart; // Применение новых параметров в этй же итерации прерывания
}
break;
default:
@ -185,9 +222,7 @@ void IR_Encoder::isr() {
}
state = !state;
} else { toggleCounter--; }
}
}