Switch to NimBLE stack, add BT build flags, add error checking

This commit is contained in:
ash
2026-06-30 06:24:19 +00:00
parent 892e4fe061
commit f5eca2c7bc
2 changed files with 44 additions and 25 deletions
+4
View File
@@ -8,6 +8,7 @@ framework = arduino
lib_deps =
adafruit/Adafruit TinyUSB [email protected]
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
+40 -25
View File
@@ -1,34 +1,34 @@
#include "ble_midi_transport.h"
#include <Arduino.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include <NimBLEDevice.h>
#include <NimBLEServer.h>
#include <NimBLEUtils.h>
#include <NimBLE2902.h>
#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'");