IR-protocol/IR_Encoder.h
2024-01-09 16:55:02 +03:00

67 lines
2.3 KiB
C++

#pragma once
#include "IR_config.h"
//TODO: Отложенная передача после завершения приема
class IR_Decoder;
class IR_Encoder : IR_FOX {
friend IR_Decoder;
public:
/// @brief Вывод передатчика
uint8_t ir_out;
/// @brief Адрес передатчика
uint16_t addrSelf;
private:
/// @brief предыдущий бит преамбулы
bool prevPreambBit = true;
/// @brief Подстройка несущей частоты
uint8_t carrierTune;
/// @brief полупериод несущей частоты
uint8_t halfPeriod;
public:
/// @brief Класс передатчика
/// @param addr Адрес передатчика
/// @param pin Вывод передатчика
/// @param tune Подстройка несущей частоты
/// @param decPair Приёмник, для которого отключается приём в момент передачи передатчиком
IR_Encoder(uint16_t addr, uint8_t pin, uint8_t tune, IR_Decoder* decPair = nullptr);
template<typename T>
void sendData(uint16_t addrTo, T& data, bool needAccept = false);
void sendACK(uint16_t addrTo, uint8_t addInfo = 0, bool forAll = false);
void sendRequest(uint16_t addrTo, uint8_t addInfo = 0);
~IR_Encoder();
private:
IR_Decoder* decoder;
void meanderBlock(uint16_t count, uint16_t _period, bool isNoPause = true);
void sendByte(uint8_t byte, bool* prev, bool LOW_FIRST);
void addSync(bool* prev, bool* next);
void send_HIGH(bool = 1);
void send_LOW();
void send_EMPTY(uint8_t count);
void rawSend(uint8_t* ptr, uint8_t len);
void _sendData(uint16_t addrTo, uint8_t* data, uint8_t len, uint8_t msgType);
};
////////////////////////////////////////////////////////////////////////////////////////////////
template<typename T>
void IR_Encoder::sendData(uint16_t addrTo, T& data, bool needAccept = false) { // TODO: переделать логику LOW_FIRST
uint8_t len = sizeof(T);
uint8_t packSize = msgBytes + addrBytes + addrBytes + len + crcBytes;
uint8_t msgType =
((needAccept ? IR_MSG_DATA_ACCEPT : IR_MSG_DATA_NOACCEPT) << 5) | ((packSize - crcBytes) & IR_MASK_MSG_INFO);
_sendData(addrTo, data, len, msgType);
}