Fix FILAMENT_WIDTH_SENSOR infinite loop issue
Addressing #6992 and #5851
This commit is contained in:
		| @@ -370,9 +370,9 @@ extern float soft_endstop_min[XYZ], soft_endstop_max[XYZ]; | |||||||
|   extern bool filament_sensor;         // Flag that filament sensor readings should control extrusion |   extern bool filament_sensor;         // Flag that filament sensor readings should control extrusion | ||||||
|   extern float filament_width_nominal, // Theoretical filament diameter i.e., 3.00 or 1.75 |   extern float filament_width_nominal, // Theoretical filament diameter i.e., 3.00 or 1.75 | ||||||
|                filament_width_meas;    // Measured filament diameter |                filament_width_meas;    // Measured filament diameter | ||||||
|   extern int8_t measurement_delay[];   // Ring buffer to delay measurement |   extern uint8_t meas_delay_cm,        // Delay distance | ||||||
|   extern int filwidth_delay_index[2];  // Ring buffer indexes. Used by planner, temperature, and main code |                  measurement_delay[];  // Ring buffer to delay measurement | ||||||
|   extern int meas_delay_cm;            // Delay distance |   extern int8_t filwidth_delay_index[2]; // Ring buffer indexes. Used by planner, temperature, and main code | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if ENABLED(ADVANCED_PAUSE_FEATURE) | #if ENABLED(ADVANCED_PAUSE_FEATURE) | ||||||
|   | |||||||
| @@ -630,9 +630,9 @@ float cartes[XYZ] = { 0 }; | |||||||
|   bool filament_sensor = false;                                 // M405 turns on filament sensor control. M406 turns it off. |   bool filament_sensor = false;                                 // M405 turns on filament sensor control. M406 turns it off. | ||||||
|   float filament_width_nominal = DEFAULT_NOMINAL_FILAMENT_DIA,  // Nominal filament width. Change with M404. |   float filament_width_nominal = DEFAULT_NOMINAL_FILAMENT_DIA,  // Nominal filament width. Change with M404. | ||||||
|         filament_width_meas = DEFAULT_MEASURED_FILAMENT_DIA;    // Measured filament diameter |         filament_width_meas = DEFAULT_MEASURED_FILAMENT_DIA;    // Measured filament diameter | ||||||
|   int8_t measurement_delay[MAX_MEASUREMENT_DELAY + 1];          // Ring buffer to delayed measurement. Store extruder factor after subtracting 100 |   uint8_t meas_delay_cm = MEASUREMENT_DELAY_CM,                 // Distance delay setting | ||||||
|   int filwidth_delay_index[2] = { 0, -1 };                      // Indexes into ring buffer |           measurement_delay[MAX_MEASUREMENT_DELAY + 1];         // Ring buffer to delayed measurement. Store extruder factor after subtracting 100 | ||||||
|   int meas_delay_cm = MEASUREMENT_DELAY_CM;                     // Distance delay setting |   int8_t filwidth_delay_index[2] = { 0, -1 };                   // Indexes into ring buffer | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if ENABLED(FILAMENT_RUNOUT_SENSOR) | #if ENABLED(FILAMENT_RUNOUT_SENSOR) | ||||||
| @@ -8898,11 +8898,11 @@ inline void gcode_M400() { stepper.synchronize(); } | |||||||
|   inline void gcode_M405() { |   inline void gcode_M405() { | ||||||
|     // This is technically a linear measurement, but since it's quantized to centimeters and is a different unit than |     // This is technically a linear measurement, but since it's quantized to centimeters and is a different unit than | ||||||
|     // everything else, it uses parser.value_int() instead of parser.value_linear_units(). |     // everything else, it uses parser.value_int() instead of parser.value_linear_units(). | ||||||
|     if (parser.seen('D')) meas_delay_cm = parser.value_int(); |     if (parser.seen('D')) meas_delay_cm = parser.value_byte(); | ||||||
|     NOMORE(meas_delay_cm, MAX_MEASUREMENT_DELAY); |     NOMORE(meas_delay_cm, MAX_MEASUREMENT_DELAY); | ||||||
|  |  | ||||||
|     if (filwidth_delay_index[1] == -1) { // Initialize the ring buffer if not done since startup |     if (filwidth_delay_index[1] == -1) { // Initialize the ring buffer if not done since startup | ||||||
|       const int temp_ratio = thermalManager.widthFil_to_size_ratio() - 100; // -100 to scale within a signed byte |       const uint8_t temp_ratio = thermalManager.widthFil_to_size_ratio() - 100; // -100 to scale within a signed byte | ||||||
|  |  | ||||||
|       for (uint8_t i = 0; i < COUNT(measurement_delay); ++i) |       for (uint8_t i = 0; i < COUNT(measurement_delay); ++i) | ||||||
|         measurement_delay[i] = temp_ratio; |         measurement_delay[i] = temp_ratio; | ||||||
|   | |||||||
| @@ -1103,12 +1103,12 @@ void Planner::_buffer_line(const float &a, const float &b, const float &c, const | |||||||
|         while (filwidth_delay_dist >= MMD_MM) filwidth_delay_dist -= MMD_MM; |         while (filwidth_delay_dist >= MMD_MM) filwidth_delay_dist -= MMD_MM; | ||||||
|  |  | ||||||
|         // Convert into an index into the measurement array |         // Convert into an index into the measurement array | ||||||
|         filwidth_delay_index[0] = (int)(filwidth_delay_dist * 0.1 + 0.0001); |         filwidth_delay_index[0] = int8_t(filwidth_delay_dist * 0.1); | ||||||
|  |  | ||||||
|         // If the index has changed (must have gone forward)... |         // If the index has changed (must have gone forward)... | ||||||
|         if (filwidth_delay_index[0] != filwidth_delay_index[1]) { |         if (filwidth_delay_index[0] != filwidth_delay_index[1]) { | ||||||
|           filwidth_e_count = 0; // Reset the E movement counter |           filwidth_e_count = 0; // Reset the E movement counter | ||||||
|           const int8_t meas_sample = thermalManager.widthFil_to_size_ratio() - 100; // Subtract 100 to reduce magnitude - to store in a signed char |           const uint8_t meas_sample = thermalManager.widthFil_to_size_ratio() - 100; // Subtract 100 to reduce magnitude - to store in a signed char | ||||||
|           do { |           do { | ||||||
|             filwidth_delay_index[1] = (filwidth_delay_index[1] + 1) % MMD_CM; // The next unused slot |             filwidth_delay_index[1] = (filwidth_delay_index[1] + 1) % MMD_CM; // The next unused slot | ||||||
|             measurement_delay[filwidth_delay_index[1]] = meas_sample;         // Store the measurement |             measurement_delay[filwidth_delay_index[1]] = meas_sample;         // Store the measurement | ||||||
|   | |||||||
| @@ -180,7 +180,7 @@ int16_t Temperature::minttemp_raw[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_RAW_LO_TE | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if ENABLED(FILAMENT_WIDTH_SENSOR) | #if ENABLED(FILAMENT_WIDTH_SENSOR) | ||||||
|   int16_t Temperature::meas_shift_index;  // Index of a delayed sample in buffer |   int8_t Temperature::meas_shift_index;  // Index of a delayed sample in buffer | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if HAS_AUTO_FAN | #if HAS_AUTO_FAN | ||||||
| @@ -196,7 +196,7 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS], | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if ENABLED(FILAMENT_WIDTH_SENSOR) | #if ENABLED(FILAMENT_WIDTH_SENSOR) | ||||||
|   int Temperature::current_raw_filwidth = 0;  //Holds measured filament diameter - one extruder only |   uint16_t Temperature::current_raw_filwidth = 0; // Measured filament diameter - one extruder only | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if ENABLED(PROBING_HEATERS_OFF) | #if ENABLED(PROBING_HEATERS_OFF) | ||||||
| @@ -957,7 +957,7 @@ 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 / 16383.0 * 5.0; |     return current_raw_filwidth * 5.0 * (1.0 / 16383.0); | ||||||
|     //return current_raw_filwidth; |     //return current_raw_filwidth; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -247,7 +247,7 @@ class Temperature { | |||||||
|     #endif |     #endif | ||||||
|  |  | ||||||
|     #if ENABLED(FILAMENT_WIDTH_SENSOR) |     #if ENABLED(FILAMENT_WIDTH_SENSOR) | ||||||
|       static int16_t meas_shift_index;  // Index of a delayed sample in buffer |       static int8_t meas_shift_index;  // Index of a delayed sample in buffer | ||||||
|     #endif |     #endif | ||||||
|  |  | ||||||
|     #if HAS_AUTO_FAN |     #if HAS_AUTO_FAN | ||||||
| @@ -255,7 +255,7 @@ class Temperature { | |||||||
|     #endif |     #endif | ||||||
|  |  | ||||||
|     #if ENABLED(FILAMENT_WIDTH_SENSOR) |     #if ENABLED(FILAMENT_WIDTH_SENSOR) | ||||||
|       static int current_raw_filwidth;  //Holds measured filament diameter - one extruder only |       static uint16_t current_raw_filwidth; // Measured filament diameter - one extruder only | ||||||
|     #endif |     #endif | ||||||
|  |  | ||||||
|     #if ENABLED(PROBING_HEATERS_OFF) |     #if ENABLED(PROBING_HEATERS_OFF) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user