arduino-audio-tools
Loading...
Searching...
No Matches
RadioHeadStream.h
Go to the documentation of this file.
1#pragma once
4#include "RHGenericDriver.h" // https://www.airspayce.com/mikem/arduino/RadioHead/
5
6namespace audio_tools {
7
25class RadioHeadStream : public Stream {
26 public:
27 RadioHeadStream(RHGenericDriver& driver, RxTxMode mode = TX_MODE) {
28 setDriver(driver);
30 }
31
32 void setDriver(RHGenericDriver& driver) { p_driver = &driver; }
33
35 void setMode(RxTxMode mode) { this->mode = mode; }
36
39 return begin();
40 }
41
42 bool begin() {
43 if (p_driver == nullptr) return false;
44 if (!p_driver->init()) return false;
45 buffer.resize(p_driver->maxMessageLength());
46 buffer.reset();
47 // the driver switches to rx in available() and to tx in send()
48 if (mode == RX_MODE) p_driver->available();
49 return true;
50 }
51
52 void end() {
53 if (p_driver == nullptr) return;
54 flush();
55 p_driver->sleep();
56 }
57
58 int available() override {
59 if (mode == TX_MODE || p_driver == nullptr) return 0;
60 if (buffer.isEmpty()) receive();
61 return buffer.available();
62 }
63
64 size_t readBytes(uint8_t* data, size_t len) override {
65 if (mode == TX_MODE || p_driver == nullptr) return 0;
66 size_t processed = 0;
67 while (processed < len) {
68 if (buffer.isEmpty() && !receive()) break;
69 processed += buffer.readArray(data + processed, len - processed);
70 }
71 return processed;
72 }
73
74 int read() override {
75 uint8_t c;
76 return readBytes(&c, 1) == 1 ? c : -1;
77 }
78
79 int peek() override {
80 if (available() == 0) return -1;
81 uint8_t c;
82 return buffer.peek(c) ? c : -1;
83 }
84
85 int availableForWrite() override {
86 if (mode == RX_MODE || p_driver == nullptr) return 0;
87 return p_driver->maxMessageLength();
88 }
89
90 size_t write(const uint8_t* data, size_t len) override {
91 if (mode == RX_MODE || p_driver == nullptr || buffer.size() == 0) return 0;
92 size_t processed = 0;
93 while (processed < len) {
94 processed += buffer.writeArray(data + processed, len - processed);
95 if (buffer.isFull()) send();
96 }
97 return processed;
98 }
99
100 size_t write(uint8_t c) override { return write(&c, 1); }
101
103 void flush() override {
104 if (mode == TX_MODE && !buffer.isEmpty()) send();
105 }
106
107 protected:
108 RHGenericDriver* p_driver = nullptr;
111
113 bool receive() {
114 if (!p_driver->available()) return false;
115 buffer.reset();
116 uint8_t len = (uint8_t)buffer.size();
117 if (!p_driver->recv(buffer.data(), &len)) return false;
118 buffer.setAvailable(len);
119 return len > 0;
120 }
121
122 void send() {
123 p_driver->send(buffer.data(), buffer.available());
124 p_driver->waitPacketSent();
125 buffer.reset();
126 }
127};
128
129} // namespace audio_tools
Definition Arduino.h:136
virtual int readArray(T data[], int len)
reads multiple values
Definition Buffers.h:34
bool isEmpty()
Definition Buffers.h:87
Arduino Stream which is using the RadioHead library to send and receive data. We use the driver API d...
Definition RadioHeadStream.h:25
void flush() override
Sends the buffered data.
Definition RadioHeadStream.h:103
size_t write(uint8_t c) override
Definition RadioHeadStream.h:100
size_t readBytes(uint8_t *data, size_t len) override
Definition RadioHeadStream.h:64
int peek() override
Definition RadioHeadStream.h:79
bool receive()
Copies the next received message into the buffer.
Definition RadioHeadStream.h:113
bool begin()
Definition RadioHeadStream.h:42
int available() override
Definition RadioHeadStream.h:58
RadioHeadStream(RHGenericDriver &driver, RxTxMode mode=TX_MODE)
Definition RadioHeadStream.h:27
size_t write(const uint8_t *data, size_t len) override
Definition RadioHeadStream.h:90
int availableForWrite() override
Definition RadioHeadStream.h:85
SingleBuffer< uint8_t > buffer
Definition RadioHeadStream.h:110
void end()
Definition RadioHeadStream.h:52
void setMode(RxTxMode mode)
Defines if we send (TX_MODE) or receive (RX_MODE)
Definition RadioHeadStream.h:35
bool begin(RxTxMode mode)
Definition RadioHeadStream.h:37
RxTxMode mode
Definition RadioHeadStream.h:109
int read() override
Definition RadioHeadStream.h:74
void setDriver(RHGenericDriver &driver)
Definition RadioHeadStream.h:32
void send()
Definition RadioHeadStream.h:122
RHGenericDriver * p_driver
Definition RadioHeadStream.h:108
A simple Buffer implementation which just uses a (dynamically sized) array.
Definition Buffers.h:194
size_t size() override
Definition Buffers.h:325
size_t setAvailable(size_t available_size)
Definition Buffers.h:318
bool peek(T &result) override
peeks the actual entry from the buffer
Definition Buffers.h:246
int available() override
provides the number of entries that are available to read
Definition Buffers.h:255
bool isFull() override
checks if the buffer is full
Definition Buffers.h:262
int writeArray(const T data[], int len) override
Fills the buffer data.
Definition Buffers.h:223
T * data()
Provides address of actual data.
Definition Buffers.h:306
bool resize(size_t size)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:327
void reset() override
clears the buffer
Definition Buffers.h:308
RxTxMode
The Microcontroller is the Audio Source (TX_MODE) or Audio Sink (RX_MODE). RXTX_MODE is Source and Si...
Definition AudioTypes.h:26
@ TX_MODE
Definition AudioTypes.h:26
@ RX_MODE
Definition AudioTypes.h:26
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6