From a9f8e518bf67190207fb318a353b2cab958a8e92 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 23 Jun 2017 14:48:02 -0500 Subject: [PATCH] Fix FILAMENT_WIDTH_SENSOR infinite loop issue Addressing #6992 and #5851 --- Marlin/Marlin.h | 6 +++--- Marlin/Marlin_main.cpp | 10 +++++----- Marlin/planner.cpp | 4 ++-- Marlin/temperature.cpp | 6 +++--- Marlin/temperature.h | 4 ++-- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index 6bb45698e6..307dd370d5 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -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 float filament_width_nominal, // Theoretical filament diameter i.e., 3.00 or 1.75 filament_width_meas; // Measured filament diameter - extern int8_t measurement_delay[]; // Ring buffer to delay measurement - extern int filwidth_delay_index[2]; // Ring buffer indexes. Used by planner, temperature, and main code - extern int meas_delay_cm; // Delay distance + extern uint8_t meas_delay_cm, // Delay distance + measurement_delay[]; // Ring buffer to delay measurement + extern int8_t filwidth_delay_index[2]; // Ring buffer indexes. Used by planner, temperature, and main code #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index f30291f2e2..d5c0cbf81b 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -630,9 +630,9 @@ float cartes[XYZ] = { 0 }; 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. 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 - int filwidth_delay_index[2] = { 0, -1 }; // Indexes into ring buffer - int meas_delay_cm = MEASUREMENT_DELAY_CM; // Distance delay setting + uint8_t meas_delay_cm = MEASUREMENT_DELAY_CM, // Distance delay setting + measurement_delay[MAX_MEASUREMENT_DELAY + 1]; // Ring buffer to delayed measurement. Store extruder factor after subtracting 100 + int8_t filwidth_delay_index[2] = { 0, -1 }; // Indexes into ring buffer #endif #if ENABLED(FILAMENT_RUNOUT_SENSOR) @@ -8898,11 +8898,11 @@ inline void gcode_M400() { stepper.synchronize(); } inline void gcode_M405() { // 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(). - 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); 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) measurement_delay[i] = temp_ratio; diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp index 5897e4fe6a..8cac74f146 100644 --- a/Marlin/planner.cpp +++ b/Marlin/planner.cpp @@ -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; // 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 (filwidth_delay_index[0] != filwidth_delay_index[1]) { 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 { 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 diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index 99aec7f4da..6111bab442 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -180,7 +180,7 @@ int16_t Temperature::minttemp_raw[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_RAW_LO_TE #endif #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 #if HAS_AUTO_FAN @@ -196,7 +196,7 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS], #endif #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 #if ENABLED(PROBING_HEATERS_OFF) @@ -957,7 +957,7 @@ void Temperature::updateTemperaturesFromRawValues() { // Convert raw Filament Width to millimeters 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; } diff --git a/Marlin/temperature.h b/Marlin/temperature.h index 9437685789..60a85684a2 100644 --- a/Marlin/temperature.h +++ b/Marlin/temperature.h @@ -247,7 +247,7 @@ class Temperature { #endif #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 #if HAS_AUTO_FAN @@ -255,7 +255,7 @@ class Temperature { #endif #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 #if ENABLED(PROBING_HEATERS_OFF)