Only constrain motion on homed axes (#16533)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
This commit is contained in:
		
				
					committed by
					
						 Scott Lahteine
						Scott Lahteine
					
				
			
			
				
	
			
			
			
						parent
						
							536778812f
						
					
				
				
					commit
					fbf2f36cae
				
			| @@ -592,10 +592,14 @@ void restore_feedrate_and_scaling() { | ||||
|    */ | ||||
|   void apply_motion_limits(xyz_pos_t &target) { | ||||
|  | ||||
|     if (!soft_endstops_enabled || !all_axes_homed()) return; | ||||
|     if (!soft_endstops_enabled) return; | ||||
|  | ||||
|     #if IS_KINEMATIC | ||||
|  | ||||
|       #if ENABLED(DELTA) | ||||
|         if (!all_axes_homed()) return; | ||||
|       #endif | ||||
|  | ||||
|       #if HAS_HOTEND_OFFSET && ENABLED(DELTA) | ||||
|         // The effector center position will be the target minus the hotend offset. | ||||
|         const xy_pos_t offs = hotend_offset[active_extruder]; | ||||
| @@ -604,33 +608,46 @@ void restore_feedrate_and_scaling() { | ||||
|         constexpr xy_pos_t offs{0}; | ||||
|       #endif | ||||
|  | ||||
|       const float dist_2 = HYPOT2(target.x - offs.x, target.y - offs.y); | ||||
|       if (dist_2 > delta_max_radius_2) | ||||
|         target *= delta_max_radius / SQRT(dist_2); // 200 / 300 = 0.66 | ||||
|       if (true | ||||
|         #if IS_SCARA | ||||
|           && TEST(axis_homed, X_AXIS) && TEST(axis_homed, Y_AXIS) | ||||
|         #endif | ||||
|       ) { | ||||
|         const float dist_2 = HYPOT2(target.x - offs.x, target.y - offs.y); | ||||
|         if (dist_2 > delta_max_radius_2) | ||||
|           target *= delta_max_radius / SQRT(dist_2); // 200 / 300 = 0.66 | ||||
|       } | ||||
|  | ||||
|     #else | ||||
|  | ||||
|       #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_X) | ||||
|         NOLESS(target.x, soft_endstop.min.x); | ||||
|       #endif | ||||
|       #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_X) | ||||
|         NOMORE(target.x, soft_endstop.max.x); | ||||
|       #endif | ||||
|       #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Y) | ||||
|         NOLESS(target.y, soft_endstop.min.y); | ||||
|       #endif | ||||
|       #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_Y) | ||||
|         NOMORE(target.y, soft_endstop.max.y); | ||||
|       #endif | ||||
|       if (TEST(axis_homed, X_AXIS)) { | ||||
|         #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_X) | ||||
|           NOLESS(target.x, soft_endstop.min.x); | ||||
|         #endif | ||||
|         #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_X) | ||||
|           NOMORE(target.x, soft_endstop.max.x); | ||||
|         #endif | ||||
|       } | ||||
|  | ||||
|       if (TEST(axis_homed, Y_AXIS)) { | ||||
|         #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Y) | ||||
|           NOLESS(target.y, soft_endstop.min.y); | ||||
|         #endif | ||||
|         #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_Y) | ||||
|           NOMORE(target.y, soft_endstop.max.y); | ||||
|         #endif | ||||
|       } | ||||
|  | ||||
|     #endif | ||||
|  | ||||
|     #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Z) | ||||
|       NOLESS(target.z, soft_endstop.min.z); | ||||
|     #endif | ||||
|     #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_Z) | ||||
|       NOMORE(target.z, soft_endstop.max.z); | ||||
|     #endif | ||||
|     if (TEST(axis_homed, Z_AXIS)) { | ||||
|       #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Z) | ||||
|         NOLESS(target.z, soft_endstop.min.z); | ||||
|       #endif | ||||
|       #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_Z) | ||||
|         NOMORE(target.z, soft_endstop.max.z); | ||||
|       #endif | ||||
|     } | ||||
|   } | ||||
|  | ||||
| #endif // HAS_SOFTWARE_ENDSTOPS | ||||
|   | ||||
| @@ -41,6 +41,7 @@ | ||||
| // Axis homed and known-position states | ||||
| extern uint8_t axis_homed, axis_known_position; | ||||
| constexpr uint8_t xyz_bits = _BV(X_AXIS) | _BV(Y_AXIS) | _BV(Z_AXIS); | ||||
| FORCE_INLINE bool no_axes_homed() { return !axis_homed; } | ||||
| FORCE_INLINE bool all_axes_homed() { return (axis_homed & xyz_bits) == xyz_bits; } | ||||
| FORCE_INLINE bool all_axes_known() { return (axis_known_position & xyz_bits) == xyz_bits; } | ||||
| FORCE_INLINE void set_all_unhomed() { axis_homed = 0; } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user