Switch to NimBLE stack, add BT build flags, add error checking
This commit is contained in:
@@ -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
@@ -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'");
|
||||
|
||||
Reference in New Issue
Block a user