From 2a568846bd8f1c9e23e86e7570557eed6f18cf9f Mon Sep 17 00:00:00 2001 From: jacqueline Date: Wed, 7 Jun 2023 10:30:33 +1000 Subject: Cute brightness fade to avoid ugly startup :) --- src/ui/include/ui_fsm.hpp | 17 +++++------------ src/ui/ui_fsm.cpp | 46 +++++++++++++++++++++++++++++++--------------- 2 files changed, 36 insertions(+), 27 deletions(-) (limited to 'src/ui') diff --git a/src/ui/include/ui_fsm.hpp b/src/ui/include/ui_fsm.hpp index da6263b7..8b80f162 100644 --- a/src/ui/include/ui_fsm.hpp +++ b/src/ui/include/ui_fsm.hpp @@ -21,9 +21,7 @@ namespace ui { class UiState : public tinyfsm::Fsm { public: - static auto Init(drivers::GpioExpander* gpio_expander, - const std::weak_ptr& touchwheel, - const std::weak_ptr& display) -> void; + static auto Init(drivers::GpioExpander* gpio_expander) -> bool; virtual ~UiState() {} @@ -42,23 +40,18 @@ class UiState : public tinyfsm::Fsm { protected: static drivers::GpioExpander* sGpioExpander; - static std::weak_ptr sTouchWheel; - static std::weak_ptr sDisplay; + static std::shared_ptr sTouchWheel; + static std::shared_ptr sRelativeWheel; + static std::shared_ptr sDisplay; static std::shared_ptr sCurrentScreen; }; namespace states { -class PreBoot : public UiState { - public: - void react(const system_fsm::DisplayReady&) override; - using UiState::react; -}; - class Splash : public UiState { public: - void entry() override; + void exit() override; void react(const system_fsm::BootComplete&) override; using UiState::react; }; diff --git a/src/ui/ui_fsm.cpp b/src/ui/ui_fsm.cpp index 5c59cf22..bdc1f89f 100644 --- a/src/ui/ui_fsm.cpp +++ b/src/ui/ui_fsm.cpp @@ -5,6 +5,8 @@ */ #include "ui_fsm.hpp" +#include +#include "core/lv_obj.h" #include "display.hpp" #include "lvgl_task.hpp" #include "relative_wheel.hpp" @@ -17,33 +19,47 @@ namespace ui { drivers::GpioExpander* UiState::sGpioExpander; -std::weak_ptr UiState::sTouchWheel; -std::weak_ptr UiState::sDisplay; +std::shared_ptr UiState::sTouchWheel; +std::shared_ptr UiState::sRelativeWheel; +std::shared_ptr UiState::sDisplay; std::shared_ptr UiState::sCurrentScreen; -auto UiState::Init(drivers::GpioExpander* gpio_expander, - const std::weak_ptr& touchwheel, - const std::weak_ptr& display) -> void { - assert(!touchwheel.expired()); - assert(!display.expired()); +auto UiState::Init(drivers::GpioExpander* gpio_expander) -> bool { sGpioExpander = gpio_expander; - sTouchWheel = touchwheel; - sDisplay = display; + + lv_init(); + sDisplay.reset( + drivers::Display::Create(gpio_expander, drivers::displays::kST7735R)); + if (sDisplay == nullptr) { + return false; + } + + sTouchWheel.reset(drivers::TouchWheel::Create()); + if (sTouchWheel != nullptr) { + sRelativeWheel.reset(new drivers::RelativeWheel(sTouchWheel.get())); + } sCurrentScreen.reset(new screens::Splash()); - StartLvgl(sTouchWheel, sDisplay); + // Start the UI task even if init ultimately failed, so that we can show some + // kind of error screen to the user. + StartLvgl(sRelativeWheel, sDisplay); + + if (sTouchWheel == nullptr) { + return false; + } + return true; } namespace states { -void PreBoot::react(const system_fsm::DisplayReady& ev) { - transit(); +void Splash::exit() { + if (sDisplay != nullptr) { + sDisplay->SetDisplayOn(true); + } } -void Splash::entry() {} - void Splash::react(const system_fsm::BootComplete& ev) { transit(); } @@ -55,4 +71,4 @@ void Interactive::entry() { } // namespace states } // namespace ui -FSM_INITIAL_STATE(ui::UiState, ui::states::PreBoot) +FSM_INITIAL_STATE(ui::UiState, ui::states::Splash) -- cgit v1.2.3