7#include "TransceiverConfig.h"
8#include "pulse/tools/Logger.h"
9#include "pulse/tools/RingBuffer.h"
10#include "pulse/RxDriver.h"
11#include "pulse/TxDriver.h"
49 : _rxDriver(&
rx), _txDriver(&
tx) {
89 _singleCharRxBuffer.resize(size);
94 _txDriver->setFrameSize(size);
98 bool setFramingMode(FramingMode
mode) {
100 _txDriver->setFramingMode(
mode);
135 if (_rxDriver) _rxDriver->
end();
136 if (_txDriver) _txDriver->end();
149 return _txDriver->write(
buffer, size);
171 return _singleCharRxBuffer.available() + _rxDriver->
available();
178 refillSingleCharBuffer();
179 return _singleCharRxBuffer.
read();
205 refillSingleCharBuffer();
206 return _singleCharRxBuffer.
peek();
215 void refillSingleCharBuffer() {
216 if (_singleCharRxBuffer.isEmpty() && _rxDriver) {
217 int len = _singleCharRxBuffer.size();
220 _singleCharRxBuffer.writeArray(tmp,
read);
static void debug(const char *format,...)
Log a debug message with formatting.
static void error(const char *format,...)
Log an error message with formatting.
Receiver class for communication.
bool read(T &out)
Read and remove the next element. Returns true if successful.
int readArray(T *dest, size_t len)
Read up to len elements into dest, returns number of elements read.
bool peek(T &out) const
Peek at the next element without removing it. Returns true if successful.
Abstract base class for IR receivers.
virtual void end()=0
Stop the receiver.
virtual int available()=0
Get the number of bytes available in the internal buffer.
virtual void setFrameSize(uint16_t size)=0
Set the expected frame size for dynamic data reception.
virtual size_t readBytes(uint8_t *data, size_t size)=0
virtual bool begin(uint32_t bitFrequencyHz)=0
Start the receiver.
Bi-directional IR transceiver class with Stream interface and driver abstraction.
void setFrameSize(uint16_t size)
Set the expected maximum frame size for RX/TX drivers and single-char buffer.
Transceiver(RxDriver &rx, TxDriver &tx, FramingMode mode, size_t frameSize)
Constructor with RX and TX drivers.
size_t write(const uint8_t *buffer, size_t size) override
Write a buffer to the TX driver.
int available() override
Return the number of bytes available to read.
void end()
End/stop the RX driver.
void setTxDriver(TxDriver *driver)
Set the TX driver.
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.
Transceiver(RxDriver &rx, FramingMode mode, size_t frameSize)
Constructor with RX driver.
Transceiver()=default
Default constructor.
void setRxDriver(RxDriver *driver)
Set the RX driver.
Transceiver(TxDriver &tx)
Constructor with TX driver.
Transceiver(RxDriver &rx, TxDriver &tx)
Constructor with RX and TX drivers.
Transceiver(RxDriver &rx)
Constructor with RX driver.
void flush() override
Not implemented.
Transceiver(TxDriver &tx, FramingMode mode, size_t frameSize)
Constructor with TX driver.
virtual size_t readBytes(uint8_t *buffer, size_t length)
Read bytes into the provided buffer, up to the specified length.
int availableForWrite() override
Return the number of bytes available for writing (always 1024)
bool begin(uint32_t bitFrequencyHz=DEFAULT_BIT_FREQ_HZ)
Initialize the transceiver and drivers.
Transmitter class for communication.
Abstract base class for IR transmitters.
Small, header-only vector replacement for non-STL environments.