From 102085808fd9936b495bd57b9f223e05c31a217f Mon Sep 17 00:00:00 2001 From: geeksville Date: Tue, 21 Jul 2020 11:46:39 -0700 Subject: [PATCH] WIP nimble now builds --- docs/software/TODO.md | 27 +++++++++---- platformio.ini | 2 +- src/esp32/BluetoothUtil.cpp | 80 +++++++++++++++++++++++++++++++++++-- src/esp32/BluetoothUtil.h | 10 ++--- src/esp32/main-esp32.cpp | 21 ---------- 5 files changed, 103 insertions(+), 37 deletions(-) diff --git a/docs/software/TODO.md b/docs/software/TODO.md index b10935b9c..3ea06f954 100644 --- a/docs/software/TODO.md +++ b/docs/software/TODO.md @@ -2,13 +2,26 @@ You probably don't care about this section - skip to the next one. -- Nimble getting started https://espressif-esp-idf.readthedocs-hosted.com/zh_CN/release-v3.3/api-reference/bluetooth/nimble/index.html#overview? could it work with arduino esp-idf 4.2 -- update protocol description per cyclomies -- update faq with antennas https://meshtastic.discourse.group/t/range-test-ideas-requested/738/2 -- update faq on recommended android version and phones -- add help link inside the app, reference a page on the wiki -- turn on amazon reviews support -- add a tablet layout (with map next to messages) in the android app +Nimble tasks: + +- Nimble getting started https://espressif-esp-idf.readthedocs-hosted.com/zh_CN/release-v3.3/api-reference/bluetooth/nimble/index.html#overview? could it work with arduino esp-idf 4.2 +- implement nimble device api +- setup advertising https://mynewt.apache.org/latest/tutorials/ble/bleprph/bleprph-sections/bleprph-gap-event.html +- add security +- test with app +- restart advertising after client disconnects +- make sleep work +- check BLE handle stability +- apply nimble RPA patches +- start RPA long test +- implement nimble software update api + +* update protocol description per cyclomies email thread +* update faq with antennas https://meshtastic.discourse.group/t/range-test-ideas-requested/738/2 +* update faq on recommended android version and phones +* add help link inside the app, reference a page on the wiki +* turn on amazon reviews support +* add a tablet layout (with map next to messages) in the android app # Medium priority diff --git a/platformio.ini b/platformio.ini index d3a38bfb5..c1f0152e3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -78,7 +78,7 @@ src_filter = upload_speed = 921600 debug_init_break = tbreak setup build_flags = - ${env.build_flags} -Wall -Wextra -Isrc/esp32 -mfix-esp32-psram-cache-issue + ${env.build_flags} -Wall -Wextra -Isrc/esp32 -mfix-esp32-psram-cache-issue -lnimble # Hmm - this doesn't work yet # board_build.ldscript = linker/esp32.extram.bss.ld lib_ignore = segger_rtt diff --git a/src/esp32/BluetoothUtil.cpp b/src/esp32/BluetoothUtil.cpp index cc2e34225..50c36b347 100644 --- a/src/esp32/BluetoothUtil.cpp +++ b/src/esp32/BluetoothUtil.cpp @@ -324,11 +324,85 @@ void loopBLE() bluetoothRebootCheck(); } +// This routine is called multiple times, once each time we come back from sleep +void reinitBluetooth() +{ + DEBUG_MSG("Starting bluetooth\n"); + + // Note: these callbacks might be coming in from a different thread. + BLEServer *serve = initBLE( + [](uint32_t pin) { + powerFSM.trigger(EVENT_BLUETOOTH_PAIR); + screen.startBluetoothPinScreen(pin); + }, + []() { screen.stopBluetoothPinScreen(); }, getDeviceName(), HW_VENDOR, optstr(APP_VERSION), + optstr(HW_VERSION)); // FIXME, use a real name based on the macaddr + createMeshBluetoothService(serve); + + // Start advertising - this must be done _after_ creating all services + serve->getAdvertising()->start(); +} + #else +#include "esp_nimble_hci.h" +#include "nimble/nimble_port.h" +#include "nimble/nimble_port_freertos.h" + +// Force arduino to keep ble data around +bool btInUse() +{ + return false; +} + /// Given a level between 0-100, update the BLE attribute -void updateBatteryLevel(uint8_t level) {} -void deinitBLE() {} -void loopBLE() {} +void updateBatteryLevel(uint8_t level) +{ + // FIXME +} + +void deinitBLE() +{ + // FIXME - do we need to dealloc things? - what needs to stay alive across light sleep? + auto ret = nimble_port_stop(); + assert(ret == ESP_OK); + + nimble_port_deinit(); // teardown nimble datastructures + nimble_port_freertos_deinit(); // delete the task + + ret = esp_nimble_hci_and_controller_deinit(); + assert(ret == ESP_OK); +} + +void loopBLE() +{ + // FIXME +} + +static void ble_host_task(void *param) +{ + nimble_port_run(); // This function will return only when nimble_port_stop() is executed. + // nimble_port_freertos_deinit(); +} + +// This routine is called multiple times, once each time we come back from sleep +void reinitBluetooth() +{ + DEBUG_MSG("Starting bluetooth\n"); + + // FIXME - if waking from light sleep, only esp_nimble_hci_init + // FIXME - why didn't this version work? + // auto res = esp_nimble_hci_and_controller_init(); + auto res = esp_nimble_hci_init(); + DEBUG_MSG("BLE result %d\n", res); + assert(res == ESP_OK); + + nimble_port_init(); + + // FIXME Initialize the required NimBLE host configuration parameters and callbacks + // Perform application specific tasks / initialization + + nimble_port_freertos_init(ble_host_task); +} #endif diff --git a/src/esp32/BluetoothUtil.h b/src/esp32/BluetoothUtil.h index 4773cb546..36ba4d21d 100644 --- a/src/esp32/BluetoothUtil.h +++ b/src/esp32/BluetoothUtil.h @@ -2,11 +2,11 @@ #include +#include "SimpleAllocator.h" #include #include #include #include -#include "SimpleAllocator.h" #ifdef CONFIG_BLUEDROID_ENABLED @@ -22,9 +22,8 @@ uint32_t getValue32(BLECharacteristic *c, uint32_t defaultValue); using StartBluetoothPinScreenCallback = std::function; using StopBluetoothPinScreenCallback = std::function; -BLEServer *initBLE( - StartBluetoothPinScreenCallback startBtPinScreen, StopBluetoothPinScreenCallback stopBtPinScreen, - std::string devName, std::string hwVendor, std::string swVersion, std::string hwVersion = ""); +BLEServer *initBLE(StartBluetoothPinScreenCallback startBtPinScreen, StopBluetoothPinScreenCallback stopBtPinScreen, + std::string devName, std::string hwVendor, std::string swVersion, std::string hwVersion = ""); /// Add a characteristic that we will delete when we restart BLECharacteristic *addBLECharacteristic(BLECharacteristic *c); @@ -40,4 +39,5 @@ extern SimpleAllocator btPool; /// Given a level between 0-100, update the BLE attribute void updateBatteryLevel(uint8_t level); void deinitBLE(); -void loopBLE(); \ No newline at end of file +void loopBLE(); +void reinitBluetooth(); \ No newline at end of file diff --git a/src/esp32/main-esp32.cpp b/src/esp32/main-esp32.cpp index 666e47b0e..1a96eed41 100644 --- a/src/esp32/main-esp32.cpp +++ b/src/esp32/main-esp32.cpp @@ -12,27 +12,6 @@ bool bluetoothOn; -// This routine is called multiple times, once each time we come back from sleep -void reinitBluetooth() -{ - DEBUG_MSG("Starting bluetooth\n"); - -#ifdef CONFIG_BLUEDROID_ENABLED - // Note: these callbacks might be coming in from a different thread. - BLEServer *serve = initBLE( - [](uint32_t pin) { - powerFSM.trigger(EVENT_BLUETOOTH_PAIR); - screen.startBluetoothPinScreen(pin); - }, - []() { screen.stopBluetoothPinScreen(); }, getDeviceName(), HW_VENDOR, optstr(APP_VERSION), - optstr(HW_VERSION)); // FIXME, use a real name based on the macaddr - createMeshBluetoothService(serve); - - // Start advertising - this must be done _after_ creating all services - serve->getAdvertising()->start(); -#endif -} - // Enable/disable bluetooth. void setBluetoothEnable(bool on) {