🎨 Various multi-axis patches (#22823)
This commit is contained in:
		
				
					committed by
					
						
						Scott Lahteine
					
				
			
			
				
	
			
			
			
						parent
						
							3deb54d0fd
						
					
				
				
					commit
					2c30b75268
				
			@@ -794,18 +794,18 @@
 | 
				
			|||||||
#define ENDSTOPPULLUPS
 | 
					#define ENDSTOPPULLUPS
 | 
				
			||||||
#if DISABLED(ENDSTOPPULLUPS)
 | 
					#if DISABLED(ENDSTOPPULLUPS)
 | 
				
			||||||
  // Disable ENDSTOPPULLUPS to set pullups individually
 | 
					  // Disable ENDSTOPPULLUPS to set pullups individually
 | 
				
			||||||
  //#define ENDSTOPPULLUP_XMAX
 | 
					 | 
				
			||||||
  //#define ENDSTOPPULLUP_YMAX
 | 
					 | 
				
			||||||
  //#define ENDSTOPPULLUP_ZMAX
 | 
					 | 
				
			||||||
  //#define ENDSTOPPULLUP_IMAX
 | 
					 | 
				
			||||||
  //#define ENDSTOPPULLUP_JMAX
 | 
					 | 
				
			||||||
  //#define ENDSTOPPULLUP_KMAX
 | 
					 | 
				
			||||||
  //#define ENDSTOPPULLUP_XMIN
 | 
					  //#define ENDSTOPPULLUP_XMIN
 | 
				
			||||||
  //#define ENDSTOPPULLUP_YMIN
 | 
					  //#define ENDSTOPPULLUP_YMIN
 | 
				
			||||||
  //#define ENDSTOPPULLUP_ZMIN
 | 
					  //#define ENDSTOPPULLUP_ZMIN
 | 
				
			||||||
  //#define ENDSTOPPULLUP_IMIN
 | 
					  //#define ENDSTOPPULLUP_IMIN
 | 
				
			||||||
  //#define ENDSTOPPULLUP_JMIN
 | 
					  //#define ENDSTOPPULLUP_JMIN
 | 
				
			||||||
  //#define ENDSTOPPULLUP_KMIN
 | 
					  //#define ENDSTOPPULLUP_KMIN
 | 
				
			||||||
 | 
					  //#define ENDSTOPPULLUP_XMAX
 | 
				
			||||||
 | 
					  //#define ENDSTOPPULLUP_YMAX
 | 
				
			||||||
 | 
					  //#define ENDSTOPPULLUP_ZMAX
 | 
				
			||||||
 | 
					  //#define ENDSTOPPULLUP_IMAX
 | 
				
			||||||
 | 
					  //#define ENDSTOPPULLUP_JMAX
 | 
				
			||||||
 | 
					  //#define ENDSTOPPULLUP_KMAX
 | 
				
			||||||
  //#define ENDSTOPPULLUP_ZMIN_PROBE
 | 
					  //#define ENDSTOPPULLUP_ZMIN_PROBE
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -813,18 +813,18 @@
 | 
				
			|||||||
//#define ENDSTOPPULLDOWNS
 | 
					//#define ENDSTOPPULLDOWNS
 | 
				
			||||||
#if DISABLED(ENDSTOPPULLDOWNS)
 | 
					#if DISABLED(ENDSTOPPULLDOWNS)
 | 
				
			||||||
  // Disable ENDSTOPPULLDOWNS to set pulldowns individually
 | 
					  // Disable ENDSTOPPULLDOWNS to set pulldowns individually
 | 
				
			||||||
  //#define ENDSTOPPULLDOWN_XMAX
 | 
					 | 
				
			||||||
  //#define ENDSTOPPULLDOWN_YMAX
 | 
					 | 
				
			||||||
  //#define ENDSTOPPULLDOWN_ZMAX
 | 
					 | 
				
			||||||
  //#define ENDSTOPPULLDOWN_IMAX
 | 
					 | 
				
			||||||
  //#define ENDSTOPPULLDOWN_JMAX
 | 
					 | 
				
			||||||
  //#define ENDSTOPPULLDOWN_KMAX
 | 
					 | 
				
			||||||
  //#define ENDSTOPPULLDOWN_XMIN
 | 
					  //#define ENDSTOPPULLDOWN_XMIN
 | 
				
			||||||
  //#define ENDSTOPPULLDOWN_YMIN
 | 
					  //#define ENDSTOPPULLDOWN_YMIN
 | 
				
			||||||
  //#define ENDSTOPPULLDOWN_ZMIN
 | 
					  //#define ENDSTOPPULLDOWN_ZMIN
 | 
				
			||||||
  //#define ENDSTOPPULLDOWN_IMIN
 | 
					  //#define ENDSTOPPULLDOWN_IMIN
 | 
				
			||||||
  //#define ENDSTOPPULLDOWN_JMIN
 | 
					  //#define ENDSTOPPULLDOWN_JMIN
 | 
				
			||||||
  //#define ENDSTOPPULLDOWN_KMIN
 | 
					  //#define ENDSTOPPULLDOWN_KMIN
 | 
				
			||||||
 | 
					  //#define ENDSTOPPULLDOWN_XMAX
 | 
				
			||||||
 | 
					  //#define ENDSTOPPULLDOWN_YMAX
 | 
				
			||||||
 | 
					  //#define ENDSTOPPULLDOWN_ZMAX
 | 
				
			||||||
 | 
					  //#define ENDSTOPPULLDOWN_IMAX
 | 
				
			||||||
 | 
					  //#define ENDSTOPPULLDOWN_JMAX
 | 
				
			||||||
 | 
					  //#define ENDSTOPPULLDOWN_KMAX
 | 
				
			||||||
  //#define ENDSTOPPULLDOWN_ZMIN_PROBE
 | 
					  //#define ENDSTOPPULLDOWN_ZMIN_PROBE
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -162,12 +162,14 @@ void setup_endstop_interrupts() {
 | 
				
			|||||||
      #error "Z_MIN_PROBE_PIN has no EXTINT line available."
 | 
					      #error "Z_MIN_PROBE_PIN has no EXTINT line available."
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
    _ATTACH(Z_MIN_PROBE_PIN);
 | 
					    _ATTACH(Z_MIN_PROBE_PIN);
 | 
				
			||||||
  #elif HAS_I_MAX
 | 
					  #endif
 | 
				
			||||||
 | 
					  #if HAS_I_MAX
 | 
				
			||||||
    #if !AVAILABLE_EILINE(I_MAX_PIN)
 | 
					    #if !AVAILABLE_EILINE(I_MAX_PIN)
 | 
				
			||||||
      #error "I_MAX_PIN has no EXTINT line available."
 | 
					      #error "I_MAX_PIN has no EXTINT line available."
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
    attachInterrupt(I_MAX_PIN, endstop_ISR, CHANGE);
 | 
					    attachInterrupt(I_MAX_PIN, endstop_ISR, CHANGE);
 | 
				
			||||||
  #elif HAS_I_MIN
 | 
					  #endif
 | 
				
			||||||
 | 
					  #if HAS_I_MIN
 | 
				
			||||||
    #if !AVAILABLE_EILINE(I_MIN_PIN)
 | 
					    #if !AVAILABLE_EILINE(I_MIN_PIN)
 | 
				
			||||||
      #error "I_MIN_PIN has no EXTINT line available."
 | 
					      #error "I_MIN_PIN has no EXTINT line available."
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
@@ -178,7 +180,8 @@ void setup_endstop_interrupts() {
 | 
				
			|||||||
      #error "J_MAX_PIN has no EXTINT line available."
 | 
					      #error "J_MAX_PIN has no EXTINT line available."
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
    attachInterrupt(J_MAX_PIN, endstop_ISR, CHANGE);
 | 
					    attachInterrupt(J_MAX_PIN, endstop_ISR, CHANGE);
 | 
				
			||||||
  #elif HAS_J_MIN
 | 
					  #endif
 | 
				
			||||||
 | 
					  #if HAS_J_MIN
 | 
				
			||||||
    #if !AVAILABLE_EILINE(J_MIN_PIN)
 | 
					    #if !AVAILABLE_EILINE(J_MIN_PIN)
 | 
				
			||||||
      #error "J_MIN_PIN has no EXTINT line available."
 | 
					      #error "J_MIN_PIN has no EXTINT line available."
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
@@ -189,7 +192,8 @@ void setup_endstop_interrupts() {
 | 
				
			|||||||
      #error "K_MAX_PIN has no EXTINT line available."
 | 
					      #error "K_MAX_PIN has no EXTINT line available."
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
    attachInterrupt(K_MAX_PIN, endstop_ISR, CHANGE);
 | 
					    attachInterrupt(K_MAX_PIN, endstop_ISR, CHANGE);
 | 
				
			||||||
  #elif HAS_K_MIN
 | 
					  #endif
 | 
				
			||||||
 | 
					  #if HAS_K_MIN
 | 
				
			||||||
    #if !AVAILABLE_EILINE(K_MIN_PIN)
 | 
					    #if !AVAILABLE_EILINE(K_MIN_PIN)
 | 
				
			||||||
      #error "K_MIN_PIN has no EXTINT line available."
 | 
					      #error "K_MIN_PIN has no EXTINT line available."
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,32 +33,32 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define _AXIS(A) (A##_AXIS)
 | 
					#define _AXIS(A) (A##_AXIS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _XMIN_   100
 | 
					#define _XMIN_   0x11
 | 
				
			||||||
#define _YMIN_   200
 | 
					#define _YMIN_   0x12
 | 
				
			||||||
#define _ZMIN_   300
 | 
					#define _ZMIN_   0x13
 | 
				
			||||||
#define _IMIN_   500
 | 
					#define _IMIN_   0x14
 | 
				
			||||||
#define _JMIN_   600
 | 
					#define _JMIN_   0x15
 | 
				
			||||||
#define _KMIN_   700
 | 
					#define _KMIN_   0x16
 | 
				
			||||||
#define _XMAX_   101
 | 
					#define _XMAX_   0x21
 | 
				
			||||||
#define _YMAX_   201
 | 
					#define _YMAX_   0x22
 | 
				
			||||||
#define _ZMAX_   301
 | 
					#define _ZMAX_   0x23
 | 
				
			||||||
#define _IMAX_   501
 | 
					#define _IMAX_   0x24
 | 
				
			||||||
#define _JMAX_   601
 | 
					#define _JMAX_   0x25
 | 
				
			||||||
#define _KMAX_   701
 | 
					#define _KMAX_   0x26
 | 
				
			||||||
#define _XDIAG_  102
 | 
					#define _XDIAG_  0x31
 | 
				
			||||||
#define _YDIAG_  202
 | 
					#define _YDIAG_  0x32
 | 
				
			||||||
#define _ZDIAG_  302
 | 
					#define _ZDIAG_  0x33
 | 
				
			||||||
#define _IDIAG_  502
 | 
					#define _IDIAG_  0x34
 | 
				
			||||||
#define _JDIAG_  602
 | 
					#define _JDIAG_  0x35
 | 
				
			||||||
#define _KDIAG_  702
 | 
					#define _KDIAG_  0x36
 | 
				
			||||||
#define _E0DIAG_ 400
 | 
					#define _E0DIAG_ 0xE0
 | 
				
			||||||
#define _E1DIAG_ 401
 | 
					#define _E1DIAG_ 0xE1
 | 
				
			||||||
#define _E2DIAG_ 402
 | 
					#define _E2DIAG_ 0xE2
 | 
				
			||||||
#define _E3DIAG_ 403
 | 
					#define _E3DIAG_ 0xE3
 | 
				
			||||||
#define _E4DIAG_ 404
 | 
					#define _E4DIAG_ 0xE4
 | 
				
			||||||
#define _E5DIAG_ 405
 | 
					#define _E5DIAG_ 0xE5
 | 
				
			||||||
#define _E6DIAG_ 406
 | 
					#define _E6DIAG_ 0xE6
 | 
				
			||||||
#define _E7DIAG_ 407
 | 
					#define _E7DIAG_ 0xE7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _FORCE_INLINE_ __attribute__((__always_inline__)) __inline__
 | 
					#define _FORCE_INLINE_ __attribute__((__always_inline__)) __inline__
 | 
				
			||||||
#define  FORCE_INLINE  __attribute__((always_inline)) inline
 | 
					#define  FORCE_INLINE  __attribute__((always_inline)) inline
 | 
				
			||||||
@@ -251,6 +251,8 @@
 | 
				
			|||||||
    memcpy(&a[0],&b[0],_MIN(sizeof(a),sizeof(b))); \
 | 
					    memcpy(&a[0],&b[0],_MIN(sizeof(a),sizeof(b))); \
 | 
				
			||||||
  }while(0)
 | 
					  }while(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CODE_11( A,B,C,D,E,F,G,H,I,J,K,...) A; B; C; D; E; F; G; H; I; J; K
 | 
				
			||||||
 | 
					#define CODE_10( A,B,C,D,E,F,G,H,I,J,...) A; B; C; D; E; F; G; H; I; J
 | 
				
			||||||
#define CODE_9( A,B,C,D,E,F,G,H,I,...) A; B; C; D; E; F; G; H; I
 | 
					#define CODE_9( A,B,C,D,E,F,G,H,I,...) A; B; C; D; E; F; G; H; I
 | 
				
			||||||
#define CODE_8( A,B,C,D,E,F,G,H,...) A; B; C; D; E; F; G; H
 | 
					#define CODE_8( A,B,C,D,E,F,G,H,...) A; B; C; D; E; F; G; H
 | 
				
			||||||
#define CODE_7( A,B,C,D,E,F,G,...) A; B; C; D; E; F; G
 | 
					#define CODE_7( A,B,C,D,E,F,G,...) A; B; C; D; E; F; G
 | 
				
			||||||
@@ -286,6 +288,10 @@
 | 
				
			|||||||
#define GANG_N_1(N,K) _GANG_N(N,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K)
 | 
					#define GANG_N_1(N,K) _GANG_N(N,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Macros for initializing arrays
 | 
					// Macros for initializing arrays
 | 
				
			||||||
 | 
					#define LIST_20(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T
 | 
				
			||||||
 | 
					#define LIST_19(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S
 | 
				
			||||||
 | 
					#define LIST_18(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R
 | 
				
			||||||
 | 
					#define LIST_17(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q
 | 
				
			||||||
#define LIST_16(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P
 | 
					#define LIST_16(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P
 | 
				
			||||||
#define LIST_15(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O
 | 
					#define LIST_15(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O
 | 
				
			||||||
#define LIST_14(A,B,C,D,E,F,G,H,I,J,K,L,M,N,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N
 | 
					#define LIST_14(A,B,C,D,E,F,G,H,I,J,K,L,M,N,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N
 | 
				
			||||||
@@ -502,6 +508,11 @@
 | 
				
			|||||||
#define INC_13 14
 | 
					#define INC_13 14
 | 
				
			||||||
#define INC_14 15
 | 
					#define INC_14 15
 | 
				
			||||||
#define INC_15 16
 | 
					#define INC_15 16
 | 
				
			||||||
 | 
					#define INC_16 17
 | 
				
			||||||
 | 
					#define INC_17 18
 | 
				
			||||||
 | 
					#define INC_18 19
 | 
				
			||||||
 | 
					#define INC_19 20
 | 
				
			||||||
 | 
					#define INC_20 21
 | 
				
			||||||
#define INCREMENT_(n) INC_##n
 | 
					#define INCREMENT_(n) INC_##n
 | 
				
			||||||
#define INCREMENT(n) INCREMENT_(n)
 | 
					#define INCREMENT(n) INCREMENT_(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,9 +60,9 @@ Backlash backlash;
 | 
				
			|||||||
 * spread over multiple segments, smoothing out artifacts even more.
 | 
					 * spread over multiple segments, smoothing out artifacts even more.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const uint8_t dm, block_t * const block) {
 | 
					void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const axis_bits_t dm, block_t * const block) {
 | 
				
			||||||
  static uint8_t last_direction_bits;
 | 
					  static axis_bits_t last_direction_bits;
 | 
				
			||||||
  uint8_t changed_dir = last_direction_bits ^ dm;
 | 
					  axis_bits_t changed_dir = last_direction_bits ^ dm;
 | 
				
			||||||
  // Ignore direction change unless steps are taken in that direction
 | 
					  // Ignore direction change unless steps are taken in that direction
 | 
				
			||||||
  #if DISABLED(CORE_BACKLASH) || ENABLED(MARKFORGED_XY)
 | 
					  #if DISABLED(CORE_BACKLASH) || ENABLED(MARKFORGED_XY)
 | 
				
			||||||
    if (!da) CBI(changed_dir, X_AXIS);
 | 
					    if (!da) CBI(changed_dir, X_AXIS);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,7 +71,7 @@ public:
 | 
				
			|||||||
    return has_measurement(X_AXIS) || has_measurement(Y_AXIS) || has_measurement(Z_AXIS);
 | 
					    return has_measurement(X_AXIS) || has_measurement(Y_AXIS) || has_measurement(Z_AXIS);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const uint8_t dm, block_t * const block);
 | 
					  void add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const axis_bits_t dm, block_t * const block);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern Backlash backlash;
 | 
					extern Backlash backlash;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -141,9 +141,9 @@ void GcodeSuite::M217_report(const bool forReplay/*=true*/) {
 | 
				
			|||||||
                      SP_E_STR, LINEAR_UNIT(toolchange_settings.extra_prime),
 | 
					                      SP_E_STR, LINEAR_UNIT(toolchange_settings.extra_prime),
 | 
				
			||||||
                      SP_P_STR, LINEAR_UNIT(toolchange_settings.prime_speed));
 | 
					                      SP_P_STR, LINEAR_UNIT(toolchange_settings.prime_speed));
 | 
				
			||||||
    SERIAL_ECHOPGM(" R", LINEAR_UNIT(toolchange_settings.retract_speed),
 | 
					    SERIAL_ECHOPGM(" R", LINEAR_UNIT(toolchange_settings.retract_speed),
 | 
				
			||||||
                    " U", LINEAR_UNIT(toolchange_settings.unretract_speed),
 | 
					                   " U", LINEAR_UNIT(toolchange_settings.unretract_speed),
 | 
				
			||||||
                    " F", toolchange_settings.fan_speed,
 | 
					                   " F", toolchange_settings.fan_speed,
 | 
				
			||||||
                    " G", toolchange_settings.fan_time);
 | 
					                   " G", toolchange_settings.fan_time);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE)
 | 
					    #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE)
 | 
				
			||||||
      SERIAL_ECHOPGM(" A", migration.automode);
 | 
					      SERIAL_ECHOPGM(" A", migration.automode);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -206,7 +206,8 @@ void GcodeSuite::M906_report(const bool forReplay/*=true*/) {
 | 
				
			|||||||
    SERIAL_ECHOPGM("  M906");
 | 
					    SERIAL_ECHOPGM("  M906");
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z)
 | 
					  #if  AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) \
 | 
				
			||||||
 | 
					    || AXIS_IS_TMC(I) || AXIS_IS_TMC(J) || AXIS_IS_TMC(K)
 | 
				
			||||||
    say_M906(forReplay);
 | 
					    say_M906(forReplay);
 | 
				
			||||||
    #if AXIS_IS_TMC(X)
 | 
					    #if AXIS_IS_TMC(X)
 | 
				
			||||||
      SERIAL_ECHOPGM_P(SP_X_STR, stepperX.getMilliamps());
 | 
					      SERIAL_ECHOPGM_P(SP_X_STR, stepperX.getMilliamps());
 | 
				
			||||||
