|  |  | @ -5889,7 +5889,7 @@ inline void gcode_M17() { | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   static bool pause_print(const float &retract, const float &z_lift, const float &x_pos, const float &y_pos, |  |  |  |   static bool pause_print(const float &retract, const float &z_lift, const float &x_pos, const float &y_pos, | 
			
		
	
		
		
			
				
					
					|  |  |  |                           const float &unload_length = 0 , int8_t max_beep_count = 0, bool show_lcd = false |  |  |  |                           const float &unload_length = 0 , const int8_t max_beep_count = 0, const bool show_lcd = false | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   ) { |  |  |  |   ) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (move_away_flag) return false; // already paused
 |  |  |  |     if (move_away_flag) return false; // already paused
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -5989,7 +5989,7 @@ inline void gcode_M17() { | 
			
		
	
		
		
			
				
					
					|  |  |  |     return true; |  |  |  |     return true; | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   static void wait_for_filament_reload(int8_t max_beep_count = 0) { |  |  |  |   static void wait_for_filament_reload(const int8_t max_beep_count = 0) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     bool nozzle_timed_out = false; |  |  |  |     bool nozzle_timed_out = false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     // Wait for filament insert by user and press button
 |  |  |  |     // Wait for filament insert by user and press button
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -6014,7 +6014,7 @@ inline void gcode_M17() { | 
			
		
	
		
		
			
				
					
					|  |  |  |     KEEPALIVE_STATE(IN_HANDLER); |  |  |  |     KEEPALIVE_STATE(IN_HANDLER); | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   static void resume_print(const float &load_length = 0, const float &initial_extrude_length = 0, int8_t max_beep_count = 0) { |  |  |  |   static void resume_print(const float &load_length = 0, const float &initial_extrude_length = 0, const int8_t max_beep_count = 0) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     bool nozzle_timed_out = false; |  |  |  |     bool nozzle_timed_out = false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (!move_away_flag) return; |  |  |  |     if (!move_away_flag) return; | 
			
		
	
	
		
		
			
				
					|  |  | @ -6974,39 +6974,57 @@ inline void gcode_M104() { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | #if HAS_TEMP_HOTEND || HAS_TEMP_BED |  |  |  | #if HAS_TEMP_HOTEND || HAS_TEMP_BED | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   void print_heater_state(const float &c, const float &t, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     #if ENABLED(SHOW_TEMP_ADC_VALUES) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       const float r, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     const int8_t e=-2 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   ) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     SERIAL_PROTOCOLCHAR(' '); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     SERIAL_PROTOCOLCHAR( | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       #if HAS_TEMP_BED && HAS_TEMP_HOTEND | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         e == -1 ? 'B' : 'T' | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       #elif HAS_TEMP_HOTEND | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         'T' | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       #else | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         'B' | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     ); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     #if HOTENDS > 1 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       if (e >= 0) SERIAL_PROTOCOLCHAR('0' + e); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     SERIAL_PROTOCOLCHAR(':'); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     SERIAL_PROTOCOL(c); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     SERIAL_PROTOCOLPAIR(" /" , t); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     #if ENABLED(SHOW_TEMP_ADC_VALUES) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       SERIAL_PROTOCOLPAIR(" (", r / OVERSAMPLENR); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       SERIAL_PROTOCOLCHAR(')'); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   void print_heaterstates() { |  |  |  |   void print_heaterstates() { | 
			
		
	
		
		
			
				
					
					|  |  |  |     #if HAS_TEMP_HOTEND |  |  |  |     #if HAS_TEMP_HOTEND | 
			
		
	
		
		
			
				
					
					|  |  |  |       SERIAL_PROTOCOLPGM(" T:"); |  |  |  |       print_heater_state(thermalManager.degHotend(target_extruder), thermalManager.degTargetHotend(target_extruder) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       SERIAL_PROTOCOL(thermalManager.degHotend(target_extruder)); |  |  |  |         #if ENABLED(SHOW_TEMP_ADC_VALUES) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       SERIAL_PROTOCOLPGM(" /"); |  |  |  |           , thermalManager.rawHotendTemp(target_extruder) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       SERIAL_PROTOCOL(thermalManager.degTargetHotend(target_extruder)); |  |  |  |         #endif | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       #if ENABLED(SHOW_TEMP_ADC_VALUES) |  |  |  |       ); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         SERIAL_PROTOCOLPAIR(" (", thermalManager.rawHotendTemp(target_extruder) / OVERSAMPLENR); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         SERIAL_PROTOCOLCHAR(')'); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       #endif |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     #endif |  |  |  |     #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |     #if HAS_TEMP_BED |  |  |  |     #if HAS_TEMP_BED | 
			
		
	
		
		
			
				
					
					|  |  |  |       SERIAL_PROTOCOLPGM(" B:"); |  |  |  |       print_heater_state(thermalManager.degBed(), thermalManager.degTargetBed(), | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       SERIAL_PROTOCOL(thermalManager.degBed()); |  |  |  |         #if ENABLED(SHOW_TEMP_ADC_VALUES) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       SERIAL_PROTOCOLPGM(" /"); |  |  |  |           thermalManager.rawBedTemp(), | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       SERIAL_PROTOCOL(thermalManager.degTargetBed()); |  |  |  |         #endif | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       #if ENABLED(SHOW_TEMP_ADC_VALUES) |  |  |  |         -1 // BED
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         SERIAL_PROTOCOLPAIR(" (", thermalManager.rawBedTemp() / OVERSAMPLENR); |  |  |  |       ); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         SERIAL_PROTOCOLCHAR(')'); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       #endif |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     #endif |  |  |  |     #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |     #if HOTENDS > 1 |  |  |  |     #if HOTENDS > 1 | 
			
		
	
		
		
			
				
					
					|  |  |  |       HOTEND_LOOP() { |  |  |  |       HOTEND_LOOP() print_heater_state(thermalManager.degHotend(e), thermalManager.degTargetHotend(e), | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         SERIAL_PROTOCOLPAIR(" T", e); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         SERIAL_PROTOCOLCHAR(':'); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         SERIAL_PROTOCOL(thermalManager.degHotend(e)); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         SERIAL_PROTOCOLPGM(" /"); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         SERIAL_PROTOCOL(thermalManager.degTargetHotend(e)); |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         #if ENABLED(SHOW_TEMP_ADC_VALUES) |  |  |  |         #if ENABLED(SHOW_TEMP_ADC_VALUES) | 
			
		
	
		
		
			
				
					
					|  |  |  |           SERIAL_PROTOCOLPAIR(" (", thermalManager.rawHotendTemp(e) / OVERSAMPLENR); |  |  |  |           thermalManager.rawHotendTemp(e), | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |           SERIAL_PROTOCOLCHAR(')'); |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         #endif |  |  |  |         #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |       } |  |  |  |         e | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       ); | 
			
		
	
		
		
			
				
					
					|  |  |  |     #endif |  |  |  |     #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |     SERIAL_PROTOCOLPGM(" @:"); |  |  |  |     SERIAL_PROTOCOLPGM(" @:"); | 
			
		
	
		
		
			
				
					
					|  |  |  |     SERIAL_PROTOCOL(thermalManager.getHeaterPower(target_extruder)); |  |  |  |     SERIAL_PROTOCOL(thermalManager.getHeaterPower(target_extruder)); | 
			
		
	
	
		
		
			
				
					|  |  | @ -7206,16 +7224,12 @@ inline void gcode_M109() { | 
			
		
	
		
		
			
				
					
					|  |  |  |       print_heaterstates(); |  |  |  |       print_heaterstates(); | 
			
		
	
		
		
			
				
					
					|  |  |  |       #if TEMP_RESIDENCY_TIME > 0 |  |  |  |       #if TEMP_RESIDENCY_TIME > 0 | 
			
		
	
		
		
			
				
					
					|  |  |  |         SERIAL_PROTOCOLPGM(" W:"); |  |  |  |         SERIAL_PROTOCOLPGM(" W:"); | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (residency_start_ms) { |  |  |  |         if (residency_start_ms) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |           long rem = (((TEMP_RESIDENCY_TIME) * 1000UL) - (now - residency_start_ms)) / 1000UL; |  |  |  |           SERIAL_PROTOCOL(long((((TEMP_RESIDENCY_TIME) * 1000UL) - (now - residency_start_ms)) / 1000UL)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |           SERIAL_PROTOCOLLN(rem); |  |  |  |         else | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |           SERIAL_PROTOCOLCHAR('?'); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         else { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |           SERIAL_PROTOCOLLNPGM("?"); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       #else |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         SERIAL_EOL(); |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |       #endif |  |  |  |       #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       SERIAL_EOL(); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     idle(); |  |  |  |     idle(); | 
			
		
	
	
		
		
			
				
					|  |  | @ -7339,16 +7353,12 @@ inline void gcode_M109() { | 
			
		
	
		
		
			
				
					
					|  |  |  |         print_heaterstates(); |  |  |  |         print_heaterstates(); | 
			
		
	
		
		
			
				
					
					|  |  |  |         #if TEMP_BED_RESIDENCY_TIME > 0 |  |  |  |         #if TEMP_BED_RESIDENCY_TIME > 0 | 
			
		
	
		
		
			
				
					
					|  |  |  |           SERIAL_PROTOCOLPGM(" W:"); |  |  |  |           SERIAL_PROTOCOLPGM(" W:"); | 
			
		
	
		
		
			
				
					
					|  |  |  |           if (residency_start_ms) { |  |  |  |           if (residency_start_ms) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             long rem = (((TEMP_BED_RESIDENCY_TIME) * 1000UL) - (now - residency_start_ms)) / 1000UL; |  |  |  |             SERIAL_PROTOCOL(long((((TEMP_BED_RESIDENCY_TIME) * 1000UL) - (now - residency_start_ms)) / 1000UL)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             SERIAL_PROTOCOLLN(rem); |  |  |  |           else | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |           } |  |  |  |             SERIAL_PROTOCOLCHAR('?'); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |           else { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             SERIAL_PROTOCOLLNPGM("?"); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |           } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         #else |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |           SERIAL_EOL(); |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         #endif |  |  |  |         #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         SERIAL_EOL(); | 
			
		
	
		
		
			
				
					
					|  |  |  |       } |  |  |  |       } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |       idle(); |  |  |  |       idle(); | 
			
		
	
	
		
		
			
				
					|  |  | 
 |