🚸 Revert M206 Home Offset behavior (#25996)

This commit is contained in:
Scott Lahteine 2023-07-20 21:10:03 -05:00 committed by GitHub
parent a0e3dea8b8
commit 9135e3f7d3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 70 additions and 130 deletions

View file

@ -3835,14 +3835,17 @@
//#define REPETIER_GCODE_M360 // Add commands originally from Repetier FW
/**
* Enable this option for a leaner build of Marlin that removes all
* workspace offsets, simplifying coordinate transformations, leveling, etc.
*
* - M206 and M428 are disabled.
* - G92 will revert to its behavior from Marlin 1.0.
* Enable this option for a leaner build of Marlin that removes
* workspace offsets to slightly optimize performance.
* G92 will revert to its behavior from Marlin 1.0.
*/
//#define NO_WORKSPACE_OFFSETS
/**
* Disable M206 and M428 if you don't need home offsets.
*/
//#define NO_HOME_OFFSETS
/**
* CNC G-code options
* Support CNC-style G-code dialects used by laser cutters, drawing machine cams, etc.

View file

@ -1337,7 +1337,7 @@ void setup() {
SETUP_RUN(touchBt.init());
#endif
TERN_(HAS_M206_COMMAND, current_position += home_offset); // Init current position based on home_offset
TERN_(HAS_HOME_OFFSET, current_position += home_offset); // Init current position based on home_offset
sync_plan_position(); // Vital to init stepper/planner equivalent for current_position

View file

@ -207,7 +207,7 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=POW
TERN_(GCODE_REPEAT_MARKERS, info.stored_repeat = repeat);
TERN_(HAS_HOME_OFFSET, info.home_offset = home_offset);
TERN_(HAS_POSITION_SHIFT, info.position_shift = position_shift);
TERN_(HAS_WORKSPACE_OFFSET, info.workspace_offset = workspace_offset);
E_TERN_(info.active_extruder = active_extruder);
#if DISABLED(NO_VOLUMETRICS)
@ -552,10 +552,7 @@ void PrintJobRecovery::resume() {
TERN_(GCODE_REPEAT_MARKERS, repeat = info.stored_repeat);
TERN_(HAS_HOME_OFFSET, home_offset = info.home_offset);
TERN_(HAS_POSITION_SHIFT, position_shift = info.position_shift);
#if HAS_HOME_OFFSET || HAS_POSITION_SHIFT
LOOP_NUM_AXES(i) update_workspace_offset((AxisEnum)i);
#endif
TERN_(HAS_WORKSPACE_OFFSET, workspace_offset = info.workspace_offset);
// Relative axis modes
gcode.axis_relative = info.axis_relative;
@ -600,11 +597,11 @@ void PrintJobRecovery::resume() {
DEBUG_EOL();
#endif
#if HAS_POSITION_SHIFT
DEBUG_ECHOPGM("position_shift: ");
#if HAS_WORKSPACE_OFFSET
DEBUG_ECHOPGM("workspace_offset: ");
LOOP_NUM_AXES(i) {
if (i) DEBUG_CHAR(',');
DEBUG_ECHO(info.position_shift[i]);
DEBUG_ECHO(info.workspace_offset[i]);
}
DEBUG_EOL();
#endif

View file

@ -67,8 +67,8 @@ typedef struct {
#if HAS_HOME_OFFSET
xyz_pos_t home_offset;
#endif
#if HAS_POSITION_SHIFT
xyz_pos_t position_shift;
#if HAS_WORKSPACE_OFFSET
xyz_pos_t workspace_offset;
#endif
#if HAS_MULTI_EXTRUDER
uint8_t active_extruder;

View file

@ -120,14 +120,7 @@
* (Z is already at the right height)
*/
constexpr xy_float_t safe_homing_xy = { Z_SAFE_HOMING_X_POINT, Z_SAFE_HOMING_Y_POINT };
#if HAS_HOME_OFFSET && DISABLED(Z_SAFE_HOMING_POINT_ABSOLUTE)
xy_float_t okay_homing_xy = safe_homing_xy;
okay_homing_xy -= home_offset;
#else
constexpr xy_float_t okay_homing_xy = safe_homing_xy;
#endif
destination.set(okay_homing_xy, current_position.z);
destination.set(safe_homing_xy, current_position.z);
TERN_(HOMING_Z_WITH_PROBE, destination -= probe.offset_xy);

View file

@ -715,7 +715,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
case 204: M204(); break; // M204: Set acceleration
case 205: M205(); break; // M205: Set advanced settings
#if HAS_M206_COMMAND
#if HAS_HOME_OFFSET
case 206: M206(); break; // M206: Set home offsets
#endif
@ -881,7 +881,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
case 425: M425(); break; // M425: Tune backlash compensation
#endif
#if HAS_M206_COMMAND
#if HAS_HOME_OFFSET
case 428: M428(); break; // M428: Apply current_position to home_offset
#endif

View file

@ -860,7 +860,7 @@ private:
static void M205();
static void M205_report(const bool forReplay=true);
#if HAS_M206_COMMAND
#if HAS_HOME_OFFSET
static void M206();
static void M206_report(const bool forReplay=true);
#endif
@ -1043,7 +1043,7 @@ private:
static void M425_report(const bool forReplay=true);
#endif
#if HAS_M206_COMMAND
#if HAS_HOME_OFFSET
static void M428();
#endif

View file

@ -37,12 +37,7 @@ bool GcodeSuite::select_coordinate_system(const int8_t _new) {
xyz_float_t new_offset{0};
if (WITHIN(_new, 0, MAX_COORDINATE_SYSTEMS - 1))
new_offset = coordinate_system[_new];
LOOP_NUM_AXES(i) {
if (position_shift[i] != new_offset[i]) {
position_shift[i] = new_offset[i];
update_workspace_offset((AxisEnum)i);
}
}
workspace_offset = new_offset;
return true;
}

View file

@ -63,10 +63,7 @@ void GcodeSuite::G92() {
#if ENABLED(CNC_COORDINATE_SYSTEMS) && !IS_SCARA
case 1: // G92.1 - Zero the Workspace Offset
LOOP_NUM_AXES(i) if (position_shift[i]) {
position_shift[i] = 0;
update_workspace_offset((AxisEnum)i);
}
workspace_offset.reset();
break;
#endif
@ -92,10 +89,9 @@ void GcodeSuite::G92() {
v = TERN0(HAS_EXTRUDERS, i == E_AXIS) ? l : LOGICAL_TO_NATIVE(l, i), // Axis position in NATIVE space (applying the existing offset)
d = v - current_position[i]; // How much is the current axis position altered by?
if (!NEAR_ZERO(d)) {
#if HAS_POSITION_SHIFT && NONE(IS_SCARA, POLARGRAPH) // When using workspaces...
#if HAS_WORKSPACE_OFFSET && NONE(IS_SCARA, POLARGRAPH) // When using workspaces...
if (TERN1(HAS_EXTRUDERS, i != E_AXIS)) {
position_shift[i] += d; // ...most axes offset the workspace...
update_workspace_offset((AxisEnum)i);
workspace_offset[i] += d; // ...most axes offset the workspace...
}
else {
#if HAS_EXTRUDERS
@ -120,7 +116,7 @@ void GcodeSuite::G92() {
#if ENABLED(CNC_COORDINATE_SYSTEMS)
// Apply Workspace Offset to the active coordinate system
if (WITHIN(active_coordinate_system, 0, MAX_COORDINATE_SYSTEMS - 1))
coordinate_system[active_coordinate_system] = position_shift;
coordinate_system[active_coordinate_system] = workspace_offset;
#endif
if (sync_XYZE) sync_plan_position();

View file

@ -22,7 +22,7 @@
#include "../../inc/MarlinConfig.h"
#if HAS_M206_COMMAND
#if HAS_HOME_OFFSET
#include "../gcode.h"
#include "../../module/motion.h"
@ -101,4 +101,4 @@ void GcodeSuite::M428() {
OKAY_BUZZ();
}
#endif // HAS_M206_COMMAND
#endif // HAS_HOME_OFFSET

View file

@ -46,7 +46,7 @@ void mpe_settings_init() {
mpe_settings.parking_xpos[0] = pex[0]; // M951 L
mpe_settings.parking_xpos[1] = pex[1]; // M951 R
mpe_settings.grab_distance = PARKING_EXTRUDER_GRAB_DISTANCE; // M951 I
TERN_(HAS_HOME_OFFSET, set_home_offset(X_AXIS, mpe_settings.grab_distance * -1));
TERN_(HAS_HOME_OFFSET, set_home_offset(X_AXIS, -mpe_settings.grab_distance));
mpe_settings.slow_feedrate = MMM_TO_MMS(MPE_SLOW_SPEED); // M951 J
mpe_settings.fast_feedrate = MMM_TO_MMS(MPE_FAST_SPEED); // M951 H
mpe_settings.travel_distance = MPE_TRAVEL_DISTANCE; // M951 D
@ -59,7 +59,7 @@ void GcodeSuite::M951() {
if (parser.seenval('R')) mpe_settings.parking_xpos[1] = parser.value_linear_units();
if (parser.seenval('I')) {
mpe_settings.grab_distance = parser.value_linear_units();
TERN_(HAS_HOME_OFFSET, set_home_offset(X_AXIS, mpe_settings.grab_distance * -1));
TERN_(HAS_HOME_OFFSET, set_home_offset(X_AXIS, -mpe_settings.grab_distance));
}
if (parser.seenval('J')) mpe_settings.slow_feedrate = MMM_TO_MMS(parser.value_linear_units());
if (parser.seenval('H')) mpe_settings.fast_feedrate = MMM_TO_MMS(parser.value_linear_units());

View file

@ -97,6 +97,7 @@
#if !HAS_X_AXIS
//#define LCD_SHOW_E_TOTAL
#define NO_WORKSPACE_OFFSETS
#define NO_HOME_OFFSETS
#undef AUTOTEMP
#undef CALIBRATION_MEASURE_LEFT
#undef CALIBRATION_MEASURE_RIGHT

View file

@ -3140,15 +3140,15 @@
#undef MOTOR_CURRENT
#endif
// Updated G92 behavior shifts the workspace
// G92 shifts the workspace
#if DISABLED(NO_WORKSPACE_OFFSETS)
#define HAS_POSITION_SHIFT 1
#define HAS_WORKSPACE_OFFSET 1
#endif
#if DISABLED(NO_HOME_OFFSETS)
#if IS_CARTESIAN
#define HAS_HOME_OFFSET 1 // The home offset also shifts the coordinate space
#define HAS_WORKSPACE_OFFSET 1 // Cumulative offset to workspace to save some calculation
#define HAS_M206_COMMAND 1 // M206 sets the home offset for Cartesian machines
#define HAS_HOME_OFFSET 1 // M206 affects the Native Machine Space on G28
#elif IS_SCARA
#define HAS_SCARA_OFFSET 1 // The SCARA home offset applies only on G28
#define HAS_SCARA_OFFSET 1 // The SCARA home offset applies only on G28
#endif
#endif

View file

@ -695,7 +695,7 @@ void menu_advanced_settings() {
}
#endif
#if HAS_M206_COMMAND
#if HAS_HOME_OFFSET
// M428 - Set Home Offsets
ACTION_ITEM(MSG_SET_HOME_OFFSETS, []{ queue.inject(F("M428")); ui.return_to_status(); });
#endif

View file

@ -101,7 +101,7 @@ void recalc_delta_settings() {
*
* Suggested optimizations include:
*
* - Disable the home_offset (M206) and/or position_shift (G92)
* - Disable the home_offset (M206) and/or workspace_offset (G92)
* features to remove up to 12 float additions.
*/

View file

@ -64,7 +64,7 @@ void recalc_delta_settings();
*
* Suggested optimizations include:
*
* - Disable the home_offset (M206) and/or position_shift (G92)
* - Disable the home_offset (M206) and/or workspace_offset (G92)
* features to remove up to 12 float additions.
*
* - Use a fast-inverse-sqrt function and add the reciprocal.

View file

@ -177,16 +177,12 @@ xyz_pos_t cartes;
* The workspace can be offset by some commands, or
* these offsets may be omitted to save on computation.
*/
#if HAS_POSITION_SHIFT
// The distance that XYZ has been offset by G92. Reset by G28.
xyz_pos_t position_shift{0};
#endif
#if HAS_HOME_OFFSET
// This offset is added to the configured home position.
// Set by M206, M428, or menu item. Saved to EEPROM.
xyz_pos_t home_offset{0};
#endif
#if HAS_HOME_OFFSET && HAS_POSITION_SHIFT
#if HAS_WORKSPACE_OFFSET
// The above two are combined to save on computes
xyz_pos_t workspace_offset{0};
#endif
@ -2468,7 +2464,7 @@ void set_axis_is_at_home(const AxisEnum axis) {
#if ENABLED(DUAL_X_CARRIAGE)
if (axis == X_AXIS && (active_extruder == 1 || dual_x_carriage_mode == DXC_DUPLICATION_MODE)) {
current_position.x = x_home_pos(active_extruder);
current_position.x = SUM_TERN(HAS_HOME_OFFSET, x_home_pos(active_extruder), home_offset.x);
return;
}
#endif
@ -2478,7 +2474,7 @@ void set_axis_is_at_home(const AxisEnum axis) {
#elif ENABLED(DELTA)
current_position[axis] = (axis == Z_AXIS) ? DIFF_TERN(HAS_BED_PROBE, delta_height, probe.offset.z) : base_home_pos(axis);
#else
current_position[axis] = base_home_pos(axis);
current_position[axis] = SUM_TERN(HAS_HOME_OFFSET, base_home_pos(axis), home_offset[axis]);
#endif
/**
@ -2499,10 +2495,7 @@ void set_axis_is_at_home(const AxisEnum axis) {
TERN_(BABYSTEP_DISPLAY_TOTAL, babystep.reset_total(axis));
#if HAS_POSITION_SHIFT
position_shift[axis] = 0;
update_workspace_offset(axis);
#endif
TERN_(HAS_WORKSPACE_OFFSET, workspace_offset[axis] = 0);
if (DEBUGGING(LEVELING)) {
#if HAS_HOME_OFFSET
@ -2513,20 +2506,11 @@ void set_axis_is_at_home(const AxisEnum axis) {
}
}
#if HAS_WORKSPACE_OFFSET
void update_workspace_offset(const AxisEnum axis) {
workspace_offset[axis] = home_offset[axis] + position_shift[axis];
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Axis ", AS_CHAR(AXIS_CHAR(axis)), " home_offset = ", home_offset[axis], " position_shift = ", position_shift[axis]);
}
#endif
#if HAS_M206_COMMAND
#if HAS_HOME_OFFSET
/**
* Change the home offset for an axis.
* Also refreshes the workspace offset.
* Set the home offset for an axis.
*/
void set_home_offset(const AxisEnum axis, const_float_t v) {
home_offset[axis] = v;
update_workspace_offset(axis);
}
#endif

View file

@ -147,12 +147,6 @@ inline float home_bump_mm(const AxisEnum axis) {
return pgm_read_any(&home_bump_mm_P[axis]);
}
#if HAS_WORKSPACE_OFFSET
void update_workspace_offset(const AxisEnum axis);
#else
inline void update_workspace_offset(const AxisEnum) {}
#endif
#if HAS_HOTEND_OFFSET
extern xyz_pos_t hotend_offset[HOTENDS];
void reset_hotend_offsets();
@ -484,32 +478,23 @@ void home_if_needed(const bool keeplev=false);
#define BABYSTEP_ALLOWED() ((ENABLED(BABYSTEP_WITHOUT_HOMING) || all_axes_trusted()) && (ENABLED(BABYSTEP_ALWAYS_AVAILABLE) || printer_busy()))
#if HAS_HOME_OFFSET
extern xyz_pos_t home_offset;
#endif
/**
* Workspace offsets
*/
#if HAS_HOME_OFFSET || HAS_POSITION_SHIFT
#if HAS_HOME_OFFSET
extern xyz_pos_t home_offset;
#endif
#if HAS_POSITION_SHIFT
extern xyz_pos_t position_shift;
#endif
#if HAS_HOME_OFFSET && HAS_POSITION_SHIFT
extern xyz_pos_t workspace_offset;
#define _WS workspace_offset
#elif HAS_HOME_OFFSET
#define _WS home_offset
#else
#define _WS position_shift
#endif
#define NATIVE_TO_LOGICAL(POS, AXIS) ((POS) + _WS[AXIS])
#define LOGICAL_TO_NATIVE(POS, AXIS) ((POS) - _WS[AXIS])
FORCE_INLINE void toLogical(xy_pos_t &raw) { raw += _WS; }
FORCE_INLINE void toLogical(xyz_pos_t &raw) { raw += _WS; }
FORCE_INLINE void toLogical(xyze_pos_t &raw) { raw += _WS; }
FORCE_INLINE void toNative(xy_pos_t &raw) { raw -= _WS; }
FORCE_INLINE void toNative(xyz_pos_t &raw) { raw -= _WS; }
FORCE_INLINE void toNative(xyze_pos_t &raw) { raw -= _WS; }
#if HAS_WORKSPACE_OFFSET
extern xyz_pos_t workspace_offset;
#define NATIVE_TO_LOGICAL(POS, AXIS) ((POS) + workspace_offset[AXIS])
#define LOGICAL_TO_NATIVE(POS, AXIS) ((POS) - workspace_offset[AXIS])
FORCE_INLINE void toLogical(xy_pos_t &raw) { raw += workspace_offset; }
FORCE_INLINE void toLogical(xyz_pos_t &raw) { raw += workspace_offset; }
FORCE_INLINE void toLogical(xyze_pos_t &raw) { raw += workspace_offset; }
FORCE_INLINE void toNative(xy_pos_t &raw) { raw -= workspace_offset; }
FORCE_INLINE void toNative(xyz_pos_t &raw) { raw -= workspace_offset; }
FORCE_INLINE void toNative(xyze_pos_t &raw) { raw -= workspace_offset; }
#else
#define NATIVE_TO_LOGICAL(POS, AXIS) (POS)
#define LOGICAL_TO_NATIVE(POS, AXIS) (POS)
@ -633,7 +618,7 @@ void home_if_needed(const bool keeplev=false);
#endif
#if HAS_M206_COMMAND
#if HAS_HOME_OFFSET
void set_home_offset(const AxisEnum axis, const_float_t v);
#endif

View file

@ -670,10 +670,7 @@ void MarlinSettings::postprocess() {
#endif
// Software endstops depend on home_offset
LOOP_NUM_AXES(i) {
update_workspace_offset((AxisEnum)i);
update_software_endstops((AxisEnum)i);
}
LOOP_NUM_AXES(i) update_software_endstops((AxisEnum)i);
TERN_(ENABLE_LEVELING_FADE_HEIGHT, set_z_fade_height(new_z_fade_height, false)); // false = no report
@ -3701,7 +3698,7 @@ void MarlinSettings::reset() {
//
// M206 Home Offset
//
TERN_(HAS_M206_COMMAND, gcode.M206_report(forReplay));
TERN_(HAS_HOME_OFFSET, gcode.M206_report(forReplay));
//
// M218 Hotend offsets

View file

@ -1417,19 +1417,13 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
#if ANY(TC_GCODE_USE_GLOBAL_X, TC_GCODE_USE_GLOBAL_Y, TC_GCODE_USE_GLOBAL_Z)
// G0/G1/G2/G3/G5 moves are relative to the active tool.
// Shift the workspace to make custom moves relative to T0.
xyz_pos_t old_position_shift;
xyz_pos_t old_workspace_offset;
if (new_tool > 0) {
old_position_shift = position_shift;
old_workspace_offset = workspace_offset;
const xyz_pos_t &he = hotend_offset[new_tool];
#if ENABLED(TC_GCODE_USE_GLOBAL_X)
position_shift.x -= he.x; update_workspace_offset(X_AXIS);
#endif
#if ENABLED(TC_GCODE_USE_GLOBAL_Y)
position_shift.y -= he.y; update_workspace_offset(Y_AXIS);
#endif
#if ENABLED(TC_GCODE_USE_GLOBAL_Z)
position_shift.z -= he.z; update_workspace_offset(Z_AXIS);
#endif
TERN_(TC_GCODE_USE_GLOBAL_X, workspace_offset.x -= he.x);
TERN_(TC_GCODE_USE_GLOBAL_Y, workspace_offset.y -= he.y);
TERN_(TC_GCODE_USE_GLOBAL_Z, workspace_offset.z -= he.z);
}
#endif
@ -1462,12 +1456,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
}
#if ANY(TC_GCODE_USE_GLOBAL_X, TC_GCODE_USE_GLOBAL_Y, TC_GCODE_USE_GLOBAL_Z)
if (new_tool > 0) {
position_shift = old_position_shift;
TERN_(TC_GCODE_USE_GLOBAL_X, update_workspace_offset(X_AXIS));
TERN_(TC_GCODE_USE_GLOBAL_Y, update_workspace_offset(Y_AXIS));
TERN_(TC_GCODE_USE_GLOBAL_Z, update_workspace_offset(Z_AXIS));
}
if (new_tool > 0) workspace_offset = old_workspace_offset;
#endif
// If using MECHANICAL_SWITCHING extruder/nozzle, set HOTEND_OFFSET in Z axis after running EVENT_GCODE_TOOLCHANGE

View file

@ -318,7 +318,7 @@ PARK_HEAD_ON_PAUSE = build_src_filter=+<src/gcode/feature/pa
FILAMENT_LOAD_UNLOAD_GCODES = build_src_filter=+<src/gcode/feature/pause/M701_M702.cpp>
CNC_WORKSPACE_PLANES = build_src_filter=+<src/gcode/geometry/G17-G19.cpp>
CNC_COORDINATE_SYSTEMS = build_src_filter=+<src/gcode/geometry/G53-G59.cpp>
HAS_M206_COMMAND = build_src_filter=+<src/gcode/geometry/M206_M428.cpp>
HAS_HOME_OFFSET = build_src_filter=+<src/gcode/geometry/M206_M428.cpp>
EXPECTED_PRINTER_CHECK = build_src_filter=+<src/gcode/host/M16.cpp>
HOST_KEEPALIVE_FEATURE = build_src_filter=+<src/gcode/host/M113.cpp>
AUTO_REPORT_POSITION = build_src_filter=+<src/gcode/host/M154.cpp>