diff --git a/apps/esp32_lvgl/src/esp32_lvgl_arduino_startup_runtime.cpp b/apps/esp32_lvgl/src/esp32_lvgl_arduino_startup_runtime.cpp index 0db4e425..61272121 100644 --- a/apps/esp32_lvgl/src/esp32_lvgl_arduino_startup_runtime.cpp +++ b/apps/esp32_lvgl/src/esp32_lvgl_arduino_startup_runtime.cpp @@ -80,24 +80,29 @@ void run() platform::esp::arduino_common::startup_support::initializeBoard(waking_from_sleep); Serial.printf("[Setup] heap=%u psram=%u\n", ESP.getFreeHeap(), ESP.getFreePsram()); + + Serial.println("[Setup] LVGL init begin"); + platform::esp::arduino_common::display_runtime::initialize(); + Serial.println("[Setup] LVGL init done"); + + ui::startup_shell::beginBootUi(waking_from_sleep, "Starting services..."); + ui::startup_shell::setBootLogLine("Starting debug log..."); + platform::esp::arduino_common::debug::begin_sd_debug_log(); platform::esp::arduino_common::debug::printf( "[Setup] board initialized wake=%d heap=%u psram=%u", waking_from_sleep ? 1 : 0, ESP.getFreeHeap(), ESP.getFreePsram()); + platform::esp::arduino_common::debug::append_line("[Setup] LVGL init done"); + ui::startup_shell::setBootLogLine("Checking crash dump..."); platform::esp::arduino_common::debug::export_previous_coredump_to_sd(); - Serial.println("[Setup] LVGL init begin"); - platform::esp::arduino_common::debug::append_line("[Setup] LVGL init begin"); - platform::esp::arduino_common::display_runtime::initialize(); - Serial.println("[Setup] LVGL init done"); - platform::esp::arduino_common::debug::append_line("[Setup] LVGL init done"); - - ui::startup_shell::prepareBootUi(waking_from_sleep); + ui::startup_shell::setBootLogLine("Loading language packs..."); + ui::startup_shell::prepareBootResources(); bool use_mock = false; - ui::boot::set_log_line("Initializing app context..."); + ui::startup_shell::setBootLogLine("Initializing app context..."); if (trailmate::apps::esp32_lvgl::arduino_app_runtime_access::initialize(use_mock)) { const auto& runtime_status = trailmate::apps::esp32_lvgl::arduino_app_runtime_access::status(); @@ -125,9 +130,9 @@ void run() runtime_status.background_tasks_started ? 1 : 0); } - ui::boot::set_log_line("Building main menu..."); + ui::startup_shell::setBootLogLine("Building main menu..."); initializeShell(); - ui::boot::set_log_line("Startup complete"); + ui::startup_shell::setBootLogLine("Startup complete"); finishStartup(waking_from_sleep); platform::esp::arduino_common::debug::append_line("[Setup] Startup complete"); platform::esp::arduino_common::debug::flush(); diff --git a/apps/esp32_lvgl/src/esp32_lvgl_startup_runtime.cpp b/apps/esp32_lvgl/src/esp32_lvgl_startup_runtime.cpp index 740938b1..fd3a61a2 100644 --- a/apps/esp32_lvgl/src/esp32_lvgl_startup_runtime.cpp +++ b/apps/esp32_lvgl/src/esp32_lvgl_startup_runtime.cpp @@ -87,6 +87,35 @@ ui::startup_shell::Hooks buildShellHooks() }; return hooks; } + +void showBootUi(const Esp32LvglRuntimeConfig& config, bool waking_from_sleep, const char* initial_line) +{ + ESP_LOGI(config.log_tag, "beginBootUi line=%s", initial_line ? initial_line : ""); + if (lockUi(1000)) + { + ui::startup_shell::beginBootUi(waking_from_sleep, initial_line); + unlockUi(); + ESP_LOGI(config.log_tag, "beginBootUi complete"); + } + else + { + ESP_LOGW(config.log_tag, "beginBootUi failed to acquire LVGL lock"); + } +} + +void setBootLog(const Esp32LvglRuntimeConfig& config, const char* line) +{ + ESP_LOGI(config.log_tag, "boot log: %s", line ? line : ""); + if (lockUi(1000)) + { + ui::startup_shell::setBootLogLine(line); + unlockUi(); + } + else + { + ESP_LOGW(config.log_tag, "setBootLog failed to acquire LVGL lock"); + } +} #endif } // namespace @@ -117,24 +146,29 @@ void runEsp32LvglStartupRuntime(const Esp32LvglRuntimeConfig& config) (void)platform::esp::idf_common::bsp_runtime::ensure_nvs_ready(); platform::esp::boards::initializeBoard(waking_from_sleep); platform::esp::boards::initializeDisplay(); + showBootUi(config, waking_from_sleep, "Starting services..."); if (platform::esp::boards::syncSystemTimeFromBoardRtc()) { ESP_LOGI(config.log_tag, "Boot time restored from hardware RTC"); } + setBootLog(config, "Starting companion..."); (void)platform::esp::idf_common::wireless_companion::ensure_c6_companion_started(); + setBootLog(config, "Mounting SD card..."); (void)platform::esp::idf_common::bsp_runtime::ensure_sdcard_ready(); + setBootLog(config, "Checking crash dump..."); (void)platform::esp::idf_common::debug::export_previous_coredump_to_sd(); - ESP_LOGI(config.log_tag, "prepareBootUi begin waking=%d", waking_from_sleep ? 1 : 0); - if (lockUi(1000)) + setBootLog(config, "Loading language packs..."); + ESP_LOGI(config.log_tag, "prepareBootResources begin waking=%d", waking_from_sleep ? 1 : 0); + if (lockUi(5000)) { - ui::startup_shell::prepareBootUi(waking_from_sleep); + ui::startup_shell::prepareBootResources(); unlockUi(); - ESP_LOGI(config.log_tag, "prepareBootUi complete"); + ESP_LOGI(config.log_tag, "prepareBootResources complete"); } else { - ESP_LOGW(config.log_tag, "prepareBootUi failed to acquire LVGL lock"); + ESP_LOGW(config.log_tag, "prepareBootResources failed to acquire LVGL lock"); } idf_app_runtime_access::initialize(config); diff --git a/apps/esp32_lvgl/tests/esp32_lvgl_sd_coredump_contract_smoke.cpp b/apps/esp32_lvgl/tests/esp32_lvgl_sd_coredump_contract_smoke.cpp index d1e05c0b..30de25dc 100644 --- a/apps/esp32_lvgl/tests/esp32_lvgl_sd_coredump_contract_smoke.cpp +++ b/apps/esp32_lvgl/tests/esp32_lvgl_sd_coredump_contract_smoke.cpp @@ -43,10 +43,18 @@ int main(int argc, char** argv) const std::size_t begin_log = position_of( arduino_startup, "debug::begin_sd_debug_log"); + const std::size_t display_init = position_of( + arduino_startup, + "display_runtime::initialize"); + const std::size_t begin_boot = position_of( + arduino_startup, + "startup_shell::beginBootUi"); const std::size_t export_core = position_of( arduino_startup, "debug::export_previous_coredump_to_sd"); - assert(board_init < begin_log); + assert(board_init < display_init); + assert(display_init < begin_boot); + assert(begin_boot < begin_log); assert(begin_log < export_core); const std::string header = read_file( @@ -87,12 +95,20 @@ int main(int argc, char** argv) const std::string idf_startup = read_file( repo_root / "apps/esp32_lvgl/src/esp32_lvgl_startup_runtime.cpp"); + const std::size_t idf_display = position_of( + idf_startup, + "boards::initializeDisplay"); + const std::size_t idf_begin_boot = position_of( + idf_startup, + "showBootUi(config"); const std::size_t idf_sd_ready = position_of( idf_startup, "bsp_runtime::ensure_sdcard_ready"); const std::size_t idf_export_core = position_of( idf_startup, "idf_common::debug::export_previous_coredump_to_sd"); + assert(idf_display < idf_begin_boot); + assert(idf_begin_boot < idf_sd_ready); assert(idf_sd_ready < idf_export_core); const std::string idf_header = read_file( diff --git a/modules/ui_shared/include/ui/startup_shell.h b/modules/ui_shared/include/ui/startup_shell.h index 3b002ed4..56bb8dbe 100644 --- a/modules/ui_shared/include/ui/startup_shell.h +++ b/modules/ui_shared/include/ui/startup_shell.h @@ -24,7 +24,9 @@ bool format_menu_time(char* out, size_t out_len); menu_runtime::Hooks::WatchFaceHooks defaultWatchFaceHooks(); menu_runtime::Hooks buildMenuRuntimeHooks(const Hooks& hooks); platform::ui::screen::Hooks buildScreenSleepHooks(const Hooks& hooks); -void prepareBootUi(bool waking_from_sleep); +void beginBootUi(bool waking_from_sleep, const char* initial_line); +void setBootLogLine(const char* line); +void prepareBootResources(); void initializeShell(const Hooks& hooks); void finalizeStartup(bool waking_from_sleep); diff --git a/modules/ui_shared/include/ui/startup_ui_shell.h b/modules/ui_shared/include/ui/startup_ui_shell.h index 461cbc5d..40188aa3 100644 --- a/modules/ui_shared/include/ui/startup_ui_shell.h +++ b/modules/ui_shared/include/ui/startup_ui_shell.h @@ -16,7 +16,8 @@ struct Hooks uint32_t lock_timeout_ms = 1000; }; -bool prepareBootUi(const Hooks& hooks, bool waking_from_sleep); +bool beginBootUi(const Hooks& hooks, bool waking_from_sleep, const char* initial_line); +void prepareBootResources(); bool initializeMenuSkeleton(const Hooks& hooks); bool finalizeStartup(const Hooks& hooks, bool waking_from_sleep); diff --git a/modules/ui_shared/src/ui/startup_shell.cpp b/modules/ui_shared/src/ui/startup_shell.cpp index 8abd7f01..50926ebe 100644 --- a/modules/ui_shared/src/ui/startup_shell.cpp +++ b/modules/ui_shared/src/ui/startup_shell.cpp @@ -138,14 +138,23 @@ platform::ui::screen::Hooks buildScreenSleepHooks(const Hooks& hooks) return runtime_hooks; } -void prepareBootUi(bool waking_from_sleep) +void setBootLogLine(const char* line) +{ + ui::boot::set_log_line(line); + present_boot_overlay_now(); +} + +void beginBootUi(bool waking_from_sleep, const char* initial_line) { if (!waking_from_sleep) { ui::boot::show(); - ui::boot::set_log_line("Loading language packs..."); - present_boot_overlay_now(); + setBootLogLine(initial_line); } +} + +void prepareBootResources() +{ ::ui::i18n::reload_language(); ui::feedback::init(); } diff --git a/modules/ui_shared/src/ui/startup_ui_shell.cpp b/modules/ui_shared/src/ui/startup_ui_shell.cpp index c5fdf44d..df85b5af 100644 --- a/modules/ui_shared/src/ui/startup_ui_shell.cpp +++ b/modules/ui_shared/src/ui/startup_ui_shell.cpp @@ -99,11 +99,10 @@ void unlock_ui(const Hooks& hooks) } // namespace -bool prepareBootUi(const Hooks& hooks, bool waking_from_sleep) +bool beginBootUi(const Hooks& hooks, bool waking_from_sleep, const char* initial_line) { if (waking_from_sleep) { - ::ui::i18n::reload_language(); return true; } if (!lock_ui(hooks)) @@ -111,12 +110,16 @@ bool prepareBootUi(const Hooks& hooks, bool waking_from_sleep) return false; } ui::boot::show(); - ui::boot::set_log_line("Loading language packs..."); + ui::boot::set_log_line(initial_line); present_boot_overlay_now(); unlock_ui(hooks); + return true; +} + +void prepareBootResources() +{ ::ui::i18n::reload_language(); ui::feedback::init(); - return true; } bool initializeMenuSkeleton(const Hooks& hooks) diff --git a/platform/linux/common/src/ui/shared_ui_shell.cpp b/platform/linux/common/src/ui/shared_ui_shell.cpp index 7a255697..a1cc8718 100644 --- a/platform/linux/common/src/ui/shared_ui_shell.cpp +++ b/platform/linux/common/src/ui/shared_ui_shell.cpp @@ -189,10 +189,11 @@ bool SharedUiShellStartup::begin() } started_at_ms_ = lv_tick_get(); - if (!ui::startup_ui_shell::prepareBootUi(buildHooks(), false)) + if (!ui::startup_ui_shell::beginBootUi(buildHooks(), false, "Loading language packs...")) { return false; } + ui::startup_ui_shell::prepareBootResources(); phase_ = Phase::BootVisible; return true;