Browse Source

Fix issues with no hotend / bed / fan (#18395)

Scott Lahteine 5 years ago
parent
commit
4275466f49
No account linked to committer's email address

+ 1
- 1
Marlin/src/gcode/gcode.cpp View File

@@ -541,7 +541,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
541 541
       case 120: M120(); break;                                    // M120: Enable endstops
542 542
       case 121: M121(); break;                                    // M121: Disable endstops
543 543
 
544
-      #if HAS_HOTEND && HAS_LCD_MENU
544
+      #if PREHEAT_COUNT
545 545
         case 145: M145(); break;                                  // M145: Set material heatup parameters
546 546
       #endif
547 547
 

+ 1
- 1
Marlin/src/gcode/gcode.h View File

@@ -608,7 +608,7 @@ private:
608 608
     static void M191();
609 609
   #endif
610 610
 
611
-  #if HAS_HOTEND && HAS_LCD_MENU
611
+  #if PREHEAT_COUNT
612 612
     static void M145();
613 613
   #endif
614 614
 

+ 14
- 16
Marlin/src/gcode/lcd/M145.cpp View File

@@ -22,7 +22,7 @@
22 22
 
23 23
 #include "../../inc/MarlinConfig.h"
24 24
 
25
-#if HAS_HOTEND && HAS_LCD_MENU
25
+#if PREHEAT_COUNT
26 26
 
27 27
 #include "../gcode.h"
28 28
 #include "../../lcd/ultralcd.h"
@@ -37,25 +37,23 @@
37 37
  */
38 38
 void GcodeSuite::M145() {
39 39
   const uint8_t material = (uint8_t)parser.intval('S');
40
-  if (material >= COUNT(ui.preheat_hotend_temp))
40
+  if (material >= PREHEAT_COUNT)
41 41
     SERIAL_ERROR_MSG(STR_ERR_MATERIAL_INDEX);
42 42
   else {
43
-    int v;
44
-    if (parser.seenval('H')) {
45
-      v = parser.value_int();
46
-      ui.preheat_hotend_temp[material] = constrain(v, EXTRUDE_MINTEMP, (HEATER_0_MAXTEMP) - (HOTEND_OVERSHOOT));
47
-    }
48
-    if (parser.seenval('F')) {
49
-      v = parser.value_int();
50
-      ui.preheat_fan_speed[material] = (uint8_t)constrain(v, 0, 255);
51
-    }
43
+    preset_t &mat = ui.material_preset[material];
44
+    #if HAS_HOTEND
45
+      if (parser.seenval('H'))
46
+        mat.hotend_temp = constrain(parser.value_int(), EXTRUDE_MINTEMP, (HEATER_0_MAXTEMP) - (HOTEND_OVERSHOOT));
47
+    #endif
52 48
     #if TEMP_SENSOR_BED != 0
53
-      if (parser.seenval('B')) {
54
-        v = parser.value_int();
55
-        ui.preheat_bed_temp[material] = constrain(v, BED_MINTEMP, BED_MAX_TARGET);
56
-      }
49
+      if (parser.seenval('B'))
50
+        mat.bed_temp = constrain(parser.value_int(), BED_MINTEMP, BED_MAX_TARGET);
51
+    #endif
52
+    #if HAS_FAN
53
+      if (parser.seenval('F'))
54
+        mat.fan_speed = constrain(parser.value_int(), 0, 255);
57 55
     #endif
58 56
   }
59 57
 }
60 58
 
61
-#endif // HOTENDS && HAS_LCD_MENU
59
+#endif // PREHEAT_COUNT

+ 14
- 0
Marlin/src/inc/Conditionals_post.h View File

@@ -1859,6 +1859,10 @@
1859 1859
   #define HAS_CONTROLLER_FAN 1
1860 1860
 #endif
1861 1861
 
1862
+#if BED_OR_CHAMBER || HAS_FAN0
1863
+  #define BED_OR_CHAMBER_OR_FAN 1
1864
+#endif
1865
+
1862 1866
 // Servos
1863 1867
 #if PIN_EXISTS(SERVO0) && NUM_SERVOS > 0
1864 1868
   #define HAS_SERVO_0 1
@@ -2080,6 +2084,16 @@
2080 2084
   #define WRITE_HEATER_CHAMBER(v) WRITE(HEATER_CHAMBER_PIN, (v) ^ HEATER_CHAMBER_INVERTING)
2081 2085
 #endif
2082 2086
 
2087
+#if HAS_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER
2088
+  #define HAS_TEMPERATURE 1
2089
+#endif
2090
+
2091
+#if HAS_TEMPERATURE && EITHER(HAS_LCD_MENU, DWIN_CREALITY_LCD)
2092
+  #define PREHEAT_COUNT 2
2093
+#else
2094
+  #undef PREHEAT_COUNT
2095
+#endif
2096
+
2083 2097
 /**
2084 2098
  * Up to 3 PWM fans
2085 2099
  */

+ 9
- 5
Marlin/src/inc/SanityCheck.h View File

@@ -1404,12 +1404,16 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
1404 1404
 
1405 1405
 #endif
1406 1406
 
1407
-#if HAS_MESH
1408
-  #if HAS_CLASSIC_JERK
1409
-    static_assert(DEFAULT_ZJERK > 0.1, "Low DEFAULT_ZJERK values are incompatible with mesh-based leveling.");
1407
+#if HAS_MESH && HAS_CLASSIC_JERK
1408
+  static_assert(DEFAULT_ZJERK > 0.1, "Low DEFAULT_ZJERK values are incompatible with mesh-based leveling.");
1409
+#endif
1410
+
1411
+#if ENABLED(G26_MESH_VALIDATION)
1412
+  #if !EXTRUDERS
1413
+    #error "G26_MESH_VALIDATION requires at least one extruder."
1414
+  #elif !HAS_MESH
1415
+    #error "G26_MESH_VALIDATION requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, or AUTO_BED_LEVELING_UBL."
1410 1416
   #endif
1411
-#elif ENABLED(G26_MESH_VALIDATION)
1412
-  #error "G26_MESH_VALIDATION requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, or AUTO_BED_LEVELING_UBL."
1413 1417
 #endif
1414 1418
 
1415 1419
 #if ENABLED(MESH_EDIT_GFX_OVERLAY) && !BOTH(AUTO_BED_LEVELING_UBL, HAS_GRAPHICAL_LCD)

+ 0
- 2
Marlin/src/lcd/dogm/dogm_Statusscreen.h View File

@@ -860,8 +860,6 @@
860 860
   #define STATUS_CHAMBER_WIDTH 0
861 861
 #endif
862 862
 
863
-#define BED_OR_CHAMBER_OR_FAN (BED_OR_CHAMBER || HAS_FAN0)
864
-
865 863
 // Can also be overridden in Configuration_adv.h
866 864
 // If you can afford it, try the 3-frame fan animation!
867 865
 // Don't compile in the fan animation with no fan

+ 390
- 332
Marlin/src/lcd/dwin/dwin.cpp View File

@@ -87,7 +87,7 @@ HMI_Flag    HMI_flag{0};
87 87
 
88 88
 millis_t Encoder_ms = 0;
89 89
 millis_t Wait_ms = 0;
90
-millis_t heat_time = 0;
90
+millis_t dwin_heat_time = 0;
91 91
 
92 92
 int checkkey = 0, last_checkkey = 0;
93 93
 
@@ -743,20 +743,24 @@ inline void Draw_Popup_Bkgd_60() {
743 743
   DWIN_Draw_Rectangle(1, Background_window, 14, 60, 271-13, 330);
744 744
 }
745 745
 
746
-void Popup_Window_ETempTooLow(void) {
747
-  Clear_Main_Window();
748
-  Draw_Popup_Bkgd_60();
749
-  DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 105);
750
-  if (HMI_flag.language_flag) {
751
-    DWIN_Frame_AreaCopy(1, 103, 371, 136, 479-93, 69, 240);
752
-    DWIN_Frame_AreaCopy(1, 170, 371, 271-1, 479-93, 69+33, 240);
753
-    DWIN_ICON_Show(ICON, ICON_Confirm_C, 86, 280);
754
-  }
755
-  else {
756
-    DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 20, 235, (char*)"Nozzle is too cold");
757
-    DWIN_ICON_Show(ICON, ICON_Confirm_E, 86, 280);
746
+#if HAS_HOTEND
747
+
748
+  void Popup_Window_ETempTooLow(void) {
749
+    Clear_Main_Window();
750
+    Draw_Popup_Bkgd_60();
751
+    DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 105);
752
+    if (HMI_flag.language_flag) {
753
+      DWIN_Frame_AreaCopy(1, 103, 371, 136, 479-93, 69, 240);
754
+      DWIN_Frame_AreaCopy(1, 170, 371, 271-1, 479-93, 69+33, 240);
755
+      DWIN_ICON_Show(ICON, ICON_Confirm_C, 86, 280);
756
+    }
757
+    else {
758
+      DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 20, 235, (char*)"Nozzle is too cold");
759
+      DWIN_ICON_Show(ICON, ICON_Confirm_E, 86, 280);
760
+    }
758 761
   }
759
-}
762
+
763
+#endif
760 764
 
761 765
 void Popup_Window_Resume(void) {
762 766
   Clear_Popup_Area();
@@ -1074,134 +1078,146 @@ void HMI_Zoffset(void) {
1074 1078
   }
1075 1079
 }
1076 1080
 
1077
-void HMI_ETemp(void) {
1078
-  ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze();
1079
-  if (encoder_diffState != ENCODER_DIFF_NO) {
1080
-    if (encoder_diffState == ENCODER_DIFF_CW)
1081
-      HMI_ValueStruct.E_Temp += EncoderRate.encoderMoveValue;
1082
-    else if (encoder_diffState == ENCODER_DIFF_CCW)
1083
-      HMI_ValueStruct.E_Temp -= EncoderRate.encoderMoveValue;
1084
-    else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return
1085
-      EncoderRate.encoderRateEnabled = 0;
1086
-      if (HMI_ValueStruct.show_mode == -1) { // temperature
1087
-        checkkey = TemperatureID;
1088
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), HMI_ValueStruct.E_Temp);
1089
-      }
1090
-      else if (HMI_ValueStruct.show_mode == -2) {
1091
-        checkkey = PLAPreheat;
1092
-        HMI_ValueStruct.preheat_hotend_temp[0] = HMI_ValueStruct.E_Temp;
1093
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), HMI_ValueStruct.preheat_hotend_temp[0]);
1094
-        return;
1095
-      }
1096
-      else if (HMI_ValueStruct.show_mode == -3) {
1097
-        checkkey = ABSPreheat;
1098
-        HMI_ValueStruct.preheat_hotend_temp[1] = HMI_ValueStruct.E_Temp;
1099
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), HMI_ValueStruct.preheat_hotend_temp[1]);
1081
+#if HAS_HOTEND
1082
+
1083
+  void HMI_ETemp(void) {
1084
+    ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze();
1085
+    if (encoder_diffState != ENCODER_DIFF_NO) {
1086
+      if (encoder_diffState == ENCODER_DIFF_CW)
1087
+        HMI_ValueStruct.E_Temp += EncoderRate.encoderMoveValue;
1088
+      else if (encoder_diffState == ENCODER_DIFF_CCW)
1089
+        HMI_ValueStruct.E_Temp -= EncoderRate.encoderMoveValue;
1090
+      else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return
1091
+        EncoderRate.encoderRateEnabled = 0;
1092
+        if (HMI_ValueStruct.show_mode == -1) { // temperature
1093
+          checkkey = TemperatureID;
1094
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), HMI_ValueStruct.E_Temp);
1095
+        }
1096
+        else if (HMI_ValueStruct.show_mode == -2) {
1097
+          checkkey = PLAPreheat;
1098
+          ui.material_preset[0].hotend_temp = HMI_ValueStruct.E_Temp;
1099
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), ui.material_preset[0].hotend_temp);
1100
+          return;
1101
+        }
1102
+        else if (HMI_ValueStruct.show_mode == -3) {
1103
+          checkkey = ABSPreheat;
1104
+          ui.material_preset[1].hotend_temp = HMI_ValueStruct.E_Temp;
1105
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), ui.material_preset[1].hotend_temp);
1106
+          return;
1107
+        }
1108
+        else { // tune
1109
+          checkkey = Tune;
1110
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2+MROWS-index_tune), HMI_ValueStruct.E_Temp);
1111
+        }
1112
+        thermalManager.setTargetHotend(HMI_ValueStruct.E_Temp, 0);
1100 1113
         return;
1101 1114
       }
1102
-      else { // tune
1103
-        checkkey = Tune;
1104
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2+MROWS-index_tune), HMI_ValueStruct.E_Temp);
1105
-      }
1106
-      thermalManager.setTargetHotend(HMI_ValueStruct.E_Temp, 0);
1107
-      return;
1115
+      // E_Temp limit
1116
+      NOMORE(HMI_ValueStruct.E_Temp, max_E_Temp);
1117
+      NOLESS(HMI_ValueStruct.E_Temp, min_E_Temp);
1118
+      // E_Temp value
1119
+      if (HMI_ValueStruct.show_mode >= 0)  // tune
1120
+        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2+MROWS-index_tune), HMI_ValueStruct.E_Temp);
1121
+      else  // other page
1122
+        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), HMI_ValueStruct.E_Temp);
1108 1123
     }
