Shadowtrance 5c78d55b04
Bluetooth (#518)
* Bluetooth LE addition

* fixes

* use the psram!

helps a little on S3 (t-deck)

* custom device name

* Update symbols.c

* Feedback + fixes

Fixes external app start/stop server (child devices)
Fixes BtManage causing a full system hang upon disabling bt when a device is connected to the host.

* updoot

* more updoot

* move back!

* Revert "move back!"

This reverts commit d3694365c634acc5db62ac59771c496cb971a727.

* fix some of the things

* Addressing feedback? hmm

* Fixes

Bug 1 — Reconnect loop / Reconnect not working fixed
Bug 2 — Name-only advertising overwrites HID advertising
Bug 3 — BleHidDeviceCtx leak on re-enable
Enhancement — HID device auto-start on radio re-enable

* stuff...

* update for consistency with others

* fix crashes

and some bonus symbols

* a few symbols, i2c speed, cdn message

100kHz i2c speed seems to be more compatible with m5stack modules...and probably in general.
cdn message no longer applies

* Hide BT Settings when bt not enabled

* Addressing things and device fixes

* Missed one!

* stuff
2026-05-22 22:49:37 +02:00

46 lines
1.5 KiB
Plaintext

@startuml Bluetooth Thread Model
box "nimble_host task\n(NimBLE internal, 4 KB stack)" #LightBlue
participant "gap_event_handler\n(esp32_ble.cpp)" as GAP
participant "ble_gatt\ncallbacks" as GATT
participant "bt_event_bridge\n(Bluetooth.cpp)" as Bridge
participant "hidHostGapCb\n& discovery\n(BluetoothHidHost.cpp)" as HID
end box
box "main_dispatcher task\n(Tactility main task)" #LightGreen
participant "settings I/O\n& peer updates" as Dispatch
end box
box "App tasks" #LightYellow
participant "BtManage\nBtPeerSettings" as Apps
end box
box "esp_timer task" #LightGray
participant "advRestart\nmidiKeepalive\nhidEncRetry" as Timers
end box
box "LVGL task\n(GuiService)" #MistyRose
participant "hidHostKeyboard\nReadCb / mouseReadCb" as LVGL
end box
GAP -> Bridge : ble_publish_event() →\nBtEventCallback (bt_event_bridge)
Bridge -> Dispatch : getMainDispatcher().dispatch()\n(settings::load/save, autoConnect)
Dispatch -> Apps : publishEventCpp → PubSub callbacks
GATT -> GAP : GATT access within\nnimble_host task
HID -> Dispatch : getMainDispatcher().dispatch()\n(indev cleanup, ProfileStateChanged)
Timers -> GAP : advRestartCallback\n(calls ble_start_advertising)
LVGL -> HID : lv_indev read callbacks\n(LVGL tick)
note over GAP, GATT
NO file I/O on NimBLE host task —
stringstream blows the 4 KB stack
end note
note over GAP, Bridge
Driver fires BtEvent via callback array.
Bridge (Tactility layer) translates to
C++ PubSub<BtEvent> and dispatches I/O.
end note
@enduml