diff --git a/.travis.yml b/.travis.yml index d7df3d939..cb1c650a7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -116,7 +116,7 @@ script: # ULTIMAKERCONTROLLER, FILAMENT_LCD_DISPLAY, FILAMENT_WIDTH_SENSOR, # PRINTCOUNTER, NOZZLE_PARK_FEATURE, NOZZLE_CLEAN_FEATURE, PCA9632, # Z_DUAL_STEPPER_DRIVERS, Z_DUAL_ENDSTOPS, BEZIER_CURVE_SUPPORT, EXPERIMENTAL_I2CBUS, - # ADVANCED_PAUSE_FEATURE, PARK_HEAD_ON_PAUSE, LCD_INFO_MENU, + # ADVANCED_PAUSE_FEATURE, ADVANCED_PAUSE_CONTINUOUS_PURGE, PARK_HEAD_ON_PAUSE, LCD_INFO_MENU, # EEPROM_SETTINGS, EEPROM_CHITCHAT, M100_FREE_MEMORY_WATCHER, # INCH_MODE_SUPPORT, TEMPERATURE_UNITS_SUPPORT # @@ -127,7 +127,7 @@ script: - opt_enable ULTIMAKERCONTROLLER SDSUPPORT - opt_enable PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE PCA9632 USE_XMAX_PLUG - opt_enable_adv BEZIER_CURVE_SUPPORT EXPERIMENTAL_I2CBUS - - opt_enable_adv ADVANCED_PAUSE_FEATURE FILAMENT_LOAD_UNLOAD_GCODES PARK_HEAD_ON_PAUSE LCD_INFO_MENU M114_DETAIL + - opt_enable_adv ADVANCED_PAUSE_FEATURE ADVANCED_PAUSE_CONTINUOUS_PURGE FILAMENT_LOAD_UNLOAD_GCODES PARK_HEAD_ON_PAUSE LCD_INFO_MENU M114_DETAIL - opt_set_adv PWM_MOTOR_CURRENT {1300,1300,1250} - opt_set_adv I2C_SLAVE_ADDRESS 63 - build_marlin_pio ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index a3ce94bbb..cad1f8f55 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -921,6 +921,7 @@ #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index ba28e0f57..0c5b74293 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -187,37 +187,53 @@ bool load_filament(const float &load_length/*=0*/, const float &purge_length/*=0 // Load filament if (load_length) do_pause_e_move(load_length, FILAMENT_CHANGE_LOAD_FEEDRATE); - do { - if (purge_length > 0) { - // "Wait for filament purge" - #if ENABLED(ULTIPANEL) - if (show_lcd) - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_PURGE, mode); - #endif - - // Extrude filament to get into hotend - do_pause_e_move(purge_length, ADVANCED_PAUSE_EXTRUDE_FEEDRATE); - } + #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) - // Show "Purge More" / "Resume" menu and wait for reply #if ENABLED(ULTIPANEL) - if (show_lcd) { - KEEPALIVE_STATE(PAUSED_FOR_USER); - wait_for_user = false; - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_OPTION, mode); - while (advanced_pause_menu_response == ADVANCED_PAUSE_RESPONSE_WAIT_FOR) idle(true); - KEEPALIVE_STATE(IN_HANDLER); - } + if (show_lcd) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_CONTINUOUS_PURGE); #endif - // Keep looping if "Purge More" was selected - } while ( - #if ENABLED(ULTIPANEL) - show_lcd && advanced_pause_menu_response == ADVANCED_PAUSE_RESPONSE_EXTRUDE_MORE - #else - 0 - #endif - ); + wait_for_user = true; + for (float purge_count = purge_length; purge_count > 0 && wait_for_user; --purge_count) + do_pause_e_move(1, ADVANCED_PAUSE_EXTRUDE_FEEDRATE); + wait_for_user = false; + + #else + + do { + if (purge_length > 0) { + // "Wait for filament purge" + #if ENABLED(ULTIPANEL) + if (show_lcd) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_PURGE, mode); + #endif + + // Extrude filament to get into hotend + do_pause_e_move(purge_length, ADVANCED_PAUSE_EXTRUDE_FEEDRATE); + } + + // Show "Purge More" / "Resume" menu and wait for reply + #if ENABLED(ULTIPANEL) + if (show_lcd) { + KEEPALIVE_STATE(PAUSED_FOR_USER); + wait_for_user = false; + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_OPTION, mode); + while (advanced_pause_menu_response == ADVANCED_PAUSE_RESPONSE_WAIT_FOR) idle(true); + KEEPALIVE_STATE(IN_HANDLER); + } + #endif + + // Keep looping if "Purge More" was selected + } while ( + #if ENABLED(ULTIPANEL) + show_lcd && advanced_pause_menu_response == ADVANCED_PAUSE_RESPONSE_EXTRUDE_MORE + #else + 0 + #endif + ); + + #endif return true; } diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index 5a1d03b29..b2e9e2709 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -44,6 +44,9 @@ enum AdvancedPauseMessage : char { ADVANCED_PAUSE_MESSAGE_INSERT, ADVANCED_PAUSE_MESSAGE_LOAD, ADVANCED_PAUSE_MESSAGE_PURGE, + #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) + ADVANCED_PAUSE_MESSAGE_CONTINUOUS_PURGE, + #endif ADVANCED_PAUSE_MESSAGE_OPTION, ADVANCED_PAUSE_MESSAGE_RESUME, ADVANCED_PAUSE_MESSAGE_STATUS, diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 03495ab76..69c014280 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -218,14 +218,6 @@ uint16_t max_display_update_time = 0; #else void lcd_temp_menu_e0_filament_change(); #endif - void lcd_advanced_pause_option_menu(); - void lcd_advanced_pause_init_message(); - void lcd_advanced_pause_unload_message(); - void lcd_advanced_pause_insert_message(); - void lcd_advanced_pause_load_message(); - void lcd_advanced_pause_heat_nozzle(); - void lcd_advanced_pause_purge_message(); - void lcd_advanced_pause_resume_message(); #endif #if ENABLED(DAC_STEPPER_CURRENT) @@ -4598,10 +4590,35 @@ void kill_screen(const char* lcd_msg) { #if LCD_HEIGHT > _FC_LINES_G + 1 STATIC_ITEM(" "); #endif - HOTEND_STATUS_ITEM(); + HOTEND_STATUS_ITEM(); END_SCREEN(); } + #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) + void lcd_advanced_pause_continuous_purge_menu() { + START_SCREEN(); + STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_1); + #ifdef MSG_FILAMENT_CHANGE_PURGE_2 + STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_2); + #define __FC_LINES_G 3 + #else + #define __FC_LINES_G 2 + #endif + #ifdef MSG_FILAMENT_CHANGE_PURGE_3 + STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_3); + #define _FC_LINES_G (__FC_LINES_G + 1) + #else + #define _FC_LINES_G __FC_LINES_G + #endif + #if LCD_HEIGHT > _FC_LINES_G + 1 + STATIC_ITEM(" "); + #endif + HOTEND_STATUS_ITEM(); + STATIC_ITEM(MSG_USERWAIT); + END_SCREEN(); + } + #endif + void lcd_advanced_pause_resume_message() { START_SCREEN(); STATIC_ITEM_P(advanced_pause_header(), true, true); @@ -4627,6 +4644,9 @@ void kill_screen(const char* lcd_msg) { case ADVANCED_PAUSE_MESSAGE_WAIT_FOR_NOZZLES_TO_HEAT: return lcd_advanced_pause_wait_for_nozzles_to_heat; case ADVANCED_PAUSE_MESSAGE_OPTION: advanced_pause_menu_response = ADVANCED_PAUSE_RESPONSE_WAIT_FOR; return lcd_advanced_pause_option_menu; + #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) + case ADVANCED_PAUSE_MESSAGE_CONTINUOUS_PURGE: return lcd_advanced_pause_continuous_purge_menu; + #endif case ADVANCED_PAUSE_MESSAGE_STATUS: default: break; }