1109
-    // E_Temp limit
1110
-    NOMORE(HMI_ValueStruct.E_Temp, max_E_Temp);
1111
-    NOLESS(HMI_ValueStruct.E_Temp, min_E_Temp);
1112
-    // E_Temp value
1113
-    if (HMI_ValueStruct.show_mode >= 0)  // tune
1114
-      DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2+MROWS-index_tune), HMI_ValueStruct.E_Temp);
1115
-    else  // other page
1116
-      DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), HMI_ValueStruct.E_Temp);
1117 1124
   }
1118
-}
1119 1125
 
1120
-void HMI_BedTemp(void) {
1121
-  ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze();
1122
-  if (encoder_diffState != ENCODER_DIFF_NO) {
1123
-    if (encoder_diffState == ENCODER_DIFF_CW)
1124
-      HMI_ValueStruct.Bed_Temp += EncoderRate.encoderMoveValue;
1125
-    else if (encoder_diffState == ENCODER_DIFF_CCW)
1126
-      HMI_ValueStruct.Bed_Temp -= EncoderRate.encoderMoveValue;
1127
-    else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return
1128
-      EncoderRate.encoderRateEnabled = 0;
1129
-      if (HMI_ValueStruct.show_mode == -1) {
1130
-        checkkey = TemperatureID;
1131
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), HMI_ValueStruct.Bed_Temp);
1132
-      }
1133
-      else if (HMI_ValueStruct.show_mode == -2) {
1134
-        checkkey = PLAPreheat;
1135
-        HMI_ValueStruct.preheat_bed_temp[0] = HMI_ValueStruct.Bed_Temp;
1136
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), HMI_ValueStruct.preheat_bed_temp[0]);
1137
-        return;
1138
-      }
1139
-      else if (HMI_ValueStruct.show_mode == -3) {
1140
-        checkkey = ABSPreheat;
1141
-        HMI_ValueStruct.preheat_bed_temp[1] = HMI_ValueStruct.Bed_Temp;
1142
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), HMI_ValueStruct.preheat_bed_temp[1]);
1126
+#endif
1127
+
1128
+#if HAS_HEATED_BED
1129
+
1130
+  void HMI_BedTemp(void) {
1131
+    ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze();
1132
+    if (encoder_diffState != ENCODER_DIFF_NO) {
1133
+      if (encoder_diffState == ENCODER_DIFF_CW)
1134
+        HMI_ValueStruct.Bed_Temp += EncoderRate.encoderMoveValue;
1135
+      else if (encoder_diffState == ENCODER_DIFF_CCW)
1136
+        HMI_ValueStruct.Bed_Temp -= EncoderRate.encoderMoveValue;
1137
+      else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return
1138
+        EncoderRate.encoderRateEnabled = 0;
1139
+        if (HMI_ValueStruct.show_mode == -1) {
1140
+          checkkey = TemperatureID;
1141
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), HMI_ValueStruct.Bed_Temp);
1142
+        }
1143
+        else if (HMI_ValueStruct.show_mode == -2) {
1144
+          checkkey = PLAPreheat;
1145
+          ui.material_preset[0].bed_temp = HMI_ValueStruct.Bed_Temp;
1146
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), ui.material_preset[0].bed_temp);
1147
+          return;
1148
+        }
1149
+        else if (HMI_ValueStruct.show_mode == -3) {
1150
+          checkkey = ABSPreheat;
1151
+          ui.material_preset[1].bed_temp = HMI_ValueStruct.Bed_Temp;
1152
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), ui.material_preset[1].bed_temp);
1153
+          return;
1154
+        }
1155
+        else {
1156
+          checkkey = Tune;
1157
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3+MROWS-index_tune), HMI_ValueStruct.Bed_Temp);
1158
+        }
1159
+        thermalManager.setTargetBed(HMI_ValueStruct.Bed_Temp);
1143 1160
         return;
1144 1161
       }
1145
-      else {
1146
-        checkkey = Tune;
1147
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3+MROWS-index_tune), HMI_ValueStruct.Bed_Temp);
1148
-      }
1149
-      thermalManager.setTargetBed(HMI_ValueStruct.Bed_Temp);
1150
-      return;
1162
+      //Bed_Temp limit
1163
+      NOMORE(HMI_ValueStruct.Bed_Temp, max_Bed_Temp);
1164
+      NOLESS(HMI_ValueStruct.Bed_Temp, min_Bed_Temp);
1165
+      //Bed_Temp value
1166
+      if (HMI_ValueStruct.show_mode >= 0) // tune page
1167
+        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3+MROWS-index_tune), HMI_ValueStruct.Bed_Temp);
1168
+      else // other page
1169
+        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), HMI_ValueStruct.Bed_Temp);
1151 1170
     }
1152
-    //Bed_Temp limit
1153
-    NOMORE(HMI_ValueStruct.Bed_Temp, max_Bed_Temp);
1154
-    NOLESS(HMI_ValueStruct.Bed_Temp, min_Bed_Temp);
1155
-    //Bed_Temp value
1156
-    if (HMI_ValueStruct.show_mode >= 0) // tune page
1157
-      DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3+MROWS-index_tune), HMI_ValueStruct.Bed_Temp);
1158
-    else // other page
1159
-      DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), HMI_ValueStruct.Bed_Temp);
1160 1171
   }
1161
-}
1162 1172
 
1163
-void HMI_FanSpeed(void) {
1164
-  ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze();
1165
-  if (encoder_diffState != ENCODER_DIFF_NO) {
1166
-    if (encoder_diffState == ENCODER_DIFF_CW)
1167
-      HMI_ValueStruct.Fan_speed += EncoderRate.encoderMoveValue;
1168
-    else if (encoder_diffState == ENCODER_DIFF_CCW)
1169
-      HMI_ValueStruct.Fan_speed -= EncoderRate.encoderMoveValue;
1170
-    else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return
1171
-      EncoderRate.encoderRateEnabled = 0;
1172
-      if (HMI_ValueStruct.show_mode == -1) {
1173
-        checkkey = TemperatureID;
1174
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), HMI_ValueStruct.Fan_speed);
1175
-      }
1176
-      else if (HMI_ValueStruct.show_mode == -2) {
1177
-        checkkey = PLAPreheat;
1178
-        HMI_ValueStruct.preheat_fan_speed[0] = HMI_ValueStruct.Fan_speed;
1179
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), HMI_ValueStruct.preheat_fan_speed[0]);
1180
-        return;
1181
-      }
1182
-      else if (HMI_ValueStruct.show_mode == -3) {
1183
-        checkkey = ABSPreheat;
1184
-        HMI_ValueStruct.preheat_fan_speed[1] = HMI_ValueStruct.Fan_speed;
1185
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), HMI_ValueStruct.preheat_fan_speed[1]);
1173
+#endif
1174
+
1175
+#if HAS_FAN
1176
+
1177
+  void HMI_FanSpeed(void) {
1178
+    ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze();
1179
+    if (encoder_diffState != ENCODER_DIFF_NO) {
1180
+      if (encoder_diffState == ENCODER_DIFF_CW)
1181
+        HMI_ValueStruct.Fan_speed += EncoderRate.encoderMoveValue;
1182
+      else if (encoder_diffState == ENCODER_DIFF_CCW)
1183
+        HMI_ValueStruct.Fan_speed -= EncoderRate.encoderMoveValue;
1184
+      else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return
1185
+        EncoderRate.encoderRateEnabled = 0;
1186
+        if (HMI_ValueStruct.show_mode == -1) {
1187
+          checkkey = TemperatureID;
1188
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), HMI_ValueStruct.Fan_speed);
1189
+        }
1190
+        else if (HMI_ValueStruct.show_mode == -2) {
1191
+          checkkey = PLAPreheat;
1192
+          ui.material_preset[0].fan_speed = HMI_ValueStruct.Fan_speed;
1193
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), ui.material_preset[0].fan_speed);
1194
+          return;
1195
+        }
1196
+        else if (HMI_ValueStruct.show_mode == -3) {
1197
+          checkkey = ABSPreheat;
1198
+          ui.material_preset[1].fan_speed = HMI_ValueStruct.Fan_speed;
1199
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), ui.material_preset[1].fan_speed);
1200
+          return;
1201
+        }
1202
+        else {
1203
+          checkkey = Tune;
1204
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(4+MROWS-index_tune), HMI_ValueStruct.Fan_speed);
1205
+        }
1206
+        thermalManager.set_fan_speed(0, HMI_ValueStruct.Fan_speed);
1186 1207
         return;
1187 1208
       }
1188
-      else {
1189
-        checkkey = Tune;
1190
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(4+MROWS-index_tune), HMI_ValueStruct.Fan_speed);
1191
-      }
1192
-      thermalManager.set_fan_speed(0, HMI_ValueStruct.Fan_speed);
1193
-      return;
1209
+      //Fan_speed limit
1210
+      NOMORE(HMI_ValueStruct.Fan_speed, FanOn);
1211
+      NOLESS(HMI_ValueStruct.Fan_speed, FanOff);
1212
+      // Fan_speed value
1213
+      if (HMI_ValueStruct.show_mode >= 0) // tune page
1214
+        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(4+MROWS-index_tune), HMI_ValueStruct.Fan_speed);
1215
+      else // other page
1216
+        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), HMI_ValueStruct.Fan_speed);
1194 1217
     }
1195
-    //Fan_speed limit
1196
-    NOMORE(HMI_ValueStruct.Fan_speed, FanOn);
1197
-    NOLESS(HMI_ValueStruct.Fan_speed, FanOff);
1198
-    // Fan_speed value
1199
-    if (HMI_ValueStruct.show_mode >= 0) // tune page
1200
-      DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(4+MROWS-index_tune), HMI_ValueStruct.Fan_speed);
1201
-    else // other page
1202
-      DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), HMI_ValueStruct.Fan_speed);
1203 1218
   }
1204
-}
1219
+
1220
+#endif
1205 1221
 
1206 1222
 void HMI_PrintSpeed(void) {
1207 1223
   ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze();
@@ -1238,7 +1254,9 @@ void HMI_MaxFeedspeedXYZE(void) {
1238 1254
            if (HMI_flag.feedspeed_flag == X_AXIS) planner.set_max_feedrate(X_AXIS, HMI_ValueStruct.Max_Feedspeed);
1239 1255
       else if (HMI_flag.feedspeed_flag == Y_AXIS) planner.set_max_feedrate(Y_AXIS, HMI_ValueStruct.Max_Feedspeed);
1240 1256
       else if (HMI_flag.feedspeed_flag == Z_AXIS) planner.set_max_feedrate(Z_AXIS, HMI_ValueStruct.Max_Feedspeed);
1241
-      else if (HMI_flag.feedspeed_flag == E_AXIS) planner.set_max_feedrate(E_AXIS, HMI_ValueStruct.Max_Feedspeed);
1257
+      #if HAS_HOTEND
1258
+        else if (HMI_flag.feedspeed_flag == E_AXIS) planner.set_max_feedrate(E_AXIS, HMI_ValueStruct.Max_Feedspeed);
1259
+      #endif
1242 1260
       DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed);
1243 1261
       return;
1244 1262
     }
@@ -1246,7 +1264,9 @@ void HMI_MaxFeedspeedXYZE(void) {
1246 1264
          if (HMI_flag.feedspeed_flag == X_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[X_AXIS]*2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[X_AXIS]*2;}
1247 1265
     else if (HMI_flag.feedspeed_flag == Y_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[Y_AXIS]*2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[Y_AXIS]*2;}
1248 1266
     else if (HMI_flag.feedspeed_flag == Z_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[Z_AXIS]*2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[Z_AXIS]*2;}
1249
-    else if (HMI_flag.feedspeed_flag == E_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[E_AXIS]*2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[E_AXIS]*2;}
1267
+    #if HAS_HOTEND
1268
+      else if (HMI_flag.feedspeed_flag == E_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[E_AXIS]*2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[E_AXIS]*2;}
1269
+    #endif
1250 1270
     if (HMI_ValueStruct.Max_Feedspeed < min_MaxFeedspeed) HMI_ValueStruct.Max_Feedspeed = min_MaxFeedspeed;
1251 1271
     //MaxFeedspeed value
1252 1272
     DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed);
@@ -1264,7 +1284,9 @@ void HMI_MaxAccelerationXYZE(void) {
1264 1284
            if (HMI_flag.acc_flag == X_AXIS) planner.set_max_acceleration(X_AXIS, HMI_ValueStruct.Max_Acceleration);
1265 1285
       else if (HMI_flag.acc_flag == Y_AXIS) planner.set_max_acceleration(Y_AXIS, HMI_ValueStruct.Max_Acceleration);
1266 1286
       else if (HMI_flag.acc_flag == Z_AXIS) planner.set_max_acceleration(Z_AXIS, HMI_ValueStruct.Max_Acceleration);
1267
-      else if (HMI_flag.acc_flag == E_AXIS) planner.set_max_acceleration(E_AXIS, HMI_ValueStruct.Max_Acceleration);
1287
+      #if HAS_HOTEND
1288
+        else if (HMI_flag.acc_flag == E_AXIS) planner.set_max_acceleration(E_AXIS, HMI_ValueStruct.Max_Acceleration);
1289
+      #endif
1268 1290
       DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration);
1269 1291
       return;
1270 1292
     }
