From 3edf9904f455d427d177c071cc99ff993fbcb5d0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 24 Mar 2018 15:13:39 -0400 Subject: [PATCH] Fix linear/3-point manual leveling buffer overrun Fixes #10137 --- Marlin/Marlin_main.cpp | 57 +++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 5e9945c7a..44975c4aa 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -4480,7 +4480,7 @@ void home_all_axes() { gcode_G28(true); } ABL_VAR bool dryrun, abl_should_enable; #if ENABLED(PROBE_MANUALLY) || ENABLED(AUTO_BED_LEVELING_LINEAR) - ABL_VAR int abl_probe_index; + ABL_VAR int16_t abl_probe_index; #endif #if HAS_SOFTWARE_ENDSTOPS && ENABLED(PROBE_MANUALLY) @@ -4507,9 +4507,9 @@ void home_all_axes() { gcode_G28(true); } #endif #if ENABLED(AUTO_BED_LEVELING_LINEAR) - ABL_VAR int abl2; + ABL_VAR int16_t abl_points; #elif ENABLED(PROBE_MANUALLY) // Bilinear - int constexpr abl2 = GRID_MAX_POINTS; + int16_t constexpr abl_points = GRID_MAX_POINTS; #endif #if ENABLED(AUTO_BED_LEVELING_BILINEAR) @@ -4528,7 +4528,7 @@ void home_all_axes() { gcode_G28(true); } #elif ENABLED(AUTO_BED_LEVELING_3POINT) #if ENABLED(PROBE_MANUALLY) - int constexpr abl2 = 3; // used to show total points + int8_t constexpr abl_points = 3; // used to show total points #endif // Probe at 3 arbitrary points @@ -4640,7 +4640,7 @@ void home_all_axes() { gcode_G28(true); } return; } - abl2 = abl_grid_points_x * abl_grid_points_y; + abl_points = abl_grid_points_x * abl_grid_points_y; mean = 0; #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) @@ -4756,8 +4756,8 @@ void home_all_axes() { gcode_G28(true); } if (verbose_level || seenQ) { SERIAL_PROTOCOLPGM("Manual G29 "); if (g29_in_progress) { - SERIAL_PROTOCOLPAIR("point ", min(abl_probe_index + 1, abl2)); - SERIAL_PROTOCOLLNPAIR(" of ", abl2); + SERIAL_PROTOCOLPAIR("point ", min(abl_probe_index + 1, abl_points)); + SERIAL_PROTOCOLLNPAIR(" of ", abl_points); } else SERIAL_PROTOCOLLNPGM("idle"); @@ -4772,6 +4772,11 @@ void home_all_axes() { gcode_G28(true); } #endif } else { + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_3POINT) + const uint16_t index = abl_probe_index - 1; + #endif + // For G29 after adjusting Z. // Save the previous Z before going to the next point measured_z = current_position[Z_AXIS]; @@ -4779,13 +4784,17 @@ void home_all_axes() { gcode_G28(true); } #if ENABLED(AUTO_BED_LEVELING_LINEAR) mean += measured_z; - eqnBVector[abl_probe_index] = measured_z; - eqnAMatrix[abl_probe_index + 0 * abl2] = xProbe; - eqnAMatrix[abl_probe_index + 1 * abl2] = yProbe; - eqnAMatrix[abl_probe_index + 2 * abl2] = 1; + eqnBVector[index] = measured_z; + eqnAMatrix[index + 0 * abl_points] = xProbe; + eqnAMatrix[index + 1 * abl_points] = yProbe; + eqnAMatrix[index + 2 * abl_points] = 1; incremental_LSF(&lsf_results, xProbe, yProbe, measured_z); + #elif ENABLED(AUTO_BED_LEVELING_3POINT) + + points[index].z = measured_z; + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) z_values[xCount][yCount] = measured_z + zoffset; @@ -4798,10 +4807,6 @@ void home_all_axes() { gcode_G28(true); } } #endif - #elif ENABLED(AUTO_BED_LEVELING_3POINT) - - points[abl_probe_index].z = measured_z; - #endif } @@ -4812,7 +4817,7 @@ void home_all_axes() { gcode_G28(true); } #if ABL_GRID // Skip any unreachable points - while (abl_probe_index < abl2) { + while (abl_probe_index < abl_points) { // Set xCount, yCount based on abl_probe_index, with zig-zag PR_OUTER_VAR = abl_probe_index / PR_INNER_END; @@ -4839,7 +4844,7 @@ void home_all_axes() { gcode_G28(true); } } // Is there a next point to move to? - if (abl_probe_index < abl2) { + if (abl_probe_index < abl_points) { _manual_goto_xy(xProbe, yProbe); // Can be used here too! #if HAS_SOFTWARE_ENDSTOPS // Disable software endstops to allow manual adjustment @@ -4863,7 +4868,7 @@ void home_all_axes() { gcode_G28(true); } #elif ENABLED(AUTO_BED_LEVELING_3POINT) // Probe at 3 arbitrary points - if (abl_probe_index < abl2) { + if (abl_probe_index < abl_points) { xProbe = points[abl_probe_index].x; yProbe = points[abl_probe_index].y; _manual_goto_xy(xProbe, yProbe); @@ -4959,9 +4964,9 @@ void home_all_axes() { gcode_G28(true); } mean += measured_z; eqnBVector[abl_probe_index] = measured_z; - eqnAMatrix[abl_probe_index + 0 * abl2] = xProbe; - eqnAMatrix[abl_probe_index + 1 * abl2] = yProbe; - eqnAMatrix[abl_probe_index + 2 * abl2] = 1; + eqnAMatrix[abl_probe_index + 0 * abl_points] = xProbe; + eqnAMatrix[abl_probe_index + 1 * abl_points] = yProbe; + eqnAMatrix[abl_probe_index + 2 * abl_points] = 1; incremental_LSF(&lsf_results, xProbe, yProbe, measured_z); @@ -5069,7 +5074,7 @@ void home_all_axes() { gcode_G28(true); } plane_equation_coefficients[1] = -lsf_results.B; // but that is not yet tested. plane_equation_coefficients[2] = -lsf_results.D; - mean /= abl2; + mean /= abl_points; if (verbose_level) { SERIAL_PROTOCOLPGM("Eqn coefficients: a: "); @@ -5113,8 +5118,8 @@ void home_all_axes() { gcode_G28(true); } for (uint8_t xx = 0; xx < abl_grid_points_x; xx++) { int ind = indexIntoAB[xx][yy]; float diff = eqnBVector[ind] - mean, - x_tmp = eqnAMatrix[ind + 0 * abl2], - y_tmp = eqnAMatrix[ind + 1 * abl2], + x_tmp = eqnAMatrix[ind + 0 * abl_points], + y_tmp = eqnAMatrix[ind + 1 * abl_points], z_tmp = 0; apply_rotation_xyz(planner.bed_level_matrix, x_tmp, y_tmp, z_tmp); @@ -5137,8 +5142,8 @@ void home_all_axes() { gcode_G28(true); } for (int8_t yy = abl_grid_points_y - 1; yy >= 0; yy--) { for (uint8_t xx = 0; xx < abl_grid_points_x; xx++) { int ind = indexIntoAB[xx][yy]; - float x_tmp = eqnAMatrix[ind + 0 * abl2], - y_tmp = eqnAMatrix[ind + 1 * abl2], + float x_tmp = eqnAMatrix[ind + 0 * abl_points], + y_tmp = eqnAMatrix[ind + 1 * abl_points], z_tmp = 0; apply_rotation_xyz(planner.bed_level_matrix, x_tmp, y_tmp, z_tmp);