From 24882adfbf9996dfb502086ce1fc4193644da640 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 14 Apr 2017 21:41:21 -0500 Subject: [PATCH] Allow NO_WORKSPACE_OFFSETS with DELTA_AUTO_CALIBRATION - On `DELTA` the `M665 H` option supplants `M206` - On `DELTA` `NO_WORKSPACE_OFFSETS` only reverts `G92` behavior - Spawn 4 conditionals based on `NO_WORKSPACE_OFFSETS` - Optimize coordinate space conversion for `DELTA` workspace - To keep EEPROM version, retain `home_offset[XYZ]`, just ignore XY --- Marlin/Conditionals_post.h | 9 ++++ Marlin/Marlin.h | 58 +++++++++++++++-------- Marlin/Marlin_main.cpp | 85 ++++++++++++++++++++-------------- Marlin/SanityCheck.h | 7 --- Marlin/configuration_store.cpp | 17 +++---- Marlin/ultralcd.cpp | 4 +- 6 files changed, 109 insertions(+), 71 deletions(-) diff --git a/Marlin/Conditionals_post.h b/Marlin/Conditionals_post.h index 83e7759571..02a1eb0f6b 100644 --- a/Marlin/Conditionals_post.h +++ b/Marlin/Conditionals_post.h @@ -805,6 +805,15 @@ #define HAS_FOLDER_SORTING (FOLDER_SORTING || ENABLED(SDSORT_GCODE)) #endif + // Updated G92 behavior shifts the workspace + #define HAS_POSITION_SHIFT DISABLED(NO_WORKSPACE_OFFSETS) + // The home offset also shifts the coordinate space + #define HAS_HOME_OFFSET (DISABLED(NO_WORKSPACE_OFFSETS) || ENABLED(DELTA)) + // Either offset yields extra calculations on all moves + #define HAS_WORKSPACE_OFFSET (HAS_POSITION_SHIFT || HAS_HOME_OFFSET) + // M206 doesn't apply to DELTA + #define HAS_M206_COMMAND (HAS_HOME_OFFSET && DISABLED(DELTA)) + // LCD timeout to status screen default is 15s #ifndef LCD_TIMEOUT_TO_STATUS #define LCD_TIMEOUT_TO_STATUS 15000 diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index e18741a384..cea3d7fd6c 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -228,32 +228,52 @@ extern volatile bool wait_for_heatup; extern float current_position[NUM_AXIS]; // Workspace offsets -#if DISABLED(NO_WORKSPACE_OFFSETS) - extern float position_shift[XYZ], - home_offset[XYZ], - workspace_offset[XYZ]; - #define LOGICAL_POSITION(POS, AXIS) ((POS) + workspace_offset[AXIS]) - #define RAW_POSITION(POS, AXIS) ((POS) - workspace_offset[AXIS]) -#else - #define LOGICAL_POSITION(POS, AXIS) (POS) - #define RAW_POSITION(POS, AXIS) (POS) +#if HAS_WORKSPACE_OFFSET + #if HAS_HOME_OFFSET + extern float home_offset[XYZ]; + #endif + #if HAS_POSITION_SHIFT + extern float position_shift[XYZ]; + #endif #endif -#define LOGICAL_X_POSITION(POS) LOGICAL_POSITION(POS, X_AXIS) -#define LOGICAL_Y_POSITION(POS) LOGICAL_POSITION(POS, Y_AXIS) -#define LOGICAL_Z_POSITION(POS) LOGICAL_POSITION(POS, Z_AXIS) -#define RAW_X_POSITION(POS) RAW_POSITION(POS, X_AXIS) -#define RAW_Y_POSITION(POS) RAW_POSITION(POS, Y_AXIS) -#define RAW_Z_POSITION(POS) RAW_POSITION(POS, Z_AXIS) -#define RAW_CURRENT_POSITION(AXIS) RAW_POSITION(current_position[AXIS], AXIS) +#if HAS_HOME_OFFSET && HAS_POSITION_SHIFT + extern float workspace_offset[XYZ]; + #define WORKSPACE_OFFSET(AXIS) workspace_offset[AXIS] +#elif HAS_HOME_OFFSET + #define WORKSPACE_OFFSET(AXIS) home_offset[AXIS] +#elif HAS_POSITION_SHIFT + #define WORKSPACE_OFFSET(AXIS) position_shift[AXIS] +#else + #define WORKSPACE_OFFSET(AXIS) 0 +#endif +#define LOGICAL_POSITION(POS, AXIS) ((POS) + WORKSPACE_OFFSET(AXIS)) +#define RAW_POSITION(POS, AXIS) ((POS) - WORKSPACE_OFFSET(AXIS)) + +#if HAS_POSITION_SHIFT || DISABLED(DELTA) + #define LOGICAL_X_POSITION(POS) LOGICAL_POSITION(POS, X_AXIS) + #define LOGICAL_Y_POSITION(POS) LOGICAL_POSITION(POS, Y_AXIS) + #define RAW_X_POSITION(POS) RAW_POSITION(POS, X_AXIS) + #define RAW_Y_POSITION(POS) RAW_POSITION(POS, Y_AXIS) +#else + #define LOGICAL_X_POSITION(POS) (POS) + #define LOGICAL_Y_POSITION(POS) (POS) + #define RAW_X_POSITION(POS) (POS) + #define RAW_Y_POSITION(POS) (POS) +#endif + +#define LOGICAL_Z_POSITION(POS) LOGICAL_POSITION(POS, Z_AXIS) +#define RAW_Z_POSITION(POS) RAW_POSITION(POS, Z_AXIS) +#define RAW_CURRENT_POSITION(A) RAW_##A##_POSITION(current_position[A##_AXIS]) + +// Hotend Offsets #if HOTENDS > 1 extern float hotend_offset[XYZ][HOTENDS]; #endif // Software Endstops -extern float soft_endstop_min[XYZ]; -extern float soft_endstop_max[XYZ]; +extern float soft_endstop_min[XYZ], soft_endstop_max[XYZ]; #if HAS_SOFTWARE_ENDSTOPS extern bool soft_endstops_enabled; @@ -263,7 +283,7 @@ extern float soft_endstop_max[XYZ]; #define clamp_to_software_endstops(x) NOOP #endif -#if DISABLED(NO_WORKSPACE_OFFSETS) || ENABLED(DUAL_X_CARRIAGE) || ENABLED(DELTA) +#if HAS_WORKSPACE_OFFSET || ENABLED(DUAL_X_CARRIAGE) void update_software_endstops(const AxisEnum axis); #endif diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index f8edb87305..5626a2226f 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -147,7 +147,7 @@ S T minimum speeds B X, Y, Z, E - * M206 - Set additional homing offset. + * M206 - Set additional homing offset. (Disabled by NO_WORKSPACE_OFFSETS or DELTA) * M207 - Set Retract Length: S, Feedrate: F, and Z lift: Z. (Requires FWRETRACT) * M208 - Set Recover (unretract) Additional (!) Length: S and Feedrate: F. (Requires FWRETRACT) * M209 - Turn Automatic Retract Detection on/off: S<0|1> (For slicers that don't support G10/11). (Requires FWRETRACT) @@ -180,7 +180,7 @@ * M410 - Quickstop. Abort all planned moves. * M420 - Enable/Disable Leveling (with current values) S1=enable S0=disable (Requires MESH_BED_LEVELING or ABL) * M421 - Set a single Z coordinate in the Mesh Leveling grid. X Y Z (Requires MESH_BED_LEVELING or AUTO_BED_LEVELING_UBL) - * M428 - Set the home_offset based on the current_position. Nearest edge applies. + * M428 - Set the home_offset based on the current_position. Nearest edge applies. (Disabled by NO_WORKSPACE_OFFSETS or DELTA) * M500 - Store parameters in EEPROM. (Requires EEPROM_SETTINGS) * M501 - Restore parameters from EEPROM. (Requires EEPROM_SETTINGS) * M502 - Revert to the default "factory settings". ** Does not write them to EEPROM! ** @@ -409,18 +409,20 @@ bool axis_relative_modes[] = AXIS_RELATIVE_MODES, float filament_size[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(DEFAULT_NOMINAL_FILAMENT_DIA), volumetric_multiplier[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(1.0); -#if DISABLED(NO_WORKSPACE_OFFSETS) - - // The distance that XYZ has been offset by G92. Reset by G28. - float position_shift[XYZ] = { 0 }; - - // This offset is added to the configured home position. - // Set by M206, M428, or menu item. Saved to EEPROM. - float home_offset[XYZ] = { 0 }; - - // The above two are combined to save on computes - float workspace_offset[XYZ] = { 0 }; - +#if HAS_WORKSPACE_OFFSET + #if HAS_POSITION_SHIFT + // The distance that XYZ has been offset by G92. Reset by G28. + float position_shift[XYZ] = { 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. + float home_offset[XYZ] = { 0 }; + #endif + #if HAS_HOME_OFFSET && HAS_POSITION_SHIFT + // The above two are combined to save on computes + float workspace_offset[XYZ] = { 0 }; + #endif #endif // Software Endstops are based on the configured limits. @@ -1382,7 +1384,7 @@ bool get_target_extruder_from_command(int code) { #endif // DUAL_X_CARRIAGE -#if DISABLED(NO_WORKSPACE_OFFSETS) || ENABLED(DUAL_X_CARRIAGE) || ENABLED(DELTA) +#if HAS_WORKSPACE_OFFSET || ENABLED(DUAL_X_CARRIAGE) /** * Software endstops can be used to monitor the open end of @@ -1394,7 +1396,18 @@ bool get_target_extruder_from_command(int code) { * at the same positions relative to the machine. */ void update_software_endstops(const AxisEnum axis) { - const float offs = workspace_offset[axis] = home_offset[axis] + position_shift[axis]; + const float offs = 0.0 + #if HAS_HOME_OFFSET + + home_offset[axis] + #endif + #if HAS_POSITION_SHIFT + + position_shift[axis] + #endif + ; + + #if HAS_HOME_OFFSET && HAS_POSITION_SHIFT + workspace_offset[axis] = offs; + #endif #if ENABLED(DUAL_X_CARRIAGE) if (axis == X_AXIS) { @@ -1427,8 +1440,10 @@ bool get_target_extruder_from_command(int code) { #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) { SERIAL_ECHOPAIR("For ", axis_codes[axis]); - #if DISABLED(NO_WORKSPACE_OFFSETS) + #if HAS_HOME_OFFSET SERIAL_ECHOPAIR(" axis:\n home_offset = ", home_offset[axis]); + #endif + #if HAS_POSITION_SHIFT SERIAL_ECHOPAIR("\n position_shift = ", position_shift[axis]); #endif SERIAL_ECHOPAIR("\n soft_endstop_min = ", soft_endstop_min[axis]); @@ -1442,9 +1457,9 @@ bool get_target_extruder_from_command(int code) { #endif } -#endif // NO_WORKSPACE_OFFSETS +#endif // HAS_WORKSPACE_OFFSET || DUAL_X_CARRIAGE -#if DISABLED(NO_WORKSPACE_OFFSETS) && DISABLED(DELTA) +#if HAS_M206_COMMAND /** * Change the home offset for an axis, update the current * position and the software endstops to retain the same @@ -1458,7 +1473,7 @@ bool get_target_extruder_from_command(int code) { home_offset[axis] = v; update_software_endstops(axis); } -#endif // !NO_WORKSPACE_OFFSETS && !DELTA +#endif // HAS_M206_COMMAND /** * Set an axis' current position to its home position (after homing). @@ -1489,7 +1504,7 @@ static void set_axis_is_at_home(AxisEnum axis) { axis_known_position[axis] = axis_homed[axis] = true; - #if DISABLED(NO_WORKSPACE_OFFSETS) + #if HAS_POSITION_SHIFT position_shift[axis] = 0; update_software_endstops(axis); #endif @@ -1565,7 +1580,7 @@ static void set_axis_is_at_home(AxisEnum axis) { #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) { - #if DISABLED(NO_WORKSPACE_OFFSETS) + #if HAS_HOME_OFFSET SERIAL_ECHOPAIR("> home_offset[", axis_codes[axis]); SERIAL_ECHOLNPAIR("] = ", home_offset[axis]); #endif @@ -5366,7 +5381,7 @@ inline void gcode_G92() { current_position[i] = code_value_axis_units(i); if (i != E_AXIS) didXYZ = true; #else - #if DISABLED(NO_WORKSPACE_OFFSETS) + #if HAS_POSITION_SHIFT float p = current_position[i]; #endif float v = code_value_axis_units(i); @@ -5375,7 +5390,7 @@ inline void gcode_G92() { if (i != E_AXIS) { didXYZ = true; - #if DISABLED(NO_WORKSPACE_OFFSETS) + #if HAS_POSITION_SHIFT position_shift[i] += v - p; // Offset the coordinate space update_software_endstops((AxisEnum)i); #endif @@ -7382,7 +7397,7 @@ inline void gcode_M205() { if (code_seen('E')) planner.max_jerk[E_AXIS] = code_value_axis_units(E_AXIS); } -#if DISABLED(NO_WORKSPACE_OFFSETS) && DISABLED(DELTA) +#if HAS_M206_COMMAND /** * M206: Set Additional Homing Offset (X Y Z). SCARA aliases T=X, P=Y @@ -7401,7 +7416,7 @@ inline void gcode_M205() { report_current_position(); } -#endif // NO_WORKSPACE_OFFSETS +#endif // HAS_M206_COMMAND #if ENABLED(DELTA) /** @@ -8280,7 +8295,7 @@ void quickstop_stepper() { #endif -#if DISABLED(NO_WORKSPACE_OFFSETS) && DISABLED(DELTA) +#if HAS_M206_COMMAND /** * M428: Set home_offset based on the distance between the @@ -8322,7 +8337,7 @@ void quickstop_stepper() { } } -#endif // NO_WORKSPACE_OFFSETS +#endif // HAS_M206_COMMAND /** * M500: Store settings in EEPROM @@ -9301,9 +9316,9 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n // The newly-selected extruder XY is actually at... current_position[X_AXIS] += xydiff[X_AXIS]; current_position[Y_AXIS] += xydiff[Y_AXIS]; - #if DISABLED(NO_WORKSPACE_OFFSETS) || ENABLED(DUAL_X_CARRIAGE) + #if HAS_WORKSPACE_OFFSET || ENABLED(DUAL_X_CARRIAGE) for (uint8_t i = X_AXIS; i <= Y_AXIS; i++) { - #if DISABLED(NO_WORKSPACE_OFFSETS) + #if HAS_POSITION_SHIFT position_shift[i] += xydiff[i]; #endif update_software_endstops((AxisEnum)i); @@ -9895,7 +9910,7 @@ void process_next_command() { gcode_M205(); break; - #if DISABLED(NO_WORKSPACE_OFFSETS) && DISABLED(DELTA) + #if HAS_M206_COMMAND case 206: // M206: Set home offsets gcode_M206(); break; @@ -10063,7 +10078,7 @@ void process_next_command() { break; #endif - #if DISABLED(NO_WORKSPACE_OFFSETS) && DISABLED(DELTA) + #if HAS_M206_COMMAND case 428: // M428: Apply current_position to home_offset gcode_M428(); break; @@ -10584,8 +10599,8 @@ void set_current_from_steppers_for_axis(const AxisEnum axis) { * splitting the move where it crosses mesh borders. */ void mesh_line_to_destination(float fr_mm_s, uint8_t x_splits = 0xff, uint8_t y_splits = 0xff) { - int cx1 = mbl.cell_index_x(RAW_CURRENT_POSITION(X_AXIS)), - cy1 = mbl.cell_index_y(RAW_CURRENT_POSITION(Y_AXIS)), + int cx1 = mbl.cell_index_x(RAW_CURRENT_POSITION(X)), + cy1 = mbl.cell_index_y(RAW_CURRENT_POSITION(Y)), cx2 = mbl.cell_index_x(RAW_X_POSITION(destination[X_AXIS])), cy2 = mbl.cell_index_y(RAW_Y_POSITION(destination[Y_AXIS])); NOMORE(cx1, GRID_MAX_POINTS_X - 2); @@ -11799,7 +11814,7 @@ void setup() { // This also updates variables in the planner, elsewhere (void)settings.load(); - #if DISABLED(NO_WORKSPACE_OFFSETS) + #if HAS_M206_COMMAND // Initialize current position based on home_offset COPY(current_position, home_offset); #else diff --git a/Marlin/SanityCheck.h b/Marlin/SanityCheck.h index 362681b332..8f4c295421 100644 --- a/Marlin/SanityCheck.h +++ b/Marlin/SanityCheck.h @@ -391,13 +391,6 @@ #error "To use BED_LIMIT_SWITCHING you must disable PIDTEMPBED." #endif -/** - * Delta Auto calibration - */ -#if ENABLED(DELTA_AUTO_CALIBRATION) && ENABLED(NO_WORKSPACE_OFFSETS) - #error "DELTA_AUTO_CALIBRATION is incompatible with NO_WORKSPACE_OFFSETS." -#endif - /** * Allow only one bed leveling option to be defined */ diff --git a/Marlin/configuration_store.cpp b/Marlin/configuration_store.cpp index b85d7e152c..16775bbd11 100644 --- a/Marlin/configuration_store.cpp +++ b/Marlin/configuration_store.cpp @@ -202,7 +202,7 @@ void MarlinSettings::postprocess() { calculate_volumetric_multipliers(); - #if DISABLED(NO_WORKSPACE_OFFSETS) || ENABLED(DUAL_X_CARRIAGE) || ENABLED(DELTA) + #if HAS_HOME_OFFSET || ENABLED(DUAL_X_CARRIAGE) // Software endstops depend on home_offset LOOP_XYZ(i) update_software_endstops((AxisEnum)i); #endif @@ -299,7 +299,7 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(planner.min_travel_feedrate_mm_s); EEPROM_WRITE(planner.min_segment_time); EEPROM_WRITE(planner.max_jerk); - #if ENABLED(NO_WORKSPACE_OFFSETS) + #if !HAS_HOME_OFFSET const float home_offset[XYZ] = { 0 }; #endif #if ENABLED(DELTA) @@ -653,7 +653,7 @@ void MarlinSettings::postprocess() { EEPROM_READ(planner.min_segment_time); EEPROM_READ(planner.max_jerk); - #if ENABLED(NO_WORKSPACE_OFFSETS) + #if !HAS_HOME_OFFSET float home_offset[XYZ]; #endif EEPROM_READ(home_offset); @@ -999,7 +999,7 @@ void MarlinSettings::reset() { planner.z_fade_height = 0.0; #endif - #if DISABLED(NO_WORKSPACE_OFFSETS) + #if HAS_HOME_OFFSET ZERO(home_offset); #endif @@ -1039,10 +1039,10 @@ void MarlinSettings::reset() { delta_segments_per_second = DELTA_SEGMENTS_PER_SECOND; COPY(delta_diagonal_rod_trim, drt); COPY(delta_tower_angle_trim, dta); - #if ENABLED(DELTA) - home_offset[Z_AXIS] = 0; - #endif + home_offset[Z_AXIS] = 0; + #elif ENABLED(Z_DUAL_ENDSTOPS) + float z_endstop_adj = #ifdef Z_DUAL_ENDSTOPS_ADJUSTMENT Z_DUAL_ENDSTOPS_ADJUSTMENT @@ -1050,6 +1050,7 @@ void MarlinSettings::reset() { 0 #endif ; + #endif #if ENABLED(ULTIPANEL) @@ -1254,7 +1255,7 @@ void MarlinSettings::reset() { SERIAL_ECHOPAIR(" E", planner.max_jerk[E_AXIS]); SERIAL_EOL; - #if DISABLED(NO_WORKSPACE_OFFSETS) && DISABLED(DELTA) + #if HAS_M206_COMMAND CONFIG_ECHO_START; if (!forReplay) { SERIAL_ECHOLNPGM("Home offset (mm)"); diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index 29f4622477..3702f6651b 100755 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -817,7 +817,7 @@ void kill_screen(const char* lcd_msg) { * */ - #if DISABLED(NO_WORKSPACE_OFFSETS) && DISABLED(DELTA) + #if HAS_M206_COMMAND /** * Set the home offset based on the current_position */ @@ -1672,7 +1672,7 @@ void kill_screen(const char* lcd_msg) { #endif - #if DISABLED(NO_WORKSPACE_OFFSETS) && DISABLED(DELTA) + #if HAS_M206_COMMAND // // Set Home Offsets //