From d088487cb9ac09e9a27bc93adcad0859db545d91 Mon Sep 17 00:00:00 2001
From: schneider <schneider@blinkenlichts.net>
Date: Fri, 4 Aug 2023 02:24:22 +0200
Subject: [PATCH] recovery: show progress bar

---
 recovery/main/rec_gui.c  | 18 ++++++++++++++++++
 recovery/main/rec_gui.h  |  3 ++-
 recovery/main/rec_main.c |  6 ++++++
 3 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/recovery/main/rec_gui.c b/recovery/main/rec_gui.c
index 92306a7865..361bda6c5c 100644
--- a/recovery/main/rec_gui.c
+++ b/recovery/main/rec_gui.c
@@ -42,6 +42,24 @@ void rec_erasing_draw(void) {
     st3m_gfx_drawctx_pipe_put(target);
 }
 
+void rec_flashing_draw(int percent) {
+    st3m_ctx_desc_t *target = st3m_gfx_drawctx_free_get(portMAX_DELAY);
+    _header_draw(target);
+
+    ctx_move_to(target->ctx, 0, 0);
+    ctx_font_size(target->ctx, 20.0);
+    ctx_gray(target->ctx, 0.8);
+
+    char buf[128];
+    snprintf(buf, sizeof(buf), "Flashing... %2d%%", percent);
+    ctx_text(target->ctx, buf);
+
+    ctx_rectangle(target->ctx, -120, 20, 240 * percent / 100, 20);
+    ctx_fill(target->ctx);
+
+    st3m_gfx_drawctx_pipe_put(target);
+}
+
 void rec_menu_draw(menu_t *menu) {
     st3m_ctx_desc_t *target = st3m_gfx_drawctx_free_get(portMAX_DELAY);
     _header_draw(target);
diff --git a/recovery/main/rec_gui.h b/recovery/main/rec_gui.h
index ba7753ced5..30bec4a4af 100644
--- a/recovery/main/rec_gui.h
+++ b/recovery/main/rec_gui.h
@@ -17,5 +17,6 @@ typedef struct {
 } menu_t;
 
 void rec_erasing_draw(void);
+void rec_flashing_draw(int percent);
 void rec_menu_draw(menu_t *menu);
-void rec_menu_process(menu_t *menu);
\ No newline at end of file
+void rec_menu_process(menu_t *menu);
diff --git a/recovery/main/rec_main.c b/recovery/main/rec_main.c
index 58393b0b8b..12d85b98f6 100644
--- a/recovery/main/rec_main.c
+++ b/recovery/main/rec_main.c
@@ -127,6 +127,11 @@ static void _list_select(void) {
         rec_fatal("Could not open file :(");
     }
 
+    fseek(f, 0, SEEK_END);
+    size_t size = ftell(f);
+    fseek(f, 0, SEEK_SET);
+
+    rec_flashing_draw(0);
     do {
         n = fread(buf, 1, sizeof(buf), f);
         if (n > 0) {
@@ -134,6 +139,7 @@ static void _list_select(void) {
             esp_partition_write(p, offset, buf, n);
             offset += n;
             ESP_LOGI(TAG, "wrote %u bytes", offset);
+            rec_flashing_draw(offset * 100 / size);
         }
     } while (n == sizeof(buf));
 
-- 
GitLab