arduino-audio-tools
Loading...
Searching...
No Matches
NRF24Stream.h
Go to the documentation of this file.
1#pragma once
2
5#include "RF24.h" // https://github.com/nRF24/RF24
6
7namespace audio_tools {
8
52
65class NRF24Stream : public AudioStream {
66 public:
68 NRF24Stream() = default;
69
72
75
79
81 void setBuffer(BaseBuffer<uint8_t> &buffer) { p_rx_buffer = &buffer; }
82
86 rc.mode = mode;
87 return rc;
88 }
89
97
99 bool begin(NRF24Config config) {
100 cfg = config;
102 return begin();
103 }
104
106 bool begin() override {
107 TRACEI();
108
109 if (p_radio == nullptr) {
112 }
113
114 bool rc = false;
115 for (int count = 0; count < cfg.max_begin_retry; count++) {
116 rc = p_radio->begin();
117 if (rc) break;
118 LOGI("NRF24 begin failed, retrying...");
119 delay(500);
120 }
121 if (!rc) {
122 LOGE("NRF24 begin failed after %d retries", cfg.max_begin_retry);
123 return false;
124 }
125
126 p_radio->setChannel(cfg.channel);
127 p_radio->setDataRate(cfg.data_rate);
128 p_radio->setPALevel(cfg.pa_level);
129 p_radio->setPayloadSize(cfg.payload_size);
130 p_radio->setCRCLength(cfg.crc_length);
131 p_radio->setAutoAck(cfg.auto_ack);
132
133 if (cfg.mode == TX_MODE) {
134 p_radio->openWritingPipe(cfg.address);
135 p_radio->stopListening();
136 } else {
137 p_radio->openReadingPipe(1, cfg.address);
138 p_radio->startListening();
139 }
140
142
143 if (cfg.mode == RX_MODE && p_rx_buffer == nullptr) {
146 }
147
148 LOGI("NRF24 begin success (mode: %s, channel: %d, payload: %d)",
150 return true;
151 }
152
154 void end() override {
155 TRACEI();
156 if (p_radio != nullptr) {
157 p_radio->stopListening();
158 p_radio->powerDown();
159 }
160 if (p_own_radio != nullptr) {
161 delete p_own_radio;
162 p_own_radio = nullptr;
163 p_radio = nullptr;
164 }
165 tx_buffer.resize(0);
166 }
167
169 size_t readBytes(uint8_t *data, size_t len) override {
170 if (cfg.mode == TX_MODE || p_radio == nullptr) return 0;
171 fillBuffer();
172 return p_rx_buffer->readArray(data, len);
173 }
174
176 int available() override {
177 if (cfg.mode == TX_MODE || p_radio == nullptr) return 0;
178 fillBuffer();
179 return p_rx_buffer->available();
180 }
181
183 int availableForWrite() override {
184 if (cfg.mode == RX_MODE || p_radio == nullptr) return 0;
185 return cfg.payload_size;
186 }
187
189 size_t write(const uint8_t *data, size_t len) override {
190 if (cfg.mode == RX_MODE || p_radio == nullptr) return 0;
191
192 for (size_t j = 0; j < len; j++) {
193 tx_buffer.write(data[j]);
194 if (tx_buffer.isFull()) {
195 if (cfg.use_write_fast) {
196 p_radio->writeFast(tx_buffer.data(), tx_buffer.available());
197 } else {
199 }
201 }
202 }
203 return len;
204 }
205
207 RF24 *radio() { return p_radio; }
208
209 protected:
211 RF24 *p_radio = nullptr;
212 RF24 *p_own_radio = nullptr;
216
218 void fillBuffer() {
219 if (p_rx_buffer == nullptr || p_radio == nullptr) return;
220 while (p_radio->available()) {
221 uint8_t tmp[32];
222 p_radio->read(tmp, cfg.payload_size);
224 }
225 }
226};
227
228} // namespace audio_tools
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGE(...)
Definition AudioLoggerIDF.h:30
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition BaseStream.h:120
AudioInfo info
Definition BaseStream.h:171
virtual void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition BaseStream.h:128
Shared functionality of all buffers.
Definition Buffers.h:23
virtual int readArray(T data[], int len)
reads multiple values
Definition Buffers.h:34
virtual int writeArray(const T data[], int len)
Fills the buffer data.
Definition Buffers.h:56
void clear()
same as reset
Definition Buffers.h:96
virtual int available()=0
provides the number of entries that are available to read
NRF24L01(+) Stream for sending and receiving audio via the nRF24L01 2.4GHz radio module....
Definition NRF24Stream.h:65
RF24 * p_radio
Definition NRF24Stream.h:211
void setBuffer(BaseBuffer< uint8_t > &buffer)
Sets an external receive buffer.
Definition NRF24Stream.h:81
void fillBuffer()
Drains all available radio packets into the RX buffer.
Definition NRF24Stream.h:218
NRF24Stream(BaseBuffer< uint8_t > &buffer)
Constructor with an external receive buffer.
Definition NRF24Stream.h:74
NRF24Stream(RF24 &radio, BaseBuffer< uint8_t > &buffer)
Constructor with an externally created RF24 object and receive buffer.
Definition NRF24Stream.h:77
RF24 * radio()
Provides access to the RF24 radio object for advanced configuration.
Definition NRF24Stream.h:207
NRF24Config cfg
Definition NRF24Stream.h:210
NRF24Stream()=default
Default constructor.
size_t readBytes(uint8_t *data, size_t len) override
Reads received audio data from the RX buffer.
Definition NRF24Stream.h:169
BaseBuffer< uint8_t > * p_rx_buffer
Definition NRF24Stream.h:213
SingleBuffer< uint8_t > tx_buffer
Definition NRF24Stream.h:215
void end() override
Stops the radio and releases resources.
Definition NRF24Stream.h:154
int available() override
Returns the number of bytes available to read.
Definition NRF24Stream.h:176
RF24 * p_own_radio
Definition NRF24Stream.h:212
size_t write(const uint8_t *data, size_t len) override
Writes audio data, buffering into payload-sized packets for transmission.
Definition NRF24Stream.h:189
int availableForWrite() override
Returns the number of bytes available to write.
Definition NRF24Stream.h:183
NRF24Stream(RF24 &radio)
Constructor with an externally created RF24 object.
Definition NRF24Stream.h:71
bool begin() override
Initializes the radio hardware and configures TX or RX mode.
Definition NRF24Stream.h:106
bool begin(NRF24Config config)
Starts the stream with the given configuration.
Definition NRF24Stream.h:99
void setAudioInfo(AudioInfo info) override
Updates the audio info and propagates to the base class.
Definition NRF24Stream.h:91
NRF24Config defaultConfig(RxTxMode mode=TX_MODE)
Returns the default configuration for the given mode.
Definition NRF24Stream.h:84
RingBuffer< uint8_t > default_rx_buffer
Definition NRF24Stream.h:214
Implements a typed Ringbuffer.
Definition Buffers.h:353
virtual bool resize(size_t len)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:430
A simple Buffer implementation which just uses a (dynamically sized) array.
Definition Buffers.h:184
bool write(T sample) override
write add an entry to the buffer
Definition Buffers.h:218
int available() override
provides the number of entries that are available to read
Definition Buffers.h:245
bool isFull() override
checks if the buffer is full
Definition Buffers.h:252
T * data()
Provides address of actual data.
Definition Buffers.h:296
bool resize(size_t size)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:317
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 AudioCodecsBase.h:10
static const char * RxTxModeNames[4]
Text string (description) for RxTxMode.
Definition AudioTypes.h:38
void delay(uint32_t ms)
Definition Arduino.h:255
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:508
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:51
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition AudioTypes.h:53
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition AudioTypes.h:55
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits)
Definition AudioTypes.h:57
NRF24L01 Audio Configuration optimized for low-latency audio streaming. Uses the RF24 library from TM...
Definition NRF24Stream.h:21
bool auto_ack
Enable auto-acknowledgment. Disable for lowest latency.
Definition NRF24Stream.h:44
rf24_datarate_e data_rate
Data rate: RF24_250KBPS, RF24_1MBPS, RF24_2MBPS.
Definition NRF24Stream.h:34
uint8_t payload_size
Payload size in bytes (1-32)
Definition NRF24Stream.h:38
bool use_write_fast
Use writeFast() instead of write() for TX. Lower latency.
Definition NRF24Stream.h:48
uint8_t channel
RF channel (0-125). Higher channels (100+) are less crowded.
Definition NRF24Stream.h:32
int max_begin_retry
Number of retries for begin() initialization.
Definition NRF24Stream.h:50
int pin_csn
CSN pin number.
Definition NRF24Stream.h:30
rf24_crclength_e crc_length
CRC length: RF24_CRC_DISABLED, RF24_CRC_8, RF24_CRC_16.
Definition NRF24Stream.h:46
uint64_t address
Pipe address for communication (5 bytes). TX and RX must match.
Definition NRF24Stream.h:40
RxTxMode mode
RX or TX mode.
Definition NRF24Stream.h:42
NRF24Config()
Definition NRF24Stream.h:22
int pin_ce
CE pin number.
Definition NRF24Stream.h:28
rf24_pa_dbm_e pa_level
PA level: RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX.
Definition NRF24Stream.h:36