diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 140423f25c76..d9e4d8701f5c 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -79,6 +79,8 @@ #include "lcd/e3v2/creality/dwin.h" #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) #include "lcd/e3v2/jyersui/dwin.h" + #elif ENABLED(DWIN_LCD_PROUI) + #include "lcd/extui/ui_api.h" #elif ENABLED(SOVOL_SV06_RTS) #include "lcd/sovol_rts/sovol_rts.h" #endif @@ -1622,13 +1624,13 @@ void setup() { SERIAL_ECHO_TERNARY(err, "BL24CXX Check ", "failed", "succeeded", "!\n"); #endif - #if ENABLED(DWIN_CREALITY_LCD) + #if HAS_DWIN_E3V2_BASIC SETUP_RUN(dwinInitScreen()); #elif ENABLED(SOVOL_SV06_RTS) SETUP_RUN(rts.init()); #endif - #if HAS_SERVICE_INTERVALS && DISABLED(DWIN_CREALITY_LCD) + #if HAS_SERVICE_INTERVALS && !HAS_DWIN_E3V2_BASIC SETUP_RUN(ui.reset_status(true)); // Show service messages or keep current status #endif diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 386b805b6def..be5aac7f6574 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -873,7 +873,8 @@ G29_TYPE GcodeSuite::G29() { else { bedlevel.set_grid(abl.gridSpacing, abl.probe_position_lf); COPY(bedlevel.z_values, abl.z_values); - TERN_(IS_KINEMATIC, bedlevel.extrapolate_unprobed_bed_level()); + if (parser.boolval('K')) bedlevel.extrapolate_unprobed_bed_level(); + else if (ENABLED(DWIN_LCD_PROUI) || ENABLED(IS_KINEMATIC)) bedlevel.extrapolate_unprobed_bed_level(); bedlevel.refresh_bed_level(); bedlevel.print_leveling_grid(); @@ -1009,7 +1010,7 @@ G29_TYPE GcodeSuite::G29() { // Restore state after probing if (!faux) restore_feedrate_and_scaling(); - TERN_(HAS_BED_PROBE, probe.move_z_after_probing()); + TERN_(Z_AFTER_PROBING, probe.move_z_after_probing()); #ifdef EVENT_GCODE_AFTER_G29 if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("After G29 G-code: ", EVENT_GCODE_AFTER_G29); diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index 6d23de4f77b4..7e9d3690bbb3 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -84,8 +84,7 @@ void GcodeSuite::G29() { TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_PROBE)); - int8_t ix, iy; - ix = iy = 0; + int8_t ix = 0, iy = 0; switch (state) { case MeshReport: @@ -166,7 +165,11 @@ void GcodeSuite::G29() { else { // 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)); + #if ENABLED(DWIN_LCD_PROUI) + dwinPointUpdate(_MIN(mbl_probe_index, GRID_MAX_POINTS), int(GRID_MAX_POINTS), current_position.z); + #elif ENABLED(EXTENSIBLE_UI) + ExtUI::onMeshUpdate(ix, iy, current_position.z); + #endif SET_SOFT_ENDSTOP_LOOSE(false); } // If there's another point to sample, move there with optional lift. diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 910395e5617c..a7802626b085 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -58,7 +58,11 @@ void GcodeSuite::M48() { - if (homing_needed_error()) return; + #if ENABLED(DWIN_LCD_PROUI) + TERN_(ADVANCED_PAUSE_FEATURE, dwinPopupPause(GET_TEXT_F(MSG_M48_TEST));) + #endif + + if (homing_needed_error()) TERN(DWIN_LCD_PROUI, return hmiReturnScreen(), return); const int8_t verbose_level = parser.byteval('V', 1); if (!WITHIN(verbose_level, 0, 4)) { @@ -274,6 +278,7 @@ void GcodeSuite::M48() { TERN_(HAS_PTC, ptc.set_enabled(true)); report_current_position(); + TERN_(DWIN_LCD_PROUI, hmiReturnScreen();) } #endif // Z_MIN_PROBE_REPEATABILITY_TEST diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 9fed4dcada3f..ce851f4d3ef9 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -309,7 +309,7 @@ void GcodeSuite::dwell(millis_t time) { #endif } - TERN_(HAS_DWIN_E3V2_BASIC, dwinLevelingDone()); + TERN_(DWIN_CREALITY_LCD, dwinLevelingDone()); TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone()); } diff --git a/Marlin/src/gcode/lcd/M0_M1.cpp b/Marlin/src/gcode/lcd/M0_M1.cpp index c600bd5da659..703016b1ad12 100644 --- a/Marlin/src/gcode/lcd/M0_M1.cpp +++ b/Marlin/src/gcode/lcd/M0_M1.cpp @@ -63,14 +63,14 @@ void GcodeSuite::M0_M1() { #endif } - #elif ENABLED(DWIN_LCD_PROUI) // ExtUI with icon, string, button title + #elif ENABLED(DWIN_LCD_PROUI) // ProUI 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) + #elif ENABLED(EXTENSIBLE_UI) // ExtUI with icon, string, button title if (parser.string_arg) ExtUI::onUserConfirmRequired(parser.string_arg); // String in an SRAM buffer diff --git a/Marlin/src/inc/Conditionals-5-post.h b/Marlin/src/inc/Conditionals-5-post.h index 55d91c4b81dc..5964f4b8b9ba 100644 --- a/Marlin/src/inc/Conditionals-5-post.h +++ b/Marlin/src/inc/Conditionals-5-post.h @@ -3132,7 +3132,7 @@ /** * Bed Probe dependencies */ -#if ANY(MESH_BED_LEVELING, HAS_BED_PROBE) +#if ANY(BABYSTEPPING, PROBE_SELECTED) #ifndef PROBE_OFFSET_ZMIN #define PROBE_OFFSET_ZMIN -20 #endif diff --git a/Marlin/src/lcd/e3v2/common/dwin_set.h b/Marlin/src/lcd/e3v2/common/dwin_set.h index 644efb40ba92..5c5bea51e64f 100644 --- a/Marlin/src/lcd/e3v2/common/dwin_set.h +++ b/Marlin/src/lcd/e3v2/common/dwin_set.h @@ -156,6 +156,7 @@ #define ICON_ProbeOffsetZ ICON_StepZ #define ICON_PIDNozzle ICON_HotendTemp #define ICON_PIDBed ICON_BedTemp +#define ICON_PIDChamber ICON_PrintSize #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 fcbeecde83c3..1835a744781f 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin.cpp +++ b/Marlin/src/lcd/e3v2/creality/dwin.cpp @@ -1114,9 +1114,9 @@ void popupWindowResume() { dwinIconShow(ICON, ICON_Continue_C, 146, 307); } else { - dwinDrawString(true, font8x16, COLOR_POPUP_TEXT, COLOR_BG_WINDOW, (272 - 8 * 14) / 2, 115, F("Continue Print")); - dwinDrawString(true, font8x16, COLOR_POPUP_TEXT, COLOR_BG_WINDOW, (272 - 8 * 22) / 2, 192, F("It looks like the last")); - dwinDrawString(true, font8x16, COLOR_POPUP_TEXT, COLOR_BG_WINDOW, (272 - 8 * 21) / 2, 212, F("file was interrupted.")); + dwinDrawString(true, font8x16, COLOR_POPUP_TEXT, COLOR_BG_WINDOW, (272 - 8 * 14) / 2, 115, GET_TEXT_F(MSG_OUTAGE_RECOVERY)); + dwinDrawString(true, font8x16, COLOR_POPUP_TEXT, COLOR_BG_WINDOW, (272 - 8 * 22) / 2, 192, GET_TEXT_F(MSG_OUTAGE_RECOVERY2)); + dwinDrawString(true, font8x16, COLOR_POPUP_TEXT, COLOR_BG_WINDOW, (272 - 8 * 21) / 2, 212, GET_TEXT_F(MSG_OUTAGE_RECOVERY3)); dwinIconShow(ICON, ICON_Cancel_E, 26, 307); dwinIconShow(ICON, ICON_Continue_E, 146, 307); } diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index c4d94d68b671..ef111333aa58 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -438,7 +438,7 @@ void popupPauseOrStop() { } #if HAS_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER - void dwinPopupTemperature(const int_fast8_t heater_id, const uint8_t state) { + void dwinPopupTemperature(const heater_id_t heater_id, const uint8_t state) { hmiSaveProcessID(ID_WaitResponse); if (hmiIsChinese()) { DWINUI::clearMainArea(); @@ -457,20 +457,22 @@ void popupPauseOrStop() { else { // Chinese "Temp Error" } + DWINUI::drawIconWB(ICON_Confirm_C, 86, 280); + dwinUpdateLCD(); } 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"); + if (TERN0(HAS_HEATED_CHAMBER, heater_id == H_CHAMBER)) heaterstr = F("Chamber"); + else if (TERN0(HAS_HEATED_BED, heater_id == H_BED)) heaterstr = F("Bed"); 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. + default: errorstr = GET_TEXT_F(MSG_ERR_HEATING_FAILED); icon = ICON_Info_1; break; // May be thermal runaway, temp malfunction, etc. } - dwinShowPopup(icon, heaterstr, errorstr, BTN_Continue); + dwinPopupContinue(icon, heaterstr, errorstr); } } #endif @@ -1015,7 +1017,7 @@ void drawPrintFileMenu() { checkkey = ID_Menu; if (card.isMounted()) { if (SET_MENU(fileMenu, MSG_MEDIA_MENU, nr_sd_menu_items() + 1)) { - BACK_ITEM(gotoMainMenu); + menuItemAdd(ICON_Back, GET_TEXT_F(MSG_EXIT_TO_MAIN_MENU), onDrawMenuItem, gotoMainMenu); for (uint8_t i = 0; i < nr_sd_menu_items(); ++i) menuItemAdd(onDrawFileName, onClickSDItem); } @@ -1229,14 +1231,17 @@ void drawMainArea() { case ID_PlotProcess: switch (hmiValue.tempControl) { #if ENABLED(PIDTEMP) - case PIDTEMP_START: drawHPlot(); break; + case PID_STARTED: drawHotendPlot(); break; + #elif ENABLED(MPCTEMP) + case MPC_STARTED: drawHotendPlot(); break; #endif #if ENABLED(PIDTEMPBED) - case PIDTEMPBED_START: drawBPlot(); break; + case PID_BED_STARTED: drawBedPlot(); break; #endif #if ENABLED(PIDTEMPCHAMBER) - case PIDTEMPCHAMBER_START: drawCPlot(); break; + case PID_CHAMBER_STARTED: drawChamberPlot(); break; #endif + default: break; } break; #endif case ID_Popup: popupDraw(); break; @@ -1304,16 +1309,16 @@ void eachMomentUpdate() { #endif #if PROUI_TUNING_GRAPH 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_(PIDTEMP, if (hmiValue.tempControl == PID_STARTED) plot.update(thermalManager.wholeDegHotend(0))); + TERN_(PIDTEMPBED, if (hmiValue.tempControl == PID_BED_STARTED) plot.update(thermalManager.wholeDegBed())); + TERN_(PIDTEMPCHAMBER, if (hmiValue.tempControl == PID_CHAMBER_STARTED) 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_(PIDTEMP, if (hmiValue.tempControl == PID_STARTED) { plot.update(thermalManager.wholeDegHotend(0)); }) + TERN_(PIDTEMPBED, if (hmiValue.tempControl == PID_BED_STARTED) { plot.update(thermalManager.wholeDegBed()); }) + TERN_(PIDTEMPCHAMBER, if (hmiValue.tempControl == PID_CHAMBER_STARTED) { plot.update(thermalManager.wholeDegChamber()); }) TERN_(MPCTEMP, if (hmiValue.tempControl == MPC_STARTED) { plot.update(thermalManager.wholeDegHotend(0)); }) if (hmiFlag.abort_flag || hmiFlag.pause_flag || print_job_timer.isPaused()) { hmiReturnScreen(); @@ -1408,8 +1413,8 @@ void eachMomentUpdate() { } else { DWINUI::drawCenteredString(hmiData.colorPopupTxt, 70, GET_TEXT_F(MSG_OUTAGE_RECOVERY)); - DWINUI::drawCenteredString(hmiData.colorPopupTxt, 147, F("It looks like the last")); - DWINUI::drawCenteredString(hmiData.colorPopupTxt, 167, F("file was interrupted.")); + DWINUI::drawCenteredString(hmiData.colorPopupTxt, 147, GET_TEXT_F(MSG_OUTAGE_RECOVERY2)); + DWINUI::drawCenteredString(hmiData.colorPopupTxt, 167, GET_TEXT_F(MSG_OUTAGE_RECOVERY3)); DWINUI::drawButton(BTN_Cancel, 26, 280); DWINUI::drawButton(BTN_Continue, 146, 280); } @@ -1547,11 +1552,16 @@ void dwinLevelingDone() { } #if HAS_MESH - void dwinMeshUpdate(const int8_t cpos, const int8_t tpos, const_float_t zval) { - ui.set_status( - &MString<32>(GET_TEXT_F(MSG_PROBING_POINT), ' ', cpos, '/', tpos, F(" Z="), p_float_t(zval, 2)) - ); + void dwinMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { + ui.set_status(TS("X:", p_float_t(xpos, 1), " Y:", p_float_t(ypos, 1), " Z:", p_float_t(zval, 3))); } + #if ENABLED(MESH_BED_LEVELING) + void dwinPointUpdate(const int8_t cpos, const int8_t tpos, const_float_t zval) { + ui.set_status( + TS(GET_TEXT_F(MSG_PROBING_POINT), F(" "), cpos, F("/"), tpos, F(" Z="), p_float_t(zval, 2)) + ); + } + #endif #endif // PID/MPC process @@ -1571,34 +1581,34 @@ void dwinLevelingDone() { #if ENABLED(MPC_AUTOTUNE) case MPC_STARTED: 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::drawString(hmiData.colorPopupTxt, gfrm.x, gfrm.y - DWINUI::fontHeight() - 4, GET_TEXT_F(MSG_MPC_TARGET)); DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, GET_TEXT_F(MSG_PID_FOR_NOZZLE)); _maxtemp = thermalManager.hotend_maxtemp[0]; _target = 200; break; #endif #if ENABLED(PIDTEMP) - case PIDTEMP_START: + case PID_STARTED: 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::drawString(hmiData.colorPopupTxt, gfrm.x, gfrm.y - DWINUI::fontHeight() - 4, GET_TEXT_F(MSG_PID_TARGET)); DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, GET_TEXT_F(MSG_PID_FOR_NOZZLE)); _maxtemp = thermalManager.hotend_maxtemp[0]; _target = hmiData.hotendPIDT; break; #endif #if ENABLED(PIDTEMPBED) - case PIDTEMPBED_START: + case PID_BED_STARTED: 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::drawString(hmiData.colorPopupTxt, gfrm.x, gfrm.y - DWINUI::fontHeight() - 4, GET_TEXT_F(MSG_PID_TARGET)); DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, GET_TEXT_F(MSG_PID_FOR_BED)); _maxtemp = BED_MAXTEMP; _target = hmiData.bedPIDT; break; #endif #if ENABLED(PIDTEMPCHAMBER) - case PIDTEMPCHAMBER_START: + case PID_CHAMBER_STARTED: 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::drawString(hmiData.colorPopupTxt, gfrm.x, gfrm.y - DWINUI::fontHeight() - 4, GET_TEXT_F(MSG_PID_TARGET)); DWINUI::drawCenteredString(hmiData.colorPopupTxt, 92, GET_TEXT_F(MSG_PID_FOR_CHAMBER)); _maxtemp = CHAMBER_MAXTEMP; _target = hmiData.chamberPIDT; @@ -1624,7 +1634,7 @@ void dwinLevelingDone() { #if ENABLED(MPCTEMP) case MPC_STARTED: #elif ENABLED(PIDTEMP) - case PIDTEMP_START: + case PID_STARTED: #endif title.showCaption(GET_TEXT_F(MSG_HOTEND_TEMP_GRAPH)); DWINUI::drawCenteredString(3, hmiData.colorPopupTxt, 75, GET_TEXT_F(MSG_TEMP_NOZZLE)); @@ -1632,7 +1642,7 @@ void dwinLevelingDone() { _target = thermalManager.degTargetHotend(0); break; #if ENABLED(PIDTEMPBED) - case PIDTEMPBED_START: + case PID_BED_STARTED: title.showCaption(GET_TEXT_F(MSG_BED_TEMP_GRAPH)); DWINUI::drawCenteredString(3, hmiData.colorPopupTxt, 75, GET_TEXT_F(MSG_TEMP_BED)); _maxtemp = BED_MAX_TARGET; @@ -1640,7 +1650,7 @@ void dwinLevelingDone() { break; #endif #if ENABLED(PIDTEMPCHAMBER) - case PIDTEMPCHAMBER_START: + case PID_CHAMBER_STARTED: 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; @@ -1650,21 +1660,21 @@ void dwinLevelingDone() { default: break; } - dwinDrawString(false, 2, hmiData.colorPopupTxt, hmiData.colorPopupBg, gfrm.x, gfrm.y - DWINUI::fontHeight() - 4, F("Target: Celsius")); + dwinDrawString(false, 2, hmiData.colorPopupTxt, hmiData.colorPopupBg, gfrm.x, gfrm.y - DWINUI::fontHeight() - 4, GET_TEXT_F(MSG_TARGET)); 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); } - void drawHPlot() { - TERN_(PIDTEMP, dwinDrawPlot(PIDTEMP_START)); + void drawHotendPlot() { + TERN_(PIDTEMP, dwinDrawPlot(PID_STARTED)); TERN_(MPCTEMP, dwinDrawPlot(MPC_STARTED)); } - void drawBPlot() { - TERN_(PIDTEMPBED, dwinDrawPlot(PIDTEMPBED_START)); + void drawBedPlot() { + TERN_(PIDTEMPBED, dwinDrawPlot(PID_BED_STARTED)); } - void drawCPlot() { - TERN_(PIDTEMPCHAMBER, dwinDrawPlot(PIDTEMPCHAMBER_START)); + void drawChamberPlot() { + TERN_(PIDTEMPCHAMBER, dwinDrawPlot(PID_CHAMBER_STARTED)); } #endif // PROUI_ITEM_PLOT @@ -1693,7 +1703,7 @@ void dwinLevelingDone() { hmiValue.tempControl = result; switch (result) { #if ENABLED(PIDTEMP) - case PIDTEMP_START: + case PID_STARTED: hmiSaveProcessID(ID_PIDProcess); #if PROUI_TUNING_GRAPH dwinDrawPIDMPCPopup(); @@ -1703,30 +1713,38 @@ void dwinLevelingDone() { break; #endif #if ENABLED(PIDTEMPBED) - case PIDTEMPBED_START: + case PID_BED_STARTED: hmiSaveProcessID(ID_PIDProcess); + #if PROUI_TUNING_GRAPH + dwinDrawPIDMPCPopup(); + #else dwinDrawPopup(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE), GET_TEXT_F(MSG_PID_FOR_BED)); + #endif break; #endif #if ENABLED(PIDTEMPCHAMBER) - case PIDTEMPCHAMBER_START: + case PID_CHAMBER_STARTED: hmiSaveProcessID(ID_PIDProcess); + #if PROUI_TUNING_GRAPH + dwinDrawPIDMPCPopup(); + #else dwinDrawPopup(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE), GET_TEXT_F(MSG_PID_FOR_CHAMBER)); + #endif break; #endif case PID_BAD_HEATER_ID: checkkey = last_checkkey; - dwinPopupConfirm(ICON_TempTooLow, GET_TEXT_F(MSG_PID_AUTOTUNE_FAILED), GET_TEXT_F(MSG_PID_BAD_HEATER_ID)); + dwinPopupContinue(ICON_TempTooLow, GET_TEXT_F(MSG_PID_AUTOTUNE_FAILED), GET_TEXT_F(MSG_PID_BAD_HEATER_ID)); break; case PID_TUNING_TIMEOUT: checkkey = last_checkkey; - dwinPopupConfirm(ICON_TempTooHigh, GET_TEXT_F(MSG_ERROR), GET_TEXT_F(MSG_PID_TIMEOUT)); + dwinPopupContinue(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)); + dwinPopupContinue(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE_FAILED), GET_TEXT_F(MSG_TEMP_TOO_HIGH)); break; - case AUTOTUNE_DONE: + case PID_DONE: checkkey = last_checkkey; dwinPopupConfirm(ICON_TempTooLow, GET_TEXT_F(MSG_PID_AUTOTUNE), GET_TEXT_F(MSG_BUTTON_DONE)); break; @@ -1749,26 +1767,27 @@ void dwinLevelingDone() { #if PROUI_TUNING_GRAPH dwinDrawPIDMPCPopup(); #else - dwinDrawPopup(ICON_TempTooHigh, GET_TEXT_F(MSG_MPC_AUTOTUNE), F("for Nozzle is running.")); + dwinDrawPopup(ICON_TempTooHigh, GET_TEXT_F(MSG_MPC_AUTOTUNE), GET_TEXT_F(MSG_PID_FOR_NOZZLE)); #endif break; case MPC_TEMP_ERROR: checkkey = last_checkkey; - dwinPopupConfirm(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE_FAILED), F(STR_MPC_TEMPERATURE_ERROR)); + dwinPopupContinue(ICON_TempTooHigh, GET_TEXT_F(MSG_PID_AUTOTUNE_FAILED), F(STR_MPC_TEMPERATURE_ERROR)); ui.reset_alert_level(); break; case MPC_INTERRUPTED: checkkey = last_checkkey; - dwinPopupConfirm(ICON_TempTooHigh, GET_TEXT_F(MSG_ERROR), F(STR_MPC_AUTOTUNE_INTERRUPTED)); + dwinPopupContinue(ICON_TempTooHigh, GET_TEXT_F(MSG_ERROR), F(STR_MPC_AUTOTUNE_INTERRUPTED)); ui.reset_alert_level(); break; - case AUTOTUNE_DONE: + case MPC_DONE: checkkey = last_checkkey; dwinPopupConfirm(ICON_TempTooLow, GET_TEXT_F(MSG_MPC_AUTOTUNE), GET_TEXT_F(MSG_BUTTON_DONE)); ui.reset_alert_level(); break; default: checkkey = last_checkkey; + dwinPopupConfirm(ICON_Info_0, GET_TEXT_F(MSG_ERROR), GET_TEXT_F(MSG_STOPPING)); ui.reset_alert_level(); break; } @@ -1828,7 +1847,7 @@ void dwinPrintAborted() { #if HAS_FILAMENT_SENSOR // Filament Runout process - void dwinFilamentRunout(const uint8_t extruder) { LCD_MESSAGE(MSG_RUNOUT_SENSOR); } + void dwinFilamentRunout() { LCD_MESSAGE(MSG_RUNOUT_SENSOR); } #endif void dwinSetColorDefaults() { @@ -1852,13 +1871,14 @@ void dwinSetColorDefaults() { hmiData.colorCoordinate = defColorCoordinate; } -static_assert(ExtUI::eeprom_data_size >= sizeof(hmi_data_t), "Insufficient space in EEPROM for UI parameters"); +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_(PIDTEMPCHAMBER, hmiData.chamberPIDT = DEF_CHAMBERPIDT); TERN_(HAS_PID_HEATING, hmiData.pidCycles = DEF_PIDCYCLES); #if ENABLED(PREVENT_COLD_EXTRUSION) hmiData.extMinT = EXTRUDE_MINTEMP; @@ -1971,18 +1991,6 @@ 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_Pause_1, GET_TEXT_F(MSG_ADVANCED_PAUSE), fmsg, button); - } - - void drawPopupFilamentPurge() { - 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); - } - void onClickFilamentPurge() { if (hmiFlag.select_flag) pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; // "Purge More" button @@ -2002,7 +2010,7 @@ void dwinRedrawScreen() { #if HAS_MESH void dwinMeshViewer() { if (!leveling_is_valid()) - dwinPopupContinue(ICON_Leveling_1, GET_TEXT_F(MSG_MESH_VIEWER), GET_TEXT_F(MSG_NO_VALID_MESH)); + dwinPopupConfirm(ICON_Leveling_1, GET_TEXT_F(MSG_MESH_VIEWER), GET_TEXT_F(MSG_NO_VALID_MESH)); else { hmiSaveProcessID(ID_WaitResponse); meshViewer.draw(); @@ -2490,10 +2498,13 @@ void setFlow() { setPIntOnClick(FLOW_EDIT_MIN, FLOW_EDIT_MAX, []{ planner.refres void trammingwizard() { if (hmiData.fullManualTramming) { - LCD_MESSAGE_F("Disable manual tramming"); + LCD_MESSAGE(MSG_DISABLE_MANUAL_TRAMMING); return; } - bed_mesh_t zval = {0}; + LCD_MESSAGE(MSG_TRAMMING_WIZARD_START); + DWINUI::clearMainArea(); + static bed_mesh_t zval = {}; + probe.stow(); zval[0][0] = tram(0); checkkey = ID_NothingToDo; meshViewer.drawMesh(zval, 2, 2); @@ -2504,8 +2515,8 @@ void setFlow() { setPIntOnClick(FLOW_EDIT_MIN, FLOW_EDIT_MAX, []{ planner.refres zval[0][1] = tram(3); meshViewer.drawMesh(zval, 2, 2); - DWINUI::drawCenteredString(140, F("Calculating average")); - DWINUI::drawCenteredString(160, F("and relative heights")); + DWINUI::drawCenteredString(140, GET_TEXT_F(MSG_CALCULATING_AVERAGE)); + DWINUI::drawCenteredString(160, GET_TEXT_F(MSG_AND_RELATIVE_HEIGHTS)); safe_delay(1000); float avg = 0.0f; for (uint8_t x = 0; x < 2; ++x) for (uint8_t y = 0; y < 2; ++y) avg += zval[x][y]; @@ -2519,8 +2530,8 @@ void setFlow() { setPIntOnClick(FLOW_EDIT_MIN, FLOW_EDIT_MAX, []{ planner.refres #endif if (ABS(meshViewer.max - meshViewer.min) < BED_TRAMMING_PROBE_TOLERANCE) { - DWINUI::drawCenteredString(140, F("Corners leveled")); - DWINUI::drawCenteredString(160, F("Tolerance achieved!")); + DWINUI::drawCenteredString(140, GET_TEXT_F(MSG_CORNERS_LEVELED)); + DWINUI::drawCenteredString(160, GET_TEXT_F(MSG_TOLERANCE_ACHIEVED)); } else { uint8_t p = 0; @@ -2542,9 +2553,9 @@ void setFlow() { setPIntOnClick(FLOW_EDIT_MIN, FLOW_EDIT_MAX, []{ planner.refres case 0b11 : plabel = GET_TEXT_F(MSG_TRAM_BR); break; default : plabel = F(""); break; } - DWINUI::drawCenteredString(120, F("Corners not leveled")); - DWINUI::drawCenteredString(140, F("Knob adjustment required")); - DWINUI::drawCenteredString(COLOR_GREEN, 160, s ? F("Lower") : F("Raise")); + DWINUI::drawCenteredString(120, GET_TEXT_F(MSG_CORNERS_NOT_LEVELED)); + DWINUI::drawCenteredString(140, GET_TEXT_F(MSG_KNOB_ADJUSTMENT_REQUIRED)); + DWINUI::drawCenteredString(COLOR_GREEN, 160, s ? GET_TEXT_F(MSG_LOWER) : GET_TEXT_F(MSG_RAISE)); DWINUI::drawCenteredString(COLOR_GREEN, 180, plabel); } DWINUI::drawButton(BTN_Continue, 86, 305); @@ -3133,8 +3144,11 @@ void drawPrepareMenu() { #endif MENU_ITEM(ICON_Cool, MSG_COOLDOWN, onDrawCooldown, doCoolDown); #if ALL(PROUI_TUNING_GRAPH, PROUI_ITEM_PLOT) - MENU_ITEM(ICON_PIDNozzle, MSG_HOTEND_TEMP_GRAPH, onDrawMenuItem, drawHPlot); - MENU_ITEM(ICON_PIDBed, MSG_BED_TEMP_GRAPH, onDrawMenuItem, drawBPlot); + #if ANY(PIDTEMP, MPCTEMP) + MENU_ITEM(ICON_PIDNozzle, MSG_HOTEND_TEMP_GRAPH, onDrawMenuItem, drawHotendPlot); + #endif + TERN_(PIDTEMPBED, MENU_ITEM(ICON_PIDBed, MSG_BED_TEMP_GRAPH, onDrawMenuItem, drawBedPlot)); + TERN_(PIDTEMPCHAMBER, MENU_ITEM(ICON_PIDChamber, MSG_CHAMBER_TEMP_GRAPH, onDrawMenuItem, drawChamberPlot)); #endif MENU_ITEM(ICON_Language, MSG_UI_LANGUAGE, onDrawLanguage, setLanguage); } @@ -3287,7 +3301,7 @@ void drawMoveMenu() { #endif } updateMenu(moveMenu); - if (!all_axes_trusted()) LCD_MESSAGE_F("WARNING: Current position unknown. Home axes."); + if (!all_axes_trusted()) LCD_MESSAGE(MSG_POSITION_UNKNOWN); } #if HAS_HOME_OFFSET @@ -3464,8 +3478,11 @@ void drawTuneMenu() { 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); - MENU_ITEM(ICON_PIDBed, MSG_BED_TEMP_GRAPH, onDrawMenuItem, drawBPlot); + #if ANY(PIDTEMP, MPCTEMP) + MENU_ITEM(ICON_PIDNozzle, MSG_HOTEND_TEMP_GRAPH, onDrawMenuItem, drawHotendPlot); + #endif + TERN_(PIDTEMPBED, MENU_ITEM(ICON_PIDBed, MSG_BED_TEMP_GRAPH, onDrawMenuItem, drawBedPlot)); + TERN_(PIDTEMPCHAMBER, MENU_ITEM(ICON_PIDChamber, MSG_CHAMBER_TEMP_GRAPH, onDrawMenuItem, drawChamberPlot)); #endif #if ENABLED(CASE_LIGHT_MENU) EDIT_ITEM(ICON_CaseLight, MSG_CASE_LIGHT, onDrawChkbMenu, setCaseLight, &caselight.on); @@ -4055,7 +4072,7 @@ void drawMaxAccelMenu() { 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); + 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 @@ -4088,7 +4105,7 @@ void drawMaxAccelMenu() { EDIT_ITEM(ICON_Zoffset, MSG_BABYSTEP_PROBE_Z, onDrawPFloat2Menu, setZOffset, &BABY_Z_VAR); } updateMenu(zOffsetWizMenu); - if (!axis_is_trusted(Z_AXIS)) LCD_MESSAGE_F("WARNING: Z position unknown, move Z to home"); + if (!axis_is_trusted(Z_AXIS)) LCD_MESSAGE(MSG_POSITION_UNKNOWN_Z); } #endif @@ -4210,10 +4227,20 @@ void drawMaxAccelMenu() { #endif // AUTO_BED_LEVELING_UBL #if HAS_MESH - + #if ENABLED(AUTO_BED_LEVELING_3POINT) + #define TITLE_MSG MSG_3POINT_LEVELING + #elif ENABLED(AUTO_BED_LEVELING_LINEAR) + #define TITLE_MSG MSG_LINEAR_LEVELING + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + #define TITLE_MSG MSG_BILINEAR_LEVELING + #elif ENABLED(AUTO_BED_LEVELING_UBL) + #define TITLE_MSG MSG_UBL_LEVELING + #else + #define TITLE_MSG MSG_MESH_LEVELING + #endif void drawMeshSetMenu() { checkkey = ID_Menu; - if (SET_MENU(meshMenu, MSG_MESH_LEVELING, 14)) { + if (SET_MENU(meshMenu, TITLE_MSG, 14)) { BACK_ITEM(drawAdvancedSettingsMenu); #if ENABLED(PREHEAT_BEFORE_LEVELING) EDIT_ITEM(ICON_Temperature, MSG_UBL_SET_TEMP_BED, onDrawPIntMenu, setBedLevT, &hmiData.bedLevT); @@ -4242,7 +4269,10 @@ void drawMaxAccelMenu() { #if ENABLED(PROUI_MESH_EDIT) void drawEditMeshMenu() { - if (!leveling_is_valid()) { LCD_MESSAGE(MSG_UBL_MESH_INVALID); return; } + if (!leveling_is_valid()) { + LCD_MESSAGE(MSG_UBL_MESH_INVALID); + return dwinPopupConfirm(ICON_Leveling_1, GET_TEXT_F(MSG_NO_VALID_MESH), GET_TEXT_F(MSG_UBL_LOAD_MESH)); + } set_bed_leveling_enabled(false); checkkey = ID_Menu; if (SET_MENU(editMeshMenu, MSG_EDIT_MESH, 4)) { diff --git a/Marlin/src/lcd/e3v2/proui/dwin.h b/Marlin/src/lcd/e3v2/proui/dwin.h index b6534a617b2f..3f5a48cc5a03 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.h +++ b/Marlin/src/lcd/e3v2/proui/dwin.h @@ -74,32 +74,24 @@ enum processID : uint8_t { #if ANY(HAS_PID_HEATING, MPC_AUTOTUNE) - enum TempControl { - AUTOTUNE_DONE, + enum tempcontrol_t : uint8_t { #if HAS_PID_HEATING - #if ENABLED(PIDTEMP) - PIDTEMP_START, - #endif - #if ENABLED(PIDTEMPBED) - PIDTEMPBED_START, - #endif - #if ENABLED(PIDTEMPCHAMBER) - PIDTEMPCHAMBER_START, - #endif + PID_DONE = 0, + PID_STARTED, + PID_BED_STARTED, + PID_CHAMBER_STARTED, PID_BAD_HEATER_ID, PID_TEMP_TOO_HIGH, PID_TUNING_TIMEOUT, #endif #if ENABLED(MPC_AUTOTUNE) + MPC_DONE = 0, MPC_STARTED, MPC_TEMP_ERROR, MPC_INTERRUPTED, #endif - TEMPCONTROL_COUNT }; - typedef bits_t(TEMPCONTROL_COUNT) tempcontrol_t; - #endif #define DWIN_CHINESE 123 @@ -186,8 +178,10 @@ typedef struct { typedef struct { rgb_t color; // Color - #if ANY(HAS_PID_HEATING, MPCTEMP) - tempcontrol_t tempControl = AUTOTUNE_DONE; + #if HAS_PID_HEATING + tempcontrol_t tempControl = PID_DONE; + #elif ENABLED(MPC_AUTOTUNE) + tempcontrol_t tempControl = MPC_DONE; #endif uint8_t select = 0; // Auxiliary selector variable AxisEnum axis = X_AXIS; // Axis Select @@ -285,10 +279,12 @@ void updateVariable(); void dwinInitScreen(); void dwinHandleScreen(); void dwinCheckStatusMessage(); +void dwinDrawStatusMessage(); void dwinHomingStart(); void dwinHomingDone(); #if HAS_MESH - void dwinMeshUpdate(const int8_t cpos, const int8_t tpos, const_float_t zval); + void dwinMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval); + void dwinPointUpdate(const int8_t cpos, const int8_t tpos, const_float_t zval); #endif void dwinLevelingStart(); void dwinLevelingDone(); @@ -298,7 +294,7 @@ void dwinPrintResume(); void dwinPrintFinished(); void dwinPrintAborted(); #if HAS_FILAMENT_SENSOR - void dwinFilamentRunout(const uint8_t extruder); + void dwinFilamentRunout(); #endif void dwinPrintHeader(const char * const cstr=nullptr); void dwinSetColorDefaults(); @@ -308,8 +304,6 @@ void dwinSetDataDefaults(); void dwinRebootScreen(); #if ENABLED(ADVANCED_PAUSE_FEATURE) - void dwinPopupPause(FSTR_P const fmsg, uint8_t button=0); - void drawPopupFilamentPurge(); void gotoFilamentPurge(); #endif @@ -327,8 +321,15 @@ void dwinRebootScreen(); #endif #if ALL(PROUI_TUNING_GRAPH, PROUI_ITEM_PLOT) void dwinDrawPlot(tempcontrol_t result); - void drawHPlot(); - void drawBPlot(); + #if ENABLED(PIDTEMP) + void drawHotendPlot(); + #endif + #if ENABLED(PIDTEMPBED) + void drawBedPlot(); + #endif + #if ENABLED(PIDTEMPCHAMBER) + void drawChamberPlot(); + #endif #endif // Menu drawing functions diff --git a/Marlin/src/lcd/e3v2/proui/dwin_defines.h b/Marlin/src/lcd/e3v2/proui/dwin_defines.h index b72bdf1d2359..77535a6f3aa5 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin_defines.h +++ b/Marlin/src/lcd/e3v2/proui/dwin_defines.h @@ -87,25 +87,22 @@ #ifdef Z_AFTER_HOMING #define DEF_Z_AFTER_HOMING Z_AFTER_HOMING -#else - #define DEF_Z_AFTER_HOMING 0 +#elif ALL(INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) + #define DEF_Z_AFTER_HOMING 10 #endif -#ifdef PREHEAT_1_TEMP_HOTEND - #define DEF_HOTENDPIDT PREHEAT_1_TEMP_HOTEND -#else - #define DEF_HOTENDPIDT 195 +#ifndef PREHEAT_1_TEMP_HOTEND + #define PREHEAT_1_TEMP_HOTEND 195 #endif -#ifdef PREHEAT_1_TEMP_BED - #define DEF_BEDPIDT PREHEAT_1_TEMP_BED -#else - #define DEF_BEDPIDT 60 +#ifndef PREHEAT_1_TEMP_BED + #define PREHEAT_1_TEMP_BED 60 #endif -#ifdef PREHEAT_1_TEMP_CHAMBER - #define DEF_CHAMBERPIDT PREHEAT_1_TEMP_CHAMBER -#else - #define DEF_CHAMBERPIDT 0 +#ifndef PREHEAT_1_TEMP_CHAMBER + #define PREHEAT_1_TEMP_CHAMBER 35 #endif +#define DEF_HOTENDPIDT PREHEAT_1_TEMP_HOTEND +#define DEF_BEDPIDT PREHEAT_1_TEMP_BED +#define DEF_CHAMBERPIDT PREHEAT_1_TEMP_CHAMBER #define DEF_PIDCYCLES 5 /** diff --git a/Marlin/src/lcd/e3v2/proui/dwin_popup.cpp b/Marlin/src/lcd/e3v2/proui/dwin_popup.cpp index d499151e3fa7..a31e3e90c13c 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin_popup.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin_popup.cpp @@ -55,12 +55,6 @@ void drawSelectHighlight(const bool sel, const uint16_t ypos) { dwinDrawRectangle(0, c2, 144, ypos - 2, 247, ypos + 39); } -void dwinPopupContinue(const uint8_t icon, FSTR_P const fmsg1, FSTR_P const fmsg2) { - hmiSaveProcessID(ID_WaitResponse); - dwinDrawPopup(icon, fmsg1, fmsg2, BTN_Continue); // Button Continue - dwinUpdateLCD(); -} - void dwinPopupConfirmCancel(const uint8_t icon, FSTR_P const fmsg2) { dwinDrawPopup(ICON_BLTouch, F("Please confirm"), fmsg2); DWINUI::drawButton(BTN_Confirm, 26, 280); @@ -93,4 +87,18 @@ void hmiPopup() { } } +#if ENABLED(ADVANCED_PAUSE_FEATURE) + void dwinPopupPause(FSTR_P const fmsg, uint8_t button/*=0*/) { + hmiSaveProcessID(button ? ID_WaitResponse : ID_NothingToDo); + dwinShowPopup(ICON_Pause_1, GET_TEXT_F(MSG_ADVANCED_PAUSE), fmsg, button); + } + + void drawPopupFilamentPurge() { + 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); + } +#endif // ADVANCED_PAUSE_FEATURE + #endif // DWIN_LCD_PROUI diff --git a/Marlin/src/lcd/e3v2/proui/dwin_popup.h b/Marlin/src/lcd/e3v2/proui/dwin_popup.h index 9443e88a3672..7d6a5c81b369 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin_popup.h +++ b/Marlin/src/lcd/e3v2/proui/dwin_popup.h @@ -29,7 +29,6 @@ * Date: 2022/02/28 */ -#include "dwinui.h" #include "dwin.h" typedef void (*popupDrawFunc_t)(); @@ -39,10 +38,13 @@ extern popupDrawFunc_t popupDraw; void drawSelectHighlight(const bool sel, const uint16_t ypos); inline void drawSelectHighlight(const bool sel) { drawSelectHighlight(sel, 280); }; -void dwinPopupContinue(const uint8_t icon, FSTR_P const fmsg1, FSTR_P const fmsg2); void dwinPopupConfirmCancel(const uint8_t icon, FSTR_P const fmsg2); void gotoPopup(const popupDrawFunc_t fnDraw, const popupClickFunc_t fnClick=nullptr, const popupChangeFunc_t fnChange=nullptr); void hmiPopup(); +#if ENABLED(ADVANCED_PAUSE_FEATURE) + void dwinPopupPause(FSTR_P const fmsg, uint8_t button=0); + void drawPopupFilamentPurge(); +#endif inline void drawPopupBkgd() { dwinDrawRectangle(1, hmiData.colorPopupBg, 14, 60, 258, 330); @@ -74,6 +76,13 @@ void dwinShowPopup(const uint8_t icon, T amsg1=nullptr, U amsg2=nullptr, uint8_t template void dwinPopupConfirm(const uint8_t icon, T amsg1, U amsg2) { hmiSaveProcessID(ID_WaitResponse); - dwinDrawPopup(icon, amsg1, amsg2, BTN_Confirm); // Button Confirm + dwinDrawPopup(icon, amsg1, amsg2, BTN_Confirm); // Button Confirm + dwinUpdateLCD(); +} + +template +void dwinPopupContinue(const uint8_t icon, T amsg1, U amsg2) { + hmiSaveProcessID(ID_WaitResponse); + dwinDrawPopup(icon, amsg1, amsg2, BTN_Continue); // Button Continue dwinUpdateLCD(); } diff --git a/Marlin/src/lcd/e3v2/proui/proui_extui.cpp b/Marlin/src/lcd/e3v2/proui/proui_extui.cpp index 2adca7cbe6cc..89230098d57b 100644 --- a/Marlin/src/lcd/e3v2/proui/proui_extui.cpp +++ b/Marlin/src/lcd/e3v2/proui/proui_extui.cpp @@ -43,7 +43,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if ENABLED(DWIN_LCD_PROUI) +#if ALL(DWIN_LCD_PROUI, EXTENSIBLE_UI) #include "dwin_popup.h" @@ -58,10 +58,13 @@ #include "../../../feature/powerloss.h" #endif -namespace ExtUI { +#if HAS_MESH + #include "../../../feature/bedlevel/bedlevel.h" + #include "meshviewer.h" +#endif +namespace ExtUI { void onStartup() { dwinInitScreen(); } - void onIdle() {} void onPrinterKilled(FSTR_P const error, FSTR_P const component) {} @@ -80,22 +83,23 @@ namespace ExtUI { } 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); + UNUSED(extruder); + dwinFilamentRunout(); } #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)); + dwinPopupConfirm(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); @@ -104,8 +108,6 @@ namespace ExtUI { 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; @@ -127,6 +129,12 @@ namespace ExtUI { } #endif + void onStatusChanged(const char * const msg) { + UNUSED(msg); + dwinCheckStatusMessage(); + dwinDrawStatusMessage(); + } + void onHomingStart() { dwinHomingStart(); } void onHomingDone() { dwinHomingDone(); } @@ -144,12 +152,12 @@ namespace ExtUI { // Called after loading or resetting stored settings } - void onSettingsStored(const bool success) { + void onSettingsStored(const bool) { // Called after the entire EEPROM has been written, // whether successful or not. } - void onSettingsLoaded(const bool success) { + void onSettingsLoaded(const bool) { // Called after the entire EEPROM has been read, // whether successful or not. } @@ -164,14 +172,15 @@ namespace ExtUI { #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(); + dwinMeshUpdate(xpos, ypos, zval); } - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const probe_state_t state) { // Called to indicate a special condition } + void onMeshUpdate(const xy_int8_t xypos, const_float_t zval) { + // Called to indicate a special condition + meshViewer.drawMeshPoint(xypos.x, xypos.y, zval); + } #endif #if ENABLED(PREVENT_COLD_EXTRUSION) @@ -179,7 +188,7 @@ namespace ExtUI { #endif #if ENABLED(POWER_LOSS_RECOVERY) - void onSetPowerLoss(const bool onoff) { + void onSetPowerLoss(const bool) { // Called when power-loss is enabled/disabled } void onPowerLoss() { @@ -194,40 +203,17 @@ namespace ExtUI { #if HAS_PID_HEATING void onPIDTuning(const pidresult_t rst) { // Called for temperature PID tuning result - switch (rst) { - default: break; - #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; - - } + dwinPIDTuning(tempcontrol_t(rst)); } - 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(MPC_STARTED); break; - case MPC_TEMP_ERROR: dwinMPCTuning(MPC_TEMP_ERROR); break; - case MPC_INTERRUPTED: dwinMPCTuning(MPC_INTERRUPTED); break; - case MPC_DONE: dwinMPCTuning(AUTOTUNE_DONE); break; - } + dwinMPCTuning(tempcontrol_t(rst)); } #endif @@ -237,11 +223,23 @@ namespace ExtUI { 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 onAxisDisabled(const axis_t a) { + AxisEnum axis; + switch (a) { + TERN_(HAS_X_AXIS, case X:) + default: axis = X_AXIS; + OPTCODE(HAS_Y_AXIS, case Y: axis = Y_AXIS) + OPTCODE(HAS_Z_AXIS, case Z: axis = Z_AXIS) + OPTCODE(HAS_I_AXIS, case I: axis = I_AXIS) + OPTCODE(HAS_J_AXIS, case J: axis = J_AXIS) + OPTCODE(HAS_K_AXIS, case K: axis = K_AXIS) + OPTCODE(HAS_U_AXIS, case U: axis = U_AXIS) + OPTCODE(HAS_V_AXIS, case V: axis = V_AXIS) + OPTCODE(HAS_W_AXIS, case W: axis = W_AXIS) + } + set_axis_never_homed(AxisEnum(axis)); // MRISCOC workaround: https://github.com/MarlinFirmware/Marlin/issues/23095 } void onAxisEnabled(const axis_t) {} - } // ExtUI -#endif // DWIN_LCD_PROUI +#endif // DWIN_LCD_PROUI && EXTENSIBLE_UI diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index afabace283c8..520daa85ee8c 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -602,8 +602,6 @@ namespace LanguageNarrow_de { LSTR MSG_LOCKSCREEN = _UxGT("Bildschirm sperren"); // ProUI LSTR MSG_LOCKSCREEN_LOCKED = _UxGT("Drucker ist gesperrt,"); // ProUI LSTR MSG_LOCKSCREEN_UNLOCK = _UxGT("Scrollen zum Entsper."); // ProUI - LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Auf Neustart warten"); // ProUI - LSTR MSG_PLEASE_PREHEAT = _UxGT("Bitte vorheizen"); // ProUI LSTR MSG_INFO_PRINT_COUNT = _UxGT("Drucke"); LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Komplette"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 71a7a6869d48..b3f1f530c507 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -133,7 +133,6 @@ namespace LanguageNarrow_en { LSTR MSG_HOME_OFFSET_Z = _UxGT("Home Offset Z"); // DWIN LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets Applied"); LSTR MSG_ERR_M428_TOO_FAR = _UxGT("MIN/MAX Too Far"); - LSTR MSG_TRAMMING_WIZARD = _UxGT("Tramming Wizard"); LSTR MSG_SELECT_ORIGIN = _UxGT("Select Origin"); LSTR MSG_LAST_VALUE_SP = _UxGT("Last value "); @@ -388,7 +387,7 @@ 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_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."); @@ -404,6 +403,10 @@ namespace LanguageNarrow_en { LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune failed! Temperature too high."); LSTR MSG_PID_TIMEOUT = _UxGT("Autotune failed! Timeout."); + LSTR MSG_HOTEND_TEMP_GRAPH = _UxGT("Hotend Temp Graph"); + LSTR MSG_BED_TEMP_GRAPH = _UxGT("Bed Temp Graph"); + LSTR MSG_CHAMBER_TEMP_GRAPH = _UxGT("Chamber Temp Graph"); + LSTR MSG_MPC_MEASURING_AMBIENT = _UxGT("Testing heat loss"); LSTR MSG_MPC_HEATING_PAST_200 = _UxGT("Heating to >200C"); LSTR MSG_MPC_COOLING_TO_AMBIENT = _UxGT("Cooling to ambient"); @@ -491,8 +494,6 @@ namespace LanguageNarrow_en { LSTR MSG_CONTRAST = _UxGT("LCD Contrast"); LSTR MSG_BRIGHTNESS = _UxGT("LCD Brightness"); LSTR MSG_SCREEN_TIMEOUT = _UxGT("LCD Timeout (m)"); - LSTR MSG_HOTEND_TEMP_GRAPH = _UxGT("Hotend Temp Graph"); - LSTR MSG_BED_TEMP_GRAPH = _UxGT("Bed Temp Graph"); LSTR MSG_BRIGHTNESS_OFF = _UxGT("Backlight Off"); LSTR MSG_STORE_EEPROM = _UxGT("Store Settings"); LSTR MSG_LOAD_EEPROM = _UxGT("Load Settings"); @@ -547,14 +548,18 @@ namespace LanguageNarrow_en { LSTR MSG_CANCEL_PRINT = _UxGT("Cancel Print"); LSTR MSG_OUTAGE_RECOVERY = _UxGT("Power Outage"); LSTR MSG_RESUME_BED_TEMP = _UxGT("Resume Bed Temp"); - LSTR MSG_HOST_START_PRINT = _UxGT("Host Start"); - LSTR MSG_PRINTING_OBJECT = _UxGT("Print Obj"); - LSTR MSG_CANCEL_OBJECT = _UxGT("Cancel Obj"); - LSTR MSG_CANCEL_OBJECT_N = _UxGT("Cancel Obj {"); - LSTR MSG_CONTINUE_PRINT_JOB = _UxGT("Continue Job"); - LSTR MSG_MEDIA_MENU = MEDIA_TYPE_EN _UxGT(" Print"); - LSTR MSG_TURN_OFF = _UxGT("Turn off now"); - LSTR MSG_END_LOOPS = _UxGT("End Loops"); + + #if LCD_WIDTH < 20 || !HAS_DWIN_E3V2 + LSTR MSG_HOST_START_PRINT = _UxGT("Host Start"); + LSTR MSG_PRINTING_OBJECT = _UxGT("Print Obj"); + LSTR MSG_CANCEL_OBJECT = _UxGT("Cancel Obj"); + LSTR MSG_CANCEL_OBJECT_N = _UxGT("Cancel Obj {"); + LSTR MSG_CONTINUE_PRINT_JOB = _UxGT("Continue Job"); + LSTR MSG_MEDIA_MENU = MEDIA_TYPE_EN _UxGT(" Print"); + LSTR MSG_TURN_OFF = _UxGT("Turn off now"); + LSTR MSG_END_LOOPS = _UxGT("End Loops"); + #endif + LSTR MSG_NO_MEDIA = _UxGT("No ") MEDIA_TYPE_EN; LSTR MSG_DWELL = _UxGT("Sleep..."); LSTR MSG_USERWAIT = _UxGT("Click to Resume..."); @@ -736,12 +741,12 @@ namespace LanguageNarrow_en { LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("RESUME OPTIONS:"); LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purge more"); LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Continue"); - LSTR MSG_FILAMENT_CHANGE_PURGE_CONTINUE = _UxGT("Purge or Continue?"); // ProUI + LSTR MSG_FILAMENT_CHANGE_PURGE_CONTINUE = _UxGT("Purge or Continue?"); // ProUI LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Nozzle: "); LSTR MSG_RUNOUT_SENSOR = _UxGT("Runout Sensor"); LSTR MSG_SENSOR = _UxGT("Sensor"); LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("Runout Dist mm"); - LSTR MSG_EXTRUDER_MIN_TEMP = _UxGT("Extruder Min Temp."); // ProUI + LSTR MSG_EXTRUDER_MIN_TEMP = _UxGT("Extruder Min Temp."); // ProUI LSTR MSG_FANCHECK = _UxGT("Fan Tacho Check"); LSTR MSG_KILL_HOMING_FAILED = _UxGT("Homing Failed"); LSTR MSG_LCD_PROBING_FAILED = _UxGT("Probing Failed"); @@ -762,6 +767,26 @@ namespace LanguageNarrow_en { LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Please wait for reboot."); // ProUI LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("No Media"); // ProUI LSTR MSG_PLEASE_PREHEAT = _UxGT("Please Preheat"); // ProUI + LSTR MSG_SCREEN_BACKGROUND = _UxGT("Screen Background"); // ProUI + LSTR MSG_CURSOR = _UxGT("Cursor"); // ProUI + LSTR MSG_TITLE_BACKGROUND = _UxGT("Title Background"); // ProUI + LSTR MSG_TITLE_TEXT = _UxGT("Title Text"); // ProUI + LSTR MSG_TEXT = _UxGT("Text"); // ProUI + LSTR MSG_SELECTED = _UxGT("Selected"); // ProUI + LSTR MSG_SPLIT_LINE = _UxGT("Split Line"); // ProUI + LSTR MSG_HIGHLIGHT = _UxGT("Highlight"); // ProUI + LSTR MSG_STATUS_BACKGROUND = _UxGT("Status Background"); // ProUI + LSTR MSG_STATUS_TEXT = _UxGT("Status Text"); // ProUI + LSTR MSG_POPUP_BACKGROUND = _UxGT("Popup Background"); // ProUI + LSTR MSG_POPUP_TEXT = _UxGT("Popup Text"); // ProUI + LSTR MSG_ALERT_BACKGROUND = _UxGT("Alert Background"); // ProUI + LSTR MSG_ALERT_TEXT = _UxGT("Alert Text"); // ProUI + LSTR MSG_PERCENT_TEXT = _UxGT("Percent Text"); // ProUI + LSTR MSG_BAR_FILL = _UxGT("Bar Fill"); // ProUI + LSTR MSG_INDICATOR_VALUE = _UxGT("Indicator value"); // ProUI + LSTR MSG_COORDINATE_VALUE = _UxGT("Coordinate value"); // ProUI + LSTR MSG_LOWER = _UxGT("Lower"); // ProUI + LSTR MSG_RAISE = _UxGT("Raise"); // ProUI // Prusa MMU 2 LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("CHOOSE FILAMENT"); @@ -1084,7 +1109,27 @@ namespace LanguageNarrow_en { namespace LanguageWide_en { using namespace LanguageNarrow_en; #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2 - LSTR MSG_LIVE_MOVE = _UxGT("Live Movement"); + LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Please wait for reboot."); // ProUI + LSTR MSG_EXIT_TO_MAIN_MENU = _UxGT("Exit to Main Menu"); // ProUI + + LSTR MSG_DISABLE_MANUAL_TRAMMING = _UxGT("Disable manual tramming"); // ProUI + LSTR MSG_TRAMMING_WIZARD = _UxGT("Tramming Wizard"); // ProUI + LSTR MSG_TRAMMING_WIZARD_START = _UxGT("Tramming Wizard Start"); // ProUI + LSTR MSG_CORNERS_LEVELED = _UxGT("Corners leveled"); // ProUI + LSTR MSG_CORNERS_NOT_LEVELED = _UxGT("Corners not leveled"); // ProUI + LSTR MSG_KNOB_ADJUSTMENT_REQUIRED = _UxGT("Knob adjustment required");// ProUI + LSTR MSG_PROBE_FOR_Z_VALUE = _UxGT("Probe for Z Value"); // ProUI + LSTR MSG_ZERO_CURRENT_POINT = _UxGT("Zero Current Point"); // ProUI + LSTR MSG_CALCULATING_AVERAGE = _UxGT("Calculating average"); // ProUI + LSTR MSG_AND_RELATIVE_HEIGHTS = _UxGT("and relative heights"); // ProUI + LSTR MSG_TOLERANCE_ACHIEVED = _UxGT("Tolerance achieved!"); // ProUI + + LSTR MSG_POSITION_UNKNOWN = _UxGT("WARNING: Current position unknown. Home axes."); + LSTR MSG_POSITION_UNKNOWN_Z = _UxGT("WARNING: Z position unknown, move Z to home"); + + LSTR MSG_OUTAGE_RECOVERY2 = _UxGT("It looks like the last"); + LSTR MSG_OUTAGE_RECOVERY3 = _UxGT("file was interrupted."); + LSTR MSG_HOST_START_PRINT = _UxGT("Start Host Print"); LSTR MSG_PRINTING_OBJECT = _UxGT("Printing Object"); LSTR MSG_CANCEL_OBJECT = _UxGT("Cancel Object"); @@ -1093,10 +1138,11 @@ namespace LanguageWide_en { LSTR MSG_MEDIA_MENU = _UxGT("Select from ") MEDIA_TYPE_EN; LSTR MSG_TURN_OFF = _UxGT("Turn off the printer"); LSTR MSG_END_LOOPS = _UxGT("End Repeat Loops"); - LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("No media inserted."); // ProUI - LSTR MSG_PLEASE_PREHEAT = _UxGT("Please preheat the hot end."); // ProUI - LSTR MSG_INFO_PRINT_COUNT_RESET = _UxGT("Reset Print Count"); // ProUI + + LSTR MSG_MEDIA_NOT_INSERTED = MEDIA_TYPE_EN _UxGT(" not inserted."); // ProUI + LSTR MSG_PLEASE_PREHEAT = _UxGT("Please preheat hotend."); // ProUI LSTR MSG_INFO_PRINT_COUNT = _UxGT("Print Count"); + LSTR MSG_INFO_PRINT_COUNT_RESET = _UxGT("Reset Print Count"); // ProUI LSTR MSG_INFO_PRINT_TIME = _UxGT("Print Time"); LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Longest Job Time"); LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Extruded Total"); @@ -1105,6 +1151,11 @@ namespace LanguageWide_en { LSTR MSG_HOMING_FEEDRATE_Y = _UxGT("Y Homing Feedrate"); LSTR MSG_HOMING_FEEDRATE_Z = _UxGT("Z Homing Feedrate"); LSTR MSG_EEPROM_INITIALIZED = _UxGT("Default Settings Restored"); + + LSTR MSG_MPC_TARGET = _UxGT("MPC target: Celsius"); // ProUI + LSTR MSG_PID_TARGET = _UxGT("PID target: Celsius"); // ProUI + LSTR MSG_TARGET = _UxGT("Target: Celsius"); // ProUI + #endif } diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 005f0b45a465..56a6cc72d64d 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -468,6 +468,7 @@ namespace LanguageNarrow_it { LSTR MSG_SCREEN_TIMEOUT = _UxGT("Timeout LCD (m)"); LSTR MSG_HOTEND_TEMP_GRAPH = _UxGT("Grafico temp.ugello"); LSTR MSG_BED_TEMP_GRAPH = _UxGT("Grafico temp.piatto"); + LSTR MSG_CHAMBER_TEMP_GRAPH = _UxGT("Grafico temp.camera"); LSTR MSG_BRIGHTNESS_OFF = _UxGT("Spegni retroillum."); LSTR MSG_STORE_EEPROM = _UxGT("Salva impostazioni"); LSTR MSG_LOAD_EEPROM = _UxGT("Carica impostazioni"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 9d6509d70d02..a2b3a10fdf92 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -776,24 +776,24 @@ namespace LanguageNarrow_ru { LSTR MSG_RESET_STATS = _UxGT("Сбросить статистику печати?"); LSTR MSG_FAN_SPEED_FAULT = _UxGT("Сбой скорости кулера"); - LSTR MSG_COLORS_GET = _UxGT("Получить цвет"); // ProUI - LSTR MSG_COLORS_SELECT = _UxGT("Выбрать цвета"); // ProUI - LSTR MSG_COLORS_APPLIED = _UxGT("Цвета применены"); // ProUI - LSTR MSG_COLORS_RED = _UxGT("Красный"); // ProUI / JyersUI - LSTR MSG_COLORS_GREEN = _UxGT("Зелёный"); // ProUI / JyersUI - LSTR MSG_COLORS_BLUE = _UxGT("Синий"); // ProUI / JyersUI - LSTR MSG_COLORS_WHITE = _UxGT("Белый"); // ProUI - LSTR MSG_UI_LANGUAGE = _UxGT("UI Language"); // ProUI - LSTR MSG_SOUND_ENABLE = _UxGT("Включить звук"); // ProUI - LSTR MSG_LOCKSCREEN = _UxGT("Блокировать экран"); // ProUI - LSTR MSG_LOCKSCREEN_LOCKED = _UxGT("Принтер заблокирован,"); // ProUI - LSTR MSG_LOCKSCREEN_UNLOCK = _UxGT("Крутить для разблокировки."); // ProUI - LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Ждите перезагрузки."); // ProUI - LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Нет носителя."); // ProUI - LSTR MSG_PLEASE_PREHEAT = _UxGT("Нагрейте сопло."); // ProUI - LSTR MSG_INFO_PRINT_COUNT_RESET = _UxGT("Сбросить счетчик"); // ProUI - LSTR MSG_FILAMENT_CHANGE_PURGE_CONTINUE = _UxGT("Прочистить или продолжить?"); // ProUI - LSTR MSG_EXTRUDER_MIN_TEMP = _UxGT("Миню темп. экструдера."); // ProUI + LSTR MSG_COLORS_GET = _UxGT("Получить цвет"); // ProUI + LSTR MSG_COLORS_SELECT = _UxGT("Выбрать цвета"); // ProUI + LSTR MSG_COLORS_APPLIED = _UxGT("Цвета применены"); // ProUI + LSTR MSG_COLORS_RED = _UxGT("Красный"); // ProUI / JyersUI + LSTR MSG_COLORS_GREEN = _UxGT("Зелёный"); // ProUI / JyersUI + LSTR MSG_COLORS_BLUE = _UxGT("Синий"); // ProUI / JyersUI + LSTR MSG_COLORS_WHITE = _UxGT("Белый"); // ProUI + LSTR MSG_UI_LANGUAGE = _UxGT("UI Language"); // ProUI + LSTR MSG_SOUND_ENABLE = _UxGT("Включить звук"); // ProUI + LSTR MSG_LOCKSCREEN = _UxGT("Блокировать экран"); // ProUI + LSTR MSG_LOCKSCREEN_LOCKED = _UxGT("Принтер заблокирован,"); // ProUI + LSTR MSG_LOCKSCREEN_UNLOCK = _UxGT("Крутить для разблокировки."); // ProUI + LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Ждите перезагрузки."); // ProUI + LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Нет носителя."); // ProUI + LSTR MSG_PLEASE_PREHEAT = _UxGT("Нагрейте сопло."); // ProUI + LSTR MSG_INFO_PRINT_COUNT_RESET = _UxGT("Сбросить счетчик"); // ProUI + LSTR MSG_FILAMENT_CHANGE_PURGE_CONTINUE = _UxGT("Прочистить или продолжить?"); // ProUI + LSTR MSG_EXTRUDER_MIN_TEMP = _UxGT("Миню темп. экструдера."); // ProUI LSTR MSG_FANCHECK = _UxGT("Пров.тахометра кулера"); LSTR MSG_MMU2_REMOVE_AND_CLICK = _UxGT("Уберите и кликните..."); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 50729dfbd046..a92fc3270ac3 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -646,8 +646,6 @@ namespace LanguageNarrow_sk { LSTR MSG_LOCKSCREEN_LOCKED = _UxGT("Tlačiareň je uzamknutá,"); // ProUI LSTR MSG_LOCKSCREEN_UNLOCK = _UxGT("potiahnite pre odomknutie."); // ProUI LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Prosím čakajte do reštartu."); // ProUI - LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Žiadna karta"); // ProUI - LSTR MSG_PLEASE_PREHEAT = _UxGT("Prosím zahrejte"); // ProUI LSTR MSG_INFO_PRINT_COUNT = _UxGT("Tlače"); LSTR MSG_INFO_PRINT_TIME = _UxGT("Čas"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index e22a4c75d0f9..dd9b4c30209e 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -670,8 +670,6 @@ namespace LanguageNarrow_tr { LSTR MSG_LOCKSCREEN_LOCKED = _UxGT("Yazıcı Kilitlendi,"); // ProUI LSTR MSG_LOCKSCREEN_UNLOCK = _UxGT("Açmak için kaydırın."); // ProUI LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Y.Başlatma bekleyin."); // ProUI - LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Medya Yok"); // ProUI - LSTR MSG_PLEASE_PREHEAT = _UxGT("Ön Isıtma Lütfen"); // ProUI LSTR MSG_INFO_PRINT_COUNT = _UxGT("Baskı"); LSTR MSG_INFO_PRINT_TIME = _UxGT("Süre"); @@ -896,9 +894,9 @@ namespace LanguageWide_tr { LSTR MSG_MEDIA_MENU = _UxGT("SD Karttan Yazdır"); LSTR MSG_TURN_OFF = _UxGT("Yazıcıyı kapat"); LSTR MSG_END_LOOPS = _UxGT("Tekrr Döngüler Bitir"); - LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Ortam yerleştirilmedi."); // ProUI - LSTR MSG_PLEASE_PREHEAT = _UxGT("Lütfen önce hotend'i ısıtın."); // ProUI - LSTR MSG_INFO_PRINT_COUNT_RESET = _UxGT("Baskı Sayısını Sıfırla"); // ProUI + LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Ortam yerleştirilmedi."); // ProUI + LSTR MSG_PLEASE_PREHEAT = _UxGT("Lütfen önce hotend'i ısıtın."); // ProUI + LSTR MSG_INFO_PRINT_COUNT_RESET = _UxGT("Baskı Sayısını Sıfırla"); // ProUI LSTR MSG_INFO_PRINT_COUNT = _UxGT("Baskı Sayısı"); LSTR MSG_INFO_PRINT_TIME = _UxGT("Toplam Baskı Süresi"); LSTR MSG_INFO_PRINT_LONGEST = _UxGT("En Uzun Baskı Süresi"); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 63a721fe9fcf..6e3c7bc4745c 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -548,8 +548,7 @@ namespace LanguageNarrow_uk { LSTR MSG_LOCKSCREEN = _UxGT("Блокувати екран"); // ProUI //MSG_LOCKSCREEN_LOCKED //MSG_LOCKSCREEN_UNLOCK - LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Перезавантаж..."); // ProUI - LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Немає носія"); // ProUI + LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Носій не вставлений"); // ProUI LSTR MSG_PLEASE_PREHEAT = _UxGT("Нагрійте хотенд"); // ProUI LSTR MSG_INFO_PRINT_COUNT = _UxGT("Друків"); @@ -759,7 +758,6 @@ namespace LanguageWide_uk { LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Контроль витіку ") LCD_STR_THERMOMETER _UxGT(" Вимк"); LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Контроль витіку ") LCD_STR_THERMOMETER _UxGT(" Увімк"); LSTR MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Час простою хотенду"); - LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Носій не вставлений"); LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Перезавантаження..."); LSTR MSG_INFO_PRINT_COUNT = _UxGT("Кількість друків"); LSTR MSG_INFO_PRINT_TIME = _UxGT("Час друку"); diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 3c4f28c93e81..d08deb897114 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -50,7 +50,7 @@ #if ENABLED(DWIN_CREALITY_LCD) #include "e3v2/creality/dwin.h" #elif ENABLED(DWIN_LCD_PROUI) - #include "e3v2/proui/dwin.h" + #include "e3v2/proui/dwin_popup.h" #endif #if ALL(HAS_STATUS_MESSAGE, IS_DWIN_MARLINUI) diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index a66c11a782e9..fcf9c1ec5c67 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -374,11 +374,7 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { #endif TERN_(HOST_PROMPT_SUPPORT, hostui.continue_prompt(ds_fstr)); - #if ENABLED(DWIN_LCD_PROUI) - ExtUI::onUserConfirmRequired(ICON_BLTouch, ds_fstr, FPSTR(CONTINUE_STR)); - #elif ENABLED(EXTENSIBLE_UI) - ExtUI::onUserConfirmRequired(ds_fstr); - #endif + TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired(ds_fstr)); TERN_(HAS_RESUME_CONTINUE, wait_for_user_response()); ui.reset_alert_level(); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 51677fdec6b8..a9b1e3f5f383 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -75,17 +75,16 @@ #include "../feature/z_stepper_align.h" #endif -#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 +#if ALL(DWIN_LCD_PROUI, AUTO_BED_LEVELING_UBL) + #include "../lcd/e3v2/proui/bedlevel_tools.h" +#endif + #if ENABLED(HOST_PROMPT_SUPPORT) #include "../feature/host_actions.h" #endif @@ -1660,9 +1659,9 @@ void MarlinSettings::postprocess() { // #if ENABLED(EXTENSIBLE_UI) { + _FIELD_TEST(extui_data); char extui_data[ExtUI::eeprom_data_size] = { 0 }; ExtUI::onStoreSettings(extui_data); - _FIELD_TEST(extui_data); EEPROM_WRITE(extui_data); } #endif @@ -3151,95 +3150,82 @@ void MarlinSettings::postprocess() { void MarlinSettings::store_mesh(const int8_t slot) { - #if ENABLED(AUTO_BED_LEVELING_UBL) - const int16_t a = calc_num_meshes(); - if (!WITHIN(slot, 0, a - 1)) { - ubl_invalid_slot(a); - DEBUG_ECHOLNPGM("E2END=", persistentStore.capacity() - 1, " meshes_end=", meshes_end, " slot=", slot); - DEBUG_EOL(); - return; - } - - int pos = mesh_slot_offset(slot); - uint16_t crc = 0; - - #if ENABLED(OPTIMIZED_MESH_STORAGE) - int16_t z_mesh_store[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - bedlevel.set_store_from_mesh(bedlevel.z_values, z_mesh_store); - uint8_t * const src = (uint8_t*)&z_mesh_store; - #else - uint8_t * const src = (uint8_t*)&bedlevel.z_values; - #endif - - // Write crc to MAT along with other data, or just tack on to the beginning or end - persistentStore.access_start(); - const bool status = persistentStore.write_data(pos, src, MESH_STORE_SIZE, &crc); - persistentStore.access_finish(); + const int16_t a = calc_num_meshes(); + if (!WITHIN(slot, 0, a - 1)) { + ubl_invalid_slot(a); + DEBUG_ECHOLNPGM("E2END=", persistentStore.capacity() - 1, " meshes_end=", meshes_end, " slot=", slot); + DEBUG_EOL(); + return; + } - if (status) SERIAL_ECHOLNPGM("?Unable to save mesh data."); - else DEBUG_ECHOLNPGM("Mesh saved in slot ", slot); + int pos = mesh_slot_offset(slot); + uint16_t crc = 0; + #if ENABLED(OPTIMIZED_MESH_STORAGE) + int16_t z_mesh_store[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + bedlevel.set_store_from_mesh(bedlevel.z_values, z_mesh_store); + uint8_t * const src = (uint8_t*)&z_mesh_store; #else - - // Other mesh types - + uint8_t * const src = (uint8_t*)&bedlevel.z_values; #endif - } - void MarlinSettings::load_mesh(const int8_t slot, void * const into/*=nullptr*/) { + // Write crc to MAT along with other data, or just tack on to the beginning or end + persistentStore.access_start(); + const bool status = persistentStore.write_data(pos, src, MESH_STORE_SIZE, &crc); + persistentStore.access_finish(); - #if ENABLED(AUTO_BED_LEVELING_UBL) + if (status) SERIAL_ECHOLNPGM("?Unable to save mesh data."); + else DEBUG_ECHOLNPGM("Mesh saved in slot ", slot); - const int16_t a = settings.calc_num_meshes(); + } - if (!WITHIN(slot, 0, a - 1)) { - ubl_invalid_slot(a); - return; - } + void MarlinSettings::load_mesh(const int8_t slot, void * const into/*=nullptr*/) { - int pos = mesh_slot_offset(slot); - uint16_t crc = 0; - #if ENABLED(OPTIMIZED_MESH_STORAGE) - int16_t z_mesh_store[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - uint8_t * const dest = (uint8_t*)&z_mesh_store; - #else - uint8_t * const dest = into ? (uint8_t*)into : (uint8_t*)&bedlevel.z_values; - #endif + const int16_t a = settings.calc_num_meshes(); - persistentStore.access_start(); - uint16_t status = persistentStore.read_data(pos, dest, MESH_STORE_SIZE, &crc); - persistentStore.access_finish(); + if (!WITHIN(slot, 0, a - 1)) { + ubl_invalid_slot(a); + return; + } - #if ENABLED(OPTIMIZED_MESH_STORAGE) - if (into) { - float z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - bedlevel.set_mesh_from_store(z_mesh_store, z_values); - memcpy(into, z_values, sizeof(z_values)); - } - else - bedlevel.set_mesh_from_store(z_mesh_store, bedlevel.z_values); - #endif + int pos = mesh_slot_offset(slot); + uint16_t crc = 0; + #if ENABLED(OPTIMIZED_MESH_STORAGE) + int16_t z_mesh_store[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + uint8_t * const dest = (uint8_t*)&z_mesh_store; + #else + uint8_t * const dest = into ? (uint8_t*)into : (uint8_t*)&bedlevel.z_values; + #endif - #if ENABLED(DWIN_LCD_PROUI) - status = !bedLevelTools.meshValidate(); - if (status) { - bedlevel.invalidate(); - LCD_MESSAGE(MSG_UBL_MESH_INVALID); - } - else - ui.status_printf(0, GET_TEXT_F(MSG_MESH_LOADED), bedlevel.storage_slot); - #endif + persistentStore.access_start(); + uint16_t status = persistentStore.read_data(pos, dest, MESH_STORE_SIZE, &crc); + persistentStore.access_finish(); - if (status) SERIAL_ECHOLNPGM("?Unable to load mesh data."); - else DEBUG_ECHOLNPGM("Mesh loaded from slot ", slot); + #if ENABLED(OPTIMIZED_MESH_STORAGE) + if (into) { + float z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + bedlevel.set_mesh_from_store(z_mesh_store, z_values); + memcpy(into, z_values, sizeof(z_values)); + } + else + bedlevel.set_mesh_from_store(z_mesh_store, bedlevel.z_values); + #endif - EEPROM_FINISH(); + #if ENABLED(DWIN_LCD_PROUI) + status = !bedLevelTools.meshValidate(); + if (status) { + bedlevel.invalidate(); + LCD_MESSAGE(MSG_UBL_MESH_INVALID); + } + else + ui.status_printf(0, GET_TEXT_F(MSG_MESH_LOADED), bedlevel.storage_slot); + #endif - #else + if (status) SERIAL_ECHOLNPGM("?Unable to load mesh data."); + else DEBUG_ECHOLNPGM("Mesh loaded from slot ", slot); - // Other mesh types + EEPROM_FINISH(); - #endif } //void MarlinSettings::delete_mesh() { return; } diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 5083c0a4d28d..e774670ccab8 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -576,6 +576,7 @@ void Stepper::enable_axis(const AxisEnum axis) { */ bool Stepper::disable_axis(const AxisEnum axis) { mark_axis_disabled(axis); + TERN_(EXTENSIBLE_UI, ExtUI::onAxisDisabled(ExtUI::axis_to_axis_t(axis))); // 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. @@ -589,7 +590,6 @@ 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; diff --git a/Marlin/src/pins/stm32f4/pins_CREALITY_CR4NTXXC10.h b/Marlin/src/pins/stm32f4/pins_CREALITY_CR4NTXXC10.h index 683f68089a63..678dba344751 100644 --- a/Marlin/src/pins/stm32f4/pins_CREALITY_CR4NTXXC10.h +++ b/Marlin/src/pins/stm32f4/pins_CREALITY_CR4NTXXC10.h @@ -239,7 +239,7 @@ #define BEEPER_PIN EXP1_01_PIN #endif -#elif ENABLED(DWIN_CREALITY_LCD) +#elif ENABLED(HAS_DWIN_E3V2) // DWIN ENCODER LCD #define BTN_ENC EXP1_05_PIN diff --git a/buildroot/tests/STM32F103RE_creality b/buildroot/tests/STM32F103RE_creality index 0a1b1bc79d87..371b2a173075 100755 --- a/buildroot/tests/STM32F103RE_creality +++ b/buildroot/tests/STM32F103RE_creality @@ -24,15 +24,23 @@ opt_enable DWIN_MARLINUI_LANDSCAPE LCD_ENDSTOP_TEST AUTO_BED_LEVELING_UBL BLTOUC MARLIN_BRICKOUT MARLIN_INVADERS MARLIN_SNAKE GAMES_EASTER_EGG exec_test $1 $2 "Ender-3 V2 - MarlinUI (Games, UBL+BLTOUCH, MPCTEMP, LCD_ENDSTOP_TEST)" "$3" +use_example_configs "Creality/Ender-3 V2/CrealityV422/CrealityUI" +opt_disable DWIN_CREALITY_LCD +opt_enable DWIN_LCD_PROUI PID_EDIT_MENU PID_AUTOTUNE_MENU +opt_add NO_AUTO_ASSIGN_WARNING +opt_set BOOTSCREEN_TIMEOUT 1100 +exec_test $1 $2 "Ender-3 V2 - ProUI (Default)" "$3" + use_example_configs "Creality/Ender-3 S1/STM32F1" opt_disable DWIN_CREALITY_LCD Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN AUTO_BED_LEVELING_BILINEAR CANCEL_OBJECTS FWRETRACT EVENT_GCODE_SD_ABORT opt_enable DWIN_LCD_PROUI INDIVIDUAL_AXIS_HOMING_SUBMENU SET_PROGRESS_MANUALLY SET_PROGRESS_PERCENT STATUS_MESSAGE_SCROLLING \ SOUND_MENU_ITEM PRINTCOUNTER NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE FILAMENT_RUNOUT_SENSOR \ - BLTOUCH Z_SAFE_HOMING AUTO_BED_LEVELING_UBL MESH_EDIT_MENU LCD_BED_TRAMMING \ + BLTOUCH Z_SAFE_HOMING AUTO_BED_LEVELING_UBL MESH_EDIT_MENU LCD_BED_TRAMMING BED_TRAMMING_USE_PROBE BED_TRAMMING_INCLUDE_CENTER \ LIMITED_MAX_FR_EDITING LIMITED_MAX_ACCEL_EDITING LIMITED_JERK_EDITING BAUD_RATE_GCODE \ - CASE_LIGHT_ENABLE CASE_LIGHT_MENU CASE_LIGHT_NO_BRIGHTNESS -opt_set PREHEAT_3_LABEL '"CUSTOM"' PREHEAT_3_TEMP_HOTEND 240 PREHEAT_3_TEMP_BED 60 PREHEAT_3_FAN_SPEED 128 BOOTSCREEN_TIMEOUT 1100 CASE_LIGHT_PIN 4 -exec_test $1 $2 "Ender-3 S1 - ProUI (PIDTEMP)" "$3" + CASE_LIGHT_ENABLE CASE_LIGHT_MENU CASE_LIGHT_NO_BRIGHTNESS BABYSTEP_ZPROBE_OFFSET EMERGENCY_PARSER +opt_set PREHEAT_3_LABEL '"CUSTOM"' PREHEAT_3_TEMP_HOTEND 240 PREHEAT_3_TEMP_BED 60 PREHEAT_3_FAN_SPEED 128 BOOTSCREEN_TIMEOUT 1100 CASE_LIGHT_PIN 4 \ + LCD_BACKLIGHT_TIMEOUT_MINS 10 +exec_test $1 $2 "Ender-3 S1 - ProUI (UBL+PIDTEMP)" "$3" restore_configs opt_set MOTHERBOARD BOARD_CREALITY_V452 SERIAL_PORT 1