arduino-audio-tools
Loading...
Searching...
No Matches
AudioBLEServer.h
Go to the documentation of this file.
1#pragma once
2
3#include "AudioBLEStream.h"
4#include "ConstantsArduino.h"
5#include <ArduinoBLE.h>
7
8namespace audio_tools {
9
10class AudioBLEServer;
12
26public:
30
31 // starts a BLE server with the indicated name
32 bool begin(const char *name) {
33 TRACEI();
34 ble_server_name = name;
35
36 if (!BLE.begin()) {
37 LOGE("starting BLE failed");
38 return false;
39 }
40
41 // set the local name peripheral advertises
42 BLE.setLocalName(ble_server_name);
43
44 // assign event handlers for connected, disconnected to peripheral
47
48 // setup serice with characteristics
50
51 // start advertising
52 BLE.advertise();
53
54 return true;
55 }
56
57 void end() override {
58 TRACEI();
59 flush();
60 BLE.end();
61 }
62
63 size_t readBytes(uint8_t *data, size_t len) override {
64 TRACED();
66 return 0;
67 size_t read_size = getReadSize(len);
68 return receive_buffer.readArray(data, read_size);
69 }
70
71 int available() override {
73 return 0;
74 if (is_framed)
75 return receive_sizes.peek();
76 return this->receive_buffer.available();
77 }
78
79 size_t write(const uint8_t *data, size_t len) override {
80 LOGD("AudioBLEStream::write: %d", len);
82 return 0;
83 if (is_framed && availableForWrite() < len) {
84 return 0;
85 }
86 return transmit_buffer.writeArray(data, len);
87 }
88
89 int availableForWrite() override {
91 return 0;
94 // make sure we copy always a consistent amount of data
95 if (result < DEFAULT_BUFFER_SIZE)
96 result = 0;
97 return result;
98 }
99
100 bool connected() override { return checkCentralConnected(); }
101
102protected:
103 // server
110 BLEDescriptor ch01_desc{"2901", "channel 1"};
111 BLEDescriptor ch02_desc{"2901", "channel 2"};
112 BLEDescriptor info_desc{"2901", "info"};
113
118
122
126
130
135
137
139 TRACEI();
140 BLE.advertise();
141 }
142
145 TRACED();
147 // changed to auto to be version independent (it changed from std::string to
148 // String)
149 if (StrView(BLE_INFO_UUID).equals(characteristic.uuid())) {
151 characteristic.valueLength());
152 } else {
154 characteristic.valueLength());
155 }
156 }
157
160 TRACED();
161 auto uuid = StrView(characteristic.uuid());
162 if (uuid == BLE_CH1_UUID || uuid == BLE_CH2_UUID) {
163 TRACEI();
164 int len = std::min(getMTU(), (int)transmit_buffer.available());
165 if (is_framed) {
167 }
168 LOGI("%s: len: %d, buffer: %d", uuid.c_str(), len,
170 if (len > 0) {
171 uint8_t tmp[len];
172 transmit_buffer.peekArray(tmp, len);
173 if (characteristic.writeValue(tmp, len)) {
174 transmit_buffer.readArray(tmp, len);
175 } else {
176 LOGW("writeValue failed")
177 }
178 }
179 }
180 }
181
183 central = BLE.central();
184 // if a central is connected to the peripheral:
185 if (central)
186 return central.connected();
187 return false;
188 }
189
190 virtual void receiveAudio(const uint8_t *data, size_t size) {
191 while (receive_buffer.availableForWrite() < size) {
192 // wait for ringbuffer to get freed up
193 delay(10);
194 }
195 if (is_framed)
196 receive_sizes.write(size);
197 receive_buffer.writeArray(data, size);
198 }
199
201 TRACEI();
202 // send update via BLE
203 StrView str = toStr(info);
204 LOGI("AudioInfo: %s", str.c_str());
205 info_char.setValue((uint8_t *)str.c_str(), str.length() + 1);
206 }
207
208 int getMTU() override {
209 TRACED();
210 if (max_transfer_size == 0) {
211 // int peer_max_transfer_size =
212 // p_server->getPeerMTU(p_server->getConnId()) - BLE_MTU_OVERHEAD;
213 // max_transfer_size = std::min(BLE_MTU - BLE_MTU,
214 // peer_max_transfer_size);
215 // max_transfer_size = central.mtu() - BLE_MTU_OVERHEAD;
217
218 LOGI("max_transfer_size: %d", max_transfer_size);
219 }
220 return max_transfer_size;
221 }
222
224 TRACEI();
225 // set the UUID for the service this peripheral advertises
226 BLE.setAdvertisedService(service);
227
228 ch01_char.addDescriptor(ch01_desc);
229 ch02_char.addDescriptor(ch02_desc);
230
231 // add the characteristic to the service
232 service.addCharacteristic(ch01_char);
233 service.addCharacteristic(ch02_char);
234
235 // assign event handlers for characteristic
236 ch02_char.setEventHandler(BLEWritten, bleOnWrite);
237 ch01_char.setEventHandler(BLERead, bleOnRead);
238
240 info_char.addDescriptor(info_desc);
241 service.addCharacteristic(info_char);
242 }
243
244 // add service
245 BLE.addService(service);
246
247 // provide AudioInfo
250 }
251
252 // Read callback works only when we provide some initial data
253 uint8_t tmp[512] = {0xFF};
254 ch01_char.writeValue(tmp, 512, false);
255 }
256
258 if (transmit_buffer.size() == 0) {
259 LOGI("Setting transmit_buffer to %d", RX_BUFFER_SIZE);
261 if (is_framed) {
263 }
264 }
265 }
266
268 if (receive_buffer.size() == 0) {
269 LOGI("Setting receive_buffer to %d for mtu %d", RX_BUFFER_SIZE, getMTU());
271 if (is_framed) {
273 }
274 }
275 }
276
277 size_t getReadSize(size_t dataSize) {
278 size_t read_size = dataSize;
279 if (is_framed) {
280 read_size = 0;
281 if (receive_sizes.available() > 0) {
282 read_size = receive_sizes.read();
283 }
284 if (dataSize < read_size) {
285 LOGE("read size too small: %d - it must be >= %d", dataSize, read_size);
286 return 0;
287 }
288 if (receive_buffer.available() < read_size) {
289 LOGE("missing data in buffer");
290 return 0;
291 }
292 }
293 return read_size;
294 }
295};
296
297} // namespace audio_tools
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGD(...)
Definition AudioLoggerIDF.h:27
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define BLE_MTU
Definition ConstantsArduino.h:4
#define TX_COUNT
Definition ConstantsArduino.h:9
#define RX_BUFFER_SIZE
Definition ConstantsArduino.h:6
#define TX_BUFFER_SIZE
Definition ConstantsArduino.h:8
#define RX_COUNT
Definition ConstantsArduino.h:7
#define BLE_MTU_OVERHEAD
Definition ConstantsArduino.h:5
#define DEFAULT_BUFFER_SIZE
Definition avr.h:20
A simple BLE server that implements the serial protocol, so that it can be used to send and recevie a...
Definition AudioBLEServer.h:25
BLEService service
Definition AudioBLEServer.h:105
void setupTXBuffer()
Definition AudioBLEServer.h:257
void onConnect(BLEDevice device)
Definition AudioBLEServer.h:136
virtual void receiveAudio(const uint8_t *data, size_t size)
Definition AudioBLEServer.h:190
void setupBLEService()
Definition AudioBLEServer.h:223
BLECharacteristic ch01_char
Definition AudioBLEServer.h:106
BLEDescriptor ch02_desc
Definition AudioBLEServer.h:111
BLECharacteristic ch02_char
Definition AudioBLEServer.h:107
static void bleOnWrite(BLEDevice device, BLECharacteristic characteristic)
Definition AudioBLEServer.h:127
bool begin(const char *name)
Definition AudioBLEServer.h:32
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioBLEServer.h:63
void onWrite(BLECharacteristic characteristic)
store the next batch of data
Definition AudioBLEServer.h:144
static void blePeripheralConnectHandler(BLEDevice device)
Definition AudioBLEServer.h:119
void setupRXBuffer()
Definition AudioBLEServer.h:267
bool checkCentralConnected()
Definition AudioBLEServer.h:182
RingBuffer< uint8_t > transmit_buffer
Definition AudioBLEServer.h:116
void end() override
Definition AudioBLEServer.h:57
int available() override
Definition AudioBLEServer.h:71
BLEDescriptor ch01_desc
Definition AudioBLEServer.h:110
size_t getReadSize(size_t dataSize)
Definition AudioBLEServer.h:277
size_t write(const uint8_t *data, size_t len) override
Definition AudioBLEServer.h:79
static void bleOnRead(BLEDevice device, BLECharacteristic characteristic)
Definition AudioBLEServer.h:131
int availableForWrite() override
Definition AudioBLEServer.h:89
RingBuffer< uint8_t > receive_buffer
Definition AudioBLEServer.h:114
static void blePeripheralDisconnectHandler(BLEDevice device)
Definition AudioBLEServer.h:123
bool connected() override
Definition AudioBLEServer.h:100
void onRead(BLECharacteristic characteristic)
provide the next batch of audio data
Definition AudioBLEServer.h:159
void onDisconnect(BLEDevice device)
Definition AudioBLEServer.h:138
AudioBLEServer(int mtu=0)
Definition AudioBLEServer.h:27
BLEDevice central
Definition AudioBLEServer.h:104
BLECharacteristic info_char
Definition AudioBLEServer.h:108
RingBuffer< uint16_t > transmit_buffer_sizes
Definition AudioBLEServer.h:117
void writeAudioInfoCharacteristic(AudioInfo info)
Definition AudioBLEServer.h:200
BLEDescriptor info_desc
Definition AudioBLEServer.h:112
int getMTU() override
Definition AudioBLEServer.h:208
RingBuffer< uint16_t > receive_sizes
Definition AudioBLEServer.h:115
Transmit and receive data via BLE using a Serial API. The following additional experimental features ...
Definition AudioBLEStream.h:20
const char * BLE_INFO_UUID
Definition AudioBLEStream.h:79
void setAudioInfo(AudioInfo info)
Defines the input AudioInfo.
Definition AudioBLEStream.h:28
const char * BLE_CH2_UUID
Definition AudioBLEStream.h:78
uint16_t max_transfer_size
Definition AudioBLEStream.h:68
const char * ble_server_name
Definition AudioBLEStream.h:67
const char * BLE_AUDIO_SERVICE_UUID
Definition AudioBLEStream.h:76
bool is_audio_info_active
Definition AudioBLEStream.h:70
const char * BLE_CH1_UUID
Definition AudioBLEStream.h:77
bool is_framed
Definition AudioBLEStream.h:71
StrView toStr(AudioInfo info)
Definition AudioBLEStream.h:50
AudioInfo info
Definition BaseStream.h:174
virtual int readArray(T data[], int len)
reads multiple values
Definition Buffers.h:33
virtual int writeArray(const T data[], int len)
Fills the buffer data.
Definition Buffers.h:55
virtual void flush() override
Definition BaseStream.h:62
Implements a typed Ringbuffer.
Definition Buffers.h:341
bool peek(T &result) override
peeks the actual entry from the buffer
Definition Buffers.h:361
virtual int peekArray(T *data, int n)
Definition Buffers.h:370
bool read(T &result) override
reads a single value
Definition Buffers.h:348
virtual int availableForWrite() override
provides the number of entries that are available to write
Definition Buffers.h:413
virtual bool write(T data) override
write add an entry to the buffer
Definition Buffers.h:391
virtual size_t size() override
Returns the maximum capacity of the buffer.
Definition Buffers.h:428
virtual bool resize(int len)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:418
virtual int available() override
provides the number of entries that are available to read
Definition Buffers.h:410
A simple wrapper to provide string functions on existing allocated char*. If the underlying char* is ...
Definition StrView.h:28
virtual int length()
Definition StrView.h:383
virtual const char * c_str()
provides the string value as const char*
Definition StrView.h:379
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
class AudioBLEServer * selfAudioBLEServer
Definition AudioBLEServer.h:11
void delay(unsigned long ms)
Definition Time.h:23
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:512
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:55