浏览代码

Only constrain motion on homed axes (#16533)

Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
FlyingSamson 4 年前
父节点
当前提交
fbf2f36cae
共有 2 个文件被更改,包括 40 次插入22 次删除
  1. 39
    22
      Marlin/src/module/motion.cpp
  2. 1
    0
      Marlin/src/module/motion.h

+ 39
- 22
Marlin/src/module/motion.cpp 查看文件

@@ -592,10 +592,14 @@ void restore_feedrate_and_scaling() {
592 592
    */
593 593
   void apply_motion_limits(xyz_pos_t &target) {
594 594
 
595
-    if (!soft_endstops_enabled || !all_axes_homed()) return;
595
+    if (!soft_endstops_enabled) return;
596 596
 
597 597
     #if IS_KINEMATIC
598 598
 
599
+      #if ENABLED(DELTA)
600
+        if (!all_axes_homed()) return;
601
+      #endif
602
+
599 603
       #if HAS_HOTEND_OFFSET && ENABLED(DELTA)
600 604
         // The effector center position will be the target minus the hotend offset.
601 605
         const xy_pos_t offs = hotend_offset[active_extruder];
@@ -604,33 +608,46 @@ void restore_feedrate_and_scaling() {
604 608
         constexpr xy_pos_t offs{0};
605 609
       #endif
606 610
 
607
-      const float dist_2 = HYPOT2(target.x - offs.x, target.y - offs.y);
608
-      if (dist_2 > delta_max_radius_2)
609
-        target *= delta_max_radius / SQRT(dist_2); // 200 / 300 = 0.66
611
+      if (true
612
+        #if IS_SCARA
613
+          && TEST(axis_homed, X_AXIS) && TEST(axis_homed, Y_AXIS)
614
+        #endif
615
+      ) {
616
+        const float dist_2 = HYPOT2(target.x - offs.x, target.y - offs.y);
617
+        if (dist_2 > delta_max_radius_2)
618
+          target *= delta_max_radius / SQRT(dist_2); // 200 / 300 = 0.66
619
+      }
610 620
 
611 621
     #else
612 622
 
613
-      #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_X)
614
-        NOLESS(target.x, soft_endstop.min.x);
615
-      #endif
616
-      #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_X)
617
-        NOMORE(target.x, soft_endstop.max.x);
618
-      #endif
619
-      #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Y)
620
-        NOLESS(target.y, soft_endstop.min.y);
621
-      #endif
622
-      #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_Y)
623
-        NOMORE(target.y, soft_endstop.max.y);
624
-      #endif
623
+      if (TEST(axis_homed, X_AXIS)) {
624
+        #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_X)
625
+          NOLESS(target.x, soft_endstop.min.x);
626
+        #endif
627
+        #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_X)
628
+          NOMORE(target.x, soft_endstop.max.x);
629
+        #endif
630
+      }
625 631
 
626
-    #endif
632
+      if (TEST(axis_homed, Y_AXIS)) {
633
+        #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Y)
634
+          NOLESS(target.y, soft_endstop.min.y);
635
+        #endif
636
+        #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_Y)
637
+          NOMORE(target.y, soft_endstop.max.y);
638
+        #endif
639
+      }
627 640
 
628
-    #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Z)
629
-      NOLESS(target.z, soft_endstop.min.z);
630
-    #endif
631
-    #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_Z)
632
-      NOMORE(target.z, soft_endstop.max.z);
633 641
     #endif
642
+
643
+    if (TEST(axis_homed, Z_AXIS)) {
644
+      #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Z)
645
+        NOLESS(target.z, soft_endstop.min.z);
646
+      #endif
647
+      #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_Z)
648
+        NOMORE(target.z, soft_endstop.max.z);
649
+      #endif
650
+    }
634 651
   }
635 652
 
636 653
 #endif // HAS_SOFTWARE_ENDSTOPS

+ 1
- 0
Marlin/src/module/motion.h 查看文件

@@ -41,6 +41,7 @@
41 41
 // Axis homed and known-position states
42 42
 extern uint8_t axis_homed, axis_known_position;
43 43
 constexpr uint8_t xyz_bits = _BV(X_AXIS) | _BV(Y_AXIS) | _BV(Z_AXIS);
44
+FORCE_INLINE bool no_axes_homed() { return !axis_homed; }
44 45
 FORCE_INLINE bool all_axes_homed() { return (axis_homed & xyz_bits) == xyz_bits; }
45 46
 FORCE_INLINE bool all_axes_known() { return (axis_known_position & xyz_bits) == xyz_bits; }
46 47
 FORCE_INLINE void set_all_unhomed() { axis_homed = 0; }

正在加载...
取消
保存