11#pragma once
22
33#include < ArduinoBLE.h>
4+ #include " BLEMIDI_Namespace.h"
5+ #include " BLEMIDI_Settings.h"
46
57#define BLE_POLLING
68
79BEGIN_BLEMIDI_NAMESPACE
810
11+ // Dependanced class settings
12+ struct BLEDefaultSettings : public CommonBLEDefaultSettings
13+ {
14+ // TODO Create parametric configurations
15+ };
16+
917BLEService midiService (SERVICE_UUID);
1018
1119BLEStringCharacteristic midiChar (CHARACTERISTIC_UUID, // standard 16-bit characteristic UUID
@@ -73,12 +81,13 @@ class BLEMIDI_ArduinoBLE
7381
7482 Fifo<byte, _Settings::MaxBufferSize> mRxBuffer ;
7583
76- template < class > friend class MyServerCallbacks ;
84+ static BLEMIDI_ArduinoBLE<_Settings>* self ;
7785
7886public:
7987 BLEMIDI_ArduinoBLE () : _midiService(SERVICE_UUID),
8088 _midiChar (CHARACTERISTIC_UUID, BLERead | BLEWrite | BLENotify | BLEWriteWithoutResponse, _Settings::MaxBufferSize)
8189 {
90+ self = this ;
8291 }
8392
8493 bool begin (const char *, BLEMIDI_Transport<class BLEMIDI_ArduinoBLE <_Settings>, _Settings> *);
@@ -139,59 +148,26 @@ class BLEMIDI_ArduinoBLE
139148
140149 end ();
141150 }
142- };
143-
144- template <class _Settings >
145- class MyServerCallbacks : public BLEDeviceCallbacks
146- {
147- public:
148- MyServerCallbacks (BLEMIDI_ArduinoBLE<_Settings> *bluetooth)
149- : _bluetooth(bluetooth)
150- {
151- }
152-
153- protected:
154- BLEMIDI_ArduinoBLE<_Settings> *_bluetooth = nullptr ;
155-
156- void onConnect (BLEDevice device)
157- {
158- if (_bluetooth)
159- _bluetooth->connected ();
160- };
161-
162- void onDisconnect (BLEDevice device)
163- {
164- if (_bluetooth)
165- _bluetooth->disconnected ();
166- }
167- };
168151
169- template <class _Settings >
170- class MyCharacteristicCallbacks : public BLECharacteristicCallbacks
171- {
172- public:
173- MyCharacteristicCallbacks (BLEMIDI_ArduinoBLE<_Settings> *bluetooth)
174- : _bluetooth(bluetooth)
175- {
152+ static void blePeripheralConnectedHandler (BLEDevice central) {
153+ self->connected ();
176154 }
177-
178- protected:
179- BLEMIDI_ArduinoBLE<_Settings> *_bluetooth = nullptr ;
180-
181- void onWrite (BLECharacteristic characteristic)
182- {
183- // std::string rxValue = characteristic->getValue();
184- // if (rxValue.length() > 0)
185- // {
186- // _bluetooth->receive((uint8_t *)(rxValue.c_str()), rxValue.length());
187- // }
155+
156+ static void blePeripheralDisconnectedHandler (BLEDevice central) {
157+ self->disconnected ();
188158 }
189-
190- void onRead (BLECharacteristic characteristic)
191- {
159+
160+ static void switchCharacteristicWritten (BLEDevice central, BLECharacteristic characteristic) {
161+ // std::string rxValue = characteristic->value();
162+ // if (rxValue.length() > 0)
163+ // receive((uint8_t *)(rxValue.c_str()), rxValue.length());
192164 }
193165};
194166
167+ // this pattern of static to instance variable is limited to 1 instance of ArduinoBLE
168+ // for multiple instances, turn this into a vector and lookup
169+ template <class _Settings > BLEMIDI_ArduinoBLE<_Settings>* BLEMIDI_ArduinoBLE<_Settings>::self;
170+
195171template <class _Settings >
196172bool BLEMIDI_ArduinoBLE<_Settings>::begin(const char *deviceName, BLEMIDI_Transport<class BLEMIDI_ArduinoBLE <_Settings>, _Settings> *bleMidiTransport)
197173{
@@ -207,9 +183,10 @@ bool BLEMIDI_ArduinoBLE<_Settings>::begin(const char *deviceName, BLEMIDI_Transp
207183 _midiService.addCharacteristic (_midiChar);
208184 BLE.addService (_midiService);
209185
210- BLE.setCallbacks (new MyServerCallbacks<_Settings>(this ));
186+ BLE.setEventHandler (BLEConnected, blePeripheralConnectedHandler);
187+ BLE.setEventHandler (BLEDisconnected, blePeripheralDisconnectedHandler);
211188
212- _midiChar.setCallbacks ( new MyCharacteristicCallbacks<_Settings>( this ) );
189+ _midiChar.setEventHandler (BLEWritten, switchCharacteristicWritten );
213190
214191 // set the initial value for the characeristic:
215192 // (when not set, the device will disconnect after 0.5 seconds)
@@ -223,20 +200,21 @@ bool BLEMIDI_ArduinoBLE<_Settings>::begin(const char *deviceName, BLEMIDI_Transp
223200 return true ;
224201}
225202
203+
226204/* ! \brief Create an instance for ArduinoBLE <DeviceName>
227205 */
228206#define BLEMIDI_CREATE_CUSTOM_INSTANCE (DeviceName, Name, _Settings ) \
229207 BLEMIDI_NAMESPACE::BLEMIDI_Transport<BLEMIDI_NAMESPACE::BLEMIDI_ArduinoBLE<_Settings>, _Settings> BLE##Name(DeviceName); \
230- MIDI_NAMESPACE::MidiInterface<BLEMIDI_NAMESPACE::BLEMIDI_Transport<BLEMIDI_NAMESPACE::BLEMIDI_ArduinoBLE<_Settings>, _Settings>, BLEMIDI_NAMESPACE::MySettings > Name ((BLEMIDI_NAMESPACE::BLEMIDI_Transport<BLEMIDI_NAMESPACE::BLEMIDI_ArduinoBLE<_Settings>, _Settings> &)BLE##Name);
208+ MIDI_NAMESPACE::MidiInterface<BLEMIDI_NAMESPACE::BLEMIDI_Transport<BLEMIDI_NAMESPACE::BLEMIDI_ArduinoBLE<_Settings>, _Settings>, BLEMIDI_NAMESPACE::BLEDefaultSettings > Name ((BLEMIDI_NAMESPACE::BLEMIDI_Transport<BLEMIDI_NAMESPACE::BLEMIDI_ArduinoBLE<_Settings>, _Settings> &)BLE##Name);
231209
232210/* ! \brief Create an instance for ArduinoBLE <DeviceName>
233211 */
234212#define BLEMIDI_CREATE_INSTANCE (DeviceName, Name ) \
235- BLEMIDI_CREATE_CUSTOM_INSTANCE (DeviceName, Name, BLEMIDI_NAMESPACE::DefaultSettings );
213+ BLEMIDI_CREATE_CUSTOM_INSTANCE (DeviceName, Name, BLEMIDI_NAMESPACE::BLEDefaultSettings );
236214
237215/* ! \brief Create a default instance for ArduinoBLE named BLE-MIDI
238216 */
239217#define BLEMIDI_CREATE_DEFAULT_INSTANCE () \
240218 BLEMIDI_CREATE_INSTANCE (" BLE-MIDI" , MIDI)
241219
242- END_BLEMIDI_NAMESPACE
220+ END_BLEMIDI_NAMESPACE
0 commit comments