|  |  | @ -200,11 +200,16 @@ static float analog2temp(int raw, uint8_t e); | 
			
		
	
		
		
			
				
					
					|  |  |  | static float analog2tempBed(int raw); |  |  |  | static float analog2tempBed(int raw); | 
			
		
	
		
		
			
				
					
					|  |  |  | static void updateTemperaturesFromRawValues(); |  |  |  | static void updateTemperaturesFromRawValues(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | #if ENABLED(THERMAL_PROTECTION_HOTENDS) |  |  |  | #if ENABLED(THERMAL_PROTECTION_HOTENDS) && WATCH_TEMP_PERIOD > 0 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   int watch_target_temp[EXTRUDERS] = { 0 }; |  |  |  |   int watch_target_temp[EXTRUDERS] = { 0 }; | 
			
		
	
		
		
			
				
					
					|  |  |  |   millis_t watch_heater_next_ms[EXTRUDERS] = { 0 }; |  |  |  |   millis_t watch_heater_next_ms[EXTRUDERS] = { 0 }; | 
			
		
	
		
		
			
				
					
					|  |  |  | #endif |  |  |  | #endif | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | #if ENABLED(THERMAL_PROTECTION_BED) && WATCH_BED_TEMP_PERIOD > 0 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   int watch_target_bed_temp = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   millis_t watch_bed_next_ms = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | #ifndef SOFT_PWM_SCALE |  |  |  | #ifndef SOFT_PWM_SCALE | 
			
		
	
		
		
			
				
					
					|  |  |  |   #define SOFT_PWM_SCALE 0 |  |  |  |   #define SOFT_PWM_SCALE 0 | 
			
		
	
		
		
			
				
					
					|  |  |  | #endif |  |  |  | #endif | 
			
		
	
	
		
		
			
				
					|  |  | @ -717,7 +722,7 @@ void manage_heater() { | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (ct < max(HEATER_0_MINTEMP, 0.01)) min_temp_error(0); |  |  |  |     if (ct < max(HEATER_0_MINTEMP, 0.01)) min_temp_error(0); | 
			
		
	
		
		
			
				
					
					|  |  |  |   #endif |  |  |  |   #endif | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   #if ENABLED(THERMAL_PROTECTION_HOTENDS) || DISABLED(PIDTEMPBED) || HAS_AUTO_FAN |  |  |  |   #if (ENABLED(THERMAL_PROTECTION_HOTENDS) && WATCH_TEMP_PERIOD > 0) || (ENABLED(THERMAL_PROTECTION_BED) && WATCH_BED_TEMP_PERIOD > 0) || DISABLED(PIDTEMPBED) || HAS_AUTO_FAN | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     millis_t ms = millis(); |  |  |  |     millis_t ms = millis(); | 
			
		
	
		
		
			
				
					
					|  |  |  |   #endif |  |  |  |   #endif | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -734,7 +739,7 @@ void manage_heater() { | 
			
		
	
		
		
			
				
					
					|  |  |  |     soft_pwm[e] = current_temperature[e] > minttemp[e] && current_temperature[e] < maxttemp[e] ? (int)pid_output >> 1 : 0; |  |  |  |     soft_pwm[e] = current_temperature[e] > minttemp[e] && current_temperature[e] < maxttemp[e] ? (int)pid_output >> 1 : 0; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     // Check if the temperature is failing to increase
 |  |  |  |     // Check if the temperature is failing to increase
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     #if ENABLED(THERMAL_PROTECTION_HOTENDS) |  |  |  |     #if ENABLED(THERMAL_PROTECTION_HOTENDS) && WATCH_TEMP_PERIOD > 0 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |       // Is it time to check this extruder's heater?
 |  |  |  |       // Is it time to check this extruder's heater?
 | 
			
		
	
		
		
			
				
					
					|  |  |  |       if (watch_heater_next_ms[e] && ELAPSED(ms, watch_heater_next_ms[e])) { |  |  |  |       if (watch_heater_next_ms[e] && ELAPSED(ms, watch_heater_next_ms[e])) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -751,6 +756,24 @@ void manage_heater() { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     #endif // THERMAL_PROTECTION_HOTENDS
 |  |  |  |     #endif // THERMAL_PROTECTION_HOTENDS
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     // Check if the temperature is failing to increase
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     #if ENABLED(THERMAL_PROTECTION_BED) && WATCH_BED_TEMP_PERIOD > 0 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       // Is it time to check the bed?
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       if (watch_bed_next_ms && ELAPSED(ms, watch_bed_next_ms)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // Has it failed to increase enough?
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (degBed() < watch_target_bed_temp) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           // Stop!
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           _temp_error(-1, PSTR(MSG_T_HEATING_FAILED), PSTR(MSG_HEATING_FAILED_LCD)); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         else { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           // Start again if the target is still far off
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           start_watching_bed(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     #endif // THERMAL_PROTECTION_HOTENDS
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) |  |  |  |     #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) | 
			
		
	
		
		
			
				
					
					|  |  |  |       if (fabs(current_temperature[0] - redundant_temperature) > MAX_REDUNDANT_TEMP_SENSOR_DIFF) { |  |  |  |       if (fabs(current_temperature[0] - redundant_temperature) > MAX_REDUNDANT_TEMP_SENSOR_DIFF) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         _temp_error(0, PSTR(MSG_REDUNDANCY), PSTR(MSG_ERR_REDUNDANT_TEMP)); |  |  |  |         _temp_error(0, PSTR(MSG_REDUNDANCY), PSTR(MSG_ERR_REDUNDANT_TEMP)); | 
			
		
	
	
		
		
			
				
					|  |  | @ -1160,7 +1183,7 @@ void tp_init() { | 
			
		
	
		
		
			
				
					
					|  |  |  |   #endif //BED_MAXTEMP
 |  |  |  |   #endif //BED_MAXTEMP
 | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | #if ENABLED(THERMAL_PROTECTION_HOTENDS) |  |  |  | #if ENABLED(THERMAL_PROTECTION_HOTENDS) && WATCH_TEMP_PERIOD > 0 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   /**
 |  |  |  |   /**
 | 
			
		
	
		
		
			
				
					
					|  |  |  |    * Start Heating Sanity Check for hotends that are below |  |  |  |    * Start Heating Sanity Check for hotends that are below | 
			
		
	
		
		
			
				
					
					|  |  |  |    * their target temperature by a configurable margin. |  |  |  |    * their target temperature by a configurable margin. | 
			
		
	
	
		
		
			
				
					|  |  | @ -1176,6 +1199,22 @@ void tp_init() { | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | #endif |  |  |  | #endif | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | #if ENABLED(THERMAL_PROTECTION_BED) && WATCH_BED_TEMP_PERIOD > 0 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   /**
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |    * Start Heating Sanity Check for hotends that are below | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |    * their target temperature by a configurable margin. | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |    * This is called when the temperature is set. (M140, M190) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |    */ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   void start_watching_bed() { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if (degBed() < degTargetBed() - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       watch_target_bed_temp = degBed() + WATCH_BED_TEMP_INCREASE; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       watch_bed_next_ms = millis() + (WATCH_BED_TEMP_PERIOD) * 1000UL; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     else | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       watch_bed_next_ms = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | #if ENABLED(THERMAL_PROTECTION_HOTENDS) || ENABLED(THERMAL_PROTECTION_BED) |  |  |  | #if ENABLED(THERMAL_PROTECTION_HOTENDS) || ENABLED(THERMAL_PROTECTION_BED) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   void thermal_runaway_protection(TRState* state, millis_t* timer, float temperature, float target_temperature, int heater_id, int period_seconds, int hysteresis_degc) { |  |  |  |   void thermal_runaway_protection(TRState* state, millis_t* timer, float temperature, float target_temperature, int heater_id, int period_seconds, int hysteresis_degc) { | 
			
		
	
	
		
		
			
				
					|  |  | 
 |