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
109 bool begin(uint16_t bitFrequencyHz = DEFAULT_BIT_FREQ_HZ) {
110 TRACE();
111 bool success = true;
112 // intialize frame size if not set
113 if (_frameSize == 0) setFrameSize(DEFAULT_FRAME_SIZE);
114
115 if (_rxDriver) {
116 success = _rxDriver->begin(bitFrequencyHz);
117 if (!success) {
118 Logger::error("Failed to initialize RX driver");
119 }
120 }
121 if (_txDriver) {
122 success = _txDriver->begin(bitFrequencyHz);
123 if (!success) {
124 Logger::error("Failed to initialize TX driver");
125 }
126 }
127 return success;
128 ;
129 }
130
134 void end() {
135 if (_rxDriver) _rxDriver->end();
136 if (_txDriver) _txDriver->end();
137 }
138
142 size_t write(uint8_t byte) override { return _txDriver->write(byte); }
143
147 size_t write(const uint8_t* buffer, size_t size) override {
148 if (_txDriver) {
149 return _txDriver->write(buffer, size);
150 }
151 return 0;
152 }
156 void flush() override {
157 if (_txDriver) {
158 _txDriver->flush();
159 }
160 }
161
165 int availableForWrite() override { return 1024; }
166
170 int available() override {
171 return _singleCharRxBuffer.available() + _rxDriver->available();
172 }
173
177 int read() override {
178 refillSingleCharBuffer();
179 return _singleCharRxBuffer.read();
180 }
181
191 virtual size_t readBytes(uint8_t* buffer, size_t length) {
192 int c1 = _singleCharRxBuffer.readArray(buffer, length);
193 int open = length - c1;
194 int c2 = 0;
195 if (open > 0) {
196 c2 = _rxDriver->readBytes((uint8_t*)buffer + c1, open);
197 }
198 return c1 + c2;
199 }
200
204 int peek() override {
205 refillSingleCharBuffer();
206 return _singleCharRxBuffer.peek();
207 }
208
209 protected:
210 RxDriver* _rxDriver = nullptr;
211 TxDriver* _txDriver = nullptr;
212 RingBuffer<uint8_t> _singleCharRxBuffer{64};
213 int _frameSize = 0;
214
215 void refillSingleCharBuffer() {
216 if (_singleCharRxBuffer.isEmpty() && _rxDriver) {
217 int len = _singleCharRxBuffer.size();
218 uint8_t tmp[len];
219 int read = _rxDriver->readBytes(tmp, len);
220 _singleCharRxBuffer.writeArray(tmp, read);
221 }
222 }
223};
224
233class Trasmitter : public Transceiver {
234 public:
236};
237
246class Receiver : public Transceiver {
247 public:
249};
250
251} // 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 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.
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
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)
bool begin(uint32_t bitFrequencyHz=DEFAULT_BIT_FREQ_HZ)
Initialize the transceiver and drivers.
Transmitter class for communication.
Abstract base class for IR transmitters.
Definition TxDriver.h:18
Small, header-only vector replacement for non-STL environments.
Definition Vector.h:29