diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index c0af3f07f..13f6d95c7 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -299,6 +299,7 @@ extern unsigned int heating_status_counter; extern bool custom_message; extern unsigned int custom_message_type; extern unsigned int custom_message_state; +extern char snmm_filaments_used; extern unsigned long PingTime; diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 8002c1d9d..ae1a3202d 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -285,6 +285,7 @@ bool custom_message; bool loading_flag = false; unsigned int custom_message_type; unsigned int custom_message_state; +char snmm_filaments_used = 0; bool volumetric_enabled = false; float filament_size[EXTRUDERS] = { DEFAULT_NOMINAL_FILAMENT_DIA @@ -4301,6 +4302,7 @@ Sigma_Exit: #endif } } + snmm_filaments_used = 0; break; case 85: // M85 if(code_seen('S')) { @@ -4451,7 +4453,7 @@ Sigma_Exit: tmp_extruder = active_extruder; if(code_seen('T')) { tmp_extruder = code_value(); - if(tmp_extruder >= EXTRUDERS) { + if(tmp_extruder >= EXTRUDERS) { SERIAL_ECHO_START; SERIAL_ECHO(MSG_M200_INVALID_EXTRUDER); break; @@ -5441,7 +5443,12 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp case 702: { #ifdef SNMM - extr_unload_all(); + if (code_seen('U')) { + extr_unload_used(); + } + else { + extr_unload_all(); + } #else custom_message = true; custom_message_type = 2; @@ -5479,6 +5486,7 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp } else { tmp_extruder = code_value(); + snmm_filaments_used |= (1 << tmp_extruder); //for stop print #ifdef SNMM snmm_extruder = tmp_extruder; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 4a82e2e62..57cb19738 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -671,7 +671,7 @@ void lcd_commands() lcd_commands_step = 5; } if (lcd_commands_step == 7 && !blocks_queued()) { - enquecommand_P(PSTR("M702")); + enquecommand_P(PSTR("M702 U")); lcd_commands_step = 3; } } @@ -3254,6 +3254,30 @@ void extr_unload_all() { } } +//unloading just used filament (for snmm) + +void extr_unload_used() { + if (degHotend0() > EXTRUDE_MINTEMP) { + for (int i = 0; i < 4; i++) { + if (snmm_filaments_used & (1 << i)) { + change_extr(i); + extr_unload(); + } + } + snmm_filaments_used = 0; + } + else { + lcd_implementation_clear(); + lcd.setCursor(0, 0); + lcd_printPGM(MSG_ERROR); + lcd.setCursor(0, 2); + lcd_printPGM(MSG_PREHEAT_NOZZLE); + delay(2000); + lcd_implementation_clear(); + lcd_return_to_status(); + } +} + static void extr_unload_0() { diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index 850dad35d..cb5aa9060 100644 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -222,9 +222,11 @@ static void extr_unload_1(); static void extr_unload_2(); static void extr_unload_3(); static void lcd_disable_farm_mode(); -void extr_unload_all(); +void extr_unload_all(); +void extr_unload_used(); static void extr_unload(); + void stack_error(); static void lcd_ping_allert(); void lcd_printer_connected();