arduino-audio-tools
Loading...
Searching...
No Matches
AudioBLEClient.h
Go to the documentation of this file.
1#pragma once
2
3#include "AudioBLEStream.h"
4#include "ConstantsArduino.h"
5#include <ArduinoBLE.h>
6
7namespace audio_tools {
8
9class AudioBLEClient;
11
21public:
26
28 bool begin(const char *localName, int seconds) {
29 TRACEI();
30 // Init BLE device
31 BLE.begin();
32 BLE.setLocalName(localName);
33 BLE.scanForUuid(BLE_AUDIO_SERVICE_UUID);
34 return true;
35 }
36
37 void end() override {
38 TRACEI();
39 flush();
40 BLE.end();
41 }
42
43 size_t readBytes(uint8_t *data, size_t len) override {
44 TRACED();
45 if (!setupBLEClient()) {
46 return 0;
47 }
48
49 if (!ch01_char.canRead())
50 return 0;
51
52 return ch01_char.readValue(data, len);
53 }
54
55 int available() override { return BLE_MTU - BLE_MTU_OVERHEAD; }
56
57 size_t write(const uint8_t *data, size_t len) override {
58 TRACED();
59 if (!setupBLEClient()) {
60 return 0;
61 }
62
63 if (!ch02_char.canWrite()) {
64 return 0;
65 }
66
67 if (is_framed) {
69 delay(1);
70 } else {
71 // send only data with max mtu
72 for (int j = 0; j < len; j++) {
73 write_buffer.write(data[j]);
74 if (write_buffer.isFull()) {
78 }
79 }
80 }
81 return len;
82 }
83
87
88 bool connected() override { return setupBLEClient(); }
89
90 void setWriteThrottle(int ms) { write_throttle = ms; }
91
93
94protected:
102
104 TRACEI();
105 // send update via BLE
106 info_char.writeValue((uint8_t *)&info, sizeof(AudioInfo));
107 }
108
109 void writeChannel2Characteristic(const uint8_t *data, size_t len) {
110 if (ch02_char.canWrite()) {
111 ch02_char.writeValue((uint8_t *)data, len, write_confirmation_flag);
113 }
114 }
115
117 if (!info_char.canRead())
118 return false;
119 const uint8_t *str = info_char.value();
120 int len = info_char.valueLength();
121 if (len > 0) {
122 setAudioInfo(str, len);
123 return true;
124 }
125 return false;
126 }
127
128 static void onInfoUpdated(BLEDevice central,
131 characteristic.valueLength());
132 }
133
135 // if we are already connected there is nothing to do
136 if (peripheral.connected()) {
137 return true;
138 }
139
140 TRACEI();
141
142 // setup buffer
143 if (write_buffer.size() == 0) {
145 }
146
147 peripheral = BLE.available();
148 if (!peripheral) {
149 return false;
150 }
151
152 BLE.stopScan();
153
154 if (!peripheral.connect()) {
155 return false;
156 }
157
158 if (peripheral.discoverAttributes()) {
159 LOGI("Attributes discovered");
160 } else {
161 LOGE("Attribute discovery failed!");
162 peripheral.disconnect();
163 return false;
164 }
165
166 ch01_char = peripheral.characteristic(BLE_CH1_UUID);
167 if (!ch01_char) {
168 peripheral.disconnect();
169 return false;
170 }
171
172 ch02_char = peripheral.characteristic(BLE_CH2_UUID);
173 if (!ch02_char) {
174 peripheral.disconnect();
175 return false;
176 }
177
179 info_char = peripheral.characteristic(BLE_INFO_UUID);
180 info_char.setEventHandler(BLEUpdated, onInfoUpdated);
181 }
182
183 return true;
184 }
185};
186
187} // namespace audio_tools
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define BLE_MTU
Definition ConstantsArduino.h:4
#define BLE_MTU_OVERHEAD
Definition ConstantsArduino.h:5
#define DEFAULT_BUFFER_SIZE
Definition avr.h:20
A simple BLE client that implements the serial protocol, so that it can be used to send and recevie a...
Definition AudioBLEClient.h:20
AudioBLEClient(int mtu=242)
Definition AudioBLEClient.h:22
BLEDevice peripheral
Definition AudioBLEClient.h:95
BLECharacteristic ch01_char
Definition AudioBLEClient.h:96
void writeChannel2Characteristic(const uint8_t *data, size_t len)
Definition AudioBLEClient.h:109
BLECharacteristic ch02_char
Definition AudioBLEClient.h:97
void setConfirmWrite(bool flag)
Definition AudioBLEClient.h:92
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioBLEClient.h:43
bool readAudioInfoCharacteristic()
Definition AudioBLEClient.h:116
void writeAudioInfoCharacteristic(AudioInfo info) override
Definition AudioBLEClient.h:103
void end() override
Definition AudioBLEClient.h:37
int available() override
Definition AudioBLEClient.h:55
bool begin(const char *localName, int seconds)
starts a BLE client
Definition AudioBLEClient.h:28
int write_throttle
Definition AudioBLEClient.h:100
size_t write(const uint8_t *data, size_t len) override
Definition AudioBLEClient.h:57
static void onInfoUpdated(BLEDevice central, BLECharacteristic characteristic)
Definition AudioBLEClient.h:128
int availableForWrite() override
Definition AudioBLEClient.h:84
bool connected() override
Definition AudioBLEClient.h:88
BLECharacteristic info_char
Definition AudioBLEClient.h:98
SingleBuffer< uint8_t > write_buffer
Definition AudioBLEClient.h:99
bool setupBLEClient()
Definition AudioBLEClient.h:134
bool write_confirmation_flag
Definition AudioBLEClient.h:101
int getMTU() override
Definition AudioBLEClientESP32.h:269
void setWriteThrottle(int ms)
Definition AudioBLEClient.h:90
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_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
AudioInfo info
Definition BaseStream.h:174
virtual void flush() override
Definition BaseStream.h:62
A simple Buffer implementation which just uses a (dynamically sized) array.
Definition Buffers.h:172
size_t size() override
Definition Buffers.h:303
bool write(T sample) override
write add an entry to the buffer
Definition Buffers.h:206
int available() override
provides the number of entries that are available to read
Definition Buffers.h:233
bool isFull() override
checks if the buffer is full
Definition Buffers.h:240
bool resize(int size)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:305
T * data()
Provides address of actual data.
Definition Buffers.h:284
void reset() override
clears the buffer
Definition Buffers.h:286
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
static AudioBLEClient * selfAudioBLEClient
Definition AudioBLEClient.h:10
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