@@ -1272,7 +1294,9 @@ void HMI_MaxAccelerationXYZE(void) {
1272 1294
          if (HMI_flag.acc_flag == X_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[X_AXIS]*2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[X_AXIS]*2;}
1273 1295
     else if (HMI_flag.acc_flag == Y_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[Y_AXIS]*2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[Y_AXIS]*2;}
1274 1296
     else if (HMI_flag.acc_flag == Z_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[Z_AXIS]*2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[Z_AXIS]*2;}
1275
-    else if (HMI_flag.acc_flag == E_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[E_AXIS]*2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[E_AXIS]*2;}
1297
+    #if HAS_HOTEND
1298
+      else if (HMI_flag.acc_flag == E_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[E_AXIS]*2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[E_AXIS]*2;}
1299
+    #endif
1276 1300
     if (HMI_ValueStruct.Max_Acceleration < min_MaxAcceleration) HMI_ValueStruct.Max_Acceleration = min_MaxAcceleration;
1277 1301
     // MaxAcceleration value
1278 1302
     DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration);
@@ -2105,14 +2129,14 @@ void HMI_Prepare(void) {
2105 2129
         #endif
2106 2130
         break;
2107 2131
       case 5: // PLA preheat
2108
-        thermalManager.setTargetHotend(HMI_ValueStruct.preheat_hotend_temp[0], 0);
2109
-        thermalManager.setTargetBed(HMI_ValueStruct.preheat_bed_temp[0]);
2110
-        thermalManager.set_fan_speed(0, HMI_ValueStruct.preheat_fan_speed[0]);
2132
+        thermalManager.setTargetHotend(ui.material_preset[0].hotend_temp, 0);
2133
+        thermalManager.setTargetBed(ui.material_preset[0].bed_temp);
2134
+        thermalManager.set_fan_speed(0, ui.material_preset[0].fan_speed);
2111 2135
         break;
2112 2136
       case 6: // ABS preheat
2113
-        thermalManager.setTargetHotend(HMI_ValueStruct.preheat_hotend_temp[1], 0);
2114
-        thermalManager.setTargetBed(HMI_ValueStruct.preheat_bed_temp[1]);
2115
-        thermalManager.set_fan_speed(0, HMI_ValueStruct.preheat_fan_speed[1]);
2137
+        thermalManager.setTargetHotend(ui.material_preset[1].hotend_temp, 0);
2138
+        thermalManager.setTargetBed(ui.material_preset[1].bed_temp);
2139
+        thermalManager.set_fan_speed(0, ui.material_preset[1].fan_speed);
2116 2140
         break;
2117 2141
       case 7: // cool
2118 2142
         thermalManager.zero_fan_speeds();
@@ -2287,20 +2311,23 @@ void HMI_AxisMove(void) {
2287 2311
   ENCODER_DiffState encoder_diffState = get_encoder_state();
2288 2312
   if (encoder_diffState == ENCODER_DIFF_NO) return;
2289 2313
 
2290
-  // popup window resume
2291
-  if (HMI_flag.ETempTooLow_flag) {
2292
-    if (encoder_diffState == ENCODER_DIFF_ENTER) {
2293
-      HMI_flag.ETempTooLow_flag = 0;
2294
-      Draw_Move_Menu();
2295
-      current_position.e = HMI_ValueStruct.Move_E_scale = 0;
2296
-      DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale);
2297
-      DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale);
2298
-      DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale);
2299
-      show_plus_or_minus(font8x16, Background_black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale);
2300
-      DWIN_UpdateLCD();
2314
+  #if HAS_HOTEND
2315
+    // popup window resume
2316
+    if (HMI_flag.ETempTooLow_flag) {
2317
+      if (encoder_diffState == ENCODER_DIFF_ENTER) {
2318
+        HMI_flag.ETempTooLow_flag = 0;
2319
+        Draw_Move_Menu();
2320
+        current_position.e = HMI_ValueStruct.Move_E_scale = 0;
2321
+        DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale);
2322
+        DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale);
2323
+        DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale);
2324
+        show_plus_or_minus(font8x16, Background_black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale);
2325
+        DWIN_UpdateLCD();
2326
+      }
2327
+      return;
2301 2328
     }
2302
-    return;
2303
-  }
2329
+  #endif
2330
+
2304 2331
   // Avoid flicker by updating only the previous menu
2305 2332
   if (encoder_diffState == ENCODER_DIFF_CW) {
2306 2333
     if (select_axis.inc(4)) Move_Highlight(1, select_axis.now);
@@ -2334,28 +2361,30 @@ void HMI_AxisMove(void) {
2334 2361
         DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale);
2335 2362
         EncoderRate.encoderRateEnabled = 1;
2336 2363
         break;
2337
-      case 4: // Extruder
2338
-        // window tips
2339
-        #ifdef PREVENT_COLD_EXTRUSION
2340
-          if (thermalManager.temp_hotend[0].celsius < EXTRUDE_MINTEMP) {
2341
-            HMI_flag.ETempTooLow_flag = 1;
2342
-            Popup_Window_ETempTooLow();
2343
-            DWIN_UpdateLCD();
2344
-            return;
2345
-          }
2346
-        #endif
2347
-        checkkey = Extruder;
2348
-        HMI_ValueStruct.Move_E_scale = current_position.e*MinUnitMult;
2349
-        show_plus_or_minus(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale);
2350
-        EncoderRate.encoderRateEnabled = 1;
2351
-        break;
2352
-      default:
2353
-        break;
2364
+      #if HAS_HOTEND
2365
+        case 4: // Extruder
2366
+          // window tips
2367
+          #ifdef PREVENT_COLD_EXTRUSION
2368
+            if (thermalManager.temp_hotend[0].celsius < EXTRUDE_MINTEMP) {
2369
+              HMI_flag.ETempTooLow_flag = 1;
2370
+              Popup_Window_ETempTooLow();
2371
+              DWIN_UpdateLCD();
2372
+              return;
2373
+            }
2374
+          #endif
2375
+          checkkey = Extruder;
2376
+          HMI_ValueStruct.Move_E_scale = current_position.e*MinUnitMult;
2377
+          show_plus_or_minus(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale);
2378
+          EncoderRate.encoderRateEnabled = 1;
2379
+          break;
2380
+      #endif
2354 2381
     }
2355 2382
   }
2356 2383
   DWIN_UpdateLCD();
2357 2384
 }
2358 2385
 
2386
+enum
2387
+
2359 2388
 /* TemperatureID */
2360 2389
 void HMI_Temperature(void) {
2361 2390
   ENCODER_DiffState encoder_diffState = get_encoder_state();
@@ -2376,126 +2405,132 @@ void HMI_Temperature(void) {
2376 2405
         index_control = MROWS;
2377 2406
         Draw_Control_Menu();
2378 2407
         break;
2379
-      case 1: // nozzle temperature
2380
-        checkkey = ETemp;
2381
-        HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target;
2382
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target);
2383
-        EncoderRate.encoderRateEnabled = 1;
2384
-        break;
2385
-      case 2: // bed temperature
2386
-        checkkey = BedTemp;
2387
-        HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target;
2388
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), thermalManager.temp_bed.target);
2389
-        EncoderRate.encoderRateEnabled = 1;
2390
-        break;
2391
-      case 3: // fan speed
2392
-        checkkey = FanSpeed;
2393
-        HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0];
2394
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), thermalManager.fan_speed[0]);
2395
-        EncoderRate.encoderRateEnabled = 1;
2396
-        break;
2397
-      case 4: // PLA preheat setting
2408
+      #if HAS_HOTEND
2409
+        case 1: // nozzle temperature
2410
+          checkkey = ETemp;
2411
+          HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target;
2412
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target);
2413
+          EncoderRate.encoderRateEnabled = 1;
2414
+          break;
2415
+      #endif
2416
+      #if HAS_HEATED_BED
2417
+        case 2: // bed temperature
2418
+          checkkey = BedTemp;
2419
+          HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target;
2420
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), thermalManager.temp_bed.target);
2421
+          EncoderRate.encoderRateEnabled = 1;
2422
+          break;
2423
+      #endif
2424
+      #if HAS_FAN
2425
+        case 3: // fan speed
2426
+          checkkey = FanSpeed;
2427
+          HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0];
2428
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), thermalManager.fan_speed[0]);
2429
+          EncoderRate.encoderRateEnabled = 1;
2430
+          break;
2431
+      #endif
2432
+      #if HAS_HOTEND
2433
+        case 4: // PLA preheat setting
2398 2434
 
2399
-        checkkey = PLAPreheat;
2400
-        select_PLA.reset();
2401
-        HMI_ValueStruct.show_mode = -2;
2435
+          checkkey = PLAPreheat;
2436
+          select_PLA.reset();
2437
+          HMI_ValueStruct.show_mode = -2;
2402 2438
 
2403
-        Clear_Main_Window();
2439
+          Clear_Main_Window();
2404 2440
 
2405
-        if (HMI_flag.language_flag) {
2406
-          DWIN_Frame_AreaCopy(1, 59, 16, 271-132, 479-450, 14, 8);
2407
-
2408
-          DWIN_Frame_AreaCopy(1, 100, 89, 124, 479-378, LBLX, MBASE(1));
2409
-          DWIN_Frame_AreaCopy(1, 1, 134, 271-215, 479-333, LBLX+24, MBASE(1));   // PLA nozzle temp
2410
-          DWIN_Frame_AreaCopy(1, 100, 89, 124, 479-378, LBLX, MBASE(2));
2411
-          DWIN_Frame_AreaCopy(1, 58, 134, 271-158, 479-333, LBLX+24, MBASE(2));  // PLA bed temp
2412
-          DWIN_Frame_AreaCopy(1, 100, 89, 124, 479-378, LBLX, MBASE(3));
2413
-          DWIN_Frame_AreaCopy(1, 115, 134, 271-101, 479-333, LBLX+24, MBASE(3)); // PLA fan speed
2414
-          DWIN_Frame_AreaCopy(1, 72, 148, 271-120, 479-317, LBLX, MBASE(4));     // save PLA configuration
2415
-        }
2416
-        else {
2417
-          #ifdef USE_STRING_HEADINGS
2418
-            Draw_Title("PLA Settings"); // TODO: GET_TEXT_F
2419
-          #else
2420
-            DWIN_Frame_AreaCopy(1, 56, 16, 271-130, 479-450-1, 14, 8);
2421
-          #endif
2441
+          if (HMI_flag.language_flag) {
2442
+            DWIN_Frame_AreaCopy(1, 59, 16, 271-132, 479-450, 14, 8);
2422 2443
 
2423
-          DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX, MBASE(1));
2424
-          DWIN_Frame_AreaCopy(1, 197, 104, 271-33, 479-365, LBLX+24+3, MBASE(1));
2425
-          DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+41+6, MBASE(1)); // PLA nozzle temp
2426
-          DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX, MBASE(2)+3);
2427
-          DWIN_Frame_AreaCopy(1, 240, 104, 271-7, 479-365, LBLX+24+3, MBASE(2)+3);
2428
-          DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+24+6, MBASE(2)+3); // PLA bed temp
2429
-          DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX, MBASE(3));
2430
-          DWIN_Frame_AreaCopy(1, 0, 119, 271-207, 479-347, LBLX+24+3, MBASE(3));   // PLA fan speed
2431
-          DWIN_Frame_AreaCopy(1, 97, 165, 271-42, 479-301-1, LBLX, MBASE(4));      // save PLA configuration
2432
-        }
2444
+            DWIN_Frame_AreaCopy(1, 100, 89, 124, 479-378, LBLX, MBASE(1));
2445
+            DWIN_Frame_AreaCopy(1, 1, 134, 271-215, 479-333, LBLX+24, MBASE(1));   // PLA nozzle temp
2446
+            DWIN_Frame_AreaCopy(1, 100, 89, 124, 479-378, LBLX, MBASE(2));
2447
+            DWIN_Frame_AreaCopy(1, 58, 134, 271-158, 479-333, LBLX+24, MBASE(2));  // PLA bed temp
2448
+            DWIN_Frame_AreaCopy(1, 100, 89, 124, 479-378, LBLX, MBASE(3));
2449
+            DWIN_Frame_AreaCopy(1, 115, 134, 271-101, 479-333, LBLX+24, MBASE(3)); // PLA fan speed
2450
+            DWIN_Frame_AreaCopy(1, 72, 148, 271-120, 479-317, LBLX, MBASE(4));     // save PLA configuration
2451
+          }
2452
+          else {
2453
+            #ifdef USE_STRING_HEADINGS
2454
+              Draw_Title("PLA Settings"); // TODO: GET_TEXT_F
2455
+            #else
2456
+              DWIN_Frame_AreaCopy(1, 56, 16, 271-130, 479-450-1, 14, 8);
2457
+            #endif
2458
+
2459
+            DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX, MBASE(1));
2460
+            DWIN_Frame_AreaCopy(1, 197, 104, 271-33, 479-365, LBLX+24+3, MBASE(1));
2461
+            DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+41+6, MBASE(1)); // PLA nozzle temp
2462
+            DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX, MBASE(2)+3);
2463
+            DWIN_Frame_AreaCopy(1, 240, 104, 271-7, 479-365, LBLX+24+3, MBASE(2)+3);
2464
+            DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+24+6, MBASE(2)+3); // PLA bed temp
2465
+            DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX, MBASE(3));
2466
+            DWIN_Frame_AreaCopy(1, 0, 119, 271-207, 479-347, LBLX+24+3, MBASE(3));   // PLA fan speed
2467
+            DWIN_Frame_AreaCopy(1, 97, 165, 271-42, 479-301-1, LBLX, MBASE(4));      // save PLA configuration
2468
+          }
2433 2469
 
