From d6b83fcf4a1a3039c06e0b1d1a1f7e2af2351efb Mon Sep 17 00:00:00 2001 From: jacqueline Date: Tue, 15 Aug 2023 13:53:30 +1000 Subject: Flesh out basic bluetooth support No ui yet, and performance isn't great. It kinda works though!! --- src/drivers/include/bluetooth.hpp | 63 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) (limited to 'src/drivers/include') diff --git a/src/drivers/include/bluetooth.hpp b/src/drivers/include/bluetooth.hpp index 2b5e6a8d..bdc45910 100644 --- a/src/drivers/include/bluetooth.hpp +++ b/src/drivers/include/bluetooth.hpp @@ -1,6 +1,11 @@ #pragma once +#include +#include +#include +#include +#include #include #include @@ -14,6 +19,18 @@ namespace drivers { +namespace bluetooth { + +typedef std::array mac_addr_t; + +struct Device { + mac_addr_t address; + std::string name; + uint32_t class_of_device; + int8_t signal_strength; +}; +} // namespace bluetooth + /* * A handle used to interact with the bluetooth state machine. */ @@ -24,6 +41,9 @@ class Bluetooth { auto Enable() -> bool; auto Disable() -> void; + auto KnownDevices() -> std::vector; + auto SetPreferredDevice(const bluetooth::mac_addr_t& mac) -> void; + auto SetSource(StreamBufferHandle_t) -> void; }; @@ -33,6 +53,9 @@ namespace events { struct Enable : public tinyfsm::Event {}; struct Disable : public tinyfsm::Event {}; +struct PreferredDeviceChanged : public tinyfsm::Event {}; +struct SourceChanged : public tinyfsm::Event {}; + namespace internal { struct Gap : public tinyfsm::Event { esp_bt_gap_cb_event_t type; @@ -51,6 +74,13 @@ struct Avrc : public tinyfsm::Event { class BluetoothState : public tinyfsm::Fsm { public: + static auto devices() -> std::vector; + static auto preferred_device() -> std::optional; + static auto preferred_device(const mac_addr_t&) -> void; + + static auto source() -> StreamBufferHandle_t; + static auto source(StreamBufferHandle_t) -> void; + virtual ~BluetoothState(){}; virtual void entry() {} @@ -58,13 +88,24 @@ class BluetoothState : public tinyfsm::Fsm { virtual void react(const events::Enable& ev){}; virtual void react(const events::Disable& ev) = 0; + virtual void react(const events::PreferredDeviceChanged& ev){}; + virtual void react(const events::SourceChanged& ev){}; virtual void react(const events::internal::Gap& ev) = 0; - virtual void react(const events::internal::A2dp& ev) = 0; + virtual void react(const events::internal::A2dp& ev){}; virtual void react(const events::internal::Avrc& ev){}; + + protected: + static std::mutex sDevicesMutex_; + static std::map sDevices_; + static std::optional sPreferredDevice_; + static mac_addr_t sCurrentDevice_; + + static std::atomic sSource_; }; class Disabled : public BluetoothState { + public: void entry() override; void react(const events::Enable& ev) override; @@ -72,35 +113,53 @@ class Disabled : public BluetoothState { void react(const events::internal::Gap& ev) override {} void react(const events::internal::A2dp& ev) override {} + using BluetoothState::react; }; class Scanning : public BluetoothState { + public: void entry() override; void exit() override; void react(const events::Disable& ev) override; + void react(const events::PreferredDeviceChanged& ev) override; void react(const events::internal::Gap& ev) override; - void react(const events::internal::A2dp& ev) override; + + using BluetoothState::react; + + private: + auto OnDeviceDiscovered(esp_bt_gap_cb_param_t*) -> void; }; class Connecting : public BluetoothState { + public: void entry() override; void exit() override; + void react(const events::PreferredDeviceChanged& ev) override; + void react(const events::Disable& ev) override; void react(const events::internal::Gap& ev) override; void react(const events::internal::A2dp& ev) override; + + using BluetoothState::react; }; class Connected : public BluetoothState { + public: void entry() override; void exit() override; + void react(const events::PreferredDeviceChanged& ev) override; + void react(const events::SourceChanged& ev) override; + void react(const events::Disable& ev) override; void react(const events::internal::Gap& ev) override; void react(const events::internal::A2dp& ev) override; void react(const events::internal::Avrc& ev) override; + + using BluetoothState::react; }; } // namespace bluetooth -- cgit v1.2.3