Browse Source

Move Filament Change Menu to its own file

Scott Lahteine 6 years ago
parent
commit
9f11e0284c
2 changed files with 581 additions and 566 deletions
  1. 0
    566
      Marlin/src/lcd/menu/menu.cpp
  2. 581
    0
      Marlin/src/lcd/menu/menu_filament.cpp

+ 0
- 566
Marlin/src/lcd/menu/menu.cpp View File

@@ -28,7 +28,6 @@
28 28
 
29 29
 #include "../ultralcd.h"
30 30
 #include "../../sd/cardreader.h"
31
-#include "../../module/temperature.h"
32 31
 #include "../../module/planner.h"
33 32
 #include "../../module/motion.h"
34 33
 #include "../../module/probe.h"
@@ -243,14 +242,6 @@ void menu_action_setting_edit_callback_bool(PGM_P pstr, bool* ptr, screenFunc_t
243 242
 ///////////////// Menu Tree ////////////////
244 243
 ////////////////////////////////////////////
245 244
 
246
-#if ENABLED(ADVANCED_PAUSE_FEATURE)
247
-  #if E_STEPPERS > 1 || ENABLED(FILAMENT_LOAD_UNLOAD_GCODES)
248
-    void menu_change_filament();
249
-  #else
250
-    void menu_temp_e0_filament_change();
251
-  #endif
252
-#endif
253
-
254 245
 #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
255 246
   float lcd_z_fade_height;
256 247
   void _lcd_set_z_fade_height() { set_z_fade_height(lcd_z_fade_height); }
@@ -910,561 +901,4 @@ void _lcd_draw_homing() {
910 901
 
911 902
 #endif // LED_CONTROL_MENU
912 903
 
913
-/**
914
- *
915
- * Filament Change Feature Screens
916
- *
917
- */
918
-#if ENABLED(ADVANCED_PAUSE_FEATURE)
919
-
920
-  /**
921
-   *
922
-   * "Change Filament" > "Change/Unload/Load Filament" submenu
923
-   *
924
-   */
925
-  static AdvancedPauseMode _change_filament_temp_mode; // =ADVANCED_PAUSE_MODE_PAUSE_PRINT
926
-  static int8_t _change_filament_temp_extruder; // =0
927
-
928
-  static PGM_P _change_filament_temp_command() {
929
-    switch (_change_filament_temp_mode) {
930
-      case ADVANCED_PAUSE_MODE_LOAD_FILAMENT:
931
-        return PSTR("M701 T%d");
932
-      case ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT:
933
-        return _change_filament_temp_extruder >= 0 ? PSTR("M702 T%d") : PSTR("M702 ;%d");
934
-      case ADVANCED_PAUSE_MODE_PAUSE_PRINT:
935
-      default:
936
-        return PSTR("M600 B0 T%d");
937
-    }
938
-    return PSTR(MSG_FILAMENTCHANGE);
939
-  }
940
-
941
-  void _change_filament_temp(const uint16_t temperature) {
942
-    char cmd[11];
943
-    sprintf_P(cmd, _change_filament_temp_command(), _change_filament_temp_extruder);
944
-    thermalManager.setTargetHotend(temperature, _change_filament_temp_extruder);
945
-    lcd_enqueue_command(cmd);
946
-  }
947
-  void _menu_change_filament_temp_1() { _change_filament_temp(PREHEAT_1_TEMP_HOTEND); }
948
-  void _menu_change_filament_temp_2() { _change_filament_temp(PREHEAT_2_TEMP_HOTEND); }
949
-  void _menu_change_filament_temp_custom() { _change_filament_temp(thermalManager.target_temperature[_change_filament_temp_extruder]); }
950
-
951
-  static PGM_P change_filament_header(const AdvancedPauseMode mode) {
952
-    switch (mode) {
953
-      case ADVANCED_PAUSE_MODE_LOAD_FILAMENT:
954
-        return PSTR(MSG_FILAMENTLOAD);
955
-      case ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT:
956
-        return PSTR(MSG_FILAMENTUNLOAD);
957
-      default: break;
958
-    }
959
-    return PSTR(MSG_FILAMENTCHANGE);
960
-  }
961
-
962
-  void _menu_temp_filament_op(const AdvancedPauseMode mode, const int8_t extruder) {
963
-    _change_filament_temp_mode = mode;
964
-    _change_filament_temp_extruder = extruder;
965
-    START_MENU();
966
-    if (LCD_HEIGHT >= 4) STATIC_ITEM_P(change_filament_header(mode), true, true);
967
-    MENU_BACK(MSG_BACK);
968
-    MENU_ITEM(submenu, MSG_PREHEAT_1, _menu_change_filament_temp_1);
969
-    MENU_ITEM(submenu, MSG_PREHEAT_2, _menu_change_filament_temp_2);
970
-    uint16_t max_temp;
971
-    switch (extruder) {
972
-      default: max_temp = HEATER_0_MAXTEMP;
973
-      #if HOTENDS > 1
974
-        case 1: max_temp = HEATER_1_MAXTEMP; break;
975
-        #if HOTENDS > 2
976
-          case 2: max_temp = HEATER_2_MAXTEMP; break;
977
-          #if HOTENDS > 3
978
-            case 3: max_temp = HEATER_3_MAXTEMP; break;
979
-            #if HOTENDS > 4
980
-              case 4: max_temp = HEATER_4_MAXTEMP; break;
981
-              #if HOTENDS > 5
982
-                case 5: max_temp = HEATER_5_MAXTEMP; break;
983
-              #endif
984
-            #endif
985
-          #endif
986
-        #endif
987
-      #endif
988
-    }
989
-    MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_PREHEAT_CUSTOM, &thermalManager.target_temperature[_change_filament_temp_extruder], EXTRUDE_MINTEMP, max_temp - 15, _menu_change_filament_temp_custom);
990
-    END_MENU();
991
-  }
992
-  void menu_temp_e0_filament_change()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_PAUSE_PRINT, 0); }
993
-  void menu_temp_e0_filament_load()    { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_LOAD_FILAMENT, 0); }
994
-  void menu_temp_e0_filament_unload()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, 0); }
995
-  #if E_STEPPERS > 1
996
-    void menu_temp_e1_filament_change()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_PAUSE_PRINT, 1); }
997
-    void menu_temp_e1_filament_load()    { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_LOAD_FILAMENT, 1); }
998
-    void menu_temp_e1_filament_unload()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, 1); }
999
-    #if ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS)
1000
-      void menu_unload_filament_all_temp() { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, -1); }
1001
-    #endif
1002
-    #if E_STEPPERS > 2
1003
-      void menu_temp_e2_filament_change()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_PAUSE_PRINT, 2); }
1004
-      void menu_temp_e2_filament_load()    { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_LOAD_FILAMENT, 2); }
1005
-      void menu_temp_e2_filament_unload()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, 2); }
1006
-      #if E_STEPPERS > 3
1007
-        void menu_temp_e3_filament_change()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_PAUSE_PRINT, 3); }
1008
-        void menu_temp_e3_filament_load()    { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_LOAD_FILAMENT, 3); }
1009
-        void menu_temp_e3_filament_unload()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, 3); }
1010
-        #if E_STEPPERS > 4
1011
-          void menu_temp_e4_filament_change()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_PAUSE_PRINT, 4); }
1012
-          void menu_temp_e4_filament_load()    { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_LOAD_FILAMENT, 4); }
1013
-          void menu_temp_e4_filament_unload()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, 4); }
1014
-        #endif // E_STEPPERS > 4
1015
-      #endif // E_STEPPERS > 3
1016
-    #endif // E_STEPPERS > 2
1017
-  #endif // E_STEPPERS > 1
1018
-
1019
-  /**
1020
-   *
1021
-   * "Change Filament" submenu
1022
-   *
1023
-   */
1024
-  #if E_STEPPERS > 1 || ENABLED(FILAMENT_LOAD_UNLOAD_GCODES)
1025
-    void menu_change_filament() {
1026
-      START_MENU();
1027
-      MENU_BACK(MSG_MAIN);
1028
-
1029
-      // Change filament
1030
-      #if E_STEPPERS == 1
1031
-        PGM_P msg0 = PSTR(MSG_FILAMENTCHANGE);
1032
-        if (thermalManager.targetTooColdToExtrude(active_extruder))
1033
-          MENU_ITEM_P(submenu, msg0, menu_temp_e0_filament_change);
1034
-        else
1035
-          MENU_ITEM_P(gcode, msg0, PSTR("M600 B0"));
1036
-      #else
1037
-        PGM_P msg0 = PSTR(MSG_FILAMENTCHANGE " " MSG_E1);
1038
-        PGM_P msg1 = PSTR(MSG_FILAMENTCHANGE " " MSG_E2);
1039
-        if (thermalManager.targetTooColdToExtrude(0))
1040
-          MENU_ITEM_P(submenu, msg0, menu_temp_e0_filament_change);
1041
-        else
1042
-          MENU_ITEM_P(gcode, msg0, PSTR("M600 B0 T0"));
1043
-        if (thermalManager.targetTooColdToExtrude(1))
1044
-          MENU_ITEM_P(submenu, msg1, menu_temp_e1_filament_change);
1045
-        else
1046
-          MENU_ITEM_P(gcode, msg1, PSTR("M600 B0 T1"));
1047
-        #if E_STEPPERS > 2
1048
-          PGM_P msg2 = PSTR(MSG_FILAMENTCHANGE " " MSG_E3);
1049
-          if (thermalManager.targetTooColdToExtrude(2))
1050
-            MENU_ITEM_P(submenu, msg2, menu_temp_e2_filament_change);
1051
-          else
1052
-            MENU_ITEM_P(gcode, msg2, PSTR("M600 B0 T2"));
1053
-          #if E_STEPPERS > 3
1054
-            PGM_P msg3 = PSTR(MSG_FILAMENTCHANGE " " MSG_E4);
1055
-            if (thermalManager.targetTooColdToExtrude(3))
1056
-              MENU_ITEM_P(submenu, msg3, menu_temp_e3_filament_change);
1057
-            else
1058
-              MENU_ITEM_P(gcode, msg3, PSTR("M600 B0 T3"));
1059
-            #if E_STEPPERS > 4
1060
-              PGM_P msg4 = PSTR(MSG_FILAMENTCHANGE " " MSG_E5);
1061
-              if (thermalManager.targetTooColdToExtrude(4))
1062
-                MENU_ITEM_P(submenu, msg4, menu_temp_e4_filament_change);
1063
-              else
1064
-                MENU_ITEM_P(gcode, msg4, PSTR("M600 B0 T4"));
1065
-              #if E_STEPPERS > 5
1066
-                PGM_P msg5 = PSTR(MSG_FILAMENTCHANGE " " MSG_E6);
1067
-                if (thermalManager.targetTooColdToExtrude(5))
1068
-                  MENU_ITEM_P(submenu, msg5, menu_temp_e5_filament_change);
1069
-                else
1070
-                  MENU_ITEM_P(gcode, msg5, PSTR("M600 B0 T5"));
1071
-              #endif // E_STEPPERS > 5
1072
-            #endif // E_STEPPERS > 4
1073
-          #endif // E_STEPPERS > 3
1074
-        #endif // E_STEPPERS > 2
1075
-      #endif // E_STEPPERS == 1
1076
-
1077
-      #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES)
1078
-        if (!printer_busy()) {
1079
-          // Load filament
1080
-          #if E_STEPPERS == 1
1081
-            PGM_P msg0 = PSTR(MSG_FILAMENTLOAD);
1082
-            if (thermalManager.targetTooColdToExtrude(active_extruder))
1083
-              MENU_ITEM_P(submenu, msg0, menu_temp_e0_filament_load);
1084
-            else
1085
-              MENU_ITEM_P(gcode, msg0, PSTR("M701"));
1086
-          #else
1087
-            PGM_P msg0 = PSTR(MSG_FILAMENTLOAD " " MSG_E1);
1088
-            PGM_P msg1 = PSTR(MSG_FILAMENTLOAD " " MSG_E2);
1089
-            if (thermalManager.targetTooColdToExtrude(0))
1090
-              MENU_ITEM_P(submenu, msg0, menu_temp_e0_filament_load);
1091
-            else
1092
-              MENU_ITEM_P(gcode, msg0, PSTR("M701 T0"));
1093
-            if (thermalManager.targetTooColdToExtrude(1))
1094
-              MENU_ITEM_P(submenu, msg1, menu_temp_e1_filament_load);
1095
-            else
1096
-              MENU_ITEM_P(gcode, msg1, PSTR("M701 T1"));
1097
-            #if E_STEPPERS > 2
1098
-              PGM_P msg2 = PSTR(MSG_FILAMENTLOAD " " MSG_E3);
1099
-              if (thermalManager.targetTooColdToExtrude(2))
1100
-                MENU_ITEM_P(submenu, msg2, menu_temp_e2_filament_load);
1101
-              else
1102
-                MENU_ITEM_P(gcode, msg2, PSTR("M701 T2"));
1103
-              #if E_STEPPERS > 3
1104
-                PGM_P msg3 = PSTR(MSG_FILAMENTLOAD " " MSG_E4);
1105
-                if (thermalManager.targetTooColdToExtrude(3))
1106
-                  MENU_ITEM_P(submenu, msg3, menu_temp_e3_filament_load);
1107
-                else
1108
-                  MENU_ITEM_P(gcode, msg3, PSTR("M701 T3"));
1109
-                #if E_STEPPERS > 4
1110
-                  PGM_P msg4 = PSTR(MSG_FILAMENTLOAD " " MSG_E5);
1111
-                  if (thermalManager.targetTooColdToExtrude(4))
1112
-                    MENU_ITEM_P(submenu, msg4, menu_temp_e4_filament_load);
1113
-                  else
1114
-                    MENU_ITEM_P(gcode, msg4, PSTR("M701 T4"));
1115
-                  #if E_STEPPERS > 5
1116
-                    PGM_P msg5 = PSTR(MSG_FILAMENTLOAD " " MSG_E6);
1117
-                    if (thermalManager.targetTooColdToExtrude(5))
1118
-                      MENU_ITEM_P(submenu, msg5, menu_temp_e5_filament_load);
1119
-                    else
1120
-                      MENU_ITEM_P(gcode, msg5, PSTR("M701 T5"));
1121
-                  #endif // E_STEPPERS > 5
1122
-                #endif // E_STEPPERS > 4
1123
-              #endif // E_STEPPERS > 3
1124
-            #endif // E_STEPPERS > 2
1125
-          #endif // E_STEPPERS == 1
1126
-
1127
-          // Unload filament
1128
-          #if E_STEPPERS == 1
1129
-            if (thermalManager.targetHotEnoughToExtrude(active_extruder))
1130
-              MENU_ITEM(gcode, MSG_FILAMENTUNLOAD, PSTR("M702"));
1131
-            else
1132
-              MENU_ITEM(submenu, MSG_FILAMENTUNLOAD, menu_temp_e0_filament_unload);
1133
-          #else
1134
-            #if ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS)
1135
-              if (thermalManager.targetHotEnoughToExtrude(0)
1136
-                #if E_STEPPERS > 1
1137
-                  && thermalManager.targetHotEnoughToExtrude(1)
1138
-                  #if E_STEPPERS > 2
1139
-                    && thermalManager.targetHotEnoughToExtrude(2)
1140
-                    #if E_STEPPERS > 3
1141
-                      && thermalManager.targetHotEnoughToExtrude(3)
1142
-                      #if E_STEPPERS > 4
1143
-                        && thermalManager.targetHotEnoughToExtrude(4)
1144
-                        #if E_STEPPERS > 5
1145
-                          && thermalManager.targetHotEnoughToExtrude(5)
1146
-                        #endif // E_STEPPERS > 5
1147
-                      #endif // E_STEPPERS > 4
1148
-                    #endif // E_STEPPERS > 3
1149
-                  #endif // E_STEPPERS > 2
1150
-                #endif // E_STEPPERS > 1
1151
-              )
1152
-                MENU_ITEM(gcode, MSG_FILAMENTUNLOAD_ALL, PSTR("M702"));
1153
-            else
1154
-              MENU_ITEM(submenu, MSG_FILAMENTUNLOAD_ALL, menu_unload_filament_all_temp);
1155
-            #endif
1156
-            if (thermalManager.targetHotEnoughToExtrude(0))
1157
-              MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E1, PSTR("M702 T0"));
1158
-            else
1159
-              MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E1, menu_temp_e0_filament_unload);
1160
-            if (thermalManager.targetHotEnoughToExtrude(1))
1161
-              MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E2, PSTR("M702 T1"));
1162
-            else
1163
-              MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E2, menu_temp_e1_filament_unload);
1164
-            #if E_STEPPERS > 2
1165
-              if (thermalManager.targetHotEnoughToExtrude(2))
1166
-                MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E3, PSTR("M702 T2"));
1167
-              else
1168
-                MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E3, menu_temp_e2_filament_unload);
1169
-              #if E_STEPPERS > 3
1170
-                if (thermalManager.targetHotEnoughToExtrude(3))
1171
-                  MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E4, PSTR("M702 T3"));
1172
-                else
1173
-                  MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E4, menu_temp_e3_filament_unload);
1174
-                #if E_STEPPERS > 4
1175
-                  if (thermalManager.targetHotEnoughToExtrude(4))
1176
-                    MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E5, PSTR("M702 T4"));
1177
-                  else
1178
-                    MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E5, menu_temp_e4_filament_unload);
1179
-                  #if E_STEPPERS > 5
1180
-                    if (thermalManager.targetHotEnoughToExtrude(5))
1181
-                      MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E6, PSTR("M702 T5"));
1182
-                    else
1183
-                      MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E6, menu_temp_e5_filament_unload);
1184
-                  #endif // E_STEPPERS > 5
1185
-                #endif // E_STEPPERS > 4
1186
-              #endif // E_STEPPERS > 3
1187
-            #endif // E_STEPPERS > 2
1188
-          #endif // E_STEPPERS == 1
1189
-        }
1190
-      #endif
1191
-
1192
-      END_MENU();
1193
-    }
1194
-  #endif
1195
-
1196
-  static AdvancedPauseMode advanced_pause_mode = ADVANCED_PAUSE_MODE_PAUSE_PRINT;
1197
-  static uint8_t hotend_status_extruder = 0;
1198
-
1199
-  static PGM_P advanced_pause_header() {
1200
-    switch (advanced_pause_mode) {
1201
-      case ADVANCED_PAUSE_MODE_LOAD_FILAMENT:
1202
-        return PSTR(MSG_FILAMENT_CHANGE_HEADER_LOAD);
1203
-      case ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT:
1204
-        return PSTR(MSG_FILAMENT_CHANGE_HEADER_UNLOAD);
1205
-      default: break;
1206
-    }
1207
-    return PSTR(MSG_FILAMENT_CHANGE_HEADER_PAUSE);
1208
-  }
1209
-
1210
-  // Portions from STATIC_ITEM...
1211
-  #define HOTEND_STATUS_ITEM() do { \
1212
-    if (_menuLineNr == _thisItemNr) { \
1213
-      if (lcdDrawUpdate) { \
1214
-        lcd_implementation_drawmenu_static(_lcdLineNr, PSTR(MSG_FILAMENT_CHANGE_NOZZLE), false, true); \
1215
-        lcd_implementation_hotend_status(_lcdLineNr, hotend_status_extruder); \
1216
-      } \
1217
-      if (_skipStatic && encoderLine <= _thisItemNr) { \
1218
-        encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \
1219
-        ++encoderLine; \
1220
-      } \
1221
-      lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; \
1222
-    } \
1223
-    ++_thisItemNr; \
1224
-  }while(0)
1225
-
1226
-  void lcd_advanced_pause_resume_print() {
1227
-    advanced_pause_menu_response = ADVANCED_PAUSE_RESPONSE_RESUME_PRINT;
1228
-  }
1229
-
1230
-  void lcd_advanced_pause_extrude_more() {
1231
-    advanced_pause_menu_response = ADVANCED_PAUSE_RESPONSE_EXTRUDE_MORE;
1232
-  }
1233
-
1234
-  void menu_advanced_pause_option() {
1235
-    START_MENU();
1236
-    #if LCD_HEIGHT > 2
1237
-      STATIC_ITEM(MSG_FILAMENT_CHANGE_OPTION_HEADER, true, false);
1238
-    #endif
1239
-    MENU_ITEM(function, MSG_FILAMENT_CHANGE_OPTION_RESUME, lcd_advanced_pause_resume_print);
1240
-    MENU_ITEM(function, MSG_FILAMENT_CHANGE_OPTION_PURGE, lcd_advanced_pause_extrude_more);
1241
-    END_MENU();
1242
-  }
1243
-
1244
-  void lcd_advanced_pause_init_message() {
1245
-    START_SCREEN();
1246
-    STATIC_ITEM_P(advanced_pause_header(), true, true);
1247
-    STATIC_ITEM(MSG_FILAMENT_CHANGE_INIT_1);
1248
-    #ifdef MSG_FILAMENT_CHANGE_INIT_2
1249
-      STATIC_ITEM(MSG_FILAMENT_CHANGE_INIT_2);
1250
-      #define __FC_LINES_A 3
1251
-    #else
1252
-      #define __FC_LINES_A 2
1253
-    #endif
1254
-    #ifdef MSG_FILAMENT_CHANGE_INIT_3
1255
-      STATIC_ITEM(MSG_FILAMENT_CHANGE_INIT_3);
1256
-      #define _FC_LINES_A (__FC_LINES_A + 1)
1257
-    #else
1258
-      #define _FC_LINES_A __FC_LINES_A
1259
-    #endif
1260
-    #if LCD_HEIGHT > _FC_LINES_A + 1
1261
-      STATIC_ITEM(" ");
1262
-    #endif
1263
-    HOTEND_STATUS_ITEM();
1264
-    END_SCREEN();
1265
-  }
1266
-
1267
-  void lcd_advanced_pause_unload_message() {
1268
-    START_SCREEN();
1269
-    STATIC_ITEM_P(advanced_pause_header(), true, true);
1270
-    STATIC_ITEM(MSG_FILAMENT_CHANGE_UNLOAD_1);
1271
-    #ifdef MSG_FILAMENT_CHANGE_UNLOAD_2
1272
-      STATIC_ITEM(MSG_FILAMENT_CHANGE_UNLOAD_2);
1273
-      #define __FC_LINES_B 3
1274
-    #else
1275
-      #define __FC_LINES_B 2
1276
-    #endif
1277
-    #ifdef MSG_FILAMENT_CHANGE_UNLOAD_3
1278
-      STATIC_ITEM(MSG_FILAMENT_CHANGE_UNLOAD_3);
1279
-      #define _FC_LINES_B (__FC_LINES_B + 1)
1280
-    #else
1281
-      #define _FC_LINES_B __FC_LINES_B
1282
-    #endif
1283
-    #if LCD_HEIGHT > _FC_LINES_B + 1
1284
-      STATIC_ITEM(" ");
1285
-    #endif
1286
-    HOTEND_STATUS_ITEM();
1287
-    END_SCREEN();
1288
-  }
1289
-
1290
-  void lcd_advanced_pause_wait_for_nozzles_to_heat() {
1291
-    START_SCREEN();
1292
-    STATIC_ITEM_P(advanced_pause_header(), true, true);
1293
-    STATIC_ITEM(MSG_FILAMENT_CHANGE_HEATING_1);
1294
-    #ifdef MSG_FILAMENT_CHANGE_HEATING_2
1295
-      STATIC_ITEM(MSG_FILAMENT_CHANGE_HEATING_2);
1296
-      #define _FC_LINES_C 3
1297
-    #else
1298
-      #define _FC_LINES_C 2
1299
-    #endif
1300
-    #if LCD_HEIGHT > _FC_LINES_C + 1
1301
-      STATIC_ITEM(" ");
1302
-    #endif
1303
-    HOTEND_STATUS_ITEM();
1304
-    END_SCREEN();
1305
-  }
1306
-
1307
-  void lcd_advanced_pause_heat_nozzle() {
1308
-    START_SCREEN();
1309
-    STATIC_ITEM_P(advanced_pause_header(), true, true);
1310
-    STATIC_ITEM(MSG_FILAMENT_CHANGE_HEAT_1);
1311
-    #ifdef MSG_FILAMENT_CHANGE_INSERT_2
1312
-      STATIC_ITEM(MSG_FILAMENT_CHANGE_HEAT_2);
1313
-      #define _FC_LINES_D 3
1314
-    #else
1315
-      #define _FC_LINES_D 2
1316
-    #endif
1317
-    #if LCD_HEIGHT > _FC_LINES_D + 1
1318
-      STATIC_ITEM(" ");
1319
-    #endif
1320
-    HOTEND_STATUS_ITEM();
1321
-    END_SCREEN();
1322
-  }
1323
-
1324
-  void lcd_advanced_pause_insert_message() {
1325
-    START_SCREEN();
1326
-    STATIC_ITEM_P(advanced_pause_header(), true, true);
1327
-    STATIC_ITEM(MSG_FILAMENT_CHANGE_INSERT_1);
1328
-    #ifdef MSG_FILAMENT_CHANGE_INSERT_2
1329
-      STATIC_ITEM(MSG_FILAMENT_CHANGE_INSERT_2);
1330
-      #define __FC_LINES_E 3
1331
-    #else
1332
-      #define __FC_LINES_E 2
1333
-    #endif
1334
-    #ifdef MSG_FILAMENT_CHANGE_INSERT_3
1335
-      STATIC_ITEM(MSG_FILAMENT_CHANGE_INSERT_3);
1336
-      #define _FC_LINES_E (__FC_LINES_E + 1)
1337
-    #else
1338
-      #define _FC_LINES_E __FC_LINES_E
1339
-    #endif
1340
-    #if LCD_HEIGHT > _FC_LINES_E + 1
1341
-      STATIC_ITEM(" ");
1342
-    #endif
1343
-    HOTEND_STATUS_ITEM();
1344
-    END_SCREEN();
1345
-  }
1346
-
1347
-  void lcd_advanced_pause_load_message() {
1348
-    START_SCREEN();
1349
-    STATIC_ITEM_P(advanced_pause_header(), true, true);
1350
-    STATIC_ITEM(MSG_FILAMENT_CHANGE_LOAD_1);
1351
-    #ifdef MSG_FILAMENT_CHANGE_LOAD_2
1352
-      STATIC_ITEM(MSG_FILAMENT_CHANGE_LOAD_2);
1353
-      #define __FC_LINES_F 3
1354
-    #else
1355
-      #define __FC_LINES_F 2
1356
-    #endif
1357
-    #ifdef MSG_FILAMENT_CHANGE_LOAD_3
1358
-      STATIC_ITEM(MSG_FILAMENT_CHANGE_LOAD_3);
1359
-      #define _FC_LINES_F (__FC_LINES_F + 1)
1360
-    #else
1361
-      #define _FC_LINES_F __FC_LINES_F
1362
-    #endif
1363
-    #if LCD_HEIGHT > _FC_LINES_F + 1
1364
-      STATIC_ITEM(" ");
1365
-    #endif
1366
-    HOTEND_STATUS_ITEM();
1367
-    END_SCREEN();
1368
-  }
1369
-
1370
-  void lcd_advanced_pause_purge_message() {
1371
-    START_SCREEN();
1372
-    STATIC_ITEM_P(advanced_pause_header(), true, true);
1373
-    STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_1);
1374
-    #ifdef MSG_FILAMENT_CHANGE_PURGE_2
1375
-      STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_2);
1376
-      #define __FC_LINES_G 3
1377
-    #else
1378
-      #define __FC_LINES_G 2
1379
-    #endif
1380
-    #ifdef MSG_FILAMENT_CHANGE_PURGE_3
1381
-      STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_3);
1382
-      #define _FC_LINES_G (__FC_LINES_G + 1)
1383
-    #else
1384
-      #define _FC_LINES_G __FC_LINES_G
1385
-    #endif
1386
-    #if LCD_HEIGHT > _FC_LINES_G + 1
1387
-      STATIC_ITEM(" ");
1388
-    #endif
1389
-    HOTEND_STATUS_ITEM();
1390
-    END_SCREEN();
1391
-  }
1392
-
1393
-  #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE)
1394
-    void menu_advanced_pause_continuous_purge() {
1395
-      START_SCREEN();
1396
-      STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_1);
1397
-      #ifdef MSG_FILAMENT_CHANGE_PURGE_2
1398
-        STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_2);
1399
-        #define __FC_LINES_G 3
1400
-      #else
1401
-        #define __FC_LINES_G 2
1402
-      #endif
1403
-      #ifdef MSG_FILAMENT_CHANGE_PURGE_3
1404
-        STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_3);
1405
-        #define _FC_LINES_G (__FC_LINES_G + 1)
1406
-      #else
1407
-        #define _FC_LINES_G __FC_LINES_G
1408
-      #endif
1409
-      #if LCD_HEIGHT > _FC_LINES_G + 1
1410
-        STATIC_ITEM(" ");
1411
-      #endif
1412
-      HOTEND_STATUS_ITEM();
1413
-      STATIC_ITEM(MSG_USERWAIT);
1414
-      END_SCREEN();
1415
-    }
1416
-  #endif
1417
-
1418
-  void lcd_advanced_pause_resume_message() {
1419
-    START_SCREEN();
1420
-    STATIC_ITEM_P(advanced_pause_header(), true, true);
1421
-    STATIC_ITEM(MSG_FILAMENT_CHANGE_RESUME_1);
1422
-    #ifdef MSG_FILAMENT_CHANGE_RESUME_2
1423
-      STATIC_ITEM(MSG_FILAMENT_CHANGE_RESUME_2);
1424
-    #endif
1425
-    #ifdef MSG_FILAMENT_CHANGE_RESUME_3
1426
-      STATIC_ITEM(MSG_FILAMENT_CHANGE_RESUME_3);
1427
-    #endif
1428
-    END_SCREEN();
1429
-  }
1430
-
1431
-  FORCE_INLINE screenFunc_t ap_message_screen(const AdvancedPauseMessage message) {
1432
-    switch (message) {
1433
-      case ADVANCED_PAUSE_MESSAGE_INIT: return lcd_advanced_pause_init_message;
1434
-      case ADVANCED_PAUSE_MESSAGE_UNLOAD: return lcd_advanced_pause_unload_message;
1435
-      case ADVANCED_PAUSE_MESSAGE_INSERT: return lcd_advanced_pause_insert_message;
1436
-      case ADVANCED_PAUSE_MESSAGE_LOAD: return lcd_advanced_pause_load_message;
1437
-      case ADVANCED_PAUSE_MESSAGE_PURGE: return lcd_advanced_pause_purge_message;
1438
-      case ADVANCED_PAUSE_MESSAGE_RESUME: return lcd_advanced_pause_resume_message;
1439
-      case ADVANCED_PAUSE_MESSAGE_CLICK_TO_HEAT_NOZZLE: return lcd_advanced_pause_heat_nozzle;
1440
-      case ADVANCED_PAUSE_MESSAGE_WAIT_FOR_NOZZLES_TO_HEAT: return lcd_advanced_pause_wait_for_nozzles_to_heat;
1441
-      case ADVANCED_PAUSE_MESSAGE_OPTION: advanced_pause_menu_response = ADVANCED_PAUSE_RESPONSE_WAIT_FOR;
1442
-                                          return menu_advanced_pause_option;
1443
-      #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE)
1444
-        case ADVANCED_PAUSE_MESSAGE_CONTINUOUS_PURGE: return menu_advanced_pause_continuous_purge;
1445
-      #endif
1446
-      case ADVANCED_PAUSE_MESSAGE_STATUS:
1447
-      default: break;
1448
-    }
1449
-    return NULL;
1450
-  }
1451
-
1452
-  void lcd_advanced_pause_show_message(
1453
-    const AdvancedPauseMessage message,
1454
-    const AdvancedPauseMode mode/*=ADVANCED_PAUSE_MODE_PAUSE_PRINT*/,
1455
-    const uint8_t extruder/*=active_extruder*/
1456
-  ) {
1457
-    advanced_pause_mode = mode;
1458
-    hotend_status_extruder = extruder;
1459
-    const screenFunc_t next_screen = ap_message_screen(message);
1460
-    if (next_screen) {
1461
-      defer_return_to_status = true;
1462
-      lcd_goto_screen(next_screen);
1463
-    }
1464
-    else
1465
-      lcd_return_to_status();
1466
-  }
1467
-
1468
-#endif // ADVANCED_PAUSE_FEATURE
1469
-
1470 904
 #endif // ULTIPANEL

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