2434
-        Draw_Back_First();
2470
+          Draw_Back_First();
2435 2471
 
2436
-        Draw_Menu_Line(1, ICON_SetEndTemp);
2437
-        Draw_Menu_Line(2, ICON_SetBedTemp);
2438
-        Draw_Menu_Line(3, ICON_FanSpeed);
2439
-        Draw_Menu_Line(4, ICON_WriteEEPROM);
2472
+          Draw_Menu_Line(1, ICON_SetEndTemp);
2473
+          Draw_Menu_Line(2, ICON_SetBedTemp);
2474
+          Draw_Menu_Line(3, ICON_FanSpeed);
2475
+          Draw_Menu_Line(4, ICON_WriteEEPROM);
2440 2476
 
2441
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), HMI_ValueStruct.preheat_hotend_temp[0]);
2442
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), HMI_ValueStruct.preheat_bed_temp[0]);
2443
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), HMI_ValueStruct.preheat_fan_speed[0]);
2477
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), ui.material_preset[0].hotend_temp);
2478
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), ui.material_preset[0].bed_temp);
2479
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), ui.material_preset[0].fan_speed);
2444 2480
 
2445
-        break;
2446
-      case 5: // ABS preheat setting
2481
+          break;
2482
+        case 5: // ABS preheat setting
2447 2483
 
2448
-        checkkey = ABSPreheat;
2449
-        select_ABS.reset();
2450
-        HMI_ValueStruct.show_mode = -3;
2484
+          checkkey = ABSPreheat;
2485
+          select_ABS.reset();
2486
+          HMI_ValueStruct.show_mode = -3;
2451 2487
 
2452
-        Clear_Main_Window();
2488
+          Clear_Main_Window();
2453 2489
 
2454
-        if (HMI_flag.language_flag) {
2455
-          DWIN_Frame_AreaCopy(1, 142, 16, 271-48, 479-450, 14, 8);
2456
-
2457
-          DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX, MBASE(1));
2458
-          DWIN_Frame_AreaCopy(1, 1, 134, 271-215, 479-333, LBLX+24, MBASE(1));   // ABS nozzle temp
2459
-          DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX, MBASE(2));
2460
-          DWIN_Frame_AreaCopy(1, 58, 134, 271-158, 479-333, LBLX+24, MBASE(2));  // ABS bed temp
2461
-          DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX, MBASE(3));
2462
-          DWIN_Frame_AreaCopy(1, 115, 134, 271-101, 479-333, LBLX+24, MBASE(3)); // ABS fan speed
2463
-          DWIN_Frame_AreaCopy(1, 72, 148, 271-120, 479-317, LBLX, MBASE(4));
2464
-          DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX+28, MBASE(4)+2);    // save ABS configuration
2465
-        }
2466
-        else {
2467
-          #ifdef USE_STRING_HEADINGS
2468
-            Draw_Title("ABS Settings"); // TODO: GET_TEXT_F
2469
-          #else
2470
-            DWIN_Frame_AreaCopy(1, 56, 16, 271-130, 479-450-1, 14, 8);
2471
-          #endif
2490
+          if (HMI_flag.language_flag) {
2491
+            DWIN_Frame_AreaCopy(1, 142, 16, 271-48, 479-450, 14, 8);
2472 2492
 
2473
-          DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX, MBASE(1));
2474
-          DWIN_Frame_AreaCopy(1, 197, 104, 271-33, 479-365, LBLX+24+3, MBASE(1));
2475
-          DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+41+6, MBASE(1)); // ABS nozzle temp
2476
-          DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX, MBASE(2)+3);
2477
-          DWIN_Frame_AreaCopy(1, 240, 104, 271-7, 479-365, LBLX+24+3, MBASE(2)+3);
2478
-          DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+24+6, MBASE(2)+3); // ABS bed temp
2479
-          DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX, MBASE(3));
2480
-          DWIN_Frame_AreaCopy(1, 0, 119, 271-207, 479-347, LBLX+24+3, MBASE(3));     // ABS fan speed
2481
-          DWIN_Frame_AreaCopy(1, 97, 165, 271-42, 479-301-1, LBLX, MBASE(4));
2482
-          DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX+33, MBASE(4));          // save ABS configuration
2483
-        }
2493
+            DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX, MBASE(1));
2494
+            DWIN_Frame_AreaCopy(1, 1, 134, 271-215, 479-333, LBLX+24, MBASE(1));   // ABS nozzle temp
2495
+            DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX, MBASE(2));
2496
+            DWIN_Frame_AreaCopy(1, 58, 134, 271-158, 479-333, LBLX+24, MBASE(2));  // ABS bed temp
2497
+            DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX, MBASE(3));
2498
+            DWIN_Frame_AreaCopy(1, 115, 134, 271-101, 479-333, LBLX+24, MBASE(3)); // ABS fan speed
2499
+            DWIN_Frame_AreaCopy(1, 72, 148, 271-120, 479-317, LBLX, MBASE(4));
2500
+            DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX+28, MBASE(4)+2);    // save ABS configuration
2501
+          }
2502
+          else {
2503
+            #ifdef USE_STRING_HEADINGS
2504
+              Draw_Title("ABS Settings"); // TODO: GET_TEXT_F
2505
+            #else
2506
+              DWIN_Frame_AreaCopy(1, 56, 16, 271-130, 479-450-1, 14, 8);
2507
+            #endif
2508
+
2509
+            DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX, MBASE(1));
2510
+            DWIN_Frame_AreaCopy(1, 197, 104, 271-33, 479-365, LBLX+24+3, MBASE(1));
2511
+            DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+41+6, MBASE(1)); // ABS nozzle temp
2512
+            DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX, MBASE(2)+3);
2513
+            DWIN_Frame_AreaCopy(1, 240, 104, 271-7, 479-365, LBLX+24+3, MBASE(2)+3);
2514
+            DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+24+6, MBASE(2)+3); // ABS bed temp
2515
+            DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX, MBASE(3));
2516
+            DWIN_Frame_AreaCopy(1, 0, 119, 271-207, 479-347, LBLX+24+3, MBASE(3));     // ABS fan speed
2517
+            DWIN_Frame_AreaCopy(1, 97, 165, 271-42, 479-301-1, LBLX, MBASE(4));
2518
+            DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX+33, MBASE(4));          // save ABS configuration
2519
+          }
2484 2520
 
2485
-        Draw_Back_First();
2521
+          Draw_Back_First();
2486 2522
 
2487
-        Draw_Menu_Line(1, ICON_SetEndTemp);
2488
-        Draw_Menu_Line(2, ICON_SetBedTemp);
2489
-        Draw_Menu_Line(3, ICON_FanSpeed);
2490
-        Draw_Menu_Line(4, ICON_WriteEEPROM);
2523
+          Draw_Menu_Line(1, ICON_SetEndTemp);
2524
+          Draw_Menu_Line(2, ICON_SetBedTemp);
2525
+          Draw_Menu_Line(3, ICON_FanSpeed);
2526
+          Draw_Menu_Line(4, ICON_WriteEEPROM);
2491 2527
 
2492
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), HMI_ValueStruct.preheat_hotend_temp[1]);
2493
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), HMI_ValueStruct.preheat_bed_temp[1]);
2494
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), HMI_ValueStruct.preheat_fan_speed[1]);
2528
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), ui.material_preset[1].hotend_temp);
2529
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), ui.material_preset[1].bed_temp);
2530
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), ui.material_preset[1].fan_speed);
2495 2531
 
2496
-        break;
2497
-      default:
2498
-        break;
2532
+          break;
2533
+      #endif
2499 2534
     }
2500 2535
   }
2501 2536
   DWIN_UpdateLCD();
@@ -2792,24 +2827,30 @@ void HMI_Tune(void) {
2792 2827
         DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1+MROWS-index_tune), feedrate_percentage);
2793 2828
         EncoderRate.encoderRateEnabled = 1;
2794 2829
         break;
2795
-      case 2: // nozzle temp
2796
-        checkkey = ETemp;
2797
-        HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target;
2798
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2+MROWS-index_tune), thermalManager.temp_hotend[0].target);
2799
-        EncoderRate.encoderRateEnabled = 1;
2800
-        break;
2801
-      case 3: // bed temp
2802
-        checkkey = BedTemp;
2803
-        HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target;
2804
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3+MROWS-index_tune), thermalManager.temp_bed.target);
2805
-        EncoderRate.encoderRateEnabled = 1;
2806
-        break;
2807
-      case 4: // fan speed
2808
-        checkkey = FanSpeed;
2809
-        HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0];
2810
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(4+MROWS-index_tune), thermalManager.fan_speed[0]);
2811
-        EncoderRate.encoderRateEnabled = 1;
2812
-        break;
2830
+      #if HAS_HOTEND
2831
+        case 2: // nozzle temp
2832
+          checkkey = ETemp;
2833
+          HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target;
2834
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2+MROWS-index_tune), thermalManager.temp_hotend[0].target);
2835
+          EncoderRate.encoderRateEnabled = 1;
2836
+          break;
2837
+      #endif
2838
+      #if HAS_HEATED_BED
2839
+        case 3: // bed temp
2840
+          checkkey = BedTemp;
2841
+          HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target;
2842
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3+MROWS-index_tune), thermalManager.temp_bed.target);
2843
+          EncoderRate.encoderRateEnabled = 1;
2844
+          break;
2845
+      #endif
2846
+      #if HAS_FAN
2847
+        case 4: // fan speed
2848
+          checkkey = FanSpeed;
2849
+          HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0];
2850
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(4+MROWS-index_tune), thermalManager.fan_speed[0]);
2851
+          EncoderRate.encoderRateEnabled = 1;
2852
+          break;
2853
+      #endif
2813 2854
       case 5: // z-offset
2814 2855
         checkkey = Homeoffset;
2815 2856
         HMI_ValueStruct.offset_value = BABY_Z_VAR * 100;
@@ -2860,24 +2901,30 @@ void HMI_PLAPreheatSetting(void) {
2860 2901
         HMI_ValueStruct.show_mode = -1;
2861 2902
         Draw_Temperature_Menu();
2862 2903
         break;
2863
-      case 1: // set nozzle temperature
2864
-        checkkey = ETemp;
2865
-        HMI_ValueStruct.E_Temp = HMI_ValueStruct.preheat_hotend_temp[0];
2866
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), HMI_ValueStruct.preheat_hotend_temp[0]);
2867
-        EncoderRate.encoderRateEnabled = 1;
2868
-        break;
2869
-      case 2: // set bed temperature
2870
-        checkkey = BedTemp;
2871
-        HMI_ValueStruct.Bed_Temp = HMI_ValueStruct.preheat_bed_temp[0];
2872
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), HMI_ValueStruct.preheat_bed_temp[0]);
2873
-        EncoderRate.encoderRateEnabled = 1;
2874
-        break;
2875
-      case 3: // set fan speed
2876
-        checkkey = FanSpeed;
2877
-        HMI_ValueStruct.Fan_speed = HMI_ValueStruct.preheat_fan_speed[0];
2878
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), HMI_ValueStruct.preheat_fan_speed[0]);
2879
-        EncoderRate.encoderRateEnabled = 1;
2880
-        break;
2904
+      #if HAS_HOTEND
2905
+        case 1: // set nozzle temperature
2906
+          checkkey = ETemp;
2907
+          HMI_ValueStruct.E_Temp = ui.material_preset[0].hotend_temp;
2908
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), ui.material_preset[0].hotend_temp);
2909
+          EncoderRate.encoderRateEnabled = 1;
2910
+          break;
2911
+      #endif
2912
+      #if HAS_HEATED_BED
2913
+        case 2: // set bed temperature
2914
+          checkkey = BedTemp;
2915
+          HMI_ValueStruct.Bed_Temp = ui.material_preset[0].bed_temp;
2916
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), ui.material_preset[0].bed_temp);
2917
+          EncoderRate.encoderRateEnabled = 1;
2918
+          break;
2919
+      #endif
2920
+      #if HAS_FAN
2921
+        case 3: // set fan speed
2922
+          checkkey = FanSpeed;
2923
+          HMI_ValueStruct.Fan_speed = ui.material_preset[0].fan_speed;
2924
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), ui.material_preset[0].fan_speed);
2925
+          EncoderRate.encoderRateEnabled = 1;
2926
+          break;
2927
+      #endif
2881 2928
       case 4: // save PLA configuration
2882 2929
         if (settings.save()) {
2883 2930
           buzzer.tone(100, 659);
@@ -2885,8 +2932,7 @@ void HMI_PLAPreheatSetting(void) {
2885 2932
         }
2886 2933
         else buzzer.tone(20, 440);
2887 2934
         break;
2888
-      default:
2889
-        break;
2935
+      default: break;
2890 2936
     }
2891 2937
   }
2892 2938
   DWIN_UpdateLCD();
