No retroactive changes with M851 Z
If using babystep to adjust the Z probe offset, the axis will move and the mesh will be updated at the same time, causing a doubling of the Z offset over the rest of the print. To correct for this, the current Z position would need to be modified in the opposite direction, canceling out the additional Z offset added to the mesh. This would be confusing to users, and moreover it would not be accurate without also taking the current Z fade level and current Z height into account. It might make sense to change the mesh in the case where no babystepping is taking place, but this could be considered an undesirable side-effect of changing the `zprobe_zoffset`. One way to remedy this would be to return to storing the mesh with `zprobe_zoffset` included, then subtracting `zprobe_zoffset` from the returned Z value. Thus, a babystep moving the Z axis up 1mm would subtract 1 from `zprobe_zoffset` while adding 1 to all mesh Z values. Without including the `zprobe_zoffset` in the `z_values` there is no safe way to alter the mesh in conjunction with babystepping, although it's fine without it.
This commit is contained in:
		| @@ -37,22 +37,17 @@ void GcodeSuite::M290() { | ||||
|     for (uint8_t a = X_AXIS; a <= Z_AXIS; a++) | ||||
|       if (parser.seenval(axis_codes[a]) || (a == Z_AXIS && parser.seenval('S'))) { | ||||
|         const float offs = constrain(parser.value_axis_units((AxisEnum)a), -2, 2); | ||||
|         #if ENABLED(BABYSTEP_ZPROBE_OFFSET) | ||||
|           if (a == Z_AXIS) { | ||||
|             zprobe_zoffset += offs; | ||||
|             refresh_zprobe_zoffset(true); // 'true' to not babystep | ||||
|           } | ||||
|         #endif | ||||
|         thermalManager.babystep_axis((AxisEnum)a, offs * planner.axis_steps_per_mm[a]); | ||||
|         #if ENABLED(BABYSTEP_ZPROBE_OFFSET) | ||||
|           zprobe_zoffset += offs; | ||||
|         #endif | ||||
|       } | ||||
|   #else | ||||
|     if (parser.seenval('Z') || parser.seenval('S')) { | ||||
|       const float offs = constrain(parser.value_axis_units(Z_AXIS), -2, 2); | ||||
|       thermalManager.babystep_axis(Z_AXIS, offs * planner.axis_steps_per_mm[Z_AXIS]); | ||||
|       #if ENABLED(BABYSTEP_ZPROBE_OFFSET) | ||||
|         zprobe_zoffset += offs; | ||||
|         refresh_zprobe_zoffset(); // This will babystep the axis | ||||
|       #else | ||||
|         thermalManager.babystep_axis(Z_AXIS, offs * planner.axis_steps_per_mm[Z_AXIS]); | ||||
|       #endif | ||||
|     } | ||||
|   #endif | ||||
|   | ||||
| @@ -35,7 +35,6 @@ void GcodeSuite::M851() { | ||||
|     const float value = parser.value_linear_units(); | ||||
|     if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { | ||||
|       zprobe_zoffset = value; | ||||
|       refresh_zprobe_zoffset(); | ||||
|       SERIAL_ECHO(zprobe_zoffset); | ||||
|     } | ||||
|     else | ||||
|   | ||||
| @@ -1100,8 +1100,6 @@ void kill_screen(const char* lcd_msg) { | ||||
|         ENCODER_DIRECTION_NORMAL(); | ||||
|         if (encoderPosition) { | ||||
|           const int16_t babystep_increment = (int32_t)encoderPosition * (BABYSTEP_MULTIPLICATOR); | ||||
|           encoderPosition = 0; | ||||
|  | ||||
|           const float new_zoffset = zprobe_zoffset + planner.steps_to_mm[Z_AXIS] * babystep_increment; | ||||
|           if (WITHIN(new_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { | ||||
|  | ||||
| @@ -1109,9 +1107,9 @@ void kill_screen(const char* lcd_msg) { | ||||
|               thermalManager.babystep_axis(Z_AXIS, babystep_increment); | ||||
|  | ||||
|             zprobe_zoffset = new_zoffset; | ||||
|             refresh_zprobe_zoffset(true); | ||||
|             lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; | ||||
|           } | ||||
|           encoderPosition = 0; | ||||
|         } | ||||
|         if (lcdDrawUpdate) { | ||||
|           lcd_implementation_drawedit(PSTR(MSG_ZPROBE_ZOFFSET), ftostr43sign(zprobe_zoffset)); | ||||
| @@ -1678,11 +1676,6 @@ void kill_screen(const char* lcd_msg) { | ||||
|     static void lcd_load_settings()    { lcd_completion_feedback(settings.load()); } | ||||
|   #endif | ||||
|  | ||||
|   #if HAS_BED_PROBE && DISABLED(BABYSTEP_ZPROBE_OFFSET) | ||||
|     static void lcd_refresh_zprobe_zoffset() { refresh_zprobe_zoffset(); } | ||||
|   #endif | ||||
|  | ||||
|  | ||||
|   #if ENABLED(LEVEL_BED_CORNERS) | ||||
|  | ||||
|     /** | ||||
| @@ -2000,7 +1993,7 @@ void kill_screen(const char* lcd_msg) { | ||||
|       #if ENABLED(BABYSTEP_ZPROBE_OFFSET) | ||||
|         MENU_ITEM(submenu, MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); | ||||
|       #elif HAS_BED_PROBE | ||||
|         MENU_ITEM_EDIT_CALLBACK(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX, lcd_refresh_zprobe_zoffset); | ||||
|         MENU_ITEM_EDIT(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); | ||||
|       #endif | ||||
|  | ||||
|       MENU_ITEM(submenu, MSG_LEVEL_BED, _lcd_level_bed_continue); | ||||
| @@ -3647,7 +3640,7 @@ void kill_screen(const char* lcd_msg) { | ||||
|     #if ENABLED(BABYSTEP_ZPROBE_OFFSET) | ||||
|       MENU_ITEM(submenu, MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); | ||||
|     #elif HAS_BED_PROBE | ||||
|       MENU_ITEM_EDIT_CALLBACK(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX, lcd_refresh_zprobe_zoffset); | ||||
|       MENU_ITEM_EDIT(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); | ||||
|     #endif | ||||
|  | ||||
|     // M203 / M205 - Feedrate items | ||||
|   | ||||
| @@ -247,10 +247,6 @@ void MarlinSettings::postprocess() { | ||||
|     set_z_fade_height(new_z_fade_height); | ||||
|   #endif | ||||
|  | ||||
|   #if HAS_BED_PROBE | ||||
|     refresh_zprobe_zoffset(); | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(AUTO_BED_LEVELING_BILINEAR) | ||||
|     refresh_bed_level(); | ||||
|     //set_bed_leveling_enabled(leveling_is_on); | ||||
| @@ -355,9 +351,8 @@ void MarlinSettings::postprocess() { | ||||
|         sizeof(mbl.z_values) == GRID_MAX_POINTS * sizeof(mbl.z_values[0][0]), | ||||
|         "MBL Z array is the wrong size." | ||||
|       ); | ||||
|       const bool leveling_is_on = mbl.has_mesh; | ||||
|       const uint8_t mesh_num_x = GRID_MAX_POINTS_X, mesh_num_y = GRID_MAX_POINTS_Y; | ||||
|       EEPROM_WRITE(leveling_is_on); | ||||
|       EEPROM_WRITE(mbl.has_mesh); | ||||
|       EEPROM_WRITE(mbl.z_offset); | ||||
|       EEPROM_WRITE(mesh_num_x); | ||||
|       EEPROM_WRITE(mesh_num_y); | ||||
|   | ||||
| @@ -640,42 +640,6 @@ float probe_pt(const float &rx, const float &ry, const bool stow, const uint8_t | ||||
|   return measured_z; | ||||
| } | ||||
|  | ||||
| void refresh_zprobe_zoffset(const bool no_babystep/*=false*/) { | ||||
|   static float last_zoffset = NAN; | ||||
|  | ||||
|   if (!isnan(last_zoffset)) { | ||||
|  | ||||
|     #if ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(BABYSTEP_ZPROBE_OFFSET) || ENABLED(DELTA) | ||||
|       const float diff = zprobe_zoffset - last_zoffset; | ||||
|     #endif | ||||
|  | ||||
|     #if ENABLED(AUTO_BED_LEVELING_BILINEAR) | ||||
|       // Correct bilinear grid for new probe offset | ||||
|       if (diff) { | ||||
|         for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) | ||||
|           for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) | ||||
|             z_values[x][y] -= diff; | ||||
|       } | ||||
|       #if ENABLED(ABL_BILINEAR_SUBDIVISION) | ||||
|         bed_level_virt_interpolate(); | ||||
|       #endif | ||||
|     #endif | ||||
|  | ||||
|     #if ENABLED(BABYSTEP_ZPROBE_OFFSET) | ||||
|       if (!no_babystep && planner.leveling_active) | ||||
|         thermalManager.babystep_axis(Z_AXIS, -LROUND(diff * planner.axis_steps_per_mm[Z_AXIS])); | ||||
|     #else | ||||
|       UNUSED(no_babystep); | ||||
|     #endif | ||||
|  | ||||
|     #if ENABLED(DELTA) // correct the delta_height | ||||
|       delta_height -= diff; | ||||
|     #endif | ||||
|   } | ||||
|  | ||||
|   last_zoffset = zprobe_zoffset; | ||||
| } | ||||
|  | ||||
| #if HAS_Z_SERVO_ENDSTOP | ||||
|  | ||||
|   void servo_probe_init() { | ||||
|   | ||||
| @@ -34,7 +34,6 @@ float probe_pt(const float &rx, const float &ry, const bool, const uint8_t, cons | ||||
|  | ||||
| #if HAS_BED_PROBE | ||||
|   extern float zprobe_zoffset; | ||||
|   void refresh_zprobe_zoffset(const bool no_babystep=false); | ||||
|   #define DEPLOY_PROBE() set_probe_deployed(true) | ||||
|   #define STOW_PROBE() set_probe_deployed(false) | ||||
| #else | ||||
|   | ||||
		Reference in New Issue
	
	Block a user