summaryrefslogtreecommitdiff
path: root/src/drivers/include/bluetooth.hpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-08-08 17:04:34 +1000
committerjacqueline <me@jacqueline.id.au>2023-08-08 17:04:34 +1000
commit520ec6d98a761e1d96b5bea299819c096ce08ac3 (patch)
tree6b8cbb963b29103a3105c6f12c0532f79558b402 /src/drivers/include/bluetooth.hpp
parente2479ee7aae3f645054cda6b0cd8f67dedb5e937 (diff)
downloadtangara-fw-520ec6d98a761e1d96b5bea299819c096ce08ac3.tar.gz
Add skeleton of bluetooth FSM
Diffstat (limited to 'src/drivers/include/bluetooth.hpp')
-rw-r--r--src/drivers/include/bluetooth.hpp98
1 files changed, 93 insertions, 5 deletions
diff --git a/src/drivers/include/bluetooth.hpp b/src/drivers/include/bluetooth.hpp
index 22b58c8b..2b5e6a8d 100644
--- a/src/drivers/include/bluetooth.hpp
+++ b/src/drivers/include/bluetooth.hpp
@@ -1,20 +1,108 @@
#pragma once
+#include <string>
#include <vector>
+#include <freertos/FreeRTOS.h>
+#include <freertos/stream_buffer.h>
+#include "esp_a2dp_api.h"
+#include "esp_avrc_api.h"
+#include "esp_gap_bt_api.h"
+#include "tinyfsm.hpp"
+#include "tinyfsm/include/tinyfsm.hpp"
+
namespace drivers {
+/*
+ * A handle used to interact with the bluetooth state machine.
+ */
class Bluetooth {
public:
- static auto Enable() -> Bluetooth*;
Bluetooth();
- ~Bluetooth();
- struct Device {};
- auto Scan() -> std::vector<Device>;
+ auto Enable() -> bool;
+ auto Disable() -> void;
+
+ auto SetSource(StreamBufferHandle_t) -> void;
+};
+
+namespace bluetooth {
+
+namespace events {
+struct Enable : public tinyfsm::Event {};
+struct Disable : public tinyfsm::Event {};
+
+namespace internal {
+struct Gap : public tinyfsm::Event {
+ esp_bt_gap_cb_event_t type;
+ esp_bt_gap_cb_param_t* param;
+};
+struct A2dp : public tinyfsm::Event {
+ esp_a2d_cb_event_t type;
+ esp_a2d_cb_param_t* param;
+};
+struct Avrc : public tinyfsm::Event {
+ esp_avrc_ct_cb_event_t type;
+ esp_avrc_ct_cb_param_t* param;
+};
+} // namespace internal
+} // namespace events
+
+class BluetoothState : public tinyfsm::Fsm<BluetoothState> {
+ public:
+ virtual ~BluetoothState(){};
+
+ virtual void entry() {}
+ virtual void exit() {}
+
+ virtual void react(const events::Enable& ev){};
+ virtual void react(const events::Disable& ev) = 0;
+
+ virtual void react(const events::internal::Gap& ev) = 0;
+ virtual void react(const events::internal::A2dp& ev) = 0;
+ virtual void react(const events::internal::Avrc& ev){};
+};
+
+class Disabled : public BluetoothState {
+ void entry() override;
+
+ void react(const events::Enable& 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 {}
+};
+
+class Scanning : public BluetoothState {
+ void entry() override;
+ void exit() override;
+
+ void react(const events::Disable& ev) override;
- private:
+ void react(const events::internal::Gap& ev) override;
+ void react(const events::internal::A2dp& ev) override;
};
+class Connecting : public BluetoothState {
+ void entry() override;
+ void exit() override;
+
+ void react(const events::Disable& ev) override;
+ void react(const events::internal::Gap& ev) override;
+ void react(const events::internal::A2dp& ev) override;
+};
+
+class Connected : public BluetoothState {
+ void entry() override;
+ void exit() 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;
+};
+
+} // namespace bluetooth
+
} // namespace drivers