Arduino PulseWire Transceiver Library
Loading...
Searching...
No Matches
IRTransceiver.h
1#pragma once
2
3#include "Codecs.h"
4#include "DriverArduino.h"
5#include "Preambles.h"
6#include "Transceiver.h"
7
8namespace pulsewire {
9
26class IRTransceiver : public Stream {
27 public:
29 IRTransceiver(IRProtocol& protocol, uint8_t rxPin, uint8_t txPin)
30 : _irProtocol(&protocol),
31 _rxPin(rxPin),
32 _txPin(txPin),
33 _signal(protocol.frequency()),
34 _codec(protocol.codec()),
35 _rx(_codec, _rxPin, protocol.frequency()),
36 _tx(_codec, _txPin, _signal, protocol.frequency()),
37 _transceiver(_rx, _tx) {
38 _codec.init(protocol, protocol.shortPulseUs(), protocol.longPulseUs(),
39 protocol.toleranceUs());
40 setIRProtocol(protocol); // Initialize with provided protocol info
41 }
42
44 IRTransceiver(IRMultiProtocol& protocol, uint8_t rxPin, uint8_t txPin)
45 : _irProtocol(&protocol),
46 _rxPin(rxPin),
47 _txPin(txPin),
48 _signal(protocol.frequency()),
49 _codec(protocol.codec()),
50 _rx(_codec, _rxPin, protocol.frequency()),
51 _tx(_codec, _txPin, _signal, protocol.frequency()),
52 _transceiver(_rx, _tx) {
53 _codec.init(protocol, protocol.shortPulseUs(), protocol.longPulseUs(),
54 protocol.toleranceUs());
55 // Initialize with provided protocol info
56 setIRProtocol(protocol);
57 // Register callback for protocol changes: detected by IRMultiProtocol and
58 // handled in onChange()
59 protocol.setCallback(onChange, this);
60 }
61
62 int available() override { return _transceiver.available(); }
63 size_t readBytes(uint8_t* data, size_t len) {
64 return _transceiver.readBytes(data, len);
65 }
66 int read() override { return _transceiver.read(); }
67 int peek() override { return _transceiver.peek(); }
68 void flush() override { _transceiver.flush(); }
69 size_t write(uint8_t b) override { return _transceiver.write(b); }
70 size_t write(const uint8_t* data, size_t len) {
71 return _transceiver.write(data, len);
72 }
73
74 const IRProtocol& getInfo() const { return *_irProtocol; }
75
76 // Allow updating protocol info and reconfiguring drivers on the fly
77 void setIRProtocol(IRProtocol& info) {
78 if (&info == _irProtocol) return;
79 // Update codec and drivers with new protocol info
80 _irProtocol = &info;
81 // Multi Protocol Support
82 //_irMultiProtocol.setActualProtocol(info);
83 _codec.init(*_irProtocol, info.shortPulseUs(), info.longPulseUs(),
84 info.toleranceUs());
85 _rx.init(_codec, _rxPin, info.frequency());
86 _tx.init(_txProtocol, _codec, _txPin, info.frequency());
87 uint32_t baud = 1000000 / (info.shortPulseUs() + info.longPulseUs()) / 2;
88 _txProtocol.begin(baud, &_codec, _txPin);
89 _signal.setFrequency(info.frequency());
90 _signal.setTxPin(_txPin);
91 _transceiver.setFrameSize(info.dataLength());
92 _transceiver.setFramingMode(
93 FramingMode::FixedSize); // No additional framing
94 _transceiver.begin();
95 }
96
97 // Callback for protocol changes detected by IRMultiProtocol
98 static void onChange(IRProtocolEnum proto, IRProtocol& info, void* ref) {
99 IRTransceiver* transceiver = static_cast<IRTransceiver*>(ref);
100 transceiver->setIRProtocol(info);
101 }
102
103 void begin() {
104 setIRProtocol(*_irProtocol); // Initialize with current protocol info
105 _transceiver.begin();
106 }
107
108 private:
109 IRProtocol* _irProtocol = nullptr;
110 ToneSignal _signal;
111 Codec& _codec;
112 TxProtocolGeneric _txProtocol{&_signal};
113 RxDriverArduino _rx;
114 TxDriverArduino _tx;
115 Transceiver _transceiver;
116 uint8_t _rxPin;
117 uint8_t _txPin;
118};
119
129 public:
130 IRTrasmitter(IRProtocol info, uint8_t txPin)
131 : IRTransceiver(info, 255, txPin) {}
132};
133
142class IRReceiver : public IRTransceiver {
143 public:
144 IRReceiver(IRProtocol info, uint8_t rxPin)
145 : IRTransceiver(info, rxPin, 255) {}
146 IRReceiver(uint8_t rxPin) : IRTransceiver(multi_protocol, rxPin, 255) {}
147
148 protected:
149 IRMultiProtocol multi_protocol;
150};
151
152} // namespace pulsewire
virtual void init(Preamble &detector, uint32_t shortPulseUs=600, uint32_t longPulseUs=1200, uint32_t toleranceUs=200)
Definition Codec.h:49
IRMultiProtocol: Handles detection and delegation for multiple IR protocols.
Definition IRProtocol.h:316
uint32_t toleranceUs() const
Tolerance in microseconds for pulse duration matching during detection.
Definition IRProtocol.h:354
void setCallback(void(*callback)(IRProtocolEnum, IRProtocol &, void *ref), void *ref)
Definition IRProtocol.h:378
uint32_t shortPulseUs() const
Returns the duration of the short pulse in microseconds.
Definition IRProtocol.h:352
uint32_t longPulseUs() const
Returns the duration of the long pulse in microseconds.
Definition IRProtocol.h:353
IRProtocol: Represents a specific IR protocol with all its parameters.
Definition IRProtocol.h:124
virtual uint32_t shortPulseUs() const
Returns the duration of the short pulse in microseconds.
Definition IRProtocol.h:199
virtual uint32_t toleranceUs() const
Tolerance in microseconds for pulse duration matching during detection.
Definition IRProtocol.h:203
virtual uint32_t longPulseUs() const
Returns the duration of the long pulse in microseconds.
Definition IRProtocol.h:201
Receiver class for IR communication.
IRTransceiver: High-level interface for sending and receiving IR signals.
IRTransceiver(IRProtocol &protocol, uint8_t rxPin, uint8_t txPin)
Constructor for defined Protocol.
IRTransceiver(IRMultiProtocol &protocol, uint8_t rxPin, uint8_t txPin)
Constructor for Multiple Protocols.
Transmitter class for IR communication.
void setFrameSize(uint16_t size)
Set the expected maximum frame size for RX/TX drivers and single-char buffer.
Definition Transceiver.h:86
int available() override
Return the number of bytes available to read.
int peek() override
Peek at the next byte in the buffer without removing it.
size_t write(uint8_t byte) override
Write a single byte to the TX driver.
int read() override
Read a single byte from the buffer.
void flush() override
Not implemented.
virtual size_t readBytes(uint8_t *buffer, size_t length)
Read bytes into the provided buffer, up to the specified length.
bool begin(uint32_t bitFrequencyHz=DEFAULT_BIT_FREQ_HZ)
Initialize the transceiver and drivers.
bool begin(uint32_t bitFrequencyHz, Codec *p_codec, uint8_t pin)
Initializes the protocol with the specified codec and transmission pin.
Definition TxProtocol.h:170