Fill overview gauges to each printer's actual progress.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Joshua King
2026-10-20 21:00:03 -04:00
co-authored by Cursor
parent 12f8ba2def
commit 994cfb6b60
6 changed files with 28 additions and 23 deletions
+5 -4
View File
@@ -17,10 +17,11 @@ Home Assistant must be running and its printer integrations must have current pr
The configured swipe order is: The configured swipe order is:
1. Print Status Overview — one steam gauge per printer. Each ring uses the 1. Print Status Overview — one steam gauge per printer. The filled part of
color of that printer's active filament. Black filament keeps a grey ring each ring is that printer's print progress, drawn in the active filament
behind the gauge so it stays visible on the black page. The center shows the percent color. Black filament keeps a grey ring behind the gauge so it stays visible
complete in white, with the printer name and estimated finish time underneath. on the black page. The center shows the percent complete in white, with the
printer name and estimated finish time underneath.
The local time is in the top-right corner. Tap a gauge to open that printer. The local time is in the top-right corner. Tap a gauge to open that printer.
2. PrintsCharming — P1S, Office, both four-slot AMS units. 2. PrintsCharming — P1S, Office, both four-slot AMS units.
3. Polly-Pocket — A1 mini, Office, external spool. 3. Polly-Pocket — A1 mini, Office, external spool.
+4 -3
View File
@@ -379,10 +379,11 @@ inline void render_overview(const Snapshot &data, const OverviewWidgets &widgets
const uint32_t filament = data.active_filament_color(); const uint32_t filament = data.active_filament_color();
const float shown = live && std::isfinite(data.progress) const float shown = live && std::isfinite(data.progress)
? std::clamp(data.progress, 0.0f, 100.0f) : NAN; ? std::clamp(data.progress, 0.0f, 100.0f) : NAN;
lv_obj_set_style_arc_color(widgets.arc, lv_color_hex(filament), LV_PART_MAIN); const bool black = filament_is_black(filament);
lv_obj_set_style_arc_color(widgets.arc, lv_color_hex(black ? RING_BACKING : TRACK), LV_PART_MAIN);
lv_obj_set_style_arc_color(widgets.arc, lv_color_hex(filament), LV_PART_INDICATOR); lv_obj_set_style_arc_color(widgets.arc, lv_color_hex(filament), LV_PART_INDICATOR);
lv_arc_set_value(widgets.arc, 100); lv_arc_set_value(widgets.arc, live ? gauge_value(data.progress, 100) : 0);
if (filament_is_black(filament)) { if (black) {
lv_obj_set_style_arc_color(widgets.backing, lv_color_hex(RING_BACKING), LV_PART_MAIN); lv_obj_set_style_arc_color(widgets.backing, lv_color_hex(RING_BACKING), LV_PART_MAIN);
lv_obj_set_style_arc_color(widgets.backing, lv_color_hex(RING_BACKING), LV_PART_INDICATOR); lv_obj_set_style_arc_color(widgets.backing, lv_color_hex(RING_BACKING), LV_PART_INDICATOR);
lv_obj_clear_flag(widgets.backing, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(widgets.backing, LV_OBJ_FLAG_HIDDEN);
+2 -2
View File
@@ -283,8 +283,8 @@ def overview_gauge(printer, x, y, arc):
'adjustable': False, 'hidden': True, 'gesture_bubble': True, 'clickable': True, 'adjustable': False, 'hidden': True, 'gesture_bubble': True, 'clickable': True,
'on_click': open_page}}, 'on_click': open_page}},
{'arc': {'id': f'{pid}_overview_arc', 'x': inner_x, 'y': y, {'arc': {'id': f'{pid}_overview_arc', 'x': inner_x, 'y': y,
'width': arc, 'height': arc, 'min_value': 0, 'max_value': 100, 'value': 100, 'width': arc, 'height': arc, 'min_value': 0, 'max_value': 100, 'value': 0,
'start_angle': 135, 'end_angle': 45, 'arc_width': inner, 'arc_color': GREEN, 'start_angle': 135, 'end_angle': 45, 'arc_width': inner, 'arc_color': TRACK,
'indicator': {'arc_color': GREEN, 'arc_width': inner}, 'adjustable': False, 'indicator': {'arc_color': GREEN, 'arc_width': inner}, 'adjustable': False,
'gesture_bubble': True, 'clickable': True, 'on_click': open_page}}, 'gesture_bubble': True, 'clickable': True, 'on_click': open_page}},
label('--', inner_x, number_y, arc, value_font, id=f'{pid}_overview_value', label('--', inner_x, number_y, arc, value_font, id=f'{pid}_overview_value',
+14 -14
View File
@@ -1871,11 +1871,11 @@ lvgl:
height: 145 height: 145
min_value: 0 min_value: 0
max_value: 100 max_value: 100
value: 100 value: 0
start_angle: 135 start_angle: 135
end_angle: 45 end_angle: 45
arc_width: 12 arc_width: 12
arc_color: 65280 arc_color: 1647403
indicator: indicator:
arc_color: 65280 arc_color: 65280
arc_width: 12 arc_width: 12
@@ -1973,11 +1973,11 @@ lvgl:
height: 145 height: 145
min_value: 0 min_value: 0
max_value: 100 max_value: 100
value: 100 value: 0
start_angle: 135 start_angle: 135
end_angle: 45 end_angle: 45
arc_width: 12 arc_width: 12
arc_color: 65280 arc_color: 1647403
indicator: indicator:
arc_color: 65280 arc_color: 65280
arc_width: 12 arc_width: 12
@@ -2075,11 +2075,11 @@ lvgl:
height: 145 height: 145
min_value: 0 min_value: 0
max_value: 100 max_value: 100
value: 100 value: 0
start_angle: 135 start_angle: 135
end_angle: 45 end_angle: 45
arc_width: 12 arc_width: 12
arc_color: 65280 arc_color: 1647403
indicator: indicator:
arc_color: 65280 arc_color: 65280
arc_width: 12 arc_width: 12
@@ -2177,11 +2177,11 @@ lvgl:
height: 145 height: 145
min_value: 0 min_value: 0
max_value: 100 max_value: 100
value: 100 value: 0
start_angle: 135 start_angle: 135
end_angle: 45 end_angle: 45
arc_width: 12 arc_width: 12
arc_color: 65280 arc_color: 1647403
indicator: indicator:
arc_color: 65280 arc_color: 65280
arc_width: 12 arc_width: 12
@@ -2279,11 +2279,11 @@ lvgl:
height: 145 height: 145
min_value: 0 min_value: 0
max_value: 100 max_value: 100
value: 100 value: 0
start_angle: 135 start_angle: 135
end_angle: 45 end_angle: 45
arc_width: 12 arc_width: 12
arc_color: 65280 arc_color: 1647403
indicator: indicator:
arc_color: 65280 arc_color: 65280
arc_width: 12 arc_width: 12
@@ -2381,11 +2381,11 @@ lvgl:
height: 145 height: 145
min_value: 0 min_value: 0
max_value: 100 max_value: 100
value: 100 value: 0
start_angle: 135 start_angle: 135
end_angle: 45 end_angle: 45
arc_width: 12 arc_width: 12
arc_color: 65280 arc_color: 1647403
indicator: indicator:
arc_color: 65280 arc_color: 65280
arc_width: 12 arc_width: 12
@@ -2483,11 +2483,11 @@ lvgl:
height: 145 height: 145
min_value: 0 min_value: 0
max_value: 100 max_value: 100
value: 100 value: 0
start_angle: 135 start_angle: 135
end_angle: 45 end_angle: 45
arc_width: 12 arc_width: 12
arc_color: 65280 arc_color: 1647403
indicator: indicator:
arc_color: 65280 arc_color: 65280
arc_width: 12 arc_width: 12
+1
View File
@@ -98,6 +98,7 @@ inline void setup() {
pid = printer['id'] pid = printer['id']
steps.append({'lambda': Lambda( steps.append({'lambda': Lambda(
f'if (std::string(lv_label_get_text(id({pid}_overview_value))) != "67" || ' f'if (std::string(lv_label_get_text(id({pid}_overview_value))) != "67" || '
f'lv_arc_get_value(id({pid}_overview_arc)) != 67 || '
f'std::string(lv_label_get_text(id({pid}_overview_percent))) != "%" || ' f'std::string(lv_label_get_text(id({pid}_overview_percent))) != "%" || '
f'std::string(lv_label_get_text(id({pid}_overview_finish))) == "--") ' f'std::string(lv_label_get_text(id({pid}_overview_finish))) == "--") '
f'{{ ESP_LOGE("preview", "Fleet gauge render failed: {pid}"); exit(7); }}')}) f'{{ ESP_LOGE("preview", "Fleet gauge render failed: {pid}"); exit(7); }}')})
+2
View File
@@ -172,6 +172,8 @@ class FleetTests(unittest.TestCase):
self.assertEqual(arc['on_click'], [{'lvgl.page.show': printer['id'] + '_page'}]) self.assertEqual(arc['on_click'], [{'lvgl.page.show': printer['id'] + '_page'}])
self.assertGreaterEqual(arc['width'], 120) self.assertGreaterEqual(arc['width'], 120)
self.assertLessEqual(arc['width'], 154) self.assertLessEqual(arc['width'], 154)
self.assertEqual(arc['value'], 0)
self.assertEqual(arc['arc_color'], 0x19232B)
self.assertEqual(arc['start_angle'], 135) self.assertEqual(arc['start_angle'], 135)
self.assertLessEqual(arc['x'] + arc['width'], 800) self.assertLessEqual(arc['x'] + arc['width'], 800)
self.assertLessEqual(arc['y'] + arc['height'], 480) self.assertLessEqual(arc['y'] + arc['height'], 480)