From ddf361f0935cb3cc0705546a8080326a63ee2b0f Mon Sep 17 00:00:00 2001 From: clabeuhtegrite <82087430+clabeuhtegrite@users.noreply.github.com> Date: Mon, 8 Jun 2026 21:09:04 +0200 Subject: [PATCH 1/3] feat(ui): boot/loading splash instead of a frozen dashboard at startup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On power-up the dashboard was built immediately but sat empty and motionless for ~20-30 s (Wi-Fi join + boot-time OTA check + first Bambuddy fetch), which read as a frozen/hung UI. Add a full-screen boot splash — the Bamboard wordmark, a spinner, and a status line that walks the boot phases — built visible and dismissed by the UI manager the moment printer data arrives (or after BOOT_SPLASH_MAX_MS = 25 s, so an unreachable Bambuddy can't pin it). - overlays.cpp: build_boot_overlay + boot_overlay_set_status / hide / is_visible. - ui.cpp: built LAST in begin() (top z-order, starts visible); refresh() hides it once n>0 || timeout. - main.cpp: per-phase status (BOOT_WIFI default -> BOOT_UPDATE before the OTA check -> BOOT_CONNECT before tasks), pumping LVGL so the spinner animates through the Wi-Fi-connect wait. - i18n: BOOT_WIFI / BOOT_UPDATE / BOOT_CONNECT in all five languages. - sim: render the splash to boot.png (preview + visual-regression coverage). Existing fixtures are unaffected (the sim injects printers, so refresh() hides the splash before each screen renders). Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 12 +++++ firmware/src/config.h | 5 +++ firmware/src/main.cpp | 7 +++ firmware/src/ui/i18n.cpp | 4 ++ firmware/src/ui/i18n.h | 2 + firmware/src/ui/screens.h | 10 +++++ firmware/src/ui/screens/overlays.cpp | 66 ++++++++++++++++++++++++++++ firmware/src/ui/ui.cpp | 12 +++++ sim/main.cpp | 7 +++ 9 files changed, 125 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c14acc..2e4b260 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,18 @@ All notable, behaviour-affecting changes land here. Format follows uses lightweight semantic-ish versioning (bumped on any user-visible change, not on every commit). +## v0.29.9 — 2026-06 + +### Added + +- **Boot / "loading" splash.** On power-up the device now shows a "Bamboard" + splash — a spinner over a status line that walks the boot phases (Connecting + to Wi-Fi… → Checking for updates… → Connecting to Bambuddy…) — instead of a + frozen, data-less dashboard during the ~20-30 s it takes to join Wi-Fi, run + the boot-time OTA check and pull the first data. It dismisses itself the + moment printer data arrives, or after a 25 s grace period so an unreachable + Bambuddy can't pin it. All five UI languages. + ## v0.29.8 — 2026-06 ### Fixed diff --git a/firmware/src/config.h b/firmware/src/config.h index d1178f2..ce106e0 100644 --- a/firmware/src/config.h +++ b/firmware/src/config.h @@ -87,6 +87,11 @@ constexpr uint32_t DIM_AFTER_MS = 60UL * 1000UL; // Ambient idle clock: floats over the current screen once the panel has been // untouched this long AND the whole farm is quiet (nothing printing/faulted). constexpr uint32_t AMBIENT_AFTER_MS = 45UL * 1000UL; + +// Boot "loading" splash: the longest it stays up before giving way to the +// (possibly offline) dashboard, so an unreachable Bambuddy can't pin it forever. +// Covers the worst case: Wi-Fi connect (~15 s) + boot-time OTA check (~8 s). +constexpr uint32_t BOOT_SPLASH_MAX_MS = 25UL * 1000UL; constexpr uint8_t BL_FULL = 255; constexpr uint8_t BL_DIM = 40; diff --git a/firmware/src/main.cpp b/firmware/src/main.cpp index 03d0313..a97bb67 100644 --- a/firmware/src/main.cpp +++ b/firmware/src/main.cpp @@ -967,6 +967,8 @@ void setup() { // current / GitHub down all fall through quickly so the device still // boots. Dev-sentinel builds skip it so a USB-flashed work-in-progress // isn't immediately pulled back to the published release. + ui::screens::boot_overlay_set_status(::i18n::tr(::i18n::Str::BOOT_UPDATE)); + lv_timer_handler(); #if BAMBOARD_OTA_AUTOCHECK if (!BAMBOARD_VERSION_IS_DEV) { run_boot_update(); @@ -978,6 +980,11 @@ void setup() { bambuddy::g_client.begin(g_cfg_bambuddy_url, g_cfg_api_key, g_cfg_cf_id, g_cfg_cf_secret); + // Final boot phase: the net task (started just below) reaches Bambuddy. Show + // it on the splash; the UI manager dismisses the splash once data lands. + ui::screens::boot_overlay_set_status(::i18n::tr(::i18n::Str::BOOT_CONNECT)); + lv_timer_handler(); + // Arm the task watchdog (10 s, panic+reboot on timeout) before the UI task // subscribes itself. Best-effort: if the Arduino runtime already initialised // the TWDT this is a no-op and the existing timeout stands — the UI loop diff --git a/firmware/src/ui/i18n.cpp b/firmware/src/ui/i18n.cpp index fcfdf8e..ef98b7e 100644 --- a/firmware/src/ui/i18n.cpp +++ b/firmware/src/ui/i18n.cpp @@ -109,6 +109,10 @@ static const char* const T[][(int)Lang::COUNT] = { /*CONFIRM_REMOVE*/{"Tap again to remove (3 s)", "Toca otra vez para quitar (3 s)", "Touchez encore pour retirer (3 s)", "Toque novamente p/ remover (3 s)", "Nochmal zum Entfernen (3 s)"}, /*AMBIENT_ALL_IDLE*/ {"All idle", "Todo inactivo", "Tout au repos", "Tudo parado", "Alles im Leerlauf"}, /*AMBIENT_NEXT*/ {"Next", "Siguiente", "Suivant", "Próximo", "Nächste"}, + // -- boot splash -- + /*BOOT_WIFI*/ {"Connecting to Wi-Fi...", "Conectando al Wi-Fi...", "Connexion au Wi-Fi...", "A ligar ao Wi-Fi...", "Verbinde mit WLAN..."}, + /*BOOT_UPDATE*/ {"Checking for updates...", "Buscando actualizaciones...", "Recherche de mises à jour...", "A procurar atualizações...", "Suche nach Updates..."}, + /*BOOT_CONNECT*/ {"Connecting to Bambuddy...", "Conectando a Bambuddy...", "Connexion à Bambuddy...", "A ligar ao Bambuddy...", "Verbinde mit Bambuddy..."}, }; static_assert(sizeof(T) / sizeof(T[0]) == (size_t)Str::_COUNT, diff --git a/firmware/src/ui/i18n.h b/firmware/src/ui/i18n.h index d3529c8..784c0d8 100644 --- a/firmware/src/ui/i18n.h +++ b/firmware/src/ui/i18n.h @@ -56,6 +56,8 @@ enum class Str : uint16_t { QUEUE_EMPTY, QUEUE_POS, QUEUE_REMOVED, QUEUE_REMOVE_FAILED, CONFIRM_REMOVE, // ambient idle clock AMBIENT_ALL_IDLE, AMBIENT_NEXT, + // boot splash status + BOOT_WIFI, BOOT_UPDATE, BOOT_CONNECT, _COUNT }; diff --git a/firmware/src/ui/screens.h b/firmware/src/ui/screens.h index b80926d..f090995 100644 --- a/firmware/src/ui/screens.h +++ b/firmware/src/ui/screens.h @@ -77,6 +77,16 @@ void ota_set_error (const char* msg); void ota_apply (); bool ota_is_active (); +// Full-screen boot / "loading" splash — the Bamboard wordmark, a spinner and a +// status line. Built visible at startup and dismissed by the UI manager once +// the device has printer data (or after BOOT_SPLASH_MAX_MS), so the user sees a +// clear "starting up" screen instead of a frozen, dataless dashboard. +// boot_overlay_set_status() is UI/setup-task only (called during boot phases). +lv_obj_t* build_boot_overlay(lv_obj_t* parent); +void boot_overlay_set_status(const char* msg); +void boot_overlay_hide(); +bool boot_overlay_is_visible(); + // Full-screen camera snapshot overlay. Opened by tapping the dashboard // progress ring; while it's open the net task fetches + decodes JPEG frames // (camera_decode_frame, called ON the net task), camera_apply() (UI task) diff --git a/firmware/src/ui/screens/overlays.cpp b/firmware/src/ui/screens/overlays.cpp index a164fc8..a2802e7 100644 --- a/firmware/src/ui/screens/overlays.cpp +++ b/firmware/src/ui/screens/overlays.cpp @@ -850,4 +850,70 @@ void temp_graph_close() { } bool temp_graph_is_open() { return s_tg_open; } +// --------------------------------------------------------------------------- +// Boot / "loading" splash +// --------------------------------------------------------------------------- +// +// Full-screen overlay shown from power-on while Wi-Fi connects, the boot-time +// OTA check runs and the first Bambuddy data arrives — so the user sees an +// obvious "starting up" screen (brand wordmark + spinner + a per-phase status +// line) instead of a frozen, data-less dashboard. Built LAST in +// ui::Manager::begin() so it z-orders above everything and — unlike the other +// overlays — starts VISIBLE. ui::Manager::refresh() calls boot_overlay_hide() +// once a printer snapshot lands (or BOOT_SPLASH_MAX_MS elapses). + +static lv_obj_t* s_boot_overlay = nullptr; +static lv_obj_t* s_boot_status = nullptr; + +lv_obj_t* build_boot_overlay(lv_obj_t* parent) { + ensure_styles(); + s_boot_overlay = lv_obj_create(parent); + lv_obj_remove_style_all(s_boot_overlay); + lv_obj_set_size(s_boot_overlay, LV_HOR_RES, LV_VER_RES); + lv_obj_align(s_boot_overlay, LV_ALIGN_TOP_LEFT, 0, 0); + lv_obj_set_style_bg_color(s_boot_overlay, lv_color_hex(::ui::C_BG), 0); + lv_obj_set_style_bg_opa(s_boot_overlay, LV_OPA_COVER, 0); + lv_obj_clear_flag(s_boot_overlay, LV_OBJ_FLAG_SCROLLABLE); + + // Brand wordmark — "board" recoloured in accent, same as the header. + lv_obj_t* mark = lv_label_create(s_boot_overlay); + lv_label_set_recolor(mark, true); + lv_label_set_text(mark, "Bam#00B7C3 board#"); + lv_obj_set_style_text_font(mark, &bb_font_36, 0); + lv_obj_set_style_text_color(mark, lv_color_hex(::ui::C_TEXT), 0); + lv_obj_align(mark, LV_ALIGN_CENTER, 0, -44); + + // Spinner — advances whenever lv_timer_handler() runs (the Wi-Fi-connect + // wait and once the UI task is up; it pauses during the single blocking + // OTA-check call, which the status line covers). + lv_obj_t* spin = lv_spinner_create(s_boot_overlay, 1000, 60); + lv_obj_set_size(spin, 46, 46); + lv_obj_align(spin, LV_ALIGN_CENTER, 0, 16); + lv_obj_set_style_arc_color(spin, lv_color_hex(::ui::C_PANEL_HI), LV_PART_MAIN); + lv_obj_set_style_arc_width(spin, 5, LV_PART_MAIN); + lv_obj_set_style_arc_color(spin, lv_color_hex(::ui::C_ACCENT), LV_PART_INDICATOR); + lv_obj_set_style_arc_width(spin, 5, LV_PART_INDICATOR); + + s_boot_status = lv_label_create(s_boot_overlay); + lv_label_set_text(s_boot_status, i18n::tr(i18n::Str::BOOT_WIFI)); + lv_obj_set_style_text_font(s_boot_status, &bb_font_14, 0); + lv_obj_set_style_text_color(s_boot_status, lv_color_hex(::ui::C_TEXT_DIM), 0); + lv_obj_align(s_boot_status, LV_ALIGN_CENTER, 0, 70); + + // Starts visible (no HIDDEN flag) — it's the power-on state. + return s_boot_overlay; +} + +void boot_overlay_set_status(const char* msg) { + if (s_boot_status && msg) lv_label_set_text(s_boot_status, msg); +} + +void boot_overlay_hide() { + if (s_boot_overlay) lv_obj_add_flag(s_boot_overlay, LV_OBJ_FLAG_HIDDEN); +} + +bool boot_overlay_is_visible() { + return s_boot_overlay && !lv_obj_has_flag(s_boot_overlay, LV_OBJ_FLAG_HIDDEN); +} + } // namespace ui::screens diff --git a/firmware/src/ui/ui.cpp b/firmware/src/ui/ui.cpp index af69847..b000a98 100644 --- a/firmware/src/ui/ui.cpp +++ b/firmware/src/ui/ui.cpp @@ -83,6 +83,10 @@ void Manager::begin() { // Live temperature graph — likewise a hidden overlay floated on demand. screens::build_temp_graph_overlay(s_root); + // Boot / "loading" splash — built LAST so it covers every screen + overlay, + // and (uniquely) starts VISIBLE. refresh() dismisses it once data lands. + screens::build_boot_overlay(s_root); + // Show the initial screen directly. We can't use go_to() here: current_ // already starts at Dashboard, so go_to(Dashboard) would early-return on // its `s == current_` guard and leave the screen hidden (the loop above @@ -137,6 +141,14 @@ void Manager::refresh() { selected_printer_id_ = ps[0].id; } + // Dismiss the boot/loading splash once we have printer data (or after a + // grace period, so an unreachable Bambuddy can't pin it) — revealing the + // dashboard underneath instead of a frozen, data-less screen. + if (screens::boot_overlay_is_visible() && + (n > 0 || millis() > ::display::BOOT_SPLASH_MAX_MS)) { + screens::boot_overlay_hide(); + } + // Fire a one-shot toast when any printer leaves a printing state for // Finish (✓) or Failed/Error. Skipped on the first sight of a printer // (no known previous state) so an already-finished job doesn't toast at boot. diff --git a/sim/main.cpp b/sim/main.cpp index 5aa9cc5..0be3e0a 100644 --- a/sim/main.cpp +++ b/sim/main.cpp @@ -89,6 +89,13 @@ static void render_fixtures(const std::string& out) { auto& C = bambuddy::g_client; JsonDocument d; + // Boot / "loading" splash — rendered before any data is injected, so the + // overlay (built visible in ui::Manager::begin) is still up. Draw it with + // lv_timer_handler() directly, NOT pump(): pump() calls ui.refresh(), whose + // hide logic would dismiss the splash the moment it sees no printers. + lv_timer_handler(); lv_timer_handler(); + dump_png(out, "boot"); + // A small farm: #1 (focused) mid-print with a chained AMS — first unit // drying; #2 also printing; #3 idle. demo_status(1, From 4303c5de3fa376060d42fa76fcdec80910ea909d Mon Sep 17 00:00:00 2001 From: clabeuhtegrite <82087430+clabeuhtegrite@users.noreply.github.com> Date: Mon, 8 Jun 2026 21:15:50 +0200 Subject: [PATCH 2/3] fix(sim): enable LV_USE_SPINNER in the sim lv_conf for the boot splash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The boot splash (overlays.cpp build_boot_overlay) uses lv_spinner, which the firmware lv_conf already enables but the sim's trimmed lv_conf had off — the sim build failed with 'lv_spinner_create was not declared'. Enable it (LV_USE_ARC, its dependency, is already on). Co-Authored-By: Claude Opus 4.8 --- sim/lv_conf.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sim/lv_conf.h b/sim/lv_conf.h index 469332d..09fa1c8 100644 --- a/sim/lv_conf.h +++ b/sim/lv_conf.h @@ -66,7 +66,9 @@ #define LV_USE_MSGBOX 0 #define LV_USE_SPAN 0 #define LV_USE_SPINBOX 0 -#define LV_USE_SPINNER 0 +/* SPINNER on: the boot/loading splash (overlays.cpp build_boot_overlay) uses + lv_spinner; the firmware lv_conf enables it too. Depends on LV_USE_ARC (above). */ +#define LV_USE_SPINNER 1 #define LV_USE_TABVIEW 0 #define LV_USE_TILEVIEW 0 #define LV_USE_WIN 0 From 002f56cabd1dc23bff42a3fa5d5bde30fdedbbc1 Mon Sep 17 00:00:00 2001 From: clabeuhtegrite <82087430+clabeuhtegrite@users.noreply.github.com> Date: Mon, 8 Jun 2026 21:21:16 +0200 Subject: [PATCH 3/3] test(visual): seed boot splash baselines (boot.png, all 5 languages) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit the deterministic sim render of the new boot/loading splash as a visual baseline (English + de/es/fr/pt, the latter differing only in the status line). The spinner is rendered without advancing lv_tick, so it sits at a fixed angle — byte-reproducible like the other fixtures. Co-Authored-By: Claude Opus 4.8 --- tests/fixtures_baseline/boot.png | Bin 0 -> 392045 bytes tests/fixtures_baseline/i18n/de/boot.png | Bin 0 -> 392045 bytes tests/fixtures_baseline/i18n/es/boot.png | Bin 0 -> 392045 bytes tests/fixtures_baseline/i18n/fr/boot.png | Bin 0 -> 392045 bytes tests/fixtures_baseline/i18n/pt/boot.png | Bin 0 -> 392045 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/fixtures_baseline/boot.png create mode 100644 tests/fixtures_baseline/i18n/de/boot.png create mode 100644 tests/fixtures_baseline/i18n/es/boot.png create mode 100644 tests/fixtures_baseline/i18n/fr/boot.png create mode 100644 tests/fixtures_baseline/i18n/pt/boot.png diff --git a/tests/fixtures_baseline/boot.png b/tests/fixtures_baseline/boot.png new file mode 100644 index 0000000000000000000000000000000000000000..40160504d2546983b8337160845f59a489dabd25 GIT binary patch literal 392045 zcmeI5Kd2p7e#gfl0kg313I!g)g&!zj!4@mnVhx61;U$s4OC*va217uoSVW4&1Y*<~ zVMq{LgvFI`VQ{k`ck9koz-5|1nm{(4A&1?Uo|DV17M>_J|%^&|)^Cy4! z$=&zf{hNP!t+~9^vDeSectHRH5P(2H0tlM*2?7v+Ku`h*I_Sg%T+Hbb1R$_50R)Yp zApijg1SNo=gHFuC3pLF_00IFCAZP>)0SG`KC;DK?j|ffQva@f&c^-CV-$3Gz1_3fuIBsbkK=ec%h~_ z2tXhp0R)YpApijg1SNo=gHBAq#hfld00IjWK+p&p0uX>ePyz@#=)^3%P}3X)AP|rM zf=18~fB*!75ePyz@#=)?qE z%;^#YAh0k21dX5}009UDC4iuVPRzm!HO)Z)0s#piXao%b2tXhx0R$a%VgfGabO{0w zSeO8UM$iy|00e>(K+r)aX5odJ<{$upfCLaUf`$MDAP|%Qf(|+{0T*++1OW&vOaMV6 zXb3<60znBN=%5p`@Ip;<5P(2H0tgyGuZuu)dD%4U>N35Bz$^k-dKSKb>n>e_00gQb zfS?gH1Rwx`pac+f(21!g1YjT#fWTw|2pT~{00IyQN&rCzotVi>E(IX~focdKXao%b z2tXhx0R$a%VyX!N7zhL)Fqr^?M$iy|00e>(K+r)aX7Z9tK?p#g8UhF!K|=rn5C}>D zK?j|fYC-@80s#n2CV-$3Gz1_3fuIBsbkK>JyyQ|40uZQ%0D?x)5P$##f)YT`K_{k~ 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 E|J=)C_y7O^ literal 0 HcmV?d00001 diff --git a/tests/fixtures_baseline/i18n/de/boot.png b/tests/fixtures_baseline/i18n/de/boot.png new file mode 100644 index 0000000000000000000000000000000000000000..40029a24ef10b1c52f74d98db6df70b402660f58 GIT binary patch literal 392045 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 g5J*bky_L-7`2YX_ literal 0 HcmV?d00001 diff --git a/tests/fixtures_baseline/i18n/es/boot.png b/tests/fixtures_baseline/i18n/es/boot.png new file mode 100644 index 0000000000000000000000000000000000000000..5e5859024f5202765ec3e4baaf62cf7c6614eff3 GIT binary patch literal 392045 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 K<=wyi`2PVwcsN`D literal 0 HcmV?d00001 diff --git a/tests/fixtures_baseline/i18n/pt/boot.png b/tests/fixtures_baseline/i18n/pt/boot.png new file mode 100644 index 0000000000000000000000000000000000000000..ab39cc8af8910c75c3228cdfd3a60f0e8e0f90e2 GIT binary patch literal 392045 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 literal 0 HcmV?d00001