Switch to NimBLE stack, add BT build flags, add error checking
This commit is contained in:
@@ -8,6 +8,7 @@ framework = arduino
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
adafruit/Adafruit TinyUSB [email protected]
|
adafruit/Adafruit TinyUSB [email protected]
|
||||||
fastled/FastLED@^3.9.0
|
fastled/FastLED@^3.9.0
|
||||||
|
h2zero/NimBLE-Arduino@^1.4.0
|
||||||
|
|
||||||
build_unflags =
|
build_unflags =
|
||||||
-DARDUINO_USB_MODE=1
|
-DARDUINO_USB_MODE=1
|
||||||
@@ -16,6 +17,9 @@ build_flags =
|
|||||||
-DARDUINO_USB_MODE=0
|
-DARDUINO_USB_MODE=0
|
||||||
-DARDUINO_USB_CDC_ON_BOOT=1
|
-DARDUINO_USB_CDC_ON_BOOT=1
|
||||||
-DUSE_TINYUSB=1
|
-DUSE_TINYUSB=1
|
||||||
|
-DCONFIG_BT_ENABLED=1
|
||||||
|
-DCONFIG_BT_NIMBLE_ENABLED=1
|
||||||
|
-DCONFIG_BTDM_CTRL_MODE_BLE_ONLY=1
|
||||||
|
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
|
|
||||||
|
|||||||
+40
-25
@@ -1,34 +1,34 @@
|
|||||||
#include "ble_midi_transport.h"
|
#include "ble_midi_transport.h"
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <BLEDevice.h>
|
#include <NimBLEDevice.h>
|
||||||
#include <BLEServer.h>
|
#include <NimBLEServer.h>
|
||||||
#include <BLEUtils.h>
|
#include <NimBLEUtils.h>
|
||||||
#include <BLE2902.h>
|
#include <NimBLE2902.h>
|
||||||
|
|
||||||
#define BLE_MIDI_SERVICE_UUID "03B80E5A-EDE8-4B33-A751-6CE34EC4C700"
|
#define BLE_MIDI_SERVICE_UUID "03B80E5A-EDE8-4B33-A751-6CE34EC4C700"
|
||||||
#define BLE_MIDI_CHAR_UUID "7772E5DB-3868-4112-A1A9-F2669D106BF3"
|
#define BLE_MIDI_CHAR_UUID "7772E5DB-3868-4112-A1A9-F2669D106BF3"
|
||||||
|
|
||||||
static BleMidiTransport* instance = nullptr;
|
static BleMidiTransport* instance = nullptr;
|
||||||
|
|
||||||
static BLEServer* ble_server = nullptr;
|
static NimBLEServer* ble_server = nullptr;
|
||||||
static BLEService* ble_service = nullptr;
|
static NimBLEService* ble_service = nullptr;
|
||||||
static BLECharacteristic* ble_char = nullptr;
|
static NimBLECharacteristic* ble_char = nullptr;
|
||||||
static bool device_connected = false;
|
static bool device_connected = false;
|
||||||
|
|
||||||
class ServerCallbacks : public BLEServerCallbacks {
|
class ServerCallbacks : public NimBLEServerCallbacks {
|
||||||
void onConnect(BLEServer* server) override {
|
void onConnect(NimBLEServer* server) override {
|
||||||
device_connected = true;
|
device_connected = true;
|
||||||
Serial.println("[BLE] Client connected");
|
Serial.println("[BLE] Client connected");
|
||||||
}
|
}
|
||||||
void onDisconnect(BLEServer* server) override {
|
void onDisconnect(NimBLEServer* server) override {
|
||||||
device_connected = false;
|
device_connected = false;
|
||||||
Serial.println("[BLE] Client disconnected");
|
Serial.println("[BLE] Client disconnected, restarting advertising");
|
||||||
BLEDevice::startAdvertising();
|
NimBLEDevice::startAdvertising();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class CharCallbacks : public BLECharacteristicCallbacks {
|
class CharCallbacks : public NimBLECharacteristicCallbacks {
|
||||||
void onWrite(BLECharacteristic* characteristic) override {
|
void onWrite(NimBLECharacteristic* characteristic) override {
|
||||||
std::string value = characteristic->getValue();
|
std::string value = characteristic->getValue();
|
||||||
if (value.length() > 0 && instance) {
|
if (value.length() > 0 && instance) {
|
||||||
instance->on_receive((const uint8_t*)value.data(), value.length());
|
instance->on_receive((const uint8_t*)value.data(), value.length());
|
||||||
@@ -47,31 +47,46 @@ BleMidiTransport::~BleMidiTransport() {
|
|||||||
bool BleMidiTransport::begin() {
|
bool BleMidiTransport::begin() {
|
||||||
Serial.println("[BLE] Initializing BLE MIDI...");
|
Serial.println("[BLE] Initializing BLE MIDI...");
|
||||||
|
|
||||||
BLEDevice::init("JOC Midi");
|
if (!NimBLEDevice::init("JOC Midi")) {
|
||||||
BLEDevice::setPower(ESP_PWR_LVL_P9);
|
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_server->setCallbacks(new ServerCallbacks());
|
||||||
|
|
||||||
ble_service = ble_server->createService(BLE_MIDI_SERVICE_UUID);
|
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_char = ble_service->createCharacteristic(
|
||||||
BLE_MIDI_CHAR_UUID,
|
BLE_MIDI_CHAR_UUID,
|
||||||
BLECharacteristic::PROPERTY_READ |
|
NIMBLE_PROPERTY::READ |
|
||||||
BLECharacteristic::PROPERTY_WRITE_NR |
|
NIMBLE_PROPERTY::WRITE_NR |
|
||||||
BLECharacteristic::PROPERTY_NOTIFY
|
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_char->setCallbacks(new CharCallbacks());
|
||||||
|
|
||||||
ble_service->start();
|
ble_service->start();
|
||||||
|
Serial.println("[BLE] Service started");
|
||||||
|
|
||||||
BLEAdvertising* adv = BLEDevice::getAdvertising();
|
NimBLEAdvertising* adv = NimBLEDevice::getAdvertising();
|
||||||
adv->addServiceUUID(BLE_MIDI_SERVICE_UUID);
|
adv->addServiceUUID(BLE_MIDI_SERVICE_UUID);
|
||||||
adv->setScanResponse(true);
|
adv->setScanResponse(true);
|
||||||
adv->setMinPreferred(0x06);
|
adv->start();
|
||||||
adv->setMinPreferred(0x12);
|
|
||||||
BLEDevice::startAdvertising();
|
|
||||||
|
|
||||||
initialized = true;
|
initialized = true;
|
||||||
Serial.println("[BLE] BLE MIDI advertising as 'JOC Midi'");
|
Serial.println("[BLE] BLE MIDI advertising as 'JOC Midi'");
|
||||||
|
|||||||
Reference in New Issue
Block a user