Cleanup for dual endstops homing
This commit is contained in:
		| @@ -396,7 +396,6 @@ void Endstops::M119() { | ||||
| // Check endstops - Could be called from ISR! | ||||
| void Endstops::update() { | ||||
|  | ||||
|   #define SET_BIT_TO(N,B,TF) do{ if (TF) SBI(N,B); else CBI(N,B); }while(0) | ||||
|   // UPDATE_ENDSTOP_BIT: set the current endstop bits for an endstop to its status | ||||
|   #define UPDATE_ENDSTOP_BIT(AXIS, MINMAX) SET_BIT_TO(live_state, _ENDSTOP(AXIS, MINMAX), (READ(_ENDSTOP_PIN(AXIS, MINMAX)) != _ENDSTOP_INVERTING(AXIS, MINMAX))) | ||||
|   // COPY_BIT: copy the value of SRC_BIT to DST_BIT in DST | ||||
| @@ -590,7 +589,7 @@ void Endstops::update() { | ||||
|     if (dual_hit) { \ | ||||
|       _ENDSTOP_HIT(AXIS1, MINMAX); \ | ||||
|       /* if not performing home or if both endstops were trigged during homing... */ \ | ||||
|       if (!stepper.performing_homing || dual_hit == 0x3) \ | ||||
|       if (!stepper.homing_dual_axis || dual_hit == 0x3) \ | ||||
|         planner.endstop_triggered(_AXIS(AXIS1)); \ | ||||
|     } \ | ||||
|   }while(0) | ||||
|   | ||||
| @@ -1052,9 +1052,14 @@ static void do_homing_move(const AxisEnum axis, const float distance, const floa | ||||
|     if (DEBUGGING(LEVELING)) { | ||||
|       SERIAL_ECHOPAIR(">>> do_homing_move(", axis_codes[axis]); | ||||
|       SERIAL_ECHOPAIR(", ", distance); | ||||
|       SERIAL_ECHOPAIR(", ", fr_mm_s); | ||||
|       SERIAL_ECHOPAIR(" [", fr_mm_s ? fr_mm_s : homing_feedrate(axis)); | ||||
|       SERIAL_ECHOLNPGM("])"); | ||||
|       SERIAL_ECHOPGM(", "); | ||||
|       if (fr_mm_s) | ||||
|         SERIAL_ECHO(fr_mm_s); | ||||
|       else { | ||||
|         SERIAL_ECHOPAIR("[", homing_feedrate(axis)); | ||||
|         SERIAL_CHAR(']'); | ||||
|       } | ||||
|       SERIAL_ECHOLNPGM(")"); | ||||
|     } | ||||
|   #endif | ||||
|  | ||||
| @@ -1262,11 +1267,12 @@ void homeaxis(const AxisEnum axis) { | ||||
|     } | ||||
|   #endif | ||||
|  | ||||
|   const int axis_home_dir = | ||||
|   const int axis_home_dir = ( | ||||
|     #if ENABLED(DUAL_X_CARRIAGE) | ||||
|       (axis == X_AXIS) ? x_home_dir(active_extruder) : | ||||
|       axis == X_AXIS ? x_home_dir(active_extruder) : | ||||
|     #endif | ||||
|     home_dir(axis); | ||||
|     home_dir(axis) | ||||
|   ); | ||||
|  | ||||
|   // Homing Z towards the bed? Deploy the Z probe or endstop. | ||||
|   #if HOMING_Z_WITH_PROBE | ||||
| @@ -1274,14 +1280,20 @@ void homeaxis(const AxisEnum axis) { | ||||
|   #endif | ||||
|  | ||||
|   // Set flags for X, Y, Z motor locking | ||||
|   #if ENABLED(X_DUAL_ENDSTOPS) | ||||
|     if (axis == X_AXIS) stepper.set_homing_flag_x(true); | ||||
|   #endif | ||||
|   #if ENABLED(Y_DUAL_ENDSTOPS) | ||||
|     if (axis == Y_AXIS) stepper.set_homing_flag_y(true); | ||||
|   #endif | ||||
|   #if ENABLED(Z_DUAL_ENDSTOPS) | ||||
|     if (axis == Z_AXIS) stepper.set_homing_flag_z(true); | ||||
|   #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) | ||||
|     switch (axis) { | ||||
|       #if ENABLED(X_DUAL_ENDSTOPS) | ||||
|         case X_AXIS: | ||||
|       #endif | ||||
|       #if ENABLED(Y_DUAL_ENDSTOPS) | ||||
|         case Y_AXIS: | ||||
|       #endif | ||||
|       #if ENABLED(Z_DUAL_ENDSTOPS) | ||||
|         case Z_AXIS: | ||||
|       #endif | ||||
|       stepper.set_homing_dual_axis(true); | ||||
|       default: break; | ||||
|     } | ||||
|   #endif | ||||
|  | ||||
|   // Fast move towards endstop until triggered | ||||
| @@ -1321,37 +1333,32 @@ void homeaxis(const AxisEnum axis) { | ||||
|     const bool pos_dir = axis_home_dir > 0; | ||||
|     #if ENABLED(X_DUAL_ENDSTOPS) | ||||
|       if (axis == X_AXIS) { | ||||
|         const bool lock_x1 = pos_dir ? (endstops.x_endstop_adj > 0) : (endstops.x_endstop_adj < 0); | ||||
|         float adj = ABS(endstops.x_endstop_adj); | ||||
|         if (pos_dir) adj = -adj; | ||||
|         if (lock_x1) stepper.set_x_lock(true); else stepper.set_x2_lock(true); | ||||
|         do_homing_move(axis, adj); | ||||
|         if (lock_x1) stepper.set_x_lock(false); else stepper.set_x2_lock(false); | ||||
|         stepper.set_homing_flag_x(false); | ||||
|         const float adj = ABS(endstops.x_endstop_adj); | ||||
|         if (pos_dir ? (endstops.x_endstop_adj > 0) : (endstops.x_endstop_adj < 0)) stepper.set_x_lock(true); else stepper.set_x2_lock(true); | ||||
|         do_homing_move(axis, pos_dir ? adj : -adj); | ||||
|         stepper.set_x_lock(false); | ||||
|         stepper.set_x2_lock(false); | ||||
|       } | ||||
|     #endif | ||||
|     #if ENABLED(Y_DUAL_ENDSTOPS) | ||||
|       if (axis == Y_AXIS) { | ||||
|         const bool lock_y1 = pos_dir ? (endstops.y_endstop_adj > 0) : (endstops.y_endstop_adj < 0); | ||||
|         float adj = ABS(endstops.y_endstop_adj); | ||||
|         if (pos_dir) adj = -adj; | ||||
|         if (lock_y1) stepper.set_y_lock(true); else stepper.set_y2_lock(true); | ||||
|         do_homing_move(axis, adj); | ||||
|         if (lock_y1) stepper.set_y_lock(false); else stepper.set_y2_lock(false); | ||||
|         stepper.set_homing_flag_y(false); | ||||
|         const float adj = ABS(endstops.y_endstop_adj); | ||||
|         if (pos_dir ? (endstops.y_endstop_adj > 0) : (endstops.y_endstop_adj < 0)) stepper.set_y_lock(true); else stepper.set_y2_lock(true); | ||||
|         do_homing_move(axis, pos_dir ? adj : -adj); | ||||
|         stepper.set_y_lock(false); | ||||
|         stepper.set_y2_lock(false); | ||||
|       } | ||||
|     #endif | ||||
|     #if ENABLED(Z_DUAL_ENDSTOPS) | ||||
|       if (axis == Z_AXIS) { | ||||
|         const bool lock_z1 = pos_dir ? (endstops.z_endstop_adj > 0) : (endstops.z_endstop_adj < 0); | ||||
|         float adj = ABS(endstops.z_endstop_adj); | ||||
|         if (pos_dir) adj = -adj; | ||||
|         if (lock_z1) stepper.set_z_lock(true); else stepper.set_z2_lock(true); | ||||
|         do_homing_move(axis, adj); | ||||
|         if (lock_z1) stepper.set_z_lock(false); else stepper.set_z2_lock(false); | ||||
|         stepper.set_homing_flag_z(false); | ||||
|         const float adj = ABS(endstops.z_endstop_adj); | ||||
|         if (pos_dir ? (endstops.z_endstop_adj > 0) : (endstops.z_endstop_adj < 0)) stepper.set_z_lock(true); else stepper.set_z2_lock(true); | ||||
|         do_homing_move(axis, pos_dir ? adj : -adj); | ||||
|         stepper.set_z_lock(false); | ||||
|         stepper.set_z2_lock(false); | ||||
|       } | ||||
|     #endif | ||||
|     stepper.set_homing_dual_axis(false); | ||||
|   #endif | ||||
|  | ||||
|   #if IS_SCARA | ||||
| @@ -1393,10 +1400,9 @@ void homeaxis(const AxisEnum axis) { | ||||
|     if (axis == Z_AXIS && STOW_PROBE()) return; | ||||
|   #endif | ||||
|  | ||||
|   // Clear z_lift if homing the Z axis | ||||
|   // Clear retracted status if homing the Z axis | ||||
|   #if ENABLED(FWRETRACT) | ||||
|     if (axis == Z_AXIS) | ||||
|       fwretract.hop_amount = 0.0; | ||||
|     if (axis == Z_AXIS) fwretract.hop_amount = 0.0; | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
| @@ -1470,7 +1476,7 @@ void homeaxis(const AxisEnum axis) { | ||||
|     #endif | ||||
|  | ||||
|     #if ENABLED(DELTA) | ||||
|       switch(axis) { | ||||
|       switch (axis) { | ||||
|         #if HAS_SOFTWARE_ENDSTOPS | ||||
|           case X_AXIS: | ||||
|           case Y_AXIS: | ||||
|   | ||||
| @@ -87,7 +87,7 @@ Stepper stepper; // Singleton | ||||
| block_t* Stepper::current_block = NULL;  // A pointer to the block currently being traced | ||||
|  | ||||
| #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) | ||||
|   bool Stepper::performing_homing = false; | ||||
|   bool Stepper::homing_dual_axis = false; | ||||
| #endif | ||||
|  | ||||
| #if HAS_MOTOR_CURRENT_PWM | ||||
| @@ -166,7 +166,7 @@ bool Stepper::all_steps_done = false; | ||||
| uint32_t Stepper::acceleration_time, Stepper::deceleration_time; | ||||
|  | ||||
| volatile int32_t Stepper::count_position[NUM_AXIS] = { 0 }; | ||||
| volatile signed char Stepper::count_direction[NUM_AXIS] = { 1, 1, 1, 1 }; | ||||
| int8_t Stepper::count_direction[NUM_AXIS] = { 1, 1, 1, 1 }; | ||||
|  | ||||
| #if ENABLED(MIXING_EXTRUDER) | ||||
|   int32_t Stepper::counter_m[MIXING_STEPPERS]; | ||||
| @@ -183,7 +183,7 @@ volatile int32_t Stepper::endstops_trigsteps[XYZ]; | ||||
|  | ||||
| #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) | ||||
|   #define DUAL_ENDSTOP_APPLY_STEP(A,V)                                                                                        \ | ||||
|     if (performing_homing) {                                                                                                  \ | ||||
|     if (homing_dual_axis) {                                                                                                   \ | ||||
|       if (A##_HOME_DIR < 0) {                                                                                                 \ | ||||
|         if (!(TEST(endstops.state(), A##_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##_motor) A##_STEP_WRITE(V);    \ | ||||
|         if (!(TEST(endstops.state(), A##2_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ | ||||
| @@ -1144,7 +1144,6 @@ void Stepper::set_directions() { | ||||
| HAL_STEP_TIMER_ISR { | ||||
|   HAL_timer_isr_prologue(STEP_TIMER_NUM); | ||||
|  | ||||
|   // Call the ISR | ||||
|   Stepper::isr(); | ||||
|  | ||||
|   HAL_timer_isr_epilogue(STEP_TIMER_NUM); | ||||
| @@ -1175,7 +1174,7 @@ void Stepper::isr() { | ||||
|   // We need this variable here to be able to use it in the following loop | ||||
|   hal_timer_t min_ticks; | ||||
|   do { | ||||
|     // Enable ISRs so the USART processing latency is reduced | ||||
|     // Enable ISRs to reduce USART processing latency | ||||
|     ENABLE_ISRS(); | ||||
|  | ||||
|     // Run main stepping pulse phase ISR if we have to | ||||
| @@ -1193,11 +1192,9 @@ void Stepper::isr() { | ||||
|  | ||||
|     uint32_t interval = | ||||
|       #if ENABLED(LIN_ADVANCE) | ||||
|         // Select the closest interval in time | ||||
|         MIN(nextAdvanceISR, nextMainISR) | ||||
|         MIN(nextAdvanceISR, nextMainISR)  // Nearest time interval | ||||
|       #else | ||||
|         // The interval is just the remaining time to the stepper ISR | ||||
|         nextMainISR | ||||
|         nextMainISR                       // Remaining stepper ISR time | ||||
|       #endif | ||||
|     ; | ||||
|  | ||||
| @@ -1239,7 +1236,7 @@ void Stepper::isr() { | ||||
|     next_isr_ticks += interval; | ||||
|  | ||||
|     /** | ||||
|      *  The following section must be done with global interrupts disabled. | ||||
|      * The following section must be done with global interrupts disabled. | ||||
|      * We want nothing to interrupt it, as that could mess the calculations | ||||
|      * we do for the next value to program in the period register of the | ||||
|      * stepper timer and lead to skipped ISRs (if the value we happen to program | ||||
|   | ||||
| @@ -63,7 +63,7 @@ class Stepper { | ||||
|     static block_t* current_block;  // A pointer to the block currently being traced | ||||
|  | ||||
|     #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) | ||||
|       static bool performing_homing; | ||||
|       static bool homing_dual_axis; | ||||
|     #endif | ||||
|  | ||||
|     #if HAS_MOTOR_CURRENT_PWM | ||||
| @@ -143,7 +143,7 @@ class Stepper { | ||||
|     // | ||||
|     // Current direction of stepper motors (+1 or -1) | ||||
|     // | ||||
|     static volatile signed char count_direction[NUM_AXIS]; | ||||
|     static int8_t count_direction[NUM_AXIS]; | ||||
|  | ||||
|     // | ||||
|     // Mixing extruder mix counters | ||||
| @@ -220,18 +220,18 @@ class Stepper { | ||||
|       static void microstep_readings(); | ||||
|     #endif | ||||
|  | ||||
|     #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) | ||||
|       FORCE_INLINE static void set_homing_dual_axis(const bool state) { homing_dual_axis = state; } | ||||
|     #endif | ||||
|     #if ENABLED(X_DUAL_ENDSTOPS) | ||||
|       FORCE_INLINE static void set_homing_flag_x(const bool state) { performing_homing = state; } | ||||
|       FORCE_INLINE static void set_x_lock(const bool state) { locked_X_motor = state; } | ||||
|       FORCE_INLINE static void set_x2_lock(const bool state) { locked_X2_motor = state; } | ||||
|     #endif | ||||
|     #if ENABLED(Y_DUAL_ENDSTOPS) | ||||
|       FORCE_INLINE static void set_homing_flag_y(const bool state) { performing_homing = state; } | ||||
|       FORCE_INLINE static void set_y_lock(const bool state) { locked_Y_motor = state; } | ||||
|       FORCE_INLINE static void set_y2_lock(const bool state) { locked_Y2_motor = state; } | ||||
|     #endif | ||||
|     #if ENABLED(Z_DUAL_ENDSTOPS) | ||||
|       FORCE_INLINE static void set_homing_flag_z(const bool state) { performing_homing = state; } | ||||
|       FORCE_INLINE static void set_z_lock(const bool state) { locked_Z_motor = state; } | ||||
|       FORCE_INLINE static void set_z2_lock(const bool state) { locked_Z2_motor = state; } | ||||
|     #endif | ||||
| @@ -247,15 +247,9 @@ class Stepper { | ||||
|     // Set the current position in steps | ||||
|     inline static void set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e) { | ||||
|       planner.synchronize(); | ||||
|  | ||||
|       // Disable stepper interrupts, to ensure atomic setting of all the position variables | ||||
|       const bool was_enabled = STEPPER_ISR_ENABLED(); | ||||
|       if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); | ||||
|  | ||||
|       // Set position | ||||
|       _set_position(a, b, c, e); | ||||
|  | ||||
|       // Reenable Stepper ISR | ||||
|       if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); | ||||
|     } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user