Arduino PulseWire Transceiver Library
Loading...
Searching...
No Matches
Transceiver.h
1#pragma once
2
3#include <stddef.h>
4#include <stdint.h>
5
6#include "Stream.h"
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"
12
13namespace pulsewire {
14
23class Transceiver : public Stream {
24 public:
28 Transceiver() = default;
29
33 Transceiver(RxDriver& rx, TxDriver& tx) : _rxDriver(&rx), _txDriver(&tx) {}
34
38 Transceiver(RxDriver& rx) : _rxDriver(&rx) {}
39
43 Transceiver(TxDriver& tx) : _txDriver(&tx) {}
44
48 Transceiver(RxDriver& rx, TxDriver& tx, FramingMode mode, size_t frameSize)
49 : _rxDriver(&rx), _txDriver(&tx) {
51 setFramingMode(mode);
52 }
53
57 Transceiver(RxDriver& rx, FramingMode mode, size_t frameSize)
58 : _rxDriver(&rx) {
60 setFramingMode(mode);
61 }
62
66 Transceiver(TxDriver& tx, FramingMode mode, size_t frameSize)
67 : _txDriver(&tx) {
69 setFramingMode(mode);
70 }
71
75 void setRxDriver(RxDriver* driver) { _rxDriver = driver; }
76
80 void setTxDriver(TxDriver* driver) { _txDriver = driver; }
81
87 Logger::debug("Setting frame size to %d", size);
88 _frameSize = size;
89 _singleCharRxBuffer.resize(size);
90 if (_rxDriver) {
91 _rxDriver->setFrameSize(size);
92 }
93 if (_txDriver) {
94 _txDriver->setFrameSize(size);
95 }
96 }
97
98 bool setFramingMode(FramingMode mode) {
99 if (_txDriver) {
100 _txDriver->setFramingMode(mode);
101 return true;
102 }
103 return false;
104 }
105
106 void setTimeout(uint32_t timeoutUs) {
107 if (_rxDriver) {
108 _rxDriver->setTimeout(timeoutUs);
109 }
110 }
111
115 bool begin(uint32_t bitFrequencyHz = DEFAULT_BIT_FREQ_HZ) {
116 TRACE();
117 bool success = true;
118 // intialize frame size if not set
119 if (_frameSize == 0) setFrameSize(DEFAULT_FRAME_SIZE);
120
121 if (_rxDriver) {
122 success = _rxDriver->begin(bitFrequencyHz);
123 if (!success) {
124 Logger::error("Failed to initialize RX driver");
125 }
126 }
127 if (_txDriver) {
128 success = _txDriver->begin(bitFrequencyHz);
129 if (!success) {
130 Logger::error("Failed to initialize TX driver");
131 }
132 }
133 return success;
134 ;
135 }
136
140 void end() {
141 if (_txDriver) _txDriver->end();
142 if (_rxDriver) _rxDriver->end();
143 }
144
145
149 size_t write(uint8_t byte) override { return _txDriver->write(byte); }
150
154 size_t write(const uint8_t* buffer, size_t size) override {
155 if (_txDriver) {
156 return _txDriver->write(buffer, size);
157 }
158 return 0;
159 }
163 void flush() override {
164 if (_txDriver) {
165 _txDriver->flush();
166 }
167 }
168
172 int availableForWrite() override { return 1024; }
173
177 int available() override {
178 return _singleCharRxBuffer.available() + _rxDriver->available();
179 }
180
184 int read() override {
185 refillSingleCharBuffer();
186 return _singleCharRxBuffer.read();
187 }
188
198 virtual size_t readBytes(uint8_t* buffer, size_t length) {
199 int c1 = _singleCharRxBuffer.readArray(buffer, length);
200 int open = length - c1;
201 int c2 = 0;
202 if (open > 0) {
203 c2 = _rxDriver->readBytes((uint8_t*)buffer + c1, open);
204 }
205 return c1 + c2;
206 }
207
211 int peek() override {
212 refillSingleCharBuffer();
213 return _singleCharRxBuffer.peek();
214 }
215
216 protected:
217 RxDriver* _rxDriver = nullptr;
218 TxDriver* _txDriver = nullptr;
219 RingBuffer<uint8_t> _singleCharRxBuffer{64};
220 int _frameSize = 0;
221
222 void refillSingleCharBuffer() {
223 if (_singleCharRxBuffer.isEmpty() && _rxDriver) {
224 int len = _singleCharRxBuffer.size();
225 uint8_t tmp[len];
226 int read = _rxDriver->readBytes(tmp, len);
227 _singleCharRxBuffer.writeArray(tmp, read);
228 }
229 }
230};
231
240class Trasmitter : public Transceiver {
241 public:
243};
244
253class Receiver : public Transceiver {
254 public:
256};
257
258} // namespace pulsewire
static void debug(const char *format,...)
Log a debug message with formatting.
Definition Logger.h:82
static void error(const char *format,...)
Log an error message with formatting.
Definition Logger.h:37
Receiver class for communication.
bool read(T &out)
Read and remove the next element. Returns true if successful.
Definition RingBuffer.h:75
int readArray(T *dest, size_t len)
Read up to len elements into dest, returns number of elements read.
Definition RingBuffer.h:94
bool peek(T &out) const
Peek at the next element without removing it. Returns true if successful.
Definition RingBuffer.h:106
Abstract base class for IR receivers.
Definition RxDriver.h:10
virtual void end()=0
Stop the receiver.
virtual int available()=0
Get the number of bytes available in the internal buffer.
virtual bool begin(uint32_t bitFrequencyHz)=0
Start the receiver.
void setTimeout(uint32_t timeoutMs)
Defines the read timeout for readBytes() in milliseconds.
Definition RxDriver.h:26
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
Bi-directional IR transceiver class with Stream interface and driver abstraction.
Definition Transceiver.h:23
void setFrameSize(uint16_t size)
Set the expected maximum frame size for RX/TX drivers and single-char buffer.
Definition Transceiver.h:86
Transceiver(RxDriver &rx, TxDriver &tx, FramingMode mode, size_t frameSize)
Constructor with RX and TX drivers.
Definition Transceiver.h:48
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.
Definition Transceiver.h:80
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.
Definition Transceiver.h:57
Transceiver()=default
Default constructor.
void setRxDriver(RxDriver *driver)
Set the RX driver.
Definition Transceiver.h:75
Transceiver(TxDriver &tx)
Constructor with TX driver.
Definition Transceiver.h:43
Transceiver(RxDriver &rx, TxDriver &tx)
Constructor with RX and TX drivers.
Definition Transceiver.h:33
bool begin(uint32_t bitFrequencyHz=DEFAULT_BIT_FREQ_HZ)
Initialize the transceiver and drivers.
Transceiver(RxDriver &rx)
Constructor with RX driver.
Definition Transceiver.h:38
void flush() override
Not implemented.
Transceiver(TxDriver &tx, FramingMode mode, size_t frameSize)
Constructor with TX driver.
Definition Transceiver.h:66
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)
Transmitter class for communication.
Abstract base class for IR transmitters.
Definition TxDriver.h:17
Small, header-only vector replacement for non-STL environments.
Definition Vector.h:29