From e1c24d0552fdb60287661c5ce6e856186706f6b9 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 5 Jul 2026 19:14:26 +0200 Subject: [PATCH] fix py --- scripts/__pycache__/dryer_tui.cpython-314.pyc | Bin 30570 -> 31777 bytes scripts/dryer_tui.py | 32 ++++++++++++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/scripts/__pycache__/dryer_tui.cpython-314.pyc b/scripts/__pycache__/dryer_tui.cpython-314.pyc index b5d30563e70c8e2069b11450f13c34bd2caf0cd6..9718c4b1fc22e43e94583760d95ecbd836a7b4d4 100644 GIT binary patch delta 7326 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 diff --git a/scripts/dryer_tui.py b/scripts/dryer_tui.py index c00b702..18eab24 100644 --- a/scripts/dryer_tui.py +++ b/scripts/dryer_tui.py @@ -51,6 +51,21 @@ STATUS_RE = re.compile( SENSOR_RE = re.compile(r"ch(\d+):([\d.]+)C/(\d+)%|ch(\d+):ERR") +AUTOTUNE_MODE_RE = re.compile( + r"autotune/(?P\w+) (?P\d+)s (?P\d+/\d+)cyc pre>=(?P
\d+)C"
+)
+
+
+def format_mode_line(mode: str) -> str:
+    match = AUTOTUNE_MODE_RE.match(mode)
+    if match:
+        d = match.groupdict()
+        return (
+            f"Autotune {d['phase']}: {d['elapsed']}s elapsed, "
+            f"{d['cycles']} cycles, preheat avg >= {d['pre']} C"
+        )
+    return f"Mode: {mode}"
+
 
 @dataclass
 class DryerState:
@@ -320,8 +335,8 @@ def _preset_menu(stdscr, worker: SerialWorker) -> None:
 def _draw_dashboard(stdscr, state: DryerState) -> None:
     stdscr.erase()
     height, width = stdscr.getmaxyx()
-    if height < 18 or width < 60:
-        _safe_addstr(stdscr, 0, 0, "Terminal too small (need 60x18).")
+    if height < 19 or width < 60:
+        _safe_addstr(stdscr, 0, 0, "Terminal too small (need 60x19).")
         stdscr.refresh()
         return
 
@@ -329,13 +344,16 @@ def _draw_dashboard(stdscr, state: DryerState) -> None:
     _safe_addstr(stdscr, 0, 1, title, curses.A_BOLD)
 
     row = 2
-    _safe_addstr(stdscr, row, 2, f"Target:   {state.target:>8} °C", curses.A_BOLD)
-    _safe_addstr(stdscr, row, 28, f"Mode: {state.mode}")
+    _safe_addstr(stdscr, row, 2, f"Target: {state.target:>6} C  Limit: {state.cutoff} C", curses.A_BOLD)
     cutoff_attr = curses.A_BOLD | curses.color_pair(1) if state.cutoff_active == "YES" else 0
-    _safe_addstr(stdscr, row, 48, f"Cutoff: {state.cutoff_active}", cutoff_attr)
+    _safe_addstr(stdscr, row, 36, f"Trip: {state.cutoff_active}", cutoff_attr)
 
     row += 1
-    _safe_addstr(stdscr, row, 2, f"Avg: {state.avg} °C   Min: {state.min_temp} °C   Max: {state.max_temp} °C   Spread: {state.spread} °C")
+    mode_text = format_mode_line(state.mode)
+    _safe_addstr(stdscr, row, 2, f"{mode_text[: max(0, width - 18)]}  FS: {state.failsafe}")
+
+    row += 1
+    _safe_addstr(stdscr, row, 2, f"Avg: {state.avg} C   Min: {state.min_temp} C   Max: {state.max_temp} C   Spread: {state.spread} C")
 
     row += 1
     fan_text = state.fan if state.fan_note == "" else state.fan
@@ -347,7 +365,7 @@ def _draw_dashboard(stdscr, state: DryerState) -> None:
     )
 
     row += 1
-    _safe_addstr(stdscr, row, 2, f"Heat stop: {state.htop} °C   Block: {state.hblk}")
+    _safe_addstr(stdscr, row, 2, f"Heat stop: {state.htop} C   Block: {state.hblk}")
 
     row += 2
     _draw_box(stdscr, row, 1, 5, width - 2, "Sensors")