summaryrefslogtreecommitdiff
path: root/src/tangara
diff options
context:
space:
mode:
Diffstat (limited to 'src/tangara')
-rw-r--r--src/tangara/audio/audio_events.hpp6
-rw-r--r--src/tangara/audio/audio_fsm.cpp34
-rw-r--r--src/tangara/ui/ui_fsm.cpp70
-rw-r--r--src/tangara/ui/ui_fsm.hpp1
4 files changed, 82 insertions, 29 deletions
diff --git a/src/tangara/audio/audio_events.hpp b/src/tangara/audio/audio_events.hpp
index 55095d85..503664cc 100644
--- a/src/tangara/audio/audio_events.hpp
+++ b/src/tangara/audio/audio_events.hpp
@@ -116,6 +116,12 @@ struct SetVolumeBalance : tinyfsm::Event {
int left_bias;
};
+/*
+ Event emitted when the hardware volume for a connected Bluetooth device has changed.
+*/
+struct RemoteVolumeChanged : tinyfsm::Event {
+ uint_fast8_t value; // 0..127
+};
struct VolumeChanged : tinyfsm::Event {
uint_fast8_t percent;
int db;
diff --git a/src/tangara/audio/audio_fsm.cpp b/src/tangara/audio/audio_fsm.cpp
index d6ddff8d..80611082 100644
--- a/src/tangara/audio/audio_fsm.cpp
+++ b/src/tangara/audio/audio_fsm.cpp
@@ -217,18 +217,32 @@ void AudioState::react(const internal::StreamEnded& ev) {
}
void AudioState::react(const system_fsm::BluetoothEvent& ev) {
- if (ev.event != drivers::bluetooth::Event::kConnectionStateChanged) {
- return;
+ using drivers::bluetooth::SimpleEvent;
+ if (std::holds_alternative<SimpleEvent>(ev.event)) {
+ auto simpleEvent = std::get<SimpleEvent>(ev.event);
+ switch (simpleEvent) {
+ case SimpleEvent::kConnectionStateChanged: {
+ auto dev = sServices->bluetooth().ConnectedDevice();
+ if (!dev) {
+ return;
+ }
+ sBtOutput->SetVolume(sServices->nvs().BluetoothVolume(dev->mac));
+ events::Ui().Dispatch(VolumeChanged{
+ .percent = sOutput->GetVolumePct(),
+ .db = sOutput->GetVolumeDb(),
+ });
+ break;
+ }
+ default:
+ break;
+ }
}
- auto dev = sServices->bluetooth().ConnectedDevice();
- if (!dev) {
- return;
+ if (std::holds_alternative<drivers::bluetooth::RemoteVolumeChanged>(ev.event)) {
+ auto volume_chg = std::get<drivers::bluetooth::RemoteVolumeChanged>(ev.event).new_vol;
+ events::Ui().Dispatch(RemoteVolumeChanged{
+ .value = volume_chg
+ });
}
- sBtOutput->SetVolume(sServices->nvs().BluetoothVolume(dev->mac));
- events::Ui().Dispatch(VolumeChanged{
- .percent = sOutput->GetVolumePct(),
- .db = sOutput->GetVolumeDb(),
- });
}
void AudioState::react(const StepUpVolume& ev) {
diff --git a/src/tangara/ui/ui_fsm.cpp b/src/tangara/ui/ui_fsm.cpp
index 17d6c511..e367586b 100644
--- a/src/tangara/ui/ui_fsm.cpp
+++ b/src/tangara/ui/ui_fsm.cpp
@@ -387,6 +387,10 @@ void UiState::react(const audio::VolumeChanged& ev) {
sVolumeCurrentDb.setDirect(static_cast<int>(ev.db));
}
+void UiState::react(const audio::RemoteVolumeChanged& ev) {
+ // TODO: Show dialog
+}
+
void UiState::react(const audio::VolumeBalanceChanged& ev) {
sVolumeLeftBias.setDirect(ev.left_bias);
}
@@ -396,27 +400,55 @@ void UiState::react(const audio::VolumeLimitChanged& ev) {
}
void UiState::react(const system_fsm::BluetoothEvent& ev) {
+ using drivers::bluetooth::SimpleEvent;
auto bt = sServices->bluetooth();
auto dev = bt.ConnectedDevice();
- switch (ev.event) {
- case drivers::bluetooth::Event::kKnownDevicesChanged:
- sBluetoothDevices.setDirect(bt.KnownDevices());
- break;
- case drivers::bluetooth::Event::kConnectionStateChanged:
- sBluetoothConnected.setDirect(bt.IsConnected());
- if (dev) {
- sBluetoothPairedDevice.setDirect(drivers::bluetooth::Device{
- .address = dev->mac,
- .name = {dev->name.data(), dev->name.size()},
- .class_of_device = 0,
- .signal_strength = 0,
- });
- } else {
- sBluetoothPairedDevice.setDirect(std::monostate{});
- }
- break;
- case drivers::bluetooth::Event::kPreferredDeviceChanged:
- break;
+ if (std::holds_alternative<SimpleEvent>(ev.event)) {
+ switch (std::get<SimpleEvent>(ev.event)) {
+ case SimpleEvent::kPlayPause:
+ events::Audio().Dispatch(audio::TogglePlayPause{});
+ break;
+ case SimpleEvent::kStop:
+ events::Audio().Dispatch(audio::TogglePlayPause{.set_to = false});
+ break;
+ case SimpleEvent::kMute:
+ break;
+ case SimpleEvent::kVolUp:
+ break;
+ case SimpleEvent::kVolDown:
+ break;
+ case SimpleEvent::kForward:
+ break;
+ case SimpleEvent::kBackward:
+ break;
+ case SimpleEvent::kRewind:
+ break;
+ case SimpleEvent::kFastForward:
+ break;
+ case SimpleEvent::kKnownDevicesChanged:
+ sBluetoothDevices.setDirect(bt.KnownDevices());
+ break;
+ case SimpleEvent::kConnectionStateChanged:
+ sBluetoothConnected.setDirect(bt.IsConnected());
+ if (dev) {
+ sBluetoothPairedDevice.setDirect(drivers::bluetooth::Device{
+ .address = dev->mac,
+ .name = {dev->name.data(), dev->name.size()},
+ .class_of_device = 0,
+ .signal_strength = 0,
+ });
+ } else {
+ sBluetoothPairedDevice.setDirect(std::monostate{});
+ }
+ break;
+ case SimpleEvent::kPreferredDeviceChanged:
+ break;
+ default:
+ break;
+ }
+ } else if (std::holds_alternative<drivers::bluetooth::RemoteVolumeChanged>(ev.event)) {
+ // Todo: Do something with this (ie, bt volume alert)
+ ESP_LOGI(kTag, "Recieved volume changed event with new volume: %d", std::get<drivers::bluetooth::RemoteVolumeChanged>(ev.event).new_vol);
}
}
diff --git a/src/tangara/ui/ui_fsm.hpp b/src/tangara/ui/ui_fsm.hpp
index af8d75fb..aea1eb36 100644
--- a/src/tangara/ui/ui_fsm.hpp
+++ b/src/tangara/ui/ui_fsm.hpp
@@ -67,6 +67,7 @@ class UiState : public tinyfsm::Fsm<UiState> {
void react(const audio::VolumeChanged&);
void react(const audio::VolumeBalanceChanged&);
void react(const audio::VolumeLimitChanged&);
+ void react(const audio::RemoteVolumeChanged& ev);
void react(const system_fsm::KeyLockChanged&);
void react(const system_fsm::SamdUsbStatusChanged&);