summaryrefslogtreecommitdiff
path: root/src/ui/ui_fsm.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-04-22 16:00:53 +1000
committerjacqueline <me@jacqueline.id.au>2024-04-22 16:00:53 +1000
commitdb9e5cce1fff82149a609939709a94ae02f349a8 (patch)
tree5dd6f5a636eb2e87bca84d7ceabbf09c893f23e1 /src/ui/ui_fsm.cpp
parent5b99267cb9f0344e519956096867aea5468ecf9f (diff)
downloadtangara-fw-db9e5cce1fff82149a609939709a94ae02f349a8.tar.gz
Improve handling of the display
- Blank the display when locking to prevent burn-in - Delay turning the display on until *exactly* after the first lvgl flush - Init the display in the ui task to avoid blocking the rest of boot
Diffstat (limited to 'src/ui/ui_fsm.cpp')
-rw-r--r--src/ui/ui_fsm.cpp23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/ui/ui_fsm.cpp b/src/ui/ui_fsm.cpp
index 1305e764..ceeb194d 100644
--- a/src/ui/ui_fsm.cpp
+++ b/src/ui/ui_fsm.cpp
@@ -267,6 +267,15 @@ lua::Property UiState::sUsbMassStorageBusy{false};
auto UiState::InitBootSplash(drivers::IGpios& gpios, drivers::NvsStorage& nvs)
-> bool {
+ events::Ui().Dispatch(internal::InitDisplay{
+ .gpios = gpios,
+ .nvs = nvs,
+ });
+ sTask.reset(UiTask::Start());
+ return true;
+}
+
+void UiState::react(const internal::InitDisplay& ev) {
// Init LVGL first, since the display driver registers itself with LVGL.
lv_init();
@@ -275,19 +284,15 @@ auto UiState::InitBootSplash(drivers::IGpios& gpios, drivers::NvsStorage& nvs)
// HACK: correct the display size for our prototypes.
// nvs.DisplaySize({161, 130});
- auto actual_size = nvs.DisplaySize();
+ auto actual_size = ev.nvs.DisplaySize();
init_data.width = actual_size.first.value_or(init_data.width);
init_data.height = actual_size.second.value_or(init_data.height);
-
- sDisplay.reset(drivers::Display::Create(gpios, init_data));
- if (sDisplay == nullptr) {
- return false;
- }
+ sDisplay.reset(drivers::Display::Create(ev.gpios, init_data));
sCurrentScreen.reset(new screens::Splash());
- sTask.reset(UiTask::Start());
- sDisplay->SetDisplayOn(!gpios.IsLocked());
- return true;
+
+ // Display will only actually come on after LVGL finishes its first flush.
+ sDisplay->SetDisplayOn(!ev.gpios.IsLocked());
}
void UiState::PushScreen(std::shared_ptr<Screen> screen) {