@@ -0,0 +1,581 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ *
5
+ * Based on Sprinter and grbl.
6
+ * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+
23
+//
24
+// Filament Change Menu
25
+//
26
+
27
+#include "../../inc/MarlinConfigPre.h"
28
+
29
+#if HAS_LCD_MENU && ENABLED(ADVANCED_PAUSE_FEATURE)
30
+
31
+#include "menu.h"
32
+#include "../../module/temperature.h"
33
+#include "../../feature/pause.h"
34
+
35
+//
36
+// Change Filament > Change/Unload/Load Filament
37
+//
38
+static AdvancedPauseMode _change_filament_temp_mode; // =ADVANCED_PAUSE_MODE_PAUSE_PRINT
39
+static int8_t _change_filament_temp_extruder; // =0
40
+
41
+static PGM_P _change_filament_temp_command() {
42
+  switch (_change_filament_temp_mode) {
43
+    case ADVANCED_PAUSE_MODE_LOAD_FILAMENT:
44
+      return PSTR("M701 T%d");
45
+    case ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT:
46
+      return _change_filament_temp_extruder >= 0 ? PSTR("M702 T%d") : PSTR("M702 ;%d");
47
+    case ADVANCED_PAUSE_MODE_PAUSE_PRINT:
48
+    default:
49
+      return PSTR("M600 B0 T%d");
50
+  }
51
+  return PSTR(MSG_FILAMENTCHANGE);
52
+}
53
+
54
+void _change_filament_temp(const uint16_t temperature) {
55
+  char cmd[11];
56
+  sprintf_P(cmd, _change_filament_temp_command(), _change_filament_temp_extruder);
57
+  thermalManager.setTargetHotend(temperature, _change_filament_temp_extruder);
58
+  lcd_enqueue_command(cmd);
59
+}
60
+void _menu_change_filament_temp_1() { _change_filament_temp(PREHEAT_1_TEMP_HOTEND); }
61
+void _menu_change_filament_temp_2() { _change_filament_temp(PREHEAT_2_TEMP_HOTEND); }
62
+void _menu_change_filament_temp_custom() { _change_filament_temp(thermalManager.target_temperature[_change_filament_temp_extruder]); }
63
+
64
+static PGM_P change_filament_header(const AdvancedPauseMode mode) {
65
+  switch (mode) {
66
+    case ADVANCED_PAUSE_MODE_LOAD_FILAMENT:
67
+      return PSTR(MSG_FILAMENTLOAD);
68
+    case ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT:
69
+      return PSTR(MSG_FILAMENTUNLOAD);
70
+    default: break;
71
+  }
72
+  return PSTR(MSG_FILAMENTCHANGE);
73
+}
74
+
75
+void _menu_temp_filament_op(const AdvancedPauseMode mode, const int8_t extruder) {
76
+  _change_filament_temp_mode = mode;
77
+  _change_filament_temp_extruder = extruder;
78
+  START_MENU();
79
+  if (LCD_HEIGHT >= 4) STATIC_ITEM_P(change_filament_header(mode), true, true);
80
+  MENU_BACK(MSG_BACK);
81
+  MENU_ITEM(submenu, MSG_PREHEAT_1, _menu_change_filament_temp_1);
82
+  MENU_ITEM(submenu, MSG_PREHEAT_2, _menu_change_filament_temp_2);
83
+  uint16_t max_temp;
84
+  switch (extruder) {
85
+    default: max_temp = HEATER_0_MAXTEMP;
86
+    #if HOTENDS > 1
87
+      case 1: max_temp = HEATER_1_MAXTEMP; break;
88
+      #if HOTENDS > 2
89
+        case 2: max_temp = HEATER_2_MAXTEMP; break;
90
+        #if HOTENDS > 3
91
+          case 3: max_temp = HEATER_3_MAXTEMP; break;
92
+          #if HOTENDS > 4
93
+            case 4: max_temp = HEATER_4_MAXTEMP; break;
94
+            #if HOTENDS > 5
95
+              case 5: max_temp = HEATER_5_MAXTEMP; break;
96
+            #endif
97
+          #endif
98
+        #endif
99
+      #endif
100
+    #endif
101
+  }
102
+  MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_PREHEAT_CUSTOM, &thermalManager.target_temperature[_change_filament_temp_extruder], EXTRUDE_MINTEMP, max_temp - 15, _menu_change_filament_temp_custom);
103
+  END_MENU();
104
+}
105
+void menu_temp_e0_filament_change()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_PAUSE_PRINT, 0); }
106
+void menu_temp_e0_filament_load()    { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_LOAD_FILAMENT, 0); }
107
+void menu_temp_e0_filament_unload()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, 0); }
108
+#if E_STEPPERS > 1
109
+  void menu_temp_e1_filament_change()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_PAUSE_PRINT, 1); }
110
+  void menu_temp_e1_filament_load()    { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_LOAD_FILAMENT, 1); }
111
+  void menu_temp_e1_filament_unload()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, 1); }
112
+  #if ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS)
113
+    void menu_unload_filament_all_temp() { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, -1); }
114
+  #endif
115
+  #if E_STEPPERS > 2
116
+    void menu_temp_e2_filament_change()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_PAUSE_PRINT, 2); }
117
+    void menu_temp_e2_filament_load()    { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_LOAD_FILAMENT, 2); }
118
+    void menu_temp_e2_filament_unload()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, 2); }
119
+    #if E_STEPPERS > 3
120
+      void menu_temp_e3_filament_change()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_PAUSE_PRINT, 3); }
121
+      void menu_temp_e3_filament_load()    { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_LOAD_FILAMENT, 3); }
122
+      void menu_temp_e3_filament_unload()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, 3); }
123
+      #if E_STEPPERS > 4
124
+        void menu_temp_e4_filament_change()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_PAUSE_PRINT, 4); }
125
+        void menu_temp_e4_filament_load()    { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_LOAD_FILAMENT, 4); }
126
+        void menu_temp_e4_filament_unload()  { _menu_temp_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, 4); }
127
+      #endif // E_STEPPERS > 4
128
+    #endif // E_STEPPERS > 3
129
+  #endif // E_STEPPERS > 2
130
+#endif // E_STEPPERS > 1
131
+
132
+/**
133
+ *
134
+ * "Change Filament" submenu
135
+ *
136
+ */
137
+#if E_STEPPERS > 1 || ENABLED(FILAMENT_LOAD_UNLOAD_GCODES)
138
+  void menu_change_filament() {
139
+    START_MENU();
140
+    MENU_BACK(MSG_MAIN);
141
+
142
+    // Change filament
143
+    #if E_STEPPERS == 1
144
+      PGM_P msg0 = PSTR(MSG_FILAMENTCHANGE);
145
+      if (thermalManager.targetTooColdToExtrude(active_extruder))
146
+        MENU_ITEM_P(submenu, msg0, menu_temp_e0_filament_change);
147
+      else
148
+        MENU_ITEM_P(gcode, msg0, PSTR("M600 B0"));
149
+    #else
150
+      PGM_P msg0 = PSTR(MSG_FILAMENTCHANGE " " MSG_E1);
151
+      PGM_P msg1 = PSTR(MSG_FILAMENTCHANGE " " MSG_E2);
152
+      if (thermalManager.targetTooColdToExtrude(0))
153
+        MENU_ITEM_P(submenu, msg0, menu_temp_e0_filament_change);
154
+      else
155
+        MENU_ITEM_P(gcode, msg0, PSTR("M600 B0 T0"));
156
+      if (thermalManager.targetTooColdToExtrude(1))
157
+        MENU_ITEM_P(submenu, msg1, menu_temp_e1_filament_change);
158
+      else
159
+        MENU_ITEM_P(gcode, msg1, PSTR("M600 B0 T1"));
160
+      #if E_STEPPERS > 2
161
+        PGM_P msg2 = PSTR(MSG_FILAMENTCHANGE " " MSG_E3);
162
+        if (thermalManager.targetTooColdToExtrude(2))
163
+          MENU_ITEM_P(submenu, msg2, menu_temp_e2_filament_change);
164
+        else
165
+          MENU_ITEM_P(gcode, msg2, PSTR("M600 B0 T2"));
166
+        #if E_STEPPERS > 3
167
+          PGM_P msg3 = PSTR(MSG_FILAMENTCHANGE " " MSG_E4);
168
+          if (thermalManager.targetTooColdToExtrude(3))
169
+            MENU_ITEM_P(submenu, msg3, menu_temp_e3_filament_change);
170
+          else
171
+            MENU_ITEM_P(gcode, msg3, PSTR("M600 B0 T3"));
172
+          #if E_STEPPERS > 4
173
+            PGM_P msg4 = PSTR(MSG_FILAMENTCHANGE " " MSG_E5);
174
+            if (thermalManager.targetTooColdToExtrude(4))
175
+              MENU_ITEM_P(submenu, msg4, menu_temp_e4_filament_change);
176
+            else
177
+              MENU_ITEM_P(gcode, msg4, PSTR("M600 B0 T4"));
178
+            #if E_STEPPERS > 5
179
+              PGM_P msg5 = PSTR(MSG_FILAMENTCHANGE " " MSG_E6);
180
+              if (thermalManager.targetTooColdToExtrude(5))
181
+                MENU_ITEM_P(submenu, msg5, menu_temp_e5_filament_change);
182
+              else
183
+                MENU_ITEM_P(gcode, msg5, PSTR("M600 B0 T5"));
184
+            #endif // E_STEPPERS > 5
185
+          #endif // E_STEPPERS > 4
186
+        #endif // E_STEPPERS > 3
187
+      #endif // E_STEPPERS > 2
188
+    #endif // E_STEPPERS == 1
189
+
190
+    #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES)
191
+      if (!printer_busy()) {
192
+        // Load filament
193
+        #if E_STEPPERS == 1
194
+          PGM_P msg0 = PSTR(MSG_FILAMENTLOAD);
195
+          if (thermalManager.targetTooColdToExtrude(active_extruder))
196
+            MENU_ITEM_P(submenu, msg0, menu_temp_e0_filament_load);
197
+          else
198
+            MENU_ITEM_P(gcode, msg0, PSTR("M701"));
199
+        #else
200
+          PGM_P msg0 = PSTR(MSG_FILAMENTLOAD " " MSG_E1);
201
+          PGM_P msg1 = PSTR(MSG_FILAMENTLOAD " " MSG_E2);
202
+          if (thermalManager.targetTooColdToExtrude(0))
203
+            MENU_ITEM_P(submenu, msg0, menu_temp_e0_filament_load);
204
+          else
205
+            MENU_ITEM_P(gcode, msg0, PSTR("M701 T0"));
206
+          if (thermalManager.targetTooColdToExtrude(1))
207
+            MENU_ITEM_P(submenu, msg1, menu_temp_e1_filament_load);
208
+          else
209
+            MENU_ITEM_P(gcode, msg1, PSTR("M701 T1"));
210
+          #if E_STEPPERS > 2
211
+            PGM_P msg2 = PSTR(MSG_FILAMENTLOAD " " MSG_E3);
212
+            if (thermalManager.targetTooColdToExtrude(2))
213
+              MENU_ITEM_P(submenu, msg2, menu_temp_e2_filament_load);
214
+            else
215
+              MENU_ITEM_P(gcode, msg2, PSTR("M701 T2"));
216
+            #if E_STEPPERS > 3
217
+              PGM_P msg3 = PSTR(MSG_FILAMENTLOAD " " MSG_E4);
218
+              if (thermalManager.targetTooColdToExtrude(3))
219
+                MENU_ITEM_P(submenu, msg3, menu_temp_e3_filament_load);
220
+              else
221
+                MENU_ITEM_P(gcode, msg3, PSTR("M701 T3"));
222
+              #if E_STEPPERS > 4
223
+                PGM_P msg4 = PSTR(MSG_FILAMENTLOAD " " MSG_E5);
224
+                if (thermalManager.targetTooColdToExtrude(4))
225
+                  MENU_ITEM_P(submenu, msg4, menu_temp_e4_filament_load);
226
+                else
227
+                  MENU_ITEM_P(gcode, msg4, PSTR("M701 T4"));
228
+                #if E_STEPPERS > 5
229
+                  PGM_P msg5 = PSTR(MSG_FILAMENTLOAD " " MSG_E6);
230
+                  if (thermalManager.targetTooColdToExtrude(5))
231
+                    MENU_ITEM_P(submenu, msg5, menu_temp_e5_filament_load);
232
+                  else
233
+                    MENU_ITEM_P(gcode, msg5, PSTR("M701 T5"));
234
+                #endif // E_STEPPERS > 5
235
+              #endif // E_STEPPERS > 4
236
+            #endif // E_STEPPERS > 3
237
+          #endif // E_STEPPERS > 2
238
+        #endif // E_STEPPERS == 1
239
+
240
+        // Unload filament
241
+        #if E_STEPPERS == 1
242
+          if (thermalManager.targetHotEnoughToExtrude(active_extruder))
243
+            MENU_ITEM(gcode, MSG_FILAMENTUNLOAD, PSTR("M702"));
244
+          else
245
+            MENU_ITEM(submenu, MSG_FILAMENTUNLOAD, menu_temp_e0_filament_unload);
246
+        #else
247
+          #if ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS)
248
+            if (thermalManager.targetHotEnoughToExtrude(0)
249
+              #if E_STEPPERS > 1
250
+                && thermalManager.targetHotEnoughToExtrude(1)
251
+                #if E_STEPPERS > 2
252
+                  && thermalManager.targetHotEnoughToExtrude(2)
253
+                  #if E_STEPPERS > 3
254
+                    && thermalManager.targetHotEnoughToExtrude(3)
255
+                    #if E_STEPPERS > 4
256
+                      && thermalManager.targetHotEnoughToExtrude(4)
257
+                      #if E_STEPPERS > 5
258
+                        && thermalManager.targetHotEnoughToExtrude(5)
259
+                      #endif // E_STEPPERS > 5
260
+                    #endif // E_STEPPERS > 4
261
+                  #endif // E_STEPPERS > 3
262
+                #endif // E_STEPPERS > 2
263
+              #endif // E_STEPPERS > 1
264
+            )
265
+              MENU_ITEM(gcode, MSG_FILAMENTUNLOAD_ALL, PSTR("M702"));
266
+          else
267
+            MENU_ITEM(submenu, MSG_FILAMENTUNLOAD_ALL, menu_unload_filament_all_temp);
268
+          #endif
269
+          if (thermalManager.targetHotEnoughToExtrude(0))
270
+            MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E1, PSTR("M702 T0"));
271
+          else
272
+            MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E1, menu_temp_e0_filament_unload);
273
+          if (thermalManager.targetHotEnoughToExtrude(1))
274
+            MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E2, PSTR("M702 T1"));
275
+          else
276
+            MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E2, menu_temp_e1_filament_unload);
277
+          #if E_STEPPERS > 2
278
+            if (thermalManager.targetHotEnoughToExtrude(2))
279
+              MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E3, PSTR("M702 T2"));
280
+            else
281
+              MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E3, menu_temp_e2_filament_unload);
282
+            #if E_STEPPERS > 3
283
+              if (thermalManager.targetHotEnoughToExtrude(3))
284
+                MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E4, PSTR("M702 T3"));
285
+              else
286
+                MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E4, menu_temp_e3_filament_unload);
287
+              #if E_STEPPERS > 4
288
+                if (thermalManager.targetHotEnoughToExtrude(4))
289
+                  MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E5, PSTR("M702 T4"));
290
+                else
291
+                  MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E5, menu_temp_e4_filament_unload);
292
+                #if E_STEPPERS > 5
293
+                  if (thermalManager.targetHotEnoughToExtrude(5))
294
+                    MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E6, PSTR("M702 T5"));
295
+                  else
296
+                    MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E6, menu_temp_e5_filament_unload);
297
+                #endif // E_STEPPERS > 5
298
+              #endif // E_STEPPERS > 4
299
+            #endif // E_STEPPERS > 3
300
+          #endif // E_STEPPERS > 2
301
+        #endif // E_STEPPERS == 1
302
+      }
303
+    #endif
304
+
305
+    END_MENU();
306
+  }
307
+#endif
308
+
309
+static AdvancedPauseMode advanced_pause_mode = ADVANCED_PAUSE_MODE_PAUSE_PRINT;
310
+static uint8_t hotend_status_extruder = 0;
311
+
312
+static PGM_P advanced_pause_header() {
313
+  switch (advanced_pause_mode) {
314
+    case ADVANCED_PAUSE_MODE_LOAD_FILAMENT:
315
+      return PSTR(MSG_FILAMENT_CHANGE_HEADER_LOAD);
316
+    case ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT:
317
+      return PSTR(MSG_FILAMENT_CHANGE_HEADER_UNLOAD);
318
+    default: break;
319
+  }
320
+  return PSTR(MSG_FILAMENT_CHANGE_HEADER_PAUSE);
321
+}
322
+
323
+// Portions from STATIC_ITEM...
324
+#define HOTEND_STATUS_ITEM() do { \
325
+  if (_menuLineNr == _thisItemNr) { \
326
+    if (lcdDrawUpdate) { \
327
+      lcd_implementation_drawmenu_static(_lcdLineNr, PSTR(MSG_FILAMENT_CHANGE_NOZZLE), false, true); \
328
+      lcd_implementation_hotend_status(_lcdLineNr, hotend_status_extruder); \
329
+    } \
330
+    if (_skipStatic && encoderLine <= _thisItemNr) { \
331
+      encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \
332
+      ++encoderLine; \
333
+    } \
334
+    lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; \
335
+  } \
336
+  ++_thisItemNr; \
337
+}while(0)
338
+
339
+void lcd_advanced_pause_resume_print() {
340
+  advanced_pause_menu_response = ADVANCED_PAUSE_RESPONSE_RESUME_PRINT;
341
+}
342
+
343
+void lcd_advanced_pause_extrude_more() {
344
+  advanced_pause_menu_response = ADVANCED_PAUSE_RESPONSE_EXTRUDE_MORE;
345
+}
346
+
347
+void menu_advanced_pause_option() {
348
+  START_MENU();
349
+  #if LCD_HEIGHT > 2
350
+    STATIC_ITEM(MSG_FILAMENT_CHANGE_OPTION_HEADER, true, false);
351
+  #endif
352
+  MENU_ITEM(function, MSG_FILAMENT_CHANGE_OPTION_RESUME, lcd_advanced_pause_resume_print);
353
+  MENU_ITEM(function, MSG_FILAMENT_CHANGE_OPTION_PURGE, lcd_advanced_pause_extrude_more);
354
+  END_MENU();
355
+}
356
+
357
+void lcd_advanced_pause_init_message() {
358
+  START_SCREEN();
359
+  STATIC_ITEM_P(advanced_pause_header(), true, true);
360
+  STATIC_ITEM(MSG_FILAMENT_CHANGE_INIT_1);
361
+  #ifdef MSG_FILAMENT_CHANGE_INIT_2
362
+    STATIC_ITEM(MSG_FILAMENT_CHANGE_INIT_2);
363
+    #define __FC_LINES_A 3
364
+  #else
365
+    #define __FC_LINES_A 2
366
+  #endif
367
+  #ifdef MSG_FILAMENT_CHANGE_INIT_3
368
+    STATIC_ITEM(MSG_FILAMENT_CHANGE_INIT_3);
369
+    #define _FC_LINES_A (__FC_LINES_A + 1)
370
+  #else
371
+    #define _FC_LINES_A __FC_LINES_A
372
+  #endif
373
+  #if LCD_HEIGHT > _FC_LINES_A + 1
374
+    STATIC_ITEM(" ");
375
+  #endif
376
+  HOTEND_STATUS_ITEM();
377
+  END_SCREEN();
378
+}
379
+
380
+void lcd_advanced_pause_unload_message() {
381
+  START_SCREEN();
382
+  STATIC_ITEM_P(advanced_pause_header(), true, true);
383
+  STATIC_ITEM(MSG_FILAMENT_CHANGE_UNLOAD_1);
384
+  #ifdef MSG_FILAMENT_CHANGE_UNLOAD_2
385
+    STATIC_ITEM(MSG_FILAMENT_CHANGE_UNLOAD_2);
386
+    #define __FC_LINES_B 3
387
+  #else
388
+    #define __FC_LINES_B 2
389
+  #endif
390
+  #ifdef MSG_FILAMENT_CHANGE_UNLOAD_3
391
+    STATIC_ITEM(MSG_FILAMENT_CHANGE_UNLOAD_3);
392
+    #define _FC_LINES_B (__FC_LINES_B + 1)
393
+  #else
394
+    #define _FC_LINES_B __FC_LINES_B
395
+  #endif
396
+  #if LCD_HEIGHT > _FC_LINES_B + 1
397
+    STATIC_ITEM(" ");
398
+  #endif
399
+  HOTEND_STATUS_ITEM();
400
+  END_SCREEN();
401
+}
402
+
403
+void lcd_advanced_pause_wait_for_nozzles_to_heat() {
404
+  START_SCREEN();
405
+  STATIC_ITEM_P(advanced_pause_header(), true, true);
406
+  STATIC_ITEM(MSG_FILAMENT_CHANGE_HEATING_1);
407
+  #ifdef MSG_FILAMENT_CHANGE_HEATING_2
408
+    STATIC_ITEM(MSG_FILAMENT_CHANGE_HEATING_2);
409
+    #define _FC_LINES_C 3
410
+  #else
411
+    #define _FC_LINES_C 2
412
+  #endif
413
+  #if LCD_HEIGHT > _FC_LINES_C + 1
414
+    STATIC_ITEM(" ");
415
+  #endif
416
+  HOTEND_STATUS_ITEM();
417
+  END_SCREEN();
418
+}
419
+
420
+void lcd_advanced_pause_heat_nozzle() {
421
+  START_SCREEN();
422
+  STATIC_ITEM_P(advanced_pause_header(), true, true);
423
+  STATIC_ITEM(MSG_FILAMENT_CHANGE_HEAT_1);
424
+  #ifdef MSG_FILAMENT_CHANGE_INSERT_2
425
+    STATIC_ITEM(MSG_FILAMENT_CHANGE_HEAT_2);
426
+    #define _FC_LINES_D 3
427
+  #else
428
+    #define _FC_LINES_D 2
429
+  #endif
430
+  #if LCD_HEIGHT > _FC_LINES_D + 1
431
+    STATIC_ITEM(" ");
432
+  #endif
433
+  HOTEND_STATUS_ITEM();
434
+  END_SCREEN();
435
+}
436
+
437
+void lcd_advanced_pause_insert_message() {
438
+  START_SCREEN();
439
+  STATIC_ITEM_P(advanced_pause_header(), true, true);
440
+  STATIC_ITEM(MSG_FILAMENT_CHANGE_INSERT_1);
441
+  #ifdef MSG_FILAMENT_CHANGE_INSERT_2
442
+    STATIC_ITEM(MSG_FILAMENT_CHANGE_INSERT_2);
443
+    #define __FC_LINES_E 3
444
+  #else
445
+    #define __FC_LINES_E 2
446
+  #endif
447
+  #ifdef MSG_FILAMENT_CHANGE_INSERT_3
448
+    STATIC_ITEM(MSG_FILAMENT_CHANGE_INSERT_3);
449
+    #define _FC_LINES_E (__FC_LINES_E + 1)
450
+  #else
451
+    #define _FC_LINES_E __FC_LINES_E
452
+  #endif
453
+  #if LCD_HEIGHT > _FC_LINES_E + 1
454
+    STATIC_ITEM(" ");
455
+  #endif
456
+  HOTEND_STATUS_ITEM();
457
+  END_SCREEN();
458
+}
459
+
460
+void lcd_advanced_pause_load_message() {
461
+  START_SCREEN();
462
+  STATIC_ITEM_P(advanced_pause_header(), true, true);
463
+  STATIC_ITEM(MSG_FILAMENT_CHANGE_LOAD_1);
464
+  #ifdef MSG_FILAMENT_CHANGE_LOAD_2
465
+    STATIC_ITEM(MSG_FILAMENT_CHANGE_LOAD_2);
466
+    #define __FC_LINES_F 3
467
+  #else
468
+    #define __FC_LINES_F 2
469
+  #endif
470
+  #ifdef MSG_FILAMENT_CHANGE_LOAD_3
471
+    STATIC_ITEM(MSG_FILAMENT_CHANGE_LOAD_3);
472
+    #define _FC_LINES_F (__FC_LINES_F + 1)
473
+  #else
474
+    #define _FC_LINES_F __FC_LINES_F
475
+  #endif
476
+  #if LCD_HEIGHT > _FC_LINES_F + 1
477
+    STATIC_ITEM(" ");
478
+  #endif
479
+  HOTEND_STATUS_ITEM();
480
+  END_SCREEN();
481
+}
482
+
483
+void lcd_advanced_pause_purge_message() {
484
+  START_SCREEN();
485
+  STATIC_ITEM_P(advanced_pause_header(), true, true);
486
+  STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_1);
487
+  #ifdef MSG_FILAMENT_CHANGE_PURGE_2
488
+    STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_2);
489
+    #define __FC_LINES_G 3
490
+  #else
491
+    #define __FC_LINES_G 2
492
+  #endif
493
+  #ifdef MSG_FILAMENT_CHANGE_PURGE_3
494
+    STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_3);
495
+    #define _FC_LINES_G (__FC_LINES_G + 1)
496
+  #else
497
+    #define _FC_LINES_G __FC_LINES_G
498
+  #endif
499
+  #if LCD_HEIGHT > _FC_LINES_G + 1
500
+    STATIC_ITEM(" ");
501
+  #endif
502
+  HOTEND_STATUS_ITEM();
503
+  END_SCREEN();
504
+}
505
+
506
+#if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE)
507
+  void menu_advanced_pause_continuous_purge() {
508
+    START_SCREEN();
509
+    STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_1);
510
+    #ifdef MSG_FILAMENT_CHANGE_PURGE_2
511
+      STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_2);
512
+      #define __FC_LINES_G 3
513
+    #else
514
+      #define __FC_LINES_G 2
515
+    #endif
516
+    #ifdef MSG_FILAMENT_CHANGE_PURGE_3
517
+      STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_3);
518
+      #define _FC_LINES_G (__FC_LINES_G + 1)
519
+    #else
520
+      #define _FC_LINES_G __FC_LINES_G
521
+    #endif
522
+    #if LCD_HEIGHT > _FC_LINES_G + 1
523
+      STATIC_ITEM(" ");
524
+    #endif
525
+    HOTEND_STATUS_ITEM();
526
+    STATIC_ITEM(MSG_USERWAIT);
527
+    END_SCREEN();
528
+  }
529
+#endif
530
+
531
+void lcd_advanced_pause_resume_message() {
532
+  START_SCREEN();
533
+  STATIC_ITEM_P(advanced_pause_header(), true, true);
534
+  STATIC_ITEM(MSG_FILAMENT_CHANGE_RESUME_1);
535
+  #ifdef MSG_FILAMENT_CHANGE_RESUME_2
536
+    STATIC_ITEM(MSG_FILAMENT_CHANGE_RESUME_2);
537
+  #endif
538
+  #ifdef MSG_FILAMENT_CHANGE_RESUME_3
539
+    STATIC_ITEM(MSG_FILAMENT_CHANGE_RESUME_3);
540
+  #endif
541
+  END_SCREEN();
542
+}
543
+
544
+FORCE_INLINE screenFunc_t ap_message_screen(const AdvancedPauseMessage message) {
545
+  switch (message) {
546
+    case ADVANCED_PAUSE_MESSAGE_INIT:                     return lcd_advanced_pause_init_message;
547
+    case ADVANCED_PAUSE_MESSAGE_UNLOAD:                   return lcd_advanced_pause_unload_message;
548
+    case ADVANCED_PAUSE_MESSAGE_INSERT:                   return lcd_advanced_pause_insert_message;
549
+    case ADVANCED_PAUSE_MESSAGE_LOAD:                     return lcd_advanced_pause_load_message;
550
+    case ADVANCED_PAUSE_MESSAGE_PURGE:                    return lcd_advanced_pause_purge_message;
551
+    case ADVANCED_PAUSE_MESSAGE_RESUME:                   return lcd_advanced_pause_resume_message;
552
+    case ADVANCED_PAUSE_MESSAGE_CLICK_TO_HEAT_NOZZLE:     return lcd_advanced_pause_heat_nozzle;
553
+    case ADVANCED_PAUSE_MESSAGE_WAIT_FOR_NOZZLES_TO_HEAT: return lcd_advanced_pause_wait_for_nozzles_to_heat;
554
+    case ADVANCED_PAUSE_MESSAGE_OPTION:                   advanced_pause_menu_response = ADVANCED_PAUSE_RESPONSE_WAIT_FOR;
555
+                                                          return menu_advanced_pause_option;
556
+    #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE)
557
+      case ADVANCED_PAUSE_MESSAGE_CONTINUOUS_PURGE:       return menu_advanced_pause_continuous_purge;
558
+    #endif
559
+    case ADVANCED_PAUSE_MESSAGE_STATUS:
560
+    default: break;
561
+  }
562
+  return NULL;
563
+}
564
+
565
+void lcd_advanced_pause_show_message(
566
+  const AdvancedPauseMessage message,
567
+  const AdvancedPauseMode mode/*=ADVANCED_PAUSE_MODE_PAUSE_PRINT*/,
568
+  const uint8_t extruder/*=active_extruder*/
569
+) {
570
+  advanced_pause_mode = mode;
571
+  hotend_status_extruder = extruder;
572
+  const screenFunc_t next_screen = ap_message_screen(message);
573
+  if (next_screen) {
574
+    defer_return_to_status = true;
575
+    lcd_goto_screen(next_screen);
576
+  }
577
+  else
578
+    lcd_return_to_status();
579
+}
580
+
581
+#endif // HAS_LCD_MENU && ADVANCED_PAUSE_FEATURE

Loading…
Cancel
Save