| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -736,17 +736,6 @@ float Temperature::get_pid_output(const int8_t e) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 *  - Apply filament width to the extrusion rate (may move)
 | 
					 | 
					 | 
					 | 
					 *  - Apply filament width to the extrusion rate (may move)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 *  - Update the heated bed PID output value
 | 
					 | 
					 | 
					 | 
					 *  - Update the heated bed PID output value
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 */
 | 
					 | 
					 | 
					 | 
					 */
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					/**
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 * The following line SOMETIMES results in the dreaded "unable to find a register to spill in class 'POINTER_REGS'"
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 * compile error.
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 *    thermal_runaway_protection(&thermal_runaway_state_machine[e], &thermal_runaway_timer[e], current_temperature[e], target_temperature[e], e, THERMAL_PROTECTION_PERIOD, THERMAL_PROTECTION_HYSTERESIS);
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 *
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 * This is due to a bug in the C++ compiler used by the Arduino IDE from 1.6.10 to at least 1.8.1.
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 *
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 * The work around is to add the compiler flag "__attribute__((__optimize__("O2")))" to the declaration for manage_heater()
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 */
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					//void Temperature::manage_heater()  __attribute__((__optimize__("O2")));
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void Temperature::manage_heater() {
 | 
					 | 
					 | 
					 | 
					void Temperature::manage_heater() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (!temp_meas_ready) return;
 | 
					 | 
					 | 
					 | 
					  if (!temp_meas_ready) return;
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -801,19 +790,16 @@ void Temperature::manage_heater() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  #endif
 | 
					 | 
					 | 
					 | 
					  #endif
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  // Control the extruder rate based on the width sensor
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  #if ENABLED(FILAMENT_WIDTH_SENSOR)
 | 
					 | 
					 | 
					 | 
					  #if ENABLED(FILAMENT_WIDTH_SENSOR)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    /**
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					     * Filament Width Sensor dynamically sets the volumetric multiplier
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					     * based on a delayed measurement of the filament diameter.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					     */
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (filament_sensor) {
 | 
					 | 
					 | 
					 | 
					    if (filament_sensor) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      meas_shift_index = filwidth_delay_index[0] - meas_delay_cm;
 | 
					 | 
					 | 
					 | 
					      meas_shift_index = filwidth_delay_index[0] - meas_delay_cm;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if (meas_shift_index < 0) meas_shift_index += MAX_MEASUREMENT_DELAY + 1;  //loop around buffer if needed
 | 
					 | 
					 | 
					 | 
					      if (meas_shift_index < 0) meas_shift_index += MAX_MEASUREMENT_DELAY + 1;  //loop around buffer if needed
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      meas_shift_index = constrain(meas_shift_index, 0, MAX_MEASUREMENT_DELAY);
 | 
					 | 
					 | 
					 | 
					      meas_shift_index = constrain(meas_shift_index, 0, MAX_MEASUREMENT_DELAY);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					      calculate_volumetric_for_width_sensor(measurement_delay[meas_shift_index])
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      // Get the delayed info and add 100 to reconstitute to a percent of
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      // the nominal filament diameter then square it to get an area
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      float vmroot = measurement_delay[meas_shift_index] * 0.01 + 1.0;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      NOLESS(vmroot, 0.1);
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] = 1.0 / CIRCLE_AREA(vmroot / 2);
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      planner.refresh_e_factor(FILAMENT_SENSOR_EXTRUDER_NUM);
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  #endif // FILAMENT_WIDTH_SENSOR
 | 
					 | 
					 | 
					 | 
					  #endif // FILAMENT_WIDTH_SENSOR
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -999,15 +985,20 @@ void Temperature::updateTemperaturesFromRawValues() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  // Convert raw Filament Width to millimeters
 | 
					 | 
					 | 
					 | 
					  // Convert raw Filament Width to millimeters
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  float Temperature::analog2widthFil() {
 | 
					 | 
					 | 
					 | 
					  float Temperature::analog2widthFil() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return current_raw_filwidth * 5.0 * (1.0 / 16383.0);
 | 
					 | 
					 | 
					 | 
					    return current_raw_filwidth * 5.0 * (1.0 / 16383.0);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    //return current_raw_filwidth;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  // Convert raw Filament Width to a ratio
 | 
					 | 
					 | 
					 | 
					  /**
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  int Temperature::widthFil_to_size_ratio() {
 | 
					 | 
					 | 
					 | 
					   * Convert Filament Width (mm) to a simple ratio
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    float temp = filament_width_meas;
 | 
					 | 
					 | 
					 | 
					   * and reduce to an 8 bit value.
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (temp < MEASURED_LOWER_LIMIT) temp = filament_width_nominal;  //assume sensor cut out
 | 
					 | 
					 | 
					 | 
					   *
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    else NOMORE(temp, MEASURED_UPPER_LIMIT);
 | 
					 | 
					 | 
					 | 
					   * A nominal width of 1.75 and measured width of 1.73
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return filament_width_nominal / temp * 100;
 | 
					 | 
					 | 
					 | 
					   * gives (100 * 1.75 / 1.73) for a ratio of 101 and
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					   * a return value of 1.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					   */
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  int8_t Temperature::widthFil_to_size_ratio() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    if (WITHIN(filament_width_meas, MEASURED_LOWER_LIMIT, MEASURED_UPPER_LIMIT))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      return int(100.0 * filament_width_nominal / filament_width_meas) - 100;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    return 0;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#endif
 | 
					 | 
					 | 
					 | 
					#endif
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
 
 |