summaryrefslogtreecommitdiff
path: root/src/drivers/include/bluetooth.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/include/bluetooth.hpp')
-rw-r--r--src/drivers/include/bluetooth.hpp108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/drivers/include/bluetooth.hpp b/src/drivers/include/bluetooth.hpp
new file mode 100644
index 00000000..2b5e6a8d
--- /dev/null
+++ b/src/drivers/include/bluetooth.hpp
@@ -0,0 +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:
+ Bluetooth();
+
+ 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;
+
+ 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