Init BT controller with ESP_BT_MODE_BLE before NimBLEDevice::init to avoid BTDM crash on ESP32-S3
This commit is contained in:
@@ -46,23 +46,42 @@ BleMidiTransport::~BleMidiTransport() {
|
|||||||
bool BleMidiTransport::begin() {
|
bool BleMidiTransport::begin() {
|
||||||
Serial.println("[BLE] Initializing BLE MIDI...");
|
Serial.println("[BLE] Initializing BLE MIDI...");
|
||||||
|
|
||||||
|
// ESP32-S3 only supports BLE (not BTDM). We must init the controller
|
||||||
|
// with BLE-only mode BEFORE NimBLEDevice::init(), which internally
|
||||||
|
// uses BTDM and would fail on S3.
|
||||||
|
esp_err_t err;
|
||||||
|
err = esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT);
|
||||||
|
Serial.printf("[BLE] bt_mem_release: %d (%s)\n", err, esp_err_to_name(err));
|
||||||
|
|
||||||
|
esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
|
||||||
|
err = esp_bt_controller_init(&bt_cfg);
|
||||||
|
Serial.printf("[BLE] bt_controller_init: %d (%s)\n", err, esp_err_to_name(err));
|
||||||
|
|
||||||
|
err = esp_bt_controller_enable(ESP_BT_MODE_BLE);
|
||||||
|
Serial.printf("[BLE] bt_controller_enable(BLE): %d (%s)\n", err, esp_err_to_name(err));
|
||||||
|
if (err != ESP_OK) { initialized = false; return false; }
|
||||||
|
|
||||||
Serial.println("[BLE] NimBLEDevice init...");
|
Serial.println("[BLE] NimBLEDevice init...");
|
||||||
NimBLEDevice::init("JOC Midi");
|
NimBLEDevice::init("JOC Midi");
|
||||||
Serial.println("[BLE] NimBLEDevice initialized");
|
Serial.println("[BLE] NimBLEDevice initialized");
|
||||||
|
|
||||||
|
Serial.println("[BLE] Creating server...");
|
||||||
ble_server = NimBLEDevice::createServer();
|
ble_server = NimBLEDevice::createServer();
|
||||||
if (!ble_server) {
|
if (!ble_server) {
|
||||||
Serial.println("[BLE] FAILED to create server");
|
Serial.println("[BLE] FAILED to create server");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Serial.println("[BLE] Server created, setting callbacks...");
|
||||||
ble_server->setCallbacks(new ServerCallbacks());
|
ble_server->setCallbacks(new ServerCallbacks());
|
||||||
|
|
||||||
|
Serial.println("[BLE] Creating service...");
|
||||||
ble_service = ble_server->createService(BLE_MIDI_SERVICE_UUID);
|
ble_service = ble_server->createService(BLE_MIDI_SERVICE_UUID);
|
||||||
if (!ble_service) {
|
if (!ble_service) {
|
||||||
Serial.println("[BLE] FAILED to create service");
|
Serial.println("[BLE] FAILED to create service");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Serial.println("[BLE] Creating characteristic...");
|
||||||
ble_char = ble_service->createCharacteristic(
|
ble_char = ble_service->createCharacteristic(
|
||||||
BLE_MIDI_CHAR_UUID,
|
BLE_MIDI_CHAR_UUID,
|
||||||
NIMBLE_PROPERTY::READ |
|
NIMBLE_PROPERTY::READ |
|
||||||
@@ -76,9 +95,11 @@ bool BleMidiTransport::begin() {
|
|||||||
ble_char->createDescriptor(BLEUUID((uint16_t)0x2902), NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::WRITE);
|
ble_char->createDescriptor(BLEUUID((uint16_t)0x2902), NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::WRITE);
|
||||||
ble_char->setCallbacks(new CharCallbacks());
|
ble_char->setCallbacks(new CharCallbacks());
|
||||||
|
|
||||||
|
Serial.println("[BLE] Starting service...");
|
||||||
ble_service->start();
|
ble_service->start();
|
||||||
Serial.println("[BLE] Service started");
|
Serial.println("[BLE] Service started");
|
||||||
|
|
||||||
|
Serial.println("[BLE] Starting advertising...");
|
||||||
NimBLEAdvertising* adv = NimBLEDevice::getAdvertising();
|
NimBLEAdvertising* adv = NimBLEDevice::getAdvertising();
|
||||||
adv->addServiceUUID(BLE_MIDI_SERVICE_UUID);
|
adv->addServiceUUID(BLE_MIDI_SERVICE_UUID);
|
||||||
adv->setScanResponse(true);
|
adv->setScanResponse(true);
|
||||||
|
|||||||
Reference in New Issue
Block a user