From e0afefb9a2af155f0a2fc6efa9d26e5dc4d1d504 Mon Sep 17 00:00:00 2001 From: lathoub Date: Wed, 22 Sep 2021 22:42:12 +0200 Subject: [PATCH] re-advertise after disconnect (ESP32 & ESP32_NimBLE) --- src/hardware/BLEMIDI_ArduinoBLE.h | 1 + src/hardware/BLEMIDI_ESP32.h | 147 +++++++++++++++------------- src/hardware/BLEMIDI_ESP32_NimBLE.h | 141 +++++++++++++------------- 3 files changed, 155 insertions(+), 134 deletions(-) diff --git a/src/hardware/BLEMIDI_ArduinoBLE.h b/src/hardware/BLEMIDI_ArduinoBLE.h index 3b4cb9f..82f3a04 100644 --- a/src/hardware/BLEMIDI_ArduinoBLE.h +++ b/src/hardware/BLEMIDI_ArduinoBLE.h @@ -170,6 +170,7 @@ protected: { if (_bleMidiTransport->_disconnectedCallback) _bleMidiTransport->_disconnectedCallback(); + _central = nullptr; } diff --git a/src/hardware/BLEMIDI_ESP32.h b/src/hardware/BLEMIDI_ESP32.h index ec961eb..f67a419 100644 --- a/src/hardware/BLEMIDI_ESP32.h +++ b/src/hardware/BLEMIDI_ESP32.h @@ -11,37 +11,37 @@ BEGIN_BLEMIDI_NAMESPACE class BLEMIDI_ESP32 { private: - BLEServer* _server = nullptr; - BLEAdvertising* _advertising = nullptr; - BLECharacteristic* _characteristic = nullptr; - - BLEMIDI_Transport* _bleMidiTransport = nullptr; + BLEServer *_server = nullptr; + BLEAdvertising *_advertising = nullptr; + BLECharacteristic *_characteristic = nullptr; - friend class MyServerCallbacks; - friend class MyCharacteristicCallbacks; + BLEMIDI_Transport *_bleMidiTransport = nullptr; + + friend class MyServerCallbacks; + friend class MyCharacteristicCallbacks; protected: QueueHandle_t mRxQueue; public: - BLEMIDI_ESP32() + BLEMIDI_ESP32() { - } - - bool begin(const char*, BLEMIDI_Transport*); - - void end() - { - } - void write(uint8_t* buffer, size_t length) + bool begin(const char *, BLEMIDI_Transport *); + + void end() + { + Serial.println("end"); + } + + void write(uint8_t *buffer, size_t length) { _characteristic->setValue(buffer, length); _characteristic->notify(); } - - bool available(byte* pvBuffer) + + bool available(byte *pvBuffer) { return xQueueReceive(mRxQueue, pvBuffer, 0); // return immediately when the queue is empty } @@ -53,86 +53,97 @@ public: } protected: - void receive(uint8_t* buffer, size_t length) - { + void receive(uint8_t *buffer, size_t length) + { // parse the incoming buffer _bleMidiTransport->receive(buffer, length); - } + } - void connected() - { - if (_bleMidiTransport->_connectedCallback) - _bleMidiTransport->_connectedCallback(); - } + void connected() + { + if (_bleMidiTransport->_connectedCallback) + _bleMidiTransport->_connectedCallback(); + } - void disconnected() - { - if (_bleMidiTransport->_disconnectedCallback) - _bleMidiTransport->_disconnectedCallback(); - } + void disconnected() + { + if (_bleMidiTransport->_disconnectedCallback) + _bleMidiTransport->_disconnectedCallback(); + + end(); + } }; -class MyServerCallbacks: public BLEServerCallbacks { +class MyServerCallbacks : public BLEServerCallbacks +{ public: - MyServerCallbacks(BLEMIDI_ESP32* bluetoothEsp32) - : _bluetoothEsp32(bluetoothEsp32) { + MyServerCallbacks(BLEMIDI_ESP32 *bluetoothEsp32) + : _bluetoothEsp32(bluetoothEsp32) + { } protected: - BLEMIDI_ESP32* _bluetoothEsp32 = nullptr; + BLEMIDI_ESP32 *_bluetoothEsp32 = nullptr; - void onConnect(BLEServer*) { + void onConnect(BLEServer *) + { if (_bluetoothEsp32) _bluetoothEsp32->connected(); }; - - void onDisconnect(BLEServer*) { + + void onDisconnect(BLEServer *server) + { if (_bluetoothEsp32) _bluetoothEsp32->disconnected(); - } + + server->getAdvertising()->start(); + } }; -class MyCharacteristicCallbacks: public BLECharacteristicCallbacks { +class MyCharacteristicCallbacks : public BLECharacteristicCallbacks +{ public: - MyCharacteristicCallbacks(BLEMIDI_ESP32* bluetoothEsp32) - : _bluetoothEsp32(bluetoothEsp32 ) { + MyCharacteristicCallbacks(BLEMIDI_ESP32 *bluetoothEsp32) + : _bluetoothEsp32(bluetoothEsp32) + { } - -protected: - BLEMIDI_ESP32* _bluetoothEsp32 = nullptr; - void onWrite(BLECharacteristic * characteristic) { +protected: + BLEMIDI_ESP32 *_bluetoothEsp32 = nullptr; + + void onWrite(BLECharacteristic *characteristic) + { std::string rxValue = characteristic->getValue(); - if (rxValue.length() > 0) { - _bluetoothEsp32->receive((uint8_t *)(rxValue.c_str()), rxValue.length()); + if (rxValue.length() > 0) + { + _bluetoothEsp32->receive((uint8_t *)(rxValue.c_str()), rxValue.length()); } } }; -bool BLEMIDI_ESP32::begin(const char* deviceName, BLEMIDI_Transport* bleMidiTransport) +bool BLEMIDI_ESP32::begin(const char *deviceName, BLEMIDI_Transport *bleMidiTransport) { - _bleMidiTransport = bleMidiTransport; + _bleMidiTransport = bleMidiTransport; BLEDevice::init(deviceName); - + // To communicate between the 2 cores. // Core_0 runs here, core_1 runs the BLE stack mRxQueue = xQueueCreate(64, sizeof(uint8_t)); // TODO Settings::MaxBufferSize _server = BLEDevice::createServer(); _server->setCallbacks(new MyServerCallbacks(this)); - + // Create the BLE Service auto service = _server->createService(BLEUUID(SERVICE_UUID)); - + // Create a BLE Characteristic _characteristic = service->createCharacteristic( - BLEUUID(CHARACTERISTIC_UUID), - BLECharacteristic::PROPERTY_READ | - BLECharacteristic::PROPERTY_WRITE | - BLECharacteristic::PROPERTY_NOTIFY | - BLECharacteristic::PROPERTY_WRITE_NR - ); + BLEUUID(CHARACTERISTIC_UUID), + BLECharacteristic::PROPERTY_READ | + BLECharacteristic::PROPERTY_WRITE | + BLECharacteristic::PROPERTY_NOTIFY | + BLECharacteristic::PROPERTY_WRITE_NR); // Add CCCD 0x2902 to allow notify _characteristic->addDescriptor(new BLE2902()); @@ -143,25 +154,27 @@ bool BLEMIDI_ESP32::begin(const char* deviceName, BLEMIDI_Transportstart(); - + // Start advertising _advertising = _server->getAdvertising(); _advertising->addServiceUUID(service->getUUID()); _advertising->setAppearance(0x00); _advertising->start(); - + + Serial.println("begin"); + return true; } - /*! \brief Create an instance for ESP32 named +/*! \brief Create an instance for ESP32 named */ -#define BLEMIDI_CREATE_INSTANCE(DeviceName, Name) \ -BLEMIDI_NAMESPACE::BLEMIDI_Transport BLE##Name(DeviceName); \ -MIDI_NAMESPACE::MidiInterface, BLEMIDI_NAMESPACE::MySettings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport &)BLE##Name); +#define BLEMIDI_CREATE_INSTANCE(DeviceName, Name) \ + BLEMIDI_NAMESPACE::BLEMIDI_Transport BLE##Name(DeviceName); \ + MIDI_NAMESPACE::MidiInterface, BLEMIDI_NAMESPACE::MySettings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport &)BLE##Name); - /*! \brief Create a default instance for ESP32 named BLE-MIDI +/*! \brief Create a default instance for ESP32 named BLE-MIDI */ #define BLEMIDI_CREATE_DEFAULT_INSTANCE() \ -BLEMIDI_CREATE_INSTANCE("Esp32-BLE-MIDI", MIDI) + BLEMIDI_CREATE_INSTANCE("Esp32-BLE-MIDI", MIDI) END_BLEMIDI_NAMESPACE diff --git a/src/hardware/BLEMIDI_ESP32_NimBLE.h b/src/hardware/BLEMIDI_ESP32_NimBLE.h index b601f61..75f894d 100644 --- a/src/hardware/BLEMIDI_ESP32_NimBLE.h +++ b/src/hardware/BLEMIDI_ESP32_NimBLE.h @@ -8,40 +8,39 @@ BEGIN_BLEMIDI_NAMESPACE class BLEMIDI_ESP32_NimBLE { private: - BLEServer* _server = nullptr; - BLEAdvertising* _advertising = nullptr; - BLECharacteristic* _characteristic = nullptr; - - BLEMIDI_Transport* _bleMidiTransport = nullptr; + BLEServer *_server = nullptr; + BLEAdvertising *_advertising = nullptr; + BLECharacteristic *_characteristic = nullptr; - friend class MyServerCallbacks; - friend class MyCharacteristicCallbacks; + BLEMIDI_Transport *_bleMidiTransport = nullptr; + + friend class MyServerCallbacks; + friend class MyCharacteristicCallbacks; protected: QueueHandle_t mRxQueue; public: - BLEMIDI_ESP32_NimBLE() + BLEMIDI_ESP32_NimBLE() { - } - - bool begin(const char*, BLEMIDI_Transport*); - - void end() - { - } - void write(uint8_t* buffer, size_t length) + bool begin(const char *, BLEMIDI_Transport *); + + void end() + { + } + + void write(uint8_t *buffer, size_t length) { _characteristic->setValue(buffer, length); _characteristic->notify(); } - - bool available(byte* pvBuffer) + + bool available(byte *pvBuffer) { // return 1 byte from the Queue - return xQueueReceive(mRxQueue, (void*)pvBuffer, 0); // return immediately when the queue is empty + return xQueueReceive(mRxQueue, (void *)pvBuffer, 0); // return immediately when the queue is empty } void add(byte value) @@ -51,86 +50,94 @@ public: } protected: - void receive(uint8_t* buffer, size_t length) - { + void receive(uint8_t *buffer, size_t length) + { // forward the buffer so it can be parsed _bleMidiTransport->receive(buffer, length); - } + } - void connected() - { - if (_bleMidiTransport->_connectedCallback) - _bleMidiTransport->_connectedCallback(); - } + void connected() + { + if (_bleMidiTransport->_connectedCallback) + _bleMidiTransport->_connectedCallback(); + } - void disconnected() - { - if (_bleMidiTransport->_disconnectedCallback) - _bleMidiTransport->_disconnectedCallback(); - } + void disconnected() + { + if (_bleMidiTransport->_disconnectedCallback) + _bleMidiTransport->_disconnectedCallback(); + } }; -class MyServerCallbacks: public BLEServerCallbacks { +class MyServerCallbacks : public BLEServerCallbacks +{ public: - MyServerCallbacks(BLEMIDI_ESP32_NimBLE* bluetoothEsp32) - : _bluetoothEsp32(bluetoothEsp32) { + MyServerCallbacks(BLEMIDI_ESP32_NimBLE *bluetoothEsp32) + : _bluetoothEsp32(bluetoothEsp32) + { } protected: - BLEMIDI_ESP32_NimBLE* _bluetoothEsp32 = nullptr; + BLEMIDI_ESP32_NimBLE *_bluetoothEsp32 = nullptr; - void onConnect(BLEServer*) { + void onConnect(BLEServer *) + { if (_bluetoothEsp32) _bluetoothEsp32->connected(); }; - - void onDisconnect(BLEServer*) { + + void onDisconnect(BLEServer *) + { if (_bluetoothEsp32) _bluetoothEsp32->disconnected(); - } + } }; -class MyCharacteristicCallbacks: public BLECharacteristicCallbacks { +class MyCharacteristicCallbacks : public BLECharacteristicCallbacks +{ public: - MyCharacteristicCallbacks(BLEMIDI_ESP32_NimBLE* bluetoothEsp32) - : _bluetoothEsp32(bluetoothEsp32 ) { + MyCharacteristicCallbacks(BLEMIDI_ESP32_NimBLE *bluetoothEsp32) + : _bluetoothEsp32(bluetoothEsp32) + { } - -protected: - BLEMIDI_ESP32_NimBLE* _bluetoothEsp32 = nullptr; - void onWrite(BLECharacteristic * characteristic) { +protected: + BLEMIDI_ESP32_NimBLE *_bluetoothEsp32 = nullptr; + + void onWrite(BLECharacteristic *characteristic) + { std::string rxValue = characteristic->getValue(); - if (rxValue.length() > 0) { - _bluetoothEsp32->receive((uint8_t *)(rxValue.c_str()), rxValue.length()); + if (rxValue.length() > 0) + { + _bluetoothEsp32->receive((uint8_t *)(rxValue.c_str()), rxValue.length()); } } }; -bool BLEMIDI_ESP32_NimBLE::begin(const char* deviceName, BLEMIDI_Transport* bleMidiTransport) +bool BLEMIDI_ESP32_NimBLE::begin(const char *deviceName, BLEMIDI_Transport *bleMidiTransport) { - _bleMidiTransport = bleMidiTransport; + _bleMidiTransport = bleMidiTransport; BLEDevice::init(deviceName); - + // To communicate between the 2 cores. // Core_0 runs here, core_1 runs the BLE stack mRxQueue = xQueueCreate(64, sizeof(uint8_t)); // TODO Settings::MaxBufferSize _server = BLEDevice::createServer(); _server->setCallbacks(new MyServerCallbacks(this)); - + _server->advertiseOnDisconnect(true); + // Create the BLE Service auto service = _server->createService(BLEUUID(SERVICE_UUID)); - + // Create a BLE Characteristic _characteristic = service->createCharacteristic( - BLEUUID(CHARACTERISTIC_UUID), - NIMBLE_PROPERTY::READ | - NIMBLE_PROPERTY::WRITE | - NIMBLE_PROPERTY::NOTIFY | - NIMBLE_PROPERTY::WRITE_NR - ); + BLEUUID(CHARACTERISTIC_UUID), + NIMBLE_PROPERTY::READ | + NIMBLE_PROPERTY::WRITE | + NIMBLE_PROPERTY::NOTIFY | + NIMBLE_PROPERTY::WRITE_NR); _characteristic->setCallbacks(new MyCharacteristicCallbacks(this)); @@ -145,19 +152,19 @@ bool BLEMIDI_ESP32_NimBLE::begin(const char* deviceName, BLEMIDI_TransportaddServiceUUID(service->getUUID()); _advertising->setAppearance(0x00); _advertising->start(); - + return true; } - /*! \brief Create an instance for ESP32 named +/*! \brief Create an instance for ESP32 named */ -#define BLEMIDI_CREATE_INSTANCE(DeviceName, Name) \ -BLEMIDI_NAMESPACE::BLEMIDI_Transport BLE##Name(DeviceName); \ -MIDI_NAMESPACE::MidiInterface, BLEMIDI_NAMESPACE::MySettings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport &)BLE##Name); +#define BLEMIDI_CREATE_INSTANCE(DeviceName, Name) \ + BLEMIDI_NAMESPACE::BLEMIDI_Transport BLE##Name(DeviceName); \ + MIDI_NAMESPACE::MidiInterface, BLEMIDI_NAMESPACE::MySettings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport &)BLE##Name); - /*! \brief Create a default instance for ESP32 named BLE-MIDI +/*! \brief Create a default instance for ESP32 named BLE-MIDI */ #define BLEMIDI_CREATE_DEFAULT_INSTANCE() \ -BLEMIDI_CREATE_INSTANCE("Esp32-NimBLE-MIDI", MIDI) + BLEMIDI_CREATE_INSTANCE("Esp32-NimBLE-MIDI", MIDI) END_BLEMIDI_NAMESPACE