|
@@ -3653,7 +3653,7 @@ inline void gcode_G4() {
|
3653
|
3653
|
#if ENABLED(CNC_COORDINATE_SYSTEMS)
|
3654
|
3654
|
|
3655
|
3655
|
/**
|
3656
|
|
- * Select a coordinate system and update the current position.
|
|
3656
|
+ * Select a coordinate system and update the workspace offset.
|
3657
|
3657
|
* System index -1 is used to specify machine-native.
|
3658
|
3658
|
*/
|
3659
|
3659
|
bool select_coordinate_system(const int8_t _new) {
|
|
@@ -3664,16 +3664,13 @@ inline void gcode_G4() {
|
3664
|
3664
|
if (WITHIN(_new, 0, MAX_COORDINATE_SYSTEMS - 1))
|
3665
|
3665
|
COPY(new_offset, coordinate_system[_new]);
|
3666
|
3666
|
active_coordinate_system = _new;
|
3667
|
|
- bool didXYZ = false;
|
3668
|
3667
|
LOOP_XYZ(i) {
|
3669
|
3668
|
const float diff = new_offset[i] - old_offset[i];
|
3670
|
3669
|
if (diff) {
|
3671
|
3670
|
position_shift[i] += diff;
|
3672
|
3671
|
update_software_endstops((AxisEnum)i);
|
3673
|
|
- didXYZ = true;
|
3674
|
3672
|
}
|
3675
|
3673
|
}
|
3676
|
|
- if (didXYZ) SYNC_PLAN_POSITION_KINEMATIC();
|
3677
|
3674
|
return true;
|
3678
|
3675
|
}
|
3679
|
3676
|
|
|
@@ -6257,7 +6254,12 @@ inline void gcode_G92() {
|
6257
|
6254
|
#define IS_G92_0 true
|
6258
|
6255
|
#endif
|
6259
|
6256
|
|
6260
|
|
- bool didXYZ = false, didE = false;
|
|
6257
|
+ bool didE = false;
|
|
6258
|
+ #if IS_SCARA || !HAS_POSITION_SHIFT
|
|
6259
|
+ bool didXYZ = false;
|
|
6260
|
+ #else
|
|
6261
|
+ constexpr bool didXYZ = false;
|
|
6262
|
+ #endif
|
6261
|
6263
|
|
6262
|
6264
|
if (IS_G92_0) LOOP_XYZE(i) {
|
6263
|
6265
|
if (parser.seenval(axis_codes[i])) {
|
|
@@ -6265,18 +6267,18 @@ inline void gcode_G92() {
|
6265
|
6267
|
v = i == E_AXIS ? l : LOGICAL_TO_NATIVE(l, i),
|
6266
|
6268
|
d = v - current_position[i];
|
6267
|
6269
|
if (!NEAR_ZERO(d)) {
|
6268
|
|
- if (i == E_AXIS) didE = true; else didXYZ = true;
|
6269
|
|
- #if IS_SCARA
|
6270
|
|
- current_position[i] = v; // For SCARA just set the position directly
|
|
6270
|
+ #if IS_SCARA || !HAS_POSITION_SHIFT
|
|
6271
|
+ if (i == E_AXIS) didE = true; else didXYZ = true;
|
|
6272
|
+ current_position[i] = v; // Without workspaces revert to Marlin 1.0 behavior
|
6271
|
6273
|
#elif HAS_POSITION_SHIFT
|
6272
|
|
- if (i == E_AXIS)
|
|
6274
|
+ if (i == E_AXIS) {
|
|
6275
|
+ didE = true;
|
6273
|
6276
|
current_position[E_AXIS] = v; // When using coordinate spaces, only E is set directly
|
|
6277
|
+ }
|
6274
|
6278
|
else {
|
6275
|
6279
|
position_shift[i] += d; // Other axes simply offset the coordinate space
|
6276
|
6280
|
update_software_endstops((AxisEnum)i);
|
6277
|
6281
|
}
|
6278
|
|
- #else
|
6279
|
|
- current_position[i] = v; // Without workspaces revert to Marlin 1.0 behavior
|
6280
|
6282
|
#endif
|
6281
|
6283
|
}
|
6282
|
6284
|
}
|
|
@@ -9958,31 +9960,27 @@ void quickstop_stepper() {
|
9958
|
9960
|
* Use M206 to set these values directly.
|
9959
|
9961
|
*/
|
9960
|
9962
|
inline void gcode_M428() {
|
9961
|
|
- bool err = false;
|
|
9963
|
+ if (axis_unhomed_error()) return;
|
|
9964
|
+
|
|
9965
|
+ float diff[XYZ];
|
9962
|
9966
|
LOOP_XYZ(i) {
|
9963
|
|
- if (axis_homed[i]) {
|
9964
|
|
- const float base = (current_position[i] > (soft_endstop_min[i] + soft_endstop_max[i]) * 0.5) ? base_home_pos((AxisEnum)i) : 0,
|
9965
|
|
- diff = base - current_position[i];
|
9966
|
|
- if (WITHIN(diff, -20, 20)) {
|
9967
|
|
- set_home_offset((AxisEnum)i, diff);
|
9968
|
|
- }
|
9969
|
|
- else {
|
9970
|
|
- SERIAL_ERROR_START();
|
9971
|
|
- SERIAL_ERRORLNPGM(MSG_ERR_M428_TOO_FAR);
|
9972
|
|
- LCD_ALERTMESSAGEPGM("Err: Too far!");
|
9973
|
|
- BUZZ(200, 40);
|
9974
|
|
- err = true;
|
9975
|
|
- break;
|
9976
|
|
- }
|
|
9967
|
+ diff[i] = base_home_pos((AxisEnum)i) - current_position[i];
|
|
9968
|
+ if (!WITHIN(diff[i], -20, 20) && home_dir((AxisEnum)i) > 0)
|
|
9969
|
+ diff[i] = -current_position[i];
|
|
9970
|
+ if (!WITHIN(diff[i], -20, 20)) {
|
|
9971
|
+ SERIAL_ERROR_START();
|
|
9972
|
+ SERIAL_ERRORLNPGM(MSG_ERR_M428_TOO_FAR);
|
|
9973
|
+ LCD_ALERTMESSAGEPGM("Err: Too far!");
|
|
9974
|
+ BUZZ(200, 40);
|
|
9975
|
+ return;
|
9977
|
9976
|
}
|
9978
|
9977
|
}
|
9979
|
9978
|
|
9980
|
|
- if (!err) {
|
9981
|
|
- report_current_position();
|
9982
|
|
- LCD_MESSAGEPGM(MSG_HOME_OFFSETS_APPLIED);
|
9983
|
|
- BUZZ(100, 659);
|
9984
|
|
- BUZZ(100, 698);
|
9985
|
|
- }
|
|
9979
|
+ LOOP_XYZ(i) set_home_offset((AxisEnum)i, diff[i]);
|
|
9980
|
+ report_current_position();
|
|
9981
|
+ LCD_MESSAGEPGM(MSG_HOME_OFFSETS_APPLIED);
|
|
9982
|
+ BUZZ(100, 659);
|
|
9983
|
+ BUZZ(100, 698);
|
9986
|
9984
|
}
|
9987
|
9985
|
|
9988
|
9986
|
#endif // HAS_M206_COMMAND
|