From 6d0db713058de5760cf311017f72ec0eaaa8ea39 Mon Sep 17 00:00:00 2001 From: Jack O'Sullivan Date: Fri, 13 Dec 2024 16:32:53 +0000 Subject: [PATCH] firmware: Add menu and idle states --- firmware/.gitignore | 1 + firmware/assets/sleep_orig.png | Bin 0 -> 36667 bytes firmware/default.nix | 5 +- firmware/gen-imgs.py | 2 +- firmware/main/CMakeLists.txt | 5 +- firmware/main/ui.c | 116 ++++++++++++++++++++++++++++++--- firmware/main/ui.h | 7 ++ 7 files changed, 123 insertions(+), 13 deletions(-) create mode 100644 firmware/assets/sleep_orig.png diff --git a/firmware/.gitignore b/firmware/.gitignore index 3396a99..1e1c75e 100644 --- a/firmware/.gitignore +++ b/firmware/.gitignore @@ -7,3 +7,4 @@ sdkconfig.old /main/img/*.c /assets/moon.png /assets/star.png +/assets/sleep.png diff --git a/firmware/assets/sleep_orig.png b/firmware/assets/sleep_orig.png new file mode 100644 index 0000000000000000000000000000000000000000..fcc3f24d87c267e8de4d5c60baf8f7be24844ece GIT binary patch literal 36667 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 literal 0 HcmV?d00001 diff --git a/firmware/default.nix b/firmware/default.nix index 242b864..7adb9cc 100644 --- a/firmware/default.nix +++ b/firmware/default.nix @@ -27,8 +27,9 @@ done ''; gen-imgs.exec = '' - magick assets/moon_orig.png -resize 120x120 assets/moon.png - magick assets/star_orig.png -resize 120x120 assets/star.png + for e in moon star sleep; do + magick assets/''${e}_orig.png -resize 120x120 assets/$e.png + done ${genImgsPy}/bin/python gen-imgs.py ''; diff --git a/firmware/gen-imgs.py b/firmware/gen-imgs.py index 27d7bc0..c4319d7 100755 --- a/firmware/gen-imgs.py +++ b/firmware/gen-imgs.py @@ -11,7 +11,7 @@ def rgb2h(r, g, b): def bytes_line(bs): return ' ' + ' '.join(map(lambda i: f'{i:#x},', bs)) + '\n' -imgs = ['bg.png', 'moon.png', 'star.png'] +imgs = ['bg.png', 'moon.png', 'star.png', 'sleep.png'] for fname in imgs: alpha = [] with Image.open(os.path.join('assets/', fname)) as img: diff --git a/firmware/main/CMakeLists.txt b/firmware/main/CMakeLists.txt index d318757..e25f494 100644 --- a/firmware/main/CMakeLists.txt +++ b/firmware/main/CMakeLists.txt @@ -1,3 +1,6 @@ idf_component_register( - SRCS "valconomy.c" "ui.c" "lcd.c" "usb.c" "font/tungsten_40.c" "font/tungsten_180.c" "img/bg.c" "img/moon.c" "img/star.c" + SRCS + "font/tungsten_40.c" "font/tungsten_180.c" + "img/bg.c" "img/moon.c" "img/star.c" "img/sleep.c" + "valconomy.c" "ui.c" "lcd.c" "usb.c" INCLUDE_DIRS ".") diff --git a/firmware/main/ui.c b/firmware/main/ui.c index 20f5ba2..19e23c1 100644 --- a/firmware/main/ui.c +++ b/firmware/main/ui.c @@ -15,6 +15,7 @@ static lv_obj_t *o_container = NULL; static lv_anim_timeline_t *at_active = NULL; static lv_obj_t *o_active = NULL; +static bool state_ready = true; static const void* imgfont_get_path( const lv_font_t *font, uint32_t unicode, uint32_t unicode_next, int32_t *offset_y, void *user_data) { @@ -28,6 +29,8 @@ static const void* imgfont_get_path( return &ui_img_moon; case 0x2B50: return &ui_img_star; + case 0x1F634: + return &ui_img_sleep; default: return NULL; } @@ -41,6 +44,9 @@ static void b_cfg_cb(lv_event_t *e) { } static void setup_next_state() { + assert(state_ready); + state_ready = false; + if (at_active) { lv_anim_timeline_delete(at_active); at_active = NULL; @@ -59,6 +65,13 @@ static void setup_next_state() { at_active = lv_anim_timeline_create(); } +bool val_ui_state_ready() { + return state_ready; +} + +static void anim_state_ready_cb(lv_anim_t *anim) { + state_ready = true; +} static void anim_x_cb(void *var, int32_t v) { lv_obj_set_x(var, v); } @@ -75,6 +88,7 @@ static void anim_val_time_text(lv_anim_t *anim) { void val_ui_none() { setup_next_state(); + // Widgets lv_obj_t *l_main = lv_label_create(o_active); lv_obj_add_style(l_main, &s_hero, 0); lv_obj_center(l_main); @@ -105,14 +119,6 @@ void val_ui_none() { lv_anim_set_path_cb(&a_hello_in, lv_anim_path_ease_in); lv_anim_set_duration(&a_hello_in, 500); - lv_anim_t a_sub; - lv_anim_init(&a_sub); - lv_anim_set_var(&a_sub, l_subtitle); - lv_anim_set_values(&a_sub, 0, 255); - lv_anim_set_exec_cb(&a_sub, anim_opa_cb); - lv_anim_set_path_cb(&a_sub, lv_anim_path_linear); - lv_anim_set_duration(&a_sub, 750); - lv_anim_t a_hello_out; lv_anim_init(&a_hello_out); lv_anim_set_var(&a_hello_out, l_main); @@ -131,6 +137,15 @@ void val_ui_none() { lv_anim_set_path_cb(&a_val, lv_anim_path_linear); lv_anim_set_duration(&a_val, 500); + lv_anim_t a_sub; + lv_anim_init(&a_sub); + lv_anim_set_var(&a_sub, l_subtitle); + lv_anim_set_values(&a_sub, 0, 255); + lv_anim_set_exec_cb(&a_sub, anim_opa_cb); + lv_anim_set_path_cb(&a_sub, lv_anim_path_linear); + lv_anim_set_completed_cb(&a_sub, anim_state_ready_cb); + lv_anim_set_duration(&a_sub, 750); + lv_anim_timeline_add(at_active, 0, &a_hello_in); lv_anim_timeline_add(at_active, 3000, &a_hello_out); lv_anim_timeline_add(at_active, 3250, &a_val); @@ -138,6 +153,87 @@ void val_ui_none() { lv_anim_timeline_start(at_active); } +void val_ui_menu(bool was_idle) { + setup_next_state(); + + // Widgets + lv_obj_t *l_main = lv_label_create(o_active); + lv_obj_add_style(l_main, &s_hero, 0); + lv_obj_center(l_main); + lv_label_set_text_static(l_main, "LET'S GO"); + + lv_obj_t *l_subtitle = lv_label_create(o_active); + lv_obj_add_style(l_subtitle, &s_subtitle, 0); + lv_obj_center(l_subtitle); + lv_label_set_text_static(l_subtitle, was_idle ? "WELCOME BACK!" : "GET QUEUEING!"); + + lv_obj_update_layout(o_active); + + // Animations + lv_anim_t a_title; + lv_anim_init(&a_title); + lv_anim_set_var(&a_title, l_main); + lv_anim_set_values( + &a_title, + -(lv_obj_get_height(o_container) - lv_obj_get_height(l_main)) / 2, 0); + lv_anim_set_exec_cb(&a_title, anim_y_cb); + lv_anim_set_path_cb(&a_title, lv_anim_path_ease_in); + lv_anim_set_duration(&a_title, 500); + + lv_anim_t a_sub; + lv_anim_init(&a_sub); + lv_anim_set_var(&a_sub, l_subtitle); + lv_anim_set_values( + &a_sub, + (lv_obj_get_height(o_container) - lv_obj_get_height(l_main)) / 2, + (lv_obj_get_height(l_main) + lv_obj_get_height(l_subtitle)) / 2 + 5); + lv_anim_set_exec_cb(&a_sub, anim_y_cb); + lv_anim_set_path_cb(&a_sub, lv_anim_path_ease_in); + lv_anim_set_completed_cb(&a_sub, anim_state_ready_cb); + lv_anim_set_duration(&a_sub, 500); + + lv_anim_timeline_add(at_active, 0, &a_title); + lv_anim_timeline_add(at_active, 0, &a_sub); + lv_anim_timeline_start(at_active); +} + +void val_ui_idle() { + setup_next_state(); + + // Widgets + lv_obj_t *l_main = lv_label_create(o_active); + lv_obj_add_style(l_main, &s_hero, 0); + lv_obj_center(l_main); + lv_label_set_text_static(l_main, "\U0001F634"); + + lv_obj_t *l_subtitle = lv_label_create(o_active); + lv_obj_add_style(l_subtitle, &s_subtitle, 0); + lv_obj_center(l_subtitle); + lv_label_set_text_static(l_subtitle, "COME BACK SOON..."); + + lv_obj_update_layout(o_active); + lv_obj_set_y( + l_subtitle, + (lv_obj_get_height(l_main) + lv_obj_get_height(l_subtitle)) / 2 + 5); + + // Animations + lv_anim_t a_fade_in; + lv_anim_init(&a_fade_in); + lv_anim_set_values(&a_fade_in, 0, 255); + lv_anim_set_exec_cb(&a_fade_in, anim_opa_cb); + lv_anim_set_path_cb(&a_fade_in, lv_anim_path_ease_in); + lv_anim_set_duration(&a_fade_in, 1000); + + lv_anim_set_var(&a_fade_in, l_main); + lv_anim_timeline_add(at_active, 0, &a_fade_in); + + lv_anim_set_var(&a_fade_in, l_subtitle); + lv_anim_set_completed_cb(&a_fade_in, anim_state_ready_cb); + lv_anim_timeline_add(at_active, 0, &a_fade_in); + + lv_anim_timeline_start(at_active); +} + void val_lvgl_ui(lv_display_t *disp) { color_primary = lv_color_hex(0xff4655); color_secondary = lv_color_hex(0xf7518f); @@ -184,5 +280,7 @@ void val_lvgl_ui(lv_display_t *disp) { lv_label_set_text(l_cfg, LV_SYMBOL_SETTINGS); lv_obj_center(l_cfg); - val_ui_none(); + // val_ui_none(); + // val_ui_menu(true); + val_ui_idle(); } diff --git a/firmware/main/ui.h b/firmware/main/ui.h index 9d21da3..aa95ba8 100644 --- a/firmware/main/ui.h +++ b/firmware/main/ui.h @@ -8,5 +8,12 @@ LV_FONT_DECLARE(lv_font_tungsten_180) LV_IMAGE_DECLARE(ui_img_bg); LV_IMAGE_DECLARE(ui_img_moon); LV_IMAGE_DECLARE(ui_img_star); +LV_IMAGE_DECLARE(ui_img_sleep); + +bool val_ui_state_ready(); + +void val_ui_none(); +void val_ui_menu(bool was_idle); +void val_ui_idle(); void val_lvgl_ui(lv_display_t *disp);