diff options
| author | jacqueline <me@jacqueline.id.au> | 2024-04-22 16:00:53 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2024-04-22 16:00:53 +1000 |
| commit | db9e5cce1fff82149a609939709a94ae02f349a8 (patch) | |
| tree | 5dd6f5a636eb2e87bca84d7ceabbf09c893f23e1 /src/ui/ui_fsm.cpp | |
| parent | 5b99267cb9f0344e519956096867aea5468ecf9f (diff) | |
| download | tangara-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.cpp | 23 |
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) { |