@@ -2912,24 +2958,30 @@ void HMI_ABSPreheatSetting(void) {
2912 2958
         HMI_ValueStruct.show_mode = -1;
2913 2959
         Draw_Temperature_Menu();
2914 2960
         break;
2915
-      case 1: // set nozzle temperature
2916
-        checkkey = ETemp;
2917
-        HMI_ValueStruct.E_Temp = HMI_ValueStruct.preheat_hotend_temp[1];
2918
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), HMI_ValueStruct.preheat_hotend_temp[1]);
2919
-        EncoderRate.encoderRateEnabled = 1;
2920
-        break;
2921
-      case 2: // set bed temperature
2922
-        checkkey = BedTemp;
2923
-        HMI_ValueStruct.Bed_Temp = HMI_ValueStruct.preheat_bed_temp[1];
2924
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), HMI_ValueStruct.preheat_bed_temp[1]);
2925
-        EncoderRate.encoderRateEnabled = 1;
2926
-        break;
2927
-      case 3: // set fan speed
2928
-        checkkey = FanSpeed;
2929
-        HMI_ValueStruct.Fan_speed = HMI_ValueStruct.preheat_fan_speed[1];
2930
-        DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), HMI_ValueStruct.preheat_fan_speed[1]);
2931
-        EncoderRate.encoderRateEnabled = 1;
2932
-        break;
2961
+      #if HAS_HOTEND
2962
+        case 1: // set nozzle temperature
2963
+          checkkey = ETemp;
2964
+          HMI_ValueStruct.E_Temp = ui.material_preset[1].hotend_temp;
2965
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), ui.material_preset[1].hotend_temp);
2966
+          EncoderRate.encoderRateEnabled = 1;
2967
+          break;
2968
+      #endif
2969
+      #if HAS_HEATED_BED
2970
+        case 2: // set bed temperature
2971
+          checkkey = BedTemp;
2972
+          HMI_ValueStruct.Bed_Temp = ui.material_preset[1].bed_temp;
2973
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), ui.material_preset[1].bed_temp);
2974
+          EncoderRate.encoderRateEnabled = 1;
2975
+          break;
2976
+      #endif
2977
+      #if HAS_FAN
2978
+        case 3: // set fan speed
2979
+          checkkey = FanSpeed;
2980
+          HMI_ValueStruct.Fan_speed = ui.material_preset[1].fan_speed;
2981
+          DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), ui.material_preset[1].fan_speed);
2982
+          EncoderRate.encoderRateEnabled = 1;
2983
+          break;
2984
+      #endif
2933 2985
       case 4: // save PLA configuration
