diff --git a/platformio.ini b/platformio.ini index 5968990..2fe52f6 100644 --- a/platformio.ini +++ b/platformio.ini @@ -8,6 +8,7 @@ framework = arduino lib_deps = adafruit/Adafruit TinyUSB Library@3.1.0 fastled/FastLED@^3.9.0 + h2zero/NimBLE-Arduino@^1.4.0 build_unflags = -DARDUINO_USB_MODE=1 @@ -16,6 +17,9 @@ build_flags = -DARDUINO_USB_MODE=0 -DARDUINO_USB_CDC_ON_BOOT=1 -DUSE_TINYUSB=1 + -DCONFIG_BT_ENABLED=1 + -DCONFIG_BT_NIMBLE_ENABLED=1 + -DCONFIG_BTDM_CTRL_MODE_BLE_ONLY=1 monitor_speed = 115200 diff --git a/src/ble_midi_transport.cpp b/src/ble_midi_transport.cpp index d100ba1..ead9dbf 100644 --- a/src/ble_midi_transport.cpp +++ b/src/ble_midi_transport.cpp @@ -1,34 +1,34 @@ #include "ble_midi_transport.h" #include -#include -#include -#include -#include +#include +#include +#include +#include #define BLE_MIDI_SERVICE_UUID "03B80E5A-EDE8-4B33-A751-6CE34EC4C700" #define BLE_MIDI_CHAR_UUID "7772E5DB-3868-4112-A1A9-F2669D106BF3" static BleMidiTransport* instance = nullptr; -static BLEServer* ble_server = nullptr; -static BLEService* ble_service = nullptr; -static BLECharacteristic* ble_char = nullptr; +static NimBLEServer* ble_server = nullptr; +static NimBLEService* ble_service = nullptr; +static NimBLECharacteristic* ble_char = nullptr; static bool device_connected = false; -class ServerCallbacks : public BLEServerCallbacks { - void onConnect(BLEServer* server) override { +class ServerCallbacks : public NimBLEServerCallbacks { + void onConnect(NimBLEServer* server) override { device_connected = true; Serial.println("[BLE] Client connected"); } - void onDisconnect(BLEServer* server) override { + void onDisconnect(NimBLEServer* server) override { device_connected = false; - Serial.println("[BLE] Client disconnected"); - BLEDevice::startAdvertising(); + Serial.println("[BLE] Client disconnected, restarting advertising"); + NimBLEDevice::startAdvertising(); } }; -class CharCallbacks : public BLECharacteristicCallbacks { - void onWrite(BLECharacteristic* characteristic) override { +class CharCallbacks : public NimBLECharacteristicCallbacks { + void onWrite(NimBLECharacteristic* characteristic) override { std::string value = characteristic->getValue(); if (value.length() > 0 && instance) { instance->on_receive((const uint8_t*)value.data(), value.length()); @@ -47,31 +47,46 @@ BleMidiTransport::~BleMidiTransport() { bool BleMidiTransport::begin() { Serial.println("[BLE] Initializing BLE MIDI..."); - BLEDevice::init("JOC Midi"); - BLEDevice::setPower(ESP_PWR_LVL_P9); + if (!NimBLEDevice::init("JOC Midi")) { + Serial.println("[BLE] FAILED to initialize"); + initialized = false; + return false; + } + Serial.println("[BLE] NimBLEDevice initialized"); - ble_server = BLEDevice::createServer(); + ble_server = NimBLEDevice::createServer(); + if (!ble_server) { + Serial.println("[BLE] FAILED to create server"); + return false; + } ble_server->setCallbacks(new ServerCallbacks()); ble_service = ble_server->createService(BLE_MIDI_SERVICE_UUID); + if (!ble_service) { + Serial.println("[BLE] FAILED to create service"); + return false; + } ble_char = ble_service->createCharacteristic( BLE_MIDI_CHAR_UUID, - BLECharacteristic::PROPERTY_READ | - BLECharacteristic::PROPERTY_WRITE_NR | - BLECharacteristic::PROPERTY_NOTIFY + NIMBLE_PROPERTY::READ | + NIMBLE_PROPERTY::WRITE_NR | + NIMBLE_PROPERTY::NOTIFY ); - ble_char->addDescriptor(new BLE2902()); + if (!ble_char) { + Serial.println("[BLE] FAILED to create characteristic"); + return false; + } + ble_char->addDescriptor(new NimBLE2902()); ble_char->setCallbacks(new CharCallbacks()); ble_service->start(); + Serial.println("[BLE] Service started"); - BLEAdvertising* adv = BLEDevice::getAdvertising(); + NimBLEAdvertising* adv = NimBLEDevice::getAdvertising(); adv->addServiceUUID(BLE_MIDI_SERVICE_UUID); adv->setScanResponse(true); - adv->setMinPreferred(0x06); - adv->setMinPreferred(0x12); - BLEDevice::startAdvertising(); + adv->start(); initialized = true; Serial.println("[BLE] BLE MIDI advertising as 'JOC Midi'");