diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-11-14 13:20:04 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-11-14 13:20:04 +1100 |
| commit | 71ed09a6f70901c9097973a44b24d6a6ced2834f (patch) | |
| tree | 3d02e4e180cd0a5caa1185eba89181607c4bccb9 /src/ui | |
| parent | 8a0a167adbf3d9b6f8b6f16aaf20ca39ad5549de (diff) | |
| download | tangara-fw-71ed09a6f70901c9097973a44b24d6a6ced2834f.tar.gz | |
Add two-way databinding for lua, and flesh out the lua statusbar
Diffstat (limited to 'src/ui')
| -rw-r--r-- | src/ui/include/ui_fsm.hpp | 19 | ||||
| -rw-r--r-- | src/ui/ui_fsm.cpp | 43 |
2 files changed, 59 insertions, 3 deletions
diff --git a/src/ui/include/ui_fsm.hpp b/src/ui/include/ui_fsm.hpp index 7d1d62d6..39fae4b0 100644 --- a/src/ui/include/ui_fsm.hpp +++ b/src/ui/include/ui_fsm.hpp @@ -21,6 +21,7 @@ #include "model_playback.hpp" #include "model_top_bar.hpp" #include "nvs.hpp" +#include "property.hpp" #include "relative_wheel.hpp" #include "screen_playing.hpp" #include "screen_settings.hpp" @@ -56,9 +57,9 @@ class UiState : public tinyfsm::Fsm<UiState> { /* Fallback event handler. Does nothing. */ void react(const tinyfsm::Event& ev) {} - void react(const system_fsm::BatteryStateChanged&); - void react(const audio::PlaybackStarted&); - void react(const audio::PlaybackFinished&); + virtual void react(const system_fsm::BatteryStateChanged&); + virtual void react(const audio::PlaybackStarted&); + virtual void react(const audio::PlaybackFinished&); void react(const audio::PlaybackUpdate&); void react(const audio::QueueUpdate&); @@ -127,7 +128,19 @@ class Lua : public UiState { void react(const internal::ShowNowPlaying&) override; void react(const internal::ShowSettingsPage&) override; + void react(const system_fsm::BatteryStateChanged&) override; + void react(const audio::PlaybackStarted&) override; + void react(const audio::PlaybackFinished&) override; + using UiState::react; + + private: + std::shared_ptr<lua::Property> battery_pct_; + std::shared_ptr<lua::Property> battery_mv_; + std::shared_ptr<lua::Property> battery_charging_; + std::shared_ptr<lua::Property> bluetooth_en_; + std::shared_ptr<lua::Property> playback_playing_; + std::shared_ptr<lua::Property> playback_track_; }; class Onboarding : public UiState { diff --git a/src/ui/ui_fsm.cpp b/src/ui/ui_fsm.cpp index 748e08f9..9ecc9b7c 100644 --- a/src/ui/ui_fsm.cpp +++ b/src/ui/ui_fsm.cpp @@ -33,6 +33,7 @@ #include "modal_progress.hpp" #include "model_playback.hpp" #include "nvs.hpp" +#include "property.hpp" #include "relative_wheel.hpp" #include "screen.hpp" #include "screen_lua.hpp" @@ -183,7 +184,36 @@ void Lua::entry() { sCurrentScreen.reset(new Screen()); lv_group_set_default(sCurrentScreen->group()); + auto bat = + sServices->battery().State().value_or(battery::Battery::BatteryState{}); + battery_pct_ = + std::make_shared<lua::Property>(static_cast<int>(bat.percent)); + battery_mv_ = + std::make_shared<lua::Property>(static_cast<int>(bat.millivolts)); + battery_charging_ = std::make_shared<lua::Property>(bat.is_charging); + + bluetooth_en_ = std::make_shared<lua::Property>(false); + playback_playing_ = std::make_shared<lua::Property>(false); + playback_track_ = std::make_shared<lua::Property>(); + sLua.reset(lua::LuaThread::Start(*sServices, sCurrentScreen->content())); + sLua->bridge().AddPropertyModule("power", + { + {"battery_pct", battery_pct_}, + {"battery_millivolts", battery_mv_}, + {"plugged_in", battery_charging_}, + }); + sLua->bridge().AddPropertyModule("bluetooth", + { + {"enabled", bluetooth_en_}, + {"connected", bluetooth_en_}, + }); + sLua->bridge().AddPropertyModule("playback", + { + {"playing", playback_playing_}, + {"track", playback_track_}, + }); + sLua->RunScript("/lua/main.lua"); lv_group_set_default(NULL); @@ -216,6 +246,19 @@ void Lua::react(const internal::ShowSettingsPage& ev) { transit<Browse>(); } +void Lua::react(const system_fsm::BatteryStateChanged& ev) { + battery_pct_->Update(static_cast<int>(ev.new_state.percent)); + battery_mv_->Update(static_cast<int>(ev.new_state.millivolts)); +} + +void Lua::react(const audio::PlaybackStarted&) { + playback_playing_->Update(true); +} + +void Lua::react(const audio::PlaybackFinished&) { + playback_playing_->Update(false); +} + void Onboarding::entry() { progress_ = 0; has_formatted_ = false; |