2934 2986
         if (settings.save()) {
2935 2987
           buzzer.tone(100, 659);
@@ -3257,7 +3309,7 @@ void EachMomentUpdate(void) {
3257 3309
     /* remain print time */
3258 3310
     static millis_t next_remain_time_update = 0;
3259 3311
     if (elapsed.minute() > 5 && ELAPSED(ms, next_remain_time_update) && HMI_flag.heat_flag == 0) { // show after 5 min and 20s update
3260
-      remain_time = ((elapsed.value - heat_time) * ((float)card.getFileSize() / (float)card.getIndex())) - (elapsed.value - heat_time);
3312
+      remain_time = ((elapsed.value - dwin_heat_time) * ((float)card.getFileSize() / (float)card.getIndex())) - (elapsed.value - dwin_heat_time);
3261 3313
       next_remain_time_update += 20 * 1000UL;
3262 3314
       Draw_Print_ProgressRemain();
3263 3315
     }
@@ -3365,9 +3417,15 @@ void DWIN_HandleScreen(void) {
3365 3417
     case Move_Z:                HMI_Move_Z(); break;
3366 3418
     case Extruder:              HMI_Move_E(); break;
3367 3419
     case Homeoffset:            HMI_Zoffset(); break;
3368
-    case ETemp:                 HMI_ETemp(); break;
3369
-    case BedTemp:               HMI_BedTemp(); break;
3370
-    case FanSpeed:              HMI_FanSpeed(); break;
3420
+    #if HAS_HOTEND
3421
+      case ETemp:               HMI_ETemp(); break;
3422
+    #endif
3423
+    #if HAS_HEATED_BED
3424
+      case BedTemp:             HMI_BedTemp(); break;
3425
+    #endif
3426
+    #if HAS_FAN
3427
+      case FanSpeed:            HMI_FanSpeed(); break;
3428
+    #endif
3371 3429
     case PrintSpeed:            HMI_PrintSpeed(); break;
3372 3430
     case MaxSpeed_value:        HMI_MaxFeedspeedXYZE(); break;
3373 3431
     case MaxAcceleration_value: HMI_MaxAccelerationXYZE(); break;

+ 65
- 32
Marlin/src/lcd/dwin/dwin.h View File

@@ -81,8 +81,10 @@ enum processID {
81 81
   Motion,
82 82
   Info,
83 83
   Tune,
84
-  PLAPreheat,
85
-  ABSPreheat,
84
+  #if HAS_HOTEND
85
+    PLAPreheat,
86
+    ABSPreheat,
87
+  #endif
86 88
   MaxSpeed,
87 89
   MaxSpeed_value,
88 90
   MaxAcceleration,
@@ -105,9 +107,15 @@ enum processID {
105 107
   Move_Z,
106 108
   Extruder,
107 109
   Homeoffset,
108
-  ETemp,
109
-  BedTemp,
110
-  FanSpeed,
110
+  #if HAS_HOTEND
111
+    ETemp,
112
+  #endif
113
+  #if HAS_HEATED_BED
114
+    BedTemp,
115
+  #endif
116
+  #if HAS_FAN
117
+    FanSpeed,
118
+  #endif
111 119
   PrintSpeed,
112 120
 
113 121
   /*Window ID*/
@@ -251,26 +259,31 @@ extern int checkkey, last_checkkey;
251 259
 extern float zprobe_zoffset;
252 260
 extern char print_filename[16];
253 261
 
254
-extern millis_t heat_time;
262
+extern millis_t dwin_heat_time;
255 263
 
256 264
 typedef struct {
257
-  int16_t E_Temp          = 0;
258
-  int16_t Bed_Temp        = 0;
259
-  int16_t Fan_speed       = 0;
265
+  #if HAS_HOTEND
266
+    int16_t E_Temp        = 0;
267
+  #endif
268
+  #if HAS_HEATED_BED
269
+    int16_t Bed_Temp      = 0;
270
+  #endif
271
+  #if HAS_FAN
272
+    int16_t Fan_speed     = 0;
273
+  #endif
260 274
   int16_t print_speed     = 100;
261
-  float Max_Feedspeed       = 0;
262
-  float Max_Acceleration    = 0;
263
-  float Max_Corner          = 0;
264
-  float Max_Step           = 0;
265
-  float Move_X_scale        = 0;
266
-  float Move_Y_scale        = 0;
267
-  float Move_Z_scale        = 0;
268
-  float Move_E_scale        = 0;
269
-  float offset_value        = 0;
270
-  char show_mode            = 0;    // -1: Temperature control    0: Printing temperature
271
-  int16_t preheat_hotend_temp[2];
272
-  int16_t preheat_bed_temp[2];
273
-  uint8_t preheat_fan_speed[2];
275
+  float Max_Feedspeed     = 0;
276
+  float Max_Acceleration  = 0;
277
+  float Max_Corner        = 0;
278
+  float Max_Step          = 0;
279
+  float Move_X_scale      = 0;
280
+  float Move_Y_scale      = 0;
281
+  float Move_Z_scale      = 0;
282
+  #if EXTRUDERS
283
+    float Move_E_scale    = 0;
284
+  #endif
285
+  float offset_value      = 0;
286
+  char show_mode          = 0;    // -1: Temperature control    0: Printing temperature
274 287
 } HMI_value_t;
275 288
 
276 289
 typedef struct {
@@ -281,9 +294,15 @@ typedef struct {
281 294
   bool select_flag:1;
282 295
   bool home_flag:1;
283 296
   bool heat_flag:1;  // 0: heating done  1: during heating
284
-  bool ETempTooLow_flag:1;
285
-  bool leveling_offset_flag:1;
286
-  char feedspeed_flag;
297
+  #if HAS_HOTEND
298
+    bool ETempTooLow_flag:1;
299
+  #endif
300
+  #if HAS_LEVELING
301
+    bool leveling_offset_flag:1;
302
+  #endif
303
+  #if HAS_FAN
304
+    char feedspeed_flag;
305
+  #endif
287 306
   char acc_flag;
288 307
   char corner_flag;
289 308
   char step_flag;
@@ -310,8 +329,11 @@ void ICON_Continue(bool show);
310 329
 void ICON_Stop(bool show);
311 330
 
312 331
 /* Popup window tips */
313
-void Popup_Window_Temperature(const bool toohigh);
314
-void Popup_Window_ETempTooLow(void);
332
+#if HAS_HOTEND
333
+  void Popup_Window_Temperature(const bool toohigh);
334
+  void Popup_Window_ETempTooLow(void);
335
+#endif
336
+
315 337
 void Popup_Window_Resume(void);
316 338
 void Popup_Window_Home(void);
317 339
 void Popup_Window_Leveling(void);
@@ -326,9 +348,16 @@ void HMI_Move_Z(void);
326 348
 void HMI_Move_E(void);
327 349
 
328 350
 void HMI_Zoffset(void);
329
-void HMI_ETemp(void);
330
-void HMI_BedTemp(void);
331
-void HMI_FanSpeed(void);
351
+
352
+#if HAS_HOTEND
353
+  void HMI_ETemp(void);
354
+#endif
355
+#if HAS_HEATED_BED
356
+  void HMI_BedTemp(void);
357
+#endif
358
+#if HAS_FAN
359
+  void HMI_FanSpeed(void);
360
+#endif
332 361
 void HMI_PrintSpeed(void);
333 362
 
334 363
 void HMI_MaxFeedspeedXYZE(void);
@@ -363,8 +392,12 @@ void HMI_Temperature(void);       // 温度菜单
363 392
 void HMI_Motion(void);            // 运动菜单
364 393
 void HMI_Info(void);              // 信息菜单
365 394
 void HMI_Tune(void);              // 调整菜单
366
-void HMI_PLAPreheatSetting(void); // PLA预热设置
367
-void HMI_ABSPreheatSetting(void); // ABS预热设置
395
+
396
+#if HAS_HOTEND
397
+  void HMI_PLAPreheatSetting(void); // PLA预热设置
398
+  void HMI_ABSPreheatSetting(void); // ABS预热设置
399
+#endif
400
+
368 401
 void HMI_MaxSpeed(void);          // 最大速度子菜单
369 402
 void HMI_MaxAcceleration(void);   // 最大加速度子菜单
370 403
 void HMI_MaxCorner(void);         // 最大拐角速度子菜单

+ 24
- 6
Marlin/src/lcd/menu/menu_configuration.cpp View File

@@ -298,7 +298,7 @@ void menu_advanced_settings();
298 298
 
299 299
 #endif
300 300
 
301
-#if DISABLED(SLIM_LCD_MENUS)
301
+#if PREHEAT_COUNT && DISABLED(SLIM_LCD_MENUS)
302 302
 
303 303
   void _menu_configuration_preheat_settings(const uint8_t material) {
304 304
     #define _MINTEMP_ITEM(N) HEATER_##N##_MINTEMP,
@@ -307,12 +307,12 @@ void menu_advanced_settings();
307 307
     #define MAXTEMP_ALL _MAX(REPEAT(HOTENDS, _MAXTEMP_ITEM) 0)
308 308
     START_MENU();
309 309
     BACK_ITEM(MSG_CONFIGURATION);
310
-    EDIT_ITEM(percent, MSG_FAN_SPEED, &ui.preheat_fan_speed[material], 0, 255);
310
+    EDIT_ITEM(percent, MSG_FAN_SPEED, &ui.material_preset[material].fan_speed, 0, 255);
311 311
     #if HAS_TEMP_HOTEND
312
-      EDIT_ITEM(int3, MSG_NOZZLE, &ui.preheat_hotend_temp[material], MINTEMP_ALL, MAXTEMP_ALL - HOTEND_OVERSHOOT);
312
+      EDIT_ITEM(int3, MSG_NOZZLE, &ui.material_preset[material].hotend_temp, MINTEMP_ALL, MAXTEMP_ALL - HOTEND_OVERSHOOT);
313 313
     #endif
314 314
     #if HAS_HEATED_BED
315
-      EDIT_ITEM(int3, MSG_BED, &ui.preheat_bed_temp[material], BED_MINTEMP, BED_MAX_TARGET);
315
+      EDIT_ITEM(int3, MSG_BED, &ui.material_preset[material].bed_temp, BED_MINTEMP, BED_MAX_TARGET);
316 316
     #endif
317 317
     #if ENABLED(EEPROM_SETTINGS)
318 318
       ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings);
@@ -322,6 +322,15 @@ void menu_advanced_settings();
322 322
 
323 323
   void menu_preheat_material1_settings() { _menu_configuration_preheat_settings(0); }
324 324
   void menu_preheat_material2_settings() { _menu_configuration_preheat_settings(1); }
325
+  #if PREHEAT_COUNT >= 3
326
+    void menu_preheat_material3_settings() { _menu_configuration_preheat_settings(3); }
327
+    #if PREHEAT_COUNT >= 4
328
+      void menu_preheat_material4_settings() { _menu_configuration_preheat_settings(4); }
329
+      #if PREHEAT_COUNT >= 5
330
+        void menu_preheat_material5_settings() { _menu_configuration_preheat_settings(5); }
331
+      #endif
332
+    #endif
333
+  #endif
325 334
 
326 335
 #endif
327 336
 
@@ -400,10 +409,19 @@ void menu_configuration() {
400 409
     EDIT_ITEM(bool, MSG_OUTAGE_RECOVERY, &recovery.enabled, recovery.changed);
401 410
   #endif
402 411
 
403
-  #if DISABLED(SLIM_LCD_MENUS)
404
-    // Preheat configurations
412
+  // Preheat configurations
413
+  #if PREHEAT_COUNT && DISABLED(SLIM_LCD_MENUS)
405 414
     SUBMENU(MSG_PREHEAT_1_SETTINGS, menu_preheat_material1_settings);
406 415
     SUBMENU(MSG_PREHEAT_2_SETTINGS, menu_preheat_material2_settings);
416
+    #if PREHEAT_COUNT >= 3
417
+      SUBMENU(MSG_PREHEAT_3_SETTINGS, menu_preheat_material3_settings);
418
+      #if PREHEAT_COUNT >= 4
419
+        SUBMENU(MSG_PREHEAT_4_SETTINGS, menu_preheat_material4_settings);
420
+        #if PREHEAT_COUNT >= 5
421
+          SUBMENU(MSG_PREHEAT_5_SETTINGS, menu_preheat_material5_settings);
422
+        #endif
423
+      #endif
424
+    #endif
407 425
   #endif
408 426
 
409 427
   #if ENABLED(EEPROM_SETTINGS)

+ 2
- 2
Marlin/src/lcd/menu/menu_filament.cpp View File

@@ -81,8 +81,8 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) {
81 81
   START_MENU();
82 82
   if (LCD_HEIGHT >= 4) STATIC_ITEM_P(change_filament_header(mode), SS_CENTER|SS_INVERT);
83 83
   BACK_ITEM(MSG_BACK);
84
-  ACTION_ITEM(MSG_PREHEAT_1, []{ _change_filament(ui.preheat_hotend_temp[0]); });
85
-  ACTION_ITEM(MSG_PREHEAT_2, []{ _change_filament(ui.preheat_hotend_temp[1]); });
84
+  ACTION_ITEM(MSG_PREHEAT_1, []{ _change_filament(ui.material_preset[0].hotend_temp); });
85
+  ACTION_ITEM(MSG_PREHEAT_2, []{ _change_filament(ui.material_preset[1].hotend_temp); });
86 86
   EDIT_ITEM_FAST(int3, MSG_PREHEAT_CUSTOM, &thermalManager.temp_hotend[_change_filament_extruder].target, EXTRUDE_MINTEMP, thermalManager.heater_maxtemp[extruder] - HOTEND_OVERSHOOT, []{
87 87
     _change_filament(thermalManager.temp_hotend[_change_filament_extruder].target);
88 88
   });

+ 1
- 1
Marlin/src/lcd/menu/menu_info.cpp View File

@@ -243,7 +243,7 @@ void menu_info_board() {
243 243
     STATIC_ITEM_P(PSTR(MACHINE_NAME));                          // My3DPrinter
244 244
     STATIC_ITEM_P(PSTR(WEBSITE_URL));                           // www.my3dprinter.com
245 245
     VALUE_ITEM_P(MSG_INFO_EXTRUDERS, STRINGIFY(EXTRUDERS), SS_CENTER); // Extruders: 2
246
-    #if HAS_BED_LEVELING
246
+    #if HAS_LEVELING
247 247
       STATIC_ITEM(
248 248
         TERN_(AUTO_BED_LEVELING_3POINT, MSG_3POINT_LEVELING)      // 3-Point Leveling
249 249
         TERN_(AUTO_BED_LEVELING_LINEAR, MSG_LINEAR_LEVELING)      // Linear Leveling

+ 3
- 1
Marlin/src/lcd/menu/menu_main.cpp View File

@@ -157,7 +157,9 @@ void menu_main() {
157 157
     SUBMENU(MSG_CUTTER(MENU), menu_spindle_laser);
158 158
   #endif
159 159
 
160
-  SUBMENU(MSG_TEMPERATURE, menu_temperature);
160
+  #if HAS_TEMPERATURE
161
+    SUBMENU(MSG_TEMPERATURE, menu_temperature);
162
+  #endif
161 163
 
162 164
   #if HAS_POWER_MONITOR
163 165
     MENU_ITEM(submenu, MSG_POWER_MONITOR, menu_power_monitor);

+ 64
- 52
Marlin/src/lcd/menu/menu_temperature.cpp View File

@@ -24,9 +24,9 @@
24 24
 // Temperature Menu
25 25
 //
26 26
 
27
-#include "../../inc/MarlinConfigPre.h"
27
+#include "../../inc/MarlinConfig.h"
28 28
 
29
-#if HAS_LCD_MENU
29
+#if HAS_LCD_MENU && HAS_TEMPERATURE
30 30
 
31 31
 #include "menu.h"
32 32
 #include "../../module/temperature.h"
@@ -39,23 +39,19 @@
39 39
   #include "../../module/tool_change.h"
40 40
 #endif
41 41
 
42
-// Initialized by settings.load()
43
-int16_t MarlinUI::preheat_hotend_temp[2], MarlinUI::preheat_bed_temp[2];
44
-uint8_t MarlinUI::preheat_fan_speed[2];
45
-
46 42
 //
47 43
 // "Temperature" submenu items
48 44
 //
49 45
 
50 46
 void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t indb) {
51 47
   #if HAS_HOTEND
52
-    if (indh >= 0 && ui.preheat_hotend_temp[indh] > 0)
53
-      setTargetHotend(_MIN(thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT, ui.preheat_hotend_temp[indh]), e);
48
+    if (indh >= 0 && ui.material_preset[indh].hotend_temp > 0)
49
+      setTargetHotend(_MIN(thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT, ui.material_preset[indh].hotend_temp), e);
54 50
   #else
55 51
     UNUSED(e); UNUSED(indh);
56 52
   #endif
57 53
   #if HAS_HEATED_BED
58
-    if (indb >= 0 && ui.preheat_bed_temp[indb] > 0) setTargetBed(ui.preheat_bed_temp[indb]);
54
+    if (indb >= 0 && ui.material_preset[indb].bed_temp > 0) setTargetBed(ui.material_preset[indb].bed_temp);
59 55
   #else
60 56
     UNUSED(indb);
61 57
   #endif
@@ -64,7 +60,7 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i
64 60
       #if FAN_COUNT > 1
65 61
         active_extruder < FAN_COUNT ? active_extruder :
66 62
       #endif
67
-      0), ui.preheat_fan_speed[indh]
63
+      0), ui.material_preset[indh].fan_speed
68 64
     );
69 65
   #endif
70 66
   ui.return_to_status();
@@ -82,69 +78,67 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i
82 78
 
83 79
 #if HAS_TEMP_HOTEND || HAS_HEATED_BED
84 80
 
85
-  #define _PREHEAT_ITEMS(M,N) do{ \
86
-    ACTION_ITEM_N(N, MSG_PREHEAT_##M##_H, []{ _preheat_both(M-1, MenuItemBase::itemIndex); }); \
87
-    ACTION_ITEM_N(N, MSG_PREHEAT_##M##_END_E, []{ _preheat_end(M-1, MenuItemBase::itemIndex); }); \
88
-  }while(0)
89
-  #if HAS_HEATED_BED
90
-    #define PREHEAT_ITEMS(M,N) _PREHEAT_ITEMS(M,N)
81
+  #if HAS_TEMP_HOTEND && HAS_HEATED_BED
82
+    #define _PREHEAT_ITEMS(M,E) do{ \
83
+      ACTION_ITEM_N_P(E, msg_preheat_h[M], []{ _preheat_both(M, MenuItemBase::itemIndex); }); \
84
+      ACTION_ITEM_N_P(E, msg_preheat_end_e[M], []{ _preheat_end(M, MenuItemBase::itemIndex); }); \
85
+    }while(0)
86
+    #if HAS_HEATED_BED
87
+      #define PREHEAT_ITEMS(M,E) _PREHEAT_ITEMS(M,E)
88
+    #endif
91 89
   #else
92
-    #define PREHEAT_ITEMS(M,N) \
93
-      ACTION_ITEM_N(N, MSG_PREHEAT_##M##_H, []{ _preheat_end(M-1, MenuItemBase::itemIndex); })
90
+    #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N(E, msg_preheat_h[M], []{ _preheat_end(M, MenuItemBase::itemIndex); })
94 91
   #endif
95 92
 
96
-  void menu_preheat_m1() {
97
-    START_MENU();
98
-    BACK_ITEM(MSG_TEMPERATURE);
93
+  void menu_preheat_m(const uint8_t m) {
94
+    editable.int8 = m;
99 95
     #if HOTENDS == 1
100
-      #if HAS_HEATED_BED
101
-        ACTION_ITEM(MSG_PREHEAT_1, []{ _preheat_both(0, 0); });
102
-        ACTION_ITEM(MSG_PREHEAT_1_END, []{ _preheat_end(0, 0); });
103
-      #else
104
-        ACTION_ITEM(MSG_PREHEAT_1, []{ _preheat_end(0, 0); });
105
-      #endif
96
+      PGM_P msg_preheat[]     = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1),         GET_TEXT(MSG_PREHEAT_2),         GET_TEXT(MSG_PREHEAT_3),         GET_TEXT(MSG_PREHEAT_4),          GET_TEXT(MSG_PREHEAT_5));
97
+      PGM_P msg_preheat_end[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_END),     GET_TEXT(MSG_PREHEAT_2_END),     GET_TEXT(MSG_PREHEAT_3_END),     GET_TEXT(MSG_PREHEAT_4_END),      GET_TEXT(MSG_PREHEAT_5_END));
106 98
     #elif HAS_MULTI_HOTEND
107
-      #if HAS_HEATED_BED
108
-        _PREHEAT_ITEMS(1,0);
109
-      #endif
110
-      LOOP_S_L_N(n, 1, HOTENDS) PREHEAT_ITEMS(1,n);
111
-      ACTION_ITEM(MSG_PREHEAT_1_ALL, []() {
112
-        TERN_(HAS_HEATED_BED, _preheat_bed(0));
113
-        HOTEND_LOOP() thermalManager.setTargetHotend(ui.preheat_hotend_temp[0], e);
114
-      });
115
-    #endif // HAS_MULTI_HOTEND
116
-    #if HAS_HEATED_BED
117
-      ACTION_ITEM(MSG_PREHEAT_1_BEDONLY, []{ _preheat_bed(0); });
99
+      PGM_P msg_preheat_all[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_ALL),     GET_TEXT(MSG_PREHEAT_2_ALL),     GET_TEXT(MSG_PREHEAT_3_ALL),     GET_TEXT(MSG_PREHEAT_4_ALL),      GET_TEXT(MSG_PREHEAT_5_ALL));
118 100
     #endif
119
-    END_MENU();
120
-  }
101
+    PGM_P msg_preheat_end_e[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_END_E),   GET_TEXT(MSG_PREHEAT_2_END_E),   GET_TEXT(MSG_PREHEAT_3_END_E),   GET_TEXT(MSG_PREHEAT_4_END_E),    GET_TEXT(MSG_PREHEAT_5_END_E));
102
+    PGM_P msg_preheat_bed[]   = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_BEDONLY), GET_TEXT(MSG_PREHEAT_2_BEDONLY), GET_TEXT(MSG_PREHEAT_3_BEDONLY), GET_TEXT(MSG_PREHEAT_4_BEDONLY),  GET_TEXT(MSG_PREHEAT_5_BEDONLY));
103
+    PGM_P msg_preheat_h[]     = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_H),       GET_TEXT(MSG_PREHEAT_2_H),       GET_TEXT(MSG_PREHEAT_3_H),       GET_TEXT(MSG_PREHEAT_4_H),        GET_TEXT(MSG_PREHEAT_5_H));
121 104
 
122
-  void menu_preheat_m2() {
123 105
     START_MENU();
124 106
     BACK_ITEM(MSG_TEMPERATURE);
125 107
     #if HOTENDS == 1
126 108
       #if HAS_HEATED_BED
127
-        ACTION_ITEM(MSG_PREHEAT_2, []{ _preheat_both(1, 0); });
128
-        ACTION_ITEM(MSG_PREHEAT_2_END, []{ _preheat_end(1, 0); });
109
+        ACTION_ITEM_P(msg_preheat[m], []{ _preheat_both(editable.int8, 0); });
110
+        ACTION_ITEM_P(msg_preheat_end[m], []{ _preheat_end(editable.int8, 0); });
129 111
       #else
130
-        ACTION_ITEM(MSG_PREHEAT_2, []{ _preheat_end(1, 0); });
112
+        ACTION_ITEM_P(msg_preheat[m], []{ _preheat_end(editable.int8, 0); });
131 113
       #endif
132 114
     #elif HAS_MULTI_HOTEND
133 115
       #if HAS_HEATED_BED
134
-        _PREHEAT_ITEMS(2,0);
116
+        _PREHEAT_ITEMS(editable.int8,0);
135 117
       #endif
136
-      LOOP_S_L_N(n, 1, HOTENDS) PREHEAT_ITEMS(2,n);
137
-      ACTION_ITEM(MSG_PREHEAT_2_ALL, []() {
138
-        TERN_(HAS_HEATED_BED, _preheat_bed(1));
139
-        HOTEND_LOOP() thermalManager.setTargetHotend(ui.preheat_hotend_temp[1], e);
118
+      LOOP_S_L_N(n, 1, HOTENDS) PREHEAT_ITEMS(editable.int8,n);
119
+      ACTION_ITEM_P(msg_preheat_all[m], []() {
120
+        TERN_(HAS_HEATED_BED, _preheat_bed(editable.int8));
121
+        HOTEND_LOOP() thermalManager.setTargetHotend(ui.material_preset[editable.int8].hotend_temp, e);
140 122
       });
141 123
     #endif // HAS_MULTI_HOTEND
142 124
     #if HAS_HEATED_BED
143
-      ACTION_ITEM(MSG_PREHEAT_2_BEDONLY, []{ _preheat_bed(1); });
125
+      ACTION_ITEM_P(msg_preheat_bed[m], []{ _preheat_bed(editable.int8); });
144 126
     #endif
145 127
     END_MENU();
146 128
   }
147 129
 
130
+  void menu_preheat_m1() { menu_preheat_m(0); }
131
+  void menu_preheat_m2() { menu_preheat_m(1); }
132
+  #if PREHEAT_COUNT >= 3
133
+    void menu_preheat_m3() { menu_preheat_m(2); }
134
+    #if PREHEAT_COUNT >= 4
135
+      void menu_preheat_m4() { menu_preheat_m(3); }
136
+      #if PREHEAT_COUNT >= 5
137
+        void menu_preheat_m5() { menu_preheat_m(4); }
138
+      #endif
139
+    #endif
140
+  #endif
141
+
148 142
   void lcd_cooldown() {
149 143
     thermalManager.zero_fan_speeds();
150 144
     thermalManager.disable_all_heaters();
@@ -269,12 +263,30 @@ void menu_temperature() {
269 263
     //
270 264
     // Preheat for Material 1 and 2
271 265
     //
272
-    #if TEMP_SENSOR_1 != 0 || TEMP_SENSOR_2 != 0 || TEMP_SENSOR_3 != 0 || TEMP_SENSOR_4 != 0 || TEMP_SENSOR_5 != 0 || TEMP_SENSOR_6 != 0 || TEMP_SENSOR_7 != 0 || HAS_HEATED_BED
266
+    #if HOTENDS > 1 || HAS_HEATED_BED
273 267
       SUBMENU(MSG_PREHEAT_1, menu_preheat_m1);
274 268
       SUBMENU(MSG_PREHEAT_2, menu_preheat_m2);
269
+      #if PREHEAT_COUNT >= 3
270
+        SUBMENU(MSG_PREHEAT_3, menu_preheat_m3);
271
+        #if PREHEAT_COUNT >= 4
272
+          SUBMENU(MSG_PREHEAT_4, menu_preheat_m4);
273
+          #if PREHEAT_COUNT >= 5
274
+            SUBMENU(MSG_PREHEAT_5, menu_preheat_m5);
275
+          #endif
276
+        #endif
277
+      #endif
275 278
     #else
276 279
       ACTION_ITEM(MSG_PREHEAT_1, []{ _preheat_end(0, 0); });
277 280
       ACTION_ITEM(MSG_PREHEAT_2, []{ _preheat_end(1, 0); });
281
+      #if PREHEAT_COUNT >= 3
282
+        ACTION_ITEM(MSG_PREHEAT_3, []{ _preheat_end(2, 0); });
283
+        #if PREHEAT_COUNT >= 3
284
+          ACTION_ITEM(MSG_PREHEAT_4, []{ _preheat_end(3, 0); });
285
+          #if PREHEAT_COUNT >= 3
286
+            ACTION_ITEM(MSG_PREHEAT_5, []{ _preheat_end(4, 0); });
287
+          #endif
288
+        #endif
289
+      #endif
278 290
     #endif
279 291
 
280 292
     //
@@ -288,4 +300,4 @@ void menu_temperature() {
288 300
   END_MENU();
289 301
 }
290 302
 
291
-#endif // HAS_LCD_MENU
303
+#endif // HAS_LCD_MENU && HAS_TEMPERATURE

+ 78
- 60
Marlin/src/lcd/menu/menu_ubl.cpp View File

@@ -128,7 +128,9 @@ void _lcd_ubl_build_custom_mesh() {
128 128
 void _lcd_ubl_custom_mesh() {
129 129
   START_MENU();
130 130
   BACK_ITEM(MSG_UBL_BUILD_MESH_MENU);
131
-  EDIT_ITEM(int3, MSG_UBL_HOTEND_TEMP_CUSTOM, &custom_hotend_temp, EXTRUDE_MINTEMP, HEATER_0_MAXTEMP - HOTEND_OVERSHOOT);
131
+  #if HAS_HOTEND
132
+    EDIT_ITEM(int3, MSG_UBL_HOTEND_TEMP_CUSTOM, &custom_hotend_temp, EXTRUDE_MINTEMP, HEATER_0_MAXTEMP - HOTEND_OVERSHOOT);
133
+  #endif
132 134
   #if HAS_HEATED_BED
133 135
     EDIT_ITEM(int3, MSG_UBL_BED_TEMP_CUSTOM, &custom_bed_temp, BED_MINTEMP, BED_MAX_TARGET);
134 136
   #endif
@@ -182,39 +184,48 @@ void _lcd_ubl_edit_mesh() {
182 184
   END_MENU();
183 185
 }
184 186
 
185
-/**
186
- * UBL Validate Custom Mesh Command
187
- */
188
-void _lcd_ubl_validate_custom_mesh() {
189
-  char ubl_lcd_gcode[24];
190
-  const int16_t temp = TERN(HAS_HEATED_BED, custom_bed_temp, 0);
191
-  sprintf_P(ubl_lcd_gcode, PSTR("G28\nG26 C B%" PRIi16 " H%" PRIi16 " P"), temp, custom_hotend_temp);
192
-  queue.inject(ubl_lcd_gcode);
193
-}
187
+#if ENABLED(G26_MESH_VALIDATION)
188
+
189
+  /**
190
+   * UBL Validate Custom Mesh Command
191
+   */
192
+  void _lcd_ubl_validate_custom_mesh() {
193
+    char ubl_lcd_gcode[24];
194
+    const int16_t temp = TERN(HAS_HEATED_BED, custom_bed_temp, 0);
195
+    sprintf_P(ubl_lcd_gcode, PSTR("G28\nG26 C P H%" PRIi16 TERN_(HAS_HEATED_BED, " B%" PRIi16))
196
+      , custom_hotend_temp
197
+      #if HAS_HEATED_BED
198
+        , temp
199
+      #endif
200
+    );
201
+    queue.inject(ubl_lcd_gcode);
202
+  }
194 203
 
195
-/**
196
- * UBL Validate Mesh submenu
197
- *
198
- * << UBL Tools
199
- *    Mesh Validation with Material 1
200
- *    Mesh Validation with Material 2
201
- *    Validate Custom Mesh
202
- * << Info Screen
203
- */
204
-void _lcd_ubl_validate_mesh() {
205
-  START_MENU();
206
-  BACK_ITEM(MSG_UBL_TOOLS);
207
-  #if HAS_HEATED_BED
208
-    GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M1, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_1_TEMP_BED) " H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P"));
209
-    GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M2, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_2_TEMP_BED) " H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P"));
210
-  #else
211
-    GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M1, PSTR("G28\nG26 C B0 H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P"));
212
-    GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M2, PSTR("G28\nG26 C B0 H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P"));
213
-  #endif
214
-  ACTION_ITEM(MSG_UBL_VALIDATE_CUSTOM_MESH, _lcd_ubl_validate_custom_mesh);
215
-  ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status);
216
-  END_MENU();
217
-}
204
+  /**
205
+   * UBL Validate Mesh submenu
206
+   *
207
+   * << UBL Tools
208
+   *    Mesh Validation with Material 1
209
+   *    Mesh Validation with Material 2
210
+   *    Validate Custom Mesh
211
+   * << Info Screen
212
+   */
213
+  void _lcd_ubl_validate_mesh() {
214
+    START_MENU();
215
+    BACK_ITEM(MSG_UBL_TOOLS);
216
+    #if HAS_HEATED_BED
217
+      GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M1, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_1_TEMP_BED) " H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P"));
218
+      GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M2, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_2_TEMP_BED) " H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P"));
219
+    #else
220
+      GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M1, PSTR("G28\nG26 C B0 H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P"));
221
+      GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M2, PSTR("G28\nG26 C B0 H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P"));
222
+    #endif
223
+    ACTION_ITEM(MSG_UBL_VALIDATE_CUSTOM_MESH, _lcd_ubl_validate_custom_mesh);
224
+    ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status);
225
+    END_MENU();
226
+  }
227
+
228
+#endif
218 229
 
