From ecdf68735f692903a9ddece0815c7fe181c1273f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 May 2017 01:06:53 -0500 Subject: [PATCH 1/6] Compact smart_fill_mesh slightly --- Marlin/ubl_G29.cpp | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/Marlin/ubl_G29.cpp b/Marlin/ubl_G29.cpp index e9f97b4ad..024ff759b 100644 --- a/Marlin/ubl_G29.cpp +++ b/Marlin/ubl_G29.cpp @@ -1533,21 +1533,6 @@ typedef struct { uint8_t sx, ex, sy, ey; bool yfirst; } smart_fill_info; - void smart_fill_loop(const smart_fill_info &f) { - if (f.yfirst) { - const int8_t dir = f.ex > f.sx ? 1 : -1; - for (uint8_t y = f.sy; y != f.ey; ++y) - for (uint8_t x = f.sx; x != f.ex; x += dir) - if (smart_fill_one(x, y, dir, 0)) break; - } - else { - const int8_t dir = f.ey > f.sy ? 1 : -1; - for (uint8_t x = f.sx; x != f.ex; ++x) - for (uint8_t y = f.sy; y != f.ey; y += dir) - if (smart_fill_one(x, y, 0, dir)) break; - } - } - void smart_fill_mesh() { const smart_fill_info info[] = { { 0, GRID_MAX_POINTS_X, 0, GRID_MAX_POINTS_Y - 2, false }, // Bottom of the mesh looking up @@ -1555,7 +1540,21 @@ { 0, GRID_MAX_POINTS_X - 2, 0, GRID_MAX_POINTS_Y, true }, // Left side of the mesh looking right { GRID_MAX_POINTS_X - 1, 0, 0, GRID_MAX_POINTS_Y, true } // Right side of the mesh looking left }; - for (uint8_t i = 0; i < COUNT(info); ++i) smart_fill_loop(info[i]); + for (uint8_t i = 0; i < COUNT(info); ++i) { + const smart_fill_info &f = info[i]; + if (f.yfirst) { + const int8_t dir = f.ex > f.sx ? 1 : -1; + for (uint8_t y = f.sy; y != f.ey; ++y) + for (uint8_t x = f.sx; x != f.ex; x += dir) + if (smart_fill_one(x, y, dir, 0)) break; + } + else { + const int8_t dir = f.ey > f.sy ? 1 : -1; + for (uint8_t x = f.sx; x != f.ex; ++x) + for (uint8_t y = f.sy; y != f.ey; y += dir) + if (smart_fill_one(x, y, 0, dir)) break; + } + } } void unified_bed_leveling::tilt_mesh_based_on_probed_grid(const bool do_ubl_mesh_map) { From de5e485ed757b6ea8a8c709e79fa98aa4a58e227 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 May 2017 01:19:44 -0500 Subject: [PATCH 2/6] Explicit upward angle solution --- Marlin/ubl_G29.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Marlin/ubl_G29.cpp b/Marlin/ubl_G29.cpp index 024ff759b..b26096a97 100644 --- a/Marlin/ubl_G29.cpp +++ b/Marlin/ubl_G29.cpp @@ -1522,10 +1522,8 @@ if (isnan(ubl.z_values[x][y]) && !isnan(ubl.z_values[x1][y1]) && !isnan(ubl.z_values[x2][y2])) { if (ubl.z_values[x1][y1] < ubl.z_values[x2][y2]) // Angled downward? ubl.z_values[x][y] = ubl.z_values[x1][y1]; // Use nearest (maybe a little too high.) - else { - const float diff = ubl.z_values[x1][y1] - ubl.z_values[x2][y2]; // Angled upward - ubl.z_values[x][y] = ubl.z_values[x1][y1] + diff; // Use closest plus difference - } + else + ubl.z_values[x][y] = 2.0 * ubl.z_values[x1][y1] - ubl.z_values[x2][y2]; // Angled upward... return true; } return false; From 241bdffe65ea4ef8c776bc68b75a77c07cb7e3bf Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 May 2017 01:47:16 -0500 Subject: [PATCH 3/6] Dress up Bilinear Leveling code --- Marlin/Marlin_main.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index c7a00f595..b25da7840 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -2588,7 +2588,7 @@ static void clean_up_after_endstop_or_probe_move() { /** * Extrapolate a single point from its neighbors */ - static void extrapolate_one_point(uint8_t x, uint8_t y, int8_t xdir, int8_t ydir) { + static void extrapolate_one_point(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir) { #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) { SERIAL_ECHOPGM("Extrapolate ["); @@ -2611,9 +2611,10 @@ static void clean_up_after_endstop_or_probe_move() { SERIAL_EOL; // Get X neighbors, Y neighbors, and XY neighbors - float a1 = z_values[x + xdir][y], a2 = z_values[x + xdir * 2][y], - b1 = z_values[x][y + ydir], b2 = z_values[x][y + ydir * 2], - c1 = z_values[x + xdir][y + ydir], c2 = z_values[x + xdir * 2][y + ydir * 2]; + const uint8_t x1 = x + xdir, y1 = y + ydir, x2 = x1 + xdir, y2 = y1 + ydir; + float a1 = z_values[x1][y ], a2 = z_values[x2][y ], + b1 = z_values[x ][y1], b2 = z_values[x ][y2], + c1 = z_values[x1][y1], c2 = z_values[x2][y2]; // Treat far unprobed points as zero, near as equal to far if (isnan(a2)) a2 = 0.0; if (isnan(a1)) a1 = a2; @@ -2647,19 +2648,19 @@ static void clean_up_after_endstop_or_probe_move() { */ static void extrapolate_unprobed_bed_level() { #ifdef HALF_IN_X - const uint8_t ctrx2 = 0, xlen = GRID_MAX_POINTS_X - 1; + constexpr uint8_t ctrx2 = 0, xlen = GRID_MAX_POINTS_X - 1; #else - const uint8_t ctrx1 = (GRID_MAX_POINTS_X - 1) / 2, // left-of-center - ctrx2 = GRID_MAX_POINTS_X / 2, // right-of-center - xlen = ctrx1; + constexpr uint8_t ctrx1 = (GRID_MAX_POINTS_X - 1) / 2, // left-of-center + ctrx2 = (GRID_MAX_POINTS_X) / 2, // right-of-center + xlen = ctrx1; #endif #ifdef HALF_IN_Y - const uint8_t ctry2 = 0, ylen = GRID_MAX_POINTS_Y - 1; + constexpr uint8_t ctry2 = 0, ylen = GRID_MAX_POINTS_Y - 1; #else - const uint8_t ctry1 = (GRID_MAX_POINTS_Y - 1) / 2, // top-of-center - ctry2 = GRID_MAX_POINTS_Y / 2, // bottom-of-center - ylen = ctry1; + constexpr uint8_t ctry1 = (GRID_MAX_POINTS_Y - 1) / 2, // top-of-center + ctry2 = (GRID_MAX_POINTS_Y) / 2, // bottom-of-center + ylen = ctry1; #endif for (uint8_t xo = 0; xo <= xlen; xo++) From 1b2c7ec20a23af57da50dafa672283ff09bbaf51 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 May 2017 17:10:44 -0500 Subject: [PATCH 4/6] Make G26 compatible with inches and thermal unit modes --- Marlin/G26_Mesh_Validation_Tool.cpp | 31 ++++++++++++++++------------- Marlin/Marlin.h | 14 +++++++++++-- Marlin/Marlin_main.cpp | 7 ------- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/Marlin/G26_Mesh_Validation_Tool.cpp b/Marlin/G26_Mesh_Validation_Tool.cpp index 0a382c553..0924d7d8b 100644 --- a/Marlin/G26_Mesh_Validation_Tool.cpp +++ b/Marlin/G26_Mesh_Validation_Tool.cpp @@ -126,6 +126,8 @@ void set_destination_to_current(); void set_current_to_destination(); float code_value_float(); + float code_value_linear_units(); + float code_value_axis_units(const AxisEnum axis); bool code_value_bool(); bool code_has_value(); void lcd_init(); @@ -164,10 +166,11 @@ filament_diameter = FILAMENT, prime_length = PRIME_LENGTH, x_pos, y_pos, - bed_temp = BED_TEMP, - hotend_temp = HOTEND_TEMP, ooze_amount = OOZE_AMOUNT; + static int16_t bed_temp = BED_TEMP, + hotend_temp = HOTEND_TEMP; + static int8_t prime_flag = 0; static bool keep_heaters_on = false; @@ -379,9 +382,9 @@ if (!keep_heaters_on) { #if HAS_TEMP_BED - thermalManager.setTargetBed(0.0); + thermalManager.setTargetBed(0); #endif - thermalManager.setTargetHotend(0.0, 0); + thermalManager.setTargetHotend(0, 0); } } @@ -640,8 +643,8 @@ keep_heaters_on = false; if (code_seen('B')) { - bed_temp = code_value_float(); - if (!WITHIN(bed_temp, 15.0, 140.0)) { + bed_temp = code_value_temp_abs(); + if (!WITHIN(bed_temp, 15, 140)) { SERIAL_PROTOCOLLNPGM("?Specified bed temperature not plausible."); return UBL_ERR; } @@ -650,7 +653,7 @@ if (code_seen('C')) continue_with_closest++; if (code_seen('L')) { - layer_height = code_value_float(); + layer_height = code_value_linear_units(); if (!WITHIN(layer_height, 0.0, 2.0)) { SERIAL_PROTOCOLLNPGM("?Specified layer height not plausible."); return UBL_ERR; @@ -682,14 +685,14 @@ if (code_seen('K')) keep_heaters_on++; if (code_seen('O') && code_has_value()) - ooze_amount = code_value_float(); + ooze_amount = code_value_linear_units(); if (code_seen('P')) { if (!code_has_value()) prime_flag = -1; else { prime_flag++; - prime_length = code_value_float(); + prime_length = code_value_linear_units(); if (!WITHIN(prime_length, 0.0, 25.0)) { SERIAL_PROTOCOLLNPGM("?Specified prime length not plausible."); return UBL_ERR; @@ -698,7 +701,7 @@ } if (code_seen('F')) { - filament_diameter = code_value_float(); + filament_diameter = code_value_linear_units(); if (!WITHIN(filament_diameter, 1.0, 4.0)) { SERIAL_PROTOCOLLNPGM("?Specified filament size not plausible."); return UBL_ERR; @@ -711,8 +714,8 @@ extrusion_multiplier *= filament_diameter * sq(nozzle) / sq(0.3); // Scale up by nozzle size if (code_seen('H')) { - hotend_temp = code_value_float(); - if (!WITHIN(hotend_temp, 165.0, 280.0)) { + hotend_temp = code_value_temp_abs(); + if (!WITHIN(hotend_temp, 165, 280)) { SERIAL_PROTOCOLLNPGM("?Specified nozzle temperature not plausible."); return UBL_ERR; } @@ -727,7 +730,7 @@ y_pos = current_position[Y_AXIS]; if (code_seen('X')) { - x_pos = code_value_float(); + x_pos = code_value_axis_units(X_AXIS); if (!WITHIN(x_pos, X_MIN_POS, X_MAX_POS)) { SERIAL_PROTOCOLLNPGM("?Specified X coordinate not plausible."); return UBL_ERR; @@ -736,7 +739,7 @@ else if (code_seen('Y')) { - y_pos = code_value_float(); + y_pos = code_value_axis_units(Y_AXIS); if (!WITHIN(y_pos, Y_MIN_POS, Y_MAX_POS)) { SERIAL_PROTOCOLLNPGM("?Specified Y coordinate not plausible."); return UBL_ERR; diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index 1754a6277..effcda259 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -290,8 +290,18 @@ extern float soft_endstop_min[XYZ], soft_endstop_max[XYZ]; // GCode support for external objects bool code_seen(char); int code_value_int(); -float code_value_temp_abs(); -float code_value_temp_diff(); +int16_t code_value_temp_abs(); +int16_t code_value_temp_diff(); + +#if ENABLED(INCH_MODE_SUPPORT) + float code_value_linear_units(); + float code_value_axis_units(const AxisEnum axis); + float code_value_per_axis_unit(const AxisEnum axis); +#else + #define code_value_linear_units() code_value_float() + #define code_value_axis_units(A) code_value_float() + #define code_value_per_axis_unit(A) code_value_float() +#endif #if IS_KINEMATIC extern float delta[ABC]; diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index b25da7840..51c28c854 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -1292,13 +1292,6 @@ inline bool code_value_bool() { return !code_has_value() || code_value_byte() > inline float code_value_linear_units() { return code_value_float() * linear_unit_factor; } inline float code_value_axis_units(const AxisEnum axis) { return code_value_float() * axis_unit_factor(axis); } inline float code_value_per_axis_unit(const AxisEnum axis) { return code_value_float() / axis_unit_factor(axis); } - -#else - - #define code_value_linear_units() code_value_float() - #define code_value_axis_units(A) code_value_float() - #define code_value_per_axis_unit(A) code_value_float() - #endif #if ENABLED(TEMPERATURE_UNITS_SUPPORT) From 2658cc707ad03600c364cafb7adbfa6261c3f577 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 May 2017 17:12:14 -0500 Subject: [PATCH 5/6] Treat temperature as integer, when possible --- Marlin/Marlin.h | 2 +- Marlin/Marlin_main.cpp | 53 +++++++++++++++++++------------------ Marlin/planner.cpp | 5 +--- Marlin/temperature.cpp | 56 +++++++++++++++++++-------------------- Marlin/temperature.h | 60 +++++++++++++++++++++--------------------- Marlin/ultralcd.cpp | 4 +-- 6 files changed, 89 insertions(+), 91 deletions(-) diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index effcda259..e7bf2df73 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -361,7 +361,7 @@ int16_t code_value_temp_diff(); #endif #if FAN_COUNT > 0 - extern int fanSpeeds[FAN_COUNT]; + extern int16_t fanSpeeds[FAN_COUNT]; #endif #if ENABLED(BARICUDA) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 51c28c854..5b27a9a8a 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -440,7 +440,7 @@ float soft_endstop_min[XYZ] = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS }, soft_endstop_max[XYZ] = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS }; #if FAN_COUNT > 0 - int fanSpeeds[FAN_COUNT] = { 0 }; + int16_t fanSpeeds[FAN_COUNT] = { 0 }; #endif // The active extruder (tool). Set with T command. @@ -1297,20 +1297,19 @@ inline bool code_value_bool() { return !code_has_value() || code_value_byte() > #if ENABLED(TEMPERATURE_UNITS_SUPPORT) inline void set_input_temp_units(TempUnit units) { input_temp_units = units; } - float code_value_temp_abs() { + int16_t code_value_temp_abs() { switch (input_temp_units) { - case TEMPUNIT_C: - return code_value_float(); case TEMPUNIT_F: return (code_value_float() - 32) * 0.5555555556; case TEMPUNIT_K: return code_value_float() - 273.15; + case TEMPUNIT_C: default: - return code_value_float(); + return code_value_int(); } } - float code_value_temp_diff() { + int16_t code_value_temp_diff() { switch (input_temp_units) { case TEMPUNIT_C: case TEMPUNIT_K: @@ -1322,8 +1321,8 @@ inline bool code_value_bool() { return !code_has_value() || code_value_byte() > } } #else - float code_value_temp_abs() { return code_value_float(); } - float code_value_temp_diff() { return code_value_float(); } + int16_t code_value_temp_abs() { return code_value_int(); } + int16_t code_value_temp_diff() { return code_value_int(); } #endif FORCE_INLINE millis_t code_value_millis() { return code_value_ulong(); } @@ -1384,7 +1383,7 @@ bool get_target_extruder_from_command(int code) { static float raised_parked_position[XYZE]; // used in mode 1 static millis_t delayed_move_time = 0; // used in mode 1 static float duplicate_extruder_x_offset = DEFAULT_DUPLICATION_X_OFFSET; // used in mode 2 - static float duplicate_extruder_temp_offset = 0; // used in mode 2 + static int16_t duplicate_extruder_temp_offset = 0; // used in mode 2 #endif // DUAL_X_CARRIAGE @@ -2073,10 +2072,10 @@ static void clean_up_after_endstop_or_probe_move() { void set_heaters_for_bltouch(const bool deploy) { static bool heaters_were_disabled = false; static millis_t next_emi_protection = 0; - static float temps_at_entry[HOTENDS]; + static int16_t temps_at_entry[HOTENDS]; #if HAS_TEMP_BED - static float bed_temp_at_entry; + static int16_t bed_temp_at_entry; #endif // If called out of order or far apart something is seriously wrong @@ -6471,10 +6470,11 @@ inline void gcode_M104() { #endif if (code_seen('S')) { - thermalManager.setTargetHotend(code_value_temp_abs(), target_extruder); + const int16_t temp = code_value_temp_abs(); + thermalManager.setTargetHotend(temp, target_extruder); #if ENABLED(DUAL_X_CARRIAGE) if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && target_extruder == 0) - thermalManager.setTargetHotend(code_value_temp_abs() == 0.0 ? 0.0 : code_value_temp_abs() + duplicate_extruder_temp_offset, 1); + thermalManager.setTargetHotend(temp ? temp + duplicate_extruder_temp_offset : 0, 1); #endif #if ENABLED(PRINTJOB_TIMER_AUTOSTART) @@ -6484,7 +6484,7 @@ inline void gcode_M104() { * standby mode, for instance in a dual extruder setup, without affecting * the running print timer. */ - if (code_value_temp_abs() <= (EXTRUDE_MINTEMP)/2) { + if (code_value_temp_abs() <= (EXTRUDE_MINTEMP) / 2) { print_job_timer.stop(); LCD_MESSAGEPGM(WELCOME_MSG); } @@ -6507,7 +6507,7 @@ inline void gcode_M104() { SERIAL_PROTOCOLPGM(" /"); SERIAL_PROTOCOL_F(thermalManager.degTargetHotend(target_extruder), 1); #if ENABLED(SHOW_TEMP_ADC_VALUES) - SERIAL_PROTOCOLPAIR(" (", thermalManager.current_temperature_raw[target_extruder] / OVERSAMPLENR); + SERIAL_PROTOCOLPAIR(" (", thermalManager.rawHotendTemp(target_extruder) / OVERSAMPLENR); SERIAL_PROTOCOLCHAR(')'); #endif #endif @@ -6517,7 +6517,7 @@ inline void gcode_M104() { SERIAL_PROTOCOLPGM(" /"); SERIAL_PROTOCOL_F(thermalManager.degTargetBed(), 1); #if ENABLED(SHOW_TEMP_ADC_VALUES) - SERIAL_PROTOCOLPAIR(" (", thermalManager.current_temperature_bed_raw / OVERSAMPLENR); + SERIAL_PROTOCOLPAIR(" (", thermalManager.rawBedTemp() / OVERSAMPLENR); SERIAL_PROTOCOLCHAR(')'); #endif #endif @@ -6529,7 +6529,7 @@ inline void gcode_M104() { SERIAL_PROTOCOLPGM(" /"); SERIAL_PROTOCOL_F(thermalManager.degTargetHotend(e), 1); #if ENABLED(SHOW_TEMP_ADC_VALUES) - SERIAL_PROTOCOLPAIR(" (", thermalManager.current_temperature_raw[e] / OVERSAMPLENR); + SERIAL_PROTOCOLPAIR(" (", thermalManager.rawHotendTemp(e) / OVERSAMPLENR); SERIAL_PROTOCOLCHAR(')'); #endif } @@ -6665,10 +6665,11 @@ inline void gcode_M109() { const bool no_wait_for_cooling = code_seen('S'); if (no_wait_for_cooling || code_seen('R')) { - thermalManager.setTargetHotend(code_value_temp_abs(), target_extruder); + const int16_t temp = code_value_temp_abs(); + thermalManager.setTargetHotend(temp, target_extruder); #if ENABLED(DUAL_X_CARRIAGE) if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && target_extruder == 0) - thermalManager.setTargetHotend(code_value_temp_abs() == 0.0 ? 0.0 : code_value_temp_abs() + duplicate_extruder_temp_offset, 1); + thermalManager.setTargetHotend(temp ? temp + duplicate_extruder_temp_offset : 0, 1); #endif #if ENABLED(PRINTJOB_TIMER_AUTOSTART) @@ -7196,7 +7197,7 @@ inline void gcode_M92() { LOOP_XYZE(i) { if (code_seen(axis_codes[i])) { if (i == E_AXIS) { - const float value = code_value_per_axis_unit(E_AXIS + TARGET_EXTRUDER); + const float value = code_value_per_axis_unit((AxisEnum)(E_AXIS + TARGET_EXTRUDER)); if (value < 20.0) { float factor = planner.axis_steps_per_mm[E_AXIS + TARGET_EXTRUDER] / value; // increase e constants if M92 E14 is given for netfab. planner.max_jerk[E_AXIS] *= factor; @@ -7206,7 +7207,7 @@ inline void gcode_M92() { planner.axis_steps_per_mm[E_AXIS + TARGET_EXTRUDER] = value; } else { - planner.axis_steps_per_mm[i] = code_value_per_axis_unit(i); + planner.axis_steps_per_mm[i] = code_value_per_axis_unit((AxisEnum)i); } } } @@ -8100,11 +8101,11 @@ inline void gcode_M226() { */ inline void gcode_M303() { #if HAS_PID_HEATING - int e = code_seen('E') ? code_value_int() : 0; - int c = code_seen('C') ? code_value_int() : 5; - bool u = code_seen('U') && code_value_bool(); + const int e = code_seen('E') ? code_value_int() : 0, + c = code_seen('C') ? code_value_int() : 5; + const bool u = code_seen('U') && code_value_bool(); - float temp = code_seen('S') ? code_value_temp_abs() : (e < 0 ? 70.0 : 150.0); + int16_t temp = code_seen('S') ? code_value_temp_abs() : (e < 0 ? 70 : 150); if (WITHIN(e, 0, HOTENDS - 1)) target_extruder = e; @@ -8741,7 +8742,6 @@ inline void gcode_M503() { const millis_t nozzle_timeout = millis() + (millis_t)(FILAMENT_CHANGE_NOZZLE_TIMEOUT) * 1000UL; bool nozzle_timed_out = false; - float temps[4]; // Wait for filament insert by user and press button lcd_filament_change_show_message(FILAMENT_CHANGE_MESSAGE_INSERT); @@ -8752,6 +8752,7 @@ inline void gcode_M503() { idle(); + int16_t temps[HOTENDS]; HOTEND_LOOP() temps[e] = thermalManager.target_temperature[e]; // Save nozzle temps KEEPALIVE_STATE(PAUSED_FOR_USER); diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp index 07e7833cf..2a0bfe2a7 100644 --- a/Marlin/planner.cpp +++ b/Marlin/planner.cpp @@ -387,10 +387,7 @@ void Planner::recalculate() { float t = autotemp_min + high * autotemp_factor; t = constrain(t, autotemp_min, autotemp_max); - if (oldt > t) { - t *= (1 - (AUTOTEMP_OLDWEIGHT)); - t += (AUTOTEMP_OLDWEIGHT) * oldt; - } + if (t < oldt) t = t * (1 - (AUTOTEMP_OLDWEIGHT)) + oldt * (AUTOTEMP_OLDWEIGHT); oldt = t; thermalManager.setTargetHotend(t, 0); } diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index 03b39de03..eb20c5a5f 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -64,10 +64,10 @@ Temperature thermalManager; float Temperature::current_temperature[HOTENDS] = { 0.0 }, Temperature::current_temperature_bed = 0.0; -int Temperature::current_temperature_raw[HOTENDS] = { 0 }, - Temperature::target_temperature[HOTENDS] = { 0 }, - Temperature::current_temperature_bed_raw = 0, - Temperature::target_temperature_bed = 0; +int16_t Temperature::current_temperature_raw[HOTENDS] = { 0 }, + Temperature::target_temperature[HOTENDS] = { 0 }, + Temperature::current_temperature_bed_raw = 0, + Temperature::target_temperature_bed = 0; #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) float Temperature::redundant_temperature = 0.0; @@ -160,33 +160,33 @@ volatile bool Temperature::temp_meas_ready = false; millis_t Temperature::next_bed_check_ms; #endif -unsigned long Temperature::raw_temp_value[MAX_EXTRUDERS] = { 0 }; -unsigned long Temperature::raw_temp_bed_value = 0; +uint16_t Temperature::raw_temp_value[MAX_EXTRUDERS] = { 0 }, + Temperature::raw_temp_bed_value = 0; // Init min and max temp with extreme values to prevent false errors during startup -int Temperature::minttemp_raw[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_RAW_LO_TEMP , HEATER_1_RAW_LO_TEMP , HEATER_2_RAW_LO_TEMP, HEATER_3_RAW_LO_TEMP, HEATER_4_RAW_LO_TEMP), - Temperature::maxttemp_raw[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_RAW_HI_TEMP , HEATER_1_RAW_HI_TEMP , HEATER_2_RAW_HI_TEMP, HEATER_3_RAW_HI_TEMP, HEATER_4_RAW_HI_TEMP), - Temperature::minttemp[HOTENDS] = { 0 }, - Temperature::maxttemp[HOTENDS] = ARRAY_BY_HOTENDS1(16383); +int16_t Temperature::minttemp_raw[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_RAW_LO_TEMP , HEATER_1_RAW_LO_TEMP , HEATER_2_RAW_LO_TEMP, HEATER_3_RAW_LO_TEMP, HEATER_4_RAW_LO_TEMP), + Temperature::maxttemp_raw[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_RAW_HI_TEMP , HEATER_1_RAW_HI_TEMP , HEATER_2_RAW_HI_TEMP, HEATER_3_RAW_HI_TEMP, HEATER_4_RAW_HI_TEMP), + Temperature::minttemp[HOTENDS] = { 0 }, + Temperature::maxttemp[HOTENDS] = ARRAY_BY_HOTENDS1(16383); #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED - int Temperature::consecutive_low_temperature_error[HOTENDS] = { 0 }; + uint8_t Temperature::consecutive_low_temperature_error[HOTENDS] = { 0 }; #endif #ifdef MILLISECONDS_PREHEAT_TIME - unsigned long Temperature::preheat_end_time[HOTENDS] = { 0 }; + millis_t Temperature::preheat_end_time[HOTENDS] = { 0 }; #endif #ifdef BED_MINTEMP - int Temperature::bed_minttemp_raw = HEATER_BED_RAW_LO_TEMP; + int16_t Temperature::bed_minttemp_raw = HEATER_BED_RAW_LO_TEMP; #endif #ifdef BED_MAXTEMP - int Temperature::bed_maxttemp_raw = HEATER_BED_RAW_HI_TEMP; + int16_t Temperature::bed_maxttemp_raw = HEATER_BED_RAW_HI_TEMP; #endif #if ENABLED(FILAMENT_WIDTH_SENSOR) - int Temperature::meas_shift_index; // Index of a delayed sample in buffer + int16_t Temperature::meas_shift_index; // Index of a delayed sample in buffer #endif #if HAS_AUTO_FAN @@ -1242,7 +1242,7 @@ void Temperature::init() { millis_t Temperature::thermal_runaway_bed_timer; #endif - void Temperature::thermal_runaway_protection(Temperature::TRState* state, millis_t* timer, float temperature, float target_temperature, int heater_id, int period_seconds, int hysteresis_degc) { + void Temperature::thermal_runaway_protection(Temperature::TRState* state, millis_t* timer, float current, float target, int heater_id, int period_seconds, int hysteresis_degc) { static float tr_target_temperature[HOTENDS + 1] = { 0.0 }; @@ -1252,17 +1252,17 @@ void Temperature::init() { if (heater_id < 0) SERIAL_ECHOPGM("bed"); else SERIAL_ECHO(heater_id); SERIAL_ECHOPAIR(" ; State:", *state); SERIAL_ECHOPAIR(" ; Timer:", *timer); - SERIAL_ECHOPAIR(" ; Temperature:", temperature); - SERIAL_ECHOPAIR(" ; Target Temp:", target_temperature); + SERIAL_ECHOPAIR(" ; Temperature:", current); + SERIAL_ECHOPAIR(" ; Target Temp:", target); SERIAL_EOL; */ int heater_index = heater_id >= 0 ? heater_id : HOTENDS; // If the target temperature changes, restart - if (tr_target_temperature[heater_index] != target_temperature) { - tr_target_temperature[heater_index] = target_temperature; - *state = target_temperature > 0 ? TRFirstHeating : TRInactive; + if (tr_target_temperature[heater_index] != target) { + tr_target_temperature[heater_index] = target; + *state = target > 0 ? TRFirstHeating : TRInactive; } switch (*state) { @@ -1270,11 +1270,11 @@ void Temperature::init() { case TRInactive: break; // When first heating, wait for the temperature to be reached then go to Stable state case TRFirstHeating: - if (temperature < tr_target_temperature[heater_index]) break; + if (current < tr_target_temperature[heater_index]) break; *state = TRStable; // While the temperature is stable watch for a bad temperature case TRStable: - if (temperature >= tr_target_temperature[heater_index] - hysteresis_degc) { + if (current >= tr_target_temperature[heater_index] - hysteresis_degc) { *timer = millis() + period_seconds * 1000UL; break; } @@ -1961,9 +1961,9 @@ void Temperature::isr() { }; for (uint8_t e = 0; e < COUNT(temp_dir); e++) { - const int tdir = temp_dir[e], rawtemp = current_temperature_raw[e] * tdir; - if (rawtemp > maxttemp_raw[e] * tdir && target_temperature[e] > 0.0f) max_temp_error(e); - if (rawtemp < minttemp_raw[e] * tdir && !is_preheating(e) && target_temperature[e] > 0.0f) { + const int16_t tdir = temp_dir[e], rawtemp = current_temperature_raw[e] * tdir; + if (rawtemp > maxttemp_raw[e] * tdir && target_temperature[e] > 0) max_temp_error(e); + if (rawtemp < minttemp_raw[e] * tdir && !is_preheating(e) && target_temperature[e] > 0) { #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED if (++consecutive_low_temperature_error[e] >= MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED) #endif @@ -1981,8 +1981,8 @@ void Temperature::isr() { #else #define GEBED >= #endif - if (current_temperature_bed_raw GEBED bed_maxttemp_raw && target_temperature_bed > 0.0f) max_temp_error(-1); - if (bed_minttemp_raw GEBED current_temperature_bed_raw && target_temperature_bed > 0.0f) min_temp_error(-1); + if (current_temperature_bed_raw GEBED bed_maxttemp_raw && target_temperature_bed > 0) max_temp_error(-1); + if (bed_minttemp_raw GEBED current_temperature_bed_raw && target_temperature_bed > 0) min_temp_error(-1); #endif } // temp_count >= OVERSAMPLENR diff --git a/Marlin/temperature.h b/Marlin/temperature.h index 791b5b288..f6ffd89e6 100644 --- a/Marlin/temperature.h +++ b/Marlin/temperature.h @@ -99,10 +99,10 @@ class Temperature { static float current_temperature[HOTENDS], current_temperature_bed; - static int current_temperature_raw[HOTENDS], - target_temperature[HOTENDS], - current_temperature_bed_raw, - target_temperature_bed; + static int16_t current_temperature_raw[HOTENDS], + target_temperature[HOTENDS], + current_temperature_bed_raw, + target_temperature_bed; static volatile bool in_temp_isr; @@ -217,33 +217,33 @@ class Temperature { static millis_t next_bed_check_ms; #endif - static unsigned long raw_temp_value[MAX_EXTRUDERS], - raw_temp_bed_value; + static uint16_t raw_temp_value[MAX_EXTRUDERS], + raw_temp_bed_value; // Init min and max temp with extreme values to prevent false errors during startup - static int minttemp_raw[HOTENDS], - maxttemp_raw[HOTENDS], - minttemp[HOTENDS], - maxttemp[HOTENDS]; + static int16_t minttemp_raw[HOTENDS], + maxttemp_raw[HOTENDS], + minttemp[HOTENDS], + maxttemp[HOTENDS]; #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED - static int consecutive_low_temperature_error[HOTENDS]; + static uint8_t consecutive_low_temperature_error[HOTENDS]; #endif #ifdef MILLISECONDS_PREHEAT_TIME - static unsigned long preheat_end_time[HOTENDS]; + static millis_t preheat_end_time[HOTENDS]; #endif #ifdef BED_MINTEMP - static int bed_minttemp_raw; + static int16_t bed_minttemp_raw; #endif #ifdef BED_MAXTEMP - static int bed_maxttemp_raw; + static int16_t bed_maxttemp_raw; #endif #if ENABLED(FILAMENT_WIDTH_SENSOR) - static int meas_shift_index; // Index of a delayed sample in buffer + static int16_t meas_shift_index; // Index of a delayed sample in buffer #endif #if HAS_AUTO_FAN @@ -323,31 +323,31 @@ class Temperature { //inline so that there is no performance decrease. //deg=degreeCelsius - static float degHotend(uint8_t e) { + static int16_t degHotend(uint8_t e) { #if HOTENDS == 1 UNUSED(e); #endif return current_temperature[HOTEND_INDEX]; } - static float degBed() { return current_temperature_bed; } + static int16_t degBed() { return current_temperature_bed; } #if ENABLED(SHOW_TEMP_ADC_VALUES) - static float rawHotendTemp(uint8_t e) { - #if HOTENDS == 1 - UNUSED(e); - #endif - return current_temperature_raw[HOTEND_INDEX]; - } - static float rawBedTemp() { return current_temperature_bed_raw; } + static int16_t rawHotendTemp(uint8_t e) { + #if HOTENDS == 1 + UNUSED(e); + #endif + return current_temperature_raw[HOTEND_INDEX]; + } + static int16_t rawBedTemp() { return current_temperature_bed_raw; } #endif - static float degTargetHotend(uint8_t e) { + static int16_t degTargetHotend(uint8_t e) { #if HOTENDS == 1 UNUSED(e); #endif return target_temperature[HOTEND_INDEX]; } - static float degTargetBed() { return target_temperature_bed; } + static int16_t degTargetBed() { return target_temperature_bed; } #if WATCH_HOTENDS static void start_watching_heater(uint8_t e = 0); @@ -357,14 +357,14 @@ class Temperature { static void start_watching_bed(); #endif - static void setTargetHotend(const float& celsius, uint8_t e) { + static void setTargetHotend(const int16_t &celsius, uint8_t e) { #if HOTENDS == 1 UNUSED(e); #endif #ifdef MILLISECONDS_PREHEAT_TIME - if (celsius == 0.0f) + if (celsius == 0) reset_preheat_time(HOTEND_INDEX); - else if (target_temperature[HOTEND_INDEX] == 0.0f) + else if (target_temperature[HOTEND_INDEX] == 0) start_preheat_time(HOTEND_INDEX); #endif target_temperature[HOTEND_INDEX] = celsius; @@ -373,7 +373,7 @@ class Temperature { #endif } - static void setTargetBed(const float& celsius) { + static void setTargetBed(const int16_t &celsius) { target_temperature_bed = celsius; #if WATCH_THE_BED start_watching_bed(); diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index 281ad8441..e08633aa5 100644 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -1179,14 +1179,14 @@ void kill_screen(const char* lcd_msg) { } #endif - constexpr int heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP); + constexpr int16_t heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP); /** * * "Prepare" submenu items * */ - void _lcd_preheat(int endnum, const float temph, const float tempb, const int fan) { + void _lcd_preheat(const int endnum, const int16_t temph, const int16_t tempb, const int16_t fan) { if (temph > 0) thermalManager.setTargetHotend(min(heater_maxtemp[endnum], temph), endnum); #if TEMP_SENSOR_BED != 0 if (tempb >= 0) thermalManager.setTargetBed(tempb); From 9890141f7b7f0ac5b827134f0da95ebe9addec7c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 May 2017 17:28:09 -0500 Subject: [PATCH 6/6] M100 tweak --- Marlin/M100_Free_Mem_Chk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/M100_Free_Mem_Chk.cpp b/Marlin/M100_Free_Mem_Chk.cpp index 24290d50a..9c31aa6f9 100644 --- a/Marlin/M100_Free_Mem_Chk.cpp +++ b/Marlin/M100_Free_Mem_Chk.cpp @@ -241,7 +241,7 @@ void gcode_M100() { SERIAL_ECHOPAIR("\n__brkval : ", hex_address(__brkval)); SERIAL_ECHOPAIR("\n__bss_end : ", hex_address(&__bss_end)); - uint8_t *ptr = END_OF_HEAP(), *sp = top_of_stack(); + char *ptr = END_OF_HEAP(), *sp = top_of_stack(); SERIAL_ECHOPAIR("\nstart of free space : ", hex_address(ptr)); SERIAL_ECHOLNPAIR("\nStack Pointer : ", hex_address(sp));