@@ -217,6 +218,15 @@ void GcodeSuite::M906_report(const bool forReplay/*=true*/) {
 | 
				
			|||||||
    #if AXIS_IS_TMC(Z)
 | 
					    #if AXIS_IS_TMC(Z)
 | 
				
			||||||
      SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.getMilliamps());
 | 
					      SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.getMilliamps());
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
 | 
					    #if AXIS_IS_TMC(I)
 | 
				
			||||||
 | 
					      SERIAL_ECHOPGM_P(SP_I_STR, stepperI.getMilliamps());
 | 
				
			||||||
 | 
					    #endif
 | 
				
			||||||
 | 
					    #if AXIS_IS_TMC(J)
 | 
				
			||||||
 | 
					      SERIAL_ECHOPGM_P(SP_J_STR, stepperJ.getMilliamps());
 | 
				
			||||||
 | 
					    #endif
 | 
				
			||||||
 | 
					    #if AXIS_IS_TMC(K)
 | 
				
			||||||
 | 
					      SERIAL_ECHOPGM_P(SP_K_STR, stepperK.getMilliamps());
 | 
				
			||||||
 | 
					    #endif
 | 
				
			||||||
    SERIAL_EOL();
 | 
					    SERIAL_EOL();
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -239,25 +249,11 @@ void GcodeSuite::M906_report(const bool forReplay/*=true*/) {
 | 
				
			|||||||
    say_M906(forReplay);
 | 
					    say_M906(forReplay);
 | 
				
			||||||
    SERIAL_ECHOLNPGM(" I2 Z", stepperZ3.getMilliamps());
 | 
					    SERIAL_ECHOLNPGM(" I2 Z", stepperZ3.getMilliamps());
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
 | 
					 | 
				
			||||||
  #if AXIS_IS_TMC(Z4)
 | 
					  #if AXIS_IS_TMC(Z4)
 | 
				
			||||||
    say_M906(forReplay);
 | 
					    say_M906(forReplay);
 | 
				
			||||||
    SERIAL_ECHOLNPGM(" I3 Z", stepperZ4.getMilliamps());
 | 
					    SERIAL_ECHOLNPGM(" I3 Z", stepperZ4.getMilliamps());
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  #if AXIS_IS_TMC(I)
 | 
					 | 
				
			||||||
    say_M906(forReplay);
 | 
					 | 
				
			||||||
    SERIAL_ECHOLNPGM_P(SP_I_STR, stepperI.getMilliamps());
 | 
					 | 
				
			||||||
  #endif
 | 
					 | 
				
			||||||
  #if AXIS_IS_TMC(J)
 | 
					 | 
				
			||||||
    say_M906(forReplay);
 | 
					 | 
				
			||||||
    SERIAL_ECHOLNPGM_P(SP_J_STR, stepperJ.getMilliamps());
 | 
					 | 
				
			||||||
  #endif
 | 
					 | 
				
			||||||
  #if AXIS_IS_TMC(K)
 | 
					 | 
				
			||||||
    say_M906(forReplay);
 | 
					 | 
				
			||||||
    SERIAL_ECHOLNPGM_P(SP_K_STR, stepperK.getMilliamps());
 | 
					 | 
				
			||||||
  #endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  #if AXIS_IS_TMC(E0)
 | 
					  #if AXIS_IS_TMC(E0)
 | 
				
			||||||
    say_M906(forReplay);
 | 
					    say_M906(forReplay);
 | 
				
			||||||
    SERIAL_ECHOLNPGM(" T0 E", stepperE0.getMilliamps());
 | 
					    SERIAL_ECHOLNPGM(" T0 E", stepperE0.getMilliamps());
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,7 +74,7 @@ millis_t GcodeSuite::previous_move_ms = 0,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Relative motion mode for each logical axis
 | 
					// Relative motion mode for each logical axis
 | 
				
			||||||
static constexpr xyze_bool_t ar_init = AXIS_RELATIVE_MODES;
 | 
					static constexpr xyze_bool_t ar_init = AXIS_RELATIVE_MODES;
 | 
				
			||||||
uint8_t GcodeSuite::axis_relative = 0 LOGICAL_AXIS_GANG(
 | 
					axis_bits_t GcodeSuite::axis_relative = 0 LOGICAL_AXIS_GANG(
 | 
				
			||||||
  | (ar_init.e << REL_E),
 | 
					  | (ar_init.e << REL_E),
 | 
				
			||||||
  | (ar_init.x << REL_X),
 | 
					  | (ar_init.x << REL_X),
 | 
				
			||||||
  | (ar_init.y << REL_Y),
 | 
					  | (ar_init.y << REL_Y),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -327,7 +327,7 @@ extern const char G28_STR[];
 | 
				
			|||||||
class GcodeSuite {
 | 
					class GcodeSuite {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static uint8_t axis_relative;
 | 
					  static axis_bits_t axis_relative;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static inline bool axis_is_relative(const AxisEnum a) {
 | 
					  static inline bool axis_is_relative(const AxisEnum a) {
 | 
				
			||||||
    #if HAS_EXTRUDERS
 | 
					    #if HAS_EXTRUDERS
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -260,8 +260,7 @@ void GCodeQueue::RingBuffer::ok_to_send() {
 | 
				
			|||||||
      while (NUMERIC_SIGNED(*p))
 | 
					      while (NUMERIC_SIGNED(*p))
 | 
				
			||||||
        SERIAL_CHAR(*p++);
 | 
					        SERIAL_CHAR(*p++);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    SERIAL_ECHOPGM_P(SP_P_STR, planner.moves_free(),
 | 
					    SERIAL_ECHOPGM_P(SP_P_STR, planner.moves_free(), SP_B_STR, BUFSIZE - length);
 | 
				
			||||||
                      SP_B_STR, BUFSIZE - length);
 | 
					 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
  SERIAL_EOL();
 | 
					  SERIAL_EOL();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1922,20 +1922,14 @@
 | 
				
			|||||||
  #ifndef Z4_INTERPOLATE
 | 
					  #ifndef Z4_INTERPOLATE
 | 
				
			||||||
    #define Z4_INTERPOLATE INTERPOLATE
 | 
					    #define Z4_INTERPOLATE INTERPOLATE
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
  #if LINEAR_AXES >= 4
 | 
					  #if LINEAR_AXES >= 4 && !defined(I_INTERPOLATE)
 | 
				
			||||||
    #ifndef I_INTERPOLATE
 | 
					    #define I_INTERPOLATE INTERPOLATE
 | 
				
			||||||
      #define I_INTERPOLATE INTERPOLATE
 | 
					 | 
				
			||||||
    #endif
 | 
					 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
  #if LINEAR_AXES >= 5
 | 
					  #if LINEAR_AXES >= 5 && !defined(J_INTERPOLATE)
 | 
				
			||||||
    #ifndef J_INTERPOLATE
 | 
					    #define J_INTERPOLATE INTERPOLATE
 | 
				
			||||||
      #define J_INTERPOLATE INTERPOLATE
 | 
					 | 
				
			||||||
    #endif
 | 
					 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
  #if LINEAR_AXES >= 6
 | 
					  #if LINEAR_AXES >= 6 && !defined(K_INTERPOLATE)
 | 
				
			||||||
    #ifndef K_INTERPOLATE
 | 
					    #define K_INTERPOLATE INTERPOLATE
 | 
				
			||||||
      #define K_INTERPOLATE INTERPOLATE
 | 
					 | 
				
			||||||
    #endif
 | 
					 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
  #ifndef E0_INTERPOLATE
 | 
					  #ifndef E0_INTERPOLATE
 | 
				
			||||||
    #define E0_INTERPOLATE INTERPOLATE
 | 
					    #define E0_INTERPOLATE INTERPOLATE
 | 
				
			||||||
@@ -1962,13 +1956,13 @@
 | 
				
			|||||||
    #define E7_INTERPOLATE INTERPOLATE
 | 
					    #define E7_INTERPOLATE INTERPOLATE
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
  #ifndef X_SLAVE_ADDRESS
 | 
					  #ifndef X_SLAVE_ADDRESS
 | 
				
			||||||
    #define X_SLAVE_ADDRESS  0
 | 
					    #define X_SLAVE_ADDRESS 0
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
  #ifndef Y_SLAVE_ADDRESS
 | 
					  #ifndef Y_SLAVE_ADDRESS
 | 
				
			||||||
    #define Y_SLAVE_ADDRESS  0
 | 
					    #define Y_SLAVE_ADDRESS 0
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
  #ifndef Z_SLAVE_ADDRESS
 | 
					  #ifndef Z_SLAVE_ADDRESS
 | 
				
			||||||
    #define Z_SLAVE_ADDRESS  0
 | 
					    #define Z_SLAVE_ADDRESS 0
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
  #ifndef I_SLAVE_ADDRESS
 | 
					  #ifndef I_SLAVE_ADDRESS
 | 
				
			||||||
    #define I_SLAVE_ADDRESS 0
 | 
					    #define I_SLAVE_ADDRESS 0
 | 
				
			||||||
@@ -2660,7 +2654,7 @@
 | 
				
			|||||||
#if HAS_EXTRUDERS && PIN_EXISTS(MOTOR_CURRENT_PWM_E)
 | 
					#if HAS_EXTRUDERS && PIN_EXISTS(MOTOR_CURRENT_PWM_E)
 | 
				
			||||||
  #define HAS_MOTOR_CURRENT_PWM_E 1
 | 
					  #define HAS_MOTOR_CURRENT_PWM_E 1
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if HAS_MOTOR_CURRENT_PWM_E || ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_Z)
 | 
					#if HAS_MOTOR_CURRENT_PWM_E || ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_Z, MOTOR_CURRENT_PWM_I, MOTOR_CURRENT_PWM_J, MOTOR_CURRENT_PWM_K)
 | 
				
			||||||
  #define HAS_MOTOR_CURRENT_PWM 1
 | 
					  #define HAS_MOTOR_CURRENT_PWM 1
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1404,8 +1404,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
 | 
				
			|||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if LINEAR_AXES >= 5
 | 
					#if LINEAR_AXES >= 5
 | 
				
			||||||
  #if AXIS5_NAME == AXIS4_NAME || AXIS5_NAME == AXIS6_NAME
 | 
					  #if AXIS5_NAME == AXIS4_NAME
 | 
				
			||||||
    #error "AXIS5_NAME must be different from AXIS4_NAME and AXIS6_NAME"
 | 
					    #error "AXIS5_NAME must be unique."
 | 
				
			||||||
  #elif AXIS5_NAME != 'A' && AXIS5_NAME != 'B' && AXIS5_NAME != 'C' && AXIS5_NAME != 'U' && AXIS5_NAME != 'V' && AXIS5_NAME != 'W'
 | 
					  #elif AXIS5_NAME != 'A' && AXIS5_NAME != 'B' && AXIS5_NAME != 'C' && AXIS5_NAME != 'U' && AXIS5_NAME != 'V' && AXIS5_NAME != 'W'
 | 
				
			||||||
    #error "AXIS5_NAME can only be one of 'A', 'B', 'C', 'U', 'V', or 'W'."
 | 
					    #error "AXIS5_NAME can only be one of 'A', 'B', 'C', 'U', 'V', or 'W'."
 | 
				
			||||||
  #elif !defined(J_MIN_POS) || !defined(J_MAX_POS)
 | 
					  #elif !defined(J_MIN_POS) || !defined(J_MAX_POS)
 | 
				
			||||||
@@ -1418,7 +1418,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if LINEAR_AXES >= 6
 | 
					#if LINEAR_AXES >= 6
 | 
				
			||||||
  #if AXIS6_NAME == AXIS5_NAME || AXIS6_NAME == AXIS4_NAME
 | 
					  #if AXIS6_NAME == AXIS5_NAME || AXIS6_NAME == AXIS4_NAME
 | 
				
			||||||
    #error "AXIS6_NAME must be different from AXIS5_NAME and AXIS4_NAME."
 | 
					    #error "AXIS6_NAME must be unique."
 | 
				
			||||||
  #elif AXIS6_NAME != 'A' && AXIS6_NAME != 'B' && AXIS6_NAME != 'C' && AXIS6_NAME != 'U' && AXIS6_NAME != 'V' && AXIS6_NAME != 'W'
 | 
					  #elif AXIS6_NAME != 'A' && AXIS6_NAME != 'B' && AXIS6_NAME != 'C' && AXIS6_NAME != 'U' && AXIS6_NAME != 'V' && AXIS6_NAME != 'W'
 | 
				
			||||||
    #error "AXIS6_NAME can only be one of 'A', 'B', 'C', 'U', 'V', or 'W'."
 | 
					    #error "AXIS6_NAME can only be one of 'A', 'B', 'C', 'U', 'V', or 'W'."
 | 
				
			||||||
  #elif !defined(K_MIN_POS) || !defined(K_MAX_POS)
 | 
					  #elif !defined(K_MIN_POS) || !defined(K_MAX_POS)
 | 
				
			||||||
@@ -3040,10 +3040,16 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
 | 
				
			|||||||
      #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_ZMIN (or ENDSTOPPULLUPS) when homing to Z_MIN."
 | 
					      #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_ZMIN (or ENDSTOPPULLUPS) when homing to Z_MIN."
 | 
				
			||||||
    #elif Z_SENSORLESS && Z_HOME_TO_MAX && DISABLED(ENDSTOPPULLUP_ZMAX)
 | 
					    #elif Z_SENSORLESS && Z_HOME_TO_MAX && DISABLED(ENDSTOPPULLUP_ZMAX)
 | 
				
			||||||
      #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_ZMAX (or ENDSTOPPULLUPS) when homing to Z_MAX."
 | 
					      #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_ZMAX (or ENDSTOPPULLUPS) when homing to Z_MAX."
 | 
				
			||||||
 | 
					    #elif LINEAR_AXES >= 4 && I_SENSORLESS && I_HOME_TO_MIN && DISABLED(ENDSTOPPULLUP_IMIN)
 | 
				
			||||||
 | 
					      #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_IMIN (or ENDSTOPPULLUPS) when homing to I_MIN."
 | 
				
			||||||
    #elif LINEAR_AXES >= 4 && I_SENSORLESS && I_HOME_TO_MAX && DISABLED(ENDSTOPPULLUP_IMAX)
 | 
					    #elif LINEAR_AXES >= 4 && I_SENSORLESS && I_HOME_TO_MAX && DISABLED(ENDSTOPPULLUP_IMAX)
 | 
				
			||||||
      #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_IMAX (or ENDSTOPPULLUPS) when homing to I_MAX."
 | 
					      #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_IMAX (or ENDSTOPPULLUPS) when homing to I_MAX."
 | 
				
			||||||
 | 
					    #elif LINEAR_AXES >= 5 && J_SENSORLESS && J_HOME_TO_MIN && DISABLED(ENDSTOPPULLUP_JMIN)
 | 
				
			||||||
 | 
					      #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_JMIN (or ENDSTOPPULLUPS) when homing to J_MIN."
 | 
				
			||||||
    #elif LINEAR_AXES >= 5 && J_SENSORLESS && J_HOME_TO_MAX && DISABLED(ENDSTOPPULLUP_JMAX)
 | 
					    #elif LINEAR_AXES >= 5 && J_SENSORLESS && J_HOME_TO_MAX && DISABLED(ENDSTOPPULLUP_JMAX)
 | 
				
			||||||
      #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_JMAX (or ENDSTOPPULLUPS) when homing to J_MAX."
 | 
					      #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_JMAX (or ENDSTOPPULLUPS) when homing to J_MAX."
 | 
				
			||||||
 | 
					    #elif LINEAR_AXES >= 6 && K_SENSORLESS && K_HOME_TO_MIN && DISABLED(ENDSTOPPULLUP_KMIN)
 | 
				
			||||||
 | 
					      #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_KMIN (or ENDSTOPPULLUPS) when homing to K_MIN."
 | 
				
			||||||
    #elif LINEAR_AXES >= 6 && K_SENSORLESS && K_HOME_TO_MAX && DISABLED(ENDSTOPPULLUP_KMAX)
 | 
					    #elif LINEAR_AXES >= 6 && K_SENSORLESS && K_HOME_TO_MAX && DISABLED(ENDSTOPPULLUP_KMAX)
 | 
				
			||||||
      #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_KMAX (or ENDSTOPPULLUPS) when homing to K_MAX."
 | 
					      #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_KMAX (or ENDSTOPPULLUPS) when homing to K_MAX."
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -423,6 +423,12 @@ namespace ExtUI {
 | 
				
			|||||||
        #if AXIS_IS_TMC(Z2)
 | 
					        #if AXIS_IS_TMC(Z2)
 | 
				
			||||||
          case Z2: return stepperZ2.getMilliamps();
 | 
					          case Z2: return stepperZ2.getMilliamps();
 | 
				
			||||||
        #endif
 | 
					        #endif
 | 
				
			||||||
 | 
					        #if AXIS_IS_TMC(Z3)
 | 
				
			||||||
 | 
					          case Z3: return stepperZ3.getMilliamps();
 | 
				
			||||||
 | 
					        #endif
 | 
				
			||||||
 | 
					        #if AXIS_IS_TMC(Z4)
 | 
				
			||||||
 | 
					          case Z4: return stepperZ4.getMilliamps();
 | 
				
			||||||
 | 
					        #endif
 | 
				
			||||||
        default: return NAN;
 | 
					        default: return NAN;
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -486,6 +492,12 @@ namespace ExtUI {
 | 
				
			|||||||
        #if AXIS_IS_TMC(Z2)
 | 
					        #if AXIS_IS_TMC(Z2)
 | 
				
			||||||
          case Z2: stepperZ2.rms_current(constrain(mA, 400, 1500)); break;
 | 
					          case Z2: stepperZ2.rms_current(constrain(mA, 400, 1500)); break;
 | 
				
			||||||
        #endif
 | 
					        #endif
 | 
				
			||||||
 | 
					        #if AXIS_IS_TMC(Z3)
 | 
				
			||||||
 | 
					          case Z3: stepperZ3.rms_current(constrain(mA, 400, 1500)); break;
 | 
				
			||||||
 | 
					        #endif
 | 
				
			||||||
 | 
					        #if AXIS_IS_TMC(Z4)
 | 
				
			||||||
 | 
					          case Z4: stepperZ4.rms_current(constrain(mA, 400, 1500)); break;
 | 
				
			||||||
 | 
					        #endif
 | 
				
			||||||
        default: break;
 | 
					        default: break;
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1310,7 +1310,7 @@ void Planner::recalculate() {
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
void Planner::check_axes_activity() {
 | 
					void Planner::check_axes_activity() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  #if ANY(DISABLE_X, DISABLE_Y, DISABLE_Z , DISABLE_I , DISABLE_J , DISABLE_K, DISABLE_E)
 | 
					  #if ANY(DISABLE_X, DISABLE_Y, DISABLE_Z, DISABLE_I, DISABLE_J, DISABLE_K, DISABLE_E)
 | 
				
			||||||
    xyze_bool_t axis_active = { false };
 | 
					    xyze_bool_t axis_active = { false };
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1913,7 +1913,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
 | 
				
			|||||||
  #endif // PREVENT_COLD_EXTRUSION || PREVENT_LENGTHY_EXTRUDE
 | 
					  #endif // PREVENT_COLD_EXTRUSION || PREVENT_LENGTHY_EXTRUDE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Compute direction bit-mask for this block
 | 
					  // Compute direction bit-mask for this block
 | 
				
			||||||
  uint8_t dm = 0;
 | 
					  axis_bits_t dm = 0;
 | 
				
			||||||
  #if CORE_IS_XY
 | 
					  #if CORE_IS_XY
 | 
				
			||||||
    if (da < 0) SBI(dm, X_HEAD);                // Save the toolhead's true direction in X
 | 
					    if (da < 0) SBI(dm, X_HEAD);                // Save the toolhead's true direction in X
 | 
				
			||||||
    if (db < 0) SBI(dm, Y_HEAD);                // ...and Y
 | 
					    if (db < 0) SBI(dm, Y_HEAD);                // ...and Y
 | 
				
			||||||
@@ -2345,11 +2345,11 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  #ifdef XY_FREQUENCY_LIMIT
 | 
					  #ifdef XY_FREQUENCY_LIMIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static uint8_t old_direction_bits; // = 0
 | 
					    static axis_bits_t old_direction_bits; // = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (xy_freq_limit_hz) {
 | 
					    if (xy_freq_limit_hz) {
 | 
				
			||||||
      // Check and limit the xy direction change frequency
 | 
					      // Check and limit the xy direction change frequency
 | 
				
			||||||
      const uint8_t direction_change = block->direction_bits ^ old_direction_bits;
 | 
					      const axis_bits_t direction_change = block->direction_bits ^ old_direction_bits;
 | 
				
			||||||
      old_direction_bits = block->direction_bits;
 | 
					      old_direction_bits = block->direction_bits;
 | 
				
			||||||
      segment_time_us = LROUND(float(segment_time_us) / speed_factor);
 | 
					      segment_time_us = LROUND(float(segment_time_us) / speed_factor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -202,7 +202,7 @@ typedef struct block_t {
 | 
				
			|||||||
    uint32_t acceleration_rate;             // The acceleration rate used for acceleration calculation
 | 
					    uint32_t acceleration_rate;             // The acceleration rate used for acceleration calculation
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  uint8_t direction_bits;                   // The direction bit set for this block (refers to *_DIRECTION_BIT in config.h)
 | 
					  axis_bits_t direction_bits;               // The direction bit set for this block (refers to *_DIRECTION_BIT in config.h)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Advance extrusion
 | 
					  // Advance extrusion
 | 
				
			||||||
  #if ENABLED(LIN_ADVANCE)
 | 
					  #if ENABLED(LIN_ADVANCE)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -149,8 +149,8 @@ Stepper stepper; // Singleton
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
block_t* Stepper::current_block; // (= nullptr) A pointer to the block currently being traced
 | 
					block_t* Stepper::current_block; // (= nullptr) A pointer to the block currently being traced
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint8_t Stepper::last_direction_bits, // = 0
 | 
					axis_bits_t Stepper::last_direction_bits, // = 0
 | 
				
			||||||
        Stepper::axis_did_move; // = 0
 | 
					            Stepper::axis_did_move; // = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool Stepper::abort_current_block;
 | 
					bool Stepper::abort_current_block;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -503,17 +503,14 @@ void Stepper::set_directions() {
 | 
				
			|||||||
  #if HAS_Z_DIR
 | 
					  #if HAS_Z_DIR
 | 
				
			||||||
    SET_STEP_DIR(Z); // C
 | 
					    SET_STEP_DIR(Z); // C
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
 | 
					 | 
				
			||||||
  #if HAS_I_DIR
 | 
					  #if HAS_I_DIR
 | 
				
			||||||
    SET_STEP_DIR(I); // I
 | 
					    SET_STEP_DIR(I);
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
 | 
					 | 
				
			||||||
  #if HAS_J_DIR
 | 
					  #if HAS_J_DIR
 | 
				
			||||||
    SET_STEP_DIR(J); // J
 | 
					    SET_STEP_DIR(J);
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
 | 
					 | 
				
			||||||
  #if HAS_K_DIR
 | 
					  #if HAS_K_DIR
 | 
				
			||||||
    SET_STEP_DIR(K); // K
 | 
					    SET_STEP_DIR(K);
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  #if DISABLED(LIN_ADVANCE)
 | 
					  #if DISABLED(LIN_ADVANCE)
 | 
				
			||||||
@@ -1635,7 +1632,7 @@ void Stepper::pulse_phase_isr() {
 | 
				
			|||||||
            case 0: {
 | 
					            case 0: {
 | 
				
			||||||
              const uint8_t low = page_step_state.page[page_step_state.segment_idx],
 | 
					              const uint8_t low = page_step_state.page[page_step_state.segment_idx],
 | 
				
			||||||
                           high = page_step_state.page[page_step_state.segment_idx + 1];
 | 
					                           high = page_step_state.page[page_step_state.segment_idx + 1];
 | 
				
			||||||
              uint8_t dm = last_direction_bits;
 | 
					              axis_bits_t dm = last_direction_bits;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
              PAGE_SEGMENT_UPDATE(X, low >> 4);
 | 
					              PAGE_SEGMENT_UPDATE(X, low >> 4);
 | 
				
			||||||
              PAGE_SEGMENT_UPDATE(Y, low & 0xF);
 | 
					              PAGE_SEGMENT_UPDATE(Y, low & 0xF);
 | 
				
			||||||
@@ -2156,7 +2153,7 @@ uint32_t Stepper::block_phase_isr() {
 | 
				
			|||||||
        #define Z_MOVE_TEST !!current_block->steps.c
 | 
					        #define Z_MOVE_TEST !!current_block->steps.c
 | 
				
			||||||
      #endif
 | 
					      #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      uint8_t axis_bits = 0;
 | 
					      axis_bits_t axis_bits = 0;
 | 
				
			||||||
      LINEAR_AXIS_CODE(
 | 
					      LINEAR_AXIS_CODE(
 | 
				
			||||||
        if (X_MOVE_TEST)            SBI(axis_bits, A_AXIS),
 | 
					        if (X_MOVE_TEST)            SBI(axis_bits, A_AXIS),
 | 
				
			||||||
        if (Y_MOVE_TEST)            SBI(axis_bits, B_AXIS),
 | 
					        if (Y_MOVE_TEST)            SBI(axis_bits, B_AXIS),
 | 
				
			||||||
@@ -3003,16 +3000,15 @@ void Stepper::report_positions() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
          const bool z_direction = direction ^ BABYSTEP_INVERT_Z;
 | 
					          const bool z_direction = direction ^ BABYSTEP_INVERT_Z;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          ENABLE_AXIS_X();
 | 
					          ENABLE_AXIS_X(); ENABLE_AXIS_Y(); ENABLE_AXIS_Z();
 | 
				
			||||||
          ENABLE_AXIS_Y();
 | 
					          ENABLE_AXIS_I(); ENABLE_AXIS_J(); ENABLE_AXIS_K();
 | 
				
			||||||
          ENABLE_AXIS_Z();
 | 
					 | 
				
			||||||
          ENABLE_AXIS_I();
 | 
					 | 
				
			||||||
          ENABLE_AXIS_J();
 | 
					 | 
				
			||||||
          ENABLE_AXIS_K();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
          DIR_WAIT_BEFORE();
 | 
					          DIR_WAIT_BEFORE();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          const xyz_byte_t old_dir = LINEAR_AXIS_ARRAY(X_DIR_READ(), Y_DIR_READ(), Z_DIR_READ(), I_DIR_READ(), J_DIR_READ(), K_DIR_READ());
 | 
					          const xyz_byte_t old_dir = LINEAR_AXIS_ARRAY(
 | 
				
			||||||
 | 
					            X_DIR_READ(), Y_DIR_READ(), Z_DIR_READ(),
 | 
				
			||||||
 | 
					            I_DIR_READ(), J_DIR_READ(), K_DIR_READ()
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          X_DIR_WRITE(INVERT_X_DIR ^ z_direction);
 | 
					          X_DIR_WRITE(INVERT_X_DIR ^ z_direction);
 | 
				
			||||||
          #ifdef Y_DIR_WRITE
 | 
					          #ifdef Y_DIR_WRITE
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -276,8 +276,8 @@ class Stepper {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    static block_t* current_block;          // A pointer to the block currently being traced
 | 
					    static block_t* current_block;          // A pointer to the block currently being traced
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static uint8_t last_direction_bits,     // The next stepping-bits to be output
 | 
					    static axis_bits_t last_direction_bits, // The next stepping-bits to be output
 | 
				
			||||||
                   axis_did_move;           // Last Movement in the given direction is not null, as computed when the last movement was fetched from planner
 | 
					                       axis_did_move;       // Last Movement in the given direction is not null, as computed when the last movement was fetched from planner
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static bool abort_current_block;        // Signals to the stepper that current block should be aborted
 | 
					    static bool abort_current_block;        // Signals to the stepper that current block should be aborted
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -523,7 +523,7 @@ class Stepper {
 | 
				
			|||||||
    static void set_directions();
 | 
					    static void set_directions();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Set direction bits and update all stepper DIR states
 | 
					    // Set direction bits and update all stepper DIR states
 | 
				
			||||||
    static void set_directions(const uint8_t bits) {
 | 
					    static void set_directions(const axis_bits_t bits) {
 | 
				
			||||||
      last_direction_bits = bits;
 | 
					      last_direction_bits = bits;
 | 
				
			||||||
      set_directions();
 | 
					      set_directions();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -896,21 +896,21 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if LINEAR_AXES >= 4
 | 
					#if LINEAR_AXES >= 4
 | 
				
			||||||
  #define  ENABLE_AXIS_I() if (SHOULD_ENABLE(i))  {  ENABLE_STEPPER_I();  AFTER_CHANGE(i, true); }
 | 
					  #define  ENABLE_AXIS_I() if (SHOULD_ENABLE(i))  {  ENABLE_STEPPER_I(); AFTER_CHANGE(i, true); }
 | 
				
			||||||
  #define DISABLE_AXIS_I() if (SHOULD_DISABLE(i)) { DISABLE_STEPPER_I(); AFTER_CHANGE(i, false); set_axis_untrusted(I_AXIS); }
 | 
					  #define DISABLE_AXIS_I() if (SHOULD_DISABLE(i)) { DISABLE_STEPPER_I(); AFTER_CHANGE(i, false); set_axis_untrusted(I_AXIS); }
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  #define  ENABLE_AXIS_I() NOOP
 | 
					  #define  ENABLE_AXIS_I() NOOP
 | 
				
			||||||
  #define DISABLE_AXIS_I() NOOP
 | 
					  #define DISABLE_AXIS_I() NOOP
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if LINEAR_AXES >= 5
 | 
					#if LINEAR_AXES >= 5
 | 
				
			||||||
  #define  ENABLE_AXIS_J() if (SHOULD_ENABLE(j))  {  ENABLE_STEPPER_J();  AFTER_CHANGE(j, true); }
 | 
					  #define  ENABLE_AXIS_J() if (SHOULD_ENABLE(j))  {  ENABLE_STEPPER_J(); AFTER_CHANGE(j, true); }
 | 
				
			||||||
  #define DISABLE_AXIS_J() if (SHOULD_DISABLE(j)) { DISABLE_STEPPER_J(); AFTER_CHANGE(j, false); set_axis_untrusted(J_AXIS); }
 | 
					  #define DISABLE_AXIS_J() if (SHOULD_DISABLE(j)) { DISABLE_STEPPER_J(); AFTER_CHANGE(j, false); set_axis_untrusted(J_AXIS); }
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  #define  ENABLE_AXIS_J() NOOP
 | 
					  #define  ENABLE_AXIS_J() NOOP
 | 
				
			||||||
  #define DISABLE_AXIS_J() NOOP
 | 
					  #define DISABLE_AXIS_J() NOOP
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if LINEAR_AXES >= 6
 | 
					#if LINEAR_AXES >= 6
 | 
				
			||||||
  #define  ENABLE_AXIS_K() if (SHOULD_ENABLE(k))  {  ENABLE_STEPPER_K();  AFTER_CHANGE(k, true); }
 | 
					  #define  ENABLE_AXIS_K() if (SHOULD_ENABLE(k))  {  ENABLE_STEPPER_K(); AFTER_CHANGE(k, true); }
 | 
				
			||||||
  #define DISABLE_AXIS_K() if (SHOULD_DISABLE(k)) { DISABLE_STEPPER_K(); AFTER_CHANGE(k, false); set_axis_untrusted(K_AXIS); }
 | 
					  #define DISABLE_AXIS_K() if (SHOULD_DISABLE(k)) { DISABLE_STEPPER_K(); AFTER_CHANGE(k, false); set_axis_untrusted(K_AXIS); }
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  #define  ENABLE_AXIS_K() NOOP
 | 
					  #define  ENABLE_AXIS_K() NOOP
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -164,6 +164,15 @@ enum StealthIndex : uint8_t {
 | 
				
			|||||||
#ifndef TMC_Z4_BAUD_RATE
 | 
					#ifndef TMC_Z4_BAUD_RATE
 | 
				
			||||||
  #define TMC_Z4_BAUD_RATE TMC_BAUD_RATE
 | 
					  #define TMC_Z4_BAUD_RATE TMC_BAUD_RATE
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef TMC_I_BAUD_RATE
 | 
				
			||||||
 | 
					  #define TMC_I_BAUD_RATE TMC_BAUD_RATE
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef TMC_J_BAUD_RATE
 | 
				
			||||||
 | 
					  #define TMC_J_BAUD_RATE TMC_BAUD_RATE
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifndef TMC_K_BAUD_RATE
 | 
				
			||||||
 | 
					  #define TMC_K_BAUD_RATE TMC_BAUD_RATE
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
#ifndef TMC_E0_BAUD_RATE
 | 
					#ifndef TMC_E0_BAUD_RATE
 | 
				
			||||||
  #define TMC_E0_BAUD_RATE TMC_BAUD_RATE
 | 
					  #define TMC_E0_BAUD_RATE TMC_BAUD_RATE
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@@ -834,12 +843,8 @@ void restore_trinamic_drivers() {
 | 
				
			|||||||
void reset_trinamic_drivers() {
 | 
					void reset_trinamic_drivers() {
 | 
				
			||||||
  static constexpr bool stealthchop_by_axis[] = LOGICAL_AXIS_ARRAY(
 | 
					  static constexpr bool stealthchop_by_axis[] = LOGICAL_AXIS_ARRAY(
 | 
				
			||||||
    ENABLED(STEALTHCHOP_E),
 | 
					    ENABLED(STEALTHCHOP_E),
 | 
				
			||||||
    ENABLED(STEALTHCHOP_XY),
 | 
					    ENABLED(STEALTHCHOP_XY), ENABLED(STEALTHCHOP_XY), ENABLED(STEALTHCHOP_Z),
 | 
				
			||||||
    ENABLED(STEALTHCHOP_XY),
 | 
					    ENABLED(STEALTHCHOP_I), ENABLED(STEALTHCHOP_J), ENABLED(STEALTHCHOP_K)
 | 
				
			||||||
    ENABLED(STEALTHCHOP_Z),
 | 
					 | 
				
			||||||
    ENABLED(STEALTHCHOP_I),
 | 
					 | 
				
			||||||
    ENABLED(STEALTHCHOP_J),
 | 
					 | 
				
			||||||
    ENABLED(STEALTHCHOP_K)
 | 
					 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  #if AXIS_IS_TMC(X)
 | 
					  #if AXIS_IS_TMC(X)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -464,11 +464,19 @@
 | 
				
			|||||||
  #ifdef I_STOP_PIN
 | 
					  #ifdef I_STOP_PIN
 | 
				
			||||||
    #if I_HOME_TO_MIN
 | 
					    #if I_HOME_TO_MIN
 | 
				
			||||||
      #define I_MIN_PIN I_STOP_PIN
 | 
					      #define I_MIN_PIN I_STOP_PIN
 | 
				
			||||||
      #define I_MAX_PIN -1
 | 
					      #ifndef I_MAX_PIN
 | 
				
			||||||
 | 
					        #define I_MAX_PIN -1
 | 
				
			||||||
 | 
					      #endif
 | 
				
			||||||
    #else
 | 
					    #else
 | 
				
			||||||
      #define I_MIN_PIN -1
 | 
					 | 
				
			||||||
      #define I_MAX_PIN I_STOP_PIN
 | 
					      #define I_MAX_PIN I_STOP_PIN
 | 
				
			||||||
 | 
					      #ifndef I_MIN_PIN
 | 
				
			||||||
 | 
					        #define I_MIN_PIN -1
 | 
				
			||||||
 | 
					      #endif
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
 | 
					  #elif I_HOME_TO_MIN
 | 
				
			||||||
 | 
					    #define I_STOP_PIN I_MIN_PIN
 | 
				
			||||||
 | 
					  #else
 | 
				
			||||||
 | 
					    #define I_STOP_PIN I_MAX_PIN
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  #undef I_MIN_PIN
 | 
					  #undef I_MIN_PIN
 | 
				
			||||||
@@ -479,11 +487,19 @@
 | 
				
			|||||||
  #ifdef J_STOP_PIN
 | 
					  #ifdef J_STOP_PIN
 | 
				
			||||||
    #if J_HOME_TO_MIN
 | 
					    #if J_HOME_TO_MIN
 | 
				
			||||||
      #define J_MIN_PIN J_STOP_PIN
 | 
					      #define J_MIN_PIN J_STOP_PIN
 | 
				
			||||||
      #define J_MAX_PIN -1
 | 
					      #ifndef J_MAX_PIN
 | 
				
			||||||
 | 
					        #define J_MAX_PIN -1
 | 
				
			||||||
 | 
					      #endif
 | 
				
			||||||
    #else
 | 
					    #else
 | 
				
			||||||
      #define J_MIN_PIN -1
 | 
					 | 
				
			||||||
      #define J_MAX_PIN J_STOP_PIN
 | 
					      #define J_MAX_PIN J_STOP_PIN
 | 
				
			||||||
 | 
					      #ifndef J_MIN_PIN
 | 
				
			||||||
 | 
					        #define J_MIN_PIN -1
 | 
				
			||||||
 | 
					      #endif
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
 | 
					  #elif J_HOME_TO_MIN
 | 
				
			||||||
 | 
					    #define J_STOP_PIN J_MIN_PIN
 | 
				
			||||||
 | 
					  #else
 | 
				
			||||||
 | 
					    #define J_STOP_PIN J_MAX_PIN
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  #undef J_MIN_PIN
 | 
					  #undef J_MIN_PIN
 | 
				
			||||||
@@ -494,11 +510,19 @@
 | 
				
			|||||||
  #ifdef K_STOP_PIN
 | 
					  #ifdef K_STOP_PIN
 | 
				
			||||||
    #if K_HOME_TO_MIN
 | 
					    #if K_HOME_TO_MIN
 | 
				
			||||||
      #define K_MIN_PIN K_STOP_PIN
 | 
					      #define K_MIN_PIN K_STOP_PIN
 | 
				
			||||||
      #define K_MAX_PIN -1
 | 
					      #ifndef K_MAX_PIN
 | 
				
			||||||
 | 
					        #define K_MAX_PIN -1
 | 
				
			||||||
 | 
					      #endif
 | 
				
			||||||
    #else
 | 
					    #else
 | 
				
			||||||
      #define K_MIN_PIN -1
 | 
					 | 
				
			||||||
      #define K_MAX_PIN K_STOP_PIN
 | 
					      #define K_MAX_PIN K_STOP_PIN
 | 
				
			||||||
 | 
					      #ifndef K_MIN_PIN
 | 
				
			||||||
 | 
					        #define K_MIN_PIN -1
 | 
				
			||||||
 | 
					      #endif
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
 | 
					  #elif K_HOME_TO_MIN
 | 
				
			||||||
 | 
					    #define K_STOP_PIN K_MIN_PIN
 | 
				
			||||||
 | 
					  #else
 | 
				
			||||||
 | 
					    #define K_STOP_PIN K_MAX_PIN
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  #undef K_MIN_PIN
 | 
					  #undef K_MIN_PIN
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user