From e7cf2e6b50804b5e82fe6e3d3496b08397daf771 Mon Sep 17 00:00:00 2001 From: sumolx Date: Mon, 17 Jun 2024 12:02:01 -0400 Subject: [PATCH 1/2] Decreased overall bootup time. --- src/core/thread.c | 6 +++++- src/ui/page_storage.c | 22 +++++++++++++++++++++ src/ui/page_wifi.c | 4 +++- src/ui/ui_main_menu.c | 46 ++++++++++++++++++++++++++++++++++++++++++- src/ui/ui_main_menu.h | 4 ++++ 5 files changed, 79 insertions(+), 3 deletions(-) diff --git a/src/core/thread.c b/src/core/thread.c index 6d1bc06b..c2bb0a36 100644 --- a/src/core/thread.c +++ b/src/core/thread.c @@ -31,6 +31,8 @@ #include "util/sdcard.h" #include "util/system.h" +void (*sdcard_ready_cb)() = NULL; + /////////////////////////////////////////////////////////////////////////////// // SD card exist static void detect_sdcard(void) { @@ -52,7 +54,9 @@ static void detect_sdcard(void) { // Only repair card at bootup or when inserted if (g_init_done) { if (sdcard_init_scan && g_sdcard_enable) { - page_storage_init_auto_sd_repair(); + if (sdcard_ready_cb) { + sdcard_ready_cb(); + } sdcard_init_scan = false; } else if (!g_sdcard_enable && sdcard_enable_last) { sdcard_init_scan = true; diff --git a/src/ui/page_storage.c b/src/ui/page_storage.c index 19e749df..7ff9dae0 100644 --- a/src/ui/page_storage.c +++ b/src/ui/page_storage.c @@ -13,6 +13,8 @@ #include "util/sdcard.h" #include "util/system.h" +extern void (*sdcard_ready_cb)(); + /** * Types */ @@ -59,6 +61,7 @@ typedef struct { bool disable_controls; bool is_sd_repair_active; bool is_auto_sd_repair_active; + bool is_sd_repair_complete; } page_options_t; /** @@ -501,6 +504,18 @@ static void page_storage_on_click(uint8_t key, int sel) { static void page_storage_on_right_button(bool is_short) { } +/** + * Returns true once the thread has completed. + */ +static bool page_storage_is_sd_repair_complete() { + if (page_storage.is_sd_repair_complete) { + sdcard_ready_cb = page_storage_init_auto_sd_repair; + return true; + } else { + return false; + } +} + /** * Main Menu page data structure, notice max is set to zero * in order to allow us to override default user input logic. @@ -519,6 +534,9 @@ page_pack_t pp_storage = { .on_roller = page_storage_on_roller, .on_click = page_storage_on_click, .on_right_button = page_storage_on_right_button, + .post_bootup_run_priority = 50, + .post_bootup_run_function = page_storage_init_auto_sd_repair, + .post_bootup_run_complete = page_storage_is_sd_repair_complete, }; /** @@ -534,6 +552,7 @@ static void *page_storage_repair_thread(void *arg) { lv_label_set_text(page_storage.note, ""); page_storage.is_auto_sd_repair_active = false; } + page_storage.is_sd_repair_complete = true; pthread_exit(NULL); } @@ -548,10 +567,13 @@ bool page_storage_is_sd_repair_active() { * Once initialized detach until completed. */ void page_storage_init_auto_sd_repair() { + page_storage.is_sd_repair_complete = false; if (!page_storage.is_auto_sd_repair_active) { pthread_t tid; if (!pthread_create(&tid, NULL, page_storage_repair_thread, NULL)) { pthread_detach(tid); } + } else { + page_storage.is_sd_repair_complete = true; } } diff --git a/src/ui/page_wifi.c b/src/ui/page_wifi.c index fbd48aa4..e7c88e27 100644 --- a/src/ui/page_wifi.c +++ b/src/ui/page_wifi.c @@ -727,7 +727,6 @@ static lv_obj_t *page_wifi_create(lv_obj_t *parent, panel_arr_t *arr) { page_wifi_create_page_3(cont); page_wifi_sync_settings(); page_wifi_update_current_page(0); - page_wifi_update_settings(); return page; } @@ -1123,6 +1122,9 @@ page_pack_t pp_wifi = { .on_roller = page_wifi_on_roller, .on_click = page_wifi_on_click, .on_right_button = page_wifi_on_right_button, + .post_bootup_run_priority = 100, + .post_bootup_run_function = page_wifi_update_settings, + .post_bootup_run_complete = NULL, }; /** diff --git a/src/ui/ui_main_menu.c b/src/ui/ui_main_menu.c index bd4729ea..2c50c3f3 100644 --- a/src/ui/ui_main_menu.c +++ b/src/ui/ui_main_menu.c @@ -67,6 +67,8 @@ static page_pack_t *page_packs[] = { #define PAGE_COUNT (sizeof(page_packs) / sizeof(page_packs[0])) +static page_pack_t* post_bootup_actions[PAGE_COUNT + 1]; + static page_pack_t *find_pp(lv_obj_t *page) { for (uint32_t i = 0; i < PAGE_COUNT; i++) { if (page_packs[i]->page == page) { @@ -301,8 +303,25 @@ void main_menu_init(void) { lv_obj_t *section = lv_menu_section_create(root_page); lv_obj_clear_flag(section, LV_OBJ_FLAG_SCROLLABLE); - for (uint32_t i = 0; i < PAGE_COUNT; i++) { + for (uint32_t i = 0, j = 0; i < PAGE_COUNT; i++) { main_menu_create_entry(menu, section, page_packs[i]); + if (page_packs[i]->post_bootup_run_priority > 0) { + post_bootup_actions[j++] = page_packs[i]; + } + } + + // Resort based on priority + for (uint32_t i = 0; i < PAGE_COUNT; ++i) { + for (uint32_t j = 1; j < PAGE_COUNT; ++j) { + if (post_bootup_actions[i] && post_bootup_actions[j]) { + if (post_bootup_actions[j]->post_bootup_run_priority < + post_bootup_actions[i]->post_bootup_run_priority) { + post_bootup_actions[PAGE_COUNT] = post_bootup_actions[i]; + post_bootup_actions[i] = post_bootup_actions[j]; + post_bootup_actions[j] = post_bootup_actions[PAGE_COUNT]; + } + } + } } lv_obj_add_style(section, &style_rootmenu, LV_PART_MAIN); @@ -332,12 +351,37 @@ void main_menu_init(void) { void main_menu_update() { static uint32_t delta_ms = 0; + static uint32_t last_bootup_action = 0; uint32_t now_ms = time_ms(); delta_ms = now_ms - delta_ms; + for (uint32_t i = 0; i < PAGE_COUNT; i++) { if (page_packs[i]->on_update) { page_packs[i]->on_update(delta_ms); } + + if (last_bootup_action == i && post_bootup_actions[i]) { + if (post_bootup_actions[i] != NULL) { + // Function invokation + if (post_bootup_actions[i]->post_bootup_run_complete == NULL) { + if (post_bootup_actions[i]->post_bootup_run_function != NULL) { + post_bootup_actions[i]->post_bootup_run_function(); + post_bootup_actions[i]->post_bootup_run_function = NULL; + post_bootup_actions[i] = NULL; + ++last_bootup_action; + } + } else { // Thread invokation + if (post_bootup_actions[i]->post_bootup_run_function){ + post_bootup_actions[i]->post_bootup_run_function(); + post_bootup_actions[i]->post_bootup_run_function = NULL; + } else if (post_bootup_actions[i]->post_bootup_run_complete()) { + post_bootup_actions[i]->post_bootup_run_complete = NULL; + post_bootup_actions[i] = NULL; + ++last_bootup_action; + } + } + } + } } delta_ms = now_ms; } diff --git a/src/ui/ui_main_menu.h b/src/ui/ui_main_menu.h index 7ef353e3..73f2da1f 100644 --- a/src/ui/ui_main_menu.h +++ b/src/ui/ui_main_menu.h @@ -27,6 +27,10 @@ typedef struct { void (*on_roller)(uint8_t key); void (*on_click)(uint8_t key, int sel); void (*on_right_button)(bool is_short); + + int32_t post_bootup_run_priority; + void(*post_bootup_run_function)(); + bool(*post_bootup_run_complete)(); } page_pack_t; typedef struct { From d1ee5509029e4cd00afcb38e928d28210f7eddc6 Mon Sep 17 00:00:00 2001 From: sumolx Date: Mon, 17 Jun 2024 12:40:58 -0400 Subject: [PATCH 2/2] Service scripts are used for installing, we only need to run them once. --- .../10_busybox.sh} | 0 .../30_bearssl.sh} | 0 .../30_dosfstools.sh} | 0 .../50_dropbear.sh} | 0 .../50_tinycurl.sh} | 0 mkapp/app/services/startup.sh | 13 +++++++++++-- 6 files changed, 11 insertions(+), 2 deletions(-) rename mkapp/app/services/scripts/{10_busybox_startup.sh => install/10_busybox.sh} (100%) rename mkapp/app/services/scripts/{30_bearssl_startup.sh => install/30_bearssl.sh} (100%) rename mkapp/app/services/scripts/{30_dosfstools_startup.sh => install/30_dosfstools.sh} (100%) rename mkapp/app/services/scripts/{50_dropbear_startup.sh => install/50_dropbear.sh} (100%) rename mkapp/app/services/scripts/{50_tinycurl_startup.sh => install/50_tinycurl.sh} (100%) diff --git a/mkapp/app/services/scripts/10_busybox_startup.sh b/mkapp/app/services/scripts/install/10_busybox.sh similarity index 100% rename from mkapp/app/services/scripts/10_busybox_startup.sh rename to mkapp/app/services/scripts/install/10_busybox.sh diff --git a/mkapp/app/services/scripts/30_bearssl_startup.sh b/mkapp/app/services/scripts/install/30_bearssl.sh similarity index 100% rename from mkapp/app/services/scripts/30_bearssl_startup.sh rename to mkapp/app/services/scripts/install/30_bearssl.sh diff --git a/mkapp/app/services/scripts/30_dosfstools_startup.sh b/mkapp/app/services/scripts/install/30_dosfstools.sh similarity index 100% rename from mkapp/app/services/scripts/30_dosfstools_startup.sh rename to mkapp/app/services/scripts/install/30_dosfstools.sh diff --git a/mkapp/app/services/scripts/50_dropbear_startup.sh b/mkapp/app/services/scripts/install/50_dropbear.sh similarity index 100% rename from mkapp/app/services/scripts/50_dropbear_startup.sh rename to mkapp/app/services/scripts/install/50_dropbear.sh diff --git a/mkapp/app/services/scripts/50_tinycurl_startup.sh b/mkapp/app/services/scripts/install/50_tinycurl.sh similarity index 100% rename from mkapp/app/services/scripts/50_tinycurl_startup.sh rename to mkapp/app/services/scripts/install/50_tinycurl.sh diff --git a/mkapp/app/services/startup.sh b/mkapp/app/services/startup.sh index 125f3865..b1f017cd 100755 --- a/mkapp/app/services/startup.sh +++ b/mkapp/app/services/startup.sh @@ -1,7 +1,16 @@ #!/bin/sh -for FILE in $(ls /mnt/app/services/scripts/) +if [ ! -f /mnt/app/services/scripts/install/install.done ]; then + for FILE in $(ls /mnt/app/services/scripts/install/) + do + echo "Installing service: $FILE" + /mnt/app/services/scripts/install/$FILE & + done + touch /mnt/app/services/scripts/install/install.done +fi + +for FILE in $(ls /mnt/app/services/scripts/runtime/) do echo "Starting service: $FILE" - /mnt/app/services/scripts/$FILE & + /mnt/app/services/scripts/runtime/$FILE & done