219 230
 /**
220 231
  * UBL Grid Leveling submenu
@@ -530,36 +541,42 @@ void _menu_ubl_tools() {
530 541
   BACK_ITEM(MSG_UBL_LEVEL_BED);
531 542
   SUBMENU(MSG_UBL_BUILD_MESH_MENU, _lcd_ubl_build_mesh);
532 543
   GCODES_ITEM(MSG_UBL_MANUAL_MESH, PSTR("G29 I999\nG29 P2 B T0"));
533
-  SUBMENU(MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh);
544
+  #if ENABLED(G26_MESH_VALIDATION)
545
+    SUBMENU(MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh);
546
+  #endif
534 547
   SUBMENU(MSG_EDIT_MESH, _lcd_ubl_edit_mesh);
535 548
   SUBMENU(MSG_UBL_MESH_LEVELING, _lcd_ubl_mesh_leveling);
536 549
   END_MENU();
537 550
 }
538 551
 
539
-/**
540
- * UBL Step-By-Step submenu
541
- *
542
- * << Unified Bed Leveling
543
- *    1 Build Cold Mesh
544
- *    2 Smart Fill-in
545
- *  - 3 Validate Mesh >>
546
- *    4 Fine Tune All
547
- *  - 5 Validate Mesh >>
548
- *    6 Fine Tune All
549
- *    7 Save Bed Mesh
550
- */
551
-void _lcd_ubl_step_by_step() {
552
-  START_MENU();
553
-  BACK_ITEM(MSG_UBL_LEVEL_BED);
554
-  GCODES_ITEM(MSG_UBL_1_BUILD_COLD_MESH, PSTR("G28\nG29 P1"));
555
-  GCODES_ITEM(MSG_UBL_2_SMART_FILLIN, PSTR("G29 P3 T0"));
556
-  SUBMENU(MSG_UBL_3_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh);
557
-  GCODES_ITEM(MSG_UBL_4_FINE_TUNE_ALL, PSTR("G29 P4 R999 T"));
558
-  SUBMENU(MSG_UBL_5_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh);
559
-  GCODES_ITEM(MSG_UBL_6_FINE_TUNE_ALL, PSTR("G29 P4 R999 T"));
560
-  ACTION_ITEM(MSG_UBL_7_SAVE_MESH, _lcd_ubl_save_mesh_cmd);
561
-  END_MENU();
562
-}
552
+#if ENABLED(G26_MESH_VALIDATION)
553
+
554
+  /**
555
+   * UBL Step-By-Step submenu
556
+   *
557
+   * << Unified Bed Leveling
558
+   *    1 Build Cold Mesh
559
+   *    2 Smart Fill-in
560
+   *  - 3 Validate Mesh >>
561
+   *    4 Fine Tune All
562
+   *  - 5 Validate Mesh >>
563
+   *    6 Fine Tune All
564
+   *    7 Save Bed Mesh
565
+   */
566
+  void _lcd_ubl_step_by_step() {
567
+    START_MENU();
568
+    BACK_ITEM(MSG_UBL_LEVEL_BED);
569
+    GCODES_ITEM(MSG_UBL_1_BUILD_COLD_MESH, PSTR("G28\nG29 P1"));
570
+    GCODES_ITEM(MSG_UBL_2_SMART_FILLIN, PSTR("G29 P3 T0"));
571
+    SUBMENU(MSG_UBL_3_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh);
572
+    GCODES_ITEM(MSG_UBL_4_FINE_TUNE_ALL, PSTR("G29 P4 R999 T"));
573
+    SUBMENU(MSG_UBL_5_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh);
574
+    GCODES_ITEM(MSG_UBL_6_FINE_TUNE_ALL, PSTR("G29 P4 R999 T"));
575
+    ACTION_ITEM(MSG_UBL_7_SAVE_MESH, _lcd_ubl_save_mesh_cmd);
576
+    END_MENU();
577
+  }
578
+
579
+#endif
563 580
 
564 581
 /**
565 582
  * UBL System submenu
@@ -574,7 +591,6 @@ void _lcd_ubl_step_by_step() {
574 591
  *  - UBL Tools >>
575 592
  *  - Output UBL Info >>
576 593
  */
577
-
578 594
 void _lcd_ubl_level_bed() {
579 595
   START_MENU();
580 596
   BACK_ITEM(MSG_MOTION);
@@ -582,7 +598,9 @@ void _lcd_ubl_level_bed() {
582 598
     GCODES_ITEM(MSG_UBL_DEACTIVATE_MESH, PSTR("G29 D"));
583 599
   else
584 600
     GCODES_ITEM(MSG_UBL_ACTIVATE_MESH, PSTR("G29 A"));
585
-  SUBMENU(MSG_UBL_STEP_BY_STEP_MENU, _lcd_ubl_step_by_step);
601
+  #if ENABLED(G26_MESH_VALIDATION)
602
+    SUBMENU(MSG_UBL_STEP_BY_STEP_MENU, _lcd_ubl_step_by_step);
603
+  #endif
586 604
   ACTION_ITEM(MSG_UBL_MESH_EDIT, _lcd_ubl_output_map_lcd_cmd);
587 605
   SUBMENU(MSG_UBL_STORAGE_MESH_MENU, _lcd_ubl_storage_mesh);
588 606
   SUBMENU(MSG_UBL_OUTPUT_MAP, _lcd_ubl_output_map);

+ 4
- 0
Marlin/src/lcd/ultralcd.cpp View File

@@ -86,6 +86,10 @@ MarlinUI ui;
86 86
   }
87 87
 #endif
88 88
 
89
+#if EITHER(HAS_LCD_MENU, DWIN_CREALITY_LCD)
90
+  preheat_t MarlinUI::material_preset[PREHEAT_COUNT];  // Initialized by settings.load()
91
+#endif
92
+
89 93
 #if HAS_SPI_LCD
90 94
 
91 95
 #if HAS_GRAPHICAL_LCD

+ 12
- 3
Marlin/src/lcd/ultralcd.h View File

@@ -256,6 +256,14 @@
256 256
   };
