diff options
Diffstat (limited to 'src/tangara')
| -rw-r--r-- | src/tangara/audio/audio_events.hpp | 6 | ||||
| -rw-r--r-- | src/tangara/audio/audio_fsm.cpp | 34 | ||||
| -rw-r--r-- | src/tangara/ui/ui_fsm.cpp | 70 | ||||
| -rw-r--r-- | src/tangara/ui/ui_fsm.hpp | 1 |
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&); |
