From 87e94f456348e944ba4487aed436c762dd718966 Mon Sep 17 00:00:00 2001 From: Andrew <18502096+classicrocker883@users.noreply.github.com> Date: Mon, 1 Apr 2024 16:05:11 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=B8=20Update=20ProUI=20Plot=20graph=20?= =?UTF-8?q?-=20part=202=20(#26563)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 2 +- Marlin/src/MarlinCore.cpp | 6 +- Marlin/src/feature/bedlevel/ubl/ubl.h | 2 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 33 +- Marlin/src/feature/host_actions.cpp | 4 +- Marlin/src/feature/pause.cpp | 10 +- Marlin/src/feature/powerloss.cpp | 4 +- Marlin/src/feature/powerloss.h | 4 +- Marlin/src/feature/runout.cpp | 3 - Marlin/src/feature/tmc_util.h | 44 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 12 +- Marlin/src/gcode/bedlevel/mbl/G29.cpp | 5 - Marlin/src/gcode/bedlevel/ubl/M421.cpp | 3 - Marlin/src/gcode/calibrate/G28.cpp | 6 +- Marlin/src/gcode/config/M302.cpp | 18 +- Marlin/src/gcode/control/M997.cpp | 6 +- Marlin/src/gcode/feature/powerloss/M1000.cpp | 10 +- Marlin/src/gcode/lcd/M0_M1.cpp | 17 +- Marlin/src/gcode/lcd/M73.cpp | 4 - Marlin/src/gcode/probe/G30.cpp | 12 +- Marlin/src/gcode/sd/M524.cpp | 8 +- Marlin/src/gcode/stats/M75-M78.cpp | 8 +- Marlin/src/gcode/temp/M303.cpp | 7 +- Marlin/src/inc/Conditionals_LCD.h | 9 +- Marlin/src/inc/Conditionals_adv.h | 16 +- Marlin/src/inc/Conditionals_post.h | 7 +- Marlin/src/lcd/dogm/marlinui_DOGM.h | 2 +- .../dogm/{ => u8g}/HAL_LCD_class_defines.h | 2 +- .../lcd/dogm/{ => u8g}/HAL_LCD_com_defines.h | 2 +- .../u8g_dev_ssd1306_sh1106_128x64_I2C.cpp | 2 +- .../dogm/{ => u8g}/u8g_dev_ssd1309_12864.cpp | 2 +- .../{ => u8g}/u8g_dev_st7565_64128n_HAL.cpp | 2 +- .../{ => u8g}/u8g_dev_st7920_128x64_HAL.cpp | 2 +- .../u8g_dev_tft_upscale_from_128x64.cpp | 14 +- .../u8g_dev_uc1701_mini12864_HAL.cpp | 2 +- .../ultralcd_st7920_u8glib_rrd_AVR.cpp | 6 +- .../ultralcd_st7920_u8glib_rrd_AVR.h | 4 +- Marlin/src/lcd/e3v2/common/dwin_api.cpp | 32 +- Marlin/src/lcd/e3v2/common/dwin_api.h | 20 +- Marlin/src/lcd/e3v2/common/dwin_set.h | 6 +- Marlin/src/lcd/e3v2/creality/dwin.cpp | 6 +- Marlin/src/lcd/e3v2/proui/dwin.cpp | 546 ++++++++++-------- Marlin/src/lcd/e3v2/proui/dwin.h | 107 ++-- Marlin/src/lcd/e3v2/proui/dwin_defines.h | 11 +- Marlin/src/lcd/e3v2/proui/dwin_lcd.cpp | 36 +- Marlin/src/lcd/e3v2/proui/dwinui.cpp | 2 +- Marlin/src/lcd/e3v2/proui/dwinui.h | 76 ++- Marlin/src/lcd/e3v2/proui/proui_extui.cpp | 246 ++++++++ .../extui/anycubic_chiron/chiron_extui.cpp | 48 +- .../extui/anycubic_i3mega/anycubic_extui.cpp | 48 +- .../lcd/extui/anycubic_vyper/vyper_extui.cpp | 51 +- Marlin/src/lcd/extui/dgus/dgus_extui.cpp | 64 +- .../extui/dgus_e3s1pro/DGUSScreenHandler.cpp | 2 +- .../extui/dgus_e3s1pro/DGUSScreenHandler.h | 2 +- .../extui/dgus_e3s1pro/dgus_e3s1pro_extui.cpp | 49 +- .../lcd/extui/dgus_reloaded/DGUSRxHandler.cpp | 2 +- .../extui/dgus_reloaded/DGUSScreenHandler.cpp | 3 +- .../extui/dgus_reloaded/DGUSScreenHandler.h | 2 +- .../dgus_reloaded/dgus_reloaded_extui.cpp | 48 +- Marlin/src/lcd/extui/example/example.cpp | 49 +- .../ftdi_eve_touch_ui/ftdi_eve_extui.cpp | 57 +- .../extui/ia_creality/ia_creality_extui.cpp | 45 +- .../lcd/extui/ia_creality/ia_creality_rts.cpp | 19 +- Marlin/src/lcd/extui/malyan/malyan_extui.cpp | 44 +- .../src/lcd/extui/nextion/nextion_extui.cpp | 49 +- Marlin/src/lcd/extui/ui_api.cpp | 66 ++- Marlin/src/lcd/extui/ui_api.h | 53 +- Marlin/src/lcd/language/language_en.h | 12 +- Marlin/src/lcd/language/language_fr.h | 3 +- Marlin/src/lcd/language/language_fr_na.h | 3 +- Marlin/src/lcd/language/language_it.h | 2 +- Marlin/src/lcd/language/language_tr.h | 2 +- Marlin/src/lcd/marlinui.cpp | 37 +- Marlin/src/lcd/marlinui.h | 6 +- Marlin/src/module/motion.h | 14 +- Marlin/src/module/probe.cpp | 9 +- Marlin/src/module/settings.cpp | 68 ++- Marlin/src/module/stepper.cpp | 13 +- Marlin/src/module/stepper.h | 6 + Marlin/src/module/temperature.cpp | 53 +- buildroot/share/dwin/bin/DWIN_ICO.py | 224 +++---- buildroot/share/dwin/bin/README.md | 85 ++- .../share/dwin/icons-4/016-ICON_Bedline.jpg | Bin 0 -> 748 bytes .../dwin/icons-4/017-ICON_BedLeveledOff.jpg | Bin 0 -> 2707 bytes .../dwin/icons-4/018-ICON_BedLeveledOn.jpg | Bin 0 -> 3931 bytes .../dwin/icons-7/009-ICON_HotendTemp.jpg | Bin 1671 -> 1119 bytes .../share/dwin/icons-7/010-ICON_BedTemp.jpg | Bin 1655 -> 1082 bytes .../share/dwin/icons-7/011-ICON_Speed.jpg | Bin 1706 -> 1610 bytes .../share/dwin/icons-7/012-ICON_Zoffset.jpg | Bin 1654 -> 1202 bytes .../share/dwin/icons-7/019-ICON_Pause_0.jpg | Bin 3592 -> 4340 bytes .../share/dwin/icons-7/020-ICON_Pause_1.jpg | Bin 3583 -> 4414 bytes .../share/dwin/icons-7/030-ICON_SetHome.jpg | Bin 1881 -> 1861 bytes .../share/dwin/icons-7/034-ICON_Language.jpg | Bin 1960 -> 1657 bytes .../share/dwin/icons-7/035-ICON_MoveX.jpg | Bin 1871 -> 1473 bytes .../share/dwin/icons-7/036-ICON_MoveY.jpg | Bin 1874 -> 1429 bytes .../share/dwin/icons-7/037-ICON_MoveZ.jpg | Bin 1820 -> 1327 bytes .../share/dwin/icons-7/038-ICON_Extruder.jpg | Bin 1692 -> 1422 bytes .../dwin/icons-7/040-ICON_Temperature.jpg | Bin 1821 -> 1244 bytes .../share/dwin/icons-7/041-ICON_Motion.jpg | Bin 1906 -> 1508 bytes .../share/dwin/icons-7/045-ICON_Info.jpg | Bin 1679 -> 1113 bytes .../dwin/icons-7/046-ICON_SetEndTemp.jpg | Bin 1808 -> 1100 bytes .../dwin/icons-7/047-ICON_SetBedTemp.jpg | Bin 1712 -> 1655 bytes .../share/dwin/icons-7/051-ICON_MaxSpeed.jpg | Bin 1718 -> 1489 bytes .../dwin/icons-7/052-ICON_MaxAccelerated.jpg | Bin 1768 -> 1510 bytes .../share/dwin/icons-7/053-ICON_MaxJerk.jpg | Bin 1756 -> 1501 bytes .../share/dwin/icons-7/054-ICON_Step.jpg | Bin 1816 -> 1549 bytes .../icons-7/058-ICON_StockConfiguraton.jpg | Bin 1624 -> 1050 bytes .../share/dwin/icons-7/059-ICON_MaxSpeedX.jpg | Bin 1896 -> 1479 bytes .../share/dwin/icons-7/060-ICON_MaxSpeedY.jpg | Bin 1891 -> 1465 bytes .../share/dwin/icons-7/061-ICON_MaxSpeedZ.jpg | Bin 1901 -> 1471 bytes .../share/dwin/icons-7/062-ICON_MaxSpeedE.jpg | Bin 1888 -> 1461 bytes .../share/dwin/icons-7/063-ICON_MaxAccX.jpg | Bin 1929 -> 1504 bytes .../share/dwin/icons-7/064-ICON_MaxAccY.jpg | Bin 1924 -> 1496 bytes .../share/dwin/icons-7/065-ICON_MaxAccZ.jpg | Bin 1934 -> 1506 bytes .../share/dwin/icons-7/066-ICON_MaxAccE.jpg | Bin 1933 -> 1494 bytes .../dwin/icons-7/067-ICON_MaxSpeedJerkX.jpg | Bin 1936 -> 1511 bytes .../dwin/icons-7/068-ICON_MaxSpeedJerkY.jpg | Bin 1938 -> 1500 bytes .../dwin/icons-7/069-ICON_MaxSpeedJerkZ.jpg | Bin 1943 -> 1507 bytes .../dwin/icons-7/070-ICON_MaxSpeedJerkE.jpg | Bin 1934 -> 1498 bytes .../share/dwin/icons-7/071-ICON_StepX.jpg | Bin 1976 -> 1555 bytes .../share/dwin/icons-7/072-ICON_StepY.jpg | Bin 1979 -> 1548 bytes .../share/dwin/icons-7/073-ICON_StepZ.jpg | Bin 1984 -> 1550 bytes .../share/dwin/icons-7/074-ICON_StepE.jpg | Bin 1979 -> 1545 bytes .../share/dwin/icons-7/075-ICON_Setspeed.jpg | Bin 1748 -> 1598 bytes .../dwin/icons-7/076-ICON_SetZOffset.jpg | Bin 1881 -> 1460 bytes .../share/dwin/icons-7/078-ICON_BLTouch.jpg | Bin 2016 -> 3702 bytes .../dwin/icons-7/079-ICON_TempTooLow.jpg | Bin 2058 -> 3596 bytes .../dwin/icons-7/081-ICON_TempTooHigh.jpg | Bin 2137 -> 3901 bytes .../share/dwin/icons-7/092-ICON_DegreesC.jpg | Bin 0 -> 1345 bytes .../share/dwin/icons-7/093-ICON_Printer_0.jpg | Bin 0 -> 9153 bytes .../dwin/icons-7/200-ICON_Checkbox_F.jpg | Bin 0 -> 1263 bytes .../dwin/icons-7/201-ICON_Checkbox_T.jpg | Bin 0 -> 1279 bytes .../share/dwin/icons-7/202-ICON_Fade.jpg | Bin 0 -> 1360 bytes .../share/dwin/icons-7/203-ICON_Mesh.jpg | Bin 0 -> 1373 bytes .../share/dwin/icons-7/204-ICON_Tilt.jpg | Bin 0 -> 1215 bytes .../dwin/icons-7/205-ICON_Brightness.jpg | Bin 0 -> 1922 bytes .../share/dwin/icons-7/206-ICON_Probe.jpg | Bin 0 -> 1898 bytes .../share/dwin/icons-7/249-ICON_AxisD.jpg | Bin 0 -> 4752 bytes .../share/dwin/icons-7/250-ICON_AxisBR.jpg | Bin 0 -> 1500 bytes .../share/dwin/icons-7/251-ICON_AxisTR.jpg | Bin 0 -> 1454 bytes .../share/dwin/icons-7/252-ICON_AxisBL.jpg | Bin 0 -> 1550 bytes .../share/dwin/icons-7/253-ICON_AxisTL.jpg | Bin 0 -> 1536 bytes .../share/dwin/icons-7/254-ICON_AxisC.jpg | Bin 0 -> 1483 bytes 143 files changed, 1785 insertions(+), 841 deletions(-) rename Marlin/src/lcd/dogm/{ => u8g}/HAL_LCD_class_defines.h (99%) rename Marlin/src/lcd/dogm/{ => u8g}/HAL_LCD_com_defines.h (97%) rename Marlin/src/lcd/dogm/{ => u8g}/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp (99%) rename Marlin/src/lcd/dogm/{ => u8g}/u8g_dev_ssd1309_12864.cpp (99%) rename Marlin/src/lcd/dogm/{ => u8g}/u8g_dev_st7565_64128n_HAL.cpp (99%) rename Marlin/src/lcd/dogm/{ => u8g}/u8g_dev_st7920_128x64_HAL.cpp (99%) rename Marlin/src/lcd/dogm/{ => u8g}/u8g_dev_tft_upscale_from_128x64.cpp (98%) rename Marlin/src/lcd/dogm/{ => u8g}/u8g_dev_uc1701_mini12864_HAL.cpp (99%) rename Marlin/src/lcd/dogm/{ => u8g}/ultralcd_st7920_u8glib_rrd_AVR.cpp (98%) rename Marlin/src/lcd/dogm/{ => u8g}/ultralcd_st7920_u8glib_rrd_AVR.h (96%) create mode 100644 Marlin/src/lcd/e3v2/proui/proui_extui.cpp create mode 100644 buildroot/share/dwin/icons-4/016-ICON_Bedline.jpg create mode 100644 buildroot/share/dwin/icons-4/017-ICON_BedLeveledOff.jpg create mode 100644 buildroot/share/dwin/icons-4/018-ICON_BedLeveledOn.jpg create mode 100644 buildroot/share/dwin/icons-7/092-ICON_DegreesC.jpg create mode 100644 buildroot/share/dwin/icons-7/093-ICON_Printer_0.jpg create mode 100644 buildroot/share/dwin/icons-7/200-ICON_Checkbox_F.jpg create mode 100644 buildroot/share/dwin/icons-7/201-ICON_Checkbox_T.jpg create mode 100644 buildroot/share/dwin/icons-7/202-ICON_Fade.jpg create mode 100644 buildroot/share/dwin/icons-7/203-ICON_Mesh.jpg create mode 100644 buildroot/share/dwin/icons-7/204-ICON_Tilt.jpg create mode 100644 buildroot/share/dwin/icons-7/205-ICON_Brightness.jpg create mode 100644 buildroot/share/dwin/icons-7/206-ICON_Probe.jpg create mode 100644 buildroot/share/dwin/icons-7/249-ICON_AxisD.jpg create mode 100644 buildroot/share/dwin/icons-7/250-ICON_AxisBR.jpg create mode 100644 buildroot/share/dwin/icons-7/251-ICON_AxisTR.jpg create mode 100644 buildroot/share/dwin/icons-7/252-ICON_AxisBL.jpg create mode 100644 buildroot/share/dwin/icons-7/253-ICON_AxisTL.jpg create mode 100644 buildroot/share/dwin/icons-7/254-ICON_AxisC.jpg diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index a12eef2556..13c59b0a44 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3558,7 +3558,7 @@ * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and * to set spindle speed, spindle direction, and laser power. * - * SuperPid is a router/spindle speed controller used in the CNC milling community. + * SuperPID is a router/spindle speed controller used in the CNC milling community. * Marlin can be used to turn the spindle on and off. It can also be used to set * the spindle speed from 5,000 to 30,000 RPM. * diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 8a2561f02d..272e50340a 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -77,8 +77,6 @@ #include "lcd/e3v2/common/encoder.h" #if ENABLED(DWIN_CREALITY_LCD) #include "lcd/e3v2/creality/dwin.h" - #elif ENABLED(DWIN_LCD_PROUI) - #include "lcd/e3v2/proui/dwin.h" #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) #include "lcd/e3v2/jyersui/dwin.h" #endif @@ -1594,11 +1592,11 @@ void setup() { SERIAL_ECHO_TERNARY(err, "BL24CXX Check ", "failed", "succeeded", "!\n"); #endif - #if HAS_DWIN_E3V2_BASIC + #if ENABLED(DWIN_CREALITY_LCD) SETUP_RUN(dwinInitScreen()); #endif - #if HAS_SERVICE_INTERVALS && !HAS_DWIN_E3V2_BASIC + #if HAS_SERVICE_INTERVALS && DISABLED(DWIN_CREALITY_LCD) SETUP_RUN(ui.reset_status(true)); // Show service messages or keep current status #endif diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 7377f7dfc0..b08cb812f8 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -95,7 +95,7 @@ public: static void report_current_mesh(); static void report_state(); static void save_ubl_active_state_and_disable(); - static void restore_ubl_active_state_and_leave(); + static void restore_ubl_active_state(const bool is_done=true); static void display_map(const uint8_t) __O0; static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const xy_pos_t&, const bool=false, MeshFlags *done_flags=nullptr) __O0; static mesh_index_pair find_furthest_invalid_mesh_point() __O0; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 2e7ea74327..fcf408b34e 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -309,7 +309,7 @@ void unified_bed_leveling::G29() { #if ALL(DWIN_LCD_PROUI, ZHOME_BEFORE_LEVELING) save_ubl_active_state_and_disable(); gcode.process_subcommands_now(F("G28Z")); - restore_ubl_active_state_and_leave(); + restore_ubl_active_state(false); // ...without telling ExtUI "done" #else // Send 'N' to force homing before G29 (internal only) if (axes_should_home() || parser.seen_test('N')) gcode.home_all_axes(); @@ -425,7 +425,7 @@ void unified_bed_leveling::G29() { if (parser.seen_test('J')) { save_ubl_active_state_and_disable(); tilt_mesh_based_on_probed_grid(param.J_grid_size == 0); // Zero size does 3-Point - restore_ubl_active_state_and_leave(); + restore_ubl_active_state(); #if ENABLED(UBL_G29_J_RECENTER) do_blocking_move_to_xy(0.5f * ((MESH_MIN_X) + (MESH_MAX_X)), 0.5f * ((MESH_MIN_Y) + (MESH_MAX_Y))); #endif @@ -754,7 +754,6 @@ void unified_bed_leveling::shift_mesh_height() { TERN_(HAS_MARLINUI_MENU, ui.capture()); TERN_(EXTENSIBLE_UI, ExtUI::onLevelingStart()); - TERN_(DWIN_LCD_PROUI, dwinLevelingStart()); save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained grid_count_t count = GRID_MAX_POINTS; @@ -768,7 +767,6 @@ void unified_bed_leveling::shift_mesh_height() { SERIAL_ECHOLNPGM("Probing mesh point ", point_num, "/", GRID_MAX_POINTS, "."); TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_POINT), point_num, int(GRID_MAX_POINTS))); TERN_(HAS_BACKLIGHT_TIMEOUT, ui.refresh_backlight_timeout()); - TERN_(DWIN_LCD_PROUI, dwinRedrawScreen()); #if HAS_MARLINUI_MENU if (ui.button_pressed()) { @@ -778,8 +776,7 @@ void unified_bed_leveling::shift_mesh_height() { ui.quick_feedback(); ui.release(); probe.stow(); // Release UI before stow to allow for PAUSE_BEFORE_DEPLOY_STOW - TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone()); - return restore_ubl_active_state_and_leave(); + return restore_ubl_active_state(); } #endif @@ -815,15 +812,12 @@ void unified_bed_leveling::shift_mesh_height() { probe.move_z_after_probing(); - restore_ubl_active_state_and_leave(); - do_blocking_move_to_xy( constrain(nearby.x - probe.offset_xy.x, MESH_MIN_X, MESH_MAX_X), constrain(nearby.y - probe.offset_xy.y, MESH_MIN_Y, MESH_MAX_Y) ); - TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone()); - TERN_(DWIN_LCD_PROUI, dwinLevelingDone()); + restore_ubl_active_state(); } #endif // HAS_BED_PROBE @@ -932,7 +926,7 @@ void set_message_with_feedback(FSTR_P const fstr) { if (param.V_verbosity > 1) SERIAL_ECHOLNPGM("Business Card is ", p_float_t(thickness, 4), "mm thick."); - restore_ubl_active_state_and_leave(); + restore_ubl_active_state(); return thickness; } @@ -987,7 +981,7 @@ void set_message_with_feedback(FSTR_P const fstr) { if (_click_and_hold([]{ SERIAL_ECHOLNPGM("\nMesh only partially populated."); do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); - })) return restore_ubl_active_state_and_leave(); + })) return restore_ubl_active_state(); // Store the Z position minus the shim height z_values[lpos.x][lpos.y] = current_position.z - thick; @@ -1002,10 +996,8 @@ void set_message_with_feedback(FSTR_P const fstr) { if (do_ubl_mesh_map) display_map(param.T_map_type); // show user where we're probing - restore_ubl_active_state_and_leave(); + restore_ubl_active_state(); do_blocking_move_to_xy_z(pos, Z_CLEARANCE_DEPLOY_PROBE); - - TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone()); } /** @@ -1111,7 +1103,7 @@ void set_message_with_feedback(FSTR_P const fstr) { } while (lpos.x >= 0 && --param.R_repetition > 0); if (do_ubl_mesh_map) display_map(param.T_map_type); - restore_ubl_active_state_and_leave(); + restore_ubl_active_state(); do_blocking_move_to_xy_z(pos, Z_TWEEN_SAFE_CLEARANCE); @@ -1263,17 +1255,20 @@ void unified_bed_leveling::save_ubl_active_state_and_disable() { set_bed_leveling_enabled(false); } -void unified_bed_leveling::restore_ubl_active_state_and_leave() { +void unified_bed_leveling::restore_ubl_active_state(const bool is_done/*=true*/) { TERN_(HAS_MARLINUI_MENU, ui.release()); #if ENABLED(UBL_DEVEL_DEBUGGING) if (--ubl_state_recursion_chk) { - SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times."); + SERIAL_ECHOLNPGM("restore_ubl_active_state() called too many times."); set_message_with_feedback(GET_TEXT_F(MSG_UBL_RESTORE_ERROR)); return; } #endif set_bed_leveling_enabled(ubl_state_at_invocation); - TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone()); + + if (is_done) { + TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone()); + } } mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp index cc5face259..538aa92e91 100644 --- a/Marlin/src/feature/host_actions.cpp +++ b/Marlin/src/feature/host_actions.cpp @@ -186,13 +186,13 @@ void HostUI::action(FSTR_P const fstr, const bool eol) { switch (response) { case 0: // "Purge More" button - #if ALL(M600_PURGE_MORE_RESUMABLE, ADVANCED_PAUSE_FEATURE) + #if ENABLED(M600_PURGE_MORE_RESUMABLE) pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; // Simulate menu selection (menu exits, doesn't extrude more) #endif break; case 1: // "Continue" / "Disable Runout" button - #if ALL(M600_PURGE_MORE_RESUMABLE, ADVANCED_PAUSE_FEATURE) + #if ENABLED(M600_PURGE_MORE_RESUMABLE) pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; // Simulate menu selection #endif #if HAS_FILAMENT_SENSOR diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 8756c339e3..74a4f236c0 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -23,6 +23,8 @@ /** * feature/pause.cpp - Pause feature support functions * This may be combined with related G-codes if features are consolidated. + * + * Note: Calls to ui.pause_show_message are passed to either ExtUI or MarlinUI. */ #include "../inc/MarlinConfigPre.h" @@ -60,8 +62,6 @@ #if ENABLED(EXTENSIBLE_UI) #include "../lcd/extui/ui_api.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../lcd/e3v2/proui/dwin.h" #endif #include "../lcd/marlinui.h" @@ -148,7 +148,7 @@ static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=P thermalManager.setTargetHotend(thermalManager.extrude_min_temp, active_extruder); #endif - ui.pause_show_message(PAUSE_MESSAGE_HEATING, mode); UNUSED(mode); + ui.pause_show_message(PAUSE_MESSAGE_HEATING, mode); if (wait) return thermalManager.wait_for_hotend(active_extruder); @@ -288,8 +288,8 @@ bool load_filament(const_float_t slow_load_length/*=0*/, const_float_t fast_load // Show "Purge More" / "Resume" menu and wait for reply KEEPALIVE_STATE(PAUSED_FOR_USER); wait_for_user = false; - #if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI) - ui.pause_show_message(PAUSE_MESSAGE_OPTION); // Also sets PAUSE_RESPONSE_WAIT_FOR + #if ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI) + ui.pause_show_message(PAUSE_MESSAGE_OPTION); // MarlinUI and MKS UI also set PAUSE_RESPONSE_WAIT_FOR #else pause_menu_response = PAUSE_RESPONSE_WAIT_FOR; #endif diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 70fac66fce..1867aba6ed 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -48,8 +48,8 @@ uint8_t PrintJobRecovery::queue_index_r; uint32_t PrintJobRecovery::cmd_sdpos, // = 0 PrintJobRecovery::sdpos[BUFSIZE]; -#if HAS_DWIN_E3V2_BASIC - bool PrintJobRecovery::dwin_flag; // = false +#if HAS_PLR_UI_FLAG + bool PrintJobRecovery::ui_flag_resume; // = false #endif #include "../sd/cardreader.h" diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index 579731ffdd..7de8450c91 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -151,8 +151,8 @@ class PrintJobRecovery { static uint32_t cmd_sdpos, //!< SD position of the next command sdpos[BUFSIZE]; //!< SD positions of queued commands - #if HAS_DWIN_E3V2_BASIC - static bool dwin_flag; + #if HAS_PLR_UI_FLAG + static bool ui_flag_resume; //!< Flag the UI to show a dialog to Resume (M1000) or Cancel (M1000C) #endif static void init(); diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp index 1d684c6b85..2bcb47e99a 100644 --- a/Marlin/src/feature/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -68,8 +68,6 @@ bool FilamentMonitorBase::enabled = true, #if ENABLED(EXTENSIBLE_UI) #include "../lcd/extui/ui_api.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../lcd/e3v2/proui/dwin.h" #endif void event_filament_runout(const uint8_t extruder) { @@ -88,7 +86,6 @@ void event_filament_runout(const uint8_t extruder) { #endif TERN_(EXTENSIBLE_UI, ExtUI::onFilamentRunout(ExtUI::getTool(extruder))); - TERN_(DWIN_LCD_PROUI, dwinFilamentRunout(extruder)); #if ANY(HOST_PROMPT_SUPPORT, HOST_ACTION_COMMANDS, MULTI_FILAMENT_SENSOR) const char tool = '0' + TERN0(MULTI_FILAMENT_SENSOR, extruder); diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index a0a72058aa..7ed070c9b8 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -144,15 +144,13 @@ class TMCMarlin : public TMC, public TMCStorage { #endif #endif - #if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI) - void refresh_stepper_current() { rms_current(this->val_mA); } + void refresh_stepper_current() { rms_current(this->val_mA); } - #if ENABLED(HYBRID_THRESHOLD) - void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } - #endif - #if USE_SENSORLESS - void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } - #endif + #if ENABLED(HYBRID_THRESHOLD) + void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } + #endif + #if USE_SENSORLESS + void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } #endif static constexpr int8_t sgt_min = -64, @@ -207,12 +205,10 @@ class TMCMarlin : public TMC220 } #endif - #if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI) - void refresh_stepper_current() { rms_current(this->val_mA); } + void refresh_stepper_current() { rms_current(this->val_mA); } - #if ENABLED(HYBRID_THRESHOLD) - void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } - #endif + #if ENABLED(HYBRID_THRESHOLD) + void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } #endif }; @@ -269,15 +265,13 @@ class TMCMarlin : public TMC220 } #endif - #if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI) - void refresh_stepper_current() { rms_current(this->val_mA); } + void refresh_stepper_current() { rms_current(this->val_mA); } - #if ENABLED(HYBRID_THRESHOLD) - void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } - #endif - #if USE_SENSORLESS - void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } - #endif + #if ENABLED(HYBRID_THRESHOLD) + void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } + #endif + #if USE_SENSORLESS + void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } #endif static constexpr uint8_t sgt_min = 0, @@ -315,12 +309,10 @@ class TMCMarlin : public TMC266 } #endif - #if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI) - void refresh_stepper_current() { rms_current(this->val_mA); } + void refresh_stepper_current() { rms_current(this->val_mA); } - #if USE_SENSORLESS - void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } - #endif + #if USE_SENSORLESS + void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } #endif static constexpr int8_t sgt_min = -64, diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 3126bee47f..449c25fefd 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -51,8 +51,6 @@ #include "../../../lcd/extui/ui_api.h" #elif ENABLED(DWIN_CREALITY_LCD) #include "../../../lcd/e3v2/creality/dwin.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../../../lcd/e3v2/proui/dwin.h" #endif #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) @@ -77,7 +75,7 @@ static void pre_g29_return(const bool retry, const bool did) { TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE, false)); } if (did) { - TERN_(HAS_DWIN_E3V2_BASIC, dwinLevelingDone()); + TERN_(DWIN_CREALITY_LCD, dwinLevelingDone()); TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone()); } } @@ -425,8 +423,6 @@ G29_TYPE GcodeSuite::G29() { #if ENABLED(AUTO_BED_LEVELING_3POINT) if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> 3-point Leveling"); points[0].z = points[1].z = points[2].z = 0; // Probe at 3 arbitrary points - #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - TERN_(DWIN_LCD_PROUI, dwinLevelingStart()); #endif TERN_(EXTENSIBLE_UI, ExtUI::onLevelingStart()); @@ -436,11 +432,7 @@ G29_TYPE GcodeSuite::G29() { #if ENABLED(PREHEAT_BEFORE_LEVELING) if (!abl.dryrun) probe.preheat_for_probing(LEVELING_NOZZLE_TEMP, - #if ALL(DWIN_LCD_PROUI, HAS_HEATED_BED) - hmiData.bedLevT - #else - LEVELING_BED_TEMP - #endif + TERN(EXTENSIBLE_UI, ExtUI::getLevelingBedTemp(), LEVELING_BED_TEMP) ); #endif } diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index b3f03d03ba..c9c04b4f0c 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -40,8 +40,6 @@ #if ENABLED(EXTENSIBLE_UI) #include "../../../lcd/extui/ui_api.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../../../lcd/e3v2/proui/dwin.h" #endif #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) @@ -144,7 +142,6 @@ void GcodeSuite::G29() { queue.inject(F("G29S2")); TERN_(EXTENSIBLE_UI, ExtUI::onLevelingStart()); - TERN_(DWIN_LCD_PROUI, dwinLevelingStart()); return; } @@ -170,7 +167,6 @@ void GcodeSuite::G29() { // Save Z for the previous mesh position bedlevel.set_zigzag_z(mbl_probe_index - 1, current_position.z); TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ix, iy, current_position.z)); - TERN_(DWIN_LCD_PROUI, dwinMeshUpdate(_MIN(mbl_probe_index, GRID_MAX_POINTS), int(GRID_MAX_POINTS), current_position.z)); SET_SOFT_ENDSTOP_LOOSE(false); } // If there's another point to sample, move there with optional lift. @@ -237,7 +233,6 @@ void GcodeSuite::G29() { if (parser.seenval('Z')) { bedlevel.z_values[ix][iy] = parser.value_linear_units(); TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ix, iy, bedlevel.z_values[ix][iy])); - TERN_(DWIN_LCD_PROUI, dwinMeshUpdate(ix, iy, bedlevel.z_values[ix][iy])); } else return echo_not_entered('Z'); diff --git a/Marlin/src/gcode/bedlevel/ubl/M421.cpp b/Marlin/src/gcode/bedlevel/ubl/M421.cpp index 3a5aa8cb03..99ba3ce19b 100644 --- a/Marlin/src/gcode/bedlevel/ubl/M421.cpp +++ b/Marlin/src/gcode/bedlevel/ubl/M421.cpp @@ -33,8 +33,6 @@ #if ENABLED(EXTENSIBLE_UI) #include "../../../lcd/extui/ui_api.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../../../lcd/e3v2/proui/dwin.h" #endif /** @@ -69,7 +67,6 @@ void GcodeSuite::M421() { float &zval = bedlevel.z_values[ij.x][ij.y]; // Altering this Mesh Point zval = hasN ? NAN : parser.value_linear_units() + (hasQ ? zval : 0); // N=NAN, Z=NEWVAL, or Q=ADDVAL TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ij.x, ij.y, zval)); // Ping ExtUI in case it's showing the mesh - TERN_(DWIN_LCD_PROUI, dwinMeshUpdate(ij.x, ij.y, zval)); } } diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 55698c942b..0ab1ca6105 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -52,8 +52,6 @@ #include "../../lcd/extui/ui_api.h" #elif ENABLED(DWIN_CREALITY_LCD) #include "../../lcd/e3v2/creality/dwin.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../../lcd/e3v2/proui/dwin.h" #endif #if ENABLED(LASER_FEATURE) @@ -223,7 +221,7 @@ void GcodeSuite::G28() { set_and_report_grblstate(M_HOMING); #endif - TERN_(HAS_DWIN_E3V2_BASIC, dwinHomingStart()); + TERN_(DWIN_CREALITY_LCD, dwinHomingStart()); TERN_(EXTENSIBLE_UI, ExtUI::onHomingStart()); planner.synchronize(); // Wait for planner moves to finish! @@ -652,7 +650,7 @@ void GcodeSuite::G28() { ui.refresh(); - TERN_(HAS_DWIN_E3V2_BASIC, dwinHomingDone()); + TERN_(DWIN_CREALITY_LCD, dwinHomingDone()); TERN_(EXTENSIBLE_UI, ExtUI::onHomingDone()); report_current_position(); diff --git a/Marlin/src/gcode/config/M302.cpp b/Marlin/src/gcode/config/M302.cpp index 3373e14325..0648f3edca 100644 --- a/Marlin/src/gcode/config/M302.cpp +++ b/Marlin/src/gcode/config/M302.cpp @@ -25,12 +25,13 @@ #if ENABLED(PREVENT_COLD_EXTRUSION) #include "../gcode.h" -#include "../../module/temperature.h" -#if ENABLED(DWIN_LCD_PROUI) - #include "../../lcd/e3v2/proui/dwin.h" +#if ENABLED(EXTENSIBLE_UI) + #include "../../lcd/extui/ui_api.h" #endif +#include "../../module/temperature.h" + /** * M302: Allow cold extrudes, or set the minimum extrude temperature * @@ -50,13 +51,14 @@ void GcodeSuite::M302() { const bool seen_S = parser.seen('S'); if (seen_S) { thermalManager.extrude_min_temp = parser.value_celsius(); - thermalManager.allow_cold_extrude = (thermalManager.extrude_min_temp == 0); - TERN_(DWIN_LCD_PROUI, hmiData.extMinT = thermalManager.extrude_min_temp); + TERN_(EXTENSIBLE_UI, ExtUI::onSetMinExtrusionTemp(thermalManager.extrude_min_temp)); } - if (parser.seen('P')) - thermalManager.allow_cold_extrude = (thermalManager.extrude_min_temp == 0) || parser.value_bool(); - else if (!seen_S) { + const bool seen_P = parser.seen('P'); + if (seen_P || seen_S) { + thermalManager.allow_cold_extrude = (thermalManager.extrude_min_temp == 0) || (seen_P && parser.value_bool()); + } + else { // Report current state SERIAL_ECHO_START(); SERIAL_ECHOLN(F("Cold extrudes are "), thermalManager.allow_cold_extrude ? F("en") : F("dis"), F("abled (min temp "), thermalManager.extrude_min_temp, F("C)")); diff --git a/Marlin/src/gcode/control/M997.cpp b/Marlin/src/gcode/control/M997.cpp index 5ac0ba23bb..c651961902 100644 --- a/Marlin/src/gcode/control/M997.cpp +++ b/Marlin/src/gcode/control/M997.cpp @@ -24,8 +24,8 @@ #if ENABLED(PLATFORM_M997_SUPPORT) -#if ENABLED(DWIN_LCD_PROUI) - #include "../../lcd/e3v2/proui/dwin.h" +#if ENABLED(EXTENSIBLE_UI) + #include "../../lcd/extui/ui_api.h" #endif /** @@ -33,7 +33,7 @@ */ void GcodeSuite::M997() { - TERN_(DWIN_LCD_PROUI, dwinRebootScreen()); + TERN_(EXTENSIBLE_UI, ExtUI::onFirmwareFlash()); flashFirmware(parser.intval('S')); diff --git a/Marlin/src/gcode/feature/powerloss/M1000.cpp b/Marlin/src/gcode/feature/powerloss/M1000.cpp index c735b72ced..c70bf7667f 100644 --- a/Marlin/src/gcode/feature/powerloss/M1000.cpp +++ b/Marlin/src/gcode/feature/powerloss/M1000.cpp @@ -37,8 +37,6 @@ #include "../../../lcd/extui/ui_api.h" #elif ENABLED(DWIN_CREALITY_LCD) #include "../../../lcd/e3v2/creality/dwin.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../../../lcd/e3v2/proui/dwin.h" #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) #include "../../../lcd/e3v2/jyersui/dwin.h" // Temporary fix until it can be better implemented #endif @@ -76,12 +74,12 @@ void GcodeSuite::M1000() { if (!force_resume && parser.seen_test('S')) { #if HAS_MARLINUI_MENU ui.goto_screen(menu_job_recovery); - #elif HAS_DWIN_E3V2_BASIC - recovery.dwin_flag = true; - #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) // Temporary fix until it can be better implemented - jyersDWIN.popupHandler(Popup_Resume); #elif ENABLED(EXTENSIBLE_UI) ExtUI::onPowerLossResume(); + #elif HAS_PLR_UI_FLAG + recovery.ui_flag_resume = true; + #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) // Temporary fix until it can be better implemented + jyersDWIN.popupHandler(Popup_Resume); #else SERIAL_ECHO_MSG("Resume requires LCD."); #endif diff --git a/Marlin/src/gcode/lcd/M0_M1.cpp b/Marlin/src/gcode/lcd/M0_M1.cpp index fcab61b59d..c600bd5da6 100644 --- a/Marlin/src/gcode/lcd/M0_M1.cpp +++ b/Marlin/src/gcode/lcd/M0_M1.cpp @@ -35,9 +35,6 @@ #include "../../lcd/marlinui.h" #elif ENABLED(EXTENSIBLE_UI) #include "../../lcd/extui/ui_api.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../../lcd/e3v2/proui/dwin_popup.h" - #include "../../lcd/e3v2/proui/dwin.h" #endif #if ENABLED(HOST_PROMPT_SUPPORT) @@ -66,16 +63,20 @@ void GcodeSuite::M0_M1() { #endif } + #elif ENABLED(DWIN_LCD_PROUI) // ExtUI with icon, string, button title + + if (parser.string_arg) + ExtUI::onUserConfirmRequired(ICON_Continue_1, parser.string_arg, GET_TEXT_F(MSG_USERWAIT)); + else + ExtUI::onUserConfirmRequired(ICON_Stop_1, GET_TEXT_F(MSG_STOPPED), GET_TEXT_F(MSG_USERWAIT)); + #elif ENABLED(EXTENSIBLE_UI) + if (parser.string_arg) ExtUI::onUserConfirmRequired(parser.string_arg); // String in an SRAM buffer else ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_USERWAIT)); - #elif ENABLED(DWIN_LCD_PROUI) - if (parser.string_arg) - dwinPopupConfirm(ICON_BLTouch, parser.string_arg, GET_TEXT_F(MSG_USERWAIT)); - else - dwinPopupConfirm(ICON_BLTouch, GET_TEXT_F(MSG_STOPPED), GET_TEXT_F(MSG_USERWAIT)); + #else if (parser.string_arg) { diff --git a/Marlin/src/gcode/lcd/M73.cpp b/Marlin/src/gcode/lcd/M73.cpp index 5ac2839beb..6f74476240 100644 --- a/Marlin/src/gcode/lcd/M73.cpp +++ b/Marlin/src/gcode/lcd/M73.cpp @@ -29,10 +29,6 @@ #include "../../sd/cardreader.h" #include "../../libs/numtostr.h" -#if ENABLED(DWIN_LCD_PROUI) - #include "../../lcd/e3v2/proui/dwin.h" -#endif - /** * M73: Set percentage complete (for display on LCD) * diff --git a/Marlin/src/gcode/probe/G30.cpp b/Marlin/src/gcode/probe/G30.cpp index e83df544c8..3ce37bed05 100644 --- a/Marlin/src/gcode/probe/G30.cpp +++ b/Marlin/src/gcode/probe/G30.cpp @@ -34,6 +34,10 @@ #include "../../feature/probe_temp_comp.h" #endif +#if ANY(DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) + #define VERBOSE_SINGLE_PROBE +#endif + /** * G30: Do a single Z probe at the given XY (default: current) * @@ -66,9 +70,7 @@ void GcodeSuite::G30() { remember_feedrate_scaling_off(); - #if ANY(DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) - process_subcommands_now(F("G28O")); - #endif + TERN_(VERBOSE_SINGLE_PROBE, process_subcommands_now(F("G28O"))); const ProbePtRaise raise_after = parser.boolval('E', true) ? PROBE_PT_STOW : PROBE_PT_NONE; @@ -83,9 +85,7 @@ void GcodeSuite::G30() { F( " Z:"), p_float_t(measured_z, 3) ); msg.echoln(); - #if ANY(DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) - ui.set_status(msg); - #endif + TERN_(VERBOSE_SINGLE_PROBE, ui.set_status(msg)); } restore_feedrate_and_scaling(); diff --git a/Marlin/src/gcode/sd/M524.cpp b/Marlin/src/gcode/sd/M524.cpp index a3c03e90ba..61185b7e0b 100644 --- a/Marlin/src/gcode/sd/M524.cpp +++ b/Marlin/src/gcode/sd/M524.cpp @@ -27,8 +27,8 @@ #include "../gcode.h" #include "../../sd/cardreader.h" -#if ENABLED(DWIN_LCD_PROUI) - #include "../../lcd/marlinui.h" +#if ENABLED(EXTENSIBLE_UI) + #include "../../lcd/extui/ui_api.h" #endif /** @@ -36,9 +36,9 @@ */ void GcodeSuite::M524() { - #if ENABLED(DWIN_LCD_PROUI) + #if ENABLED(EXTENSIBLE_UI) - ui.abort_print(); + ExtUI::stopPrint(); // Calls ui.abort_print() which does the same as below #else diff --git a/Marlin/src/gcode/stats/M75-M78.cpp b/Marlin/src/gcode/stats/M75-M78.cpp index bced97351d..03e76d531d 100644 --- a/Marlin/src/gcode/stats/M75-M78.cpp +++ b/Marlin/src/gcode/stats/M75-M78.cpp @@ -35,10 +35,14 @@ /** * M75: Start print timer + * + * ProUI: If the print fails to start and any text is + * included in the command, print it in the header. */ void GcodeSuite::M75() { - startOrResumeJob(); + startOrResumeJob(); // ... ExtUI::onPrintTimerStarted() #if ENABLED(DWIN_LCD_PROUI) + // TODO: Remove if M75 is never used if (!IS_SD_PRINTING()) dwinPrintHeader(parser.string_arg && parser.string_arg[0] ? parser.string_arg : GET_TEXT(MSG_HOST_START_PRINT)); #endif } @@ -47,7 +51,7 @@ void GcodeSuite::M75() { * M76: Pause print timer */ void GcodeSuite::M76() { - TERN(DWIN_LCD_PROUI, ui.pause_print(), print_job_timer.pause()); + print_job_timer.pause(); // ... ExtUI::onPrintTimerPaused() TERN_(HOST_PAUSE_M76, hostui.pause()); } diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index 24702d65f0..730ec65ba4 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -31,8 +31,6 @@ #if ENABLED(EXTENSIBLE_UI) #include "../../lcd/extui/ui_api.h" -#elif ENABLED(PROUI_PID_TUNE) - #include "../../lcd/e3v2/proui/dwin.h" #endif /** @@ -68,8 +66,7 @@ void GcodeSuite::M303() { default: SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_BAD_HEATER_ID); - TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_BAD_HEATER_ID)); - TERN_(PROUI_PID_TUNE, dwinPidTuning(PID_BAD_HEATER_ID)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::pidresult_t::PID_BAD_HEATER_ID)); return; } @@ -79,7 +76,7 @@ void GcodeSuite::M303() { const celsius_t temp = seenS ? parser.value_celsius() : default_temp; const bool u = parser.boolval('U'); - TERN_(PROUI_PID_TUNE, dwinStartM303(seenC, c, seenS, hid, temp)); + TERN_(EXTENSIBLE_UI, ExtUI::onStartM303(c, hid, temp)); IF_DISABLED(BUSY_WHILE_HEATING, KEEPALIVE_STATE(NOT_BUSY)); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index af2ea772c3..92799b7cd4 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -1035,16 +1035,13 @@ #endif // Extensible UI serial touch screens. (See src/lcd/extui) -#if ANY(HAS_DGUS_LCD, MALYAN_LCD, ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON, NEXTION_TFT, TOUCH_UI_FTDI_EVE) +#if ANY(HAS_DGUS_LCD, MALYAN_LCD, ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON, NEXTION_TFT, TOUCH_UI_FTDI_EVE, DWIN_LCD_PROUI) #define IS_EXTUI 1 // Just for sanity check. #define EXTENSIBLE_UI #endif // Aliases for LCD features -#if ANY(DWIN_CREALITY_LCD, DWIN_LCD_PROUI) - #define HAS_DWIN_E3V2_BASIC 1 -#endif -#if ANY(HAS_DWIN_E3V2_BASIC, DWIN_CREALITY_LCD_JYERSUI) +#if ANY(DWIN_CREALITY_LCD, DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) #define HAS_DWIN_E3V2 1 #endif @@ -1058,6 +1055,7 @@ #if ENABLED(DWIN_LCD_PROUI) #define DO_LIST_BIN_FILES 1 #define LCD_BRIGHTNESS_DEFAULT 127 + #define STATUS_DO_CLEAR_EMPTY #endif // Serial Controllers require LCD_SERIAL_PORT @@ -1092,6 +1090,7 @@ * - draw_kill_screen * - kill_screen * - draw_status_message + * (calling advance_status_scroll, status_and_len for a scrolling status message) */ #define HAS_DISPLAY 1 #endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 4f74fa0067..5f983c60f3 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -323,6 +323,13 @@ #define HAS_LINEAR_E_JERK 1 #endif +// Some displays can toggle Adaptive Step Smoothing. +// The state is saved to EEPROM. +// In future this may be added to a G-code such as M205 A. +#if ALL(ADAPTIVE_STEP_SMOOTHING, DWIN_LCD_PROUI) + #define ADAPTIVE_STEP_SMOOTHING_TOGGLE +#endif + /** * Temperature Sensors; define what sensor(s) we have. */ @@ -1381,6 +1388,11 @@ #endif // Power-Loss Recovery -#if ENABLED(POWER_LOSS_RECOVERY) && defined(PLR_BED_THRESHOLD) - #define HAS_PLR_BED_THRESHOLD 1 +#if ENABLED(POWER_LOSS_RECOVERY) + #ifdef PLR_BED_THRESHOLD + #define HAS_PLR_BED_THRESHOLD 1 + #endif + #if ANY(DWIN_CREALITY_LCD, DWIN_LCD_PROUI) + #define HAS_PLR_UI_FLAG 1 // recovery.ui_flag_resume + #endif #endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 2683312976..64c95fa6c4 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2487,9 +2487,6 @@ // PID heating #if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER) #define HAS_PID_HEATING 1 - #if ENABLED(DWIN_LCD_PROUI) && ANY(PIDTEMP, PIDTEMPBED) - #define PROUI_PID_TUNE 1 - #endif #endif // Thermal protection @@ -3047,8 +3044,8 @@ * Advanced Pause - Filament Change */ #if ENABLED(ADVANCED_PAUSE_FEATURE) - #if ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI, DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) || ALL(EMERGENCY_PARSER, HOST_PROMPT_SUPPORT) - #define M600_PURGE_MORE_RESUMABLE 1 + #if ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI, DWIN_CREALITY_LCD_JYERSUI) || ALL(EMERGENCY_PARSER, HOST_PROMPT_SUPPORT) + #define M600_PURGE_MORE_RESUMABLE 1 // UI provides some way to Purge More / Resume #endif #ifndef FILAMENT_CHANGE_SLOW_LOAD_LENGTH #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.h b/Marlin/src/lcd/dogm/marlinui_DOGM.h index 59df915f49..9025395f56 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.h +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.h @@ -28,7 +28,7 @@ #include "../../inc/MarlinConfigPre.h" #include -#include "HAL_LCD_class_defines.h" +#include "u8g/HAL_LCD_class_defines.h" //#define ALTERNATIVE_LCD diff --git a/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h b/Marlin/src/lcd/dogm/u8g/HAL_LCD_class_defines.h similarity index 99% rename from Marlin/src/lcd/dogm/HAL_LCD_class_defines.h rename to Marlin/src/lcd/dogm/u8g/HAL_LCD_class_defines.h index f07064ea71..907fa43c9b 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h +++ b/Marlin/src/lcd/dogm/u8g/HAL_LCD_class_defines.h @@ -21,7 +21,7 @@ */ #pragma once -#include "../../inc/MarlinConfig.h" +#include "../../../inc/MarlinConfig.h" // use this file to create the public interface for device drivers that are NOT in the U8G library diff --git a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h b/Marlin/src/lcd/dogm/u8g/HAL_LCD_com_defines.h similarity index 97% rename from Marlin/src/lcd/dogm/HAL_LCD_com_defines.h rename to Marlin/src/lcd/dogm/u8g/HAL_LCD_com_defines.h index a70e2b7b8b..e94c753807 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h +++ b/Marlin/src/lcd/dogm/u8g/HAL_LCD_com_defines.h @@ -27,7 +27,7 @@ #include -#include HAL_PATH(../.., u8g/LCD_defines.h) +#include HAL_PATH(../../.., u8g/LCD_defines.h) #if HAS_FSMC_GRAPHICAL_TFT || HAS_SPI_GRAPHICAL_TFT || HAS_LTDC_GRAPHICAL_TFT uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); diff --git a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp similarity index 99% rename from Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp rename to Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp index 5865bb1187..4cd9b8f3c0 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp @@ -65,7 +65,7 @@ * beginning. */ -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp similarity index 99% rename from Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp rename to Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp index 6d40ea0d4b..4aa90d5e8e 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_ssd1309_12864.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp @@ -20,7 +20,7 @@ * */ -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp similarity index 99% rename from Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp rename to Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp index 6c7066179e..61a1e214bd 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp @@ -53,7 +53,7 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "../../inc/MarlinConfig.h" +#include "../../../inc/MarlinConfig.h" #if HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp similarity index 99% rename from Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp rename to Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp index d5f1be18ec..fb9d4b7ad6 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp @@ -53,7 +53,7 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if HAS_MARLINUI_U8GLIB && DISABLED(TFT_CLASSIC_UI) diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_tft_upscale_from_128x64.cpp similarity index 98% rename from Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp rename to Marlin/src/lcd/dogm/u8g/u8g_dev_tft_upscale_from_128x64.cpp index 51bbee78b9..dcf835a6cb 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_tft_upscale_from_128x64.cpp @@ -53,12 +53,12 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "../../inc/MarlinConfig.h" +#include "../../../inc/MarlinConfig.h" #if HAS_MARLINUI_U8GLIB && (PIN_EXISTS(FSMC_CS) || HAS_SPI_GRAPHICAL_TFT || HAS_LTDC_GRAPHICAL_TFT) #include "HAL_LCD_com_defines.h" -#include "marlinui_DOGM.h" +#include "../marlinui_DOGM.h" #include @@ -66,7 +66,7 @@ #define HAS_LCD_IO 1 #endif -#include "../tft_io/tft_io.h" +#include "../../tft_io/tft_io.h" TFT_IO tftio; #define WIDTH LCD_PIXEL_WIDTH @@ -74,12 +74,12 @@ TFT_IO tftio; #define PAGE_HEIGHT 8 #if ENABLED(TOUCH_SCREEN_CALIBRATION) - #include "../tft_io/touch_calibration.h" - #include "../marlinui.h" + #include "../../tft_io/touch_calibration.h" + #include "../../marlinui.h" #endif -#include "../touch/touch_buttons.h" -#include "../scaled_tft.h" +#include "../../touch/touch_buttons.h" +#include "../../scaled_tft.h" #define X_HI (UPSCALE(TFT_PIXEL_OFFSET_X, WIDTH) - 1) #define Y_HI (UPSCALE(TFT_PIXEL_OFFSET_Y, HEIGHT) - 1) diff --git a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp similarity index 99% rename from Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp rename to Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp index 172afbd766..95ae2810f2 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp @@ -53,7 +53,7 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp similarity index 98% rename from Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp rename to Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp index 11cd7b14ba..cd7445e019 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -23,11 +23,11 @@ // NOTE - the HAL version of the rrd device uses a generic ST7920 device. // See u8g_dev_st7920_128x64_HAL.cpp for the HAL version. -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if ANY(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32) -#include "../../inc/MarlinConfig.h" +#include "../../../inc/MarlinConfig.h" #if IS_U8GLIB_ST7920 @@ -184,7 +184,7 @@ u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_rrd_st7920_128x64_fn, &u8 #pragma GCC reset_options #if ENABLED(LIGHTWEIGHT_UI) - #include "../../HAL/shared/HAL_ST7920.h" + #include "../../../HAL/shared/HAL_ST7920.h" void ST7920_cs() { ST7920_CS(); } void ST7920_ncs() { ST7920_NCS(); } void ST7920_set_cmd() { ST7920_SET_CMD(); } diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.h similarity index 96% rename from Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h rename to Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.h index 9a565fc2ef..f965913341 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h +++ b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.h @@ -24,8 +24,8 @@ // NOTE - the HAL version of the rrd device uses a generic ST7920 device. See the // file u8g_dev_st7920_128x64_HAL.cpp for the HAL version. -#include "../../inc/MarlinConfig.h" -#include "../../HAL/shared/Delay.h" +#include "../../../inc/MarlinConfig.h" +#include "../../../HAL/shared/Delay.h" #define ST7920_CLK_PIN LCD_PINS_D4 #define ST7920_DAT_PIN LCD_PINS_EN diff --git a/Marlin/src/lcd/e3v2/common/dwin_api.cpp b/Marlin/src/lcd/e3v2/common/dwin_api.cpp index 342289e993..1688b24230 100644 --- a/Marlin/src/lcd/e3v2/common/dwin_api.cpp +++ b/Marlin/src/lcd/e3v2/common/dwin_api.cpp @@ -153,21 +153,23 @@ void dwinFrameClear(const uint16_t color) { dwinSend(i); } -// Draw a point -// color: point color -// width: point width 0x01-0x0F -// height: point height 0x01-0x0F -// x,y: upper left point -void dwinDrawPoint(uint16_t color, uint8_t width, uint8_t height, uint16_t x, uint16_t y) { - size_t i = 0; - dwinByte(i, 0x02); - dwinWord(i, color); - dwinByte(i, width); - dwinByte(i, height); - dwinWord(i, x); - dwinWord(i, y); - dwinSend(i); -} +#if DISABLED(TJC_DISPLAY) + // Draw a point + // color: point color + // width: point width 0x01-0x0F + // height: point height 0x01-0x0F + // x,y: upper left point + void dwinDrawPoint(uint16_t color, uint8_t width, uint8_t height, uint16_t x, uint16_t y) { + size_t i = 0; + dwinByte(i, 0x02); + dwinWord(i, color); + dwinByte(i, width); + dwinByte(i, height); + dwinWord(i, x); + dwinWord(i, y); + dwinSend(i); + } +#endif // Draw a line // color: Line segment color diff --git a/Marlin/src/lcd/e3v2/common/dwin_api.h b/Marlin/src/lcd/e3v2/common/dwin_api.h index dd4fccbcc5..4878515032 100644 --- a/Marlin/src/lcd/e3v2/common/dwin_api.h +++ b/Marlin/src/lcd/e3v2/common/dwin_api.h @@ -113,13 +113,6 @@ void dwinUpdateLCD(); // color: Clear screen color void dwinFrameClear(const uint16_t color); -// Draw a point -// color: point color -// width: point width 0x01-0x0F -// height: point height 0x01-0x0F -// x,y: upper left point -void dwinDrawPoint(uint16_t color, uint8_t width, uint8_t height, uint16_t x, uint16_t y); - // Draw a line // color: Line segment color // xStart/yStart: Start point @@ -158,6 +151,19 @@ inline void dwinDrawBox(uint8_t mode, uint16_t color, uint16_t xStart, uint16_t dwinDrawRectangle(mode, color, xStart, yStart, xStart + xSize - 1, yStart + ySize - 1); } +// Draw a point +// color: point color +// width: point width 0x01-0x0F +// height: point height 0x01-0x0F +// x,y: upper left point +#if ENABLED(TJC_DISPLAY) + inline void dwinDrawPoint(uint16_t color, uint8_t width, uint8_t height, uint16_t x, uint16_t y) { + dwinDrawBox(1, color, x, y, 1, 1); + } +#else + void dwinDrawPoint(uint16_t color, uint8_t width, uint8_t height, uint16_t x, uint16_t y); +#endif + // Move a screen area // mode: 0, circle shift; 1, translation // dir: 0=left, 1=right, 2=up, 3=down diff --git a/Marlin/src/lcd/e3v2/common/dwin_set.h b/Marlin/src/lcd/e3v2/common/dwin_set.h index ada7dec71f..f32d0e6d9e 100644 --- a/Marlin/src/lcd/e3v2/common/dwin_set.h +++ b/Marlin/src/lcd/e3v2/common/dwin_set.h @@ -130,7 +130,7 @@ #define ICON_Folder ICON_More #define ICON_AdvSet ICON_Language -#define ICON_HomeOffset ICON_AdvSet +#define ICON_HomeOffset ICON_PrintSize #define ICON_HomeOffsetX ICON_StepX #define ICON_HomeOffsetY ICON_StepY #define ICON_HomeOffsetZ ICON_StepZ @@ -138,8 +138,8 @@ #define ICON_ProbeOffsetX ICON_StepX #define ICON_ProbeOffsetY ICON_StepY #define ICON_ProbeOffsetZ ICON_StepZ -#define ICON_PIDNozzle ICON_SetEndTemp -#define ICON_PIDBed ICON_SetBedTemp +#define ICON_PIDNozzle ICON_HotendTemp +#define ICON_PIDBed ICON_BedTemp #define ICON_FWRetract ICON_StepE #define ICON_FWRetLength ICON_StepE #define ICON_FWRetSpeed ICON_Setspeed diff --git a/Marlin/src/lcd/e3v2/creality/dwin.cpp b/Marlin/src/lcd/e3v2/creality/dwin.cpp index 08161dffaf..9ecfbfe1fa 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin.cpp +++ b/Marlin/src/lcd/e3v2/creality/dwin.cpp @@ -4169,8 +4169,8 @@ void eachMomentUpdate() { gotoMainMenu(); } #if ENABLED(POWER_LOSS_RECOVERY) - else if (DWIN_lcd_sd_status && recovery.dwin_flag) { // resume print before power off - recovery.dwin_flag = false; + else if (DWIN_lcd_sd_status && recovery.ui_flag_resume) { // Resume interrupted print + recovery.ui_flag_resume = false; auto update_selection = [&](const bool sel) { hmiFlag.select_flag = sel; @@ -4197,7 +4197,7 @@ void eachMomentUpdate() { if (encoder_diffState == ENCODER_DIFF_ENTER) { recovery_flag = false; if (hmiFlag.select_flag) break; - TERN_(POWER_LOSS_RECOVERY, queue.inject(F("M1000C"))); + queue.inject(F("M1000C")); hmiStartFrame(true); return; } diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index b65adbb780..bb345e5191 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -158,6 +158,8 @@ #define MAX_ETEMP thermalManager.hotend_max_target(0) #define MIN_BEDTEMP 0 #define MAX_BEDTEMP BED_MAX_TARGET +#define MIN_CHAMBERTEMP 0 +#define MAX_CHAMBERTEMP CHAMBER_MAX_TARGET #define DWIN_VAR_UPDATE_INTERVAL 500 #define DWIN_UPDATE_INTERVAL 1000 @@ -243,11 +245,16 @@ Menu *stepsMenu = nullptr; #if ANY(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) Menu *hotendMPCMenu = nullptr; #endif -#if ENABLED(PIDTEMP) && ANY(PID_EDIT_MENU, PID_AUTOTUNE_MENU) - Menu *hotendPIDMenu = nullptr; -#endif -#if ENABLED(PIDTEMPBED) && ANY(PID_EDIT_MENU, PID_AUTOTUNE_MENU) - Menu *bedPIDMenu = nullptr; +#if ANY(PID_EDIT_MENU, PID_AUTOTUNE_MENU) + #if ENABLED(PIDTEMP) + Menu *hotendPIDMenu = nullptr; + #endif + #if ENABLED(PIDTEMPBED) + Menu *bedPIDMenu = nullptr; + #endif + #if ENABLED(PIDTEMPCHAMBER) + Menu *chamberPIDMenu = nullptr; + #endif #endif #if CASELIGHT_USES_BRIGHTNESS Menu *caseLightMenu = nullptr; @@ -418,49 +425,50 @@ void popupPauseOrStop() { drawSelectHighlight(true); dwinUpdateLCD(); } - else - dwinPopupConfirmCancel(ICON_BLTouch, select_print.now == PRINT_PAUSE_RESUME ? GET_TEXT_F(MSG_PAUSE_PRINT) : GET_TEXT_F(MSG_STOP_PRINT)); + else { + switch (select_print.now) { + case PRINT_PAUSE_RESUME: dwinPopupConfirmCancel(ICON_Pause_1, GET_TEXT_F(MSG_PAUSE_PRINT)); break; + case PRINT_STOP: dwinPopupConfirmCancel(ICON_Stop_1, GET_TEXT_F(MSG_STOP_PRINT)); break; + default: break; + } + } } -#if HAS_HOTEND - - void popupETempTooLow() { - if (hmiIsChinese()) { - hmiSaveProcessID(ID_WaitResponse); - DWINUI::clearMainArea(); - drawPopupBkgd(); - DWINUI::drawIcon(ICON_TempTooLow, 102, 105); - dwinFrameAreaCopy(1, 103, 371, 136, 386, 69, 240); - dwinFrameAreaCopy(1, 170, 371, 270, 386, 102, 240); - DWINUI::drawIconWB(ICON_Confirm_C, 86, 280); - dwinUpdateLCD(); - } - else - dwinPopupConfirm(ICON_TempTooLow, GET_TEXT_F(MSG_HOTEND_TOO_COLD), GET_TEXT_F(MSG_PLEASE_PREHEAT)); - } - -#endif - -#if HAS_HOTEND || HAS_HEATED_BED - void dwinPopupTemperature(const bool toohigh) { +#if HAS_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER + void dwinPopupTemperature(const int_fast8_t heater_id, const uint8_t state) { hmiSaveProcessID(ID_WaitResponse); if (hmiIsChinese()) { DWINUI::clearMainArea(); drawPopupBkgd(); - if (toohigh) { + if (state == 1) { DWINUI::drawIcon(ICON_TempTooHigh, 102, 165); dwinFrameAreaCopy(1, 103, 371, 237, 386, 52, 285); dwinFrameAreaCopy(1, 151, 389, 185, 402, 187, 285); dwinFrameAreaCopy(1, 189, 389, 271, 402, 95, 310); } - else { + else if (state == 0) { DWINUI::drawIcon(ICON_TempTooLow, 102, 165); dwinFrameAreaCopy(1, 103, 371, 270, 386, 52, 285); dwinFrameAreaCopy(1, 189, 389, 271, 402, 95, 310); } + else { + // Chinese "Temp Error" + } + } + else { + FSTR_P heaterstr = nullptr; + if (TERN0(HAS_HEATED_BED, heater_id == H_BED)) heaterstr = F("Bed"); + else if (TERN0(HAS_HEATED_CHAMBER, heater_id == H_CHAMBER)) heaterstr = F("Chamber"); + else if (TERN0(HAS_HOTEND, heater_id >= 0)) heaterstr = F("Nozzle"); + FSTR_P errorstr; + uint8_t icon; + switch (state) { + case 0: errorstr = GET_TEXT_F(MSG_TEMP_TOO_LOW); icon = ICON_TempTooLow; break; + case 1: errorstr = GET_TEXT_F(MSG_TEMP_TOO_HIGH); icon = ICON_TempTooHigh; break; + default: errorstr = GET_TEXT_F(MSG_ERR_HEATING_FAILED); icon = ICON_Temperature; break; // May be thermal runaway, temp malfunction, etc. + } + dwinShowPopup(icon, heaterstr, errorstr, BTN_Continue); } - else - dwinShowPopup(toohigh ? ICON_TempTooHigh : ICON_TempTooLow, F("Nozzle or Bed temperature"), toohigh ? F("is too high") : F("is too low"), BTN_Continue); } #endif @@ -581,16 +589,17 @@ void ICON_ResumeOrPause() { if (checkkey == ID_PrintProcess) (print_job_timer.isPaused() || hmiFlag.pause_flag) ? ICON_Resume() : ICON_Pause(); } -// Update filename on print -void dwinPrintHeader(const char *text = nullptr) { +// Print a string (up to 30 characters) in the header, +// e.g., The filename or string sent with M75. +void dwinPrintHeader(const char * const cstr/*=nullptr*/) { static char headertxt[31] = ""; // Print header text - if (text) { - const int8_t size = _MIN(30U, strlen_P(text)); - for (uint8_t i = 0; i < size; ++i) headertxt[i] = text[i]; + if (cstr) { + const int8_t size = _MIN(30U, strlen(cstr)); + for (uint8_t i = 0; i < size; ++i) headertxt[i] = cstr[i]; headertxt[size] = '\0'; } if (checkkey == ID_PrintProcess || checkkey == ID_PrintDone) { - dwinDrawRectangle(1, hmiData.colorBackground, 0, 60, DWIN_WIDTH, 60+16); + dwinDrawRectangle(1, hmiData.colorBackground, 0, 60, DWIN_WIDTH, 60 + 16); DWINUI::drawCenteredString(60, headertxt); } } @@ -601,7 +610,7 @@ void drawPrintProcess() { else title.showCaption(GET_TEXT_F(MSG_PRINTING)); DWINUI::clearMainArea(); - dwinPrintHeader(nullptr); + dwinPrintHeader(); drawPrintLabels(); DWINUI::drawIcon(ICON_PrintTime, 15, 173); DWINUI::drawIcon(ICON_RemainTime, 150, 171); @@ -629,7 +638,7 @@ void drawPrintDone() { TERN_(SET_REMAINING_TIME, ui.reset_remaining_time()); title.showCaption(GET_TEXT_F(MSG_PRINT_DONE)); DWINUI::clearMainArea(); - dwinPrintHeader(nullptr); + dwinPrintHeader(); #if HAS_GCODE_PREVIEW const bool haspreview = preview.valid(); if (haspreview) { @@ -1031,7 +1040,7 @@ void hmiSDCardUpdate() { currentMenu = nullptr; drawPrintFileMenu(); } - if (!DWIN_lcd_sd_status && sdPrinting()) ui.abort_print(); // Media removed while printing + if (!DWIN_lcd_sd_status && sdPrinting()) ExtUI::stopPrint(); // Media removed while printing } } @@ -1060,7 +1069,7 @@ void dwinDrawDashboard() { #endif #if HAS_HEATED_BED - DWINUI::drawIcon(ICON_BedTemp, 10, 416); + DWINUI::drawIcon(ICON_SetBedTemp, 10, 416); DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 28, 417, thermalManager.wholeDegBed()); DWINUI::drawString(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 25 + 3 * STAT_CHR_W + 5, 417, F("/")); DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 25 + 4 * STAT_CHR_W + 6, 417, thermalManager.degTargetBed()); @@ -1155,8 +1164,8 @@ void hmiMainMenu() { // Pause or Stop popup void onClickPauseOrStop() { switch (select_print.now) { - case PRINT_PAUSE_RESUME: if (hmiFlag.select_flag) ui.pause_print(); break; // Confirm pause - case PRINT_STOP: if (hmiFlag.select_flag) ui.abort_print(); break; // Stop confirmed then abort print + case PRINT_PAUSE_RESUME: if (hmiFlag.select_flag) ExtUI::pausePrint(); break; // Confirm pause + case PRINT_STOP: if (hmiFlag.select_flag) ExtUI::stopPrint(); break; // Stop confirmed then abort print default: break; } return gotoPrintProcess(); @@ -1190,7 +1199,7 @@ void hmiPrinting() { case PRINT_SETUP: drawTuneMenu(); break; case PRINT_PAUSE_RESUME: if (printingIsPaused()) { // If printer is already in pause - ui.resume_print(); + ExtUI::resumePrint(); break; } else @@ -1213,6 +1222,20 @@ void drawMainArea() { #if HAS_ESDIAG case ID_ESDiagProcess: drawEndStopDiag(); break; #endif + #if ENABLED(PROUI_ITEM_PLOT) + case ID_PlotProcess: + switch (hmiValue.tempControl) { + #if ENABLED(PIDTEMP) + case PIDTEMP_START: drawHPlot(); break; + #endif + #if ENABLED(PIDTEMPBED) + case PIDTEMPBED_START: drawBPlot(); break; + #endif + #if ENABLED(PIDTEMPCHAMBER) + case PIDTEMPCHAMBER_START: drawCPlot(); break; + #endif + } break; + #endif case ID_Popup: popupDraw(); break; #if HAS_LOCKSCREEN case ID_Locked: lockScreen.draw(); break; @@ -1280,12 +1303,14 @@ void eachMomentUpdate() { if (checkkey == ID_PIDProcess) { TERN_(PIDTEMP, if (hmiValue.tempControl == PIDTEMP_START) plot.update(thermalManager.wholeDegHotend(0))); TERN_(PIDTEMPBED, if (hmiValue.tempControl == PIDTEMPBED_START) plot.update(thermalManager.wholeDegBed())); + TERN_(PIDTEMPCHAMBER, if (hmiValue.tempControl == PIDTEMPCHAMBER_START) plot.update(thermalManager.wholeDegChamber())); } TERN_(MPCTEMP, if (checkkey == ID_MPCProcess) plot.update(thermalManager.wholeDegHotend(0))); #if ENABLED(PROUI_ITEM_PLOT) if (checkkey == ID_PlotProcess) { TERN_(PIDTEMP, if (hmiValue.tempControl == PIDTEMP_START) { plot.update(thermalManager.wholeDegHotend(0)); }) TERN_(PIDTEMPBED, if (hmiValue.tempControl == PIDTEMPBED_START) { plot.update(thermalManager.wholeDegBed()); }) + TERN_(PIDTEMPCHAMBER, if (hmiValue.tempControl == PIDTEMPCHAMBER_START) { plot.update(thermalManager.wholeDegChamber()); }) TERN_(MPCTEMP, if (hmiValue.tempControl == MPCTEMP_START) { plot.update(thermalManager.wholeDegHotend(0)); }) if (hmiFlag.abort_flag || hmiFlag.pause_flag || print_job_timer.isPaused()) { hmiReturnScreen(); @@ -1357,8 +1382,8 @@ void eachMomentUpdate() { drawPrintProgressElapsed(); } } - #if ENABLED(POWER_LOSS_RECOVERY) - else if (DWIN_lcd_sd_status && recovery.dwin_flag) { // Resume print before power off + #if HAS_PLR_UI_FLAG + else if (DWIN_lcd_sd_status && recovery.ui_flag_resume) { // Resume interrupted print return gotoPowerLossRecovery(); } #endif @@ -1368,6 +1393,7 @@ void eachMomentUpdate() { } #if ENABLED(POWER_LOSS_RECOVERY) + void popupPowerLossRecovery() { DWINUI::clearMainArea(); drawPopupBkgd(); @@ -1407,7 +1433,7 @@ void eachMomentUpdate() { } void gotoPowerLossRecovery() { - recovery.dwin_flag = false; + recovery.ui_flag_resume = false; LCD_MESSAGE(MSG_CONTINUE_PRINT_JOB); gotoPopup(popupPowerLossRecovery, onClickPowerLossRecovery); } @@ -1435,7 +1461,8 @@ void dwinHandleScreen() { TERN_(HAS_BED_PROBE, case ID_Leveling:) case ID_Homing: - case ID_PIDProcess: + TERN_(HAS_PID_HEATING, case ID_PIDProcess:) + TERN_(MPCTEMP, case ID_MPCProcess:) case ID_NothingToDo: default: break; } @@ -1449,7 +1476,9 @@ bool idIsPopUp() { // If ID is popup... case ID_WaitResponse: case ID_Popup: case ID_Homing: - case ID_PIDProcess: + TERN_(HAS_PID_HEATING, case ID_PIDProcess:) + TERN_(MPCTEMP, case ID_MPCProcess:) + TERN_(PROUI_ITEM_PLOT, case ID_PlotProcess:) return true; default: break; } @@ -1482,7 +1511,11 @@ void dwinHomingStart() { hmiFlag.home_flag = true; hmiSaveProcessID(ID_Homing); title.showCaption(GET_TEXT_F(MSG_HOMING)); - dwinShowPopup(ICON_BLTouch, GET_TEXT_F(MSG_HOMING), GET_TEXT_F(MSG_PLEASE_WAIT)); + #if ANY(TJC_DISPLAY, DACAI_DISPLAY) + dwinShowPopup(ICON_BLTouch, GET_TEXT_F(MSG_HOMING), GET_TEXT_F(MSG_PLEASE_WAIT)); + #else + dwinShowPopup(ICON_Printer_0, GET_TEXT_F(MSG_HOMING), GET_TEXT_F(MSG_PLEASE_WAIT)); + #endif } void dwinHomingDone() { @@ -1499,22 +1532,7 @@ void dwinLevelingStart() { title.showCaption(GET_TEXT_F(MSG_BED_LEVELING)); dwinShowPopup(ICON_AutoLeveling, GET_TEXT_F(MSG_BED_LEVELING), GET_TEXT_F(MSG_PLEASE_WAIT)); #if ALL(AUTO_BED_LEVELING_UBL, PREHEAT_BEFORE_LEVELING) - #if HAS_BED_PROBE - if (!DEBUGGING(DRYRUN)) probe.preheat_for_probing(LEVELING_NOZZLE_TEMP, hmiData.bedLevT); - #else - #if HAS_HOTEND - if (!DEBUGGING(DRYRUN) && thermalManager.degTargetHotend(0) < LEVELING_NOZZLE_TEMP) { - thermalManager.setTargetHotend(LEVELING_NOZZLE_TEMP, 0); - thermalManager.wait_for_hotend(0); - } - #endif - #if HAS_HEATED_BED - if (!DEBUGGING(DRYRUN) && thermalManager.degTargetBed() < hmiData.bedLevT) { - thermalManager.setTargetBed(hmiData.bedLevT); - thermalManager.wait_for_bed_heating(); - } - #endif - #endif + if (!DEBUGGING(DRYRUN)) probe.preheat_for_probing(LEVELING_NOZZLE_TEMP, hmiData.bedLevT); #endif #elif ENABLED(MESH_BED_LEVELING) drawManualMeshMenu(); @@ -1551,7 +1569,7 @@ void dwinLevelingDone() { case MPCTEMP_START: DWINUI::drawCenteredString(hmiData.colorPopupTxt, 70, GET_TEXT_F(MSG_MPC_AUTOTUNE)); DWINUI::drawString(hmiData.colorPopupTxt, gfrm.x, gfrm.y - DWINUI::fontHeight() - 4, F("MPC target: Celsius")); - DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, F("for NOZZLE is running.")); + DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, GET_TEXT_F(MSG_PID_FOR_NOZZLE)); _maxtemp = thermalManager.hotend_maxtemp[0]; _target = 200; break; @@ -1560,18 +1578,27 @@ void dwinLevelingDone() { case PIDTEMP_START: DWINUI::drawCenteredString(hmiData.colorPopupTxt, 70, GET_TEXT_F(MSG_PID_AUTOTUNE)); DWINUI::drawString(hmiData.colorPopupTxt, gfrm.x, gfrm.y - DWINUI::fontHeight() - 4, F("PID target: Celsius")); - DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, F("for NOZZLE is running.")); + DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, GET_TEXT_F(MSG_PID_FOR_NOZZLE)); _maxtemp = thermalManager.hotend_maxtemp[0]; - _target = hmiData.hotendPidT; + _target = hmiData.hotendPIDT; break; #endif #if ENABLED(PIDTEMPBED) case PIDTEMPBED_START: DWINUI::drawCenteredString(hmiData.colorPopupTxt, 70, GET_TEXT_F(MSG_PID_AUTOTUNE)); DWINUI::drawString(hmiData.colorPopupTxt, gfrm.x, gfrm.y - DWINUI::fontHeight() - 4, F("PID target: Celsius")); - DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, F("for BED is running.")); + DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, GET_TEXT_F(MSG_PID_FOR_BED)); _maxtemp = BED_MAXTEMP; - _target = hmiData.bedPidT; + _target = hmiData.bedPIDT; + break; + #endif + #if ENABLED(PIDTEMPCHAMBER) + case PIDTEMPCHAMBER_START: + DWINUI::drawCenteredString(hmiData.colorPopupTxt, 70, GET_TEXT_F(MSG_PID_AUTOTUNE)); + DWINUI::drawString(hmiData.colorPopupTxt, gfrm.x, gfrm.y - DWINUI::fontHeight() - 4, F("PID target: Celsius")); + DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, GET_TEXT_F(MSG_PID_FOR_CHAMBER)); + _maxtemp = CHAMBER_MAXTEMP; + _target = hmiData.chamberPIDT; break; #endif } @@ -1585,7 +1612,7 @@ void dwinLevelingDone() { void dwinDrawPlot(tempcontrol_t result) { hmiValue.tempControl = result; - constexpr frame_rect_t gfrm = {30, 135, DWIN_WIDTH - 60, 160}; + constexpr frame_rect_t gfrm = { 30, 135, DWIN_WIDTH - 60, 160 }; DWINUI::clearMainArea(); drawPopupBkgd(); hmiSaveProcessID(ID_PlotProcess); @@ -1597,18 +1624,26 @@ void dwinLevelingDone() { case PIDTEMP_START: #endif title.showCaption(GET_TEXT_F(MSG_HOTEND_TEMP_GRAPH)); - DWINUI::drawCenteredString(3, hmiData.colorPopupTxt, 75, F("Nozzle Temperature")); + DWINUI::drawCenteredString(3, hmiData.colorPopupTxt, 75, GET_TEXT_F(MSG_TEMP_NOZZLE)); _maxtemp = thermalManager.hotend_max_target(0); _target = thermalManager.degTargetHotend(0); break; #if ENABLED(PIDTEMPBED) case PIDTEMPBED_START: title.showCaption(GET_TEXT_F(MSG_BED_TEMP_GRAPH)); - DWINUI::drawCenteredString(3, hmiData.colorPopupTxt, 75, F("Bed Temperature")); + DWINUI::drawCenteredString(3, hmiData.colorPopupTxt, 75, GET_TEXT_F(MSG_TEMP_BED)); _maxtemp = BED_MAX_TARGET; _target = thermalManager.degTargetBed(); break; #endif + #if ENABLED(PIDTEMPCHAMBER) + case PIDTEMPCHAMBER_START: + title.showCaption(GET_TEXT_F(MSG_CHAMBER_TEMP_GRAPH)); + DWINUI::drawCenteredString(3, hmiData.colorPopupTxt, 75, GET_TEXT_F(MSG_TEMP_CHAMBER)); + _maxtemp = CHAMBER_MAX_TARGET; + _target = thermalManager.degTargetChamber(); + break; + #endif default: break; } @@ -1616,7 +1651,6 @@ void dwinLevelingDone() { plot.draw(gfrm, _maxtemp, _target); DWINUI::drawInt(false, 2, hmiData.colorStatusTxt, hmiData.colorPopupBg, 3, gfrm.x + 80, gfrm.y - DWINUI::fontHeight() - 4, _target); DWINUI::drawButton(BTN_Continue, 86, 305); - dwinUpdateLCD(); } void drawHPlot() { @@ -1626,29 +1660,33 @@ void dwinLevelingDone() { void drawBPlot() { TERN_(PIDTEMPBED, dwinDrawPlot(PIDTEMPBED_START)); } + void drawCPlot() { + TERN_(PIDTEMPCHAMBER, dwinDrawPlot(PIDTEMPCHAMBER_START)); + } #endif // PROUI_ITEM_PLOT #endif // PROUI_TUNING_GRAPH -#if PROUI_PID_TUNE +#if HAS_PID_HEATING - void dwinStartM303(const bool seenC, const int c, const bool seenS, const heater_id_t hid, const celsius_t temp) { - if (seenC) hmiData.pidCycles = c; - if (seenS) { - switch (hid) { - #if ENABLED(PIDTEMP) - case 0 ... HOTENDS - 1: hmiData.hotendPidT = temp; break; - #endif - #if ENABLED(PIDTEMPBED) - case H_BED: hmiData.bedPidT = temp; break; - #endif - default: break; - } + void dwinStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + hmiData.pidCycles = count; + switch (hid) { + #if ENABLED(PIDTEMP) + case 0 ... HOTENDS - 1: hmiData.hotendPIDT = temp; break; + #endif + #if ENABLED(PIDTEMPBED) + case H_BED: hmiData.bedPIDT = temp; break; + #endif + #if ENABLED(PIDTEMPCHAMBER) + case H_CHAMBER: hmiData.chamberPIDT = temp; break; + #endif + default: break; } } - void dwinPidTuning(tempcontrol_t result) { + void dwinPIDTuning(tempcontrol_t result) { hmiValue.tempControl = result; switch (result) { #if ENABLED(PIDTEMP) @@ -1657,22 +1695,20 @@ void dwinLevelingDone() { #if PROUI_TUNING_GRAPH dwinDrawPIDMPCPopup(); #else - dwinDrawPopup(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE), F("for Nozzle is running.")); + dwinDrawPopup(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE), GET_TEXT_F(MSG_PID_FOR_NOZZLE)); #endif break; - case PID_TEMP_TOO_HIGH: - checkkey = last_checkkey; - dwinPopupConfirm(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE_FAILED), GET_TEXT_F(MSG_TEMP_TOO_HIGH)); - break; #endif #if ENABLED(PIDTEMPBED) case PIDTEMPBED_START: hmiSaveProcessID(ID_PIDProcess); - #if PROUI_TUNING_GRAPH - dwinDrawPIDMPCPopup(); - #else - dwinDrawPopup(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE), F("for BED is running.")); - #endif + dwinDrawPopup(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE), GET_TEXT_F(MSG_PID_FOR_BED)); + break; + #endif + #if ENABLED(PIDTEMPCHAMBER) + case PIDTEMPCHAMBER_START: + hmiSaveProcessID(ID_PIDProcess); + dwinDrawPopup(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE), GET_TEXT_F(MSG_PID_FOR_CHAMBER)); break; #endif case PID_BAD_HEATER_ID: @@ -1683,17 +1719,22 @@ void dwinLevelingDone() { checkkey = last_checkkey; dwinPopupConfirm(ICON_TempTooHigh, GET_TEXT_F(MSG_ERROR), GET_TEXT_F(MSG_PID_TIMEOUT)); break; + case PID_TEMP_TOO_HIGH: + checkkey = last_checkkey; + dwinPopupConfirm(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE_FAILED), GET_TEXT_F(MSG_TEMP_TOO_HIGH)); + break; case AUTOTUNE_DONE: checkkey = last_checkkey; dwinPopupConfirm(ICON_TempTooLow, GET_TEXT_F(MSG_PID_AUTOTUNE), GET_TEXT_F(MSG_BUTTON_DONE)); break; default: checkkey = last_checkkey; + dwinPopupConfirm(ICON_Info_0, GET_TEXT_F(MSG_ERROR), GET_TEXT_F(MSG_STOPPING)); break; } } -#endif // PROUI_PID_TUNE +#endif // HAS_PID_HEATING #if ENABLED(MPC_AUTOTUNE) @@ -1808,12 +1849,14 @@ void dwinSetColorDefaults() { hmiData.colorCoordinate = defColorCoordinate; } +static_assert(ExtUI::eeprom_data_size >= sizeof(hmi_data_t), "Insufficient space in EEPROM for UI parameters"); + void dwinSetDataDefaults() { dwinSetColorDefaults(); DWINUI::setColors(hmiData.colorText, hmiData.colorBackground, hmiData.colorStatusBg); - TERN_(PIDTEMP, hmiData.hotendPidT = DEF_HOTENDPIDT); - TERN_(PIDTEMPBED, hmiData.bedPidT = DEF_BEDPIDT); - TERN_(PROUI_PID_TUNE, hmiData.pidCycles = DEF_PIDCYCLES); + TERN_(PIDTEMP, hmiData.hotendPIDT = DEF_HOTENDPIDT); + TERN_(PIDTEMPBED, hmiData.bedPIDT = DEF_BEDPIDT); + TERN_(HAS_PID_HEATING, hmiData.pidCycles = DEF_PIDCYCLES); #if ENABLED(PREVENT_COLD_EXTRUSION) hmiData.extMinT = EXTRUDE_MINTEMP; applyExtMinT(); @@ -1835,12 +1878,11 @@ void dwinSetDataDefaults() { TERN_(LED_COLOR_PRESETS, leds.set_default()); applyLEDColor(); #endif - TERN_(ADAPTIVE_STEP_SMOOTHING, hmiData.adaptiveStepSmoothing = true); TERN_(HAS_GCODE_PREVIEW, hmiData.enablePreview = true); } void dwinCopySettingsTo(char * const buff) { - memcpy(buff, &hmiData, eeprom_data_size); + memcpy(buff, &hmiData, sizeof(hmi_data_t)); } void dwinCopySettingsFrom(const char * const buff) { @@ -1895,7 +1937,11 @@ void MarlinUI::update() { #endif void MarlinUI::kill_screen(FSTR_P const lcd_error, FSTR_P const) { - dwinDrawPopup(ICON_BLTouch, GET_TEXT_F(MSG_PRINTER_KILLED), lcd_error); + #if ANY(TJC_DISPLAY, DACAI_DISPLAY) + dwinDrawPopup(ICON_BLTouch, GET_TEXT_F(MSG_PRINTER_KILLED), lcd_error); + #else + dwinDrawPopup(ICON_Printer_0, GET_TEXT_F(MSG_PRINTER_KILLED), lcd_error); + #endif DWINUI::drawCenteredString(hmiData.colorPopupTxt, 270, GET_TEXT_F(MSG_TURN_OFF)); dwinUpdateLCD(); } @@ -1920,32 +1966,14 @@ void dwinRedrawScreen() { } #if ENABLED(ADVANCED_PAUSE_FEATURE) + void dwinPopupPause(FSTR_P const fmsg, uint8_t button/*=0*/) { hmiSaveProcessID(button ? ID_WaitResponse : ID_NothingToDo); - dwinShowPopup(ICON_BLTouch, GET_TEXT_F(MSG_ADVANCED_PAUSE), fmsg, button); - } - - void MarlinUI::pause_show_message(const PauseMessage message, const PauseMode mode/*=PAUSE_MODE_SAME*/, const uint8_t extruder/*=active_extruder*/) { - if (mode != PAUSE_MODE_SAME) pause_mode = mode; - switch (message) { - case PAUSE_MESSAGE_PARKING: dwinPopupPause(GET_TEXT_F(MSG_PAUSE_PRINT_PARKING)); break; // M125 - case PAUSE_MESSAGE_CHANGING: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_INIT)); break; // pause_print (M125, M600) - case PAUSE_MESSAGE_WAITING: dwinPopupPause(GET_TEXT_F(MSG_ADVANCED_PAUSE_WAITING), BTN_Continue); break; - case PAUSE_MESSAGE_INSERT: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_INSERT), BTN_Continue); break; - case PAUSE_MESSAGE_LOAD: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_LOAD)); break; - case PAUSE_MESSAGE_UNLOAD: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_UNLOAD)); break; // Unload of pause and Unload of M702 - case PAUSE_MESSAGE_PURGE: dwinPopupPause(GET_TEXT_F(TERN(ADVANCED_PAUSE_CONTINUOUS_PURGE, MSG_FILAMENT_CHANGE_CONT_PURGE, MSG_FILAMENT_CHANGE_PURGE))); break; - case PAUSE_MESSAGE_OPTION: gotoFilamentPurge(); break; - case PAUSE_MESSAGE_RESUME: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_RESUME)); break; - case PAUSE_MESSAGE_HEAT: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEAT), BTN_Continue); break; - case PAUSE_MESSAGE_HEATING: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEATING)); break; - case PAUSE_MESSAGE_STATUS: hmiReturnScreen(); break; // Exit from Pause, Load and Unload - default: break; - } + dwinShowPopup(ICON_Pause_1, GET_TEXT_F(MSG_ADVANCED_PAUSE), fmsg, button); } void drawPopupFilamentPurge() { - dwinDrawPopup(ICON_BLTouch, GET_TEXT_F(MSG_ADVANCED_PAUSE), GET_TEXT_F(MSG_FILAMENT_CHANGE_PURGE_CONTINUE)); + dwinDrawPopup(ICON_AutoLeveling, GET_TEXT_F(MSG_ADVANCED_PAUSE), GET_TEXT_F(MSG_FILAMENT_CHANGE_PURGE_CONTINUE)); DWINUI::drawButton(BTN_Purge, 26, 280); DWINUI::drawButton(BTN_Continue, 146, 280); drawSelectHighlight(true); @@ -1970,7 +1998,7 @@ void dwinRedrawScreen() { #if HAS_MESH void dwinMeshViewer() { if (!leveling_is_valid()) - dwinPopupContinue(ICON_BLTouch, GET_TEXT_F(MSG_MESH_VIEWER), GET_TEXT_F(MSG_NO_VALID_MESH)); + dwinPopupContinue(ICON_Leveling_1, GET_TEXT_F(MSG_MESH_VIEWER), GET_TEXT_F(MSG_NO_VALID_MESH)); else { hmiSaveProcessID(ID_WaitResponse); meshViewer.draw(); @@ -3088,17 +3116,17 @@ void drawPrepareMenu() { if (SET_MENU(trammingMenu, MSG_BED_TRAMMING, 8)) { BACK_ITEM(drawPrepareMenu); #if HAS_BED_PROBE && HAS_MESH - MENU_ITEM(ICON_ProbeSet, MSG_TRAMMING_WIZARD, onDrawMenuItem, trammingwizard); - EDIT_ITEM(ICON_ProbeSet, MSG_BED_TRAMMING_MANUAL, onDrawChkbMenu, setManualTramming, &hmiData.fullManualTramming); + MENU_ITEM(ICON_Tram, MSG_TRAMMING_WIZARD, onDrawMenuItem, trammingwizard); + EDIT_ITEM(ICON_Version, MSG_BED_TRAMMING_MANUAL, onDrawChkbMenu, setManualTramming, &hmiData.fullManualTramming); #elif !HAS_BED_PROBE && HAS_ZOFFSET_ITEM MENU_ITEM_F(ICON_MoveZ0, "Home Z and disable", onDrawMenuItem, homeZAndDisable); #endif - MENU_ITEM(ICON_Axis, MSG_TRAM_FL, onDrawMenuItem, []{ (void)tram(0); }); - MENU_ITEM(ICON_Axis, MSG_TRAM_FR, onDrawMenuItem, []{ (void)tram(1); }); - MENU_ITEM(ICON_Axis, MSG_TRAM_BR, onDrawMenuItem, []{ (void)tram(2); }); - MENU_ITEM(ICON_Axis, MSG_TRAM_BL, onDrawMenuItem, []{ (void)tram(3); }); + MENU_ITEM(ICON_AxisBL, MSG_TRAM_FL, onDrawMenuItem, []{ (void)tram(0); }); + MENU_ITEM(ICON_AxisBR, MSG_TRAM_FR, onDrawMenuItem, []{ (void)tram(1); }); + MENU_ITEM(ICON_AxisTR, MSG_TRAM_BR, onDrawMenuItem, []{ (void)tram(2); }); + MENU_ITEM(ICON_AxisTL, MSG_TRAM_BL, onDrawMenuItem, []{ (void)tram(3); }); #if ENABLED(BED_TRAMMING_INCLUDE_CENTER) - MENU_ITEM(ICON_Axis, MSG_TRAM_C, onDrawMenuItem, []{ (void)tram(4); }); + MENU_ITEM(ICON_AxisC, MSG_TRAM_C, onDrawMenuItem, []{ (void)tram(4); }); #endif } updateMenu(trammingMenu); @@ -3144,13 +3172,13 @@ void drawAdvancedSettingsMenu() { MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, writeEEPROM); #endif #if HAS_MESH - MENU_ITEM(ICON_ProbeSet, MSG_MESH_LEVELING, onDrawSubMenu, drawMeshSetMenu); + MENU_ITEM(ICON_Mesh, MSG_MESH_LEVELING, onDrawSubMenu, drawMeshSetMenu); #endif #if HAS_BED_PROBE - MENU_ITEM(ICON_ProbeSet, MSG_ZPROBE_SETTINGS, onDrawSubMenu, drawProbeSetMenu); + MENU_ITEM(ICON_Probe, MSG_ZPROBE_SETTINGS, onDrawSubMenu, drawProbeSetMenu); #endif #if HAS_HOME_OFFSET - MENU_ITEM(ICON_ProbeSet, MSG_SET_HOME_OFFSETS, onDrawSubMenu, drawHomeOffsetMenu); + MENU_ITEM(ICON_HomeOffset, MSG_SET_HOME_OFFSETS, onDrawSubMenu, drawHomeOffsetMenu); #endif MENU_ITEM(ICON_FilSet, MSG_FILAMENT_SET, onDrawSubMenu, drawFilSetMenu); #if ENABLED(PIDTEMP) && ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) @@ -3176,7 +3204,7 @@ void drawAdvancedSettingsMenu() { MENU_ITEM(ICON_Lock, MSG_LOCKSCREEN, onDrawMenuItem, dwinLockScreen); #endif #if ENABLED(EDITABLE_DISPLAY_TIMEOUT) - EDIT_ITEM(ICON_Brightness, MSG_SCREEN_TIMEOUT, onDrawPIntMenu, setTimer, &ui.backlight_timeout_minutes); + EDIT_ITEM(ICON_RemainTime, MSG_SCREEN_TIMEOUT, onDrawPIntMenu, setTimer, &ui.backlight_timeout_minutes); #endif #if ENABLED(SOUND_MENU_ITEM) EDIT_ITEM(ICON_Sound, MSG_SOUND_ENABLE, onDrawChkbMenu, setEnableSound, &ui.sound_on); @@ -3196,7 +3224,7 @@ void drawAdvancedSettingsMenu() { #endif #if HAS_LCD_BRIGHTNESS EDIT_ITEM(ICON_Brightness, MSG_BRIGHTNESS, onDrawPInt8Menu, setBrightness, &ui.brightness); - MENU_ITEM(ICON_Brightness, MSG_BRIGHTNESS_OFF, onDrawMenuItem, turnOffBacklight); + MENU_ITEM(ICON_Box, MSG_BRIGHTNESS_OFF, onDrawMenuItem, turnOffBacklight); #endif #if HAS_CUSTOM_COLORS MENU_ITEM(ICON_Scolor, MSG_COLORS_SELECT, onDrawSubMenu, drawSelectColorsMenu); @@ -3268,7 +3296,7 @@ void drawMoveMenu() { #if ENABLED(BLTOUCH) MENU_ITEM(ICON_ProbeStow, MSG_MANUAL_STOW, onDrawMenuItem, probeStow); MENU_ITEM(ICON_ProbeDeploy, MSG_MANUAL_DEPLOY, onDrawMenuItem, probeDeploy); - MENU_ITEM(ICON_BltouchReset, MSG_BLTOUCH_RESET, onDrawMenuItem, bltouch._reset); + MENU_ITEM(ICON_BLTouchReset, MSG_BLTOUCH_RESET, onDrawMenuItem, bltouch._reset); #if HAS_BLTOUCH_HS_MODE EDIT_ITEM(ICON_HSMode, MSG_ENABLE_HS_MODE, onDrawChkbMenu, setHSMode, &bltouch.high_speed_mode); #endif @@ -3397,10 +3425,10 @@ void drawTuneMenu() { #endif #if HAS_LCD_BRIGHTNESS EDIT_ITEM(ICON_Brightness, MSG_BRIGHTNESS, onDrawPInt8Menu, setBrightness, &ui.brightness); - MENU_ITEM(ICON_Brightness, MSG_BRIGHTNESS_OFF, onDrawMenuItem, turnOffBacklight); + MENU_ITEM(ICON_Box, MSG_BRIGHTNESS_OFF, onDrawMenuItem, turnOffBacklight); #endif #if ENABLED(EDITABLE_DISPLAY_TIMEOUT) - EDIT_ITEM(ICON_Brightness, MSG_SCREEN_TIMEOUT, onDrawPIntMenu, setTimer, &ui.backlight_timeout_minutes); + EDIT_ITEM(ICON_RemainTime, MSG_SCREEN_TIMEOUT, onDrawPIntMenu, setTimer, &ui.backlight_timeout_minutes); #endif #if ALL(PROUI_TUNING_GRAPH, PROUI_ITEM_PLOT) MENU_ITEM(ICON_PIDNozzle, MSG_HOTEND_TEMP_GRAPH, onDrawMenuItem, drawHPlot); @@ -3425,9 +3453,9 @@ void drawTuneMenu() { updateMenu(tuneMenu); } -#if ENABLED(ADAPTIVE_STEP_SMOOTHING) +#if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE) void setAdaptiveStepSmoothing() { - toggleCheckboxLine(hmiData.adaptiveStepSmoothing); + toggleCheckboxLine(stepper.adaptive_step_smoothing_enabled); } #endif @@ -3518,8 +3546,8 @@ void drawMotionMenu() { #if ENABLED(SHAPING_MENU) MENU_ITEM(ICON_InputShaping, MSG_INPUT_SHAPING, onDrawSubMenu, drawInputShaping_menu); #endif - #if ENABLED(ADAPTIVE_STEP_SMOOTHING) - EDIT_ITEM(ICON_UBLActive, MSG_STEP_SMOOTHING, onDrawChkbMenu, setAdaptiveStepSmoothing, &hmiData.adaptiveStepSmoothing); + #if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE) + EDIT_ITEM(ICON_UBLActive, MSG_STEP_SMOOTHING, onDrawChkbMenu, setAdaptiveStepSmoothing, &stepper.adaptive_step_smoothing_enabled); #endif #if ENABLED(EDITABLE_STEPS_PER_UNIT) MENU_ITEM(ICON_Step, MSG_STEPS_PER_MM, onDrawSteps, drawStepsMenu); @@ -3589,10 +3617,10 @@ void drawFilamentManMenu() { if (notCurrent) { BACK_ITEM(drawTemperatureMenu); #if HAS_HOTEND - EDIT_ITEM(ICON_SetEndTemp, MSG_UBL_SET_TEMP_HOTEND, onDrawSetPreheatHotend, setPreheatEndTemp, &ui.material_preset[hmiValue.select].hotend_temp); + EDIT_ITEM(ICON_HotendTemp, MSG_UBL_SET_TEMP_HOTEND, onDrawSetPreheatHotend, setPreheatEndTemp, &ui.material_preset[hmiValue.select].hotend_temp); #endif #if HAS_HEATED_BED - EDIT_ITEM(ICON_SetBedTemp, MSG_UBL_SET_TEMP_BED, onDrawSetPreheatBed, setPreheatBedTemp, &ui.material_preset[hmiValue.select].bed_temp); + EDIT_ITEM(ICON_BedTemp, MSG_UBL_SET_TEMP_BED, onDrawSetPreheatBed, setPreheatBedTemp, &ui.material_preset[hmiValue.select].bed_temp); #endif #if HAS_FAN EDIT_ITEM(ICON_FanSpeed, MSG_FAN_SPEED, onDrawSetPreheatFan, setPreheatFanSpeed, &ui.material_preset[hmiValue.select].fan_speed); @@ -3618,10 +3646,10 @@ void drawTemperatureMenu() { if (SET_MENU_R(temperatureMenu, selrect({236, 2, 28, 12}), MSG_TEMPERATURE, 4 + PREHEAT_COUNT)) { BACK_ITEM(drawControlMenu); #if HAS_HOTEND - hotendTargetItem = EDIT_ITEM(ICON_SetEndTemp, MSG_UBL_SET_TEMP_HOTEND, onDrawHotendTemp, setHotendTemp, &thermalManager.temp_hotend[0].target); + hotendTargetItem = EDIT_ITEM(ICON_HotendTemp, MSG_UBL_SET_TEMP_HOTEND, onDrawHotendTemp, setHotendTemp, &thermalManager.temp_hotend[0].target); #endif #if HAS_HEATED_BED - bedTargetItem = EDIT_ITEM(ICON_SetBedTemp, MSG_UBL_SET_TEMP_BED, onDrawBedTemp, setBedTemp, &thermalManager.temp_bed.target); + bedTargetItem = EDIT_ITEM(ICON_BedTemp, MSG_UBL_SET_TEMP_BED, onDrawBedTemp, setBedTemp, &thermalManager.temp_bed.target); #endif #if HAS_FAN fanSpeedItem = EDIT_ITEM(ICON_FanSpeed, MSG_FAN_SPEED, onDrawFanSpeed, setFanSpeed, &thermalManager.fan_speed[0]); @@ -3844,101 +3872,137 @@ void drawMaxAccelMenu() { #endif // MPC_EDIT_MENU || MPC_AUTOTUNE_MENU -#if PROUI_PID_TUNE - void setPID(celsius_t t, heater_id_t h) { - gcode.process_subcommands_now( - MString<60>(F("G28OXY\nG0Z5F300\nG0X"), X_CENTER, F("Y"), Y_CENTER, F("F5000\nM84\nM400")) - ); - thermalManager.PID_autotune(t, h, hmiData.pidCycles, true); - } - void setPidCycles() { setPIntOnClick(3, 50); } -#endif - -#if ALL(HAS_PID_HEATING, PID_EDIT_MENU) - - void setKp() { setPFloatOnClick(0, 1000, 2); } - void applyPIDi() { - *menuData.floatPtr = scalePID_i(menuData.value / POW(10, 2)); - TERN_(PIDTEMP, thermalManager.updatePID()); - } - void applyPIDd() { - *menuData.floatPtr = scalePID_d(menuData.value / POW(10, 2)); - TERN_(PIDTEMP, thermalManager.updatePID()); - } - void setKi() { - menuData.floatPtr = (float*)static_cast(currentMenu->selectedItem())->value; - const float value = unscalePID_i(*menuData.floatPtr); - setFloatOnClick(0, 1000, 2, value, applyPIDi); - } - void setKd() { - menuData.floatPtr = (float*)static_cast(currentMenu->selectedItem())->value; - const float value = unscalePID_d(*menuData.floatPtr); - setFloatOnClick(0, 1000, 2, value, applyPIDd); - } - void onDrawPIDi(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_i(*(float*)static_cast(menuitem)->value)); } - void onDrawPIDd(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_d(*(float*)static_cast(menuitem)->value)); } - -#endif // HAS_PID_HEATING && PID_EDIT_MENU - -#if ENABLED(PIDTEMP) && ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) +#if HAS_PID_HEATING #if ENABLED(PID_AUTOTUNE_MENU) - void hotendPID() { setPID(hmiData.hotendPidT, H_E0); } - void setHotendPidT() { setPIntOnClick(MIN_ETEMP, MAX_ETEMP); } + void setPID(celsius_t t, heater_id_t h) { + gcode.process_subcommands_now( + MString<60>(F("G28OXY\nG0Z5F300\nG0X"), X_CENTER, F("Y"), Y_CENTER, F("F5000\nM84\nM400")) + ); + thermalManager.PID_autotune(t, h, hmiData.pidCycles, true); + } + void setPIDCycles() { setPIntOnClick(3, 50); } #endif - void drawHotendPIDMenu() { - checkkey = ID_Menu; - if (SET_MENU_F(hotendPIDMenu, STR_HOTEND_PID " Settings", 8)) { - BACK_ITEM(drawAdvancedSettingsMenu); - #if ENABLED(PID_AUTOTUNE_MENU) - MENU_ITEM_F(ICON_PIDNozzle, STR_HOTEND_PID, onDrawMenuItem, hotendPID); - EDIT_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawPIntMenu, setHotendPidT, &hmiData.hotendPidT); - EDIT_ITEM(ICON_PIDCycles, MSG_PID_CYCLE, onDrawPIntMenu, setPidCycles, &hmiData.pidCycles); - #endif - #if ENABLED(PID_EDIT_MENU) - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KP, onDrawPFloat2Menu, setKp, &thermalManager.temp_hotend[0].pid.Kp); - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KI, onDrawPIDi, setKi, &thermalManager.temp_hotend[0].pid.Ki); - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KD, onDrawPIDd, setKd, &thermalManager.temp_hotend[0].pid.Kd); - #endif - #if ENABLED(EEPROM_SETTINGS) - MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, writeEEPROM); - #endif + #if ENABLED(PID_EDIT_MENU) + void setKp() { setPFloatOnClick(0, 1000, 2); } + void applyPIDi() { + *menuData.floatPtr = scalePID_i(menuData.value / POW(10, 2)); + TERN_(PIDTEMP, thermalManager.updatePID()); } - updateMenu(hotendPIDMenu); - } - -#endif // PIDTEMP && (PID_AUTOTUNE_MENU || PID_EDIT_MENU) - -#if ENABLED(PIDTEMPBED) && ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) - - #if ENABLED(PID_AUTOTUNE_MENU) - void bedPID() { setPID(hmiData.bedPidT, H_BED); } - void setBedPidT() { setPIntOnClick(MIN_BEDTEMP, MAX_BEDTEMP); } - #endif - - void drawBedPIDMenu() { - checkkey = ID_Menu; - if (SET_MENU_F(bedPIDMenu, STR_BED_PID " Settings", 8)) { - BACK_ITEM(drawAdvancedSettingsMenu); - #if ENABLED(PID_AUTOTUNE_MENU) - MENU_ITEM_F(ICON_PIDBed, STR_BED_PID, onDrawMenuItem,bedPID); - EDIT_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawPIntMenu, setBedPidT, &hmiData.bedPidT); - EDIT_ITEM(ICON_PIDCycles, MSG_PID_CYCLE, onDrawPIntMenu, setPidCycles, &hmiData.pidCycles); - #endif - #if ENABLED(PID_EDIT_MENU) - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KP, onDrawPFloat2Menu, setKp, &thermalManager.temp_bed.pid.Kp); - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KI, onDrawPIDi, setKi, &thermalManager.temp_bed.pid.Ki); - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KD, onDrawPIDd, setKd, &thermalManager.temp_bed.pid.Kd); - #endif - #if ENABLED(EEPROM_SETTINGS) - MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, writeEEPROM); - #endif + void applyPIDd() { + *menuData.floatPtr = scalePID_d(menuData.value / POW(10, 2)); + TERN_(PIDTEMP, thermalManager.updatePID()); } - updateMenu(bedPIDMenu); - } + void setKi() { + menuData.floatPtr = (float*)static_cast(currentMenu->selectedItem())->value; + const float value = unscalePID_i(*menuData.floatPtr); + setFloatOnClick(0, 1000, 2, value, applyPIDi); + } + void setKd() { + menuData.floatPtr = (float*)static_cast(currentMenu->selectedItem())->value; + const float value = unscalePID_d(*menuData.floatPtr); + setFloatOnClick(0, 1000, 2, value, applyPIDd); + } + void onDrawPIDi(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_i(*(float*)static_cast(menuitem)->value)); } + void onDrawPIDd(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_d(*(float*)static_cast(menuitem)->value)); } + #endif // PID_EDIT_MENU -#endif // PIDTEMPBED && (PID_AUTOTUNE_MENU || PID_EDIT_MENU) +#endif // HAS_PID_HEATING + +#if ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) + + #if ENABLED(PIDTEMP) + + #if ENABLED(PID_AUTOTUNE_MENU) + void hotendPID() { setPID(hmiData.hotendPIDT, H_E0); } + void setHotendPIDT() { setPIntOnClick(MIN_ETEMP, MAX_ETEMP); } + #endif + + void drawHotendPIDMenu() { + checkkey = ID_Menu; + if (SET_MENU_F(hotendPIDMenu, STR_HOTEND_PID " Settings", 8)) { + BACK_ITEM(drawAdvancedSettingsMenu); + #if ENABLED(PID_AUTOTUNE_MENU) + MENU_ITEM_F(ICON_PIDNozzle, STR_HOTEND_PID, onDrawMenuItem, hotendPID); + EDIT_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawPIntMenu, setHotendPIDT, &hmiData.hotendPIDT); + EDIT_ITEM(ICON_PIDCycles, MSG_PID_CYCLE, onDrawPIntMenu, setPIDCycles, &hmiData.pidCycles); + #endif + #if ENABLED(PID_EDIT_MENU) + EDIT_ITEM_F(ICON_PIDValue, "Set Kp: ", onDrawPFloat2Menu, setKp, &thermalManager.temp_hotend[0].pid.Kp); + EDIT_ITEM_F(ICON_PIDValue, "Set Ki: ", onDrawPIDi, setKi, &thermalManager.temp_hotend[0].pid.Ki); + EDIT_ITEM_F(ICON_PIDValue, "Set Kd: ", onDrawPIDd, setKd, &thermalManager.temp_hotend[0].pid.Kd); + #endif + #if ENABLED(EEPROM_SETTINGS) + MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, writeEEPROM); + #endif + } + updateMenu(hotendPIDMenu); + } + + #endif // PIDTEMP + + #if ENABLED(PIDTEMPBED) + + #if ENABLED(PID_AUTOTUNE_MENU) + void bedPID() { setPID(hmiData.bedPIDT, H_BED); } + void setBedPIDT() { setPIntOnClick(MIN_BEDTEMP, MAX_BEDTEMP); } + #endif + + void drawBedPIDMenu() { + checkkey = ID_Menu; + if (SET_MENU_F(bedPIDMenu, STR_BED_PID " Settings", 8)) { + BACK_ITEM(drawAdvancedSettingsMenu); + #if ENABLED(PID_AUTOTUNE_MENU) + MENU_ITEM_F(ICON_PIDBed, STR_BED_PID, onDrawMenuItem,bedPID); + EDIT_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawPIntMenu, setBedPIDT, &hmiData.bedPIDT); + EDIT_ITEM(ICON_PIDCycles, MSG_PID_CYCLE, onDrawPIntMenu, setPIDCycles, &hmiData.pidCycles); + #endif + #if ENABLED(PID_EDIT_MENU) + EDIT_ITEM_F(ICON_PIDValue, "Set Kp: ", onDrawPFloat2Menu, setKp, &thermalManager.temp_bed.pid.Kp); + EDIT_ITEM_F(ICON_PIDValue, "Set Ki: ", onDrawPIDi, setKi, &thermalManager.temp_bed.pid.Ki); + EDIT_ITEM_F(ICON_PIDValue, "Set Kd: ", onDrawPIDd, setKd, &thermalManager.temp_bed.pid.Kd); + #endif + #if ENABLED(EEPROM_SETTINGS) + MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, writeEEPROM); + #endif + } + updateMenu(bedPIDMenu); + } + + #endif // PIDTEMPBED + + #if ENABLED(PIDTEMPCHAMBER) + + #if ENABLED(PID_AUTOTUNE_MENU) + void chamberPID() { setPID(hmiData.chamberPIDT, H_CHAMBER); } + void setChamberPIDT() { setPIntOnClick(MIN_CHAMBERTEMP, MAX_CHAMBERTEMP); } + #endif + + void drawChamberPIDMenu() { + checkkey = ID_Menu; + if (SET_MENU_F(chamberPIDMenu, STR_CHAMBER_PID " Settings", 8)) { + BACK_ITEM(drawAdvancedSettingsMenu); + #if ENABLED(PID_AUTOTUNE_MENU) + MENU_ITEM_F(ICON_PIDChamber, STR_CHAMBER_PID, onDrawMenuItem,chamberPID); + EDIT_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawPIntMenu, setChamberPIDT, &hmiData.chamberPIDT); + EDIT_ITEM(ICON_PIDCycles, MSG_PID_CYCLE, onDrawPIntMenu, setPIDCycles, &hmiData.pidCycles); + #endif + #if ENABLED(PID_EDIT_MENU) + EDIT_ITEM_F(ICON_PIDValue, "Set Kp: ", onDrawPFloat2Menu, setKp, &thermalManager.temp_chamber.pid.Kp); + EDIT_ITEM_F(ICON_PIDValue, "Set Ki: ", onDrawPIDi, setKi, &thermalManager.temp_chamber.pid.Ki); + EDIT_ITEM_F(ICON_PIDValue, "Set Kd: ", onDrawPIDd, setKd, &thermalManager.temp_chamber.pid.Kd); + #endif + #if ENABLED(EEPROM_SETTINGS) + MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, writeEEPROM); + #endif + } + updateMenu(chamberPIDMenu); + } + + #endif // PIDTEMPCHAMBER + +#endif // PID_AUTOTUNE_MENU || PID_EDIT_MENU //============================================================================= @@ -3949,7 +4013,7 @@ void drawMaxAccelMenu() { if (SET_MENU(zOffsetWizMenu, MSG_PROBE_WIZARD, 4)) { BACK_ITEM(drawPrepareMenu); MENU_ITEM(ICON_Homing, MSG_AUTO_HOME, onDrawMenuItem, autoHome); - MENU_ITEM(ICON_MoveZ0, MSG_MOVE_NOZZLE_TO_BED, onDrawMenuItem, setMoveZto0); + MENU_ITEM(ICON_AxisD, MSG_MOVE_NOZZLE_TO_BED, onDrawMenuItem, setMoveZto0); EDIT_ITEM(ICON_Zoffset, MSG_XATC_UPDATE_Z_OFFSET, onDrawPFloat2Menu, setZOffset, &BABY_Z_VAR); } updateMenu(zOffsetWizMenu); diff --git a/Marlin/src/lcd/e3v2/proui/dwin.h b/Marlin/src/lcd/e3v2/proui/dwin.h index 94b949b5e7..7d264b8b12 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.h +++ b/Marlin/src/lcd/e3v2/proui/dwin.h @@ -53,17 +53,16 @@ enum processID : uint8_t { ID_MainMenu, ID_Menu, ID_SetInt, - ID_SetPInt, - ID_SetIntNoDraw, ID_SetFloat, + ID_SetPInt, ID_SetPFloat, + ID_SetIntNoDraw, ID_PrintProcess, ID_Popup, ID_Leveling, ID_Locked, - ID_Reboot, - ID_PrintDone, ID_ESDiagProcess, + ID_PrintDone, ID_WaitResponse, ID_Homing, ID_PIDProcess, @@ -72,12 +71,20 @@ enum processID : uint8_t { ID_NothingToDo }; -#if ANY(PROUI_PID_TUNE, MPC_AUTOTUNE) +#if ANY(HAS_PID_HEATING, MPC_AUTOTUNE) - enum tempcontrol_t : uint8_t { - #if PROUI_PID_TUNE - PIDTEMP_START, - PIDTEMPBED_START, + enum TempControl { + AUTOTUNE_DONE, + #if HAS_PID_HEATING + #if ENABLED(PIDTEMP) + PIDTEMP_START, + #endif + #if ENABLED(PIDTEMPBED) + PIDTEMPBED_START, + #endif + #if ENABLED(PIDTEMPCHAMBER) + PIDTEMPCHAMBER_START, + #endif PID_BAD_HEATER_ID, PID_TEMP_TOO_HIGH, PID_TUNING_TIMEOUT, @@ -87,9 +94,11 @@ enum processID : uint8_t { MPC_TEMP_ERROR, MPC_INTERRUPTED, #endif - AUTOTUNE_DONE + TEMPCONTROL_COUNT }; + typedef bits_t(TEMPCONTROL_COUNT) tempcontrol_t; + #endif #define DWIN_CHINESE 123 @@ -117,20 +126,23 @@ typedef struct { uint16_t colorCoordinate; // Temperatures - #if PROUI_PID_TUNE + #if HAS_PID_HEATING int16_t pidCycles = DEF_PIDCYCLES; #if ENABLED(PIDTEMP) - int16_t hotendPidT = DEF_HOTENDPIDT; + celsius_t hotendPIDT = DEF_HOTENDPIDT; #endif #if ENABLED(PIDTEMPBED) - int16_t bedPidT = DEF_BEDPIDT; + celsius_t bedPIDT = DEF_BEDPIDT; + #endif + #if ENABLED(PIDTEMPCHAMBER) + celsius_t chamberPIDT = DEF_CHAMBERPIDT; #endif #endif #if ENABLED(PREVENT_COLD_EXTRUSION) - int16_t extMinT = EXTRUDE_MINTEMP; + celsius_t extMinT = EXTRUDE_MINTEMP; #endif #if ENABLED(PREHEAT_BEFORE_LEVELING) - int16_t bedLevT = LEVELING_BED_TEMP; + celsius_t bedLevT = LEVELING_BED_TEMP; #endif #if ENABLED(BAUD_RATE_GCODE) bool baud115K = false; @@ -144,20 +156,19 @@ typedef struct { bool mediaAutoMount = ENABLED(HAS_SD_EXTENDER); #if ALL(INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) uint8_t zAfterHoming = DEF_Z_AFTER_HOMING; + #define Z_POST_CLEARANCE hmiData.zAfterHoming #endif #if ALL(LED_CONTROL_MENU, HAS_COLOR_LEDS) LEDColor ledColor = defColorLeds; #endif - #if ENABLED(ADAPTIVE_STEP_SMOOTHING) - bool adaptiveStepSmoothing = true; - #endif #if HAS_GCODE_PREVIEW bool enablePreview = true; #endif } hmi_data_t; extern hmi_data_t hmiData; -static constexpr size_t eeprom_data_size = sizeof(hmi_data_t); + +#define EXTUI_EEPROM_DATA_SIZE sizeof(hmi_data_t) typedef struct { int8_t r, g, b; @@ -174,7 +185,7 @@ typedef struct { typedef struct { rgb_t color; // Color - #if ANY(PROUI_PID_TUNE, MPCTEMP) + #if ANY(HAS_PID_HEATING, MPCTEMP) tempcontrol_t tempControl = AUTOTUNE_DONE; #endif uint8_t select = 0; // Auxiliary selector variable @@ -196,8 +207,8 @@ extern hmi_flag_t hmiFlag; extern uint8_t checkkey; // Popups -#if HAS_HOTEND || HAS_HEATED_BED - void dwinPopupTemperature(const bool toohigh); +#if HAS_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER + void dwinPopupTemperature(const int_fast8_t heater_id, const uint8_t state); #endif #if ENABLED(POWER_LOSS_RECOVERY) void popupPowerLossRecovery(); @@ -288,7 +299,7 @@ void dwinPrintAborted(); #if HAS_FILAMENT_SENSOR void dwinFilamentRunout(const uint8_t extruder); #endif -void dwinPrintHeader(const char *text); +void dwinPrintHeader(const char * const cstr=nullptr); void dwinSetColorDefaults(); void dwinCopySettingsTo(char * const buff); void dwinCopySettingsFrom(const char * const buff); @@ -313,6 +324,11 @@ void dwinRebootScreen(); #if HAS_ESDIAG void drawEndStopDiag(); #endif +#if ALL(PROUI_TUNING_GRAPH, PROUI_ITEM_PLOT) + void dwinDrawPlot(tempcontrol_t result); + void drawHPlot(); + void drawBPlot(); +#endif // Menu drawing functions void drawPrintFileMenu(); @@ -376,28 +392,29 @@ void drawMaxAccelMenu(); #endif // PID -#if PROUI_PID_TUNE +#if HAS_PID_HEATING #include "../../../module/temperature.h" - void dwinStartM303(const bool seenC, const int c, const bool seenS, const heater_id_t hid, const celsius_t temp); - void dwinPidTuning(tempcontrol_t result); - #if PROUI_TUNING_GRAPH - void dwinDrawPIDMPCPopup(); - #endif -#endif -#if ENABLED(PIDTEMP) - #if ENABLED(PID_AUTOTUNE_MENU) - void hotendPID(); - #endif + void dwinStartM303(const int count, const heater_id_t hid, const celsius_t temp); + void dwinPIDTuning(tempcontrol_t result); #if ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) - void drawHotendPIDMenu(); - #endif -#endif -#if ENABLED(PIDTEMPBED) - #if ENABLED(PID_AUTOTUNE_MENU) - void bedPID(); - #endif - #if ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) - void drawBedPIDMenu(); + #if ENABLED(PIDTEMP) + #if ENABLED(PID_AUTOTUNE_MENU) + void hotendPID(); + #endif + void drawHotendPIDMenu(); + #endif + #if ENABLED(PIDTEMPBED) + #if ENABLED(PID_AUTOTUNE_MENU) + void bedPID(); + #endif + void drawBedPIDMenu(); + #endif + #if ENABLED(PIDTEMPCHAMBER) + #if ENABLED(PID_AUTOTUNE_MENU) + void chamberPID(); + #endif + void drawChamberPIDMenu(); + #endif #endif #endif @@ -410,3 +427,7 @@ void drawMaxAccelMenu(); void dwinMPCTuning(tempcontrol_t result); #endif #endif + +#if PROUI_TUNING_GRAPH + void dwinDrawPIDMPCPopup(); +#endif diff --git a/Marlin/src/lcd/e3v2/proui/dwin_defines.h b/Marlin/src/lcd/e3v2/proui/dwin_defines.h index f7026ebc7d..f09d2bd625 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin_defines.h +++ b/Marlin/src/lcd/e3v2/proui/dwin_defines.h @@ -30,6 +30,10 @@ #include "../../../inc/MarlinConfigPre.h" +//#define TJC_DISPLAY // Enable for TJC display +//#define DACAI_DISPLAY // Enable for DACAI display +//#define TITLE_CENTERED // Center Menu Title Text + #if HAS_MESH #define PROUI_MESH_EDIT // Add a menu to edit mesh points #if ENABLED(PROUI_MESH_EDIT) @@ -96,6 +100,11 @@ #else #define DEF_BEDPIDT 60 #endif +#ifdef PREHEAT_1_TEMP_CHAMBER + #define DEF_CHAMBERPIDT PREHEAT_1_TEMP_CHAMBER +#else + #define DEF_CHAMBERPIDT 0 +#endif #define DEF_PIDCYCLES 5 /** @@ -113,7 +122,7 @@ #if ENABLED(LIN_ADVANCE) #define PROUI_ITEM_ADVK // Tune > Linear Advance #endif -#if ANY(PROUI_PID_TUNE, MPC_AUTOTUNE) && DISABLED(DISABLE_TUNING_GRAPH) +#if ANY(HAS_PID_HEATING, MPC_AUTOTUNE) && DISABLED(DISABLE_TUNING_GRAPH) #define PROUI_TUNING_GRAPH 1 #endif #if PROUI_TUNING_GRAPH diff --git a/Marlin/src/lcd/e3v2/proui/dwin_lcd.cpp b/Marlin/src/lcd/e3v2/proui/dwin_lcd.cpp index 7c71b8fc59..10e5388274 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin_lcd.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin_lcd.cpp @@ -52,14 +52,6 @@ void dwinDrawQR(uint8_t QR_Pixel, uint16_t x, uint16_t y, char *string) { dwinSend(i); } -// Draw an Icon with transparent background -// libID: Icon library ID -// picID: Icon ID -// x/y: Upper-left point -void dwinIconShow(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { - dwinIconShow(false, false, true, libID, picID, x, y); -} - // Copy area from current virtual display area to current screen // xStart/yStart: Upper-left of virtual area // xEnd/yEnd: Lower-right of virtual area @@ -134,21 +126,25 @@ void dwinWriteToMem(uint8_t mem, uint16_t addr, uint16_t length, uint8_t *data) } } -// Draw an Icon from SRAM without background transparency for DACAI Screens support -void DACAI_ICON_Show(uint16_t x, uint16_t y, uint16_t addr) { - NOMORE(x, DWIN_WIDTH - 1); - NOMORE(y, DWIN_HEIGHT - 1); - size_t i = 0; - dwinByte(i, 0x70); - dwinWord(i, x); - dwinWord(i, y); - dwinWord(i, addr); - dwinSend(i); -} +#if ENABLED(DACAI_DISPLAY) + + // Draw an Icon from SRAM without background transparency for DACAI Screens support + void dacaiIconShow(uint16_t x, uint16_t y, uint16_t addr) { + NOMORE(x, DWIN_WIDTH - 1); + NOMORE(y, DWIN_HEIGHT - 1); + size_t i = 0; + dwinByte(i, 0x70); + dwinWord(i, x); + dwinWord(i, y); + dwinWord(i, addr); + dwinSend(i); + } + +#endif void dwinIconShow(uint16_t x, uint16_t y, uint16_t addr) { #if ENABLED(DACAI_DISPLAY) - DACAI_ICON_Show(x, y, addr); + dacaiIconShow(x, y, addr); #else dwinIconShow(0, 0, 1, x, y, addr); #endif diff --git a/Marlin/src/lcd/e3v2/proui/dwinui.cpp b/Marlin/src/lcd/e3v2/proui/dwinui.cpp index 453e21a240..41eab78785 100644 --- a/Marlin/src/lcd/e3v2/proui/dwinui.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwinui.cpp @@ -209,7 +209,7 @@ void DWINUI::drawFloat(uint8_t bShow, bool signedMode, fontid_t fid, uint16_t co // libID: Icon library ID // picID: Icon ID // x/y: Upper-left point -void DWINUI::ICON_Show(bool BG, uint8_t icon, uint16_t x, uint16_t y) { +void DWINUI::iconShow(bool BG, uint8_t icon, uint16_t x, uint16_t y) { const uint8_t libID = ICON TERN_(HAS_CUSTOMICONS, + (icon / 100)); const uint8_t picID = icon TERN_(HAS_CUSTOMICONS, % 100); dwinIconShow(BG, false, !BG, libID, picID, x, y); diff --git a/Marlin/src/lcd/e3v2/proui/dwinui.h b/Marlin/src/lcd/e3v2/proui/dwinui.h index b0ff00c527..27825b0869 100644 --- a/Marlin/src/lcd/e3v2/proui/dwinui.h +++ b/Marlin/src/lcd/e3v2/proui/dwinui.h @@ -36,14 +36,28 @@ #include "dwin_lcd.h" // Extra Icons +#define ICON_Printer_0 93 +#define ICON_Box 200 +#define ICON_Checkbox 201 +#define ICON_Fade 202 +#define ICON_Mesh 203 +#define ICON_Tilt 204 +#define ICON_Brightness 205 +#define ICON_Probe 206 +#define ICON_AxisD 249 +#define ICON_AxisBR 250 +#define ICON_AxisTR 251 +#define ICON_AxisBL 252 +#define ICON_AxisTL 253 +#define ICON_AxisC 254 + #define ICON_BedSizeX ICON_PrintSize #define ICON_BedSizeY ICON_PrintSize #define ICON_BedTramming ICON_SetHome #define ICON_Binary ICON_Contact -#define ICON_BltouchReset ICON_StockConfiguration -#define ICON_Brightness ICON_Motion +#define ICON_BLTouchReset ICON_ResetEEPROM #define ICON_Cancel ICON_StockConfiguration -#define ICON_CustomPreheat ICON_SetEndTemp +#define ICON_CustomPreheat ICON_BedTemp #define ICON_Error ICON_TempTooHigh #define ICON_esDiag ICON_Info #define ICON_ExtrudeMinT ICON_HotendTemp @@ -55,28 +69,27 @@ #define ICON_HomeX ICON_MoveX #define ICON_HomeY ICON_MoveY #define ICON_HomeZ ICON_MoveZ -#define ICON_HSMode ICON_StockConfiguration +#define ICON_HSMode ICON_MaxAccZ #define ICON_InputShaping ICON_MaxAccelerated #define ICON_JDmm ICON_MaxJerk -#define ICON_Tram ICON_SetEndTemp -#define ICON_Level ICON_HotendTemp -#define ICON_Lock ICON_Cool -#define ICON_ManualMesh ICON_HotendTemp +#define ICON_Level ICON_Mesh +#define ICON_Lock ICON_Checkbox +#define ICON_ManualMesh ICON_Mesh #define ICON_MaxPosX ICON_MoveX #define ICON_MaxPosY ICON_MoveY #define ICON_MaxPosZ ICON_MoveZ -#define ICON_MeshEdit ICON_Homing +#define ICON_MeshEdit ICON_Fade #define ICON_MeshEditX ICON_MoveX #define ICON_MeshEditY ICON_MoveY -#define ICON_MeshEditZ ICON_MoveZ -#define ICON_MeshNext ICON_Axis -#define ICON_MeshPoints ICON_SetEndTemp -#define ICON_MeshReset ICON_StockConfiguration +#define ICON_MeshEditZ ICON_Zoffset +#define ICON_MeshNext ICON_AxisD +#define ICON_MeshPoints ICON_HotendTemp +#define ICON_MeshReset ICON_ResetEEPROM #define ICON_MeshSave ICON_WriteEEPROM -#define ICON_MeshViewer ICON_HotendTemp -#define ICON_MoveZ0 ICON_HotendTemp -#define ICON_Park ICON_Motion -#define ICON_ParkPos ICON_AdvSet +#define ICON_MeshViewer ICON_Mesh +#define ICON_MoveZ0 ICON_CloseMotor +#define ICON_Park ICON_SetHome +#define ICON_ParkPos ICON_AxisC #define ICON_ParkPosX ICON_StepX #define ICON_ParkPosY ICON_StepY #define ICON_ParkPosZ ICON_StepZ @@ -95,18 +108,18 @@ #define ICON_Preheat8 ICON_CustomPreheat #define ICON_Preheat9 ICON_CustomPreheat #define ICON_Preheat10 ICON_CustomPreheat -#define ICON_ProbeDeploy ICON_SetEndTemp +#define ICON_ProbeDeploy ICON_Probe #define ICON_ProbeMargin ICON_PrintSize #define ICON_ProbeSet ICON_SetEndTemp -#define ICON_ProbeStow ICON_SetEndTemp -#define ICON_ProbeTest ICON_SetEndTemp +#define ICON_ProbeStow ICON_Tilt +#define ICON_ProbeTest ICON_Zoffset #define ICON_ProbeZSpeed ICON_MaxSpeedZ #define ICON_Pwrlossr ICON_Motion #define ICON_Reboot ICON_ResetEEPROM #define ICON_Runout ICON_MaxAccE #define ICON_Scolor ICON_MaxSpeed #define ICON_SetBaudRate ICON_Setspeed -#define ICON_SetCustomPreheat ICON_SetEndTemp +#define ICON_SetCustomPreheat ICON_BedTemp #define ICON_SetPreheat1 ICON_SetPLAPreheat #define ICON_SetPreheat2 ICON_SetABSPreheat #define ICON_SetPreheat3 ICON_SetCustomPreheat @@ -125,22 +138,24 @@ #define ICON_TMCYSet ICON_MoveY #define ICON_TMCZSet ICON_MoveZ #define ICON_TMCESet ICON_Extruder -#define ICON_UBLActive ICON_HotendTemp +#define ICON_Tram ICON_Step +#define ICON_UBLActive ICON_Fade #define ICON_UBLSlot ICON_ResetEEPROM #define ICON_UBLMeshSave ICON_WriteEEPROM #define ICON_UBLMeshLoad ICON_ReadEEPROM -#define ICON_UBLTiltGrid ICON_PrintSize #define ICON_UBLSmartFill ICON_StockConfiguration -#define ICON_ZAfterHome ICON_SetEndTemp +#define ICON_UBLTiltGrid ICON_Tilt +#define ICON_ZAfterHome ICON_Tilt +// LED Lights #define ICON_CaseLight ICON_Motion #define ICON_LedControl ICON_Motion // MPC -#define ICON_MPCNozzle ICON_SetEndTemp +#define ICON_MPCNozzle ICON_HotendTemp #define ICON_MPCValue ICON_Contact #define ICON_MPCHeater ICON_Temperature -#define ICON_MPCHeatCap ICON_SetBedTemp +#define ICON_MPCHeatCap ICON_BedTemp #define ICON_MPCFan ICON_FanSpeed // Buttons @@ -300,20 +315,20 @@ namespace DWINUI { // libID: Icon library ID // picID: Icon ID // x/y: Upper-left point - void ICON_Show(bool BG, uint8_t icon, uint16_t x, uint16_t y); + void iconShow(bool BG, uint8_t icon, uint16_t x, uint16_t y); // Draw an Icon with transparent background from the library ICON // icon: Icon ID // x/y: Upper-left point inline void drawIcon(uint8_t icon, uint16_t x, uint16_t y) { - ICON_Show(false, icon, x, y); + iconShow(false, icon, x, y); } // Draw an Icon from the library ICON with its background // icon: Icon ID // x/y: Upper-left point inline void drawIconWB(uint8_t icon, uint16_t x, uint16_t y) { - ICON_Show(true, icon, x, y); + iconShow(true, icon, x, y); } // Draw a numeric integer value @@ -486,6 +501,9 @@ namespace DWINUI { // y: Upper coordinate of the string // *string: The string void drawCenteredString(bool bShow, fontid_t fid, uint16_t color, uint16_t bColor, uint16_t x1, uint16_t x2, uint16_t y, const char * const string); + inline void drawCenteredString(bool bShow, fontid_t fid, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, const char * const string) { + drawCenteredString(bShow, fid, color, bColor, 2 * x, 0, y, string); + } inline void drawCenteredString(bool bShow, fontid_t fid, uint16_t color, uint16_t bColor, uint16_t y, const char * const string) { drawCenteredString(bShow, fid, color, bColor, 0, DWIN_WIDTH, y, string); } diff --git a/Marlin/src/lcd/e3v2/proui/proui_extui.cpp b/Marlin/src/lcd/e3v2/proui/proui_extui.cpp new file mode 100644 index 0000000000..d377ca5fdc --- /dev/null +++ b/Marlin/src/lcd/e3v2/proui/proui_extui.cpp @@ -0,0 +1,246 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2024 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/********************* + * proui_extui.cpp * + *********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(DWIN_LCD_PROUI) + +#include "dwin_popup.h" + +#include "../../extui/ui_api.h" +#include "../../../module/stepper.h" + +#if ENABLED(PREVENT_COLD_EXTRUSION) + #include "../../../module/temperature.h" +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../feature/powerloss.h" +#endif + +namespace ExtUI { + + void onStartup() { dwinInitScreen(); } + + void onIdle() {} + void onPrinterKilled(FSTR_P const error, FSTR_P const component) {} + + void onMediaInserted() {} + void onMediaError() {} + void onMediaRemoved() {} + + void onHeatingError(const heater_id_t heater_id) { + dwinPopupTemperature(heater_id, 2); // "Heating failed" + } + void onMinTempError(const heater_id_t heater_id) { + dwinPopupTemperature(heater_id, 0); // "Too low" + } + void onMaxTempError(const heater_id_t heater_id) { + dwinPopupTemperature(heater_id, 1); // "Too high" + } + + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) {} + void onPrintTimerStarted() {} + void onPrintTimerPaused() {} + void onPrintTimerStopped() {} + + #if HAS_FILAMENT_SENSOR + void onFilamentRunout(const extruder_t extruder) { + dwinFilamentRunout(extruder); + } + #endif + + void onUserConfirmRequired(const char * const cstr) { + // TODO: A version of this method that takes an icon and button title, + // or implement some kind of ExtUI enum. + onUserConfirmRequired(ICON_Continue_1, cstr, GET_TEXT_F(MSG_USERWAIT)); + } + + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + dwinPopupConfirm(icon, cstr, fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + dwinPopupConfirm(icon, fstr, fBtn); + } + + void onStatusChanged(const char * const) { dwinCheckStatusMessage(); } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode(const PauseMessage message, const PauseMode mode/*=PAUSE_MODE_SAME*/, const uint8_t extruder/*=active_extruder*/) { + if (mode != PAUSE_MODE_SAME) pause_mode = mode; + switch (message) { + case PAUSE_MESSAGE_PARKING: dwinPopupPause(GET_TEXT_F(MSG_PAUSE_PRINT_PARKING)); break; // M125 + case PAUSE_MESSAGE_CHANGING: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_INIT)); break; // pause_print (M125, M600) + case PAUSE_MESSAGE_WAITING: dwinPopupPause(GET_TEXT_F(MSG_ADVANCED_PAUSE_WAITING), BTN_Continue); break; + case PAUSE_MESSAGE_INSERT: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_INSERT), BTN_Continue); break; + case PAUSE_MESSAGE_LOAD: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_LOAD)); break; + case PAUSE_MESSAGE_UNLOAD: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_UNLOAD)); break; // Unload of pause and Unload of M702 + case PAUSE_MESSAGE_PURGE: dwinPopupPause(GET_TEXT_F(TERN(ADVANCED_PAUSE_CONTINUOUS_PURGE, MSG_FILAMENT_CHANGE_CONT_PURGE, MSG_FILAMENT_CHANGE_PURGE))); break; + case PAUSE_MESSAGE_OPTION: gotoFilamentPurge(); break; + case PAUSE_MESSAGE_RESUME: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_RESUME)); break; + case PAUSE_MESSAGE_HEAT: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEAT), BTN_Continue); break; + case PAUSE_MESSAGE_HEATING: dwinPopupPause(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEATING)); break; + case PAUSE_MESSAGE_STATUS: hmiReturnScreen(); break; // Exit from Pause, Load and Unload + default: break; + } + } + #endif + + void onHomingStart() { dwinHomingStart(); } + void onHomingDone() { dwinHomingDone(); } + + void onPrintDone() {} + + void onFactoryReset() { dwinSetDataDefaults(); } + + // Copy settings to EEPROM buffer for write + void onStoreSettings(char *buff) { dwinCopySettingsTo(buff); } + + // Get settings from loaded EEPROM data + void onLoadSettings(const char *buff) { dwinCopySettingsFrom(buff); } + + void onPostprocessSettings() { + // Called after loading or resetting stored settings + } + + void onSettingsStored(const bool success) { + // Called after the entire EEPROM has been written, + // whether successful or not. + } + + void onSettingsLoaded(const bool success) { + // Called after the entire EEPROM has been read, + // whether successful or not. + } + + #if HAS_LEVELING + void onLevelingStart() { dwinLevelingStart(); } + void onLevelingDone() { dwinLevelingDone(); } + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return hmiData.bedLevT; } + #endif + #endif + + #if HAS_MESH + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { + const int16_t idx = ypos * (GRID_MAX_POINTS_X) + xpos; + dwinMeshUpdate(_MIN(idx, GRID_MAX_POINTS), int(GRID_MAX_POINTS), zval); + dwinRedrawScreen(); + } + + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const probe_state_t state) { + // Called to indicate a special condition + } + #endif + + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t t) { hmiData.extMinT = t; } + #endif + + #if ENABLED(POWER_LOSS_RECOVERY) + void onSetPowerLoss(const bool onoff) { + // Called when power-loss is enabled/disabled + } + void onPowerLoss() { + // Called when power-loss state is detected + } + void onPowerLossResume() { + // Called on resume from power-loss + recovery.ui_flag_resume = true; + } + #endif + + #if HAS_PID_HEATING + void onPIDTuning(const pidresult_t rst) { + // Called for temperature PID tuning result + switch (rst) { + #if ENABLED(PIDTEMP) + case PID_STARTED: dwinPIDTuning(PIDTEMP_START); break; + #endif + #if ENABLED(PIDTEMPBED) + case PID_BED_STARTED: dwinPIDTuning(PIDTEMPBED_START); break; + #endif + #if ENABLED(PIDTEMPCHAMBER) + case PID_CHAMBER_STARTED: dwinPIDTuning(PIDTEMPCHAMBER_START); break; + #endif + case PID_BAD_HEATER_ID: dwinPIDTuning(tempcontrol_t(PID_BAD_HEATER_ID)); break; + case PID_TEMP_TOO_HIGH: dwinPIDTuning(tempcontrol_t(PID_TEMP_TOO_HIGH)); break; + case PID_TUNING_TIMEOUT: dwinPIDTuning(tempcontrol_t(PID_TUNING_TIMEOUT)); break; + case PID_DONE: dwinPIDTuning(AUTOTUNE_DONE); break; + + } + } + + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + dwinStartM303(count, hid, temp); + } + + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature MPC tuning result + switch (rst) { + case MPC_STARTED: dwinMPCTuning(MPCTEMP_START); break; + case MPC_TEMP_ERROR: dwinMPCTuning(MPC_TEMP_ERROR); break; + case MPC_INTERRUPTED: dwinMPCTuning(MPC_INTERRUPTED); break; + case MPC_DONE: dwinMPCTuning(AUTOTUNE_DONE); break; + } + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() { dwinRebootScreen(); } + #endif + + void onSteppersDisabled() {} + void onSteppersEnabled() {} + void onAxisDisabled(const axis_t axis) { + set_axis_untrusted(AxisEnum(axis)); // MRISCOC workaround: https://github.com/MarlinFirmware/Marlin/issues/23095 + } + void onAxisEnabled(const axis_t) {} + +} // ExtUI + +#endif // DWIN_LCD_PROUI diff --git a/Marlin/src/lcd/extui/anycubic_chiron/chiron_extui.cpp b/Marlin/src/lcd/extui/anycubic_chiron/chiron_extui.cpp index 268111b6cb..78a8ffa3a2 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron/chiron_extui.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron/chiron_extui.cpp @@ -49,6 +49,10 @@ namespace ExtUI { void onMediaError() { chiron.mediaEvent(AC_media_error); } void onMediaRemoved() { chiron.mediaEvent(AC_media_removed); } + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) { #if ENABLED(SPEAKER) ::tone(BEEPER_PIN, frequency, duration); @@ -65,6 +69,26 @@ namespace ExtUI { void onUserConfirmRequired(const char * const msg) { chiron.confirmationRequest(msg); } + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(fstr); + UNUSED(icon); UNUSED(fBtn); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + void onStatusChanged(const char * const msg) { chiron.statusChange(msg); } void onHomingStart() {} @@ -109,6 +133,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -123,6 +150,10 @@ namespace ExtUI { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -135,13 +166,28 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature MPC tuning result + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onSteppersDisabled() {} void onSteppersEnabled() {} + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_extui.cpp b/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_extui.cpp index ef02664dac..79738fab10 100644 --- a/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_extui.cpp +++ b/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_extui.cpp @@ -43,6 +43,10 @@ namespace ExtUI { void onMediaError() { anycubicTFT.onSDCardError(); } void onMediaRemoved() { anycubicTFT.onSDCardStateChange(false); } + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) { TERN_(SPEAKER, ::tone(BEEPER_PIN, frequency, duration)); } @@ -53,6 +57,26 @@ namespace ExtUI { void onFilamentRunout(const extruder_t extruder) { anycubicTFT.onFilamentRunout(); } void onUserConfirmRequired(const char * const msg) { anycubicTFT.onUserConfirmRequired(msg); } + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(fstr); + UNUSED(icon); UNUSED(fBtn); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + void onStatusChanged(const char * const msg) {} void onHomingStart() {} @@ -99,6 +123,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -111,6 +138,10 @@ namespace ExtUI { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -124,13 +155,28 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature MPC tuning result + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onSteppersDisabled() {} void onSteppersEnabled() {} + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // ANYCUBIC_LCD_I3MEGA diff --git a/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp b/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp index 85e7b28079..1bf13eafa3 100644 --- a/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp +++ b/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp @@ -49,6 +49,10 @@ namespace ExtUI { void onMediaError() { dgus.mediaEvent(AC_media_error); } void onMediaRemoved() { dgus.mediaEvent(AC_media_removed); } + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) { #if ENABLED(SPEAKER) ::tone(BEEPER_PIN, frequency, duration); @@ -65,6 +69,26 @@ namespace ExtUI { void onUserConfirmRequired(const char * const msg) { dgus.confirmationRequest(msg); } + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(fstr); + UNUSED(icon); UNUSED(fBtn); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + void onStatusChanged(const char * const msg) { dgus.statusChange(msg); } void onHomingStart() { dgus.homingStart(); } @@ -113,6 +137,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -137,20 +164,28 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result - switch (rst) { - case PID_STARTED: break; - case PID_BAD_HEATER_ID: break; - case PID_TEMP_TOO_HIGH: break; - case PID_TUNING_TIMEOUT: break; - case PID_DONE: break; - } } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature MPC tuning result + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onSteppersDisabled() {} void onSteppersEnabled() {} + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // ANYCUBIC_LCD_VYPER diff --git a/Marlin/src/lcd/extui/dgus/dgus_extui.cpp b/Marlin/src/lcd/extui/dgus/dgus_extui.cpp index 58aead6984..2bc6e0d461 100644 --- a/Marlin/src/lcd/extui/dgus/dgus_extui.cpp +++ b/Marlin/src/lcd/extui/dgus/dgus_extui.cpp @@ -52,6 +52,10 @@ namespace ExtUI { void onMediaError() { TERN_(HAS_MEDIA, screen.sdCardError()); } void onMediaRemoved() { TERN_(HAS_MEDIA, screen.sdCardRemoved()); } + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) {} void onPrintTimerStarted() {} void onPrintTimerPaused() {} @@ -70,6 +74,26 @@ namespace ExtUI { } } + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(fstr); + UNUSED(icon); UNUSED(fBtn); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + void onStatusChanged(const char * const msg) { screen.setStatusMessage(msg); } void onHomingStart() {} @@ -116,6 +140,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -128,6 +155,10 @@ namespace ExtUI { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -142,11 +173,12 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result switch (rst) { case PID_STARTED: case PID_BED_STARTED: + case PID_CHAMBER_STARTED: screen.setStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE)); break; case PID_BAD_HEATER_ID: @@ -164,10 +196,40 @@ namespace ExtUI { } screen.gotoScreen(DGUS_SCREEN_MAIN); } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature MPC tuning result + switch (rst) { + case MPC_STARTED: + screen.setStatusMessage(GET_TEXT_F(MSG_MPC_AUTOTUNE)); + break; + case MPC_TEMP_ERROR: + //screen.setStatusMessage(GET_TEXT_F(MSG_MPC_TEMP_ERROR)); + break; + case MPC_INTERRUPTED: + //screen.setStatusMessage(GET_TEXT_F(MSG_MPC_INTERRUPTED)); + break; + case MPC_DONE: + //screen.setStatusMessage(GET_TEXT_F(MSG_MPC_AUTOTUNE_DONE)); + break; + } + screen.gotoScreen(DGUS_SCREEN_MAIN); + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onSteppersDisabled() {} void onSteppersEnabled() {} + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // HAS_DGUS_LCD_CLASSIC diff --git a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.cpp index 58313e4333..c88412fe2c 100644 --- a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.cpp @@ -369,7 +369,7 @@ void DGUSScreenHandler::addCurrentPageStringLength(size_t stringLength, size_t t #endif #if HAS_PID_HEATING - void DGUSScreenHandler::pidTuning(const ExtUI::result_t rst) { + void DGUSScreenHandler::pidTuning(const ExtUI::pidresult_t rst) { dgus.playSound(3); } #endif diff --git a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.h b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.h index a5f053043c..2f8c53f14d 100644 --- a/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/dgus_e3s1pro/DGUSScreenHandler.h @@ -132,7 +132,7 @@ public: #endif #if HAS_PID_HEATING - static void pidTuning(const ExtUI::result_t rst); + static void pidTuning(const ExtUI::pidresult_t rst); #endif static void steppersStatusChanged(bool steppersEnabled); diff --git a/Marlin/src/lcd/extui/dgus_e3s1pro/dgus_e3s1pro_extui.cpp b/Marlin/src/lcd/extui/dgus_e3s1pro/dgus_e3s1pro_extui.cpp index 41f5b41d49..f3f4ff961c 100644 --- a/Marlin/src/lcd/extui/dgus_e3s1pro/dgus_e3s1pro_extui.cpp +++ b/Marlin/src/lcd/extui/dgus_e3s1pro/dgus_e3s1pro_extui.cpp @@ -59,6 +59,10 @@ namespace ExtUI { void onMediaError() { TERN_(HAS_MEDIA, screen.sdCardError()); } void onMediaRemoved() { TERN_(HAS_MEDIA, screen.sdCardRemoved()); } + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) { screen.playTone(frequency, duration); } @@ -83,6 +87,26 @@ namespace ExtUI { screen.userConfirmRequired(msg); } + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(fstr); + UNUSED(icon); UNUSED(fBtn); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + void onStatusChanged(const char * const msg) { screen.setStatusMessage(msg); } @@ -120,6 +144,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() { screen.levelingStart(); } void onLevelingDone() { screen.levelingEnd(); } + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -129,6 +156,10 @@ namespace ExtUI { void onMeshUpdate(const int8_t xpos, const int8_t ypos, const probe_state_t state) { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -143,10 +174,23 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result screen.pidTuning(rst); } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature PID tuning result + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onSteppersDisabled() { @@ -156,6 +200,9 @@ namespace ExtUI { void onSteppersEnabled() { screen.steppersStatusChanged(true); } + + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // DGUS_LCD_UI_RELOADED diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp index c953b417a5..b8ef8bcacc 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp @@ -598,7 +598,7 @@ void DGUSRxHandler::filamentMove(DGUS_VP &vp, void *data_ptr) { } if (ExtUI::getActualTemp_celsius(extruder) < (float)EXTRUDE_MINTEMP) { - screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_TEMP_TOO_LOW)); + screen.setStatusMessage(GET_TEXT_F(MSG_TEMP_TOO_LOW)); return; } diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp index aaef68632a..181d1ae34c 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp @@ -305,10 +305,11 @@ void DGUSScreenHandler::filamentRunout(const ExtUI::extruder_t extruder) { #if HAS_PID_HEATING - void DGUSScreenHandler::pidTuning(const ExtUI::result_t rst) { + void DGUSScreenHandler::pidTuning(const ExtUI::pidresult_t rst) { switch (rst) { case ExtUI::PID_STARTED: case ExtUI::PID_BED_STARTED: + case ExtUI::PID_CHAMBER_STARTED: setStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE)); break; case ExtUI::PID_BAD_HEATER_ID: diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.h b/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.h index 2cffd55e23..ed8b163d87 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.h @@ -66,7 +66,7 @@ public: #endif #if HAS_PID_HEATING - static void pidTuning(const ExtUI::result_t rst); + static void pidTuning(const ExtUI::pidresult_t rst); #endif static void setMessageLine(const char * const msg, const uint8_t line); diff --git a/Marlin/src/lcd/extui/dgus_reloaded/dgus_reloaded_extui.cpp b/Marlin/src/lcd/extui/dgus_reloaded/dgus_reloaded_extui.cpp index 1c62bee9d5..fad878a212 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/dgus_reloaded_extui.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/dgus_reloaded_extui.cpp @@ -54,6 +54,10 @@ namespace ExtUI { void onMediaError() { TERN_(HAS_MEDIA, screen.sdCardError()); } void onMediaRemoved() { TERN_(HAS_MEDIA, screen.sdCardRemoved()); } + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) { screen.playTone(frequency, duration); } @@ -78,6 +82,26 @@ namespace ExtUI { screen.userConfirmRequired(msg); } + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(fstr); + UNUSED(icon); UNUSED(fBtn); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + void onStatusChanged(const char * const msg) { screen.setStatusMessage(msg); } @@ -112,6 +136,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -125,6 +152,10 @@ namespace ExtUI { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -139,14 +170,29 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result screen.pidTuning(rst); } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature PID tuning result + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onSteppersDisabled() {} void onSteppersEnabled() {} + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // DGUS_LCD_UI_RELOADED diff --git a/Marlin/src/lcd/extui/example/example.cpp b/Marlin/src/lcd/extui/example/example.cpp index 7f9ff62de4..fb033b9655 100644 --- a/Marlin/src/lcd/extui/example/example.cpp +++ b/Marlin/src/lcd/extui/example/example.cpp @@ -52,6 +52,10 @@ namespace ExtUI { void onMediaError() {} void onMediaRemoved() {} + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) {} void onPrintTimerStarted() {} @@ -62,6 +66,20 @@ namespace ExtUI { void onUserConfirmRequired(const char * const msg) {} + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) {} + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) {} + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + void onStatusChanged(const char * const msg) {} void onHomingStart() {} @@ -108,6 +126,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -120,6 +141,10 @@ namespace ExtUI { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -133,21 +158,43 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result switch (rst) { case PID_STARTED: case PID_BED_STARTED: + case PID_CHAMBER_STARTED: break; case PID_BAD_HEATER_ID: break; case PID_TEMP_TOO_HIGH: break; case PID_TUNING_TIMEOUT: break; case PID_DONE: break; } } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature MPC tuning result + switch (rst) { + case MPC_STARTED: break; + case MPC_TEMP_ERROR: break; + case MPC_INTERRUPTED: break; + case MPC_DONE: break; + } + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onSteppersDisabled() {} void onSteppersEnabled() {} + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // EXTUI_EXAMPLE && EXTENSIBLE_UI diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp index 0dda4a977d..48c136bd6e 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp @@ -70,6 +70,10 @@ namespace ExtUI { #endif } + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onStatusChanged(const char *lcd_msg) { StatusScreen::setStatusMessage(lcd_msg); } void onPrintTimerStarted() { @@ -117,9 +121,32 @@ namespace ExtUI { ConfirmUserRequestAlertBox::hide(); } + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(fstr); + UNUSED(icon); UNUSED(fBtn); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -131,6 +158,10 @@ namespace ExtUI { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -144,12 +175,13 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result - //SERIAL_ECHOLNPGM("OnPidTuning:", rst); + //SERIAL_ECHOLNPGM("OnPIDTuning:", rst); switch (rst) { case PID_STARTED: case PID_BED_STARTED: + case PID_CHAMBER_STARTED: StatusScreen::setStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE)); break; case PID_BAD_HEATER_ID: @@ -167,10 +199,31 @@ namespace ExtUI { } GOTO_SCREEN(StatusScreen); } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } #endif // HAS_PID_HEATING + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature PID tuning result + switch (rst) { + case MPC_STARTED: + StatusScreen::setStatusMessage(GET_TEXT_F(MSG_MPC_AUTOTUNE)); + break; + } + GOTO_SCREEN(StatusScreen); + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} + #endif + void onSteppersDisabled() {} void onSteppersEnabled() {} + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp b/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp index af5d1c7ace..3440cf987d 100644 --- a/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp +++ b/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp @@ -98,6 +98,10 @@ void onMediaRemoved() { } } +void onHeatingError(const heater_id_t header_id) {} +void onMinTempError(const heater_id_t header_id) {} +void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t, const uint16_t/*=0*/) { rts.sendData(StartSoundSet, SoundAddr); } @@ -228,6 +232,26 @@ void onUserConfirmRequired(const char *const msg) { lastPauseMsgState = ExtUI::pauseModeStatus; } +// For fancy LCDs include an icon ID, message, and translated button title +void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); +} +void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(fstr); + UNUSED(icon); UNUSED(fBtn); +} + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } +#endif + void onStatusChanged(const char *const statMsg) { for (int16_t j = 0; j < 20; j++) // Clear old message rts.sendData(' ', StatusMessageString + j); @@ -356,6 +380,10 @@ void onPostprocessSettings() {} } #endif +#if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} +#endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -373,7 +401,7 @@ void onPostprocessSettings() {} #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result rts.sendData(pid_hotendAutoTemp, HotendPID_AutoTmp); rts.sendData(pid_bedAutoTemp, BedPID_AutoTmp); @@ -387,6 +415,19 @@ void onPostprocessSettings() {} #endif onStatusChanged(F("PID Tune Finished")); } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } +#endif + +#if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature PID tuning result + } +#endif + +#if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onHomingStart() {} @@ -396,6 +437,8 @@ void onPrintDone() {} void onSteppersDisabled() {} void onSteppersEnabled() {} +void onAxisDisabled(const axis_t) {} +void onAxisEnabled(const axis_t) {} } // ExtUI diff --git a/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp b/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp index 15810b67a5..797b80b0d5 100644 --- a/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp +++ b/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp @@ -163,21 +163,10 @@ void RTS::onIdle() { TERN_(HAS_MULTI_HOTEND, rts.sendData(uint8_t(getActiveTool() + 1), ActiveToolVP)); if (awaitingUserConfirm() && (lastPauseMsgState != ExtUI::pauseModeStatus || userConfValidation > 99)) { - switch (ExtUI::pauseModeStatus) { - case PAUSE_MESSAGE_PARKING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_PAUSE_PRINT_PARKING)); break; - case PAUSE_MESSAGE_CHANGING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_INIT)); break; - case PAUSE_MESSAGE_UNLOAD: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_UNLOAD)); break; - case PAUSE_MESSAGE_WAITING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_ADVANCED_PAUSE_WAITING)); break; - case PAUSE_MESSAGE_INSERT: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_INSERT)); break; - case PAUSE_MESSAGE_LOAD: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_LOAD)); break; - case PAUSE_MESSAGE_PURGE: ExtUI::onUserConfirmRequired(GET_TEXT_F(TERN(ADVANCED_PAUSE_CONTINUOUS_PURGE, MSG_FILAMENT_CHANGE_CONT_PURGE, MSG_FILAMENT_CHANGE_PURGE))); break; - case PAUSE_MESSAGE_RESUME: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_RESUME)); break; - case PAUSE_MESSAGE_HEAT: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEAT)); break; - case PAUSE_MESSAGE_HEATING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEATING)); break; - case PAUSE_MESSAGE_OPTION: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_OPTION_HEADER)); break; - case PAUSE_MESSAGE_STATUS: break; - default: onUserConfirmRequired(PSTR("Confirm Continue")); break; - } + if (ExtUI::pauseModeStatus < PAUSE_MESSAGE_COUNT) + ui.pause_show_message(ExtUI::pauseModeStatus); + else + ExtUI::onUserConfirmRequired(F("Confirm Continue")); userConfValidation = 0; } else if (pause_resume_selected && !awaitingUserConfirm()) { diff --git a/Marlin/src/lcd/extui/malyan/malyan_extui.cpp b/Marlin/src/lcd/extui/malyan/malyan_extui.cpp index 00bc173fb3..9287091cfe 100644 --- a/Marlin/src/lcd/extui/malyan/malyan_extui.cpp +++ b/Marlin/src/lcd/extui/malyan/malyan_extui.cpp @@ -104,12 +104,13 @@ namespace ExtUI { #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result - //SERIAL_ECHOLNPGM("OnPidTuning:", rst); + //SERIAL_ECHOLNPGM("OnPIDTuning:", rst); switch (rst) { case PID_STARTED: case PID_BED_STARTED: + case PID_CHAMBER_STARTED: set_lcd_error(GET_TEXT_F(MSG_PID_AUTOTUNE)); break; case PID_BAD_HEATER_ID: @@ -127,6 +128,10 @@ namespace ExtUI { } } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif void onPrintTimerStarted() { write_to_lcd(F("{SYS:BUILD}")); } @@ -140,11 +145,27 @@ namespace ExtUI { void onMediaError() {} void onMediaRemoved() {} + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t, const uint16_t/*=0*/) {} void onFilamentRunout(const extruder_t extruder) {} void onUserConfirmRequired(const char * const) {} + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) {} + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) {} + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) {} + #endif + void onHomingStart() {} void onHomingDone() {} @@ -160,6 +181,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -167,6 +191,10 @@ namespace ExtUI { void onMeshUpdate(const int8_t, const int8_t, const ExtUI::probe_state_t) {} #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -179,8 +207,20 @@ namespace ExtUI { } #endif + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature PID tuning result + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} + #endif + void onSteppersDisabled() {} void onSteppersEnabled() {} + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // MALYAN_LCD diff --git a/Marlin/src/lcd/extui/nextion/nextion_extui.cpp b/Marlin/src/lcd/extui/nextion/nextion_extui.cpp index fc86432097..e72167d380 100644 --- a/Marlin/src/lcd/extui/nextion/nextion_extui.cpp +++ b/Marlin/src/lcd/extui/nextion/nextion_extui.cpp @@ -43,6 +43,10 @@ namespace ExtUI { void onMediaError() {} void onMediaRemoved() {} + void onHeatingError(const heater_id_t header_id) {} + void onMinTempError(const heater_id_t header_id) {} + void onMaxTempError(const heater_id_t header_id) {} + void onPlayTone(const uint16_t frequency, const uint16_t duration/*=0*/) {} void onPrintTimerStarted() {} void onPrintTimerPaused() {} @@ -51,6 +55,26 @@ namespace ExtUI { void onUserConfirmRequired(const char * const msg) { nextion.confirmationRequest(msg); } + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) { + onUserConfirmRequired(cstr); + UNUSED(icon); UNUSED(fBtn); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void onPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + stdOnPauseMode(message, mode, extruder); + } + #endif + void onStatusChanged(const char * const msg) { nextion.statusChange(msg); } void onHomingStart() {} @@ -97,6 +121,9 @@ namespace ExtUI { #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp() { return LEVELING_BED_TEMP; } + #endif #endif #if HAS_MESH @@ -109,6 +136,10 @@ namespace ExtUI { } #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t) {} + #endif + #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff) { // Called when power-loss is enabled/disabled @@ -122,15 +153,29 @@ namespace ExtUI { #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst) { + void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result nextion.panelInfo(37); } + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp) { + // Called by M303 to update the UI + } + #endif + + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst) { + // Called for temperature PID tuning result + } + #endif + + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash() {} #endif void onSteppersDisabled() {} void onSteppersEnabled() {} - + void onAxisDisabled(const axis_t) {} + void onAxisEnabled(const axis_t) {} } #endif // NEXTION_TFT diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 9d0b7e2723..ec9b05318c 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -106,7 +106,7 @@ #include "../../feature/host_actions.h" #endif -#if M600_PURGE_MORE_RESUMABLE +#if ENABLED(ADVANCED_PAUSE_FEATURE) #include "../../feature/pause.h" #endif @@ -1116,10 +1116,39 @@ namespace ExtUI { } void setUserConfirmed() { TERN_(HAS_RESUME_CONTINUE, wait_for_user = false); } - #if M600_PURGE_MORE_RESUMABLE + #if ENABLED(ADVANCED_PAUSE_FEATURE) void setPauseMenuResponse(PauseMenuResponse response) { pause_menu_response = response; } - PauseMessage pauseModeStatus = PAUSE_MESSAGE_STATUS; PauseMode getPauseMode() { return pause_mode; } + + PauseMessage pauseModeStatus = PAUSE_MESSAGE_STATUS; + + void stdOnPauseMode( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + if (mode != PAUSE_MODE_SAME) pause_mode = mode; + pauseModeStatus = message; + switch (message) { + case PAUSE_MESSAGE_PARKING: onUserConfirmRequired(GET_TEXT_F(MSG_PAUSE_PRINT_PARKING)); break; + case PAUSE_MESSAGE_CHANGING: onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_INIT)); break; + case PAUSE_MESSAGE_UNLOAD: onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_UNLOAD)); break; + case PAUSE_MESSAGE_WAITING: onUserConfirmRequired(GET_TEXT_F(MSG_ADVANCED_PAUSE_WAITING)); break; + case PAUSE_MESSAGE_INSERT: onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_INSERT)); break; + case PAUSE_MESSAGE_LOAD: onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_LOAD)); break; + case PAUSE_MESSAGE_PURGE: onUserConfirmRequired( + GET_TEXT_F(TERN(ADVANCED_PAUSE_CONTINUOUS_PURGE, MSG_FILAMENT_CHANGE_CONT_PURGE, MSG_FILAMENT_CHANGE_PURGE)) + ); + break; + case PAUSE_MESSAGE_RESUME: onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_RESUME)); break; + case PAUSE_MESSAGE_HEAT: onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEAT)); break; + case PAUSE_MESSAGE_HEATING: onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEATING)); break; + case PAUSE_MESSAGE_OPTION: onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_OPTION_HEADER)); break; + case PAUSE_MESSAGE_STATUS: break; + default: break; + } + } + #endif void printFile(const char *filename) { @@ -1228,17 +1257,30 @@ namespace ExtUI { // // MarlinUI passthroughs to ExtUI // +#if DISABLED(HAS_DWIN_E3V2) + void MarlinUI::init_lcd() { ExtUI::onStartup(); } -void MarlinUI::init_lcd() { ExtUI::onStartup(); } + void MarlinUI::update() { ExtUI::onIdle(); } -void MarlinUI::update() { ExtUI::onIdle(); } - -void MarlinUI::kill_screen(FSTR_P const error, FSTR_P const component) { - using namespace ExtUI; - if (!flags.printer_killed) { - flags.printer_killed = true; - onPrinterKilled(error, component); + void MarlinUI::kill_screen(FSTR_P const error, FSTR_P const component) { + using namespace ExtUI; + if (!flags.printer_killed) { + flags.printer_killed = true; + onPrinterKilled(error, component); + } } -} +#endif + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + + void MarlinUI::pause_show_message( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ + ) { + ExtUI::onPauseMode(message, mode, extruder); + } + +#endif #endif // EXTENSIBLE_UI diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index b7d670de13..8202f7be8d 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -46,8 +46,10 @@ #include "../marlinui.h" #include "../../gcode/gcode.h" +#include "../../module/temperature.h" -#if M600_PURGE_MORE_RESUMABLE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #include "../../module/motion.h" #include "../../feature/pause.h" #endif @@ -66,14 +68,12 @@ namespace ExtUI { enum extruder_t : uint8_t { E0, E1, E2, E3, E4, E5, E6, E7 }; enum heater_t : uint8_t { H0, H1, H2, H3, H4, H5, BED, CHAMBER, COOLER }; enum fan_t : uint8_t { FAN0, FAN1, FAN2, FAN3, FAN4, FAN5, FAN6, FAN7 }; - enum result_t : uint8_t { - OPTITEM(HAS_PID_HEATING, PID_STARTED) - OPTITEM(HAS_PID_HEATING, PID_BED_STARTED) - OPTITEM(HAS_PID_HEATING, PID_BAD_HEATER_ID) - OPTITEM(HAS_PID_HEATING, PID_TEMP_TOO_HIGH) - OPTITEM(HAS_PID_HEATING, PID_TUNING_TIMEOUT) - OPTITEM(HAS_PID_HEATING, PID_DONE) - }; + #if HAS_PID_HEATING + enum pidresult_t : uint8_t { PID_STARTED, PID_BED_STARTED, PID_CHAMBER_STARTED, PID_BAD_HEATER_ID, PID_TEMP_TOO_HIGH, PID_TUNING_TIMEOUT, PID_DONE }; + #endif + #if ENABLED(MPC_AUTOTUNE) + enum mpcresult_t : uint8_t { MPC_STARTED, MPC_TEMP_ERROR, MPC_INTERRUPTED, MPC_DONE }; + #endif constexpr uint8_t extruderCount = EXTRUDERS; constexpr uint8_t hotendCount = HOTENDS; @@ -234,6 +234,9 @@ namespace ExtUI { bool getLevelingIsValid(); void onLevelingStart(); void onLevelingDone(); + #if ENABLED(PREHEAT_BEFORE_LEVELING) + celsius_t getLevelingBedTemp(); + #endif #if HAS_MESH // Mesh data, utilities, events bed_mesh_t& getMeshArray(); @@ -312,10 +315,9 @@ namespace ExtUI { bool awaitingUserConfirm(); void setUserConfirmed(); - #if M600_PURGE_MORE_RESUMABLE + #if ENABLED(ADVANCED_PAUSE_FEATURE) // "Purge More" has a control screen void setPauseMenuResponse(PauseMenuResponse); - extern PauseMessage pauseModeStatus; PauseMode getPauseMode(); #endif @@ -488,6 +490,10 @@ namespace ExtUI { void onMediaError(); void onMediaRemoved(); + void onHeatingError(const heater_id_t header_id); + void onMinTempError(const heater_id_t header_id); + void onMaxTempError(const heater_id_t header_id); + void onPlayTone(const uint16_t frequency, const uint16_t duration=0); void onPrinterKilled(FSTR_P const error, FSTR_P const component); @@ -503,6 +509,17 @@ namespace ExtUI { void onUserConfirmRequired(const char * const msg); void onUserConfirmRequired(FSTR_P const fstr); + // For fancy LCDs include an icon ID, message, and translated button title + void onUserConfirmRequired(const int icon, const char * const cstr, FSTR_P const fBtn); + void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn); + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + // Standard stdOnPauseMode sets pauseModeStatus and calls onUserConfirmRequired + extern PauseMessage pauseModeStatus; + void stdOnPauseMode(const PauseMessage message, const PauseMode mode=PAUSE_MODE_SAME, const uint8_t extruder=active_extruder); + void onPauseMode(const PauseMessage message, const PauseMode mode=PAUSE_MODE_SAME, const uint8_t extruder=active_extruder); + #endif + void onStatusChanged(const char * const msg); void onStatusChanged(FSTR_P const fstr); @@ -511,6 +528,8 @@ namespace ExtUI { void onSteppersDisabled(); void onSteppersEnabled(); + void onAxisDisabled(const axis_t axis); + void onAxisEnabled(const axis_t axis); void onFactoryReset(); void onStoreSettings(char *); @@ -519,13 +538,23 @@ namespace ExtUI { void onSettingsStored(const bool success); void onSettingsLoaded(const bool success); + #if ENABLED(PREVENT_COLD_EXTRUSION) + void onSetMinExtrusionTemp(const celsius_t t); + #endif #if ENABLED(POWER_LOSS_RECOVERY) void onSetPowerLoss(const bool onoff); void onPowerLoss(); void onPowerLossResume(); #endif #if HAS_PID_HEATING - void onPIDTuning(const result_t rst); + void onPIDTuning(const pidresult_t rst); + void onStartM303(const int count, const heater_id_t hid, const celsius_t temp); + #endif + #if ENABLED(MPC_AUTOTUNE) + void onMPCTuning(const mpcresult_t rst); + #endif + #if ENABLED(PLATFORM_M997_SUPPORT) + void onFirmwareFlash(); #endif }; diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 2ea52c2ccf..1ecf65a57f 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -360,8 +360,17 @@ namespace LanguageNarrow_en { LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("PID tuning done"); LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("Autotune failed!"); + LSTR MSG_PID_FOR_NOZZLE = _UxGT("for Nozzle is running."); + LSTR MSG_PID_FOR_BED = _UxGT("for BED is running."); + LSTR MSG_PID_FOR_CHAMBER = _UxGT("for CHAMBER is running."); + + LSTR MSG_TEMP_NOZZLE = _UxGT("Nozzle Temperature"); + LSTR MSG_TEMP_BED = _UxGT("Bed Temperature"); + LSTR MSG_TEMP_CHAMBER = _UxGT("Chamber Temperature"); + LSTR MSG_BAD_HEATER_ID = _UxGT("Bad extruder."); LSTR MSG_TEMP_TOO_HIGH = _UxGT("Temperature too high."); + LSTR MSG_TEMP_TOO_LOW = _UxGT("Temperature too low"); LSTR MSG_PID_BAD_HEATER_ID = _UxGT("Autotune failed! Bad extruder."); LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune failed! Temperature too high."); @@ -841,7 +850,7 @@ namespace LanguageNarrow_en { LSTR MSG_XATC = _UxGT("X-Twist Wizard"); LSTR MSG_XATC_DONE = _UxGT("X-Twist Wizard Done!"); - LSTR MSG_XATC_UPDATE_Z_OFFSET = _UxGT("Update Probe Z-Offset to "); + LSTR MSG_XATC_UPDATE_Z_OFFSET = _UxGT("Update Z-Offset to "); LSTR MSG_SOUND = _UxGT("Sound"); @@ -881,7 +890,6 @@ namespace LanguageNarrow_en { LSTR DGUS_MSG_NOT_WHILE_PRINTING = _UxGT("Not allowed during print"); LSTR DGUS_MSG_NOT_WHILE_IDLE = _UxGT("Not allowed while idle"); LSTR DGUS_MSG_NO_FILE_SELECTED = _UxGT("No file selected"); - LSTR DGUS_MSG_TEMP_TOO_LOW = _UxGT("Temperature too low"); LSTR DGUS_MSG_EXECUTING_COMMAND = _UxGT("Executing command..."); LSTR DGUS_MSG_BED_PID_DISABLED = _UxGT("Bed PID disabled"); LSTR DGUS_MSG_PID_DISABLED = _UxGT("PID disabled"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 52bbd7fac3..09e7f94917 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -263,6 +263,8 @@ namespace LanguageNarrow_fr { LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Echec Autotune! Temp. trop haute"); LSTR MSG_PID_TIMEOUT = _UxGT("Echec Autotune! Opér. expirée"); + LSTR MSG_TEMP_TOO_LOW = _UxGT("Temperature trop basse"); + LSTR MSG_SELECT_E = _UxGT("Sélectionner *"); LSTR MSG_ACC = _UxGT("Accélération"); LSTR MSG_JERK = _UxGT("Jerk"); @@ -598,7 +600,6 @@ namespace LanguageNarrow_fr { LSTR DGUS_MSG_NOT_WHILE_PRINTING = _UxGT("Impossible pendant une impression"); LSTR DGUS_MSG_NOT_WHILE_IDLE = _UxGT("Impossible tant que l'imprimante est en attente"); LSTR DGUS_MSG_NO_FILE_SELECTED = _UxGT("Aucun fichier selectionne"); - LSTR DGUS_MSG_TEMP_TOO_LOW = _UxGT("Temperature trop basse"); LSTR DGUS_MSG_EXECUTING_COMMAND = _UxGT("Execution de la commande..."); LSTR DGUS_MSG_BED_PID_DISABLED = _UxGT("Bed PID desactive"); LSTR DGUS_MSG_PID_DISABLED = _UxGT("PID desactive"); diff --git a/Marlin/src/lcd/language/language_fr_na.h b/Marlin/src/lcd/language/language_fr_na.h index 98302af61c..dc31af4fcb 100644 --- a/Marlin/src/lcd/language/language_fr_na.h +++ b/Marlin/src/lcd/language/language_fr_na.h @@ -263,6 +263,8 @@ namespace LanguageNarrow_fr_na { LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Echec Autotune! Temp. trop haute"); LSTR MSG_PID_TIMEOUT = _UxGT("Echec Autotune! Oper. expiree"); + LSTR MSG_TEMP_TOO_LOW = _UxGT("Temperature trop basse"); + LSTR MSG_SELECT_E = _UxGT("Selectionner *"); LSTR MSG_ACC = _UxGT("Acceleration"); LSTR MSG_JERK = _UxGT("Jerk"); @@ -601,7 +603,6 @@ namespace LanguageNarrow_fr_na { LSTR DGUS_MSG_NOT_WHILE_PRINTING = _UxGT("Impossible pendant une impression"); LSTR DGUS_MSG_NOT_WHILE_IDLE = _UxGT("Impossible tant que l'imprimante est en attente"); LSTR DGUS_MSG_NO_FILE_SELECTED = _UxGT("Aucun fichier selectionne"); - LSTR DGUS_MSG_TEMP_TOO_LOW = _UxGT("Temperature trop basse"); LSTR DGUS_MSG_EXECUTING_COMMAND = _UxGT("Execution de la commande..."); LSTR DGUS_MSG_BED_PID_DISABLED = _UxGT("Bed PID desactive"); LSTR DGUS_MSG_PID_DISABLED = _UxGT("PID desactive"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 08b048eadd..7a4f17d49b 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -849,7 +849,6 @@ namespace LanguageNarrow_it { LSTR DGUS_MSG_NOT_WHILE_PRINTING = _UxGT("Non ammesso durante la stampa"); LSTR DGUS_MSG_NOT_WHILE_IDLE = _UxGT("Non ammesso mentre è in riposo"); LSTR DGUS_MSG_NO_FILE_SELECTED = _UxGT("Nessun file selezionato"); - LSTR DGUS_MSG_TEMP_TOO_LOW = _UxGT("Temperatura troppo bassa"); LSTR DGUS_MSG_EXECUTING_COMMAND = _UxGT("Esecuzione del comando..."); LSTR DGUS_MSG_BED_PID_DISABLED = _UxGT("PID piatto disabilitato"); LSTR DGUS_MSG_PID_DISABLED = _UxGT("PID disabilitato"); @@ -888,6 +887,7 @@ namespace LanguageWide_it { LSTR MSG_INFO_PRINT_TIME = _UxGT("Tempo totale"); LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Lavoro più lungo"); LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Totale estruso"); + LSTR MSG_TEMP_TOO_LOW = _UxGT("Temperatura troppo bassa"); #endif } diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index 23aefff2f7..1a335bac3a 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -351,6 +351,7 @@ namespace LanguageNarrow_tr { LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("Kalibrasyon baÅŸarısız!"); LSTR MSG_BAD_HEATER_ID = _UxGT("Kötü ekstruder."); LSTR MSG_TEMP_TOO_HIGH = _UxGT("Sıcaklık çok yüksek."); + LSTR MSG_TEMP_TOO_LOW = _UxGT("Sıcaklık çok düşük"); LSTR MSG_PID_BAD_HEATER_ID = _UxGT("Kalibrasyon baÅŸarısız! Kötü ekstruder."); LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Kalibrasyon baÅŸarısız! Sıcaklık çok yüksek."); LSTR MSG_PID_TIMEOUT = _UxGT("Kalibrasyon baÅŸarısız! Zaman aşımı."); @@ -867,7 +868,6 @@ namespace LanguageNarrow_tr { LSTR DGUS_MSG_NOT_WHILE_PRINTING = _UxGT("Yazdırma sırasında izin verilmez"); LSTR DGUS_MSG_NOT_WHILE_IDLE = _UxGT("BoÅŸtayken izin verilmez"); LSTR DGUS_MSG_NO_FILE_SELECTED = _UxGT("Seçili dosya yok"); - LSTR DGUS_MSG_TEMP_TOO_LOW = _UxGT("Sıcaklık çok düşük"); LSTR DGUS_MSG_EXECUTING_COMMAND = _UxGT("Komut yürütülüyor..."); LSTR DGUS_MSG_BED_PID_DISABLED = _UxGT("Tabla PID pasif"); LSTR DGUS_MSG_PID_DISABLED = _UxGT("PID devre dışı"); diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 4eed5f3c65..aaa8fb65e8 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -48,8 +48,6 @@ MarlinUI ui; #if ENABLED(DWIN_CREALITY_LCD) #include "e3v2/creality/dwin.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "e3v2/proui/dwin.h" #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) #include "e3v2/jyersui/dwin.h" #endif @@ -69,7 +67,7 @@ MarlinUI ui; constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #if HAS_STATUS_MESSAGE - #if ENABLED(STATUS_MESSAGE_SCROLLING) && ANY(HAS_WIRED_LCD, DWIN_LCD_PROUI) + #if ENABLED(STATUS_MESSAGE_SCROLLING) uint8_t MarlinUI::status_scroll_offset; // = 0 #endif MString MarlinUI::status_message; @@ -1490,7 +1488,7 @@ void MarlinUI::host_notify(const char * const cstr) { else if (!no_welcome) msg = GET_TEXT_F(WELCOME_MSG); - else if (ENABLED(DWIN_LCD_PROUI)) + else if (ENABLED(STATUS_DO_CLEAR_EMPTY)) msg = F(""); else return; @@ -1609,7 +1607,6 @@ void MarlinUI::host_notify(const char * const cstr) { TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged(status_message)); TERN_(DWIN_CREALITY_LCD, dwinStatusChanged(status_message)); - TERN_(DWIN_LCD_PROUI, dwinCheckStatusMessage()); TERN_(DWIN_CREALITY_LCD_JYERSUI, jyersDWIN.updateStatus(status_message)); } @@ -1888,36 +1885,6 @@ void MarlinUI::host_notify(const char * const cstr) { #endif -#if ALL(EXTENSIBLE_UI, ADVANCED_PAUSE_FEATURE) - - void MarlinUI::pause_show_message( - const PauseMessage message, - const PauseMode mode/*=PAUSE_MODE_SAME*/, - const uint8_t extruder/*=active_extruder*/ - ) { - if (mode != PAUSE_MODE_SAME) pause_mode = mode; - ExtUI::pauseModeStatus = message; - switch (message) { - case PAUSE_MESSAGE_PARKING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_PAUSE_PRINT_PARKING)); break; - case PAUSE_MESSAGE_CHANGING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_INIT)); break; - case PAUSE_MESSAGE_UNLOAD: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_UNLOAD)); break; - case PAUSE_MESSAGE_WAITING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_ADVANCED_PAUSE_WAITING)); break; - case PAUSE_MESSAGE_INSERT: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_INSERT)); break; - case PAUSE_MESSAGE_LOAD: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_LOAD)); break; - case PAUSE_MESSAGE_PURGE: - ExtUI::onUserConfirmRequired(GET_TEXT_F(TERN(ADVANCED_PAUSE_CONTINUOUS_PURGE, MSG_FILAMENT_CHANGE_CONT_PURGE, MSG_FILAMENT_CHANGE_PURGE))); - break; - case PAUSE_MESSAGE_RESUME: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_RESUME)); break; - case PAUSE_MESSAGE_HEAT: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEAT)); break; - case PAUSE_MESSAGE_HEATING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEATING)); break; - case PAUSE_MESSAGE_OPTION: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_OPTION_HEADER)); break; - case PAUSE_MESSAGE_STATUS: break; - default: break; - } - } - -#endif - #if ENABLED(EEPROM_SETTINGS) #if HAS_MARLINUI_MENU diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 3388c2047b..f21d2565be 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -53,6 +53,10 @@ #include "e3v2/proui/dwin.h" #endif +#if ALL(HAS_STATUS_MESSAGE, IS_DWIN_MARLINUI) + #include "e3v2/marlinui/marlinui_dwin.h" // for LCD_WIDTH +#endif + typedef bool (*statusResetFunc_t)(); #if HAS_WIRED_LCD @@ -753,7 +757,7 @@ public: static bool use_click() { return false; } #endif - #if ENABLED(ADVANCED_PAUSE_FEATURE) && ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI, DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) + #if ENABLED(ADVANCED_PAUSE_FEATURE) && ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI, DWIN_CREALITY_LCD_JYERSUI) static void pause_show_message(const PauseMessage message, const PauseMode mode=PAUSE_MODE_SAME, const uint8_t extruder=active_extruder); #else static void _pause_show_message() {} diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index c7558db43f..f9748871f5 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -31,7 +31,7 @@ #include "../inc/MarlinConfig.h" #if ALL(DWIN_LCD_PROUI, INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) - #include "../lcd/e3v2/proui/dwin.h" + #include "../lcd/e3v2/proui/dwin.h" // for Z_POST_CLEARANCE #endif #if IS_SCARA @@ -413,12 +413,12 @@ void remember_feedrate_scaling_off(); void restore_feedrate_and_scaling(); #if HAS_Z_AXIS - #if ALL(DWIN_LCD_PROUI, INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) - #define Z_POST_CLEARANCE hmiData.zAfterHoming - #elif defined(Z_AFTER_HOMING) - #define Z_POST_CLEARANCE Z_AFTER_HOMING - #else - #define Z_POST_CLEARANCE Z_CLEARANCE_FOR_HOMING + #ifndef Z_POST_CLEARANCE // May be set by proui/dwin.h :-P + #ifdef Z_AFTER_HOMING + #define Z_POST_CLEARANCE Z_AFTER_HOMING + #else + #define Z_POST_CLEARANCE Z_CLEARANCE_FOR_HOMING + #endif #endif void do_z_clearance(const_float_t zclear, const bool with_probe=true, const bool lower_allowed=false); void do_z_clearance_by(const_float_t zclear); diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 2fec098b8a..342ce2bb3a 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -96,8 +96,6 @@ #if ENABLED(EXTENSIBLE_UI) #include "../lcd/extui/ui_api.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../lcd/e3v2/proui/dwin_popup.h" #endif #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) @@ -376,8 +374,11 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { #endif TERN_(HOST_PROMPT_SUPPORT, hostui.continue_prompt(ds_fstr)); - TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired(ds_fstr)); - TERN_(DWIN_LCD_PROUI, dwinPopupConfirm(ICON_BLTouch, ds_fstr, FPSTR(CONTINUE_STR))); + #if ENABLED(DWIN_LCD_PROUI) + ExtUI::onUserConfirmRequired(ICON_BLTouch, ds_fstr, FPSTR(CONTINUE_STR)); + #elif ENABLED(EXTENSIBLE_UI) + ExtUI::onUserConfirmRequired(ds_fstr); + #endif TERN_(HAS_RESUME_CONTINUE, wait_for_user_response()); ui.reset_status(); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index b382f80d51..4880013862 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -75,11 +75,13 @@ #include "../feature/z_stepper_align.h" #endif -#if ENABLED(EXTENSIBLE_UI) - #include "../lcd/extui/ui_api.h" -#elif ENABLED(DWIN_LCD_PROUI) +#if ENABLED(DWIN_LCD_PROUI) #include "../lcd/e3v2/proui/dwin.h" #include "../lcd/e3v2/proui/bedlevel_tools.h" +#endif + +#if ENABLED(EXTENSIBLE_UI) + #include "../lcd/extui/ui_api.h" #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) #include "../lcd/e3v2/jyersui/dwin.h" #endif @@ -490,6 +492,13 @@ typedef struct SettingsDataStruct { #endif uint32_t motor_current_setting[MOTOR_CURRENT_COUNT]; // M907 X Z E ... + // + // Adaptive Step Smoothing state + // + #if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE) + bool adaptive_step_smoothing_enabled; // G-code pending + #endif + // // CNC_COORDINATE_SYSTEMS // @@ -537,9 +546,7 @@ typedef struct SettingsDataStruct { // // Ender-3 V2 DWIN // - #if ENABLED(DWIN_LCD_PROUI) - uint8_t dwin_data[eeprom_data_size]; - #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) + #if ENABLED(DWIN_CREALITY_LCD_JYERSUI) uint8_t dwin_settings[jyersDWIN.eeprom_data_size]; #endif @@ -1530,6 +1537,14 @@ void MarlinSettings::postprocess() { #endif } + // + // Adaptive Step Smoothing state + // + #if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE) + _FIELD_TEST(adaptive_step_smoothing_enabled); + EEPROM_WRITE(stepper.adaptive_step_smoothing_enabled); + #endif + // // CNC Coordinate Systems // @@ -1606,17 +1621,8 @@ void MarlinSettings::postprocess() { #endif // - // Creality DWIN User Data + // JyersUI DWIN User Data // - #if ENABLED(DWIN_LCD_PROUI) - { - _FIELD_TEST(dwin_data); - char dwin_data[eeprom_data_size] = { 0 }; - dwinCopySettingsTo(dwin_data); - EEPROM_WRITE(dwin_data); - } - #endif - #if ENABLED(DWIN_CREALITY_LCD_JYERSUI) { _FIELD_TEST(dwin_settings); @@ -2599,6 +2605,13 @@ void MarlinSettings::postprocess() { #endif } + // + // Adaptive Step Smoothing state + // + #if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE) + EEPROM_READ(stepper.adaptive_step_smoothing_enabled); + #endif + // // CNC Coordinate System // @@ -2690,16 +2703,9 @@ void MarlinSettings::postprocess() { #endif // - // DWIN User Data + // JyersUI User Data // - #if ENABLED(DWIN_LCD_PROUI) - { - const char dwin_data[eeprom_data_size] = { 0 }; - _FIELD_TEST(dwin_data); - EEPROM_READ(dwin_data); - if (!validating) dwinCopySettingsFrom(dwin_data); - } - #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) + #if ENABLED(DWIN_CREALITY_LCD_JYERSUI) { const char dwin_settings[jyersDWIN.eeprom_data_size] = { 0 }; _FIELD_TEST(dwin_settings); @@ -3544,6 +3550,13 @@ void MarlinSettings::reset() { DEBUG_ECHOLNPGM("Digipot Written"); #endif + // + // Adaptive Step Smoothing state + // + #if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE) + stepper.adaptive_step_smoothing_enabled = true; + #endif + // // CNC Coordinate System // @@ -3589,11 +3602,6 @@ void MarlinSettings::reset() { // TERN_(DGUS_LCD_UI_MKS, MKS_reset_settings()); - // - // Ender-3 V2 with ProUI - // - TERN_(DWIN_LCD_PROUI, dwinSetDataDefaults()); - // // Model predictive control // diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 851fa452e7..803c14d73c 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -204,6 +204,11 @@ uint32_t Stepper::acceleration_time, Stepper::deceleration_time; #endif #if ENABLED(ADAPTIVE_STEP_SMOOTHING) + #if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE) + bool Stepper::adaptive_step_smoothing_enabled; // Initialized by settings.load() + #else + constexpr bool Stepper::adaptive_step_smoothing_enabled; // = true + #endif // Oversampling factor (log2(multiplier)) to increase temporal resolution of axis uint8_t Stepper::oversampling_factor; #else @@ -547,6 +552,8 @@ void Stepper::enable_axis(const AxisEnum axis) { default: break; } mark_axis_enabled(axis); + + TERN_(EXTENSIBLE_UI, ExtUI::onAxisEnabled(ExtUI::axis_to_axis_t(axis))); } /** @@ -567,7 +574,8 @@ void Stepper::enable_axis(const AxisEnum axis) { bool Stepper::disable_axis(const AxisEnum axis) { mark_axis_disabled(axis); - TERN_(DWIN_LCD_PROUI, set_axis_untrusted(axis)); // MRISCOC workaround: https://github.com/MarlinFirmware/Marlin/issues/23095 + // This scheme prevents shared steppers being disabled. It should consider several axes at once + // and keep a count of how many times each ENA pin has been set. // If all the axes that share the enabled bit are disabled const bool can_disable = can_axis_disable(axis); @@ -577,6 +585,7 @@ bool Stepper::disable_axis(const AxisEnum axis) { MAIN_AXIS_MAP(_CASE_DISABLE) default: break; } + TERN_(EXTENSIBLE_UI, ExtUI::onAxisDisabled(ExtUI::axis_to_axis_t(axis))); } return can_disable; @@ -2640,7 +2649,7 @@ hal_timer_t Stepper::block_phase_isr() { oversampling_factor = TERN(NONLINEAR_EXTRUSION, 1, 0); // Decide if axis smoothing is possible - if (TERN1(DWIN_LCD_PROUI, hmiData.adaptiveStepSmoothing)) { + if (stepper.adaptive_step_smoothing_enabled) { uint32_t max_rate = current_block->nominal_rate; // Get the step event rate while (max_rate < MIN_STEP_ISR_FREQUENCY) { // As long as more ISRs are possible... max_rate <<= 1; // Try to double the rate diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index 8c13831d9e..6712198aae 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -336,6 +336,12 @@ class Stepper { static ne_coeff_t ne; #endif + #if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE) + static bool adaptive_step_smoothing_enabled; + #else + static constexpr bool adaptive_step_smoothing_enabled = true; + #endif + private: static block_t* current_block; // A pointer to the block currently being traced diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 53b9f37fb2..a1fe14c75d 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -52,8 +52,6 @@ #if ENABLED(DWIN_CREALITY_LCD) #include "../lcd/e3v2/creality/dwin.h" -#elif ENABLED(DWIN_LCD_PROUI) - #include "../lcd/e3v2/proui/dwin.h" #endif #if ENABLED(EXTENSIBLE_UI) @@ -723,13 +721,11 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(HAS_FAN_LOGIC, fan_update_ms = next_temp_ms + fan_update_interval_ms); - TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_STARTED)); - TERN_(PROUI_PID_TUNE, dwinPidTuning(isbed ? PIDTEMPBED_START : PIDTEMP_START)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ischamber ? ExtUI::pidresult_t::PID_CHAMBER_STARTED : isbed ? ExtUI::pidresult_t::PID_BED_STARTED : ExtUI::pidresult_t::PID_STARTED)); if (target > GHV(CHAMBER_MAX_TARGET, BED_MAX_TARGET, hotend_max_target(heater_id))) { SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); - TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); - TERN_(PROUI_PID_TUNE, dwinPidTuning(PID_TEMP_TOO_HIGH)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::pidresult_t::PID_TEMP_TOO_HIGH)); TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_PID_TEMP_TOO_HIGH))); return; } @@ -822,8 +818,7 @@ volatile bool Temperature::raw_temps_ready = false; #endif if (current_temp > target + MAX_OVERSHOOT_PID_AUTOTUNE) { SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); - TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); - TERN_(PROUI_PID_TUNE, dwinPidTuning(PID_TEMP_TOO_HIGH)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::pidresult_t::PID_TEMP_TOO_HIGH)); TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_PID_TEMP_TOO_HIGH))); break; } @@ -860,8 +855,7 @@ volatile bool Temperature::raw_temps_ready = false; #endif if ((ms - _MIN(t1, t2)) > MIN_TO_MS(PID_AUTOTUNE_MAX_CYCLE_MINS)) { TERN_(DWIN_CREALITY_LCD, dwinPopupTemperature(0)); - TERN_(PROUI_PID_TUNE, dwinPidTuning(PID_TUNING_TIMEOUT)); - TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_TUNING_TIMEOUT)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::pidresult_t::PID_TUNING_TIMEOUT)); TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_PID_TIMEOUT))); SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_TIMEOUT); break; @@ -919,8 +913,7 @@ volatile bool Temperature::raw_temps_ready = false; EXIT_M303: TERN_(PRINTER_EVENT_LEDS, printerEventLEDs.onPIDTuningDone(oldcolor)); - TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::result_t::PID_DONE)); - TERN_(PROUI_PID_TUNE, dwinPidTuning(AUTOTUNE_DONE)); + TERN_(EXTENSIBLE_UI, ExtUI::onPIDTuning(ExtUI::pidresult_t::PID_DONE)); TERN_(TEMP_TUNING_MAINTAIN_FAN, adaptive_fan_slowing = true); return; } @@ -1137,7 +1130,7 @@ volatile bool Temperature::raw_temps_ready = false; // Ensure we don't drift too far from the window between the last sampled temp and the target temperature if (!WITHIN(current_temp, get_sample_3_temp() - 15.0f, hotend.target + 15.0f)) { SERIAL_ECHOLNPGM(STR_MPC_TEMPERATURE_ERROR); - TERN_(DWIN_LCD_PROUI, dwinMPCTuning(MPC_TEMP_ERROR)); + TERN_(EXTENSIBLE_UI, ExtUI::onMPCTuning(ExtUI::mpcresult_t::MPC_TEMP_ERROR)); wait_for_heatup = false; return FAILED; } @@ -1175,7 +1168,7 @@ volatile bool Temperature::raw_temps_ready = false; if (!wait_for_heatup) { SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_INTERRUPTED); - TERN_(DWIN_LCD_PROUI, dwinMPCTuning(MPC_INTERRUPTED)); + TERN_(EXTENSIBLE_UI, ExtUI::onMPCTuning(ExtUI::mpcresult_t::MPC_INTERRUPTED)); return MeasurementState::CANCELLED; } @@ -1202,12 +1195,8 @@ volatile bool Temperature::raw_temps_ready = false; // Determine ambient temperature. SERIAL_ECHOLNPGM(STR_MPC_COOLING_TO_AMBIENT); - #if ENABLED(DWIN_LCD_PROUI) - dwinMPCTuning(MPCTEMP_START); - LCD_ALERTMESSAGE(MSG_MPC_COOLING_TO_AMBIENT); - #else - LCD_MESSAGE(MSG_COOLING); - #endif + TERN_(EXTENSIBLE_UI, ExtUI::onMPCTuning(ExtUI::mpcresult_t::MPCTEMP_START)); + TERN(DWIN_LCD_PROUI, LCD_ALERTMESSAGE(MSG_MPC_COOLING_TO_AMBIENT), LCD_MESSAGE(MSG_COOLING)); if (tuner.measure_ambient_temp() != MPC_autotuner::MeasurementState::SUCCESS) return; hotend.modeled_ambient_temp = tuner.get_ambient_temp(); @@ -1293,7 +1282,7 @@ volatile bool Temperature::raw_temps_ready = false; } SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_FINISHED); - TERN_(DWIN_LCD_PROUI, dwinMPCTuning(AUTOTUNE_DONE)); + TERN_(EXTENSIBLE_UI, ExtUI::onMPCTuning(ExtUI::mpcresult_t::MPC_DONE)); SERIAL_ECHOLNPGM("MPC_BLOCK_HEAT_CAPACITY ", mpc.block_heat_capacity); SERIAL_ECHOLNPGM("MPC_SENSOR_RESPONSIVENESS ", p_float_t(mpc.sensor_responsiveness, 4)); @@ -1532,15 +1521,17 @@ void Temperature::_temp_error( } void Temperature::maxtemp_error(const heater_id_t heater_id OPTARG(ERR_INCLUDE_TEMP, const celsius_float_t deg)) { - #if HAS_DWIN_E3V2_BASIC && (HAS_HOTEND || HAS_HEATED_BED) - dwinPopupTemperature(1); + #if HAS_HOTEND || HAS_HEATED_BED + TERN_(DWIN_CREALITY_LCD, dwinPopupTemperature(1)); + TERN_(EXTENSIBLE_UI, ExtUI::onMaxTempError(heater_id)); #endif _TEMP_ERROR(heater_id, F(STR_T_MAXTEMP), MSG_ERR_MAXTEMP, deg); } void Temperature::mintemp_error(const heater_id_t heater_id OPTARG(ERR_INCLUDE_TEMP, const celsius_float_t deg)) { - #if HAS_DWIN_E3V2_BASIC && (HAS_HOTEND || HAS_HEATED_BED) - dwinPopupTemperature(0); + #if HAS_HOTEND || HAS_HEATED_BED + TERN_(DWIN_CREALITY_LCD, dwinPopupTemperature(0)); + TERN_(EXTENSIBLE_UI, ExtUI::onMinTempError(heater_id)); #endif _TEMP_ERROR(heater_id, F(STR_T_MINTEMP), MSG_ERR_MINTEMP, deg); } @@ -1765,7 +1756,8 @@ void Temperature::mintemp_error(const heater_id_t heater_id OPTARG(ERR_INCLUDE_T if (watch_hotend[e].check(temp)) // Increased enough? start_watching_hotend(e); // If temp reached, turn off elapsed check else { - TERN_(HAS_DWIN_E3V2_BASIC, dwinPopupTemperature(0)); + TERN_(DWIN_CREALITY_LCD, dwinPopupTemperature(0)); + TERN_(EXTENSIBLE_UI, ExtUI::onHeatingError(e)); _TEMP_ERROR(e, FPSTR(str_t_heating_failed), MSG_ERR_HEATING_FAILED, temp); } } @@ -1795,7 +1787,8 @@ void Temperature::mintemp_error(const heater_id_t heater_id OPTARG(ERR_INCLUDE_T if (watch_bed.check(deg)) // Increased enough? start_watching_bed(); // If temp reached, turn off elapsed check else { - TERN_(HAS_DWIN_E3V2_BASIC, dwinPopupTemperature(0)); + TERN_(DWIN_CREALITY_LCD, dwinPopupTemperature(0)); + TERN_(EXTENSIBLE_UI, ExtUI::onHeatingError(H_BED)); _TEMP_ERROR(H_BED, FPSTR(str_t_heating_failed), MSG_ERR_HEATING_FAILED, deg); } } @@ -3247,13 +3240,15 @@ void Temperature::init() { } // fall through case TRRunaway: - TERN_(HAS_DWIN_E3V2_BASIC, dwinPopupTemperature(0)); + TERN_(DWIN_CREALITY_LCD, dwinPopupTemperature(0)); + TERN_(EXTENSIBLE_UI, ExtUI::onHeatingError(heater_id)); _TEMP_ERROR(heater_id, FPSTR(str_t_thermal_runaway), MSG_ERR_THERMAL_RUNAWAY, current); break; #if ENABLED(THERMAL_PROTECTION_VARIANCE_MONITOR) case TRMalfunction: - TERN_(HAS_DWIN_E3V2_BASIC, dwinPopupTemperature(0)); + TERN_(DWIN_CREALITY_LCD, dwinPopupTemperature(0)); + TERN_(EXTENSIBLE_UI, ExtUI::onHeatingError(heater_id)); _TEMP_ERROR(heater_id, F(STR_T_THERMAL_MALFUNCTION), MSG_ERR_TEMP_MALFUNCTION, current); break; #endif diff --git a/buildroot/share/dwin/bin/DWIN_ICO.py b/buildroot/share/dwin/bin/DWIN_ICO.py index 436a98701d..4594e55017 100644 --- a/buildroot/share/dwin/bin/DWIN_ICO.py +++ b/buildroot/share/dwin/bin/DWIN_ICO.py @@ -76,23 +76,19 @@ class DWIN_ICO_File(): self._parseHeader(infile) self._splitEntryData(infile, outDir) - return - def _parseHeader(self, infile): maxEntries = 256 count = 0 - validEntries = 0 + icon_nums = _iconNames.keys() while count < maxEntries: rawBytes = infile.read(16) entry = Entry() entry.parseRawData(rawBytes) # check that it is valid: is offset nonzero? - # Special case: treat 39 as valid - if (entry.offset > 0) or (count == 39): - validEntries += 1 + # Special case: treat missing numbers as valid + if (entry.offset > 0) or count not in icon_nums: self.entries.append(entry) count += 1 - return def _splitEntryData(self, infile, outDir): print('Splitting Entry Data...') @@ -110,18 +106,16 @@ class DWIN_ICO_File(): if entry.length == 0: count += 1 continue - # Seek file position, read length bytes, and write to new output file. - print('%02d: offset: 0x%06x len: 0x%04x width: %d height: %d' % - (count, entry.offset, entry.length, entry.width, entry.height)) - outfilename = os.path.join(outDir, '%03d-ICON_%s.jpg' % (count, _iconNames7[count])) + outfilename = os.path.join(outDir, '%03d-ICON_%s.jpg' % (count, _iconNames.get(count, "UNKNOWN"))) with open(outfilename, 'wb') as outfile: infile.seek(entry.offset) blob = infile.read(entry.length) outfile.write(blob) - print('Wrote %d bytes to %s' % (entry.length, outfilename)) + # Seek file position, read length bytes, and write to new output file. + print('(%3d: width=%3d height=%3d offset=%6d len=%4d) ... %s' % + (count, entry.width, entry.height, entry.offset, entry.length, os.path.basename(outfilename))) count += 1 - return def createFile(self, iconDir, filename): '''Create a new .ico file from the contents of iconDir. @@ -179,7 +173,6 @@ class DWIN_ICO_File(): offset += e.length #print('%03d: (%d x %d) len=%d off=%d' % # (i, e.width, e.height, e.length, e.offset)) - return def _combineAndWriteIcoFile(self, filename): """Write out final .ico file. @@ -198,7 +191,6 @@ class DWIN_ICO_File(): if 0 == e.length: continue guts = self._getFileContents(e.filename, e.length) outfile.write(guts) - return def _getFileContents(self, filename, length): """Read contents of filename, and return bytes""" @@ -232,7 +224,6 @@ class Entry(): self.height = h self.offset = off self.length = len3 * 65536 + len21 - return def serialize(self): """Convert this Entry's information into a 16-byte @@ -245,97 +236,112 @@ class Entry(): 0, 0, 0, 0, 0) return rawdata -_iconNames7 = { - 0 : "LOGO_Creality", - 1 : "Print_0", - 2 : "Print_1", - 3 : "Prepare_0", - 4 : "Prepare_1", - 5 : "Control_0", - 6 : "Control_1", - 7 : "Leveling_0", - 8 : "Leveling_1", - 9 : "HotendTemp", - 10 : "BedTemp", - 11 : "Speed", - 12 : "Zoffset", - 13 : "Back", - 14 : "File", - 15 : "PrintTime", - 16 : "RemainTime", - 17 : "Setup_0", - 18 : "Setup_1", - 19 : "Pause_0", - 20 : "Pause_1", - 21 : "Continue_0", - 22 : "Continue_1", - 23 : "Stop_0", - 24 : "Stop_1", - 25 : "Bar", - 26 : "More", - 27 : "Axis", - 28 : "CloseMotor", - 29 : "Homing", - 30 : "SetHome", - 31 : "PLAPreheat", - 32 : "ABSPreheat", - 33 : "Cool", - 34 : "Language", - 35 : "MoveX", - 36 : "MoveY", - 37 : "MoveZ", - 38 : "Extruder", - # Skip 39 - 40 : "Temperature", - 41 : "Motion", - 42 : "WriteEEPROM", - 43 : "ReadEEPROM", - 44 : "ResetEEPROM", - 45 : "Info", - 46 : "SetEndTemp", - 47 : "SetBedTemp", - 48 : "FanSpeed", - 49 : "SetPLAPreheat", - 50 : "SetABSPreheat", - 51 : "MaxSpeed", - 52 : "MaxAccelerated", - 53 : "MaxJerk", - 54 : "Step", - 55 : "PrintSize", - 56 : "Version", - 57 : "Contact", - 58 : "StockConfiguraton", - 59 : "MaxSpeedX", - 60 : "MaxSpeedY", - 61 : "MaxSpeedZ", - 62 : "MaxSpeedE", - 63 : "MaxAccX", - 64 : "MaxAccY", - 65 : "MaxAccZ", - 66 : "MaxAccE", - 67 : "MaxSpeedJerkX", - 68 : "MaxSpeedJerkY", - 69 : "MaxSpeedJerkZ", - 70 : "MaxSpeedJerkE", - 71 : "StepX", - 72 : "StepY", - 73 : "StepZ", - 74 : "StepE", - 75 : "Setspeed", - 76 : "SetZOffset", - 77 : "Rectangle", - 78 : "BLTouch", - 79 : "TempTooLow", - 80 : "AutoLeveling", - 81 : "TempTooHigh", - 82 : "NoTips_C", - 83 : "NoTips_E", - 84 : "Continue_C", - 85 : "Continue_E", - 86 : "Cancel_C", - 87 : "Cancel_E", - 88 : "Confirm_C", - 89 : "Confirm_E", - 90 : "Info_0", - 91 : "Info_1" +_iconNames = { + 0 : "LOGO_Creality", + 1 : "Print_0", + 2 : "Print_1", + 3 : "Prepare_0", + 4 : "Prepare_1", + 5 : "Control_0", + 6 : "Control_1", + 7 : "Leveling_0", + 8 : "Leveling_1", + 9 : "HotendTemp", + 10 : "BedTemp", + 11 : "Speed", + 12 : "Zoffset", + 13 : "Back", + 14 : "File", + 15 : "PrintTime", + 16 : "RemainTime", + 17 : "Setup_0", + 18 : "Setup_1", + 19 : "Pause_0", + 20 : "Pause_1", + 21 : "Continue_0", + 22 : "Continue_1", + 23 : "Stop_0", + 24 : "Stop_1", + 25 : "Bar", + 26 : "More", + 27 : "Axis", + 28 : "CloseMotor", + 29 : "Homing", + 30 : "SetHome", + 31 : "PLAPreheat", + 32 : "ABSPreheat", + 33 : "Cool", + 34 : "Language", + 35 : "MoveX", + 36 : "MoveY", + 37 : "MoveZ", + 38 : "Extruder", + # Skip 39 + 40 : "Temperature", + 41 : "Motion", + 42 : "WriteEEPROM", + 43 : "ReadEEPROM", + 44 : "ResetEEPROM", + 45 : "Info", + 46 : "SetEndTemp", + 47 : "SetBedTemp", + 48 : "FanSpeed", + 49 : "SetPLAPreheat", + 50 : "SetABSPreheat", + 51 : "MaxSpeed", + 52 : "MaxAccelerated", + 53 : "MaxJerk", + 54 : "Step", + 55 : "PrintSize", + 56 : "Version", + 57 : "Contact", + 58 : "StockConfiguraton", + 59 : "MaxSpeedX", + 60 : "MaxSpeedY", + 61 : "MaxSpeedZ", + 62 : "MaxSpeedE", + 63 : "MaxAccX", + 64 : "MaxAccY", + 65 : "MaxAccZ", + 66 : "MaxAccE", + 67 : "MaxSpeedJerkX", + 68 : "MaxSpeedJerkY", + 69 : "MaxSpeedJerkZ", + 70 : "MaxSpeedJerkE", + 71 : "StepX", + 72 : "StepY", + 73 : "StepZ", + 74 : "StepE", + 75 : "Setspeed", + 76 : "SetZOffset", + 77 : "Rectangle", + 78 : "BLTouch", + 79 : "TempTooLow", + 80 : "AutoLeveling", + 81 : "TempTooHigh", + 82 : "NoTips_C", + 83 : "NoTips_E", + 84 : "Continue_C", + 85 : "Continue_E", + 86 : "Cancel_C", + 87 : "Cancel_E", + 88 : "Confirm_C", + 89 : "Confirm_E", + 90 : "Info_0", + 91 : "Info_1", + 92 : "DegreesC", + 93 : "Printer_0", + 200 : "Checkbox_F", + 201 : "Checkbox_T", + 202 : "Fade", + 203 : "Mesh", + 204 : "Tilt", + 205 : "Brightness", + 206 : "Probe", + 249 : "AxisD", + 250 : "AxisBR", + 251 : "AxisTR", + 252 : "AxisBL", + 253 : "AxisTL", + 254 : "AxisC" } diff --git a/buildroot/share/dwin/bin/README.md b/buildroot/share/dwin/bin/README.md index a00d679bf8..c78f4eb97f 100644 --- a/buildroot/share/dwin/bin/README.md +++ b/buildroot/share/dwin/bin/README.md @@ -4,7 +4,7 @@ Tools for processing `.ICO` files used by DWIN displays. ## Introduction -The DWIN LCDs that come with the Creality Ender-3 v2 and other 3D printers contain image and container files stored on them which are used to draw various the UI elements. +The DWIN LCDs that come with the Creality Ender-3 V2 and other 3D printers contain image and container files stored on them which are used to draw various the UI elements. Standard `.JPG` files can be installed for things like the boot screen, and `.ICO` files can contain several images within a structured file format. @@ -48,9 +48,11 @@ Pillow is most easily installed with pip: These tools process an `.ICO` file that you specify. The safest method is to create a folder and copy your `.ICO` file there. For example: +``` $ mkdir hackicons - $ cp 9.ICO hackicons + $ cp 7.ICO hackicons $ cd hackicons +``` The following explanations will refer back to this layout. @@ -58,35 +60,68 @@ The following explanations will refer back to this layout. If you want to edit the individual icons stored in an ICO file (or add more images) you'll first need to extract all the images from the archive using `splitIco.py`. -**Usage:** `splitIco.py #.ICO foldername`. +#### Usage: +``` +splitIco.py #.ICO foldername +``` -**Example:** +#### Splitting .ICO FIle In Windows: +- Create `Split-ICO.bat` file in this folder with the following code: + - `for /f %%f in ('dir *.ICO /B /O:-D') do splitico.py %%f %%f-icons` +- Paste `.ICO` file into this folder +- Run `Split-ICO.bat` +- A new folder should appear containing all icons -In this example we're extracting the constituent JPEG files from `9.ICO` and storing them in a folder named `icons`. As each file is extracted the script reports its index number, byte offset, size, dimensions, and filename: +#### Example: - $ cd buildroot/share/dwin - $ ./bin/splitIco.py 9.ICO icons-9 - Splitting 9.ICO into dir icons - Splitting Entry Data... - 00: offset: 0x001000 len: 0x10a2 width: 130 height: 17 - Wrote 4258 bytes to icons/000-ICON_LOGO.jpg - 01: offset: 0x0020a2 len: 0x0eac width: 110 height: 100 - Wrote 3756 bytes to icons/001-ICON_Print_0.jpg - 02: offset: 0x002f4e len: 0x0eaa width: 110 height: 100 - Wrote 3754 bytes to icons/002-ICON_Print_1.jpg - ... - 91: offset: 0x0345fc len: 0x0d89 width: 110 height: 100 - Wrote 3465 bytes to icons/091-ICON_Info_1.jpg +In this example we're extracting the constituent JPEG files from `7.ICO` and storing them in a folder named `icons-7`. As each file is extracted the script reports its index number, byte offset, size, dimensions, and filename: + +``` +$ cd buildroot/share/dwin +$ ./bin/splitIco.py 7.ICO icons-7 + Splitting 7.ICO into dir icons-7 + Splitting Entry Data... + 00: offset: 0x001000 len: 0x10a2 width: 130 height: 17 + Wrote 4258 bytes to icons-7/000-ICON_LOGO.jpg + 01: offset: 0x0020a2 len: 0x0eac width: 110 height: 100 + Wrote 3756 bytes to icons-7/001-ICON_Print_0.jpg + 02: offset: 0x002f4e len: 0x0eaa width: 110 height: 100 + Wrote 3754 bytes to icons-7/002-ICON_Print_1.jpg + ... + 91: offset: 0x0345fc len: 0x0d89 width: 110 height: 100 + Wrote 3465 bytes to icons-7/091-ICON_Info_1.jpg +``` Once the individual JPEG files have been saved they can be edited using common graphics applications like Photoshop. JPEG files are inherently lossy and will usually contain ugly artifacts, so cleanup may be needed before they are re-exported. Keep the limits of bank size in mind when exporting images and try to find the best balance between compressed size and image quality. ### `makeIco.py` - Combine JPEGs into `ICO` archive -After editing images you'll create a new `9.ICO` archive with `makeIco.py` like so: +If you want to create an ICO file you'll need to use `makeIco.py`. - $ cd buildroot/share/dwin - $ ./bin/makeIco.py icons-3 3.ICO - Making .ico file '3.ICO' from contents of 'icons-3' - Scanning icon directory icons-3 - ...Scanned 16 icon files - Scanning done. 16 icons included. +#### Usage: +``` +makeIco.py foldername #.ICO +``` + +#### Making .ICO FIle In Windows: +- Create `Make-ICO.bat` file in this folder with the following code: + - ``` + setlocal enabledelayedexpansion + for /f %%f in ('dir *-icons /B /O:-D') do set f=%%f & makeico.py %%f !f:~0,-7! + ``` +- Paste folder containing all icons into this folder +- Run `Make-ICO.bat` +- A new `.ICO` file should appear + +#### Example: + +After editing images you'll create a new `7.ICO` archive with `makeIco.py` like so: + +``` +$ cd buildroot/share/dwin +$ ./bin/makeIco.py icons-7 7.ICO + Making .ico file '7.ICO' from contents of 'icons-7' + Scanning icon directory icons-7 + ...Scanned 16 icon files + Scanning done. 16 icons included. +``` diff --git a/buildroot/share/dwin/icons-4/016-ICON_Bedline.jpg b/buildroot/share/dwin/icons-4/016-ICON_Bedline.jpg new file mode 100644 index 0000000000000000000000000000000000000000..68d65dc5fee0ba496b88c63a7dd8bae1e52ed60a GIT binary patch literal 748 zcmex=eOY?pU$4S9CCZ9sD+e3`nUL9f}yb|TAX6Vm{*h?zY&@-*RNpe&x)3NQ}mzDVUNjZ zi@3K?u&34D*L^w5R(F}XKAJ6x+xLD64L!u!#uF>KEj4PcIqSa-`R&gN&g5{_c&IVX zxp%tj?%MnQ>&sPRu1=~7>j^tM!zQBG_t+$NG5hGliQuo4BlDWr5&|`OAH{k~xC5+&QW`N6*J~c41-Dx^s)3 z{aY9<^IT?er*|X60%@xkcf$2vaJar#SUqW@jVpx*mJ5(K5^S|2F{`tmvEo literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-4/017-ICON_BedLeveledOff.jpg b/buildroot/share/dwin/icons-4/017-ICON_BedLeveledOff.jpg new file mode 100644 index 0000000000000000000000000000000000000000..853fa5159b673e2fb3cb0ec686b33887b2e824fb GIT binary patch literal 2707 zcmbuAX*kqtAIJYQ!`RD^VXTd%K~ZBn92o~8Q5xG&WE&jo31!VBjx3XXUs54qhRK>G zsX=7M(t|N(EZHig5`(BbI@j}}H_xl{{ayEcUBByl|GuC5es%9N_ul}*=gch301yZO zKnDfvvjLNX?%(NW$iGWCnBIR5z<2>g;1mP|1Hdp41P0pg0b~FG4B~5!20_~X3fGcSHOgeZoh#UAd3JT%k=HUf_ z`3`K21L%Q3U@i!h=N}pv0^;I^0z5F$BfKKwXr#lK7+l^cHxH%do?qF**k=KP5YWL* zAuzxY_>1loA6$E zG5-$#HGickslg7tU7B~d@KFRqhGJxJ4DHbO!9~i2p>xCwmm7BN%UG_?vgfJ3bn!)B z@@b}|dn8mRsLaEPWRmsrn3;ck|7C%9A6I5O6pTB_Oor;R>UhW&k5~b-h2!I7=}L19 zrm4Gg5>1)e97r(G)Kh4gD@)kZ9dX)y#3SI1!gCB;=yn< zm{QW%aWsZt`uv_o0{^)eIk+jl%QkB-?h5hxZb-k!s|0ePc1NNg}zGjE&Ec{dh`%r=~$|+A2v>i5!P^y74So z|MU!_I0J2Fcrxe8wK>#n;@|BpO9J`o0cx@M*XJ!$g@_Y4%Ka-<9?`(Jmw%mT$*HQ> z)`<$UQ;U(}y?b@cG}Vn^n|L%)@GylpQ@HL$--^<_Bi>Kq^&y3bVg?mA za;%`MD5Gi5I4|6pULi$c_c~SQ-Ztvj2&zu5iB-zb3(V_l6~8~WyWlwO^1exXQt%{p zB1(2WSuOs7mKn(>2>Z#bna6$OY?|fU@AVPm#UqM^{l;J5!GY#~J!LhQj)WjYJ;)XO zOivvX1Rs3JtJ=nqds_D{wab4wYWUCVAy+5KnBlZ?!nA5sr2x|RL_b5SxxrE(B5}!} z&ce)Wd^)S~+^lJ@xbuE%S-k6-S#Y^HW0C)tdS6#5(Cxta)l zw7GAeo8Q~!gcGfvIH>_tc&pyr=etPP&hK%mMx}qlq$Ej5fC6$Xf z>kx54f}>E>ryn#GL+q%nD!jF*7k#Gq<$=@7X$9gbo6)iZG4Ng%hN3>`Qe8IWy}1^uVFQ@s{gv z?3s<8W^`Qgge7ch&&zJPP0}~(N!-&r4sR1qa%W$Jo4|4&SF27MvLxsU4a5Tb^-$2&V)aH!6@lI zZL64Gsei07*W(#^;FAT>W|Q+n?1C-W?N*8hXI;DC$eHA1Bf%akD{EBv;kj9)L$B2L zJmOf8Qf}>N+ss~SQ46URFG&=e?ku{Jck3+rJQ#w=L>3gL;eSky=tqaVFX+rhVL#OB zUlleMm2rO*u*o)1yB?8F0e`MMj>NFZ8@NMW1NcsLkq)&6p$WQ$r*;LU@@F7b`!GzBxPk zvXhp@-N42ccqe`+*jas0b{SvYWZ&=DbqB?#!<8e5@)1SY1QSat!j*UWVXJ)QjZ5IkOG_Em5_q!W)BeM0jg+vZv%1wm z@I6_dzL`iStZkcD0Ktw`qcp@_u9cHpWMqny{$R@x z=jblhb;Y-_SzbS6x_LxbL@I7JN{8+PWUP%zf;?kYwY1$fw({>({5X|9Pde6WP3N^y z-sQh^rYp$~0%-0$@7drkqRwqOf|%>N^qtxYPMTkWGZ~UZFurQKgyF7`qgu)FD16hz z7#_0h()zBympUs)WAp4CF6^3#$=^5>y4$=DjD;9(E>H}S%lBA2h9h69$7KvszAe0F zFNx3DF6sQBn(n+3m(E^u|E|%C6SIDewHN>J%rJ7xm996uGI8+d_Hg>HSkIb_qSg%4 zDDiteUz7I%g>R46(>Y6qzcSN*K?eUyq`AL0_!=aHY4e}nBMe_rWe8?N+$V9GMoA6q z!T!MN`B#$JP)|n;&HByMZRtMoqCh%Uvs*eV_0EqlmeUo6znXW42ePU@vvsjS-mOfc zQa5&<|7aPnx4Z}H6O7jWJ0_plQoJ*0g6q3Nwz>ZC^~Aci+Wr2syxHEJrfsH2@gjeC OYABj$&U>TwC;toVRK1P> literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-4/018-ICON_BedLeveledOn.jpg b/buildroot/share/dwin/icons-4/018-ICON_BedLeveledOn.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d495b57c0a6645390bcadbf1d61e269e84ebd46d GIT binary patch literal 3931 zcmbuB=U3C))`fo%N)QVH6ho1YN-qIK1VmaO6ltLoq#BBl1QihEp!62$Ql*4)5{e-0 zNK>RAI+D;V93n*oj6w*4u|NP;2nz_p!t4V?PJDvcPmKOQT&x_Y{=MS_ zpOh7O02VgT$p%1R(0^OlL2MkHEUaKI0K&_6{-QX)fP|!qV;)&rRpVc|lhACSf7AaT zoB%rqn1z)M#C1|ug8(e-04ocKm5rU1^WPRW7FG~D2PcFV0P~5f@Lxc_KQADmpJScN zC8Y+t6O+MQ08WEgPW*x(fF2OT1S&To+<9%i_g(DvM@+X1{N>U#Mk4Oj^Uo`2e!9rm zd|g1Ox1|KGXfLa))vKjx&}UuWV^v(=Kgt*nu(ur^^KTKR27j<7u2$sm5ggP7>StP} z_dcPl+M*X*b_h)16M_l!@8Vq|+;hwQCCU?POEzS4537h~=+L5X_!yMqZ>G6Bl8PSEBh()4Z@{Lvd1r=kUu zne44bRG&|`dewdYlV~Ak@*%a5B>N!)acu8>!VfL2`=p1M!z2IXibVKaI>@6oa zQt!F*$Rb3`+!=(L>V}mxUw8U+!;-o&@#Q7Kx`}-4Ef~J7y;jHw9wm>EGVx1hhggJ% z48T^EWp8nXwMjb&o30Fu8@84{hpG9jokc5E%4!fKq7>zR^9<+LI7`&nLV7_~vMymkB)loXy#>X-DbM`+ST@-d;pXIu@)vksQ_K zDW~>DgpGB>oE05x5>w~50AFBXGwh?KHc1>HAM8^pDi`a#prXN6kkm?~CggyH6yXbn zVpfb*933^GLdN&5KKDD1cW+EHzDeoZK&OvEq$Qfo&fMeipL{^I5AMzfB($v*g<(|XU(<;ky{ES2+t z-Bt5n_JKL<*}X=sv;yr_sID3hRmz@_wVfJJf&6BU_Sq8+fpqbK@u9nc*EyTBJnS6W zy$hgHan2P@4>j!4dvM6ZOl9L$_$YT$irhT||9Y4+qrsb7FVOI#*l>V?%CjMM{Z!l? zpQle1!KVTiLf@K*jTfzlOXXnf4Tg@qZpP2FEO$bDY*k!TPi^KGPK|lw8E%jlo@KRn zQ>Ww3t4Viw^(~&eDwnA9kOA=epAGHvCB&jj^-6RnWElze?W-0O%E#DO`${ELH;sr% zCqhMWdy%=#v5=z1HH3`8mECxU&Wz0OA+h1#4nF%O#$HE&5){TJmfN)521tDv8qMiz zd7=8RK*y-c!*YiubJX|yVRdP-Qui)ufn^+>(=yR+vXWv`VTK8eb#3(S4N_KbXkS*{ zW`TTj!83tq&C*2CJ2|-_iuPA4IMgV25ruY&c$OxfPA1^?uI+6Xuai!Uc2-aY6X-I% zcGM9aoFB#haYu7&6Eze+{j=p=dNr}w^R|H`w~a+j&0GKu+1lu$X&ye4dPO2tWyFv- zMVO{Rn-bna2$x=KqleT zoKIwmzZZ%7GBZD zJd%p<-SsPN-ExtdmDyPOx^VWwuy5If7n*(^m?pzT*p;VNS&7iezCB)c_{E)c=w&;M zT1zHEl8~KH`$}g#q)F%;j!wmUqdQOECG+02=6rLkFN5wYcHHODE};*~6=`=S7(McQ zxT`Kq4y_3~dNZr?=-GX@cT1!GgQQKfUkT|Sii~a#PR6xT@0BMvr=i7j`C~?&)S3n9 zbxaC6lE{651_9sjjZi^Ji1BEq<7&;?k?!|STvz|*{@UC}*TYVYL%VYdf7jk#iV9bE zXjOUojKIAdOJwmGk8}20{`>?OZahuI>n$IAzEyS=N0Gpa3T~1_Fb;WE_oj!<&KTwJ zE-F6BA$x#$*F#faDRyoFp=$g>C9-gHv0SJnwg^$y1m)Ee{;2adtQbw@`zaI=jJ|$% zymFy9bi6CD(6Ym{%6Z6t|6Pc**oAXz!R&UtvSzCO-Y~4_~Oo z{?+Z0o`qRmD2}HX)pb{FVDt%Gh8MiAA>)rz^Dgo>&dvbg)NP2U zke9k^py(C$M}_TinUex`w_DS4M3yhFNMwqa22|i=lI?SJA6S9@DGC*t#>3cJxp%2iatuMff%GeubBWne3uRnotu#ZOzsW&sQuNjjvX3tiyNFLR`dVfd5=wObMeboqd|Dvp}mMn2^|%&5LT`|4{xeW&19At?XNXWL<8M zMhM+(p31u|Fc*J2#nO8GteWf!DO^PUNU8%Byj1tt6}sZ05`G5x!U_vxw|OV;Y3k$< ztkC}57Z$$97(lLpNwJMG@x5YV878o)Vz=R=W;19wyjt`B_~$*^&t5B8ifyX zYh?Q&g^$lCX^0xwo7Y}+>vIOgOYGL?BAYVYXBp_73|hx*-uvqAh-qd2Lxlla%{f!! zBCdeIC%Cug8;$ci@4v$=8!cp%Bl{7WSzXPs8Hm&JH7RJ>(d5`jUR%!eqzkO>!+1U3 z?|UzJF+T1B(zaEKr^}F{33!az+4AuS7i}&xK(Is3Uw~)wr$ur0o0-OK##Iki$IS53 zS2A#VTLy!oKiuzhSBs;{U&o`OlebCu#iIgloky+`8hrr;odeCMb_I;*USQ4~JyF>V zJ5&xdWdg;ONl>w0uSOaES9POM`Dw-RCe*2yK*!2CXEBGBSvsr!W`H%xZ^2{qc3qedhPy!RfTFpvn>O&^N9S4_&mLO;Zkol zv&2f2@+&cA+SWSj`U2kx(x5X>4YHlmpkjd+IA4}v7GdYRuu}?;#K%m0Y+tdkIhB$5 zzm*7GjvZXGa`1d3bNyB)*e;A_$ZqMPF1XP9hN|kX8?f=ff!&GPS%w=JysYywUZ4PobstAW#8ZGIEw`Ay+An)QSdsPxCOSPGE(9wxy`DH(K+TU}I^P zBu(w4mn(8_lnmM&Z((aQSMFtF{lduhfhMiblU~R7cFW*FgOQ%dfy*A`tp-Pe=_&HW z%gy)Z+p{+7Z>yT%1x9v0#9yknGd;NQQ}iuZ=o+%)b#I5}Z11niV&$gia{~9X|K7Ny zz3cRvdo6KZP;&dv&ALl+zDW5ok-;<9d*_kY$cAaoc*nVVBcvwDTdN9;*GEWsXZ3sQ zujTSbwDp{iFs2`b(Ytls_7?W`QBHkJ`(Q5Ue4?ED2)AN(^hTwGpH0lPmOxVh2|sA5 zCYz+n1jc5JqNyU+j(uP6Fo7UU5ghIMZH~rSjH@w>zkmlf6I;A`wFQQs83A%^*1eQy zTTd_RG!#)?U`AwCK_lbhhw~Obhh8}|1B<2XE$~%bq=*{NdbRP$YP10%*b2!6%oztuJ#`%NF0ojm&T(c3!GE9o~--RCa$ z`26~^e!SjQ&IIO|fX}b$<0zM(Rx>?IL9}D{m(g=kN~6C}?=@e1!T%ntJZfK=m<*es zcZq(BLVN3QK1Mv%OE=p-d~9_|Ha9T~B;Hiz`xIiNo)uDH)t?FblG4}g#-BH(3BFoS zk}4=z5!$Gqqe&d^wtEYcNS-D+5a~Zs_+;V@jZ7p=`Lnd}hFHlA;aNjFqr>uuP0n*E vBt^bWRcORYJhl_3Kk+`%^&HN1@H(#vuU0v>aoh7Ryg$ixmAFexVb1>trMM|! literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/009-ICON_HotendTemp.jpg b/buildroot/share/dwin/icons-7/009-ICON_HotendTemp.jpg index 0bf1437c646d026ee3df5e16fcc65f6144cadfb2..b3551f3c5c6416f0b6cfb623d75799441f9f5869 100644 GIT binary patch literal 1119 zcmex=VWcYuZ!5PS-41f%w%mkqB{|6WZIT%D3M3@-`8JGka znFSgDA7Ky&JB|SfaB{G70VUK07?_wCnVDEwVREc&EbPpTOdO(O44gv3A`((zD{lf7 zN-#1oGcv*yfoV2&4pyLyBG4XYMxZf30s@#>m{{2u8Q6tI1cgME|KDQZ0m%z83o_U< zJdtZQ+a7V{+t!CxYuCIjn>t%<`kL#_(FeUuRk}q}SH}1BsFj2^6^Iz+RHTM#Ph{~i z-819ih1A)%7p&Q=c627|w$|3wT5Izra{+H?`IPF!jjiJXFPc= z_Mjtgf>XQqxwar3HOsP_*1TfN_51lIyUtu!Z@=!M&9%s**||~awwWF4T`ePI#eJlH zcKiI4lB$n*W^m>G%^p_8$+gRO>g}(No*Jw2{K!0MzL4!}mS~-9SmbN0sd>VoeAg%1fXzvZHzqN0Z+;r->z6qyx z?mE%A!8w<&Zu=p&d41NZ#9U>;3f_tT8D=iiJN?+A`<|Fuc<20C%BR|U#dqxuRy`|r z)%|wLMRA@0#<#9E!q2)Bx;K`z%sidR+rghzO2tOH}Oi&t}kNOWDYh+QoXOo&V|%rjVVV zKQ^~~dwuQ@=SUr(a{{RYE#&9iIYi$6)}U=5BfbMc?g zUTyOxIwgfyI;`)sc~{SyRXNu#-PwNW+oXX0BrcZ|k}moC<&SfoUh(JdgW#UUqCEQZ zil!{mt2A%1o%r@;TX&$t^R=5yYX!con*4gpyL)HU8@b(GPTEyCi(7C{s=GY#=UcY= zXX~8Ts(T7OKXUl2?4#7f`X;BZx0qJGTC_3#)dGoluZUokzk!v#L2*q_r%%21`N3O1 z#p3GT(3Si?suq&g4UaU_JL{hNs@=3;cGw}q zyeKi(b%)y@%Ws|^qoX|WcjLqDHw<1Ja-A?u?$zem@;S@$vodvVTQ?o5DycAi`O3Gq PC;iC;LxT^W|K9`vQs|>F literal 1671 zcmaJ=drVVT96tB_DYr7$AnpDWAIl;Z0I43w11MVTB2E{5coY|(%={DywXLnjDm__{lIQgA(zVG|} z&N;smIUnfmVm_&(Z_x0vExgygQDS3>%z%U^D`Xmct33I$gf~*tYLxo zDEvZ5V06>Nee}5RM6Go{Jfc|e)rBJHn;{i~}5mc5C7oaj&38GO# z-vlbdlrqtKJjt19u7L@FT#3jOaUz0hAQeodtcl7AZoO)89X`(%=>el*8n~qab3sk} z9OuctvAu_;eUmtQXI1KR=G@8>(J_YAEet(DQmsiFEb4GV9-du!`s~1wZN<7Tmj{|m zr#^k5sB`(sUDm{_HQ`Wp;<49BjdHxX_F#8e(dB{F?>7gkcQ!2DvEcKs?kbrT{FRjV zUcyt4{%~k3=I?z<*;E$pK5%3G)G5~|37hlVF5>svu06eFDK*g1z5iv_X4^U?TsPCc zd&a!nOO95$yB_^mQ84!Y;R~hQM{`_D-q@TvTQT#KG^JxcDlcv9DIC{wFI0TZFnw>s z)_3hE_EuMsS*?33J6HF8hBn;j(%{p$+NQb_jmLy8bwMb3fc&EV#y@H7+AXe8)!T2U zafXw2vPR%X1_U=_(Rr*`?`P-_#PQBuqe(8e=@{O+=_Z-~V z+R~N1puVQUdl}pJ@1*SOJx!=WdogFxcZ=(sD{MdKk$+VFPLy;`9P?x2lfTdj%I)Fj zMOAGpc0Bo<_0H=h<g|4^;aNS(VWcYuZ!5PS-41f%w%mkqB{|6WZIT%D3M3@-`8JGka znFSgDA7PMSU|?cqKn5I~jO<)M84UpjCMG5ZRu)E9s5C1ZGYbPoa}dw{XtCb5&-g1)>@*m0p$TJd{g{2RmIp7~$xug#3+zBiL^`uA?O z`4q;b94l23RhCY86VB{Qw~Rbi@H?7aW6vi%!xxX zk{$;Hm)ECc&GxCelhgQJ?8U2ZPj7Q(SKZhCy2*CSHr3YxUZU?-mFzqc!ciEOJt=eB z<&0PfR-bULD;1TZvze3DP3KOO_@%17_=eTfpsrho9vj~LQWEO@`FnP3YTt{AW)52e zu5!pd+kQ*A%#g$Oo%v_0<(DI+(^vMM+dH-Nul1d;;jb=~@Obf0yuZCNVe?8i2t1Y;ZuKknybpCa{7l&LYOtA~yJX?NS hu=&xFDK{$l4p)^_nqIy$TUz4$O@*X~hv)yl2>>4Inz8@@ literal 1655 zcmex=+JW@c$vRenv@2ft9{~ zUa?+cN`6wRUUGh}ennz|zM-ChK7);YML}Y6c4~=2Qfhi;o~_dR-TRdkGE;1o!cBb* zd<&dYGcrA@ic*8C{6dnevXd=Sl&_Q3Q(W~w5=#5%__*n4QdyVXR8GDRC#&1Ub(Seeo?xG?WUP)qwZeFo6%mkOz;^d;tf|AVqJOz-6iAnjTCALaHmqNUdTL3o}Ygi#E^!3HB zG&dI%0AOQ_OM+4n?!{_waY$uBs(w&vaeir0aw<@{GDvfQm2**QVo82cNPd0}EEEGW z@=NlIGx7@*oSi|TW}%=Fo|%`DUtX*U*5m7I<(XGpl9-pA>gi&u1T;l2Gc(1?($&qx z!ot$U$jHUS(9qSF|+YBuXjBvmNWHB)TNgx3M%uLKc03=vIfSDBx z*g=2;4nW$0s#%$tS=m`xSdnDlO7JuOA7BvVU=U&uVrCR%U=n0x7G(T?grS~+fteAJ z{edhFPA-rO(S+F=~y0b!_Y1l^yo* z@t=H&d(Iha3@3VBxv`=v+tc&X&7GppXF4}E&2y#?DbXG?jJmU zF1v5ey$@%c7#miHCOO=mlGT*(%3OVJu*H0pohRZxh?lUqy6`OcGSlcs0_(Tk+r;+w z9h)x0pSb2$(4+YE*?nudd$N-2+aI}EJ1kB4Y@;sS zee!Poms_@GCcCq9D!oPD+L&!hixv}HGWY4E_4P|0oqoD<>DD{Ump7W2B;SzOuIrc1 z7ZkYZxz$pS23L<_#^&X7{nJt(KQ7{#mp;wRZY`tgk;uiLwyh8>T{->qpSXI(1E*U% z1*ZA*U%%pz&AeWDdXQv+6!&%|?u&WP1HZqVw(ITBOJ81{JO3%~)$NWCHww3joNR4h z;_B|Z)`FjJbBD>L&_l}#?`+qS-OH*W^N2}S=HBj|g}0ACd9~@OZ5cyggT>CUBU2rw z?fkS(&A#vR{qu#VIF3J7^e>sXFWs_nwgbzA3$y3M76tH2&ExaSzEB$dZ^r(`JKTTD if7gHW{<*yQsh`td*m>Xmu~csVgY_aSv>#3Ve-i*zHX2s| diff --git a/buildroot/share/dwin/icons-7/011-ICON_Speed.jpg b/buildroot/share/dwin/icons-7/011-ICON_Speed.jpg index 387c166566b72257cbca8cd39c46ceee6d9653c0..83da633221b85f30e71ce77872e91ccfd52c5649 100644 GIT binary patch literal 1610 zcmbu2dpOez7{`CRV3KCDW~YSB{fx9kaY80jO)fhTv2r22afRSp1yAs_$* zh5VmFB_NU@uoMg-jg&{BajN1Y1&|p32?hYDq?Cj>P#6Dzhy_0k|MB7pDj|tP$V;Js zomd=Uzqx1(*e;I22nYf&1Kv5NcC4L*+|m6y5v?6FcTt0SL;Wxqjuto52Rr@C@0op7ze}wiI)2+j7xVC4t~)jC_%Al6W6a zb94UKQ{m&TYZnsf{MJ)->~KfuTB`aRK71+r1vgN$Hhq5UR3Jv=&Q;PmXUUd$tTFjN7kPch~PB&7W*uo8k>+!7-kLV&`ev`)3 zenY4o^zXoBP{EUqB{?t0k=3CZ@uys5mFl(8hxTUYHhkq)rJ+AyFASCkjYm0`SebT= zR0PsIhR!&u>tshTaFk9hfi;QHzxFh_Z*<($-ZuB3nd5lrLefb6E4X)RtWE~1Ca~p(G!O~2y5P}JH&+-mux9QCt&wJ*BZ-o2S!5;O>_pbW{7}WX4hM(pP+pM-1 zW2=WpSfM3(p1Ut#tL6-=5Q_aIW^KARoYWq|df2*TP^qD&Onoj};bvBiLnDv$A-~ya z?qPnfXf?8l(w|uhm-K1)y>?mNBfId{M0X$4tEMJcub7vy*S<0CbWj)WJP|{{yP*cR zT9p~{-5ZfUtZ4y$Wx|_Z%Gcoy*YVFJ96jSe94snVG1CjFl^CG8j=To@*G)%Tf$s0n zzn#;wdo5!QeNdKtv&K;-rQZSrX1o%X#TFJ+OJ^oABb3q6S9K}G0y+YY{2G6c!?OC$ zp{{nEG|m$NX)aKmC7CqBJ%!OnjL>gmj3>hJLl+B-=B+#P3JZw!w$Xn#*DE!D>t%h( zhj_hfA4UtBcTQiooV|XZc4Y{~(IU+zI~_~R+d+dB?yMGmT(NaCc);x~J7!K6oLXqb zs0z}MDkq)T7;>iaUm7?Ud_saZOJ-wbZp^A~ZE>bs-YcS3!FOC)O1`o73yF}h9*Wvtjlv1IzE`JAi{&fF z2h8#n30`a}$-1*r1mGAF`4x|CyoyVOeJ1D9jbs}?w}sZsyoL^RbTwl8!Dd~mQSJr5I(B;lJIZtpOEegaP4@?sQ=Og1Xa5rMK z^*RD6e%j;WK>L1sSR2XF-3wKW9X@Zz8MNkvStd9`2K290gT} z)nVeMgG0bAh=iH1>6CpA_xX@X%=7G7cFK7-@>YvIU(<>nxJz+T_H`tMUt#@8k2M~c zdD+)^+OF5#p4~#8`Y^gBoAoRK^NdS4kF$dZaGWpE;#SB>%=yrAvgcVRrRuwj`Tgb6 z92GWq5;N=?pmuL|mnAy=AE?ty&~ze(MX- z0uvvPKp^5V@ptl)lV2-#Ijt`BTj(1%exww;Vtt9IeJYh05x|Y#>fPY2(dqOJ(dfU2 C^{&$Z literal 1706 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 literal 1654 zcmaJ=eM}Q)7=N$V^5F-w2u>%l=i!_v^xA{cUSnm@g5p-J42K)2DZLXea39_swy-%8 zGAEe1FfyZKahcPNxHue%8!9R=5F+5BnF9o}ff^@~xMjw%g}LsoQgDg*`{T{?KJWAU zJ79B3V-p5ih90k!OY69E4xj1@@|Z^bZH)VoQp zfYN(72J^Xj%&0eDU~P(zcYBH{2`QioY1W4R*4%<3G-*R~O-_T8w^K#*hH`;=tvoBo zQ(o*LNHk>~veswyF+4*_Zp6owu%gvxLj&Sg*;d>biUdNWVjG&OWJR_*U5K3%D8!^s zPVg9$aKudLjmZWAPl`uygVBr`%$PAT!C3D z_3FKedQK?Bj08bo1{}lj1UVu>EMq0NFM$3PUo{j8AfS9KvtBpshN78DlF!d@f4O#iCn4Rq2%ybh0I&+0_B!CA&28i zf?aeKaS|sMaXezTD_yf7t8!_UsDaa*fxT&*pm2qHrIkSTj=-m{VA#e;5 zxVDv^y%zJVdQ)6-_F62naxu9WOnKZV9y{ogCrB};M_1lV4?o4q6EDc4?Y|Eq0s{-k zR{0A-{vq%#fTp36EtN`M<>fJ86)Zzu)Cyot0HF%PrlHW~XblW&LN#j56DQLl&o=z6 zKpO@kK_m=mfl3R(TFBo4Dgc0?neQ)KVc~N^A=&wVZ%C*nYykivkV*}Q2ag~Xtk#5t zf-r65!tkhM%W^x}5xpqGOnj^bkWwnF2}(m+6<8h#t5Y>0#)VNR9-5Z8BKk%DAebko zS7~7_NC5};R5i8rPfGfT=8}QQ+RJaKNY#bn$v@h2(pDOlzSO4~YF{BNSu|4D5Vf`a zN;e9YwcdQxHnjJhyPanb{BmYu!$eF+xCu_hUrqbB= z&!4Z^(*45HYlSBlGG2%&KBfHHOs}?pU_0H^0YK-*TvW^N$C6 zL4AKuwhxceqEja$@nYc4b!&o&0bCRaE7k)xs#j6 ze#$#Fa(wBf?lbH$q2XBPz0dBB9n9K(I7+>LfiK&Viw=IXtKqx9&gh4uu6O5{U31^B zwvlAjd&IpvdgyY~*IkS5%x(N3nK;$t8(zO{&fc~ICezWl=Ja0D%R_~HCrd5;?RM2zZgSKPi> fU*Y@vVs3BC^53`X91F_*pz<72wdR_-!hhpG8+8u9 diff --git a/buildroot/share/dwin/icons-7/019-ICON_Pause_0.jpg b/buildroot/share/dwin/icons-7/019-ICON_Pause_0.jpg index 2f6e83110965fd56b0366cbed7c0a52524a60922..227f0dd8f4859e7f75fdd9783577fba2c3bfd777 100644 GIT binary patch literal 4340 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 UmY3D&e{sYA%_0Arv-7Y21N=qqO8@`> literal 3592 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 LYcc5W|9=wz)GwsQ delta 1038 zcmX@gcav{}8B>g@ft$0bg_Dtysi~u(p{t{#sfC4$xrLdbxtXDxfwQ5KLPc(YudkI$ zesXDUYF>$_i>(q+L@y;X#R{s|7?5|o-|m4e#>LtJ_%%Q3$b zo6Nw##LR#U*g4raCM&Rr)U&Y&Ffg#Nure`mvO*OwF|)EU3bC*Y3X6zwFo-HCD>^2t zw5YnKP8C;AU(PAWz{teH%*xEc4OP!5$Rxxp%)+2(s3gM5#_m`s8kpGVl%(uDIjAYQ zStVtOYU)z8|F;-;m>C(E1epaH>=}-ii_HbT-^=`e?+goDuI*L_m!Lgr@1&3Rp1@O*+4^XY(JrZKxWWMA3M zr}I0|>fE1*O##KrEKa3dh-&!tJWa$ZYhR9eids2?P3Z^ElgeQo`LhA=V5rzyUS z2NWfiu_P#bd3>=uQ7z~6_FH$(IdaRY#S~cdE}rLjKw#DrubyKJzg}mWcSN7sG`%=q zb?L#+l2(Z+x$G&aGZPh#E}9_lq%il#wnLAfZhd0C^3m2TOOwX@yJC}mm|dS9E}^Qc z6SDJu+1=QM4oprHeI&dpLj7BO>&+~j7O5OL(K6>^d-v?B!h)B*<$Rm>X>AOf5?U?9 z_I=f(>uSYUE&cL^c5UQnZ1Oq6P}VHHd!oU_Z=c%>-pcNe-CcTjeb$Rt)$@z5y!cWT zX}tOKo;@qmW*=^|>+7;HdR}?=L21UqMxH<|XTFVk9$h;VsS50=CkRc`c#t}70X{rPy7>KQucc1 zLBXisJz34Z&+j>PbZ%HR^Js@mamgyJYau^MFN(bOPObjz^2W!%zI1=*e})BBH|v-D zGyXNl?eF%_@v9F=Ka1Y|vi9}v+UAX~P5(1=U3{ilV-~;pMgB)S-4Clne`^K0e$rfj b*ZECy>bvd!Q5>~9F50Dde!YIa|Nl(@C8((x diff --git a/buildroot/share/dwin/icons-7/034-ICON_Language.jpg b/buildroot/share/dwin/icons-7/034-ICON_Language.jpg index 055b4c1ae8e6bd17d5cee0c393dcf8f297fc669c..8cebfa76c7f3f5cdbab6bb57c3cbb07d42f5db99 100644 GIT binary patch literal 1657 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 PF}+v{hR=d$yZZ6Jdc|f) literal 1871 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 clIFw{G6D2g$GU8wNe-+6i_@% literal 1874 zcmaJ=Yfuwc6u!wOBwBO`ARxY$AS%{8NrDLk3`s!Lpz^YV6&sR87R>IFED*3N0@g}> z;iyb2R$IrZmWs6M6xu=2suZn^4;;~0G@~$$2#AU(R?`jga601ml|Xn;YbQvh(vI@nN-0t5`b79n|`Du`@IVQfrR1tyUExo3OJFr_Mqnvl#xsZ{ zVmMUJ7s-Tjv1AS`7K%az!cc)IgeMd!gfc~l93BLh>Si{kE8;cLgT1Jok~?^)yu3Vq zUI-sIuM&vla=Ab#7Kp_>s)A?9$4I@EhgkxL6f}s%U`7cN#WC2Ws87RlNF|qY`t}GW zVp#UQclA!8PWRzblgV`f1F{w}9vSibUSUgOK7k105euGUHXu}apo>f>)Mi9a;^ssg zUp;h-OEPd0w`AZ1tX8{jZ7w`(8HyS4JWKEZN2gQ7Vir=58IV|wl1r)ZQPil=L`4as zR5GntDhm;bv?`TWCZ4O(ie=i6xhi#tc8IIN4LK$RBZs)g5pMLTT-P|52&%INF{8PN zG1`oq;DKW+(9yl9N7WnT8b|k{8I>!b%m`dR_nn_Tl%gic6%LOswHY3M1fwS2OpUg) z3ydEaSYWKDo)FDx10{eq3_2Cj>C{RsZvoLE3e>`I0b&k-B13-spBkvyo))=N6do1n$X{H+;Vlg}bU@#~T z5Oa`1hZsy6$J5Qrdx8%O1h4~r$B4LoDshw~hy!R4jYTQw_IIoeXT)hmZ0Bv@PWhm7AP$HG_UDb&Rd1s6Co%V2Fxbkb`yVC0SU~=Hwalab z{Osn+iJBQO#~Tie6T&41wq}L>X5O?5H~)_C-pegDLtsnNf?%eQ*R_jwbv99s@}70XCi~0;EKC_ z*7e+`Jtt#4$0@c}E;s<@6i-{^X)E1ZSnKobLhI#U-^8yA?@~+l6VKziFKwE{t3Bb~ z#UyXU9MPKhqi^b__xtr?P0KPJ$NEcuXuaKVDf9EJ8}Lk9hZb8QKW|>XdrorCSLIlf z7iw%<$46tb?^aA{Ob&%l-Tr8Se@Rtm?#|-LJ2s$Qay1h2F?4cF>Eh zCsXc7_47QRE32%2j>37ND}8ES{=!EiJlfFfcv$qI_4m-apJsw5Df2JJWjtwz3eOdt zJGG>H{Y1}~z7JSateUc|$L?P$esS&Y{Z@8r{o^P7w(Q#9!hJ779u@nO`AcfgOV1GU zv4NY*HV1!sb|dV*F%s{rOlZL}>!MpZsoM^JdaYjJ%h=r_2@8AJ$D5thXG^Z;o} zJy~W+jnfgL)4o1!=HTYZ(s9cp)>Ur*`i5xHU+vkV?4MVq2CdIYsCd=1Hn1bYk`R>i zu(m39O{c@*I8ek5YAl+;-p30tVWzdm(laMjdi|@LDLrCHnAY*2F6B_uny;K zd9><|pgb;NWydt}YhFyC?Vo*CNAJ#<-sML#9<0ng-r3rP=@z;dMBH!gAu=~w{mXkQ zemr>MOv~>43Uf?tIO@FhAEE1f AEC2ui diff --git a/buildroot/share/dwin/icons-7/037-ICON_MoveZ.jpg b/buildroot/share/dwin/icons-7/037-ICON_MoveZ.jpg index 487d6e4e4436a05c8931814f6bdd217184f40968..4af56c25a67eb2c1793949a916d674bbc9e31e72 100644 GIT binary patch literal 1327 zcmex=VWcYuZ!5PS-41f%w%mkqB{|6WZIT%D3M3@-`8JGka znFSgDA7PMSU|?osWIzHOoLp?|KpABL1}2acBMUQBo`sc}jh%^ukwH*YkyFXY5vWL# z5u^x7Hv=0711meoWDTG#%nXdoOl&X(%q)ydtZafp!VDtpN``@njU1wis{d~>@BkGs z2{H>Z*fVtI)bggCUl9~==jx01T0L_Co@(U@9Pn^yjuWebz(Ls_ub}L^)n#mR zpU;}+$~~ie+U})ukC(#;*Qn+0WJIEX9&%?>qZ(_Px@~7ZpyNcbyig%-r%SVP?Q3l^ZfsJ{gDH{r#}r zH9X!y`C5OkU{ib1RFOxU{SN-gf3(M5T%LE1O`7rD)+TGi8B6u2Gp}tiTD#|Hk9B)c zPU6ku;_Us&6wCNFD=v5b{#mP2*WTcBPqW*>eD%-%`TM#zsdRme z3tY7P#G8!5J-g>k7D!CZ2rgazY_h#6TiT{gm(nr?pE8$4Y@0Ce@eX#y0IQnotqT|4 zuemzu$?S)5cT?Rg`2u(R+VLr>GIsJYMj={Ks_L4^{jk zsk}9Ya-uKp-uLsEeB;+XwcWQ^D~`I^FTd_1uwG}$g};Wo-d&kHKXQF|SL(`pd6t_m z3I^V}EbbUPv0Ljjd(!8|qwh~`EPnjgJJ~g7Z^Er4r<~>Q-O}_T_dZ5N(C%syam4P#&U$?K$O%8CqxVA~<%#j!7Tp^MLJ8rgnGB4m# z%ytgtP@WWeE@=PB4|^UT(++>`pYpLJSYG5&O?{vFu11!3tJ0p#vT_ccaN$6M0!$?WiGHAV9KfvPb}H$4W;l zVig&r;wToaq86)Ds8fVu6<<`T777v_Q4tX}Djm_PkZzENoe{qucg{WceBU|u+;g3+ z&fDOl2%9kpfT*ZIzyc$1J_2lYhCVF|K!8rUmjU3s4f9h-l0f-PSeW` zoOxkLs13E52opx?5SuC8Y(;Gf&VV>d*)BJqgA9a_X$p?gl@<9^6OE{F3x)*qq+GpF zB0@ssJfTz|7fI$IB7rc3F9_ia#aw|96-ZIB92o?M%4RVnp|R@7!Ccf%!5O?%W@aWY zQ_RCH$$X()F6RqGe36JtMR2WIW>RP4nys^j6x5hiZ!r?25jP_)MO`AEK`J;@rEjlb zB8Fw(+pBj1HJT5HnoO<+49Hr^SZt);_X=C%vj~hIi&^muiyouGXSv7(sAax2E6(qEflKCPVxajAjF#X$=_QXf$Y)*-GlndMrw<;7}?&qtSq>!zChB zh)N&|mWqYK2&F7oEsTg%%cZgirC2Tz4RO`DKEs5W$sw*`gex4C>lz0WL1k8B7ULSs z5NW|p$iTHx9# z2sD_^aD&*M6TK!)X0iZhmTtED6gGfh8r=<|!-KLAo8}4A!A#CXp)$scQWA+JlXR=Y zoo!$om7B(f*X=@4_3;I;&Y&8|vJC~#gk#a^%`}d5+_U+zZB{H6Ve4+pR{rtKf$?`E7-hcKM zm3_`O79HIL9@yv}r3KcrH9ax;GdBj6r>;!wE^K`HWV7+|o8OCc(AN1UF9huQJCGQc zAGhs_cFUn_xm(HjQ%&yn&B0K8xm(gnx5-4F&kP0mtNmQdsRJ*HyVIE^@R^H5*V6U- zZX77^6s&(N&9Ci|%z3zOZb^&-_bZz0cKqh@@+;i-uCM7dVWtxt^Ol`H?OoF3s0ezn zrKF;+!{2&$W2(V?O&hmMnXq{GGS9H+;=J>|vg&Q6FB7wid>xvFM5E*%cWLpe($q!G zZ}RK=T7N$JVrf}48tZ#Ca))3Et*Ib4+M}b4rr6tJn#0X$Se9P4dO?+M{`jI&=?!L6 z%hBk=vLjY-H!z`o!#By5c5{FFFBdBUTm7CT{oCSQrFEO3zI$=*5m_6Jt xQ~#x9>Y|>E)3G@y+wb7mu(>B3Q)}e@xwofUUT0(H#La(&2K6V0#yoRg{}1V&YO4SM diff --git a/buildroot/share/dwin/icons-7/038-ICON_Extruder.jpg b/buildroot/share/dwin/icons-7/038-ICON_Extruder.jpg index 155b9a58576d83b82bce168280b0872d4c294d41..69e456c499ae502605341e550126e81d75419329 100644 GIT binary patch literal 1422 zcmbu3e>~H99LGQ3{a}9V7%t1H7#AWx;-TvtbA(W#RP!r8s*RicCK~6?InfVAQ^$-m zG+Uc8lQ1L^(Yo?;xHGAE$SOZFKikdY?vH!izrEgny&tdF>-m1mhGk-)?&0e03Lppu zEaU@Zqrh3deV#TUpGT0lWe)%b1+;(`9Krw?27+TC*(0zO02mws{}Do@x5K03mVKlX@HtW#;>j*`8W|M3xzXAs^2!@0y{)2}jEph)4n-MQ`Gmz~$VPyw{0A5YjsbWuA=Uh4Xpzh!%_T$ziI56sOO}j0TJDw5E!?!t z7x&)lEpsa__s#-EO)b1?Hlf$t;Qk(6pF+{fogYeiey_pmJ>F^a*jHK1`FM)oz4KBP zskAuf%7#fNvJNtNVP!{qc^o*<)r4&oXo zp}7@;Q~h$a3{Z@+QY}e&mXbuB6~qI*u7vo)?qT8ev3V6v&vZDiarV%x1=vY^lx>sW zR(dl_JzYx%vY{AiExL0~(oiv}np2H$ykPQD@Dl)L9SPc9gOhLf2-Ctf2X1i1>dbci zS}QZBw^O%IotO&pycOSJ<{ooPrA$(@YqTJ_D&QEei0px!eZo;rHgjtaR(K=$B3!{` zG1kOjhtbSb5VmKqzn5kBoX(h6_q$WyGap%yZc#snm|J^^$2gRX1qagB$+_>ba6(hE zpU!K-{_E(t2vYR~b@cC}LemSfYUcCxf1U(~>QQY-@QfNk$NbI8bU^aFZaNC_@pC^Qeo z7g}Ry&A+(HNExn*=B1!HG2_~)Dn)-Kt{Qkt_PVxuWsU?A8xog-t)lyqG=-Q}QipR) zY;`nanSM(@=GUS!#&Z|7?n|tqcZ3UJ6ju_Acc*!~vHr3BiuyR`0Tm&!{#l&Yg$dUl zA@939u5J0~`_Pm7bkk$E9ob^yDM}DoPqQLgb1&DO=`?Q0_(qu!nxz{exfjnLbu-;< z(|w@bjMrv(^ln>^33X~8Y0qyR#a%}ZA1$slp}fBj(|FzdBw#r6Yi^vz678gv|CCGi z@3SWR6NyApL+L@Q%c0nZm_MApG}cG?R&`qC)_ABURJcTV9LLph!*FuhAK=v1R;C5` zlTDQ=zU~`cBfgCTXY*ax&!|ZbEnZX@u$VM)TLYobmZhIQ+|VBX~p1sLwE4 zqPV#a?+wJa?ACsem+|WAUWna8bt;C;>k{Z7%rq0mvqG#Vx z9VTFFI)}qWu}_s!81telVlEd$c1+77pR;{Oq-@m{j5R*BwtgXG8Lbq!xC~@$7=28I VGq0~nqo$-EOE-?5#}COwe*<0yN^k%G literal 1692 zcmaJ=c~BE)6#tUVLF6(JJjQETJX#CcY`DzUR6`bOlsHP_Sw|=CE@TI?8+I2GXlnd@x))Pj9LOO%j>Wk3cLQg|5v!CnY;i=r1tQC85qC~hOI zCpi!5cX?4vZ$QEP1%9uKETlzvBVE9-X5@C`83bl1GqNh(Zm@f;w3}H}&eM+arB1TE zkTg-qg4f{re%$ZzdT7xF`#nXhfcwozm>ieRp)iWT;S{mZj95Zd;nntKu$AL!I9;ES zLSkt~IMbxZG7KhTS~6@jV40{P6U9a?6z*9}|kRehvp32Abh@7EXl4nMSn)3O4 zdS9xZ;|oyCWHO-!BWg6JNEs(+QJ>NVjGi z31cRPWm_!sa-(#G@BY6ts4On6}d z)ht~hS+EmS0{MtR(g{*XPe`FugiNVYhE1hXt0UBEl}0meoJJG%yvZO4QYw@hl}ZyG zsfmn^jgc%iHk>r{ihAljj~nrV%|IIgbU+8mv_P(vL0VbxoFoj$A=&8t2SBA(C?hm7 zNig(m7*fg8yk|fBrkQOWey#w)3O-J|ks8`}o^Tdwt?qCkP z&ZcQwLq|DVa~mS|Uz1l_+c&q?K0Z82_wR;|0?@@Ww>s0aHuu^3z{&l}hT10clkThM z(YrVL9yPZYCr>$4Z?D!}oxJzQX^y(wH;(;Xe|h(NTWf0bDv7sAH2ISGokOL6?!74c zbwYspyl3jSO+m0SBbTYY&}Ca0Fz+H(L<`Pc*Kcc1|I7_8d2l_?e6)0+XZ4Zz)-zuR zj;1A{X$^y~zuV-x@XLn&6_2v3n*Q;c@;Z;=Wb*mbiH%R%J1_aTDdd2mWyZ=md+uNF zwtH%7lM}9d@K#pf)jP$vChtp~y3RS!9Oam?2T>oiw`H8r-AZf@ME+%E7xvWbI1c%C z2>pAu48+VtFHEF}@nsd)ax=`gXWxrIezSa&!|6Vou&wQG`O-CY?P_}Y7wq&K$;E+F z-3hIQ=uaKnk93V&F?&|(^wJ{1-S*~js;+|Hw(#7B-Pn|Cryd-u7_8FUv!({L`LmK{ zb*TRoLjbNS}(P>I{4dvkkBjY diff --git a/buildroot/share/dwin/icons-7/040-ICON_Temperature.jpg b/buildroot/share/dwin/icons-7/040-ICON_Temperature.jpg index eaea25bbd88154c2ebb3e50991d3da78fd7991cc..b0eef7e42030c4685a0dad98a61cf179d7a2058b 100644 GIT binary patch literal 1244 zcmex=VWcYuZ!5PS-41f%w%mkqB{|6WZIT%D3M3@-`8JGka znFSgDA7PMSU}RusWIzI3Z0wvIKpA-f21XWUWJwlgRyKAzun{6Zexvz-Af`4*=oxAu6WuU$t=uq z$V{N|#3Ap@^zB;;jciW!%_|S>RJr6)rt~G)NJKLD$KT+uCn8Sp|H{~0ZL~W^J^Ry{ zNxg4Hw`g4bxIorLS*KF$yXcj(lMc#X`0VD*Y9a8i-{9u6ujQ{3|8^I}2Fg8|F?Wq= zvG2iW`8K(SVlOk=ObT^DLtmEY1YDWw*}O?*>ZgDhtLfQ)lCwR1O==xF zT-zLvidW4{S$2BEon?>gY{MOmg>0D`uNqFX^6V|N`5Qdcyzl@*m(J$vvKUqY|W8V?Eibuh=54x0R?V7dc^(vkBp@DXOFLM{I-eAWct7F;Z=%RM^Yc`yhq&6<8O`WK`Q+NW$>$SD-`yVV>aQfktkH$QHpB5I@ z*(=#UQHeRpB0a0m>Tkz40fufR`x}psKmOxBQQc|#L0P+3)zOigtGdEeF72;VZTt}; z&Ru%(s_L}Ywl!ex@t2}`vfPp)6toRR&)phj)q&3V>G z4sKi+aB{EoDwvp@EKd1K3TApH- nx%i<$Y$!5bdk!KQ85h4;^T2nP73t1uAkSr#EGuYZz z$Kq54i$oDoJ5{MV9i>uVNG*1XQ(u5pe3j~e^3aivk1~Vl26_DuzaMwbJ@hM8?5oq@_CM0(1E zIdm2b7l|V{Eq@Ly@5nIyVZ9b7w`Csh1)O%1R)iqOc%6 z9wI@)r6N2`ER}>TKqO*39219QcyN#ymx;qPL)fSStDa!O{oQ1XOkpK-G-XYr zsJxLbE;Uj#WiwJ1M4@nZEdmi{l4b*Cw*?Gw)M{CR*+%QkdLls?g)%B4k~GK^%6N%f zF2^OI!EzjrkCUq8QYEfX%9T<{oIF%9!c|iG0uy1TN4SPDu4F>4dmKy_CbN>Tl4}Wr z%1W7#p=-;?32TW{O{h1_HB4NKctS456oa`Rcidx-xR?oYo1>%4Y(|HlFf$WxWk%ce z1WX+oSYSBMd?Cnn8+-|%QLq?`#bQ=wc>|aQGhi0B8!%@GTsJ&N;ifau92n+sIc(0j zlhKfO8?N(!=LrNr07E>$;z2MEa{V@3*x3IEVDcocCj%79-eG30N5NBo5LA7 zfmkrdo9)5%>&wmv&G_6{8nsZoOd1&1y2acYps@pGIe69cTvfRh9SFQ=VPc#x_Py37R zi-ML@*?V^TmtS&(t(kdgyZlh8*S@XL`WL%S-dfWh+H^rE`KE76$X0Y?ecgw?+nkMs zQ|CEF)wQp#lrLZ2dZyN{dS17oDO3INA#rrJfV1~-f|rM(ajFm7(NbR%5&di-B}}S2 zm*#IZ+po83`gG)j*s{eZ(N}-h7N2%b5~h}?m+ufxk*9!wQWh)Kms8zF-<4k+7}(_O zytm8n#om0sr*L0h37Wx$R(2dW4fcIqZCP~uSo+;X2b$J@kT<`q>cUR8a>|_QM;kh4 zrSIs3Z|*iWZ?E-zWK!XDn1w-P>5iw`E1)~x^TtSbJfSQ^mjAsxIgPYjfOC0S8uN~xNYf)~DD z%->{Fs*HTp60kq|c4|fC4?bA)>~)?UFK4|Dw_iAQB<3S~^y{lTZ(P6LK9IAdtK^sd zpBwUu_V5(bw2^ZMDoXBEo+zoAd^izni@ZNmdQ6bKJ*%?owCavs@aSOtWwZBz?1#Ij zudeS|alC(3UHbhK#Z<2_hF)7uoVwcm?TwJgzL=vw&h~2ZQEH8t-UV8E>xw^XIGNnl xt1&!i8z_63*qHfGedx2h8}h&ZtLJ$`ZGGCRpH`o#*gPkdpIAz4yi?-3^*?kZU*7-# diff --git a/buildroot/share/dwin/icons-7/041-ICON_Motion.jpg b/buildroot/share/dwin/icons-7/041-ICON_Motion.jpg index 472a6354e43d81743bdffdf8eb4928cbe69fd8a1..ad083a208b39e851c498c2ccaa74c120724e6cc5 100644 GIT binary patch literal 1508 zcmbtNc{tMz9RKZV$gw$^#aPaY(q8wqHAh*Cs26)@(p*V-S&lJsq`arY3kE3$E zvQoJ!+U$MtqBS`po3xm@pWf#z9bvfQ{Q_$jVlqdPYBCqwZxYpi=!6zsnan=*nOr)Z1LLriyOM^V`>n zWuJv^D{K6nr`TQ8N2+HN}5Itqm8{ zmt`h9TRB<_CNi?_T!`|Q+WFT0Dk>0T$z&Rb#RN$RSpRN#W^Uv8RoOX#^*OGa;80wR z6lK!<2GG8*UTx@Q%LEEq7fbQYLNjW#l1Lguj%(Hollmb)xNUgh@yXvZ6z0avB zBkx{dbl$UV&NHw0ly-Bmk6C&5q0$+lntg}!Us7?~v(s8VRc>32a%pv3Y6GdNHa+2aZJ|o|^{e$t>+RB)*1*$Wb!*E^S0NjQ z9j9|X^_xu4RFX82!@3)BQDG+1#?bD1@Z_qMn;uHg$~~ag^8$ z=gu34UzrU!53_TsJp1_X(maN$Opyz(?oi|xX%6RlJoL7EY1VkYN2mV>O70BQ9qk!# z1LvauBrV!4oBhInvtx4XJmDTiCj{wDh4vXN+ff~2P0t41S$>`3T1iT?U!V%Sy;)9- z=GWoXVFVh}GW-agXT#x3_+;x2WJ;UE=rWA4Hj?^krsRLwhK4rm?%td0%XSyZs`yOLim%buenubgx>mC#EQB78&O+Q$fQoEA5>J^0M}$PH!u07Jjo z0uhw3OH$KdJzZwTY}|((SCwKIA4}M3w2GUZFQ{~z_dD>H)9j-HZPGtecSmZ2D6C!x zqR0*XVv+s+)UP>v5XLo6lp|(xxjN;0&q4K3o#u>lCKY2nm;5k9W}zp>;LnZJ!vW(i zA|T1jqS%-|QW88~ykan2Vx_&6_@Q;QG%a2W>ll(c<;BAu;F1;bfstwBT7usRSP|g2 z>2F!NdA5pmACv~OZ)cUm_3+ZuSy8e&v3ek1~gF!AE@xxB6<8H!m9aA2vE_ ArT_o{ literal 1906 zcmaJ=Yfuwc6u!wOJnEwcqfu*RSr`#9*=)kYq{IjW1T;khNKvO4k`+?SZYCQbP^^kt z1O`;pnS$c@LY~1vOBIXwLR3(!PXsDH@KJ3=M6IQarW*?A5ApkP=iIa3_nmX^o@>2j zy$2=*nRP1w2o0SH9Kd^6{{kFEk|r?~FaV2AF9E=M4?+`6CW9132}+>Wl5w~|L+Vkp z+JIsLAqxEDW`kOjh@0RzJYGl0kmtXiKwzC#hD3WSg-Sypo}dd!GvX0xUq@=v5;YPn zBA)~MnWbjEL64i%uvx#7prmFQGGH#HV_O2s>0tW7s7$05r@46K70-4 zC4zk=0?bD!5qZsmMMBIM75bu>m@mYnLLaGE0uKVAs~NQ`q$)-5U@dwlLk16(l9D1w z5erCTJc>yq5>zNcMIt`U;8UrDNp0p6l9o>-pdjx6 zNw8StEe^o2Ab-hh2^K8z5()jWfIwd?U`VSVHA#A$Fb!$7@3medYHj17H_(+8xKWpk zYlDrX9v(QhR5x-j*oc0ETJ6Zah(^?+bTg>!=YH_Bhf?$e*}~z`r8mRFj}!F78|l%u zc7w440}He#=_kanc7XMOF$^XhF`4vAFaHB#LNw@wWdp<>fV~Y4!?4L|HXDN2_G}jW zgD=CBPY2eMfa3tTfD17=fXQJ%9EP<4WC6g0-amgja&Tm_KV#5Y#)oM;d%$*JjicEP zEH=a%k}#MYCy2#m+u4twFwp_HAg(+tz|p^2lp%JT%%Kl$M>hp6;BeT(X?pQ(2 z?u+gbeO-&^_QWhJx&n{+0>U7#1nssp@C+fNA#O1%_2(W1 zDYvGhH& zg4>HmSM%7J$g<;;*HoO4z9gI=>Ox0HYfWZdN8#3M8(z$hIBH+AM+MwR@fy9YAiqvl zyeoaj&L?lDWhfqV48jXBiuzH{E47N6d5 zadA-WvZ5V_PsPT{ey;LyJkpw`toJ;=xy+Nd)Z(F)HIhlL{q9dR{c-kwLd`8t{|D9E z!w-(BkI1S>y?e9O=ic&~3e}YJU6bt`HYxsIm%r`wwe`QW^;v$8T1V)vdR-22L1xd3 zdgC5+2I`CL)F1BitdDiR`m8#p7B8-Nw!LhhM^=B#)TVeWd8^D)C=I#go9?uEYFSAH z@91KM&^MuX46BJdm$&9FQTwebw|FzQxNMx_;`r{FYeaSp^D`d&f46bg4Yv)sSKC+cSDy`e*X_PnnxB_GyFOx* z6)Y$U&a2FBC{%hc%TKNfKP~U+u!5KT>@W4+^9~%?f1*0;)oBaW(%W`3cJkKpXQe%e zOH|{#y2ZQzOrEHUC)n`?cf+5-Q<`1dxAlgPUw4Pt({{P?`j!>v%fmWvL>enF i)XUUT9`agoso=1@mHW0%e!%HOd1=3E_D)lmwe3G?50dl% diff --git a/buildroot/share/dwin/icons-7/045-ICON_Info.jpg b/buildroot/share/dwin/icons-7/045-ICON_Info.jpg index 34e63e587a1c07c0efbe4291b4ebf1907d585e75..9cfcf912c86575c2516b9517771c5ee8dbd62123 100644 GIT binary patch literal 1113 zcmex=VWcYuZ!5PS-41f%w%mkqB{|6WZIT%D3M3@-`8JGka znFSgDA7Ky&JB|SfaI!IT0VR|L7?_xt85miZ8KIKQEKID7Z0y1e9GpTTib}>nMN*7l zMM%1tS=l(4SlEGbdV)aBj4TYyteh|d7@1gD1sT|cghdn`**TOA6IG0iO`Mzq3yc5X zV&DN<#3aZp$Y9U#ux!(&Q?HInRaJdoyLQbjq0p_RU9!KW+5Pnwh`6e{g+*svKBuI5 zKuKiMzeJwrUtcU_Tr#zxPw0fDc*h~ZJxi50tUlVDWcfZuX`NKp4%Z7QC;Ry&z@1@spQ~ZlvmWQXVEyV@S5Bptyr^k^DKC8I`QzO;j_rSYd&+mY^iRpj z(TgH~?+RX#J?~*@sz+#_&3L1i{Lj&t)0BdZPxK=TaOB+DrT;TTf1{o-z%*v zvx`nGx;A4C>)zDXkS1O(gGi^TEJuX*xk^0c@T>UT@~mTRXvm>;Q!mE{y%X3M%X>EW zj-ki_omI1?URx}-j=654YQikLMnCG4#MKjDgr2;0(k>DB6}voY+q2WTWwPwvD=w~I zW7@kv@#e~}wN<~?UA^V5owIGZ>)Mu!o7Wq?)8Tw{Eur{OM&%`K?(>$C=`y=+7wWt* zXVuL$nJK8NtE+I;!6uWvC(U#71Pi7|8TUnZ*0i`jo}3OaAfjmBDstduE;%E87;RXZN6g-S_v#+K1l7?%%Sj_vUuZ zAeT;|dZS8lS^3_tAHIG(|L>E^t9{j*a@((7eAjy>aGUaX-{%4j+*L`(djlT{D|G*s zn4DDc<10(WEtS1tYa`F*?B-EB^mf_7E4j|COQl1O#4e4BnP~K8&4E;=#@4eOBJ3g$ z0>uOso=P57DnypGE9ZxI#Wgb?02(uh2=1}J7%{~^mbG`Jf>xL(u zxcbByPVEv#?42ZFTsjW&5Au9LM*?^~;olU#^G` KxNCm>|4jhj!=S+JW@c$vRenv@2ft9{~ zUa?+cN`6wRUUGh}ennz|zM-ChK7);YML}Y6c4~=2Qfhi;o~_dR-TRdkGE;1o!cBb* zd<&dYGcrA@ic*8C{6dnevXd=Sl&_Q3Q(W~w5=#5%__*n4QdyVXR8GDRC#&1Ub(Seeo?xG?WUP)qwZeFo6%mkOz;^d;tf|AVqJOz-6iAnjTCALaHmqNUdTL3o}Ygi#E^!3HB zG&dI%0AOQ_OM+4n?!{_waY$uBs(w&vaeir0aw<@{GDvfQm2**QVo82cNPd0}EEEGW z@=NlIGx7@*oSi|TW}%=Fo|%`DUtX*U*5m7I<(XGpl9-pA>gi&u1T;l2Gc(1?%*4Xn z+{Mts$kf=((9qS<(Za;p!qvhAXn>^&kPXx8lAm0fo0?Yw)0=|OYl%}YC^_U70Bv?j zEy^rQO>ryA&s6|>+bR>cTg-5p2i2Q`+b!le_38s1qYsK)q{xN|0aFl&2~WB}4m|Ov z<^fZD5in{0f5*TFPOuCq2Y^|K@&9dx76wK*U;?t3n1CdZfBk8y6!`lo45&nU#f|gH3>effeWk7Pt;ZCT12^VKxRqAyIZk5l%xTaSq3YCV~u% zOstHoZ0s--7zLRa6or^s3>^c7S=kZ`8%0Dp79Lb8Y7%4re~W#!=WcR zIaAIwYs{#4`gCc^R3*cUxq*R)r*msqdCl@vVzWGx_<~h~qmMi7^gA2VhUu~lGwlRq z=FBe3oqnevJ4$3y0OOv?OKjzpuE}@pGx+%Wi`SK3e~(;WF8R~2;?%wBZ$GVj=YBi7 ztM}0Lf+?rkR8OrqI!DH*%RPDP6o-zfPWrwM7d!u)pOTum!|3n!=t3^$Sy90?2U=w& zuQ1rz?RzGA?XCkJs(sl_@4_aV{K)2L=X&@icE`=F*A-8g#kls`Ji4*_oupY|*`Lqh z-kTyf&kQ{+70h(@ob!amF%CERgF4z5JiPDwC^e;+JFM_dblKxu$0m4aJ@%L}?}qOc z|6^&q$DbJ3U6zW8a!_dN+G1qoy-jlebiOdJ=TFWlKN9Pn7rCG3_94A@;q0Puwv}eQ z2fl_Fbj(+op;Bm8>sOrqvitp=bN<{jBM&%j(_N_^6gTUKiQK1TyXuse&E3rtXFc>h zu~V&+L1Gv0z5J!MH2CA~?|znflfG2RKGAfYtG&Me6l2A* K$Lst5-vj_KUm}wL diff --git a/buildroot/share/dwin/icons-7/046-ICON_SetEndTemp.jpg b/buildroot/share/dwin/icons-7/046-ICON_SetEndTemp.jpg index 33f50041836c0c6a19356f8f8103e51ad864c591..7565e5defeb9ecc15b65ba5138e083ba4c89a6e3 100644 GIT binary patch literal 1100 zcmex=VWcYuZ!5PS-41f%w%mkqB{|6WZIT%D3M3@-`8JGka znFSgDA7Kz@U|?osKnCm_oLoQ&4FLuwCPrpv7DiU6EDI|eJ2N8_hp?y^1E-LPpoCP| z%9}uyl8g*Y=w`66az`1I==T~jxIZL{fRH~%<>_k8YLqU$-Wy+mr2V1Rs|Pu!LLuJ-a~a*_|EEl`6cKzPbIYos+h+Cg+kvX=u`+ z-Lh;G^rK@q;}j;^d`(mO^x>^o_1i!#Z&#ntn_sSfoxVi8y!`rKhT4g5V&~twS@vHfU8>)CgvVQcIZU9P|XBt9YR@}ysLw@%sc zgezI|!aO;1`5nR2=O6mdu))73{_Et651#~W%`yA-bYV)=CmH+5zjJM8MC7x7l038h v_4ZjF5ho=RKdrWkwA-}gu5x7B%_n9uuQDx5KfVh(nbP}HM@FKe^8ZZ$nj5J0 literal 1808 zcmaJ=c~BEq7=N2h44x$rL~3!CMJ^@T-CU3;SO`HPrd0@s?NlZtD`X(qxLF_^T2XXR zTTv`UsW^^Ttq0Tt#(JO@I$EcWjDU*QD3w-56daE#RMQP|*ctKn$D8kc@B96}?|tuk z&g;&5V2Z|JUIKttI|I0Z5jeYnASTC{l@B1mW!+x@;JgQ8nG9o7VVKn}Hkhb%Qf#Cw zn8RSh2r-U<*>fB=gE5O_kaRM`Y>hyBPM$##vnc{ik?U}sO-*K+;|gdpvEVbku^`K+ zG@)}Mk=YKF!(y|Li~(_2vaNQNBLW=|SFyIsjiJau2$L0oM!B*gsk#M-nxaWWE>?() zgiL~jDaC{WS4w1|hy*9XFgy$+q#~S9;R=;hi3|c|v(cs{s)U%>!CdSv0v)_mUS6I! zPb#M942)1Jl^8C;BoYxDA+qON8G}P)wfhe##E^C)ZMHFH%8IxY4e3-46M?dozP*CQ zHZ1$zUcD2j(|tJ9VsSNKK-SJAkR$cJSJ=c=$;xJMlC-+Rn#d z(!jt1(^>WlLC%|?1VF>!uoj2IuI%y_Fb8JAE?gI2-T?S6xDCTaXQO#A%;WR8ymwB9 zLq2Rc&jNuP5CS0#2>?d`!2-zH1j+$`p^@*;TKuu&+#uEo{m(sy5A)pI0pM~uJgz%` zkO6UEt|xB{U*G}!gkElhZ1R-eg-g+BY2x&f0C}LoJHuy9P-Xbo5TyV>FyscoTzH5o zV7b7Li1J_s78+1t@unyI=mdY~4KRVNh$DanU=H}sDhSYQfVZpQVGO819^7gos59htX{=xJJEfF=gN7O%mIlk~>y^5`j_Is#UN zZ!F?;yL)y{Zgzqj6<&6_RXA~b9I}ro{tM-n)b03rhR0RozT$g{Q>PwZe5&=lFsz~M za7EA9-1H<(ie}3m{UwudX;)W&vTo0YX~72%KlEM~nnJE#r}3K*=$o3=G;7(c^0KY> z7ij}zP+5{_NhN?HuZ%l%4f=NT8RN6Q4Zk#LFC@}l8>&Pqb?4Pz<5xhBM6m9k@@ONu z5c>XU`_b^*H)Ce^Hf9xji}6<|*;`m}tUS}&v3ULSe{WvtFKchh-JPcSJTf%*a9&M{ z<%eX(w=ga!t^L43kNY)pe4Ov8bN=zdMX_a_HJ(bttn3Uv0j_VntDOJI%1PBT>sp#C zTiVW_)JASX&Na^4wMFk=wR`pPyG13B|8AXr-`7_sTQlRh+;Vbqwf3i4pSla)L}~B* z*3Kl8Bf03%Z}n~Cnb*`;&XyJk4uA4hr-+`tWfV=ha8IZl%%t`#S1ti&9_Iw_GpXUb^;0 z-ApH#aJt|`?X~LE22NLZOQ93&T7K=pvvTaw_}jIf{OZ2Oi?13k?N!{l)YzZb-QV#b i_1MPc)UxKt(?$J#e?Iy853IGO@a3wOXQ5v@+y4XP(N*IB diff --git a/buildroot/share/dwin/icons-7/047-ICON_SetBedTemp.jpg b/buildroot/share/dwin/icons-7/047-ICON_SetBedTemp.jpg index 09e5072ab9b4e69a5ca2d17ce6eb83abd720e81b..186d02ad3b926608bf1296bff6a0d88fd0fd07cf 100644 GIT binary patch delta 841 zcmdnM`<-Wl8B>g$_i>(q+L@y;X#R{s|6_?)0lb8%(7C7Njq@++>5|o-|m4e#>XIy$G%Q4@p z7h(`%W)x@ci+Wc+`Gp`L+(nUMh*aBy-lF)}iu39~b@vT+D7Ft7pTSUF)j7@3$^ zSlQS)7=#3cmCZN}MO0FbxS3m6&J<)|WM*b&Vr7My%qYmj%wWh;uPDT-#O4^7D9rAZ zRHQ8O{}uxe(0(RCW8bH*COiC$N3tmw-2^t^O)r|9#U z&P@&Zog$~$BaJG$RAgHih5A#4w=B%LljjrAP&9|BavJkB>DSNnTvsuFnin%;?&0Gp zPj~d0_7xO{WTz=AmCVnoe{rcKdwtcl`v;Go%kGw(I((^92QNdTzDUqrugqn6Y{JT>rGx$B&D6 z=A}wU%=iA(2aw+uCvcfytwPg3Q zYREidl9jo)duQS8<4;~~dTLw75ZGX`GwjGzhiN-Mty8n_`+Wa=;VF*ej}`q(ChkkO zY@F@DGU3APIk80n{8IDy{IV~UM*o|!fAJ3YpYq@J-@Jb=Z+`0M^cQyCcYiFE+y7v_ M$O`R8Q~%!t05L>9l>h($ delta 899 zcmey)vw?Sm8B>g#g{!%%v$3<0sfnARp{t{li-DP?nX$RCtA&N5lcTAULPc(YudkI$ zesXDUYF>$_i>(q+L@y;X#R{s|1()8*lb8%(7C7Qkq@++>5|o-|m4e#>CtP|b%Q4@p z7hw=#W)x@ci+Wc+`Gp@)HiiJ1WzaB?xSb1(u$8IeU9*csV4m;@LYSXh{uIQU>% z7@3$^1X^*Yg0aPkA;w?*@L~D&jy75nn>S3{ z9wvX)n#uHi%m^7`S0^30le1bSEj3kPfw*q1Zr=CT+hbQWS>I#2 zV7=q^&zNJ}o3m5jv&^m3wN5{yqCIQc(t<9j`pAuu9E}r{{DNX1>=bHPrgdOXMT5of4Z ze7bsN$j28orI%WJ*aZ4{Y%I=%E_pe_e%ZM@wbNGLJ6maG^W#_QdCT9&iasAV@c1_W zi2byhX@{gN_g7S&bM|iP(tUjI;R>CitWDDDzuULme8zG3IL9FijiqXT_TFo}e%-&e V;&1#V@i*&Ze>dO$5E%deCII2!Qw;zB diff --git a/buildroot/share/dwin/icons-7/051-ICON_MaxSpeed.jpg b/buildroot/share/dwin/icons-7/051-ICON_MaxSpeed.jpg index eaaa21255b6276f580dd87f6f43af0d72cec8cdf..d8b416827dd2a804b46e2c25d44df914b9e9b4f4 100644 GIT binary patch literal 1489 zcmbu7XH=616o$Vq2`hjQRzbwDhg1?lK!p@#Ph+T{2qJ0NLD@toOD!OrRF*OYD(FEm zKo|+3f(Q)+Jsh-*1c)*MfnWd`E{3M*>FGKC_q~7aJ@>uO`{#-#M6-aRyR(}!0D=$z zB`!e31sufF_vv5A_YuU`qGtd?8c+dLpdbQ(AV4Sr6fpsH0DwS&ZzU}Qfx*Qa14RG= zfr0=C``-YCNl1baDQOu%Nm&JlQNY}*flVgmRLK}tdr0HHAP&P*Hx757jmDE(gu z6b3>hBoRu=fRu`kuHGqCHG?DO7WVj~mJXsRKu*koAfO1q4jBAYzV|?b{W!jx)HprC zziUPdCf|>+PyoiC{E^V~I~rYWQ4v>>aw%T9Bq_6xi)Q!5AZi$otjL7`--_I|(WI?q zyO_Lh`ZjNanGfHay1_@fIM8JRhQ{ZcpWAW-EbI!C>4|lijJp(rVP)hKL)X`kS-a!I zv~hao){Al60F%{7F^$^PI$oV;D!B{>c4vhWBi%}Ay^FRdu>E|s}Z(bUOoZ?kKz(5)q z6wKS$Og=FvtJPT$)@i(K!;JbshDmz_+9c6L&XeS;Zy7kSvs2$QoVGH{Ynrj+1?Z8; zIh#aHZk2q+3VunUZ6Tu4ra%NtQtFHDMEb5fg}(A{rKYgGSF79XJX*1%tGK8>zlKqB zpIw+u8AsmP^DjoQzPFVNoi~$M2|8`t+rtRlVI(~9QG*(e=3!E z<{?+tvD+v-@>K-X2$#1k+zyi$664Qnx`sDMDF?-~voBs7yRM(!^2WpQeRVOCk`jKG zSntkeykq5fExnPX4ZYqxMM6rb2N2uk#c4xh2G z4w*osusGqE>jSbMZlcXN!eR}TTleA;=S_*!0e&nyawJmf{W znnhT9+(^8)GvCQ=FuYi%q3LbXG*T0KHdX*<%E!g>Z`uiiP*_K|&bkX>c-r>nvq4<3 zcl7ahny%JsVJO4P0w<^1qkA_h&O72&?s)aVd3%l;2f*jv`71`GwDgh>7d}QK9i+Hs z2Br1(@>Jbk{gAIM*Se(+cqZj<6dJ}TutY#6|hI*=hTQA*Ipo@S@Zfeq3PFBpR4s{is^xs!v96Yx11JjN2I{nm_($%uHW-f*> zR!~@w7lrM2#i)Ho2Y>>O#;I4cbGocCFXJ;*%<0a&&X#+Yy(hh4WfQ?O0lfVRd@G~P z>3GZ8WNkC;zel6cxB!D|=Yy!*w#ByAj+K$tcvYnrhojcospAY)>k({G8L(1NEUh}#bQ3vrM*9BP{ob43@Ar=H zec_AY4v=CBki`HL6wClZFk;~zATj!J*BSr;E*mZaAlw0Cr3~ZMVVK7!w>v2ZA;&2< z7O;CUrCfo5oVN00V>*McIXQ;#mlEL0SF4MZtvDW{3K<*(WBau=?3 zqItPUPCyrMd))+MM*{AZ9-l6tN2B68_8bXgC=!J*E19aDgG3bV4$9ByQMS^@Ex5hI zvd^5=6Trg4|A)HWkpV(BLojvG+7@*bBD;i4aJE6ow>#BY|KE6g~mo0e}NTBkvyoz5wD1 zMGyp@4)Xw)&q)9P=5zTFZ-@bLU`gUwwgVtd5=>I&qpIY}IaWuyFhv3Y4-#;=f?=qH zlL!MAGsixbi}EUK4kq1RrLxu@k{ZI7K`fh%BY`C#58PN5a=)3|x$FG?imRPdK4{!J zWu4U#jLQi9)m@7eSWp!B)2^X8+tb7+H{QMn&ES)^i>;PENm{LR9MgMio$b!OJH4}a zs#LS){xgjp=vS}s{MIAy*ymd7-tXGc{(aJmhZntZX?j9UgB<0dA{lzj@{{oIW=`IQ zEi+FY@8~zZ7c5v9y3HxNVK3V}aVp&#N@(viO}G}n$C0F+R5zplL<4+lUKrp5Vi{F@ zE+aUxa-23f_PLd=eD%s zw&lV6d5%MyFHQTjX8xYN^N1I0*k#e91DbP-s=6xYuHNu@b!__L%JP`?ZRwvad`qes zpQ^uLU;bcPHZ^OKPnReCsa(B0v37-JiRhQp3$``h^lqM+IJMq# zK^S965pJ)lGcW1dhHR}jhGwT|-aWNkU6WR{_(|)R2*twW)xjpm#vGM5$8ywOLoprhOwNdsq^VUS za)f!^MKVK0&NbzT((B#J`@Vnlf6w#zJfF|=e6L3|BzgzP9zKLS1b{$b0KL(Gh!5Cq zY(H03$Ei;xawu6s;ib7WMB2%=yjPlkk_iJIBSpotY?m#LqeVJA z*f`6*Z6fZg51(`)m2TJKgzx8th4_S{wCJ4^yD8Ti@s)3GTq;{2pXMedzaWtYrKe23 zDGT%s#%7P~w7ebiI(_xT<0crnHcF%S#DlW%*Li=mEx~-}=GggWM;am)8+Qb*f5e@P zY(zO=F26`}cCx^5*67s)24@_hlSu!HOE0X`C|n%&wwW`*@5NId<<#+Rzc@g{V0>3q)*78d6IU5sw6`kje>Qknz#fi2fxp7E0isjQQ zGyyT*{rQkzhDvCaP9km_-+9G2bWgSLVM1|jk8W6HyQJ`JK9tpA5lgM7ST*$aZXN2% z@VFXg?s*ClBz^g2=pLA5p#PAX!#4Y_kg}2(7hG!2_!Z2+G>zD`U)TM7^rPOdPmP!J zu*{0#gp0a;$3TwvBdB}=^=_7RfZJ(8#S$MnCtYFS&AYD6cATJe3$Q^bygg#jJAKW5 zF9XU>OdGhdOuYos7=Og{r=0EifIWXy2{tRJenoC4A#yUExKNJ2rCtGYzE=pRCc>Oh z&d;Jo2}v>uTP9tV*7Y*gZyp@S4%2HI5Q0{VZ@;bRrSErymEtB-GG~PA(y5E6;m4B< z%aSnX@rvm1yV^^E&6c6r!NF2-QTEWuN>5ez(O%Pnk$z*f9%dhsWRROJbx@@zr)kRc zcv znzwRbkjKq#3SwUtiQCiROtMEm%sS3GR=W=gy)zT2YP;%I@y7NGH$22Ow?0jWP~QI_ z_|9^-Ba@B+d78(t(?vi5<9Bsg{8To(=jHJCC6YNh#o2ExA^(i#TNBf0qo>7+2)m$F z*lrf1dB@JYi;Ar)3}Z7$Mwv#RGhZMKLD%d}YWIouFRhNo%AScsNNO8=Qbx6#jg#52 zDsln9_t-fe|8G^b%>2|6b-CsS!_kit*xJ^$bB0^ylLHJYa;hTGC%j^&Fl!pt-WRXC zm)721(=caSx#JVS!I6e zE67-H5;inQA|yhrbKfg=)n!-{WwN*X4G5LkxXKY))4CGhsJ6lBONu;AeuQ?f?6ZOk zHv5;B*8}F$F~YHA@$L?elIBFc(ysN-F+O1CHFs&g>_2Vj>WPjstZ(yevax}tJGOY*afE|RHoi-i zWg$jqynjAAZdUHgKO=~lFV+w4;SWAZsTLZ^tI9lngPcGLu9B6x3s=d1lQjzVo12Mv F{{VNN@ literal 1768 zcmaJ=drVVj6#vTYgYwd=JbXmB+(JZz-nQ7MmaeoEkW~?xDAQ-T&8&T7eZN-sM?zqS+CDRG^8Cz#C%Dj zQMgQmNacK?L?9O}OF%>dp%fEHF=0}oK&TK%6iISq0w|r$ZrZBI*6Jp5(UuaOIF!@r zkTQASV(S0dryO)6+{htY1fQD%}ryo!c=vXoMybfvG3 zV6{!jzO`4c1?u(xA8NIF8{m_5P}%r&y>AtE@=vKjRzxTcwFkpum@K9jEH=vrHk-ro=Wy6uZa@H+8}ud^5CpN9 zEH0bP4G!c62G0tiF>97DXyOy}%6gMGWqG;)><>agD8zt)AIyMYhNm0s0t_0{?;ikv zx&Yb(z2Rgrm~3b^01%tWgt(Kx7=94U3}vx7bLNJHgJ?8D$cr&-KPt-3PZH1bhXG*u zF(D4bnviF}esdroj5f?=s<*S&lib5Zq;bni;5*F_12SIdBKNy063Jl_Ht<_>} zJ^B9CRuPrjxi2B)^xB%m^-rEZi@D5M%v`Xs=+-cr92}w>?mp)R2cU#g#am*WaAa2i z=hV}R(Vh*_@ZCHMQ*!}6o6PB|9 zX;iL#c4&1;* z@XDUQ__1k~(M7Dm_^9-~2`f$}cBuRA{_#!aI}IJkN^p1Yk!TO-BcE*gt^Rs$pp@Ty zyw~j%9NKUWsNr4`Z_RUMBTj#;kMjRu|kG8vLa>_E?-asTVii+Z@4 z-QFT;8(UX!>+(xyT7+Oserep+Fx2*deZOhk5z#LGF}dzQEw@?MbRzXq`MW}yt$WNm z)*;<<_2!^Bk03&L)))K%chrJwKR4bgi;OXC>u&EKN?&;VMbp_uw4AEp#NumAu6 diff --git a/buildroot/share/dwin/icons-7/053-ICON_MaxJerk.jpg b/buildroot/share/dwin/icons-7/053-ICON_MaxJerk.jpg index 119df1a03d640da7a8df0627c27e160b0a05a6e7..05190db4c33406e9257380bfdd49893b0326fcb7 100644 GIT binary patch literal 1501 zcmbu3cTm#@6vuzR48n4RDWDAq0z#4&WE2n(H35RkUJ*f7040$Yj);QRDsn-w3C69K#(9535vS`H2{D>LEt}{0tpq5_AQhDN9n{wOiU9wQfFS@WX^14!kz9fT5D+Hm{|EvD zp>QcA0#Hy?Qa-4vr7fNUBBKNROCVOyG zm@^aME^C4I0UK-zt@C-43^Pae=o_20dMCk(5#Ncd>6(o*oJw@y-eUX`nUWw0U zM_`^UCCl*-ZCVy27fzny!2PBhl~ESwKlNRMu5^7oM_mkXTg83wZ*R}z1iMq=zGjmR zQy6%dh*B6=+->ODdv24gijZZW;qIQZ)5Q`IyV!x!!{oNaHH?$%AXijY^>TUf71xQU zz|b9_;xg2{YO?t|R!-|Yk2)W%bR@K?Q~gCq2|fNzZ}{tJAu6RtjyAj6oWXdfiZQLf zk5enAEXZgvyNv343C)D5vw0ae%VNnbbY^LWM|S+cihtV92{%SjwqNsY-@hQy!TT~R z`)^{wRM<~4XHb{jmRS$~^jq?4OyV)4lZ>(qycNT&S;*K7-+Jtm*zg)lOJ->i8p40N zLeSf$rRnqVAtc?H*OX){wf7emkGMBZ5nk~yqeo1QD@;?y{1lDgt2MO>%Xto0H&baR zyG>it9@&hFY`$DCZ~El?U~nUo8pnZL8PAC6d#jx8gemyFV<`4khvsoJ9O7QTSHdQ3 z;+5X%q7=U+Ix{5x@NS}V?3W=!`Z>II0_N~`sQfswk(;n% ziOUQYX;S!eclo4iD)xUgn8zKpuxxrL3fmI)mmE_yM)TL|joEHA;)_tOMu{+?yeg_A zSL-|B$aZZ6rtR{UHgX0#_xuyPs<-uk^C%HJ@11o0em71av>k3LQHNPvCj>>QM01sU^t|2hf0gQox{qtptB9K zE?`UV2*5gWxhCJDGIu_R8`u@&zLeTN+cMD=YT#Q4xo%XKcsSykxmnE=jNL_?EMt zy<$&}mAU);Ha#pLKBW*0y=a{`*XI_v*QPUH%BvV3B%P3}WOuSR|Cl`%0JE!!H8R0Z z<<8PO_q)uPGcvV2CPteRJMl8Y{7*U}Uo zJQzuCc4Y7dSdD#-%yH8vjxR}O-g=$|=iO8QA4P4OQKZ)LZC%4_H`eW|#GJnYC>D1R literal 1756 zcmaJ=c~BE)6#q7xg8+gl0i}a=S-|lko81sXQUZn?iW)@Z?07UJi)3Q5AqgZzwAcaZ z2&15OEViBMU{R}eDk@g(L2W&zmsmPn7KI`shee&Kl|gH|iGVsIeShq}_vZKez4yKE zeV$HFADFFn84CbNOChoA^CpX3=8~g6aT)D<(-?~QAP$opRd}l+x!QC@N!dt5EQpWQ z<8cHckqYp5p_GVQj1WRxf(a!UE{YZ6GGV+-Bt<3+rK{Nt1+om4W}+4y$9Zr4 zty8kEoYf0Jt@i(+X0vwyK3TgXgM8laD~0WurB)KlAnjDKO;6JBC@O(h%_lmp+X`|kcbmBlUx<0FE*1F$0XM<#T5ys<$Bk_Y^5u!NSm>Q zG-zy;8Sx!kW}Lnk)wFsOT*I`z5b9~U7~Kr!z1$Zrdoo3Dkk_4BT{@Ure$qm3yp3LM z&nO7;Ei5p!&`${R+yE7TF=a6A!A$xKGg(ZpvDhr1vDqAsABV%{a{c|e+`yL&f?=4& zWO3PS?u-C#z>MG^+Jb|9pow4Lv*=~sROD#^JU_q(d>G;Z1`mRHkmmau#GQ+hM+AOk1r7RMdAelsWg+_@#yO5*yCm7n5wkoLu0#G{eY zeVpGCVA0`%hl1Jt@8aXz^Zja6wU?H5j4TQg6U+O!zm{?59nVd?zc;Y7qq4mMeXu!c zp0=z!A|o_9h(zw!2S+7raIF{W{fYA2gRMbZ^W*+mG8ez>0i9ddoY(GryohM+u0MNq z^itQJ^@A7OL#EU3oVS^N>TZ9UKKH=qPu)NN(Keh`wB?JVjTe^ve*3Vw_I-C}&%W)+ zjRnE_sIe;}H`ef}?saF0RZ*6&JNRc>$A-dIG~fR6Pz+aC~ z&1`wI_U_{@_^oT2vyEq}w)VQ6NrtwPJ@>C^-J0y?TbG=HuA9>ezyttsKpX;s0bm#i0t0b60ja&?fS)A5FDS$X3QzzH*;@)gKzo>n z7sAI6761u~1N+4ket7@KKY982cm=pXg}VR(fOx=QZrc-t2L$Hju=RO#1|9SV`bcRQ$T^8FLS;l%R*eyu#V33mE8`d_v4J-QL zQj10yM%U*JYjpMle0E;>0jC?35y%m|?(oz`-p!LFmv`39SCpM8n-g+o(P)@rm`x^a&fSdrz`7I{H}y6?8p0vt3kV|3;ya;){f!}3y*Wz z#vh5Dw!(#oQGECta?ChO0+;OP;;B-#uZLH?nY6Oj;H-DZ3*}AynJ|WB+%-e^ zB@l|5t4ToWT4F2=@dkM;Ih-qawSlJUfn`c1cD9rp^H07S{h)Uxhs<<)eCUClXW_z1sDWfp+BjOP zI#&2Rj_(=9tab&17dqlw+UzqLl{}T`GTr5uw^@*;+ifA83x^KHVZG;<;O3WtQk?tH zu92~%RweKKjSMWOBTM1w*u$IS zIpqWNh{8BMfKoZ<8qI9iZCc#t)(>0dW zI?ETB8XsI&V=W3gmD9ZfL;^F(8X8uTo=X)3%^IrOWWsek!-rTO<`!g9-gOdJKtYwJ z7JhN{r{ukjk*Mro*mkR}-Ra`D{np~;Y*3)pMb)=Of0n(0?USJ_upIG$FC!z4VUzzB z@Wm)K9H>UXj#_yHM~^0bH(^VTwvpMWk`{NT`VjlfLAeaPx{0R_>xeSE5?!%Fz`C3& ztIb8O3b$iz`?lNq&kJ&&ZnJ_^YaXm5HQ0wSh|6qr=9o()4@eE+2YoR~xhqSzA^(AT z@4x{jx9aZ95NGDYPwUS$zB{XxslS1?@Moy7X7vRwqvdsH91gIP%HK?!(>@HJ)bP5rXa03Zhp27sKTSD6 z#-Qp+s}K+Go<`r|$VO>Z``-E!SBdG_!&f>=yX11S^G(K-%;fP7$T5Wzg06wbTtgxtz zBa!RBV&eFRkH@e5mEQCW!*AasKERh!o*mN)l6oYsXu$ytj0xVtM`#!V+h)FTu480c zc7z!`zuc2dib!P6EO2W#Q q3jZcQO3f<-amVO(o0`!~Q{w*gk|qrfpk*i$s)>o?08kQ!^YK5qgPa2Z literal 1816 zcmaJ=c~BE)6#tgZK?K2YsP*Wqfwm%$&4zGfhlnu&jT#Pv1qGRg>}nQFHYTA2s68yA z!ib7>1Z{OZ5wu{XSdnREs;%QtRM1h7;s_Nxl|w{Cryl7ha_Efo_s8z{-oD>^zxVci z_Evi*m>zAT)&QVV%>%Ar9QIzoS7zxla{vTbj5{6xdnb(QtyU9`qDG5QOVH`0P)8e3 zo7RM4LJEv3c5m<*&AtAotZLODcXoQGHTQ5EUQewD1F_6 z!8DfkowIr)P_6#|P=moS0B2f@bvZe%_nnC?i8&?`T~1o)EVGVe!u=d%6Rt3mS}Sc% zr0I2|Q;gTsR@$PcO^8C_m|6rfH;FP5bhahH$x*9umC<6=8g-;fDHAYRgcL>KF=1GY zC^S?q4vkh~ShQRkBbLTULgbhvTC9-7M2~Wnv@Xj)8m*&TVw}5hLat*S3?`2~XbAKBU48v>| zo5$hsCcE+6CVP4?@bq*BjlA4nTW|BmEPDgsy8<8J14De^!iQi!WWUG=gBXn8e*n0y zFwfzF-*mD$FpE0{07fjtWsiP=m=^e6Y!2}D@#RjPBNr_6o92og6icS_0p!BOGLlDP zA-)Ud1+%~$xle-Do9!zQFI=BqGO+W9W-+XCt({>$@X@is zqs!8&n%t&dKOEH7^5l|g-l>T6&f`1o&rx2C)q497Oc|`GptrX|bNFm^U&370d&L>9 zFUhU3J%3i6NSzrd@%ZM--!AwkN2;hB_ceY8u5}jFUb>k)V{@iC?)Uokzw*vKs$3T2 zcC3p|F#gt^&<6WgugGmaRO!ohmj^7iKz{Iof?4FD=Q9rl3^j$6QY$8DCGOgny4bGG zw!XW!dJ3C{_MBO{I&eeFnpH;@eGrv+v9`~U(h-*t?h|gfrSCYM`cIASL!xeFo#olu zlK1tE?O(shdzzBfln`G&P_g+%ldND^6I3JE6xZP^NlW;3HC41f`fmLc15r|uXsb=y z*1y*`xU3o1-%xJcwQGkfsB4%Rttrv+MWvrzD9C8XpZ}!E;)hhs&0FOmzZQA5TpUq7 z%hx#En!TihoP2Uq)%w(S{_ysX7YxKsztev_V9=$rGgp0ZNhP*)``P}E8soY8p)DoB zQx6w*^|j91Tj+EAtHiCWF3pyFf2hFi^r;gYR-QcOp~9Lgykbk!28VZVoA&cPFBOu} z{UyAAimXNVk~;t3#O>5OrPm+u8~2681^Ee!>9pjgsG^>>LfPZUmVb8=TMElN2fOOJ zG#Ba{hMJ2WCI+%!yb5GBdfCD3ClBK_x!x&fGcNDmU3T=!j)5DB>-oE0t#0lwhI;cl zE`(LqSa!xg|8e7`Wl2wE)vES<<-Ll=M3b0@Bbw)1HbHFT;}EWxP=&Q{Pw*0ZVJl3X$Ss$wL$3zW@`$2E@Pr+WdEMN M;thp=d|_|<5Bm^qc>n+a diff --git a/buildroot/share/dwin/icons-7/058-ICON_StockConfiguraton.jpg b/buildroot/share/dwin/icons-7/058-ICON_StockConfiguraton.jpg index 8e2b6fedbe13d70828d9edfd21ff5c0e95272e7a..7a64b703781750e837fd9a715362fd8f13eed095 100644 GIT binary patch literal 1050 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 z z6wGxqUUopR%xMJ~r>Z<(5-Y>kQOnF?-_mFLE2&ys9`}?FTkq&h?XPiTvd8OwlSxEj zaOA>3+xXbIi`}k0H!uQeC|#?)g}6B_*J+*1a-JBCP+hc0SC;#6wnjx)ATQ#3P8y9B zXh8N4CJYFS$Z5x69e*_K+c**B{M(W;s?sit3!}A!^i=r|XqoQ`frJc?IDvCO4Nnen~AL2K2@0@$@`Mz`Rx#wE% zSbKqcv`L)>KwO+JV1Nl&`v6mBQ0AHe1yITDWB{zaFp@(MS}}rPdago+XQEssu0c!+ zEyCyW5D*q_(khg>D8b4^v(=b{{iO9Ao26Ds*sB8NJh@hi=BQ)yb?A!xrHRV?T%}0G z4qwO$Gl@+atp+6&ER!Y=(~C_K_K3Kcv~Al6n>FG><3q`C^u*qmTRhBqG7Bd=)TuIoYmogfS zT%(YS>#`BPNF+jd0z@F-kRBYp86y-X4yN}SQ;?y0rB1CS)HuenDJn8?10i9PnZCb* zMmsM1(OP}rD3^cQRim*LU_@3=B%l-depFbWXx5@g0;~KYA}t6aXL5QE7=lTV6V(QoHUhd0jB(iLq&E$QX>=Nu z_QA=x%cl)%8(=bkGjN6}OaL({Fq2|!2W0?2FlFNZ13+g$v?=x!3V_Km0Xm@BQ5iD; zfN6F#m^OAqfv8N_nP%tcfOmxSuUk$DNkmdvddw>*A12Wl3}E!peut!*f+Lswd4RZEH%FiWdm?ibDu zlf>4a`|`#*Z{Objd&C#=!gv=*ekcn1r#&gcWam}1dDnM7{b%~5+QsSW;rlHOXS+9M ztWaN@<{C94ZM|(qpi@kw(IIZ@1w>#MUVj7kQxtm(|_aEJ=ODzpK&h)@yqp2;@ zHd+Yd(I)DKOSfMAT9B7x!M?fq>~Pf3PI2{X_1j|p!ibqC+uNWH`cA(;y6bbREQ$7F_v6aVi>W1l z8=0m?2W5t5UGwe#bc2tQ3ybSAo+VYfhWkD4`1VUpxwI9(u~+`8xAAcNrfcSHhmVAo zT&>P7TKN1zD0SE~{Y|G#Dqd5qsTmyJ<5tyl)>Ts6rS0f*ypr1W8Izu61w#!3t$AnO z8S9ayg9DVskxQ9@8y8gsm|7<+Gn}u;F4p8>B+>hdh=raQ#U94b!~NwF*&KDT3Awhs%+Nr YR?nk{-mXf!?f+&?({-PI3vTWCA2hvu)Bpeg diff --git a/buildroot/share/dwin/icons-7/060-ICON_MaxSpeedY.jpg b/buildroot/share/dwin/icons-7/060-ICON_MaxSpeedY.jpg index c3b3cc7ce18f4bdc64e26a25c9e43a2546ef087f..f069adeb0287cee17cfea70dd1397978e9e412a3 100644 GIT binary patch literal 1465 zcmbu2dpOez7{`D6&1^1VjG2nLjFf{>%E4Cb&~oh}hqiLbWluCxl5)#76r&r%@f4M0 zGjrT!k=u0KDq-r$Jz5SYN*rNl{nz=s@B2LO^SsaZ`+mMsv2+|zJLF7u1|Sd+z{v)X zz6G3Q*U#xYq$Hbg5d$trebQ0}q8!X6&w&kOCjgouIiLlDM;AOz&r_rl;E?Mi`aa;hxkK z+sqW)Ka=HSl2WZlP)7Z8Lfc3cXH+f@&<% zBC!*yElH>JxRJ`IJx$Y-T9?j{7Iio0=VI8ZS@bp5ox;J~ng~wlK&>fz}x z!~{w(`CnGO4vg_c3@T`cA zr*k&o^(6*FA&QSsS35y_+Q~N_a;Wt>zt^|D&pQv|z}HC1!MM=B*6~E&RyIB@XFSJo zM22@d1vc4TWpEAu=sp%T`Sn$!gsHNe^!N59#HiM-N<#~`>APavDi+B%IwWu*c5fvdRUZv~(RYhk-j*XO5+tX%=xvBVxE5#;tZBbI-Y@CFE_O3sm zg`Po2rZ%*kl=KrLO_h-S_G1v7{jz}~w|2)evk}%HzMqRTcMdKcx3+WcWwgwVTVpcV z`#}%xD{_?kFQe8mJhyY;t_*%PnNylW=@4=c`32Yo#w(vxGTS_oO^HPYbt?~7bRlW_ zi*d%a*SnA7j+Yx(p(_KcG&H)eqTl)W4LdE1qU(;iJ+ZX1d2p2akkC^)^+GdEXL_nz zEwMaF=zuhy$)pvshG)B>`p)iTp(if_JNCHX627iTQ;S4ff$tWiwVLiMU}$!HNweAq zz4=hD%Y)ze?L=C$^QV86RZIMGEKD4?2n?PX1+RC?FRAR~%&RE>y37a1DQTb z{bt-Q-e>N8Q|5(R_lCS{#m3i#j65lDh!Ymv+LJII&)6J;PjnIfWZ!$z zXU=vNtzO$7HhEYIC<~YE2UFvi%_u40o3NoUV)0tfePi{Y!0DXaFoGXEeG?R)uXHkg z6ecWo51Cp}oo;p$c_;YJZX+vT5GC#F$5LL>Q(!H+nNhd5tEi}(#gkq!m7uTZINSmq z4GIc|C1biFlmwih>Y|Dc3=vYXMiEkP^D%83ZRqAYXGqH(6}iCp_g#EI-H|aV~Hq7g=x7a zrJjp$cw7)1X3{HFsVD&_qRARv2y5tk0}IxuLs;>FQM@R<3{BBQWE;@f?C3aEcB)FO zW`%{q!6u1GtJk805;kembhyM6!Wt8okg;`{%Yw&Jh}004)LIozh*}BDFart)a)fLZ z62ON=Vh$qYiTMHkFrSBrxI7UT5wLlPgeQ~;#PB#+WHp02NfIMpGG2?Eg|NmqWi%Q& zMga#iBy$n5Sj^?|xqLpG%wXeLIznk;>u{e51v!eV3>rP5!E~@yQJIKk5Fsqm>ANjx z^^>w6JgfH-qoO{Zs?}N#U`!S#V$dnS9~8#pvh*l72F0-qg9;_neXL}?L}oyh1ZIfC zu(XL&T$zFq7@mUZVVTT&YC-UVc#Tet8S#Z%zqXtbT zs$OEiwD8!rC7S8I2&dH>=c=doBAS-VCCzZHm;2sjPb`rgWDO@ppUWfD{}qEg9`9NvLOrI8>9x)n5N47OI-O~OhivmqJ{vW4i- zdw(WVJ|0*a0mBZs0#_P^0jLZLjX|+AfdbMWM45X30N7C>8(Vt^3I))}Zwj^mvZ333 z0sv`%PNhKOe<)NMgYF910B0BGEL%HosgD~H&R4Po^XD)Cpwl7J@?g@cNG^E&E?NL9R zyAER}_~6msUT2uSSu-NGuDIcSbtbeg zv}Rj%*rGv~YaU)N`-j3l75JSrKDf3&_QiqX;M`NuU*8(>=v^AI?bL!Vm*ronHSSs% zJ6Dhq_)GUpmyEW*33giU%@SBnmm%}$Idgh#d<#3gV+sokv#XI~pxkc%jup&^O6NS- ztG^2yY3VW-jn4c+`nba1KeP0@S!4ko=C|us6jyG(yQBA~ulb+*MiTtbeTJ0! zUZ}C}P4awtd9)|yF5QK!;u1}(Af2B~OW8kd8~OyyED zIl?qnWstjrtlO}m)*`gYqFjgErDb;7zv}Ov_nh~f_dL)0dBj8FF`#tph|>{(KtRAu zGC=$qI7qH<(`U%H5hUN@W`IHhRiFwZPyj+9U=%{!2G9TjAQ*fhIY>$tDKD`wN&tdj z1OPIh*Jr^}(lQ80770+wDysT&dImU2OjE-C8X+qK5R$0G`%cmXK|mV%0)c>}W&Q`q z>h96g$KmbGf4t}*9svrH76=8S00~SU@7?hhL|W5I>o&A+6LC|~wk-oGqWHAY*06>* zTsJ4+TGtp9Gn0yLa9l9tJw&%6TcqRhS2qTviuD#O8p&vE;03iSMjz~gRW|!pWxI&> zn@`kmwPTJXoo(Dfp_v!C&Dq6izK$pcv!)JkPWw!B2o%+`f^TTr8$6s?t`X!yV_4l} zU>3(q-p>4{R^-H~3bMkl*V+tMH#RrynMUujn!0b}7BfXlK0bTyj{58Y;;$SMrOc03 zmK#Fo>LF5!8?m13!sA3Eg4d+He7>%Z7py%J{hm?5q1O+FS}}XLxvrjmkWw;viPQmW z%%r+^JCjQ$U5r!XTb2XKOWHf4xu}fYtkA9GtlWW|s^GhRf90&4%4*I>DF>y#93r~2 z)mgr_*JRBis7VQG8H&&Cd}DKb@`^?Zh7&8!@_in!Bd_2Dn#_ACVVy^LL9F2Rra1zX zzL1zGM;9QKl`i-=#ayCST`c8eZgc_V#=GuesVYQjY6H3h?!R8va~BjZj-JG4@XsrLN+xVka-m9u8gB9`+-k!%hMt; zIBDT-X8W{MucBAL}ch3Fpch5C- znFfJFkU^OMKxn8dumrO(Jp@dNPM(woD1b&Te+GbQ5JD0OLL)>FHO`hPuy~X$$5euj{2_@iobc<3gV*PuzfdwlSB387glq1!M(L`lPx)zN{Ul%D)Pm&81 zEWg#TuR&-~X;dg7gAJ-=H7+!WSd-#HGBz(GEO;`7ND{FE%)7!d()F+y)1t5^+sj?f z_29wY0yfu+Bj9(-9&TS?TK| zs5CROZ|&6^iBjpiQ&lQ+114p0A{?Eq_pQQsWSRy=!ciR4Y2_%H?rbJ&gkmi!BQR|w zh9ysTaeX32V0a>?fyH8T*L>iW(Mq)f)8n5^a->pWs2V3^YB?Gz5wS=Wwo<7OdT}IV zr-OMsPtQOuHz>fz+lLp(4de!JxDuYXhj^MR!Q?s>swSqnidimyPOjMwDh;`_1l1~2 zQAMy8Q^AwR7Aohig)^t#6jw2KE!;V|2w4nbzT7u1dwPj3c4GR>Frb7^&L8sB* z_%oC8?!eRtn3li>*gzB}pfV{ClVWND`DA_c+2>D2mQ*@p-h2uLK;$=bUphGlhN`}IuF6Kfsuq?pZ zhQ2|@v$fduH7n()oqb>-!*mBMgeYWT5EJ-;*5bQfEz({g`*^*+`LE)(k-OP3qcQa- zSmH1j>tB0r`yctKPRPqm@N2W;w`40n&&bFN11ao3o6iN=dR#ePb+9OGmkTq$$gZ5b z)K}DMyuR~h)k@cUBR#}n>Gm6%<##e!?;kh;2AB>Gargs(x;*y0Jf9pJ z?W*g%m^z$a8aL8je=W*ZyXw^LN_Y@m%O$Eeal%I~tV>1aWo=n~*OjH4 z2HHDp2DA^3T@Cx=6|064Skzh%`%22>?uEuRL$zBE*|)dt=d~0rhEL}3|Fd_ldHS;C z3w>#Ib*fl#>RCgPQ}y$M|8mHnYsd1C zJg34%6pHo0b{wthJ1y`y>F-)nOWNx`bNyHdW$!a!dC}?RonuiSF6^#_6KQ$bbc+m} zm-P&ErH@CQGJ&}5bq>aW;mXzjjARwua@4wf)I!@C&3`;Ww&hxHrC-9iOP_k?qzLx# zcdZ`J_FD8}b;Hx*+?-WzZFWPx4HcIkZ2fUf|F*dC)4>zLAGhClY-PYrV6T1Atpsdj z=*xQF=is|h$Iv>Y_4$zJ)qNN4>7&=yWKBHDe7L9SjB#67fqgM2PlmSY7^!P3~! diff --git a/buildroot/share/dwin/icons-7/062-ICON_MaxSpeedE.jpg b/buildroot/share/dwin/icons-7/062-ICON_MaxSpeedE.jpg index 519f1b448c84021fff252a8e10ed9bf583145b73..1625ed2c6abef35969d0e846ec4d57dd9f0d8421 100644 GIT binary patch literal 1461 zcmbu2eKga19LK-EjXmHl^N>q4&8DtPnTJGmOnVlfA=wb}6sx&hx`nMxsFkOVJYB3MySwL}drtrNe*g73@Av2RR)`c+K=Y_8#T7sh z3=owD3JGvlUSFqwAzw#Oek-~G76o*G4jjS)7#4zKAw?h12LJ|#z!yTHVJb*9Wkl2j zkSYWLNCgJ}FIRzJa8(2ng#~CWZ5WV} zS29!)S^$aF*4d?tHz8R$*&LxcE5txUS%G2USl|fWdJJua48~IOd_=x!pgxf@jZ)GUGOsu!sT_0ZTR41kw{Vj$2#S?;=-r9duCbjCW279A zaM8h*qTkmwrfm@(lUXg7BFIhqZ`Jtr-q?3Ot)qG7pu@r>&dI}ZC>={y~p0uFXHR+w@eIOR*ryDD%Dd3y--KU#*IbUXa8AP z=N)*0iE_p#mPn!OxW4*dO!2-eyDR#-X$;%)#GFh17uucEq+$hdKUe!9KVY<(R(z)G zc6PlgighE@>q_azSaQH&l2qW3Y+FFZo_n1@U$v8U5Vssp`g)ocT3iS#d3K_JeWYeD zeXu}X^B#3vR=j*QmD&|Y`cJ7!JD4>9DNGUygN5p&z!C`{PLX=`cZCEnW9=TAJj5V=8In<0uB=i4@3O|>|@x;krbcdS1? zrSt6YJIO3}qv1U1Zd{;Wk`Ft4-({n^$@Vi)&*bf?5EBHgxG0ZgM#R(tpcKlghc63$ONy>nhX-G-|_Sln)6`SzJ;o~aR=zNzDk zDIN5l*@rQ3SAbfUS7#NMltKDgKd{4{LkYRw_`{u|2;)g>TL!76On18reFJIJz^|8JJn0eJ3RoWN7^etz6FHfr0o?v(*b@JgJq1ZJ+~8aNmfWh~9){Pj7MQUqU6 zfPu47^62j$$MmX2n;4#(5*ycXQL%#bgQjVYE6fPi1NWXGa;5@=x|rE}2RpWHdwhIF z?uc<(%Zpc?h>430aP0GeyJ_Xf!WOHiYY&cC$SUOn8?#>h7faVCC(+wck>uO2bq62i zlKnCHdqPJR^mvro@n3s3Z%RmQUFK^Xf+{=Xrx@JHp!m~EglcH?o)*+lu_UlrV3iTm zS&{>*M-K`54RU+TuL(FDx2714G}*nrEsGh_eRwMrgWwd>QnOy0qcc8OW7M=X30VR7 zH^irrypHmOpbVzST*d91^+hb-86%1E7sjLgeG?{{c=0(Wuq3`|lL2e29FI@I@7{Eg L&n@>qRlNKM`U+Yu literal 1888 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 IJFM;h0Yw;+u>b%7 diff --git a/buildroot/share/dwin/icons-7/064-ICON_MaxAccY.jpg b/buildroot/share/dwin/icons-7/064-ICON_MaxAccY.jpg index 1a163314560cf2101c522785e0cf3ebff3f906a9..d7183b716b1229cf020062c78fe133282fa5b0f2 100644 GIT binary patch literal 1496 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 v`sAU_15rL9z diff --git a/buildroot/share/dwin/icons-7/065-ICON_MaxAccZ.jpg b/buildroot/share/dwin/icons-7/065-ICON_MaxAccZ.jpg index 23255ce0e591fcccf003ec52339bc53122fec042..ccf17d2b41427a1b2dce1d0918ba52e8b7940f42 100644 GIT binary patch literal 1506 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 Jx8FJ&{s&Xtn1=uW diff --git a/buildroot/share/dwin/icons-7/067-ICON_MaxSpeedJerkX.jpg b/buildroot/share/dwin/icons-7/067-ICON_MaxSpeedJerkX.jpg index c316c750b58cbb87b50e938651e249524afb005b..d00fa1156d444f59de046cd92774181a32b61638 100644 GIT binary patch literal 1511 zcmbu2do%={_d{rj$nAZPBAKJT>zwyJ=Y9X~`Tq4i&+~j9@uc`Ypg=n1atZ)J2%sxD zKs*gNNWP!b56I6EByDjgfJ6Xj01X9^00ap_k)XI6I0%3M6a@aGeE=M>U*hN}03aL$ z0T2rR$Av?nFezyShz9m4B2ik}I+Bzs2tfYdhe-oc2>1_xWCjXAB>Fc1fk|LeNNE(H zh*r|n(ng5i0uHT$%zN1Y@>uhW>t1?UV z`$hlYi1>z#P)45T;)@+tRsqgRnu^SQrJnWcd>X02VB1P+F=yHGwX*$JJG@|xu7J-L zra`yH(PV74polD3y>)hb70S)&Obrux(+4_SlM7ltp%qkc5iuFHzeiD4l`>w40X1za zTD6SQBE6<*6K`Q@m96HAqRFX2`CoE14gBNg(qufwE?V+%7q(NaS}lu3*>(F`W{1Oi z$@MiHG0-^jy@JFjfSKBB(0v^!2Bn|>DF1E!(DXZp4fe?dYn!&jhHO;70f09l@|usEy&d-YEJB7e5S83Dac1B9MZ$RJ#7_0=;%}K#AoY&M0UyhEENpFNbF@YY<7U?Kf=UkrJ5pVr zO7&c2sG%((K|@JPiH1Vhq7$lyQPdMx^2WBxF2G`#MDG<5P^U|SoQmr8SFyh-aEJ&OCYUJ-2jj9oCnZ=@ zx}GN6z8R<^>@LI{lsQUSm&V$cATl;_3gJ;x3ms$9L>JEdBxCJ@jho>ZKD?5!3% zEXier)oC=N^4&{EF}MG5p^d_V7^uR9vsXfSd-dOP?3m*RVt&DorNi-oWX#!0{0N1u z=jp7(j`dRatCM2FFVw_T`pRgP)1n(;k9arQ(cY^}+DGQIYlo-K7U8c%8%xz&2 z26adwp(Nb;;iq**Zdvq`KV@-OiJDG%@ktl;_)C5l{UM DToGfI literal 1936 zcmaJ=X;4#F6uvJnfnco?7ExiwmxrJNSzbuMq((~;5R@Qd%IZ`@@{kmh7m`2%S}AVh z0%}=Qa4Qy!b<}|trv`1sWssp_i~E8yf{IuLv9@3p(-#WJ5ApkP=iGD8_nmXkJ=cEA z{s2r4w`kG;h>8jTbnqVbXMiEgQf1@-2vA9PG641mFelw)(u+78osq3n6R9{`MQAw| zrJjSaxg0QOo<*-zW#A?x6Wm_b7#$QBk+#FlL6N}_Q-&A~b7Vyl<*|sAFyM%Q9l}y! zd>#@iWMd&*A&(z~@VHngha1Ylf>~Tl#0?Pz3y~q9WHy63O%x}K7|KQN#OTna%w{v& z9Ly#RD>#@?DCBT?93GEFMzD-II+N1E(iwe+6=b+kWzgtN8bXIS6qTt&mPw3~mHvMP zt$sxIgS{FRD3^acRI7C~U{Ka*io@U6`$1u&B1eyN;&3C8Wl-T{xUYk(7fB7c(nJ^( z1hI0si?Qj1i7=)UdPFL9bZs^=GeM(M6K3PAL5^H5iqaWPN}URil8I4Lg{{%3MWF%# zU&fR2c>+NMhJ}ZP@gx$dOe&G`L&60@LFh17MyRs1xXv`pRlny7#^gH2L8~V-%W#7x z8&^jd2rV*rZINc|T6kmX4RO_D*AhG?mqQlAaXjv*#~yZ(6XY;QMwi@-3_q?TC*DAg zw!Irn7#vujt|z|`WWNj6184*k(xOnvm0bP@Oo2&|3)KObHV9`2=p%5@$!Ho3)0}Bk z+NhI}kdGVodcdFq58weq3_xK(Faxq*0EOf~hoSfX9{?AM6MY;6C=__K*U1^sAu7!k z0N9BJQ)slILkg7!G2CD$XLk?JNp!&ULVdBY3Z9E3HF)wA1^`qljY6e54@E-^iW?Jl zrvfa@gXZa^{1$c2=fzE0Tq7y+E%vhC0prP9C=8eZ=7EPxw(VVJ?GB$3-}YIXAz$6! z8RlJ5{zFprch|m%-+8D>`AwB?F`Rh&5ckg6@!C~>HAmeg{@mC-*=-v1>AeJV@T?Rh zQV|i5aAn7}JPt3e&kk(v{cmim&C_NW^Y}jWkSaQTZfb2*J-oC4$vw7WQ!8Y%J~@@s zFgJm<;PlTBBu*;~KPuU#b$z*Ioqzq>^rtR4Qw_UQSm#Rx#Xc=mW`V>UZd?_dUza@n z_R>PU(ql)`INAJH^h)T+3->>KH+EAh)7-imFtBUju~( z7;fNfVMlUb<9+6xhSOz7pAYPz8*?uknWb+kwt8RbJN3BF+_mhA&YY4~m>{S-*?78F zwWj^Yt~Z?aGFk@Oto{yi)LUYV7Z}lk|Irt*iUC}LDJ=1M7V~lQV)yJpS9x21* z#WB9zFPh$-=*S6t*RZP^C~OP%oO~Tk|H>}{qb$10Xq-qF^tOI& z&1>1$JQ4c})pyyV(2}Gx?^Erlh(!_fga6cQ!wtuR){3fHi^5k|mZg;`8rhJ%1bMt!y>2Tz(Yml8^zQv>J0IHkuMR4@mSv diff --git a/buildroot/share/dwin/icons-7/068-ICON_MaxSpeedJerkY.jpg b/buildroot/share/dwin/icons-7/068-ICON_MaxSpeedJerkY.jpg index c7cda895033b1fd4aab35285009224d93ad4263b..6b8888a910fc0cfbf31e0d014692c2d56d63a20d 100644 GIT binary patch literal 1500 zcmbu2dpOez9L9g!+)u^kHmPJbiI7GerJT78bKO>%>xpGZq?lDZZbgcdiL-{KTqe<( zF>~$2XqC-19M%mBfIwgXB|ktm z1~|&U@6%Vv_Yvf6nGk@g09t?+1Ox@ZP!I$Pl8FE~0DvLDw^C6B6xHMoN&^5XKmafp zr1+n$0EQ?kft2MCsHTo83}J+n$MisQ0O(tQf-<0_qA0hJ@|~{$@c#j@0!WU4D#HLx zEp0=Dk&5g&utDAiLm^PW9_VbdeYZ>}KQ(9f(dKT)^Y-^oJ*>tB5;c}HpHf@2_9NlL ztFIe6`X{-mr@JsNg>S~~;N|Mur(p=R(X_PbFW6o8gT0vMl2xxg={ffqJ!tx-7QBK9 zg{NsihoKdSJ?UHOzA>UDki0w7}5wiVtXQRIa4^g-cWX< zj)0h`t^OFLu5_t4Bj4#c3E4T_Z)FjG0rs$AT~}Cd?t;#Gce{;N#&*17c?Va+Hkayn zg!xONc&qc4Z=Y30)Hos$%G5NQT(P(5N@MmD?)^!7{o}ft55{Oa{8}yiqoPbQ(H>F> z%rWQ^IVzi(z!WrMb|@3(#?F}q;f*VIEf>rL8&(*{6%TMo(8w=5mv|$rwbtzd!WmPko4nm82*`m_q`~p}u zhk^|a_oPgh)!w{bO}05u#Nlo#m7>u^(>jvWxgD($+;B8BNJ~{ciG#pfZCoVA^nCH0 z@H#IzBjTu>2^?)S|KfX!f6TfRg)mTeH*h%5?{RC`N7Tbgg-u?823v$DUn_ zQSx0=tZS5rg#$zGS&td{ypOvDi3OjI&4!aqRPnSw-)3oUwld=xETUXxz!|%HW_48u z9!2HaB)_%4yV6F?iyPiA16t{*&HSPi#os>#i&7d-^c3OExxH_JBxs+{J~4$V#b(;oL%jD(At%3LbYAG zwY%oxA@`|@!kefoYcGS zy=iajiar)B8KPqz=Wsfn%GxY4Kr%ON4c?v(c8RCgzho)Pn22iFj z%T+azu}51d&lOYnI~ypH7dZOou3G1q=7bnOI*Aa?g!2n~rzlIS3(R@LyxTFnf94B2 zlZ5LPBQn4M>C`O(&EqgQv4glKV~m2`K2hc!#?Ox>_&f<|5pOI`y%|p%$k@#yQ6Jst zVEgA4uq!LFrKct%?*F#z7;$(Z>LfxMlIY^u9$-3pM7WO_G8l11_Q${H~pSxs`_KR%vU+XDtKmY&$ literal 1938 zcmaJ=X;c$e6n>M*21nGe2rktzs0UFpnS=mIj2H+sp`s8`S*kS42q7esCWDD`tQ#sQ z;9lITSgIV4yPiT(K}Ffrsnc$&d1OF$gcV0bypSLr7A!zQ z#XKy8FBSw(L+6y=Aam@tTsN%$cWp&01_m&#_<&y%PX(LK4Sos8RaDZAayvkQ5I zH4VkYVlm1WpaMY<6%k}xU?w$=AhXTCS3!Z>bXJ3fG!SOQrKr&oS)`0hRr>AW?ZmQ{yS;r=eNMG|SnH6&q8Ac)M~ zF2Zz;TIepojBc=8VE4gAr=l4!%wRF-j1Nxw zLOyLcs{n@$yn#0iaR7}2!5qk04e|k?!SBC6WwG68Om_$Z5aUBPiwPh)gFP4kn8|=? z%w7&eV{klSI+Nw)?K6Z8M*DL8G5H=rgjVP_lmh^r&Y;ohtR5wZL-QOBd(i^Iysr8$pAeoUy;rDcIFx)AHUw(d9o^KNICkvY(wORuFY@W`fI9|S zQP7(FckOSZZ~roPYUBL>E|cY_)5PoQyRMurcw$WIG)iBjUN_rQ<`v8q{Zv+a>e;o* zuan5G&hzG)%4n~(^^?Q&c`wJ_KHvlgE9{D!b$N-o3AB@`!`J663AnlmsVnWssMCPC`9Ky$Nf99`tOH(|=g7uD86$oJy2 z#?wv^^04cyAOknmG{!3%k`-PM=Jj%laHV_7z50rZOHD-=1COt&5B_&iYUX%VV9k1r zHfx&VxNm*yU{7Pl%84t~5%j0kO2hS)c_WiYC@o8NEkDuBT$*h-*EwQUz^*MoShBp> zZ3%msLKQcp?5(nfeWne~ExN!<9p^sOi=NAf<}!D~Q{|UYXvsj72C{ zf?*r0>oc-bObe7HmE1kdko^+=u; zl%n4AO|5T(`_|C;=~Nhcxf4%*R;>^!JXFe#7J-HO^b;&_m-x^zy{Vb#+)(@E*5>DM~9E#Jbr zc)m9KP|K+|Qc2^h_Pgabe$*T({W7Pt{6WP1Ol5vUWSF*Gc93%?WQRv}Qq`5AZO<+c RS06q8d0(<}m++|b*8h}OlsNzZ diff --git a/buildroot/share/dwin/icons-7/069-ICON_MaxSpeedJerkZ.jpg b/buildroot/share/dwin/icons-7/069-ICON_MaxSpeedJerkZ.jpg index be450cd460ac69baeb096607fecc8e2f95790a49..f06a69ae2ed92bcf2b0773594d25475ab8078833 100644 GIT binary patch literal 1507 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 diff --git a/buildroot/share/dwin/icons-7/070-ICON_MaxSpeedJerkE.jpg b/buildroot/share/dwin/icons-7/070-ICON_MaxSpeedJerkE.jpg index 3c926b85651935a5e5f4b0d1fd1d4302349f613b..9a018367fff5fadac938fe8b859dab59b89542f3 100644 GIT binary patch literal 1498 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ρCP>=S^xk5 diff --git a/buildroot/share/dwin/icons-7/071-ICON_StepX.jpg b/buildroot/share/dwin/icons-7/071-ICON_StepX.jpg index f1015b82185f1a126f222893c0df32cc2f09b05c..432b10626c09d7509ddae455bad7599ee70dcf67 100644 GIT binary patch literal 1555 zcmbu7c{J1u6vuzFkF5;DD2izC4ib|v*@Y}GylQM28KOo~k@Z+g(P*q=i|or(_H`Q0 z;K^31u{YLw)-qI*Ei`ZHy+8WDd;hxUbH2+Tm&f6~14OONEzJQC2n?w67vPNpru^&o z=7-7eIq=oIHUNbL&;S|&LIGeD2!aCfIsnYia=TGP+}5*I9gs(;m~1C z-WVYKBLM|L0fxZ5Hci*xdCQdkbVxUw=o;s6~<2_t@B+wsO|7Uci`ISZW zvP%sa!r>qqhwj{0@%&U`J=bP+LvMb9?U$}G@bQ7bxrW{2v0rkH899~JIT`>X3#OQu4CKQndI@7XK5>4l@=px zdnxBhTwfz2fPCL`Treh>)FkUDwjMNm;hi>y(($b!7U8hUa` z{md?*ZD0N7VYa&vq@*%=x-hJR!!8e82u}MEkna{I1drbtSp0G!}}>pUvFT?M7v| zkcMlsB#HS|)%repv)fjdJiucgEqFt3$mc-GrmQ2A`bAS#e@`JoKi9B^Q4a6$x;A&u zTgzi&U6G8#Pbtg2GSXUnN^oOcm8zr7Dpe}yX`W^}x6&h7659?~%7RXNkR_2E=I`dT z)mW{J6&l_4_E5za6UvwMqyFkCdf$|vx=T67>BGM1P@G7vFNjMR@qMO4*w7qvIiYqu z|12q&ZOg45=&}ncujjsc+a@^dzMZY7`GN#z0Z<2DBvBhm*Jrz`5>?mWD-8Go4s0cAY5 zSDrg#X4@H%(k`M;?O(V+M5lN;l*=?6&FlZ;fyG^nQ-j0E;-1No9N7x7(6YToQCO(W zv_x3wry|zntZph^&}}Cy*fofEYq1_;~ z7hFhVn=9Xo?3t&@l;~7x%$~>D>z@}9f8;qX-Qax6dZE^RU^?-Y_3M0cihL5`v5y}Y z%N0lAR;2wCJZ>C&ncgncs1Rd(_-X7GSSE@8wyu=&R2)q7x!4Jdk9cR2SIw#$bKSw* z%|~iTwOMpkjP2&*5^NZaNH~6XIX;P590|AULBE9GSI&rP17T9-6fCxHgfpqCW%1ve z*KjE_v3qR;f^3IdX+`qJcyV7}IPwODP%B*(*rw92wckbnEff_*$vE=NBD42{H>^8y wRN>CkEa|eAlG3?6V*60s;OFH9X#S^&c{wYSgjvQ;+k1^Z)~4Z#&;oDtUq0%5_y7O^ literal 1976 zcmaJ=X;c$e6n@E&kknQUOJq~WfF3t8StKE&krD!m7(_%+P&CV+Lrf;jB(kXI^t4)0 zidH~Tv;wwTMUNtADej6}MXR_Aih@NeqEtO-i%U9*fc_A_AMf0E-~I0W-hKDkZ`zxH zS9k`V0zhQsNWcLfU~dCFwM}o#1PtIpyAuJhH$ljJtJQ)ch?x><4TKI8>IoB)p|v1l zp$GxvLNY8`y%Dp*I&2g2K`BTG(ug#cFl;_PF^j~eWktv7vy6I$K@c(? z9+!b;m@FpDs)aL53(ORnp%gfiqqOaCBLdhNVl^rSp^mEX3{4CiMvxdBB$Nf}#bYF} zTp<+8L<-56(Xd1$mLnoLB9;b<#HdJyN)>Py1avjhkb=glBf4tQJEfrOQt9dG!gQ&S zAm<@sg+hUdB#1;3NJj)xnP#gtBhXCwcV|#zl%B*bR-7=yj*MCzVY4a)w9@xiFj;!i zezI2|1!^>(4>g$_4REHVtg+Y!y`M}>#bsJBBo?Cx8>z?WaDNBcf`*Zp)=H3Z1hJsI zi!t*FD?!aCEO1zuqiezN@C4j!AkwK3PL4){Mw%(B)~v@O)k*=KMTp}DR3r_O%fe-H zNsvq|7Keuht7URkSXh``5~`Aj6`|c+HKDheFtfFrYxuwo?v?8p2a|=atj0)uA!djm z2@~wRHj4MIC8*bYU0g%&T4cR)5n2r5c-)U3yW2%iki+a5U3$|q{Fs@Zc#1k0SlKKy?GI9&D@POTq1T{&!4e*hpht-F)0Yg;&UgA*g-hd!)E)Osuz-6+TP**gA$8-Zj#G#P83yUrAoGMXy z@CRt~(*j)W_25g0L2H6|AOy5jnNjYR_~ai2cQ&^s9-&e;gcRg&sn-)o{$$T&!xgwz!W-BSxsJc?M|+IWgsl6^bp zL1Av`)~wY^$)bs}cRtp(1qYf@JaFAkyrS}YK>vKv@u0C^0nOY=(lc92PTz0HZ`c;> z8vO!36PY-xeRL~}q2AZ82`{>{u+dh&xBkK7q}??O`U?FZKkx6eo-f^Wi@&SPr5^p} zm%m?D+g@*fS$Z`RtvGt+a6;b3D->}ox8JA@wWt2d;oep}TYllRyy@oK`&DP7r^b;; z?#i63p)V7{+bj0n^=TI=GN~Un2JGig&5K`Il{DSGN^@ur>FeL{EQ@5$o3^BUR8h&b zTGib(n^Xnl>w?QZ>XY~#xK9CayHVgXqrPsR&a3D=d)P4J!pWNUm2*QPq=SDJdhOCr zgq6IrKZW~VRh8utrSIy>QfkfzCAY1UCi++!UwzBf?VLV2anB=qDp*(J+H=y@J?yO6 z?i;n=%D;BiXgFMX&J*uAV{4pH`{&nVN2+x`vs>hGxig!lkh=p$`l6g7n4=!bo#1zS zhM(NKx#-TT#Pfda!;IFn=jF-GsSLNy3+w8apRFF0ufNo+*Yn+)F4sNCtS*T!+i{Pz zaOTEWk^b*0J33;YY)wJ=#W95~TT*sd{>eNiwS$e^hs`hEEDpy0i!W~T7LHCB;kkY1 z;2V#l;tzl&X}KN0R;}{LSLj+Q=2Tt!Eut*y?ZNc+-}!fSBiDAWP|P}#x^`3Trl+=x z6FB0u6)lTeR=e0i%bX!k*Uv7Sw*Fad-r$g}JX19u@nZ9Zw!63ey&Chv2PHj;LM91q z#hr@!d#}*aIuGuir0O+q&DONki=E!f2Yv@_9^^$GttlS=T3RV@+!h@@Oc$ybR3F)} yMdf))NtPB5_*ZUuw~L~D`z-z=4hi3%I_E^Jwln5Ud3op9{3kHVRZ~YIMP_JwN diff --git a/buildroot/share/dwin/icons-7/072-ICON_StepY.jpg b/buildroot/share/dwin/icons-7/072-ICON_StepY.jpg index 9bb3e6e6beb79f8acf54eccfda0bf8ae7c1cfa34..9348ef0424526e91475322b0f719bc8278ec2a34 100644 GIT binary patch literal 1548 zcmbu3dpOez7{`CxFb;>!##9_8nGjiYa%&z$xfNZ^CDYs~%;kjBT+(66<#BnK<(kn6 z!_*owB;@HRmloz;E~hkVu9?`;dCqg5bN=r8KF|9+@AG-S-|s6L70m!JJDW2$00;yI z^!El3jRRJD*Z1jL$oD1exkViSToOP6NC*fHfZ-qr93<)jPyhe{0sj?LQtF32pbi7T z;61dr{-I*x5D73;5+sELYMKUy3&jCYu{(GR`7eP^`puC%~g40*Na^~P#9y*y3i51 zU_j5c&YQ?1D>W*1?nG3b*WboF!czT_MCNT>C&FQ!UZui}O=f>m-L9#|gN%~yVRXtt z%Bdz1(7mkPsFvTkx^f%!F^R?$|FKSIXe0ieS#~I)N3f-x*iyr%qi#LGJLlFN*Aat_ zs$;Iil`gXM&OP-_WbNj1{mY^5^5>;{`sbW{+ahP>aF1ddr+BP#r@9(!J-!-)_c(Oj zc9dyj^5r1Y9f_(JzvkVjv0k2|9MwF27|47*;keon4r?2*2xy}lY$KdwAKfFm zs1Yph$dG5q^Ijt!F5A_r4Cdff2E2%wcf=<#QmXrkjfFA#?Og?`V`932Fomj#S3s7; z8CYBG+8R>l4|m6AslTPAEzSfMTWO9?Ru5Sc%yVT6knzD@(U1$-$eS#Cj|4Y;JTpM9o?9<9y ro-DeDx~=n%oMzx;r^4-IH6Y>56k6(ty literal 1979 zcmaJ=X;c$e6n@!*S|Ex->ox`~$dXCI5)z3qB%qN-5d|tmX-GyHA(@cHBp?=-x*Mv3 z8_)`BKt((js3>lSY5@d5#?uJ^*qcajiou{2z_3QoQmC+Ggr&sPuvwvnIV?5| z!bE1RLYayfpk!nLsu41u*PLWRs7lC;50fn9$;2`RvM}8O zn8WAuVKx`$aszNifZn1pD9iyGy=Sk36wxbnsMdgD8pz?ONXCo?ArtTP!x7ZlKHE>; z)kj3R{PR?`+HnEhwt7Ph(%1JbCTJJ4J zr(gz5pMq&2iNtYhp^#5Js!?Gk{e*6fTrQAl^ah1SiO8fvCho#QQI&wrjpXqoczkYf z2#3Ro5Qj!`#ZnGi%H#3^LvWW~trSxl)riK>t5x-D#RF;`%z`cYHsD<%nV8_q>=x6t)@CkB+eWQzS`i39T;1jRIN8A1kICl>$ zP@Te`5W(IERscdDh7#r; zu%7}9I&cGSBmx5v83Yo8U_T930ze}4KYu);(VYf$_xf>`MyFC-aViz>kJig4lE{Ri z!zff5!)-VnFh{s^!aY64i4}*ug1>ZP00N0XB~yvL_5=oTC<%w))M81t{tE1 zabgyGvSP}RO*@!$bQ$BvwXQqPQi|E5yxT5U6&LLsJ!PJ4yLNd(Le%-M<(}Eqz8g&s z*UhMTn`tb>VukLzBC2$E^JlhYMnID9J40Pcj3_P4S|%{OZe4wly~97tYqGJdSj4`0nDNQyE?rAb}*_?=%?Tj#{Y-~%^jxf&BJ3hNM?rF})g^?*5UW z$`_qSV&9f_7S+oH6-kfo?Y|)Z_fF$Ko|20#x)&B^t;u<@q9fh<%DCi3<3n$seSG(G zl!*Il&JBKgq%$u6!Q2)a%u3&^+E#p#8+A2)C2!8wGW7M&4}Rk*mZxsEl`b58&?mp> zs6lF-Uc}hDv3|LiZ0n9_CwgpwYu&sU%Zy67$4Z!Rc*Sv(bpMUcLRxF~-dT}}zMKtE zcGsvimn@dmiLx+tcI%scSv2$G@_mI`TXkr7e+?Rj-8gv4E=+CX6N*6lIYCI>9txPLy<`>e8-=^2wHhaH_Lc0U)`wCaLb;JX$Fn8UE&alngpk+}`mh#beWS@7ng5 z(+3TkL{CIX3-dI2+gj&}qPI2|&#$aDhqbJ?gO*y$t7Gp)&LdC6mb|4##rfr~t&h!l z@}JEwt0bx1FAHsZFilo)NY?~6wkCQS_q@Mb^YYFh?9f-Xlck&U>RKwxS`z=(muG~E z*R7x7_m{uf+Ya&;uR0pj7E^G}n)uV}cRuTKC{-g*Wb!J0(5_dW@md>pEd86%J^A^+ zzZ=!2%`7Z6L@o_}V&aMpT(Pps?4W2{`YkrUscF^3F8=f96%zxq9;+VKUz+N#isxMm yni~G9q&zOL!49a;#x`3uN=43g)+)EexaO|$wy}F$>IS>)s?Ms;QHvYxxBmxO^R0gX diff --git a/buildroot/share/dwin/icons-7/073-ICON_StepZ.jpg b/buildroot/share/dwin/icons-7/073-ICON_StepZ.jpg index 78dce2a36933d6f986f21027cdb263d23326ec59..93434107e69da98b270e04d2fe20d1c43b69d9dc 100644 GIT binary patch literal 1550 zcmbu3c|6k%9LIm#Y?LLlDay)_yO>pT!>oL~&-8W&j8T2Gq6(;J*Wm zx36E*4&>Je+i89~fDi&u015&^0AK_Nf&lS5fc-zp0soWGF2UW~21XPBgCQVbXMain z3W0$Ig+RMdfEW_9ll{@@e^EdX1{K;i@z-96+LE_Q_)8 zH25O`e20&KAOHhk>R?7A%>h!$**e&Vt8~0Mmy1hwp3YNxU{gLip9cy{;I`-amWEmk z>V|0g=YX6f9`KeM;){ZClPT<`Shr5pg8qx8<5kR8-zl%GXHQjNNwry~h5qP}<6d?Y z7t``5#4qrB&-I290&pgjQoL7w~pVc|rX?x}4QEK#KI}%M^cJvNxG*q_< z%zUotc0StkHjhfilXR91PS!x#fiG+rM>uK-6y2=Sr$jq%`dkx1<C~(ig3nk zmPCV_nQB5++xds-FL^^q6AU{+qMVS5r1jvIVe&-E9BIt2joPhD^r|K&T}t|d2ryWR zN-0k|Qq{6qn6NSCS#D_Tm$J&pf08EWLR)Hy!4({P#8rZhD?6avXK$oD70?z+X1SJb zR9K~}J4+vpEnbs+U^oiTTg}nq2Qx_y zH|K=A>^Cg0)gIHSqK-GKW;sbIiz!@Z62rvr1-^~Z?Uj`B^$s%D6R}LYb2nI$+;G%I z>2D9tZZ2e~k!M?1oWG9E)=4A1Hme?Si(5<0>XpT;^l_v~>M1S5FYonx?rwSPX-1pZM@&1P8CIy3 zO0?5Xa|{f~xWD?Q->WW6-@2d!T9(7vinvf|@3~xW(`9M;lr#|_`HbF}`IgQ0sRtLK z)+1vtBxY({Wq6dj2Jirfvb~M^5=HfkD75~EwPdHMXy*Q;@e@VG2QUrs0R^fBo_kAN5=Ub~-i;m)#@1B#JFz@iQ5|x0r;*!mk zbChFLiZexh<~-B%!C#B-XfQ5LK8)wx&Q1@vBj?&v0t)8e`}A-0D?F-N6#}0zd4qAJ zS8nJJWtWFD3rhF^ect_Bn@?NULVPeYn3{7*K6t8+`p@X;mG&Uf*1q4pT8ptpjFn^7v9GDi8#sB9?tcFw?sSjfi9o**jXJAo-=%CqZNLX4T(D(bl)3F6uwb?Yi+ zrIV|Kq-&d0A8gMbDJzFenOexf_I|y@)78!P#qq6C^5|oVn*%Kz*h3j5sBdNiug0|+ zi!?ycb*FS>t-JlDn+dw^Vpd79H!4Hyx3Rh%{FZE8%tXn3dB4M2+*-hjRS%!=c4e`JbIiYbz~ijjy=#)g;Q%7S2&@_V#+Hsv$Ovv5j=3Ll zK4^SqfjYB6Uk-J*P%ye&QSem6h%;nNUSL5Z<%=xiWa5HEmNX_=-Yb$6)v+gwT)7|` s(wH1JP&ZmT%fjEn$Dmur($R~f9lI>-Ml<<978<6vzfF*biRQEa118FhHUIzs literal 1984 zcmaJ=X;c$e6n@ztfC~{Ys0d>~R5Z&ZK%7Wwk%&eNAfS|`+K>#AU@~Je2oV*i3j(4? zC>A|p6^pHHU2rKBHxS`ySv=x`0xne4qooLP(5lsRf`I%GzaQ`1ci;WKd*6NcnQxoh zf%E(nO*{Z{xffu9k1%%vmMlq?XaW>KC*9EinA>Um1cJaNe7@euQ>w8zl&8XU{1he5 zhj{`%@SB^0D^-ao0mY#!HF_!M`I!qGNTZf=B7GDB1s;GVXcn$Dpy6wSBUEb>Rfw81 z_Y24`MUtY!bts{PQgo~IMoEg4(=RR|ZHt@Ff%-#;L@CGLk`?+&5efxh1{Ct)`EpgT zw-6E|JlI!&2)$=PLIEu13&ea_#1+62fv-e_Km*{A*$nDHF`CcY@E^0Q79yGy^&DrRj6Dh<&Y{ojYcgI2xkZS z_T-M$hC}v4kt6qP=jU- zstz<@I;j8J63vLUhyq8{8{n!(u0=2+mroYMw><8!#~yT%6J#-mMwi?S4L_Kz#M{wPDV3mG=?>U z&KPzw6!Lk)TnSiA;0PRP6c(VeC^Qzud$4d=pwbwWaSn7VYnG!E6L7|}=eavif&G=G9zHe`Sb#zUOuE&OJcUIa2d2O@2Rg&b zpEJ*CiBjk|p1nFh!^7I#0!Gm&WK}d4m<#HH?{+TTw!ibn`L41!;;#Z*#*O1qt@yXa zIezPvvx`KMsU9_mDBC-%13uBQwS8Mt%SD-|fNNiMal_qKlgs%pwMd`XV4oNyH`#fX z<4%k)uU=06%XjxG8dH}^JhOApZ!E=Jn==TPN!F#6SrgmRY4wbR(WA7D)wf^Phc5fU z;C9rm=uLZU`L@IPzxNn_oiXvS)M-s|ICMNnn|Z@#hA7x++WKy9JjUy;o}9VH)V*o% zO>UGUy#>k3?rnM$`Rrg*=8{E8@fWV2i_D9>Zp12c$IjecSJRPW(}wh9Hq_2(Z+`c% z>~ipu2m?PiJEz7Wx8Rzw^S83vGxcL!T^@Q~;m-d~T~K_?PJ2MS^m=dWjyt0>MxUC# zx#rxlhM5cRX8Ta=U#lK@Xaksz6<+kTJdwg88y^p;C!UuLBq`6no| zqju`!#pTOObD{LNE?M;^)7BWdpC* zyrj8;F>~6vJ*|nmlH-EdQm;zg72D_nSy^9$U2xOkQxg+pVa0uN-_s$tmfD2>nPVHM z2njAk5Wh+Ey!$raF!4Ddnw6)|KIHM7AKcovk~p4(H2zF~&+gR*KWlrhum;@aZMB*>*s0=Ona{M`)_$#+Q}^! z3efjedG~7YozdB)@78Oy&GILI=R7|mJ*)q*u#U~mdw0%Gtu4OLTDIYBhT^4rM04Lb z!yoHz73{6s+m&>68WUcf)t=hEgKh?oR!r&o{_9`D3wx^b+*T~&v{q>XpYLnvyx->T z+#~1g2$>YtIAh-9UNcxQC)V|eb~0uAklM?9$y`UG(1N)vG&2 zyU+Ita10)2H^Hgq=^l?MvEfG}L@j1u)#Y|`JI`H-9rns}j9FIlV$rO*UT#~)yG_I2 MtafeM_>=k0|4X^ClK=n! diff --git a/buildroot/share/dwin/icons-7/074-ICON_StepE.jpg b/buildroot/share/dwin/icons-7/074-ICON_StepE.jpg index 58eaff565032860f0ba11c2cccaa8f965aa5298a..9102da951d123474e724030efa617a28f0750981 100644 GIT binary patch literal 1545 zcmbu3dpOez7{`CxZ06Ewo69&Z<(hI?<~DO#EXyq=hvbr25jn)9%{3`W!sF7q%_S)@ z*N_#5BE)ft36ti|8A)U!&d%!m)Bkf{TiY3k?+n0EP&$@BM#Q z1PXzPg5e-BX#gdq@}2$h(@!WM3WLIhhNkcU1OSPE!NT!F5D^d<3KK=5WB@5?RarF^ zb*z8`ND8CDNC*-j05eTJUyT)rZ7plPr2!E=Ij?zTvKIG`G7Z}`7nZaanc?r}*P|wy zbL~aK_zcP3BNorGs-^oakqJikvb{-+cIpSsNI6;_hIO40F!)F>k^-+eoLEi@=3z?D z*3u`9J`B* z(ZJ)8?!?g#XxC!+&Y%Mibk0}I*fv=6O=#OOaSah0k*o`}l}1uGbeTI%b!jKw%s1EZ zV?Sq4Nz=bjf(BTbG-@?;Bt&fm{jkxsa2EHcJjKz)rC~I#VfQ=mw9Z48r67 zvXL5JH{E6Xth0-e?tot5wA-|G+mg09_u*DpE*8h`8&8T*%-XdFH;G*c_Na5Q?qbXE zMaw8#d4YC>MKU&2dG78_a!nIt0j-})BF+`C56nGn=NqqG8cyv|tdg8%M(4J6lL9bLtCgP*RdQ=6J6tcHNV_0CmY`AD^O+HOZRh?QfgJIi3B7L6Pl5FJre#NRcP%w}88W1B(WT zH^KT`9&)e!N!uguG~;#%09DRyJeO&Bu{5QwXCI1IxMEb4ED7_`I9Ql-ScZ_(?*KRC z8yp%-pdPau@o_f|@+I`U;L}r-p9WQwv6Wtw;RznpuP(_fXV;QMz1& zbQ6D@nY;ecWJ9Sh4Hu$6;HchX&Ovgbum45;4UFc%CD++W1iv7RakiuVL5X>1-}Hu^ z4fLmF$G&9~JjoA6Jk(6dS|07dtW@W#)Jx&SsXA@ky#zVRX436FUNX{omZ{DN0njm< zm0N_X(4Y1)aJKN;Ays^ORH4?x)?u#Nw|_Fd+o2~vC{s1V?a8^&1&swMq`_weN*X!b z@b6o%B&$EeDB=yu?9dY4!_U8JrHR5nUWlnp3zGFltfG2- z&UsP^FB9kPS@YXEy!r`=#izynAvSD>=2O6pP6V=00GJX&$P)Xe;>))kr|TzL2F8>I z)8gA?i`_i&GK|Z&ozT-v;(dA& n$O;&$tW~YqGNZlJGUKw6Q5l6ST>-EkFByS}7yVZyMlkXp9Rh>n literal 1979 zcmaJ=X;4#F6u#L=5U>Uk!KM0mpdvyx5J)s&ARsA?vRT=R4aq|iNnT8XB#785)e6;4 zQK7aXR%fsUWyT6ql~Jf|LBt}W0)ohnf-A+MfSSHUwjbj6Al07N2JKmk)QJ_b}_igb$s-~bVG#{gjLBrub7IyH~URB0I!8Jd7Fq^Odqm#CR+ z28#(+`{~sZ=@vu>B_NySDn9(IyaI;gGCsUqk+v>UnzlvCmBD_# z&}uzTuT(1$odnV=lT})to)4Ro^Dx`wX2Os;M7M)j_G((7Sp4BorP9;@b6Tw~9GTMl-o)BSgBoFmBU&^?BSo-qClguC3(z1E9jb{$ z(d3CPh9;ppRGWmVp@0BW*L)zCjdGO?P1P7uaJKHue7jpjZ-TnYB)Lk|`FXIRIelNCZ52 z`~*)Rl5FiP$T%vE4&b@=6ekBuw!fo5a@Kj}JSxBua27-okuV;OqvCA|z>!TPSqNY| zI>(YNUC$Wxy;ErBFAZuM@ThZ=*F52JNT?`Ek~X5uG*~iEj*ezzo8-Czouj% z>5s_l%RMm}?d46;Hx$*vn_*?gpPpG;))7A2W_NRkaR1XaxIX*~i`vn~tIeSoV#nA$ zdDVf}UbPpM2sV7;_c4Q>nDdKDk+CB_%sI!~Lt&A7SP^kN@>hmq7PI9~ssziche&UBBQ9&-6QdvcB(9wA-m;HlFui?y^iM7Q}xx^l#~L3h0!* zyehtauD~@u*}2@;vHnJB7(M%BPHok|pz_D0h^Pn~f9Z2|YMQ*n^-4Z17vxjB*R>yl zD6?1rJy)LO7awcVUOy?w1csyE%&*USunK&+xMTTmOS|tG_*T$pSpnR6?eFjh^q{iy z_k%ap2$C1|I~YM@#^pBGw&Jk*@{Er5!Xrg3y}h&ro;&|JOw$_PR_wKYJ5c+2_mX0I zKU_waj=t{CYL}07XSL5y(>LU#zz&c%|^EuJ=JM*qP>&^0=$)_uVHE+&;rxdgr@BR-f CEV7;e diff --git a/buildroot/share/dwin/icons-7/075-ICON_Setspeed.jpg b/buildroot/share/dwin/icons-7/075-ICON_Setspeed.jpg index 94b808f716a24c444918d3919e909e90ee413fb7..a0d15689470ae251ad6f68d817d527f36d0e9547 100644 GIT binary patch literal 1598 zcmbu5dpOez7{`Cxu(=e=rc|q3Gn0cws58Yuxm3z+T+QI%NfbKw#h} z@c^Pxz(TzJnEna*u>`SO)B?a^00KZjKyUyI2SMNZ74NhxU=F*>Lq zMgSND0Ym@A5|Utu6bK62p@@L11JXz(RW*I_;Z6|n{|G=r3MwfE>f$1C0$AJt`rZMS z06`?B6yZAn1Qe;NV&EX+0&-$A7!H90X23Ld+Yrhjfrs4uJh58SKT0zixJoL*nwm!B zhPJrwkxHhn7}2dYPN(z;im#x#YP)4x5^virW6EKFP0Hg_$FckxtbRgf#5v)PwfDQC zF%5#T;G3avR%C}W3QwGH9NAZ+R1>ah0GgaVU)$AW^jYg!;^pwiIOg4)8S2odF zimv(n-{_|+nPCCO9NDKlG~U(OvREma(SgZRglLziT`<;6Y}8GWEsAw&jDLq2bgMu1 zK0UUc(URSLZY(WDnV8zwByT^BJ&2vHPHx*v?_vIq%1@rT6B*^uACfw*)w|t%cya2w z(_w8I*@kVM*A!yrTdGTUz!G-S0tPcUM;0H{Tw{%{ZpIZq51%QcsK+m&_Zx1{GhGY} zi`ZcD$0;%GrZEc|8Hfo}Uh|*%PJaFR*_npgB-cfsz=_;}^OuG`67}lyD;V{yN;EE` z-J0;p(ZbJf>R|gumh=fZ$F*iPYcc`d@ZgA(twhHW?f!V9lrH_CutK(Tl(SCh%+9Lc zT>P@TMzDCw$*dVRY8E@6QZyc2j zZ6Z_sBWEj?LQN7j2`|$LtLsv!18*in9t+Vvy{IJIYuQ(ahi|Z`pEQv7y&Fw=&sMF# z=!~E#xpWzo{rpBA=JC3$NqNsk-Pe#FSiGj~#U+ln*SR^8FAc79!~CYEf9PG$PRi~U z^}4XH?O%kgeYy-B1j|=pG%@0eW7K(GC?STtHf&sSmNgPkT`gsN5?67T%j~@|KLf3E z!mqpQYQf5*rzjKrM?_-O&;)0IjT-Z;4RfiBBA)1$;LOjlxZc;8q%#?2+T;}heqdy5 z_}b4e#ynosj&SBT1;Vve!PfJb4H57H=O35*-oJ=8U%7Ho)ctx z|G-(Vf{0xNgR#Dqcs2USyW^$)INN4K`mLPzbjz<+^1jrik1i(8%^S6pG81TM?-s$& zT>$TAUYrch)2RvGWumpV`_!o0bbegXg8XGA_H)T^1#MS+-L9Ra+HzCJ17fErRUsGA zG{t6$*BP_ZA(OE%>Jr&Az-*#>igZjfHa!EyHYO+zx-61yw*psK9St?LmaM9)6{-)o z>Z&$cDP;{Go*j$S&(CgxKFs>{kn6x9TDV7Q1=c_tYXH@3&dJG?rrCZ=P=&*G(U{|m z1$#a2w2J1TPK2V{0t$lVxj7&=FhNLS=Hc={c{4T~H(lbmJ~!g@B&(=%uSNFrHpcw4 za`H?=VZGd7+2TFnAUYChZ!SQr41swsNXWX<79A1rv`YHG9}ENMQLFB`?R@8{eanUI zxQ_5S4ymxMwVFhT!C%M_OqsDM>ld!_U*){DSGt~TKYr9W(H@^4Ow;+0Qkxg1D%99| z6M3JX8l6UbnKb06azO?5At)#?1xWMR s2S}J7@GiaQVq%$TlZiJ(%P4s^>mdf=lgDGa`;tTeC+E8g3Pha00isX0`v3p{ literal 1748 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 H);s?LiaLdi diff --git a/buildroot/share/dwin/icons-7/078-ICON_BLTouch.jpg b/buildroot/share/dwin/icons-7/078-ICON_BLTouch.jpg index b3234d45aa12f9c909b935e13022bdeec8569220..fa4b87b8a9b4cf95a93421f1451c8ad93eba1aff 100644 GIT binary patch delta 3010 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 fEINqG48|C}t(26cZxXhRL|Z_*Tj-5xHeEHWQM? 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 TZP`e41oP;yvB;_$1AY82(N24` delta 1354 zcmY+Ae>~H99LGQ3eK-1H_-p6`F&uh;wW{_%L{Tjm+NX-Bkb zU>1}vI0!&!r~_CBKB1il2uIEnW&jAFb+$PGS~cukq=GD!LKZ|(UKT-=B0LlTQLe{A z`yrjUgUVM>e4S-U2faD`BRrWvk}60M`~7D{b9Q`8)4kJ05)nT&K_~pvB?&wsKb684 zC$XtAs=uFh5f}y}r6lq}(p}wBNIM2j0tAc28e(yVhBynv2(hpx;&4Q3D)A#!8p(=G zwj$AJbO(k5ou**1e0*4}fX{(&2tqI=n3%evp3PV(YLLeA{v|XSGKoA6A=+o1H0u4hbjNV6ASNa5m zf&m(13?LWO$?5!9C zKxhDC^z{Fq2LZ$e#SFkjB}l1oma;juzr=!EB79T?EmPS`j zEGi&_8)ByK;rs?WJ<9Cv3!=9N@R9+e@QOkH9zbEVRe!4i)C$@Ksy*-#dxnUoJc z%ZxMXo4MCunGqQJ*gpPc@}YrdsoXK?Tz;qh{o-yHZfr{LYUIM<@~>ga?fH<##@t4= zD%qx~OmnZU(5FxyBKJD;Aum>x|M>J(MS1Cy$2S;r8{10W_p$xy+`Wq1!*+t5fMMRW zT@=0zml5yV*AVFWr}xOT(^si>he-YVWsL)=ve%@X(y8EPXP&rbe23o;BSUJ%&xCnP zzX99Bri>q-OZ!7kpD|I!4{Ahd;S%QPh!&U>Tx6V&*0|&`>jV3|yocQ$XsS~c-(Ik} zCPPob3n!|N3k5ylZK!^3Lc86Je{(&>VbA5{4g+#K6f$&Hzp`$?ObMT76$oahe!r-aAV;629)`#$3@D=QV5L&RCJrqPb5a=VnQ=DzoSPFTvsz z;WrO7eg###T3{DkPg+hZ;X&KxSEC-m6X&6dd2xUt1)oRm*o7@^^YIm(aGC1fCx4d|T7nqV_HnKFq@M zA}XgO)u>a;lF63bu?0~)OBTgGURpfKv&vK#j{EG6?%i~Di#&e1B>Y%5t9H4SW2`>m zY6dM2l diff --git a/buildroot/share/dwin/icons-7/081-ICON_TempTooHigh.jpg b/buildroot/share/dwin/icons-7/081-ICON_TempTooHigh.jpg index 07aae4e5ec3352884ed28b2e9593e373d5e6fdec..61ca9f41d72f90e6fad7de7921c5ce3a96e5105d 100644 GIT binary patch delta 3211 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 literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/093-ICON_Printer_0.jpg b/buildroot/share/dwin/icons-7/093-ICON_Printer_0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7175b7194ef5e277355dc11530fb95e0eaf9f8c8 GIT binary patch literal 9153 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 J+8uXu{{xcqxfBwKs78t2}7VY zj4X^S49qOt5P3$RyII);8Q6ss4MoHQIYh-Am5hQy!xD=oPq}pY|1Aa{ph--E%z_N| z3{Pe|W%SAR3*=NP6~Db6Pm{XSw*8%2+ce3vg4OYN!c;OPG}5{6I8E4{V7_*O&FA>& z{|rn^uUbDY%X(86JGGT<+wGZZ%&vA1kImgan{VE;)ROe2!U?>qkKIX74m-f=(Y;XQ zr69Y)_N9yd#%3;0N^Z(jX5D(n$y!4_N?M`v0(0HY>_h8AE#;&$Ph?MZxf*i8=b@Q^ z$wuW30p0=&HomXqM?*w|$Mw0Ie|D4~eapVzu+RJB zZPneEtn22@m%F#4_vzN7>$dJ%w`x_d(7$~yokA*>veKE$W-}GsF>(|X4GnP#{gB6d zS#ELgvu~BJ4S!wf%vyPRb5MxZs?G_U4GkMsF{n&(U=Z?PZu|Uav(S!&@?BcqOHC%7 z^bG1+ZR2z1Jol=veTYxoiAG46&|?Yyp$z#^#vVH=DO0a zPxYVpE7Z?5m;Y9J|5uIa=knF^N50E{&Z>WX#=gbS{%*up|YO`JJVP;kNU0^fsR54nOa@JS=fYu`2a%&Lk08v|2F}4)z}yS literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/201-ICON_Checkbox_T.jpg b/buildroot/share/dwin/icons-7/201-ICON_Checkbox_T.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4eabacad4dc5debaa508f3bbd2e90b653290b3b2 GIT binary patch literal 1279 zcmex=nftib*IMhEKl&GJ+A^2o_d$kP*5-dq5@t zwL#5b1Uj5mkc~k|k=;>Nsw8P!Jc8JeZGFaZ|Lc_ zzV=Ex8+Uy=yUe$7%9Z3FX6w!uo>84%YO&0^=dQPi{i={tiEo$K{XN{n?9nMPpWoj? zRM6Ao@torR=*OpLomtzSHqYbGp^NJe%M|Xk-_g76$GNrxc5K)09NPKZ{P~V^d3Vyg zwo1HSYO&lXy02U|w34V=NBS-lVZiV&-SqzSM&I&^yPFJelcC*Zw_{xTkvj z@+7@yC%^r3Y<&IdPf~;mpGgSiM)3AA584#-H8VT)es4jeOX;Y7eqRS8jOuE-l>6WI1n-)Xc{{$8Ft? znZ`UXxwhP62A^ZUk6YC@wcWxp!k!Yk>mCW-bhNr~llfeO^tV^H4{Z*sl;=J2N&3{H z?9c@>59KIiCb=gpn5O8Me0!UE)J?m;#&Ytfc9{!rT~bq?azFF5jq$w8Whc$%83~Jh z7h?_M_2+%K-qG~b%gJI#7Yle@Wj>~<6|ZJ^ShbkFdw>1K7ji8@Vv>;(dos@6S{tFrt{wA0benf}KEbqdZZ%-0DRQRrPcqUXgYKh-ZoKs{y zE3#hi$%|u?W>;iLM0rn`aqZBqtCiCjzs+UWaSbkxH<-yeMReno?S3Br8MNH2=ZbPH ze3PVn#BJ;H=BL^x4TbI^e%=mz^E#nCyGn6&OF)rHr{M6 z=fs<~qT>6nitoRFW$_ga9+}^kjPkmtm2bZ_?q43Z-%rWlS7l>MujtZ{+Pw>UN-U3- zEjxcOVcuqr8$X}PMr(Q9@LGSg=r>Ol&*aq+riRQiYm(=!mAL(E<Z$cd|Kou9N^WZh!Nc_u|{ z-xov(vHf}d{@V0U>J#kG&F=qg_5QEj+`4tYHvaXW_@BY-{NF0}Pwm40^tOLf`p*#8 zD*XKHmf1$<&ZVr@*4A{HpO|Rp{q)?NV%sB{J>gnA-&fChZuu@WTzhJ0X!te0tEtXUamUxW~a`XBa?v0Q)QB;daYfT#)8g-MyEv$pkhIaf$;%@4TBBi_5U{k DaNFvl literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/202-ICON_Fade.jpg b/buildroot/share/dwin/icons-7/202-ICON_Fade.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7d327ae9b9c3fa3b0fe3ceb147e8768f52402acc GIT binary patch literal 1360 zcmex=j1_g;h|9fsI{JSSip@MAXQsuyNAC5C3m5@BkgbB*-ktV9)TxdCL9O zZ-fn(+_sfnzw^-wPuA_n-x%vzu6(7usfi=|fe}aN49-qA!5I?kJ?3k8p{WVSc8 zctz~wscYjbS3X%Ex@I=dvYguLHBTD&#iwaXI<>NBBrsZs@^~7>tId11>TB+|V?s4c z`XpnMPMz$JXt=DYrNXJ0bdH;WL$KlO5e;6g`4dg&@;e<|Ru&%q`p~L37MIh%GDRlc z?>k%UJ}r6k!wS=Vsb0KGJwq>hin#O!Cgfc7eyN$fs^G-ICwf9k+3$1u{I}#f#% zUMb??cqI9e2H%fQyde`jzOA|w>F|y1xaT~DGpc+(q|~{03rUnT==7`II`Z4;g2m}gX2GXYOCzRCeKRRjR{0V`Tc2TjujuKo z4Hb{O%zk7`TwA2%mUCWrw^7veuFV^h1Vcr{tZf3B7U}Qz>JoKd%D`atqU!77^-N(s z8$%e~)zWhr7oNPcd2?N4XPVuONuDpB|EWo=s(YRv@%(moLRL)#uWzVaXxpRcbW3rL z1ve^%|Go}p6h70nieoe1$&+7=!c9ZMex)YgJ3m!k@L_=^&zGGtUr&8dO^sCUJF=SV zv?hzv#@x3ey&D4}gl4lwwg=9)e7bwt^6aC{Z>z#os?Q`%i@IoYp0#+PX26odX%3~5 zNedd@o-kVZ;_=g5>sjfsTX%fwdA#DMesWs0fBUYifA4jUZeMXE>FSajnKrkjC4{)t zI3lcEULQ>9Nc;IU?8FMPL<5URny|X&-2#|`?Af_Fl*DFhZV0c%V{6~%E<6f zV1Zuyx*0X`6OQiBR}v3;AeJ_=xVSlFt*`1XW^EmmqS|!Cd`PQ@g_`bQTpZNWGv%l9m z*f4EPw!-wsec^&84UH!s-ao2#NNK}F$=DF(HvjdGMzwnz&;2d>@@Q(u!;=%eTUCCA zUst_$u4_Wb?^wCz(OaWxD?@jdZMwX(;ggi*BCoe~cDpyMsWF@=JzKKk_NwQTECc$# zv`jxMwMNi#ZT9S^KF6P&)D6k9J=kwSnPdpUC14hO15!LRxskc#imp zCaYA>yZEr?(`oC)y)r#nXH_O?N6jzadoO15>}`wYJ-K|4$))FvOGeBhCQpu~ckis~ sUp2kFh~deb+bUlaAG9i^={YcLX56NbvGI{;S$*))(0T^`*!urB0rDvnfB*mh literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/203-ICON_Mesh.jpg b/buildroot/share/dwin/icons-7/203-ICON_Mesh.jpg new file mode 100644 index 0000000000000000000000000000000000000000..65c94be0dda9f8fbed817841e36571ef6370b6b8 GIT binary patch literal 1373 zcmex=Z{=G5bSK%dUA&GoR;1 za4w(4bjtQf#M_piZ#0{~^}1SzuDUldx?)aRx@_0!X>VsuJSoH68nCZA_tX(?ZLhUD z+m(78F143@V2BV^j*i-%)jNC2fs5L}YiXmh=g~zVE*svI`>{ zmz8~*b<^nTtXHBJT+h9d`&njk>NMxqW85kn+3&c-_N+1zY*yNOqAzJx<$jIx-|h(+ z`m6WNf4gA2;LODNIUiqTCZ_VO{_Iz<(Jj?o%OUl~le07aOuha&bhG?4kNC!lFQWT6 z9!yn#bgS?L)8YE&U+fJNohoF4Pm15NwM(v0;M%r8GUrS6>D-_oPmj>DwVJ6d4lfs` zu>Th5uU;+sZ~Njq`=u7m7S)a6uT0hRkJefkWZEP$&09X_pN2Z?(%$3?fw4Q;(lRUy z5{`V)ymZUEo;OTn+CtSCC*E|+Pp!163Q4*@S>aj(|2l`h8A7QaedD@cS*_|?9zB_t zHM`S1cGe!&IolSLg$T-N?fTBaBa$+yK(y!gRP}XA=65gu&W^eKO;u)pW%9>@h*cXD zb(17RZxo)m+S?*9wL_;aEG+Q((?hnECiew3<;tomvc;D41wAS3z0&w@%Nm|OZm~Rt zri#KRw;#X0HG77O@6>PAF}aidW6N7su&V6sRAu^iqBL+nt65>wkqOP7Wujq46Ghe) zPx7DrtNPA-fqjd#%f-T$)%o;mq^*u|xyIcYo8Z57QdrhQDZPbv4gm_z>= zF4e2PdB1R?wXNT>UvAr)vg!jjWiQ*Y(dSBtyRw(LlI4mO9V@z~*e$PhE&(ab zXNpgKQ_BDH;ap1RvA+#34hV33V|-QL{q5E7wkd_%UoLi(?*CcwW7mI%xQ?%{KVAr% z?w`JTlecw9+aW%M1;;w0IZ8_dnAE;pbnQ^dXgFH5r_0cE&1dbaQgi=AolRSxzK(nQ zjyA4UtGYHG>sowiNd}YB``n{U>(!DN?z_AUYHG3LFkd^#Tj-4E-_5eqtS;PCdBI;> H|NkZcV8$R; literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/204-ICON_Tilt.jpg b/buildroot/share/dwin/icons-7/204-ICON_Tilt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a1689e05ea110219e1d73ac1542d9ce0720de4a3 GIT binary patch literal 1215 zcmex=vfSVD0xV_34Q=>l6R!M@xU*#C+k(ub$VZrHkkAc3s>!Z-dS8s8ZfZMjsd6 zZqY8YD>!@Rb?aNdgRgq-woQ|%$xPytovth{R~H)A`lREOVADmx6H{|SRtw#le*dp+ z>t0KtCn-mb6+;bD{n_PJ3_P9)inDx)Guxk$aEj?gweP1V_crdzyBC=GxU0%E-}a2J z?Zup(^H=PAerqb9*;0+HuZ>UJPA~BAbZ9fozwg4~=d+FF?~@#p39E`Gma5&am9;TS z&YR7&m@R01=TsYC2ZPl7F3S_At}PLbxasw8(Hgh@?)0xoHj%T_ew^!RyR0oG>AGDk zEWS;`XUzfw#aXV3dzcoyW_+TCDZV5Sa_0WZB z`Eo3Z%u5%_uYdTskcTh$$_&p3C;C^MncVkN$V|%Ui0328<_*!`+7ebsHY|uxVzX_H zUYOdqle@2b%E6@!MOsTkww8r@TL$<}SbC%JV%n!z|C_(PW-b4z{_ebR+vyXRY*XaT zub1q3_nAFGg>_*Mua_EvAU3NPNAJms0&oBs?`YL`}hF3WzMz_-uQQ_gSdzRGv{zE5ZOt$wkqu2E)f zaABso^hUd#&r5sV7B4f|=xIJr+scHI-4wc(_G7SxTTqRp$A+U9(*-MP0bHkIVSg)ZRZ$GFxn(?0LIM zDtygcRtB5$`mH{jxMu5Wsy~^;>lOc%#cSG@E#XB^F`dD|~;cv?)z@8_vk z8hi}NY01k492306x0xL&1F>JR<7A!lo!7z)*sp#p+HqlPmnJpPH zid_~awkwwifbtUnk^*Z;o>05bN~ Aga7~l literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/205-ICON_Brightness.jpg b/buildroot/share/dwin/icons-7/205-ICON_Brightness.jpg new file mode 100644 index 0000000000000000000000000000000000000000..22eda81168de36697b4b56427cff8fbc4bdc82db GIT binary patch literal 1922 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 XIxAkctTuhC{`&Hkkc^ZF@72EmRGXD_ literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/249-ICON_AxisD.jpg b/buildroot/share/dwin/icons-7/249-ICON_AxisD.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14730dfa425ca214ab9a0690abe3e2888e8a46f5 GIT binary patch literal 4752 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 literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/250-ICON_AxisBR.jpg b/buildroot/share/dwin/icons-7/250-ICON_AxisBR.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89d5ef05ce219c3508b85664cdcf5d6ef5068416 GIT binary patch literal 1500 zcmbu5Sya*q6vqF6xJ4!kn5NAr1+GahHM!a)X1XTv)mJu9)$PplU2n_kk2Z139P`HL7 zpl_h0dC&=AfkdN%F3CgyOpXA4 z7Phvr11>F%1)Z~t8pV!1NL3vW|4@>cFXz9?lkX+a; z4m;35MZNYL)6(gl;Bt#P*WDYhmrLIbT;U{6auP>o?ME8DS1~GF&?A4WlZ4%mwvl?x zk!65TgjQTED#RnO_a6{~@$U&bVtiPRF}0;%`i#EvMM?8@)I9M)__xJEk<8qtSXQV@HamA+3wArrDD6a_E`TCN6RkX>O9Jls;>c0tql=xU zJ&=-JD&F26K~X<)NT{WzRz#Qe(?zLk#DK^A*8Z&`rLW4gA8Se%1BbqW$c zQ|xC#hbAvMTzrGzUTxev%)zS<%YbX${x4#Z&Sw=N2U+6F6LgOoy$S;ozHh$)h! zABE##QM0u&K(mIdSGIh|Jn-CANYEY+wDZYRc|Wb_zCvpv;XXXW>5n6}Ph>zhN-(D= z9=1R4wm_mU7#t?lVYbKiBt7Wx1`_Xf}5&@A`4o zywDHvjdZA`GwxTeLSfZ@Lp@@;NBxemNe3oxZ5EYk8}IzuSM(UzsEo_fwD#`E)ysRN z?;5yzBeal@5OWq;f6!l;+e@L6s8O>_QCPIy^D-eJ6P90%2s5_U^C!JsZ*)ViO=FCy zE;Z2<7Wpij)U!EL+Q8TMR4gFjD|%}8%=;8{rJEV{)+RQ2;tDOp$MLOV{+Y~7>ucbl zeWSA+leONc-cDP!W7)^Gi;f3q<&x^0TFT!f)29$BieK^^GIFL-P!!;vdcm#I+N1#0 z#_z26S~`SmQ@_H*AeJ;kuw1tzOfk3Lz?3sbRLyd-rvlqYL)xFMIOd@%E%s7j^va6UKFA=6m+}@|1|;!Lw$ru)ZU2-6KP%VR zAn;EVc=hgBNum3m+PQg42^-nBUzb23w4=a=fEbB$AvJV}o=rhSV1y(GNOY~*Kmg+b~E)vWJOE6EHljq`GTT;<_bGwij$Os6;!4D|Up|sNr+HMa%$Z24sW(0v%&>Z2$lO literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/251-ICON_AxisTR.jpg b/buildroot/share/dwin/icons-7/251-ICON_AxisTR.jpg new file mode 100644 index 0000000000000000000000000000000000000000..716b9f7314c48e312c782f47db744144014680c9 GIT binary patch literal 1454 zcmbu6dpOez7{`CR*d|(r4Y`#|#W*s}Q#pn?iKOICE!kGdrQ~eu;2ew|E4QX|atTLH zJLR&lTq>Q)Q`?eDg=TD#%c8app@kMZ>*@S)&fk6CzuxEjem~zoUiFZA4A9%-X6_8gFN2>_3vyf6pQ9rgqJY zg&Me}Vp+ajc_{d0)x-Kd#uYondn{g6>QZ^UF6=tDH;X=fJod*`qWdGMVyKa{jP&^Q zIS;Lv$4}0K9ZO=dg?sAj7W}DL)#mD*A4Y2Q4}|w|yk16~Vi=Km+&aeF z$aj>o{CA&wc{)&2U_-gp&xKtR_mraIn6Q(V>d_dEoV3Hr_beCIopO;@91eFVnltI} z!!_U=HX7I~6--B!6?sgTV%*(xfoy9+cJD_VBVG z{mS^RlQoiBdTiVChTaf5R(}$0(mY5C9PO8QI$pvH+}V7wBs3z|PBdNUd2JmE<#)j# z6u*Z+jLC{ZZOP@NM`R&oPtMOnm$E#e8KhKg{qxU>$peA=n)G3t`9eF6r`b_#n07ip7<%< zJy)p)P7hR04m1^87%iTxO_!P<9dJ{H%x1UO%r(0{9a0DuEV|@XI!_%23tHND{C2m9 z8TRsp;$xd`4lLYiIC|^#4VP>ax5Y2bA9H)K;y6R#*Jj^ItrQP*k2{wP$CUcF$S0B` z(Zk1w6~zwn8kwHGYhv&ouKz4CRFRNnLMoEGn%;9fcH$Z>PV#69x4rA!zM#tb6o*7R z+oWDmkWl4ZNVyIr{PpTktnCxV`x4*9l7^MOlx?$^$A9DQ{~p~RCq{p$t^3e=;z?If=*kxwNX`I9i%i5Ekv>x@>@cP;dXJx0{*X&O@l*yc0^8LQ=cwy2Lv*g{yILg8lDGj+- z(1N4C3%+bZY8~S9_7+^Q?M*l|A>i#bttU^zc2%Wyu9|DH4+eJf;>ofSK`!+SM${c3 zz&R|;AEd9^&@G~6w6I~-V%*H_aM)0%#d@^Da+vFMM>ifVe8R1ekA^QVBD_`vRHa=)Mv zk#b_9^~R6X&6ORDGp87w8!p;j^vI$n)0nEVa>_Douotp1z~fq#b)(#`QriPFa-v;5 F{107&UJL*L literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/252-ICON_AxisBL.jpg b/buildroot/share/dwin/icons-7/252-ICON_AxisBL.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c94915dd25392fa7e8a75106fc9a551e568ae8dd GIT binary patch literal 1550 zcmbu3X*`q*6vp3Km?31Wlbf;($<81VN{orJC6ySwGuMzUlqgw3cB8qBC|eq28#A&D z)s?J8SC&EJx*;V)er}dbi#v6{^u7Q2a?bBL=XuWd#P(}I(jIpV2S6ZDKu=J>HWxT5 zn0}4#Ccow&xZdsnP)I-qkbyx^02Bp*p&;8`fc%f=fS(XSiXsGpsw4n~!XN+?2EhJT z;X*KB2o!-7K}pFd0|thIB?W;lSojGzLKq2w!UUSSAVmNK{@vvVf(9;x5|)w%5HiXt zsMx`xE}UzO)R+vhIK>STV!DMiRnbj4Fu8KIrx^h=1SHK#bAbro z_a!$(w0ZrV=4*|)k9>mI^^bL%6%pU!$o84eZU=;Wy&vQKjXR2igwhiI`SpWkNnny2 zGo2G@aZ!+YU6F3|E%9b-?&DflI(+%;38u$I&8d^C`{ch?!y8Q!dcjY`D zR&Z8~5v{x0RAG;YdUGvL41_e^;=YwzRZV#^-)I!fCDz@4P!IZsw1fFnYEH}rEoq0~ zW?FTCv;?c06-ybm)lf-?za&czr72;L8U@T~V})-=*-KWbjhs!vM6Xe$>~4Gc-MEGs z_5_ayQ~qr-a60KxlHLcR@lmq49dhfjI>L}@jD+Zc5tkv7-RHEmB}5{p25J0APEOY$ zZ$DUAPU+6@zkhwmGCs%}=1)oN!MR6ZDMh3o>k`OMHWk!Ox$oO<$*#62e;FRHzz`nIV@^X*M=#kcJJ%_=4;= zJ&{G9tZ~aFdlmC%yjE!K`|RfK@e$Nb!ohcr?1{EhoBiXMr(1e=Cu`|>tj}E2*Wp9yZNj5(i#$w2c_wOHAxt4LV?K2 zrA~_?gHN?F0egn349&TgvgG&+OXOWm1?@DZJvxNt%5gtOaPArF=}@9ajT++5?-2DM zV&-@{i-#=ReH+}o?>3MAV^-r)y*ze?XL6o<^5#S!4PGhnQfpK&m1K3s$Cp<4q&QkcPTDN`wCt%Y=SJxJVPO*_ zd+>1CANs!A0D@UEq3Gx{K)Pp795z^q%l|7p=GM6BJa+Vv+SS7Ros1;5vEQBB#&CJ9 z)>3;mg}e}uXmW|cZ|uI;$BIl4EoKtD&0RE_%re~r2@G3TA<&UZ%$RKjJj1~z@kHk; z@~Ytw{K&zI=Q`6<8~#_8LR4;aA@#b{&w1jv(1*!7q)6U0>5?Q9KvGxZkKMUh^0jxI z6Z?3L61qjP`g?XHt~S<#%=3!V>-8jl4Xn5Pw(*&(UgrxUC#*n{DohOpvubqN#IE5y qrUrN}ShMvUeB*=u)+_n=_z0+3YIY0Mg`LV@HZMp`EhxIOJ^3GJ3wq}O literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/253-ICON_AxisTL.jpg b/buildroot/share/dwin/icons-7/253-ICON_AxisTL.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7fb5de6e9c6e6704a58669a6c4f609f31b8e3d36 GIT binary patch literal 1536 zcmbtOdo`egXg74Sx zJ>=IC1n#{y00{?B0165s0SFR=BEh{*K>Gi2z)ui^i--yc6$AhZg8&4C3jZL5AW&hL z2na`tiYX`p5-2I6K!yXq%fO%fFc2yv0tX-h@~EIl08j`5{s@6UK_OuzOhOV6QP4yw zDk*FIPW0Xz2gIR*DkKyMm;%_Q4NEZCNslmH+7$mjA!5RbL#y#ss5I}hi=(NE;G;}+ z2WI(e^}V7of2X5cPY`5fHFe*;u9Jmv4A23gUFIb1mxWAbf81{mY&9+@L(GEiTrp|A zmh3Dc-+^ExXXP(`fE_VHZ=1ta;*q68><&>TCfH(2`M$D+oqaF?(V?@QxKf)cCaWHxV$0UsEn}ydI+nOnX-um7eDU?b{rzl*F5vWOe3C5jZgieR9+svSLY>Z@;+B_IUe5B0lj)(VRy|`byC-~T zue?e~@j`dD(Y?$S$@&V1(NG~w^O`za9D`M1NcUj-{Vhhk6}@~7vyN^TcH)qBsik<7+;|86`>S60L?; zfg7Ly84FL$rB2w^lZy}J?sFk@8P>DEJa)_IcJ^b=jTRQYz^+~Y?8C8ut2MRBt*9{@ zB^cf+JLzhud)L-KZI0(Ga@-sJhg?c>@-+y04i(Ast@h;4Q{#w=W;NF2X> z$|~Go)VVBb_bUBqevw|`tJP|mrDNeNDbDO#G)XgTa7O*!Ky0rYySdbpE?=E1X-45@ zPgbXeOTQ1;9@w~ysf`VLPM1xbb-9#JGRmCOH;%wdajMco9UN=Oj~?c-Y@T}dQGC7> zJm5S;JBp?TIS=n7^q9Bsi`cIpk-s|NDNWMO#U`{DOJSMILhJ} zyT<8Bep{Z{A(-sOtPgyfij7%dQ5N*Yc{f)FJ43=&A)2@)kD;~?k)|i0NL)T6d8%w! bD?OlM_uD#d*v*J*Va2uLTEq>W+Z+22i2ig9 literal 0 HcmV?d00001 diff --git a/buildroot/share/dwin/icons-7/254-ICON_AxisC.jpg b/buildroot/share/dwin/icons-7/254-ICON_AxisC.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3dd02c52b0eaf7b8505d2e57bd1c703a586e8506 GIT binary patch literal 1483 zcmbu4e>l?#9LK-=ZG6c#Y_d{P6fq;0$};5q%*{0}?VG{{i3pv%3a(VKj z`B6I|+9JcEAIkjdC(^aKr*wPH8trz^bAR0Z-TU*`=XrnLug~YB8`r%COauJ_`~V09 z3OMTv&`kk8`tIBG59Hej`m|00Us@?kX?Ry(-6R0&uYh7;7+^P0IKD+%BE%aJ=^dPCqY}@(gGssh zW`%~7FQO2vAz|^XAGPbqMy`8Uh{17o<&0y5hJ(Z4wD>0fAFC@ZYTDMe7jOGPe2Ypd zZ~g2C{)PyY8{V{QiW|| zTJx3PL0k>5&9Ttt7Bs&|6MuoZak}R~$ZabQ8nKuE-tE5gwJ-hqpIr`~5KVF#B>neG zw@3z%^jPohCSfxnR!Z)#xtQYU}LO0}X$2Tcv7Qq{?V^ zt0W~kWz0Bf`9oKHQPruohM*nhcQm%|P@R;w0dUH5THwlCXa6h9Di`(gbbaP!>`&^S z!&ZCJMj1(*3FypJD-|MHYbk#`)<_3DQDuQSjFN?n!5ljmQD*)-P3tI4 zOjnWaTOl{A944aGD(>0`e5010^ql?23F@y`6wGuT(Aq0jhpA7rbFySqXN5^Yf^kmp z*yLifU9x!ad7b;N=Ubw5fCsJoV%?K>vkhNfy2hwHbMT@`Zik^Zw2S`~!p{9Z&xD&o zdOW=tD2wjsQlL_4*#*r^7VB_R_onm$0+Zhw8ZA9@P0kQ?>OTUVWG$TKhCDhKZRqQpzdogWMm97Q6lKM*2E`3jF6z=(ySQ$*{iu{5(BA!P zR^=mhw&8pFDPb%tCYCkm!oShqJFB`-EvfB0DdaK|QJ`0hnB5yd)Hu4W*KXt^`5+0oCM;(C| zQJhp?FYOS*?9o^-j>tP9@GTRtiJh5n|MU0mu$7-TDAv3h+3t|Iq7`RECKM+o1f@38 zaZ-Y~ZRXV2aLJy5GWQQ}=1s-BJ}&if0@wu}OP@Y9^JX4a&HKIbsP9VMv<;ZNd9vnl zcnP{R*_c*w`jCV0iL`93>m=DDjVT()NLwKEdkAqcHKXE%un_DyNJEeXDIEP5PFAL_ aBd1B%RplglPAIiPJ80-&J2;)AoA?_Q9Z{PA literal 0 HcmV?d00001