257 257
 #endif
258 258
 
259
+#if PREHEAT_COUNT
260
+  typedef struct {
261
+    TERN_(HAS_HOTEND,     uint16_t hotend_temp);
262
+    TERN_(HAS_HEATED_BED, uint16_t bed_temp   );
263
+    TERN_(HAS_FAN,        uint16_t fan_speed  );
264
+  } preheat_t;
265
+#endif
266
+
259 267
 ////////////////////////////////////////////
260 268
 //////////// MarlinUI Singleton ////////////
261 269
 ////////////////////////////////////////////
@@ -469,6 +477,10 @@ public:
469 477
     static const char * scrolled_filename(CardReader &theCard, const uint8_t maxlen, uint8_t hash, const bool doScroll);
470 478
   #endif
471 479
 
480
+  #if PREHEAT_COUNT
481
+    static preheat_t material_preset[PREHEAT_COUNT];
482
+  #endif
483
+
472 484
   #if HAS_LCD_MENU
473 485
 
474 486
     #if ENABLED(TOUCH_BUTTONS)
@@ -494,9 +506,6 @@ public:
494 506
       static constexpr int8_t manual_move_e_index = 0;
495 507
     #endif
496 508
 
497
-    static int16_t preheat_hotend_temp[2], preheat_bed_temp[2];
498
-    static uint8_t preheat_fan_speed[2];
499
-
500 509
     // Select Screen (modal NO/YES style dialog)
501 510
     static bool selection;
502 511
     static void set_selection(const bool sel) { selection = sel; }

+ 45
- 66
Marlin/src/module/configuration_store.cpp View File

@@ -37,7 +37,7 @@
37 37
  */
38 38
 
39 39
 // Change EEPROM version if the structure changes
40
-#define EEPROM_VERSION "V80"
40
+#define EEPROM_VERSION "V81"
41 41
 #define EEPROM_OFFSET 100
42 42
 
43 43
 // Check the integrity of data offsets.
@@ -281,11 +281,11 @@ typedef struct SettingsDataStruct {
281 281
   #endif
282 282
 
283 283
   //
284
-  // ULTIPANEL
284
+  // Material Presets
285 285
   //
286
-  int16_t ui_preheat_hotend_temp[2],                    // M145 S0 H
287
-          ui_preheat_bed_temp[2];                       // M145 S0 B
288
-  uint8_t ui_preheat_fan_speed[2];                      // M145 S0 F
286
+  #if PREHEAT_COUNT
287
+    preheat_t ui_material_preset[PREHEAT_COUNT];        // M145 S0 H B F
288
+  #endif
289 289
 
290 290
   //
291 291
   // PIDTEMP
@@ -811,27 +811,10 @@ void MarlinSettings::postprocess() {
811 811
     //
812 812
     // LCD Preheat settings
813 813
     //
814
-    {
815
-      _FIELD_TEST(ui_preheat_hotend_temp);
816
-
817
-      #if HAS_HOTEND && HAS_LCD_MENU
818
-        const int16_t (&ui_preheat_hotend_temp)[2]  = ui.preheat_hotend_temp,
819
-                      (&ui_preheat_bed_temp)[2]     = ui.preheat_bed_temp;
820
-        const uint8_t (&ui_preheat_fan_speed)[2]    = ui.preheat_fan_speed;
821
-      #elif ENABLED(DWIN_CREALITY_LCD)
822
-        const int16_t (&ui_preheat_hotend_temp)[2]  = HMI_ValueStruct.preheat_hotend_temp,
823
-                      (&ui_preheat_bed_temp)[2]     = HMI_ValueStruct.preheat_bed_temp;
824
-        const uint8_t (&ui_preheat_fan_speed)[2]    = HMI_ValueStruct.preheat_fan_speed;
825
-      #else
826
-        constexpr int16_t ui_preheat_hotend_temp[2] = { PREHEAT_1_TEMP_HOTEND, PREHEAT_2_TEMP_HOTEND },
827
-                          ui_preheat_bed_temp[2]    = { PREHEAT_1_TEMP_BED, PREHEAT_2_TEMP_BED };
828
-        constexpr uint8_t ui_preheat_fan_speed[2]   = { PREHEAT_1_FAN_SPEED, PREHEAT_2_FAN_SPEED };
829
-      #endif
830
-
831
-      EEPROM_WRITE(ui_preheat_hotend_temp);
832
-      EEPROM_WRITE(ui_preheat_bed_temp);
833
-      EEPROM_WRITE(ui_preheat_fan_speed);
834
-    }
814
+    #if PREHEAT_COUNT
815
+      _FIELD_TEST(ui_material_preset);
816
+      EEPROM_WRITE(ui.material_preset);
817
+    #endif
835 818
 
836 819
     //
837 820
     // PIDTEMP
@@ -1688,25 +1671,10 @@ void MarlinSettings::postprocess() {
1688 1671
       //
1689 1672
       // LCD Preheat settings
1690 1673
       //
1691
-      {
1692
-        _FIELD_TEST(ui_preheat_hotend_temp);
1693
-
1694
-        #if HAS_HOTEND && HAS_LCD_MENU
1695
-          int16_t (&ui_preheat_hotend_temp)[2]  = ui.preheat_hotend_temp,
1696
-                  (&ui_preheat_bed_temp)[2]     = ui.preheat_bed_temp;
1697
-          uint8_t (&ui_preheat_fan_speed)[2]    = ui.preheat_fan_speed;
1698
-       #elif ENABLED(DWIN_CREALITY_LCD)
1699
-          int16_t (&ui_preheat_hotend_temp)[2]  = HMI_ValueStruct.preheat_hotend_temp,
1700
-                  (&ui_preheat_bed_temp)[2]     = HMI_ValueStruct.preheat_bed_temp;
1701
-          uint8_t (&ui_preheat_fan_speed)[2]    = HMI_ValueStruct.preheat_fan_speed;
1702
-       #else
1703
-          int16_t ui_preheat_hotend_temp[2], ui_preheat_bed_temp[2];
1704
-          uint8_t ui_preheat_fan_speed[2];
1705
-        #endif
1706
-        EEPROM_READ(ui_preheat_hotend_temp); // 2 floats
1707
-        EEPROM_READ(ui_preheat_bed_temp);    // 2 floats
1708
-        EEPROM_READ(ui_preheat_fan_speed);   // 2 floats
1709
-      }
1674
+      #if PREHEAT_COUNT
1675
+        _FIELD_TEST(ui_material_preset);
1676
+        EEPROM_READ(ui.material_preset);
1677
+      #endif
1710 1678
 
1711 1679
       //
1712 1680
       // Hotend PID
@@ -2587,22 +2555,27 @@ void MarlinSettings::reset() {
2587 2555
   //
2588 2556
   // Preheat parameters
2589 2557
   //
2590
-  #if HAS_HOTEND
2591
-    #if ENABLED(DWIN_CREALITY_LCD)
2592
-      HMI_ValueStruct.preheat_hotend_temp[0] = PREHEAT_1_TEMP_HOTEND;
2593
-      HMI_ValueStruct.preheat_hotend_temp[1] = PREHEAT_2_TEMP_HOTEND;
2594
-      HMI_ValueStruct.preheat_bed_temp[0] = PREHEAT_1_TEMP_BED;
2595
-      HMI_ValueStruct.preheat_bed_temp[1] = PREHEAT_2_TEMP_BED;
2596
-      HMI_ValueStruct.preheat_fan_speed[0] = PREHEAT_1_FAN_SPEED;
2597
-      HMI_ValueStruct.preheat_fan_speed[1] = PREHEAT_2_FAN_SPEED;
2598
-    #elif HAS_LCD_MENU
2599
-      ui.preheat_hotend_temp[0] = PREHEAT_1_TEMP_HOTEND;
2600
-      ui.preheat_hotend_temp[1] = PREHEAT_2_TEMP_HOTEND;
2601
-      ui.preheat_bed_temp[0] = PREHEAT_1_TEMP_BED;
2602
-      ui.preheat_bed_temp[1] = PREHEAT_2_TEMP_BED;
2603
-      ui.preheat_fan_speed[0] = PREHEAT_1_FAN_SPEED;
2604
-      ui.preheat_fan_speed[1] = PREHEAT_2_FAN_SPEED;
2558
+  #if PREHEAT_COUNT
2559
+    #if HAS_HOTEND
2560
+      constexpr uint16_t hpre[] = ARRAY_N(PREHEAT_COUNT, PREHEAT_1_TEMP_HOTEND, PREHEAT_2_TEMP_HOTEND, PREHEAT_3_TEMP_HOTEND, PREHEAT_4_TEMP_HOTEND, PREHEAT_5_TEMP_HOTEND);
2605 2561
     #endif
2562
+    #if HAS_HEATED_BED
2563
+      constexpr uint16_t bpre[] = ARRAY_N(PREHEAT_COUNT, PREHEAT_1_TEMP_BED, PREHEAT_2_TEMP_BED, PREHEAT_3_TEMP_BED, PREHEAT_4_TEMP_BED, PREHEAT_5_TEMP_BED);
2564
+    #endif
2565
+    #if HAS_FAN
2566
+      constexpr uint8_t fpre[] = ARRAY_N(PREHEAT_COUNT, PREHEAT_1_FAN_SPEED, PREHEAT_2_FAN_SPEED, PREHEAT_3_FAN_SPEED, PREHEAT_4_FAN_SPEED, PREHEAT_5_FAN_SPEED);
2567
+    #endif
2568
+    LOOP_L_N(i, PREHEAT_COUNT) {
2569
+      #if HAS_HOTEND
2570
+        ui.material_preset[i].hotend_temp = hpre[i];
2571
+      #endif
2572
+      #if HAS_HEATED_BED
2573
+        ui.material_preset[i].bed_temp = bpre[i];
2574
+      #endif
2575
+      #if HAS_FAN
2576
+        ui.material_preset[i].fan_speed = fpre[i];
2577
+      #endif
2578
+    }
2606 2579
   #endif
2607 2580
 
2608 2581
   //
@@ -3131,16 +3104,22 @@ void MarlinSettings::reset() {
3131 3104
 
3132 3105
     #endif // [XYZ]_DUAL_ENDSTOPS
3133 3106
 
3134
-    #if HAS_HOTEND && HAS_LCD_MENU
3107
+    #if PREHEAT_COUNT
3135 3108
 
3136 3109
       CONFIG_ECHO_HEADING("Material heatup parameters:");
3137
-      LOOP_L_N(i, COUNT(ui.preheat_hotend_temp)) {
3110
+      LOOP_L_N(i, PREHEAT_COUNT) {
3138 3111
         CONFIG_ECHO_START();
3139 3112
         SERIAL_ECHOLNPAIR(
3140
-            "  M145 S", (int)i
3141
-          , " H", TEMP_UNIT(ui.preheat_hotend_temp[i])
3142
-          , " B", TEMP_UNIT(ui.preheat_bed_temp[i])
3143
-          , " F", int(ui.preheat_fan_speed[i])
3113
+          "  M145 S", (int)i
3114
+          #if HAS_HOTEND
3115
+            , " H", TEMP_UNIT(ui.material_preset[i].hotend_temp)
3116
+          #endif
3117
+          #if HAS_HEATED_BED
3118
+            , " B", TEMP_UNIT(ui.material_preset[i].bed_temp)
3119
+          #endif
3120
+          #if HAS_FAN
3121
+            , " F", ui.material_preset[i].fan_speed
3122
+          #endif
3144 3123
         );
3145 3124
       }
3146 3125
 

+ 1
- 1
Marlin/src/module/temperature.cpp View File

@@ -3128,7 +3128,7 @@ void Temperature::tick() {
3128 3128
         #if ENABLED(DWIN_CREALITY_LCD)
3129 3129
           HMI_flag.heat_flag = 0;
3130 3130
           duration_t elapsed = print_job_timer.duration();  // print timer
3131
-          heat_time = elapsed.value;
3131
+          dwin_heat_time = elapsed.value;
3132 3132
         #else
3133 3133
           ui.reset_status();
3134 3134
         #endif

+ 1
- 1
Marlin/src/module/temperature.h View File

@@ -797,7 +797,7 @@ class Temperature {
797 797
 
798 798
     TERN_(HAS_DISPLAY, static void set_heating_message(const uint8_t e));
799 799
 
800
-    #if HAS_LCD_MENU
800
+    #if HAS_LCD_MENU && HAS_TEMPERATURE
801 801
       static void lcd_preheat(const int16_t e, const int8_t indh, const int8_t indb);
802 802
     #endif
803 803
 

Loading…
Cancel
Save