summaryrefslogtreecommitdiff
path: root/src/ui/ui_fsm.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-09-28 08:29:55 +1000
committerjacqueline <me@jacqueline.id.au>2023-09-28 08:29:55 +1000
commitf09ba5ffd53bf7d28e0dc516c00a8f69ca7efae9 (patch)
treeaffce5567186d8944686afd824bf4ee4f7ee4d2d /src/ui/ui_fsm.cpp
parentf168bfab7698f28492c7693263525945a26cbcc8 (diff)
downloadtangara-fw-f09ba5ffd53bf7d28e0dc516c00a8f69ca7efae9.tar.gz
Use bindey for databinding instead of hand rolling ui updates
Diffstat (limited to 'src/ui/ui_fsm.cpp')
-rw-r--r--src/ui/ui_fsm.cpp63
1 files changed, 35 insertions, 28 deletions
diff --git a/src/ui/ui_fsm.cpp b/src/ui/ui_fsm.cpp
index fa4939f3..d7bb9bb7 100644
--- a/src/ui/ui_fsm.cpp
+++ b/src/ui/ui_fsm.cpp
@@ -19,6 +19,7 @@
#include "gpios.hpp"
#include "lvgl_task.hpp"
#include "modal_confirm.hpp"
+#include "model_playback.hpp"
#include "nvs.hpp"
#include "relative_wheel.hpp"
#include "screen.hpp"
@@ -52,6 +53,10 @@ std::stack<std::shared_ptr<Screen>> UiState::sScreens;
std::shared_ptr<Screen> UiState::sCurrentScreen;
std::shared_ptr<Modal> UiState::sCurrentModal;
+models::Playback UiState::sPlaybackModel;
+
+bindey::property<battery::Battery::BatteryState> UiState::sPropBatteryState;
+
auto UiState::InitBootSplash(drivers::IGpios& gpios) -> bool {
// Init LVGL first, since the display driver registers itself with LVGL.
lv_init();
@@ -89,15 +94,33 @@ void UiState::react(const system_fsm::KeyLockChanged& ev) {
}
void UiState::react(const system_fsm::BatteryStateChanged&) {
- UpdateTopBar();
+ if (!sServices) {
+ return;
+ }
+ auto state = sServices->battery().State();
+ if (state) {
+ sPropBatteryState.set(*state);
+ }
}
void UiState::react(const audio::PlaybackStarted&) {
- UpdateTopBar();
+ sPlaybackModel.is_playing.set(true);
}
void UiState::react(const audio::PlaybackFinished&) {
- UpdateTopBar();
+ sPlaybackModel.is_playing.set(false);
+}
+
+void UiState::react(const audio::PlaybackUpdate& ev) {
+ sPlaybackModel.current_track_duration.set(ev.seconds_total);
+ sPlaybackModel.current_track_position.set(ev.seconds_elapsed);
+}
+
+void UiState::react(const audio::QueueUpdate&) {
+ ESP_LOGI(kTag, "current changed!");
+ auto& queue = sServices->track_queue();
+ sPlaybackModel.current_track.set(queue.GetCurrent());
+ sPlaybackModel.upcoming_tracks.set(queue.GetUpcoming(10));
}
void UiState::UpdateTopBar() {
@@ -283,21 +306,22 @@ void Browse::react(const internal::RecordSelected& ev) {
}
auto record = ev.page->values().at(ev.record);
- if (record.track()) {
- ESP_LOGI(kTag, "selected track '%s'", record.text()->c_str());
+ if (record->track()) {
+ ESP_LOGI(kTag, "selected track '%s'", record->text()->c_str());
auto& queue = sServices->track_queue();
queue.Clear();
queue.IncludeLast(std::make_shared<playlist::IndexRecordSource>(
sServices->database(), ev.initial_page, 0, ev.page, ev.record));
+ ESP_LOGI(kTag, "transit to playing");
transit<Playing>();
} else {
- ESP_LOGI(kTag, "selected record '%s'", record.text()->c_str());
- auto cont = record.Expand(kRecordsPerPage);
+ ESP_LOGI(kTag, "selected record '%s'", record->text()->c_str());
+ auto cont = record->Expand(kRecordsPerPage);
if (!cont) {
return;
}
auto query = db->GetPage(&cont.value());
- std::pmr::string title = record.text().value_or("TODO");
+ std::pmr::string title = record->text().value_or("TODO");
PushScreen(std::make_shared<screens::TrackBrowser>(
sServices->database(), title, std::move(query)));
}
@@ -329,8 +353,9 @@ void Browse::react(const system_fsm::BluetoothDevicesChanged&) {
static std::shared_ptr<screens::Playing> sPlayingScreen;
void Playing::entry() {
- sPlayingScreen.reset(
- new screens::Playing(sServices->database(), sServices->track_queue()));
+ ESP_LOGI(kTag, "push playing screen");
+ sPlayingScreen.reset(new screens::Playing(
+ sPlaybackModel, sServices->database(), sServices->track_queue()));
PushScreen(sPlayingScreen);
}
@@ -339,24 +364,6 @@ void Playing::exit() {
PopScreen();
}
-void Playing::react(const audio::PlaybackStarted& ev) {
- UpdateTopBar();
- sPlayingScreen->OnTrackUpdate();
-}
-
-void Playing::react(const audio::PlaybackFinished& ev) {
- UpdateTopBar();
- sPlayingScreen->OnTrackUpdate();
-}
-
-void Playing::react(const audio::PlaybackUpdate& ev) {
- sPlayingScreen->OnPlaybackUpdate(ev.seconds_elapsed, ev.seconds_total);
-}
-
-void Playing::react(const audio::QueueUpdate& ev) {
- sPlayingScreen->OnQueueUpdate();
-}
-
void Playing::react(const internal::BackPressed& ev) {
transit<Browse>();
}