Code changes supporting up to 6 extruders
This commit is contained in:
		
							parent
							
								
									f5c210d33d
								
							
						
					
					
						commit
						1718eff54a
					
				@ -78,6 +78,8 @@
 | 
			
		||||
      #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN."
 | 
			
		||||
    #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN
 | 
			
		||||
      #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN."
 | 
			
		||||
    #elif PIN_EXISTS(E5_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E5_AUTO_FAN_PIN
 | 
			
		||||
      #error "SPINDLE_LASER_PWM_PIN is used by E5_AUTO_FAN_PIN."
 | 
			
		||||
    #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN
 | 
			
		||||
      #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN."
 | 
			
		||||
    #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN
 | 
			
		||||
 | 
			
		||||
@ -53,6 +53,8 @@
 | 
			
		||||
      #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN."
 | 
			
		||||
    #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN
 | 
			
		||||
      #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN."
 | 
			
		||||
    #elif PIN_EXISTS(E5_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E5_AUTO_FAN_PIN
 | 
			
		||||
      #error "SPINDLE_LASER_PWM_PIN is used by E5_AUTO_FAN_PIN."
 | 
			
		||||
    #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN
 | 
			
		||||
      #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN."
 | 
			
		||||
    #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN
 | 
			
		||||
 | 
			
		||||
@ -290,6 +290,7 @@ void enable_all_steppers() {
 | 
			
		||||
  enable_E2();
 | 
			
		||||
  enable_E3();
 | 
			
		||||
  enable_E4();
 | 
			
		||||
  enable_E5();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void disable_e_steppers() {
 | 
			
		||||
@ -298,6 +299,7 @@ void disable_e_steppers() {
 | 
			
		||||
  disable_E2();
 | 
			
		||||
  disable_E3();
 | 
			
		||||
  disable_E4();
 | 
			
		||||
  disable_E5();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void disable_e_stepper(const uint8_t e) {
 | 
			
		||||
@ -307,6 +309,7 @@ void disable_e_stepper(const uint8_t e) {
 | 
			
		||||
    case 2: disable_E2(); break;
 | 
			
		||||
    case 3: disable_E3(); break;
 | 
			
		||||
    case 4: disable_E4(); break;
 | 
			
		||||
    case 5: disable_E5(); break;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -440,7 +443,7 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) {
 | 
			
		||||
          #if E_STEPPERS > 1
 | 
			
		||||
            case 2: case 3: oldstatus = E1_ENABLE_READ; enable_E1(); break;
 | 
			
		||||
            #if E_STEPPERS > 2
 | 
			
		||||
              case 4: oldstatus = E2_ENABLE_READ; enable_E2(); break;
 | 
			
		||||
              case 4: case 5: oldstatus = E2_ENABLE_READ; enable_E2(); break;
 | 
			
		||||
            #endif // E_STEPPERS > 2
 | 
			
		||||
          #endif // E_STEPPERS > 1
 | 
			
		||||
        }
 | 
			
		||||
@ -456,6 +459,9 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) {
 | 
			
		||||
                case 3: oldstatus = E3_ENABLE_READ; enable_E3(); break;
 | 
			
		||||
                #if E_STEPPERS > 4
 | 
			
		||||
                  case 4: oldstatus = E4_ENABLE_READ; enable_E4(); break;
 | 
			
		||||
                  #if E_STEPPERS > 5
 | 
			
		||||
                    case 5: oldstatus = E5_ENABLE_READ; enable_E5(); break;
 | 
			
		||||
                  #endif // E_STEPPERS > 5
 | 
			
		||||
                #endif // E_STEPPERS > 4
 | 
			
		||||
              #endif // E_STEPPERS > 3
 | 
			
		||||
            #endif // E_STEPPERS > 2
 | 
			
		||||
@ -476,7 +482,7 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) {
 | 
			
		||||
          #if E_STEPPERS > 1
 | 
			
		||||
            case 2: case 3: oldstatus = E1_ENABLE_WRITE(oldstatus); break;
 | 
			
		||||
            #if E_STEPPERS > 2
 | 
			
		||||
              case 4: oldstatus = E2_ENABLE_WRITE(oldstatus); break;
 | 
			
		||||
              case 4: case 5: oldstatus = E2_ENABLE_WRITE(oldstatus); break;
 | 
			
		||||
            #endif // E_STEPPERS > 2
 | 
			
		||||
          #endif // E_STEPPERS > 1
 | 
			
		||||
        }
 | 
			
		||||
@ -491,6 +497,9 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) {
 | 
			
		||||
                case 3: E3_ENABLE_WRITE(oldstatus); break;
 | 
			
		||||
                #if E_STEPPERS > 4
 | 
			
		||||
                  case 4: E4_ENABLE_WRITE(oldstatus); break;
 | 
			
		||||
                  #if E_STEPPERS > 5
 | 
			
		||||
                    case 5: E5_ENABLE_WRITE(oldstatus); break;
 | 
			
		||||
                  #endif // E_STEPPERS > 5
 | 
			
		||||
                #endif // E_STEPPERS > 4
 | 
			
		||||
              #endif // E_STEPPERS > 3
 | 
			
		||||
            #endif // E_STEPPERS > 2
 | 
			
		||||
 | 
			
		||||
@ -83,7 +83,10 @@ void manage_inactivity(const bool ignore_stepper_queue=false);
 | 
			
		||||
  /**
 | 
			
		||||
   * Mixing steppers synchronize their enable (and direction) together
 | 
			
		||||
   */
 | 
			
		||||
  #if MIXING_STEPPERS > 4
 | 
			
		||||
  #if MIXING_STEPPERS > 5
 | 
			
		||||
    #define  enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); E4_ENABLE_WRITE( E_ENABLE_ON); E5_ENABLE_WRITE( E_ENABLE_ON); }
 | 
			
		||||
    #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); E4_ENABLE_WRITE(!E_ENABLE_ON); E5_ENABLE_WRITE(!E_ENABLE_ON); }
 | 
			
		||||
  #elif MIXING_STEPPERS > 4
 | 
			
		||||
    #define  enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); E4_ENABLE_WRITE( E_ENABLE_ON); }
 | 
			
		||||
    #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); E4_ENABLE_WRITE(!E_ENABLE_ON); }
 | 
			
		||||
  #elif MIXING_STEPPERS > 3
 | 
			
		||||
@ -104,6 +107,8 @@ void manage_inactivity(const bool ignore_stepper_queue=false);
 | 
			
		||||
  #define disable_E3() NOOP
 | 
			
		||||
  #define  enable_E4() NOOP
 | 
			
		||||
  #define disable_E4() NOOP
 | 
			
		||||
  #define  enable_E5() NOOP
 | 
			
		||||
  #define disable_E5() NOOP
 | 
			
		||||
 | 
			
		||||
#else // !MIXING_EXTRUDER
 | 
			
		||||
 | 
			
		||||
@ -147,6 +152,14 @@ void manage_inactivity(const bool ignore_stepper_queue=false);
 | 
			
		||||
    #define disable_E4() NOOP
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if E_STEPPERS > 5 && HAS_E5_ENABLE
 | 
			
		||||
    #define  enable_E5() E5_ENABLE_WRITE( E_ENABLE_ON)
 | 
			
		||||
    #define disable_E5() E5_ENABLE_WRITE(!E_ENABLE_ON)
 | 
			
		||||
  #else
 | 
			
		||||
    #define  enable_E5() NOOP
 | 
			
		||||
    #define disable_E5() NOOP
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
#endif // !MIXING_EXTRUDER
 | 
			
		||||
 | 
			
		||||
#if ENABLED(EXPERIMENTAL_I2CBUS)
 | 
			
		||||
 | 
			
		||||
@ -54,6 +54,7 @@
 | 
			
		||||
#define AXIS_DRIVER_TYPE_E2(T) (E_STEPPERS > 2 && _AXIS_DRIVER_TYPE(E2,T))
 | 
			
		||||
#define AXIS_DRIVER_TYPE_E3(T) (E_STEPPERS > 3 && _AXIS_DRIVER_TYPE(E3,T))
 | 
			
		||||
#define AXIS_DRIVER_TYPE_E4(T) (E_STEPPERS > 4 && _AXIS_DRIVER_TYPE(E4,T))
 | 
			
		||||
#define AXIS_DRIVER_TYPE_E5(T) (E_STEPPERS > 5 && _AXIS_DRIVER_TYPE(E5,T))
 | 
			
		||||
 | 
			
		||||
#define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T)
 | 
			
		||||
 | 
			
		||||
@ -62,7 +63,7 @@
 | 
			
		||||
                        AXIS_DRIVER_TYPE_Z(T)  || AXIS_DRIVER_TYPE_Z2(T) || AXIS_DRIVER_TYPE_Z3(T) || \
 | 
			
		||||
                        AXIS_DRIVER_TYPE_E0(T) || AXIS_DRIVER_TYPE_E1(T) || \
 | 
			
		||||
                        AXIS_DRIVER_TYPE_E2(T) || AXIS_DRIVER_TYPE_E3(T) || \
 | 
			
		||||
                        AXIS_DRIVER_TYPE_E4(T) )
 | 
			
		||||
                        AXIS_DRIVER_TYPE_E4(T) || AXIS_DRIVER_TYPE_E5(T) )
 | 
			
		||||
 | 
			
		||||
// Test for supported TMC drivers that require advanced configuration
 | 
			
		||||
// Does not match standalone configurations
 | 
			
		||||
 | 
			
		||||
@ -289,26 +289,31 @@
 | 
			
		||||
#define MSG_H3 "3"
 | 
			
		||||
#define MSG_H4 "4"
 | 
			
		||||
#define MSG_H5 "5"
 | 
			
		||||
#define MSG_H6 "6"
 | 
			
		||||
#define MSG_N1 " 1"
 | 
			
		||||
#define MSG_N2 " 2"
 | 
			
		||||
#define MSG_N3 " 3"
 | 
			
		||||
#define MSG_N4 " 4"
 | 
			
		||||
#define MSG_N5 " 5"
 | 
			
		||||
#define MSG_N6 " 6"
 | 
			
		||||
#define MSG_E1 "E1"
 | 
			
		||||
#define MSG_E2 "E2"
 | 
			
		||||
#define MSG_E3 "E3"
 | 
			
		||||
#define MSG_E4 "E4"
 | 
			
		||||
#define MSG_E5 "E5"
 | 
			
		||||
#define MSG_E6 "E6"
 | 
			
		||||
#define MSG_MOVE_E1 "1"
 | 
			
		||||
#define MSG_MOVE_E2 "2"
 | 
			
		||||
#define MSG_MOVE_E3 "3"
 | 
			
		||||
#define MSG_MOVE_E4 "4"
 | 
			
		||||
#define MSG_MOVE_E5 "5"
 | 
			
		||||
#define MSG_MOVE_E6 "6"
 | 
			
		||||
#define MSG_DIAM_E1 " 1"
 | 
			
		||||
#define MSG_DIAM_E2 " 2"
 | 
			
		||||
#define MSG_DIAM_E3 " 3"
 | 
			
		||||
#define MSG_DIAM_E4 " 4"
 | 
			
		||||
#define MSG_DIAM_E5 " 5"
 | 
			
		||||
#define MSG_DIAM_E6 " 6"
 | 
			
		||||
 | 
			
		||||
#include INCLUDE_LANGUAGE
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -646,6 +646,37 @@ void I2CPositionEncodersMgr::init() {
 | 
			
		||||
      encoders[i].set_homed();
 | 
			
		||||
    #endif
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if I2CPE_ENCODER_CNT > 5
 | 
			
		||||
    i++;
 | 
			
		||||
 | 
			
		||||
    encoders[i].init(I2CPE_ENC_6_ADDR, I2CPE_ENC_6_AXIS);
 | 
			
		||||
 | 
			
		||||
    #ifdef I2CPE_ENC_6_TYPE
 | 
			
		||||
      encoders[i].set_type(I2CPE_ENC_6_TYPE);
 | 
			
		||||
    #endif
 | 
			
		||||
    #ifdef I2CPE_ENC_6_TICKS_UNIT
 | 
			
		||||
      encoders[i].set_ticks_unit(I2CPE_ENC_6_TICKS_UNIT);
 | 
			
		||||
    #endif
 | 
			
		||||
    #ifdef I2CPE_ENC_6_TICKS_REV
 | 
			
		||||
      encoders[i].set_stepper_ticks(I2CPE_ENC_6_TICKS_REV);
 | 
			
		||||
    #endif
 | 
			
		||||
    #ifdef I2CPE_ENC_6_INVERT
 | 
			
		||||
      encoders[i].set_inverted(I2CPE_ENC_6_INVERT);
 | 
			
		||||
    #endif
 | 
			
		||||
    #ifdef I2CPE_ENC_6_EC_METHOD
 | 
			
		||||
      encoders[i].set_ec_method(I2CPE_ENC_6_EC_METHOD);
 | 
			
		||||
    #endif
 | 
			
		||||
    #ifdef I2CPE_ENC_6_EC_THRESH
 | 
			
		||||
      encoders[i].set_ec_threshold(I2CPE_ENC_6_EC_THRESH);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    encoders[i].set_active(encoders[i].passes_test(true));
 | 
			
		||||
 | 
			
		||||
    #if I2CPE_ENC_6_AXIS == E_AXIS
 | 
			
		||||
      encoders[i].set_homed();
 | 
			
		||||
    #endif
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void I2CPositionEncodersMgr::report_position(const int8_t idx, const bool units, const bool noOffset) {
 | 
			
		||||
 | 
			
		||||
@ -57,11 +57,14 @@ void controllerfan_update() {
 | 
			
		||||
        #if E_STEPPERS > 1
 | 
			
		||||
          || E1_ENABLE_READ == E_ENABLE_ON
 | 
			
		||||
          #if E_STEPPERS > 2
 | 
			
		||||
              || E2_ENABLE_READ == E_ENABLE_ON
 | 
			
		||||
            || E2_ENABLE_READ == E_ENABLE_ON
 | 
			
		||||
            #if E_STEPPERS > 3
 | 
			
		||||
                || E3_ENABLE_READ == E_ENABLE_ON
 | 
			
		||||
              || E3_ENABLE_READ == E_ENABLE_ON
 | 
			
		||||
              #if E_STEPPERS > 4
 | 
			
		||||
                  || E4_ENABLE_READ == E_ENABLE_ON
 | 
			
		||||
                || E4_ENABLE_READ == E_ENABLE_ON
 | 
			
		||||
                #if E_STEPPERS > 5
 | 
			
		||||
                  || E5_ENABLE_READ == E_ENABLE_ON
 | 
			
		||||
                #endif
 | 
			
		||||
              #endif
 | 
			
		||||
            #endif
 | 
			
		||||
          #endif
 | 
			
		||||
 | 
			
		||||
@ -68,11 +68,14 @@ bool Power::is_power_needed() {
 | 
			
		||||
      #if E_STEPPERS > 1
 | 
			
		||||
        || E1_ENABLE_READ == E_ENABLE_ON
 | 
			
		||||
        #if E_STEPPERS > 2
 | 
			
		||||
            || E2_ENABLE_READ == E_ENABLE_ON
 | 
			
		||||
          || E2_ENABLE_READ == E_ENABLE_ON
 | 
			
		||||
          #if E_STEPPERS > 3
 | 
			
		||||
              || E3_ENABLE_READ == E_ENABLE_ON
 | 
			
		||||
            || E3_ENABLE_READ == E_ENABLE_ON
 | 
			
		||||
            #if E_STEPPERS > 4
 | 
			
		||||
                || E4_ENABLE_READ == E_ENABLE_ON
 | 
			
		||||
              || E4_ENABLE_READ == E_ENABLE_ON
 | 
			
		||||
              #if E_STEPPERS > 5
 | 
			
		||||
                || E5_ENABLE_READ == E_ENABLE_ON
 | 
			
		||||
              #endif
 | 
			
		||||
            #endif
 | 
			
		||||
          #endif
 | 
			
		||||
        #endif
 | 
			
		||||
 | 
			
		||||
@ -54,6 +54,9 @@ void FilamentRunoutSensor::setup() {
 | 
			
		||||
        INIT_RUNOUT_PIN(FIL_RUNOUT4_PIN);
 | 
			
		||||
        #if NUM_RUNOUT_SENSORS > 4
 | 
			
		||||
          INIT_RUNOUT_PIN(FIL_RUNOUT5_PIN);
 | 
			
		||||
          #if NUM_RUNOUT_SENSORS > 5
 | 
			
		||||
            INIT_RUNOUT_PIN(FIL_RUNOUT6_PIN);
 | 
			
		||||
          #endif
 | 
			
		||||
        #endif
 | 
			
		||||
      #endif
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
@ -71,6 +71,9 @@ class FilamentRunoutSensor {
 | 
			
		||||
              case 3: is_out = READ(FIL_RUNOUT4_PIN) == FIL_RUNOUT_INVERTING; break;
 | 
			
		||||
              #if NUM_RUNOUT_SENSORS > 4
 | 
			
		||||
                case 4: is_out = READ(FIL_RUNOUT5_PIN) == FIL_RUNOUT_INVERTING; break;
 | 
			
		||||
                #if NUM_RUNOUT_SENSORS > 5
 | 
			
		||||
                  case 5: is_out = READ(FIL_RUNOUT6_PIN) == FIL_RUNOUT_INVERTING; break;
 | 
			
		||||
                #endif
 | 
			
		||||
              #endif
 | 
			
		||||
            #endif
 | 
			
		||||
          #endif
 | 
			
		||||
 | 
			
		||||
@ -53,6 +53,11 @@ inline void enable_solenoid(const uint8_t num) {
 | 
			
		||||
          OUT_WRITE(SOL4_PIN, HIGH);
 | 
			
		||||
          break;
 | 
			
		||||
      #endif
 | 
			
		||||
      #if HAS_SOLENOID_5 && EXTRUDERS > 5
 | 
			
		||||
        case 5:
 | 
			
		||||
          OUT_WRITE(SOL5_PIN, HIGH);
 | 
			
		||||
          break;
 | 
			
		||||
      #endif
 | 
			
		||||
    default:
 | 
			
		||||
      SERIAL_ECHO_START();
 | 
			
		||||
      SERIAL_ECHOLNPGM(MSG_INVALID_SOLENOID);
 | 
			
		||||
@ -76,6 +81,9 @@ void disable_all_solenoids() {
 | 
			
		||||
  #if HAS_SOLENOID_4 && EXTRUDERS > 4
 | 
			
		||||
    OUT_WRITE(SOL4_PIN, LOW);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if HAS_SOLENOID_5 && EXTRUDERS > 5
 | 
			
		||||
    OUT_WRITE(SOL5_PIN, LOW);
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // EXT_SOLENOID
 | 
			
		||||
 | 
			
		||||
@ -213,6 +213,10 @@ bool report_tmc_status = false;
 | 
			
		||||
        static uint8_t e4_otpw_cnt = 0;
 | 
			
		||||
        monitor_tmc_driver(stepperE4, TMC_E4, e4_otpw_cnt);
 | 
			
		||||
      #endif
 | 
			
		||||
      #if HAS_HW_COMMS(E5)
 | 
			
		||||
        static uint8_t e5_otpw_cnt = 0;
 | 
			
		||||
        monitor_tmc_driver(stepperE5, TMC_E5, e5_otpw_cnt);
 | 
			
		||||
      #endif
 | 
			
		||||
 | 
			
		||||
      if (report_tmc_status) SERIAL_EOL();
 | 
			
		||||
    }
 | 
			
		||||
@ -244,6 +248,9 @@ void _tmc_say_axis(const TMC_AxisEnum axis) {
 | 
			
		||||
            , ext_E3[] PROGMEM = "E3"
 | 
			
		||||
            #if E_STEPPERS > 4
 | 
			
		||||
              , ext_E4[] PROGMEM = "E4"
 | 
			
		||||
              #if E_STEPPERS > 5
 | 
			
		||||
                , ext_E5[] PROGMEM = "E5"
 | 
			
		||||
              #endif
 | 
			
		||||
            #endif
 | 
			
		||||
          #endif
 | 
			
		||||
        #endif
 | 
			
		||||
@ -274,6 +281,9 @@ void _tmc_say_axis(const TMC_AxisEnum axis) {
 | 
			
		||||
            , ext_E3
 | 
			
		||||
            #if E_STEPPERS > 4
 | 
			
		||||
              , ext_E4
 | 
			
		||||
              #if E_STEPPERS > 5
 | 
			
		||||
                , ext_E5
 | 
			
		||||
              #endif
 | 
			
		||||
            #endif
 | 
			
		||||
          #endif
 | 
			
		||||
        #endif
 | 
			
		||||
@ -532,6 +542,13 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
 | 
			
		||||
        #endif
 | 
			
		||||
      ]);
 | 
			
		||||
    #endif
 | 
			
		||||
    #if AXIS_IS_TMC(E5)
 | 
			
		||||
      tmc_status(stepperE5, TMC_E5, i, planner.axis_steps_per_mm[E_AXIS
 | 
			
		||||
        #if ENABLED(DISTINCT_E_FACTORS)
 | 
			
		||||
          + 5
 | 
			
		||||
        #endif
 | 
			
		||||
      ]);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    SERIAL_EOL();
 | 
			
		||||
  }
 | 
			
		||||
@ -576,6 +593,9 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
 | 
			
		||||
    #if AXIS_IS_TMC(E4)
 | 
			
		||||
      tmc_parse_drv_status(stepperE4, TMC_E4, i);
 | 
			
		||||
    #endif
 | 
			
		||||
    #if AXIS_IS_TMC(E5)
 | 
			
		||||
      tmc_parse_drv_status(stepperE5, TMC_E5, i);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    SERIAL_EOL();
 | 
			
		||||
  }
 | 
			
		||||
@ -693,6 +713,9 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
 | 
			
		||||
    #if AXIS_DRIVER_TYPE(E4, TMC2130)
 | 
			
		||||
      SET_CS_PIN(E4);
 | 
			
		||||
    #endif
 | 
			
		||||
    #if AXIS_DRIVER_TYPE(E5, TMC2130)
 | 
			
		||||
      SET_CS_PIN(E5);
 | 
			
		||||
    #endif
 | 
			
		||||
  }
 | 
			
		||||
#endif // TMC2130
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -49,19 +49,24 @@ enum TMC_AxisEnum : char {
 | 
			
		||||
  #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS)
 | 
			
		||||
    , TMC_Z3
 | 
			
		||||
  #endif
 | 
			
		||||
  , TMC_E0
 | 
			
		||||
  #if E_STEPPERS > 1
 | 
			
		||||
    , TMC_E1
 | 
			
		||||
    #if E_STEPPERS > 2
 | 
			
		||||
      , TMC_E2
 | 
			
		||||
      #if E_STEPPERS > 3
 | 
			
		||||
        , TMC_E3
 | 
			
		||||
        #if E_STEPPERS > 4
 | 
			
		||||
          , TMC_E4
 | 
			
		||||
        #endif
 | 
			
		||||
      #endif
 | 
			
		||||
    #endif
 | 
			
		||||
  #endif
 | 
			
		||||
  #if E_STEPPERS
 | 
			
		||||
    , TMC_E0
 | 
			
		||||
    #if E_STEPPERS > 1
 | 
			
		||||
      , TMC_E1
 | 
			
		||||
      #if E_STEPPERS > 2
 | 
			
		||||
        , TMC_E2
 | 
			
		||||
        #if E_STEPPERS > 3
 | 
			
		||||
          , TMC_E3
 | 
			
		||||
          #if E_STEPPERS > 4
 | 
			
		||||
            , TMC_E4
 | 
			
		||||
            #if E_STEPPERS > 5
 | 
			
		||||
              , TMC_E5
 | 
			
		||||
            #endif // E_STEPPERS > 5
 | 
			
		||||
          #endif // E_STEPPERS > 4
 | 
			
		||||
        #endif // E_STEPPERS > 3
 | 
			
		||||
      #endif // E_STEPPERS > 2
 | 
			
		||||
    #endif // E_STEPPERS > 1
 | 
			
		||||
  #endif // E_STEPPERS
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
constexpr uint32_t _tmc_thrs(const uint16_t msteps, const int32_t thrs, const uint32_t spmm) {
 | 
			
		||||
 | 
			
		||||
@ -677,8 +677,8 @@ G29_TYPE GcodeSuite::G29() {
 | 
			
		||||
        // Inner loop is Y with PROBE_Y_FIRST enabled
 | 
			
		||||
        for (int8_t PR_INNER_VAR = inStart; PR_INNER_VAR != inStop; PR_INNER_VAR += inInc) {
 | 
			
		||||
 | 
			
		||||
          float xBase = left_probe_bed_position + xGridSpacing * xCount,
 | 
			
		||||
                yBase = front_probe_bed_position + yGridSpacing * yCount;
 | 
			
		||||
          const float xBase = left_probe_bed_position + xGridSpacing * xCount,
 | 
			
		||||
                      yBase = front_probe_bed_position + yGridSpacing * yCount;
 | 
			
		||||
 | 
			
		||||
          xProbe = FLOOR(xBase + (xBase < 0 ? 0 : 0.5));
 | 
			
		||||
          yProbe = FLOOR(yBase + (yBase < 0 ? 0 : 0.5));
 | 
			
		||||
 | 
			
		||||
@ -86,6 +86,9 @@ void GcodeSuite::M906() {
 | 
			
		||||
          #if AXIS_IS_TMC(E4)
 | 
			
		||||
            case 4: TMC_SET_CURRENT(E4); break;
 | 
			
		||||
          #endif
 | 
			
		||||
          #if AXIS_IS_TMC(E5)
 | 
			
		||||
            case 5: TMC_SET_CURRENT(E5); break;
 | 
			
		||||
          #endif
 | 
			
		||||
        }
 | 
			
		||||
      } break;
 | 
			
		||||
    }
 | 
			
		||||
@ -128,6 +131,9 @@ void GcodeSuite::M906() {
 | 
			
		||||
    #if AXIS_IS_TMC(E4)
 | 
			
		||||
      TMC_SAY_CURRENT(E4);
 | 
			
		||||
    #endif
 | 
			
		||||
    #if AXIS_IS_TMC(E5)
 | 
			
		||||
      TMC_SAY_CURRENT(E5);
 | 
			
		||||
    #endif
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -74,6 +74,9 @@ void GcodeSuite::M911() {
 | 
			
		||||
  #if M91x_USE_E(4)
 | 
			
		||||
    tmc_report_otpw(stepperE4, TMC_E4);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if M91x_USE_E(5)
 | 
			
		||||
    tmc_report_otpw(stepperE5, TMC_E5);
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -145,6 +148,9 @@ void GcodeSuite::M912() {
 | 
			
		||||
      #if M91x_USE_E(4)
 | 
			
		||||
        if (hasNone || eval == 4 || (hasE && eval < 0)) tmc_clear_otpw(stepperE4, TMC_E4);
 | 
			
		||||
      #endif
 | 
			
		||||
      #if M91x_USE_E(5)
 | 
			
		||||
        if (hasNone || eval == 5 || (hasE && eval == 10)) tmc_clear_otpw(stepperE5, TMC_E5);
 | 
			
		||||
      #endif
 | 
			
		||||
    #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -208,6 +214,9 @@ void GcodeSuite::M912() {
 | 
			
		||||
            #if E_STEPPERS > 4 && AXIS_HAS_STEALTHCHOP(E4)
 | 
			
		||||
              case 4: TMC_SET_PWMTHRS_E(4); break;
 | 
			
		||||
            #endif
 | 
			
		||||
            #if E_STEPPERS > 5 && AXIS_HAS_STEALTHCHOP(E5)
 | 
			
		||||
              case 5: TMC_SET_PWMTHRS_E(5); break;
 | 
			
		||||
            #endif
 | 
			
		||||
          }
 | 
			
		||||
        } break;
 | 
			
		||||
      }
 | 
			
		||||
@ -250,6 +259,9 @@ void GcodeSuite::M912() {
 | 
			
		||||
      #if E_STEPPERS > 4 && AXIS_HAS_STEALTHCHOP(E4)
 | 
			
		||||
        TMC_SAY_PWMTHRS_E(4);
 | 
			
		||||
      #endif
 | 
			
		||||
      #if E_STEPPERS > 5 && AXIS_HAS_STEALTHCHOP(E5)
 | 
			
		||||
        TMC_SAY_PWMTHRS_E(5);
 | 
			
		||||
      #endif
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
#endif // HYBRID_THRESHOLD
 | 
			
		||||
 | 
			
		||||
@ -381,6 +381,22 @@
 | 
			
		||||
  #define HEATER_4_USES_THERMISTOR
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if TEMP_SENSOR_5 == -4
 | 
			
		||||
  #define HEATER_5_USES_AD8495
 | 
			
		||||
#elif TEMP_SENSOR_5 == -3
 | 
			
		||||
  #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_5."
 | 
			
		||||
#elif TEMP_SENSOR_5 == -2
 | 
			
		||||
  #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_5."
 | 
			
		||||
#elif TEMP_SENSOR_5 == -1
 | 
			
		||||
  #define HEATER_5_USES_AD595
 | 
			
		||||
#elif TEMP_SENSOR_5 == 0
 | 
			
		||||
  #undef HEATER_5_MINTEMP
 | 
			
		||||
  #undef HEATER_5_MAXTEMP
 | 
			
		||||
#elif TEMP_SENSOR_5 > 0
 | 
			
		||||
  #define THERMISTORHEATER_5 TEMP_SENSOR_5
 | 
			
		||||
  #define HEATER_5_USES_THERMISTOR
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if TEMP_SENSOR_BED == -4
 | 
			
		||||
  #define HEATER_BED_USES_AD8495
 | 
			
		||||
#elif TEMP_SENSOR_BED == -3
 | 
			
		||||
@ -841,6 +857,12 @@
 | 
			
		||||
#define HAS_E4_MICROSTEPS (PIN_EXISTS(E4_MS1))
 | 
			
		||||
#define HAS_SOLENOID_4    (PIN_EXISTS(SOL4))
 | 
			
		||||
 | 
			
		||||
#define HAS_E5_ENABLE     (PIN_EXISTS(E5_ENABLE))
 | 
			
		||||
#define HAS_E5_DIR        (PIN_EXISTS(E5_DIR))
 | 
			
		||||
#define HAS_E5_STEP       (PIN_EXISTS(E5_STEP))
 | 
			
		||||
#define HAS_E5_MICROSTEPS (PIN_EXISTS(E5_MS1))
 | 
			
		||||
#define HAS_SOLENOID_5    (PIN_EXISTS(SOL5))
 | 
			
		||||
 | 
			
		||||
// Trinamic Stepper Drivers
 | 
			
		||||
#define HAS_STEALTHCHOP (HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2208))
 | 
			
		||||
#define HAS_STALLGUARD  HAS_DRIVER(TMC2130)
 | 
			
		||||
@ -919,8 +941,9 @@
 | 
			
		||||
#define HAS_AUTO_FAN_2 (HOTENDS > 2 && PIN_EXISTS(E2_AUTO_FAN))
 | 
			
		||||
#define HAS_AUTO_FAN_3 (HOTENDS > 3 && PIN_EXISTS(E3_AUTO_FAN))
 | 
			
		||||
#define HAS_AUTO_FAN_4 (HOTENDS > 4 && PIN_EXISTS(E4_AUTO_FAN))
 | 
			
		||||
#define HAS_AUTO_FAN_5 (HOTENDS > 5 && PIN_EXISTS(E5_AUTO_FAN))
 | 
			
		||||
#define HAS_AUTO_CHAMBER_FAN (PIN_EXISTS(CHAMBER_AUTO_FAN))
 | 
			
		||||
#define HAS_AUTO_FAN (HAS_AUTO_FAN_0 || HAS_AUTO_FAN_1 || HAS_AUTO_FAN_2 || HAS_AUTO_FAN_3 || HAS_AUTO_CHAMBER_FAN)
 | 
			
		||||
#define HAS_AUTO_FAN (HAS_AUTO_FAN_0 || HAS_AUTO_FAN_1 || HAS_AUTO_FAN_2 || HAS_AUTO_FAN_3 || HAS_AUTO_FAN_4 || HAS_AUTO_FAN_5 || HAS_AUTO_CHAMBER_FAN)
 | 
			
		||||
#define AUTO_1_IS_0 (E1_AUTO_FAN_PIN == E0_AUTO_FAN_PIN)
 | 
			
		||||
#define AUTO_2_IS_0 (E2_AUTO_FAN_PIN == E0_AUTO_FAN_PIN)
 | 
			
		||||
#define AUTO_2_IS_1 (E2_AUTO_FAN_PIN == E1_AUTO_FAN_PIN)
 | 
			
		||||
@ -931,11 +954,17 @@
 | 
			
		||||
#define AUTO_4_IS_1 (E4_AUTO_FAN_PIN == E1_AUTO_FAN_PIN)
 | 
			
		||||
#define AUTO_4_IS_2 (E4_AUTO_FAN_PIN == E2_AUTO_FAN_PIN)
 | 
			
		||||
#define AUTO_4_IS_3 (E4_AUTO_FAN_PIN == E3_AUTO_FAN_PIN)
 | 
			
		||||
#define AUTO_5_IS_0 (E5_AUTO_FAN_PIN == E0_AUTO_FAN_PIN)
 | 
			
		||||
#define AUTO_5_IS_1 (E5_AUTO_FAN_PIN == E1_AUTO_FAN_PIN)
 | 
			
		||||
#define AUTO_5_IS_2 (E5_AUTO_FAN_PIN == E2_AUTO_FAN_PIN)
 | 
			
		||||
#define AUTO_5_IS_3 (E5_AUTO_FAN_PIN == E3_AUTO_FAN_PIN)
 | 
			
		||||
#define AUTO_5_IS_4 (E5_AUTO_FAN_PIN == E4_AUTO_FAN_PIN)
 | 
			
		||||
#define AUTO_CHAMBER_IS_0 (CHAMBER_AUTO_FAN_PIN == E0_AUTO_FAN_PIN)
 | 
			
		||||
#define AUTO_CHAMBER_IS_1 (CHAMBER_AUTO_FAN_PIN == E1_AUTO_FAN_PIN)
 | 
			
		||||
#define AUTO_CHAMBER_IS_2 (CHAMBER_AUTO_FAN_PIN == E2_AUTO_FAN_PIN)
 | 
			
		||||
#define AUTO_CHAMBER_IS_3 (CHAMBER_AUTO_FAN_PIN == E3_AUTO_FAN_PIN)
 | 
			
		||||
#define AUTO_CHAMBER_IS_4 (CHAMBER_AUTO_FAN_PIN == E4_AUTO_FAN_PIN)
 | 
			
		||||
#define AUTO_CHAMBER_IS_5 (CHAMBER_AUTO_FAN_PIN == E5_AUTO_FAN_PIN)
 | 
			
		||||
 | 
			
		||||
// Other fans
 | 
			
		||||
#define HAS_FAN0 (PIN_EXISTS(FAN))
 | 
			
		||||
@ -966,7 +995,7 @@
 | 
			
		||||
#define HAS_CASE_LIGHT (PIN_EXISTS(CASE_LIGHT) && ENABLED(CASE_LIGHT_ENABLE))
 | 
			
		||||
 | 
			
		||||
// Digital control
 | 
			
		||||
#define HAS_MICROSTEPS (HAS_X_MICROSTEPS || HAS_Y_MICROSTEPS || HAS_Z_MICROSTEPS || HAS_E0_MICROSTEPS || HAS_E1_MICROSTEPS || HAS_E2_MICROSTEPS || HAS_E3_MICROSTEPS || HAS_E4_MICROSTEPS)
 | 
			
		||||
#define HAS_MICROSTEPS (HAS_X_MICROSTEPS || HAS_Y_MICROSTEPS || HAS_Z_MICROSTEPS || HAS_E0_MICROSTEPS || HAS_E1_MICROSTEPS || HAS_E2_MICROSTEPS || HAS_E3_MICROSTEPS || HAS_E4_MICROSTEPS || HAS_E5_MICROSTEPS)
 | 
			
		||||
#define HAS_STEPPER_RESET (PIN_EXISTS(STEPPER_RESET))
 | 
			
		||||
#define HAS_DIGIPOTSS (PIN_EXISTS(DIGIPOTSS))
 | 
			
		||||
#define HAS_MOTOR_CURRENT_PWM (PIN_EXISTS(MOTOR_CURRENT_PWM_XY) || PIN_EXISTS(MOTOR_CURRENT_PWM_Z) || PIN_EXISTS(MOTOR_CURRENT_PWM_E))
 | 
			
		||||
@ -1022,6 +1051,9 @@
 | 
			
		||||
      #define WRITE_HEATER_3(v) WRITE(HEATER_3_PIN, (v) ^ HEATER_3_INVERTING)
 | 
			
		||||
      #if HOTENDS > 4
 | 
			
		||||
        #define WRITE_HEATER_4(v) WRITE(HEATER_4_PIN, (v) ^ HEATER_4_INVERTING)
 | 
			
		||||
        #if HOTENDS > 5
 | 
			
		||||
          #define WRITE_HEATER_5(v) WRITE(HEATER_5_PIN, (v) ^ HEATER_5_INVERTING)
 | 
			
		||||
        #endif // HOTENDS > 5
 | 
			
		||||
      #endif // HOTENDS > 4
 | 
			
		||||
    #endif // HOTENDS > 3
 | 
			
		||||
  #endif // HOTENDS > 2
 | 
			
		||||
 | 
			
		||||
@ -273,19 +273,19 @@
 | 
			
		||||
#elif defined(HAVE_L6470DRIVER)
 | 
			
		||||
  #error "HAVE_L6470DRIVER is now [AXIS]_DRIVER_TYPE L6470. Please update your Configuration.h."
 | 
			
		||||
#elif defined(X_IS_TMC) || defined(X2_IS_TMC) || defined(Y_IS_TMC) || defined(Y2_IS_TMC) || defined(Z_IS_TMC) || defined(Z2_IS_TMC) || defined(Z3_IS_TMC) \
 | 
			
		||||
   || defined(E0_IS_TMC) || defined(E1_IS_TMC) || defined(E2_IS_TMC) || defined(E3_IS_TMC) || defined(E4_IS_TMC)
 | 
			
		||||
   || defined(E0_IS_TMC) || defined(E1_IS_TMC) || defined(E2_IS_TMC) || defined(E3_IS_TMC) || defined(E4_IS_TMC) || defined(E5_IS_TMC)
 | 
			
		||||
  #error "[AXIS]_IS_TMC is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h."
 | 
			
		||||
#elif defined(X_IS_TMC26X) || defined(X2_IS_TMC26X) || defined(Y_IS_TMC26X) || defined(Y2_IS_TMC26X) || defined(Z_IS_TMC26X) || defined(Z2_IS_TMC26X) || defined(Z3_IS_TMC26X) \
 | 
			
		||||
   || defined(E0_IS_TMC26X) || defined(E1_IS_TMC26X) || defined(E2_IS_TMC26X) || defined(E3_IS_TMC26X) || defined(E4_IS_TMC26X)
 | 
			
		||||
   || defined(E0_IS_TMC26X) || defined(E1_IS_TMC26X) || defined(E2_IS_TMC26X) || defined(E3_IS_TMC26X) || defined(E4_IS_TMC26X) || defined(E5_IS_TMC26X)
 | 
			
		||||
  #error "[AXIS]_IS_TMC26X is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h."
 | 
			
		||||
#elif defined(X_IS_TMC2130) || defined(X2_IS_TMC2130) || defined(Y_IS_TMC2130) || defined(Y2_IS_TMC2130) || defined(Z_IS_TMC2130) || defined(Z2_IS_TMC2130) || defined(Z3_IS_TMC2130) \
 | 
			
		||||
   || defined(E0_IS_TMC2130) || defined(E1_IS_TMC2130) || defined(E2_IS_TMC2130) || defined(E3_IS_TMC2130) || defined(E4_IS_TMC2130)
 | 
			
		||||
   || defined(E0_IS_TMC2130) || defined(E1_IS_TMC2130) || defined(E2_IS_TMC2130) || defined(E3_IS_TMC2130) || defined(E4_IS_TMC2130) || defined(E5_IS_TMC2130)
 | 
			
		||||
  #error "[AXIS]_IS_TMC2130 is now [AXIS]_DRIVER_TYPE TMC2130. Please update your Configuration.h."
 | 
			
		||||
#elif defined(X_IS_TMC2208) || defined(X2_IS_TMC2208) || defined(Y_IS_TMC2208) || defined(Y2_IS_TMC2208) || defined(Z_IS_TMC2208) || defined(Z2_IS_TMC2208) || defined(Z3_IS_TMC2208) \
 | 
			
		||||
   || defined(E0_IS_TMC2208) || defined(E1_IS_TMC2208) || defined(E2_IS_TMC2208) || defined(E3_IS_TMC2208) || defined(E4_IS_TMC2208)
 | 
			
		||||
   || defined(E0_IS_TMC2208) || defined(E1_IS_TMC2208) || defined(E2_IS_TMC2208) || defined(E3_IS_TMC2208) || defined(E4_IS_TMC2208) || defined(E5_IS_TMC2208)
 | 
			
		||||
  #error "[AXIS]_IS_TMC2208 is now [AXIS]_DRIVER_TYPE TMC2208. Please update your Configuration.h."
 | 
			
		||||
#elif defined(X_IS_L6470) || defined(X2_IS_L6470) || defined(Y_IS_L6470) || defined(Y2_IS_L6470) || defined(Z_IS_L6470) || defined(Z2_IS_L6470) || defined(Z3_IS_L6470) \
 | 
			
		||||
   || defined(E0_IS_L6470) || defined(E1_IS_L6470) || defined(E2_IS_L6470) || defined(E3_IS_L6470) || defined(E4_IS_L6470)
 | 
			
		||||
   || defined(E0_IS_L6470) || defined(E1_IS_L6470) || defined(E2_IS_L6470) || defined(E3_IS_L6470) || defined(E4_IS_L6470) || defined(E5_IS_L6470)
 | 
			
		||||
  #error "[AXIS]_IS_L6470 is now [AXIS]_DRIVER_TYPE L6470. Please update your Configuration.h."
 | 
			
		||||
#elif defined(AUTOMATIC_CURRENT_CONTROL)
 | 
			
		||||
  #error "AUTOMATIC_CURRENT_CONTROL is now MONITOR_DRIVER_STATUS. Please update your configuration."
 | 
			
		||||
@ -534,6 +534,8 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
 | 
			
		||||
    #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 3 requires FIL_RUNOUT4_PIN."
 | 
			
		||||
  #elif NUM_RUNOUT_SENSORS > 4 && !PIN_EXISTS(FIL_RUNOUT5)
 | 
			
		||||
    #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 4 requires FIL_RUNOUT5_PIN."
 | 
			
		||||
  #elif NUM_RUNOUT_SENSORS > 5 && !PIN_EXISTS(FIL_RUNOUT6)
 | 
			
		||||
    #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 5 requires FIL_RUNOUT6_PIN."
 | 
			
		||||
  #elif DISABLED(SDSUPPORT) && DISABLED(PRINTJOB_TIMER_AUTOSTART)
 | 
			
		||||
    #error "FILAMENT_RUNOUT_SENSOR requires SDSUPPORT or PRINTJOB_TIMER_AUTOSTART."
 | 
			
		||||
  #elif DISABLED(ADVANCED_PAUSE_FEATURE)
 | 
			
		||||
@ -1242,13 +1244,28 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
 | 
			
		||||
        #elif !PIN_EXISTS(TEMP_4)
 | 
			
		||||
          #error "TEMP_4_PIN not defined for this board."
 | 
			
		||||
        #endif
 | 
			
		||||
        #if HOTENDS > 5
 | 
			
		||||
          #if TEMP_SENSOR_5 == 0
 | 
			
		||||
            #error "TEMP_SENSOR_5 is required with 5 HOTENDS."
 | 
			
		||||
          #elif !HAS_HEATER_5
 | 
			
		||||
            #error "HEATER_5_PIN not defined for this board."
 | 
			
		||||
          #elif !PIN_EXISTS(TEMP_5)
 | 
			
		||||
            #error "TEMP_5_PIN not defined for this board."
 | 
			
		||||
          #endif
 | 
			
		||||
        #elif TEMP_SENSOR_5 != 0
 | 
			
		||||
          #error "TEMP_SENSOR_5 shouldn't be set with only 5 HOTENDS."
 | 
			
		||||
        #endif
 | 
			
		||||
      #elif TEMP_SENSOR_4 != 0
 | 
			
		||||
        #error "TEMP_SENSOR_4 shouldn't be set with only 4 HOTENDS."
 | 
			
		||||
      #elif TEMP_SENSOR_5 != 0
 | 
			
		||||
        #error "TEMP_SENSOR_5 shouldn't be set with only 5 HOTENDS."
 | 
			
		||||
      #endif
 | 
			
		||||
    #elif TEMP_SENSOR_3 != 0
 | 
			
		||||
      #error "TEMP_SENSOR_3 shouldn't be set with only 3 HOTENDS."
 | 
			
		||||
    #elif TEMP_SENSOR_4 != 0
 | 
			
		||||
      #error "TEMP_SENSOR_4 shouldn't be set with only 3 HOTENDS."
 | 
			
		||||
    #elif TEMP_SENSOR_5 != 0
 | 
			
		||||
      #error "TEMP_SENSOR_5 shouldn't be set with only 4 HOTENDS."
 | 
			
		||||
    #endif
 | 
			
		||||
  #elif TEMP_SENSOR_2 != 0
 | 
			
		||||
    #error "TEMP_SENSOR_2 shouldn't be set with only 2 HOTENDS."
 | 
			
		||||
@ -1256,6 +1273,8 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
 | 
			
		||||
    #error "TEMP_SENSOR_3 shouldn't be set with only 2 HOTENDS."
 | 
			
		||||
  #elif TEMP_SENSOR_4 != 0
 | 
			
		||||
    #error "TEMP_SENSOR_4 shouldn't be set with only 2 HOTENDS."
 | 
			
		||||
  #elif TEMP_SENSOR_5 != 0
 | 
			
		||||
    #error "TEMP_SENSOR_5 shouldn't be set with only 2 HOTENDS."
 | 
			
		||||
  #endif
 | 
			
		||||
#elif TEMP_SENSOR_1 != 0 && DISABLED(TEMP_SENSOR_1_AS_REDUNDANT)
 | 
			
		||||
  #error "TEMP_SENSOR_1 shouldn't be set with only 1 HOTEND."
 | 
			
		||||
@ -1265,6 +1284,8 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
 | 
			
		||||
  #error "TEMP_SENSOR_3 shouldn't be set with only 1 HOTEND."
 | 
			
		||||
#elif TEMP_SENSOR_4 != 0
 | 
			
		||||
  #error "TEMP_SENSOR_4 shouldn't be set with only 1 HOTEND."
 | 
			
		||||
#elif TEMP_SENSOR_5 != 0
 | 
			
		||||
  #error "TEMP_SENSOR_5 shouldn't be set with only 1 HOTEND."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) && TEMP_SENSOR_1 == 0
 | 
			
		||||
@ -1306,23 +1327,36 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
 | 
			
		||||
 * Test Extruder Stepper Pins
 | 
			
		||||
 */
 | 
			
		||||
#if DISABLED(MK2_MULTIPLEXER) // MK2_MULTIPLEXER uses E0 stepper only
 | 
			
		||||
  #if E_STEPPERS > 4
 | 
			
		||||
    #if !(PIN_EXISTS(E4_STEP) && PIN_EXISTS(E4_DIR) && PIN_EXISTS(E4_ENABLE))
 | 
			
		||||
      #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board."
 | 
			
		||||
  #if E_STEPPERS
 | 
			
		||||
    #if !(PIN_EXISTS(E0_STEP) && PIN_EXISTS(E0_DIR) && PIN_EXISTS(E0_ENABLE))
 | 
			
		||||
      #error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board."
 | 
			
		||||
    #endif
 | 
			
		||||
  #elif E_STEPPERS > 3
 | 
			
		||||
    #if !(PIN_EXISTS(E3_STEP) && PIN_EXISTS(E3_DIR) && PIN_EXISTS(E3_ENABLE))
 | 
			
		||||
      #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board."
 | 
			
		||||
    #endif
 | 
			
		||||
  #elif E_STEPPERS > 2
 | 
			
		||||
    #if !(PIN_EXISTS(E2_STEP) && PIN_EXISTS(E2_DIR) && PIN_EXISTS(E2_ENABLE))
 | 
			
		||||
      #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board."
 | 
			
		||||
    #endif
 | 
			
		||||
  #elif E_STEPPERS > 1
 | 
			
		||||
    #if !(PIN_EXISTS(E1_STEP) && PIN_EXISTS(E1_DIR) && PIN_EXISTS(E1_ENABLE))
 | 
			
		||||
      #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board."
 | 
			
		||||
    #endif
 | 
			
		||||
  #endif
 | 
			
		||||
    #if E_STEPPERS > 1
 | 
			
		||||
      #if !(PIN_EXISTS(E1_STEP) && PIN_EXISTS(E1_DIR) && PIN_EXISTS(E1_ENABLE))
 | 
			
		||||
        #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board."
 | 
			
		||||
      #endif
 | 
			
		||||
      #if E_STEPPERS > 2
 | 
			
		||||
        #if !(PIN_EXISTS(E2_STEP) && PIN_EXISTS(E2_DIR) && PIN_EXISTS(E2_ENABLE))
 | 
			
		||||
          #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board."
 | 
			
		||||
        #endif
 | 
			
		||||
        #if E_STEPPERS > 3
 | 
			
		||||
          #if !(PIN_EXISTS(E3_STEP) && PIN_EXISTS(E3_DIR) && PIN_EXISTS(E3_ENABLE))
 | 
			
		||||
            #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board."
 | 
			
		||||
          #endif
 | 
			
		||||
          #if E_STEPPERS > 4
 | 
			
		||||
            #if !(PIN_EXISTS(E4_STEP) && PIN_EXISTS(E4_DIR) && PIN_EXISTS(E4_ENABLE))
 | 
			
		||||
              #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board."
 | 
			
		||||
            #endif
 | 
			
		||||
            #if E_STEPPERS > 5
 | 
			
		||||
              #if !(PIN_EXISTS(E5_STEP) && PIN_EXISTS(E5_DIR) && PIN_EXISTS(E5_ENABLE))
 | 
			
		||||
                #error "E5_STEP_PIN, E5_DIR_PIN, or E5_ENABLE_PIN not defined for this board."
 | 
			
		||||
              #endif
 | 
			
		||||
            #endif // E_STEPPERS > 5
 | 
			
		||||
          #endif // E_STEPPERS > 4
 | 
			
		||||
        #endif // E_STEPPERS > 3
 | 
			
		||||
      #endif // E_STEPPERS > 2
 | 
			
		||||
    #endif // E_STEPPERS > 1
 | 
			
		||||
  #endif // E_STEPPERS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -1625,6 +1659,8 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
 | 
			
		||||
  #error "E3_CS_PIN is required for TMC2130. Define E3_CS_PIN in Configuration_adv.h."
 | 
			
		||||
#elif AXIS_DRIVER_TYPE(E4, TMC2130) && !PIN_EXISTS(E4_CS)
 | 
			
		||||
  #error "E4_CS_PIN is required for TMC2130. Define E4_CS_PIN in Configuration_adv.h."
 | 
			
		||||
#elif AXIS_DRIVER_TYPE(E5, TMC2130) && !PIN_EXISTS(E5_CS)
 | 
			
		||||
  #error "E5_CS_PIN is required for TMC2130. Define E5_CS_PIN in Configuration_adv.h."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -1642,8 +1678,9 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
 | 
			
		||||
    || defined(E1_HARDWARE_SERIAL) \
 | 
			
		||||
    || defined(E2_HARDWARE_SERIAL) \
 | 
			
		||||
    || defined(E3_HARDWARE_SERIAL) \
 | 
			
		||||
    || defined(E4_HARDWARE_SERIAL) )
 | 
			
		||||
  #error "select hardware UART for TMC2208 to use both TMC2208 and ENDSTOP_INTERRUPTS_FEATURE."
 | 
			
		||||
    || defined(E4_HARDWARE_SERIAL) \
 | 
			
		||||
    || defined(E5_HARDWARE_SERIAL) )
 | 
			
		||||
  #error "Select hardware UART for TMC2208 to use both TMC2208 and ENDSTOP_INTERRUPTS_FEATURE."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -1660,7 +1697,8 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
 | 
			
		||||
    || defined(E1_HARDWARE_SERIAL) \
 | 
			
		||||
    || defined(E2_HARDWARE_SERIAL) \
 | 
			
		||||
    || defined(E3_HARDWARE_SERIAL) \
 | 
			
		||||
    || defined(E4_HARDWARE_SERIAL) )
 | 
			
		||||
    || defined(E4_HARDWARE_SERIAL) \
 | 
			
		||||
    || defined(E5_HARDWARE_SERIAL) )
 | 
			
		||||
  #error "TMC2208 Software Serial is supported only on AVR and LPC1768 platforms."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -130,6 +130,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3 trangos/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4 trangos/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5 trangos/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6 trangos/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Temperatura")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Movimiento")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filamento")
 | 
			
		||||
 | 
			
		||||
@ -99,6 +99,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3 стъпки/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4 стъпки/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5 стъпки/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6 стъпки/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Температура")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Движение")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Нишка")
 | 
			
		||||
 | 
			
		||||
@ -132,6 +132,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3passos/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4passos/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5passos/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6passos/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Temperatura")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Moviment")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filament")
 | 
			
		||||
 | 
			
		||||
@ -233,6 +233,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3kroků/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4kroků/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5kroků/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6kroků/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Teplota")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Pohyb")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filament")
 | 
			
		||||
 | 
			
		||||
@ -130,6 +130,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3steps/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4steps/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5steps/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6steps/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Temperatur")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Bevægelse")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filament")
 | 
			
		||||
 | 
			
		||||
@ -145,6 +145,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3 Steps/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4 Steps/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5 Steps/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6 Steps/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Temperatur")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Bewegung")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filament")
 | 
			
		||||
 | 
			
		||||
@ -630,6 +630,12 @@
 | 
			
		||||
#ifndef MSG_E5STEPS
 | 
			
		||||
  #define MSG_E5STEPS                         _UxGT("E5steps/mm")
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef MSG_E6STEPS
 | 
			
		||||
  #define MSG_E6STEPS                         _UxGT("E6steps/mm")
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef MSG_E6STEPS
 | 
			
		||||
  #define MSG_E6STEPS                         _UxGT("E6steps/mm")
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef MSG_TEMPERATURE
 | 
			
		||||
  #define MSG_TEMPERATURE                     _UxGT("Temperature")
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -125,6 +125,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3 pasos/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4 pasos/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5 pasos/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6 pasos/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Temperatura")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Movimiento")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filamento")
 | 
			
		||||
 | 
			
		||||
@ -224,6 +224,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3 pausoak/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4 pausoak/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5 pausoak/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6 pausoak/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Tenperatura")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Mugimendua")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Harizpia")
 | 
			
		||||
 | 
			
		||||
@ -120,6 +120,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3steps/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4steps/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5steps/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6steps/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Lämpötila")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Liike")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filament")
 | 
			
		||||
 | 
			
		||||
@ -228,6 +228,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3 pas/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4 pas/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5 pas/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6 pas/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Température")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Mouvement")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filament")
 | 
			
		||||
 | 
			
		||||
@ -129,6 +129,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3 pasos/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4 pasos/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5 pasos/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6 pasos/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Temperatura")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Movemento")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filamento")
 | 
			
		||||
 | 
			
		||||
@ -129,6 +129,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3steps/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4steps/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5steps/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6steps/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Temperature")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Gibanje")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filament")
 | 
			
		||||
 | 
			
		||||
@ -232,6 +232,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3passi/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4passi/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5passi/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6passi/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Temperatura")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Movimento")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filamento")
 | 
			
		||||
 | 
			
		||||
@ -136,6 +136,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3steps/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4steps/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5steps/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6steps/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Temperatuur")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Beweging")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filament")
 | 
			
		||||
 | 
			
		||||
@ -129,6 +129,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("krokiE3/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("krokiE4/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("krokiE5/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("krokiE6/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Temperatura")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Ruch")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filament")
 | 
			
		||||
 | 
			
		||||
@ -237,6 +237,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Temperatura")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Movimento")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filamento")
 | 
			
		||||
 | 
			
		||||
@ -126,6 +126,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3 passo/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4 passo/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5 passo/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6 passo/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Temperatura")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Movimento")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filamento")
 | 
			
		||||
 | 
			
		||||
@ -227,6 +227,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3шаг/мм")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4шаг/мм")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5шаг/мм")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6шаг/мм")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Температура")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Движение")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Филамент")
 | 
			
		||||
 | 
			
		||||
@ -246,6 +246,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3krokov/mm")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4krokov/mm")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5krokov/mm")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6krokov/mm")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Teplota")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Pohyb")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filament")
 | 
			
		||||
 | 
			
		||||
@ -135,7 +135,8 @@
 | 
			
		||||
#define MSG_E2STEPS                         _UxGT("E2steps/mm")                                         // E2steps/mm
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3steps/mm")                                         // E3steps/mm
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4steps/mm")                                         // E4steps/mm
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5steps/mm")                                         // E4steps/mm
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5steps/mm")                                         // E5steps/mm
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6steps/mm")                                         // E6steps/mm
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Sıcaklık")                                           // Sıcaklık
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Hareket")                                            // Hareket
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Filaman")                                            // Filaman
 | 
			
		||||
 | 
			
		||||
@ -129,6 +129,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("E3кроків/мм")
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("E4кроків/мм")
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("E5кроків/мм")
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("E6кроків/мм")
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("Температура")
 | 
			
		||||
#define MSG_MOTION                          _UxGT("Рух")
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("Волокно")
 | 
			
		||||
 | 
			
		||||
@ -226,6 +226,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("挤出机3步数/mm") //"E3steps/mm"
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("挤出机4步数/mm") //"E4steps/mm"
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("挤出机5步数/mm") //"E5steps/mm"
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("挤出机6步数/mm") //"E6steps/mm"
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("温度")  //"Temperature"
 | 
			
		||||
#define MSG_MOTION                          _UxGT("运动")  //"Motion"
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("丝料测容")  //"Filament" lcd_control_volumetric_menu
 | 
			
		||||
 | 
			
		||||
@ -226,6 +226,7 @@
 | 
			
		||||
#define MSG_E3STEPS                         _UxGT("擠出機3步數/mm") //"E3steps/mm"
 | 
			
		||||
#define MSG_E4STEPS                         _UxGT("擠出機4步數/mm") //"E4steps/mm"
 | 
			
		||||
#define MSG_E5STEPS                         _UxGT("擠出機5步數/mm") //"E5steps/mm"
 | 
			
		||||
#define MSG_E6STEPS                         _UxGT("擠出機6步數/mm") //"E6steps/mm"
 | 
			
		||||
#define MSG_TEMPERATURE                     _UxGT("溫度")  //"Temperature"
 | 
			
		||||
#define MSG_MOTION                          _UxGT("運作")  //"Motion"
 | 
			
		||||
#define MSG_FILAMENT                        _UxGT("絲料測容")  //"Filament" lcd_control_volumetric_menu
 | 
			
		||||
 | 
			
		||||
@ -1402,6 +1402,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
          void watch_temp_callback_E3() { _WATCH_FUNC(3); }
 | 
			
		||||
          #if HOTENDS > 4
 | 
			
		||||
            void watch_temp_callback_E4() { _WATCH_FUNC(4); }
 | 
			
		||||
            #if HOTENDS > 5
 | 
			
		||||
              void watch_temp_callback_E5() { _WATCH_FUNC(5); }
 | 
			
		||||
            #endif // HOTENDS > 5
 | 
			
		||||
          #endif // HOTENDS > 4
 | 
			
		||||
        #endif // HOTENDS > 3
 | 
			
		||||
      #endif // HOTENDS > 2
 | 
			
		||||
@ -1434,6 +1437,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
        inline void _lcd_refresh_e_factor_3() { planner.refresh_e_factor(3); }
 | 
			
		||||
        #if EXTRUDERS > 4
 | 
			
		||||
          inline void _lcd_refresh_e_factor_4() { planner.refresh_e_factor(4); }
 | 
			
		||||
          #if EXTRUDERS > 5
 | 
			
		||||
            inline void _lcd_refresh_e_factor_5() { planner.refresh_e_factor(5); }
 | 
			
		||||
          #endif // EXTRUDERS > 5
 | 
			
		||||
        #endif // EXTRUDERS > 4
 | 
			
		||||
      #endif // EXTRUDERS > 3
 | 
			
		||||
    #endif // EXTRUDERS > 2
 | 
			
		||||
@ -1486,6 +1492,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
          MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N4, &thermalManager.target_temperature[3], 0, HEATER_3_MAXTEMP - 15, watch_temp_callback_E3);
 | 
			
		||||
          #if HOTENDS > 4
 | 
			
		||||
            MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N5, &thermalManager.target_temperature[4], 0, HEATER_4_MAXTEMP - 15, watch_temp_callback_E4);
 | 
			
		||||
            #if HOTENDS > 5
 | 
			
		||||
              MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N6, &thermalManager.target_temperature[5], 0, HEATER_5_MAXTEMP - 15, watch_temp_callback_E5);
 | 
			
		||||
            #endif // HOTENDS > 5
 | 
			
		||||
          #endif // HOTENDS > 4
 | 
			
		||||
        #endif // HOTENDS > 3
 | 
			
		||||
      #endif // HOTENDS > 2
 | 
			
		||||
@ -1538,6 +1547,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
          MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW MSG_N4, &planner.flow_percentage[3], 10, 999, _lcd_refresh_e_factor_3);
 | 
			
		||||
          #if EXTRUDERS > 4
 | 
			
		||||
            MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW MSG_N5, &planner.flow_percentage[4], 10, 999, _lcd_refresh_e_factor_4);
 | 
			
		||||
            #if EXTRUDERS > 5
 | 
			
		||||
              MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW MSG_N6, &planner.flow_percentage[5], 10, 999, _lcd_refresh_e_factor_5);
 | 
			
		||||
            #endif // EXTRUDERS > 5
 | 
			
		||||
          #endif // EXTRUDERS > 4
 | 
			
		||||
        #endif // EXTRUDERS > 3
 | 
			
		||||
      #endif // EXTRUDERS > 2
 | 
			
		||||
@ -1672,6 +1684,14 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
            void lcd_preheat_m1_e4() { _lcd_preheat(4, lcd_preheat_hotend_temp[0], lcd_preheat_bed_temp[0], lcd_preheat_fan_speed[0]); }
 | 
			
		||||
            void lcd_preheat_m2_e4() { _lcd_preheat(4, lcd_preheat_hotend_temp[1], lcd_preheat_bed_temp[1], lcd_preheat_fan_speed[1]); }
 | 
			
		||||
          #endif
 | 
			
		||||
          #if HOTENDS > 5
 | 
			
		||||
            void lcd_preheat_m1_e5_only() { _lcd_preheat(5, lcd_preheat_hotend_temp[0], -1, lcd_preheat_fan_speed[0]); }
 | 
			
		||||
            void lcd_preheat_m2_e5_only() { _lcd_preheat(5, lcd_preheat_hotend_temp[1], -1, lcd_preheat_fan_speed[1]); }
 | 
			
		||||
            #if HAS_HEATED_BED
 | 
			
		||||
              void lcd_preheat_m1_e5() { _lcd_preheat(5, lcd_preheat_hotend_temp[0], lcd_preheat_bed_temp[0], lcd_preheat_fan_speed[0]); }
 | 
			
		||||
              void lcd_preheat_m2_e5() { _lcd_preheat(5, lcd_preheat_hotend_temp[1], lcd_preheat_bed_temp[1], lcd_preheat_fan_speed[1]); }
 | 
			
		||||
            #endif
 | 
			
		||||
          #endif // HOTENDS > 5
 | 
			
		||||
        #endif // HOTENDS > 4
 | 
			
		||||
      #endif // HOTENDS > 3
 | 
			
		||||
    #endif // HOTENDS > 2
 | 
			
		||||
@ -1685,6 +1705,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
            thermalManager.setTargetHotend(lcd_preheat_hotend_temp[0], 3);
 | 
			
		||||
            #if HOTENDS > 4
 | 
			
		||||
              thermalManager.setTargetHotend(lcd_preheat_hotend_temp[0], 4);
 | 
			
		||||
              #if HOTENDS > 5
 | 
			
		||||
                thermalManager.setTargetHotend(lcd_preheat_hotend_temp[0], 5);
 | 
			
		||||
              #endif // HOTENDS > 5
 | 
			
		||||
            #endif // HOTENDS > 4
 | 
			
		||||
          #endif // HOTENDS > 3
 | 
			
		||||
        #endif // HOTENDS > 2
 | 
			
		||||
@ -1704,6 +1727,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
            thermalManager.setTargetHotend(lcd_preheat_hotend_temp[1], 3);
 | 
			
		||||
            #if HOTENDS > 4
 | 
			
		||||
              thermalManager.setTargetHotend(lcd_preheat_hotend_temp[1], 4);
 | 
			
		||||
              #if HOTENDS > 5
 | 
			
		||||
                thermalManager.setTargetHotend(lcd_preheat_hotend_temp[1], 5);
 | 
			
		||||
              #endif // HOTENDS > 5
 | 
			
		||||
            #endif // HOTENDS > 4
 | 
			
		||||
          #endif // HOTENDS > 3
 | 
			
		||||
        #endif // HOTENDS > 2
 | 
			
		||||
@ -1765,6 +1791,14 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
              #else
 | 
			
		||||
                MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H5, lcd_preheat_m1_e4_only);
 | 
			
		||||
              #endif
 | 
			
		||||
              #if HOTENDS > 5
 | 
			
		||||
                #if HAS_HEATED_BED
 | 
			
		||||
                  MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H6, lcd_preheat_m1_e5);
 | 
			
		||||
                  MENU_ITEM(function, MSG_PREHEAT_1_END " " MSG_E6, lcd_preheat_m1_e5_only);
 | 
			
		||||
                #else
 | 
			
		||||
                  MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H6, lcd_preheat_m1_e5_only);
 | 
			
		||||
                #endif
 | 
			
		||||
              #endif // HOTENDS > 5
 | 
			
		||||
            #endif // HOTENDS > 4
 | 
			
		||||
          #endif // HOTENDS > 3
 | 
			
		||||
        #endif // HOTENDS > 2
 | 
			
		||||
@ -1817,6 +1851,14 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
              #else
 | 
			
		||||
                MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H5, lcd_preheat_m2_e4_only);
 | 
			
		||||
              #endif
 | 
			
		||||
              #if HOTENDS > 5
 | 
			
		||||
                #if HAS_HEATED_BED
 | 
			
		||||
                  MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H6, lcd_preheat_m2_e5);
 | 
			
		||||
                  MENU_ITEM(function, MSG_PREHEAT_2_END " " MSG_E6, lcd_preheat_m2_e5_only);
 | 
			
		||||
                #else
 | 
			
		||||
                  MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H6, lcd_preheat_m2_e5_only);
 | 
			
		||||
                #endif
 | 
			
		||||
              #endif // HOTENDS > 5
 | 
			
		||||
            #endif // HOTENDS > 4
 | 
			
		||||
          #endif // HOTENDS > 3
 | 
			
		||||
        #endif // HOTENDS > 2
 | 
			
		||||
@ -3061,6 +3103,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
              case 3: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E4); break;
 | 
			
		||||
              #if E_MANUAL > 4
 | 
			
		||||
                case 4: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E5); break;
 | 
			
		||||
                #if E_MANUAL > 5
 | 
			
		||||
                  case 5: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E6); break;
 | 
			
		||||
                #endif // E_MANUAL > 5
 | 
			
		||||
              #endif // E_MANUAL > 4
 | 
			
		||||
            #endif // E_MANUAL > 3
 | 
			
		||||
          #endif // E_MANUAL > 2
 | 
			
		||||
@ -3087,6 +3132,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
        void lcd_move_e3() { _lcd_move_e(3); }
 | 
			
		||||
        #if E_MANUAL > 4
 | 
			
		||||
          void lcd_move_e4() { _lcd_move_e(4); }
 | 
			
		||||
          #if E_MANUAL > 5
 | 
			
		||||
            void lcd_move_e5() { _lcd_move_e(5); }
 | 
			
		||||
          #endif // E_MANUAL > 5
 | 
			
		||||
        #endif // E_MANUAL > 4
 | 
			
		||||
      #endif // E_MANUAL > 3
 | 
			
		||||
    #endif // E_MANUAL > 2
 | 
			
		||||
@ -3147,6 +3195,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
        void lcd_move_get_e3_amount() { _lcd_move_distance_menu(E_AXIS, lcd_move_e3); }
 | 
			
		||||
        #if E_MANUAL > 4
 | 
			
		||||
          void lcd_move_get_e4_amount() { _lcd_move_distance_menu(E_AXIS, lcd_move_e4); }
 | 
			
		||||
          #if E_MANUAL > 5
 | 
			
		||||
            void lcd_move_get_e5_amount() { _lcd_move_distance_menu(E_AXIS, lcd_move_e5); }
 | 
			
		||||
          #endif // E_MANUAL > 5
 | 
			
		||||
        #endif // E_MANUAL > 4
 | 
			
		||||
      #endif // E_MANUAL > 3
 | 
			
		||||
    #endif // E_MANUAL > 2
 | 
			
		||||
@ -3199,7 +3250,16 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(SWITCHING_EXTRUDER) || ENABLED(SWITCHING_NOZZLE)
 | 
			
		||||
 | 
			
		||||
      #if EXTRUDERS == 4
 | 
			
		||||
      #if EXTRUDERS == 6
 | 
			
		||||
        switch (active_extruder) {
 | 
			
		||||
          case 0: MENU_ITEM(gcode, MSG_SELECT " " MSG_E2, PSTR("T1")); break;
 | 
			
		||||
          case 1: MENU_ITEM(gcode, MSG_SELECT " " MSG_E1, PSTR("T0")); break;
 | 
			
		||||
          case 2: MENU_ITEM(gcode, MSG_SELECT " " MSG_E4, PSTR("T3")); break;
 | 
			
		||||
          case 3: MENU_ITEM(gcode, MSG_SELECT " " MSG_E3, PSTR("T2")); break;
 | 
			
		||||
          case 4: MENU_ITEM(gcode, MSG_SELECT " " MSG_E6, PSTR("T5")); break;
 | 
			
		||||
          case 5: MENU_ITEM(gcode, MSG_SELECT " " MSG_E5, PSTR("T4")); break;
 | 
			
		||||
        }
 | 
			
		||||
      #elif EXTRUDERS == 5 || EXTRUDERS == 4
 | 
			
		||||
        switch (active_extruder) {
 | 
			
		||||
          case 0: MENU_ITEM(gcode, MSG_SELECT " " MSG_E2, PSTR("T1")); break;
 | 
			
		||||
          case 1: MENU_ITEM(gcode, MSG_SELECT " " MSG_E1, PSTR("T0")); break;
 | 
			
		||||
@ -3253,6 +3313,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
            MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E4, lcd_move_get_e3_amount);
 | 
			
		||||
            #if E_MANUAL > 4
 | 
			
		||||
              MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E5, lcd_move_get_e4_amount);
 | 
			
		||||
              #if E_MANUAL > 5
 | 
			
		||||
                MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E6, lcd_move_get_e5_amount);
 | 
			
		||||
              #endif // E_MANUAL > 5
 | 
			
		||||
            #endif // E_MANUAL > 4
 | 
			
		||||
          #endif // E_MANUAL > 3
 | 
			
		||||
        #endif // E_MANUAL > 2
 | 
			
		||||
@ -3412,6 +3475,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
            DEFINE_PIDTEMP_FUNCS(3);
 | 
			
		||||
            #if HOTENDS > 4
 | 
			
		||||
              DEFINE_PIDTEMP_FUNCS(4);
 | 
			
		||||
              #if HOTENDS > 5
 | 
			
		||||
                DEFINE_PIDTEMP_FUNCS(5);
 | 
			
		||||
              #endif // HOTENDS > 5
 | 
			
		||||
            #endif // HOTENDS > 4
 | 
			
		||||
          #endif // HOTENDS > 3
 | 
			
		||||
        #endif // HOTENDS > 2
 | 
			
		||||
@ -3444,6 +3510,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
          MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N4, &thermalManager.target_temperature[3], 0, HEATER_3_MAXTEMP - 15, watch_temp_callback_E3);
 | 
			
		||||
          #if HOTENDS > 4
 | 
			
		||||
            MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N5, &thermalManager.target_temperature[4], 0, HEATER_4_MAXTEMP - 15, watch_temp_callback_E4);
 | 
			
		||||
            #if HOTENDS > 5
 | 
			
		||||
              MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N6, &thermalManager.target_temperature[5], 0, HEATER_5_MAXTEMP - 15, watch_temp_callback_E5);
 | 
			
		||||
            #endif // HOTENDS > 5
 | 
			
		||||
          #endif // HOTENDS > 4
 | 
			
		||||
        #endif // HOTENDS > 3
 | 
			
		||||
      #endif // HOTENDS > 2
 | 
			
		||||
@ -3568,6 +3637,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
            PID_MENU_ITEMS(" " MSG_E4, 3);
 | 
			
		||||
            #if HOTENDS > 4
 | 
			
		||||
              PID_MENU_ITEMS(" " MSG_E5, 4);
 | 
			
		||||
              #if HOTENDS > 5
 | 
			
		||||
                PID_MENU_ITEMS(" " MSG_E6, 5);
 | 
			
		||||
              #endif // HOTENDS > 5
 | 
			
		||||
            #endif // HOTENDS > 4
 | 
			
		||||
          #endif // HOTENDS > 3
 | 
			
		||||
        #endif // HOTENDS > 2
 | 
			
		||||
@ -3583,7 +3655,10 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
  #if DISABLED(SLIM_LCD_MENUS)
 | 
			
		||||
 | 
			
		||||
    void _lcd_configuration_temperature_preheat_settings_menu(const uint8_t material) {
 | 
			
		||||
      #if HOTENDS > 4
 | 
			
		||||
      #if HOTENDS > 5
 | 
			
		||||
        #define MINTEMP_ALL MIN5(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP, HEATER_4_MINTEMP, HEATER_5_MINTEMP)
 | 
			
		||||
        #define MAXTEMP_ALL MAX5(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP)
 | 
			
		||||
      #elif HOTENDS > 4
 | 
			
		||||
        #define MINTEMP_ALL MIN5(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP, HEATER_4_MINTEMP)
 | 
			
		||||
        #define MAXTEMP_ALL MAX5(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP)
 | 
			
		||||
      #elif HOTENDS > 3
 | 
			
		||||
@ -3639,6 +3714,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
          void _reset_e3_acceleration_rate() { _reset_e_acceleration_rate(3); }
 | 
			
		||||
          #if E_STEPPERS > 4
 | 
			
		||||
            void _reset_e4_acceleration_rate() { _reset_e_acceleration_rate(4); }
 | 
			
		||||
            #if E_STEPPERS > 5
 | 
			
		||||
              void _reset_e5_acceleration_rate() { _reset_e_acceleration_rate(5); }
 | 
			
		||||
            #endif // E_STEPPERS > 5
 | 
			
		||||
          #endif // E_STEPPERS > 4
 | 
			
		||||
        #endif // E_STEPPERS > 3
 | 
			
		||||
      #endif // E_STEPPERS > 2
 | 
			
		||||
@ -3660,6 +3738,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
          void _planner_refresh_e3_positioning() { _planner_refresh_e_positioning(3); }
 | 
			
		||||
          #if E_STEPPERS > 4
 | 
			
		||||
            void _planner_refresh_e4_positioning() { _planner_refresh_e_positioning(4); }
 | 
			
		||||
            #if E_STEPPERS > 5
 | 
			
		||||
              void _planner_refresh_e5_positioning() { _planner_refresh_e_positioning(5); }
 | 
			
		||||
            #endif // E_STEPPERS > 5
 | 
			
		||||
          #endif // E_STEPPERS > 4
 | 
			
		||||
        #endif // E_STEPPERS > 3
 | 
			
		||||
      #endif // E_STEPPERS > 2
 | 
			
		||||
@ -3685,6 +3766,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
            MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E4, &planner.max_feedrate_mm_s[E_AXIS + 3], 1, 999);
 | 
			
		||||
            #if E_STEPPERS > 4
 | 
			
		||||
              MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E5, &planner.max_feedrate_mm_s[E_AXIS + 4], 1, 999);
 | 
			
		||||
              #if E_STEPPERS > 5
 | 
			
		||||
                MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E6, &planner.max_feedrate_mm_s[E_AXIS + 5], 1, 999);
 | 
			
		||||
              #endif // E_STEPPERS > 5
 | 
			
		||||
            #endif // E_STEPPERS > 4
 | 
			
		||||
          #endif // E_STEPPERS > 3
 | 
			
		||||
        #endif // E_STEPPERS > 2
 | 
			
		||||
@ -3730,6 +3814,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
            MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E4, &planner.max_acceleration_mm_per_s2[E_AXIS + 3], 100, 99000, _reset_e3_acceleration_rate);
 | 
			
		||||
            #if E_STEPPERS > 4
 | 
			
		||||
              MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E5, &planner.max_acceleration_mm_per_s2[E_AXIS + 4], 100, 99000, _reset_e4_acceleration_rate);
 | 
			
		||||
              #if E_STEPPERS > 5
 | 
			
		||||
                MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E6, &planner.max_acceleration_mm_per_s2[E_AXIS + 5], 100, 99000, _reset_e5_acceleration_rate);
 | 
			
		||||
              #endif // E_STEPPERS > 5
 | 
			
		||||
            #endif // E_STEPPERS > 4
 | 
			
		||||
          #endif // E_STEPPERS > 3
 | 
			
		||||
        #endif // E_STEPPERS > 2
 | 
			
		||||
@ -3787,6 +3874,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
            MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E4STEPS, &planner.axis_steps_per_mm[E_AXIS + 3], 5, 9999, _planner_refresh_e3_positioning);
 | 
			
		||||
            #if E_STEPPERS > 4
 | 
			
		||||
              MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E5STEPS, &planner.axis_steps_per_mm[E_AXIS + 4], 5, 9999, _planner_refresh_e4_positioning);
 | 
			
		||||
              #if E_STEPPERS > 5
 | 
			
		||||
                MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E6STEPS, &planner.axis_steps_per_mm[E_AXIS + 5], 5, 9999, _planner_refresh_e5_positioning);
 | 
			
		||||
              #endif // E_STEPPERS > 5
 | 
			
		||||
            #endif // E_STEPPERS > 4
 | 
			
		||||
          #endif // E_STEPPERS > 3
 | 
			
		||||
        #endif // E_STEPPERS > 2
 | 
			
		||||
@ -3865,6 +3955,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
            MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E4, &planner.extruder_advance_K[3], 0, 999);
 | 
			
		||||
            #if EXTRUDERS > 4
 | 
			
		||||
              MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E5, &planner.extruder_advance_K[4], 0, 999);
 | 
			
		||||
              #if EXTRUDERS > 5
 | 
			
		||||
                MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E6, &planner.extruder_advance_K[5], 0, 999);
 | 
			
		||||
              #endif // EXTRUDERS > 5
 | 
			
		||||
            #endif // EXTRUDERS > 4
 | 
			
		||||
          #endif // EXTRUDERS > 3
 | 
			
		||||
        #endif // EXTRUDERS > 2
 | 
			
		||||
@ -3914,6 +4007,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
              MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E4, &planner.extruder_advance_K[3], 0, 999);
 | 
			
		||||
              #if EXTRUDERS > 4
 | 
			
		||||
                MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E5, &planner.extruder_advance_K[4], 0, 999);
 | 
			
		||||
                #if EXTRUDERS > 5
 | 
			
		||||
                  MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E6, &planner.extruder_advance_K[5], 0, 999);
 | 
			
		||||
                #endif // EXTRUDERS > 5
 | 
			
		||||
              #endif // EXTRUDERS > 4
 | 
			
		||||
            #endif // EXTRUDERS > 3
 | 
			
		||||
          #endif // EXTRUDERS > 2
 | 
			
		||||
@ -3932,10 +4028,13 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
            MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E2, &planner.filament_size[1], 1.5f, 3.25f, planner.calculate_volumetric_multipliers);
 | 
			
		||||
            #if EXTRUDERS > 2
 | 
			
		||||
              MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E3, &planner.filament_size[2], 1.5f, 3.25f, planner.calculate_volumetric_multipliers);
 | 
			
		||||
            #if EXTRUDERS > 3
 | 
			
		||||
              MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E4, &planner.filament_size[3], 1.5f, 3.25f, planner.calculate_volumetric_multipliers);
 | 
			
		||||
              #if EXTRUDERS > 4
 | 
			
		||||
              #if EXTRUDERS > 3
 | 
			
		||||
                MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E4, &planner.filament_size[3], 1.5f, 3.25f, planner.calculate_volumetric_multipliers);
 | 
			
		||||
                #if EXTRUDERS > 4
 | 
			
		||||
                  MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E5, &planner.filament_size[4], 1.5f, 3.25f, planner.calculate_volumetric_multipliers);
 | 
			
		||||
                  #if EXTRUDERS > 5
 | 
			
		||||
                    MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E6, &planner.filament_size[5], 1.5f, 3.25f, planner.calculate_volumetric_multipliers);
 | 
			
		||||
                  #endif // EXTRUDERS > 5
 | 
			
		||||
                #endif // EXTRUDERS > 4
 | 
			
		||||
              #endif // EXTRUDERS > 3
 | 
			
		||||
            #endif // EXTRUDERS > 2
 | 
			
		||||
@ -3960,10 +4059,13 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
          MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E2, &filament_change_unload_length[1], 0, extrude_maxlength);
 | 
			
		||||
          #if EXTRUDERS > 2
 | 
			
		||||
            MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E3, &filament_change_unload_length[2], 0, extrude_maxlength);
 | 
			
		||||
          #if EXTRUDERS > 3
 | 
			
		||||
            MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E4, &filament_change_unload_length[3], 0, extrude_maxlength);
 | 
			
		||||
            #if EXTRUDERS > 4
 | 
			
		||||
            #if EXTRUDERS > 3
 | 
			
		||||
              MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E4, &filament_change_unload_length[3], 0, extrude_maxlength);
 | 
			
		||||
              #if EXTRUDERS > 4
 | 
			
		||||
                MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E5, &filament_change_unload_length[4], 0, extrude_maxlength);
 | 
			
		||||
                #if EXTRUDERS > 5
 | 
			
		||||
                  MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E6, &filament_change_unload_length[5], 0, extrude_maxlength);
 | 
			
		||||
                #endif // EXTRUDERS > 5
 | 
			
		||||
              #endif // EXTRUDERS > 4
 | 
			
		||||
            #endif // EXTRUDERS > 3
 | 
			
		||||
          #endif // EXTRUDERS > 2
 | 
			
		||||
@ -3977,10 +4079,13 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
          MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E2, &filament_change_load_length[1], 0, extrude_maxlength);
 | 
			
		||||
          #if EXTRUDERS > 2
 | 
			
		||||
            MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E3, &filament_change_load_length[2], 0, extrude_maxlength);
 | 
			
		||||
          #if EXTRUDERS > 3
 | 
			
		||||
            MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E4, &filament_change_load_length[3], 0, extrude_maxlength);
 | 
			
		||||
            #if EXTRUDERS > 4
 | 
			
		||||
            #if EXTRUDERS > 3
 | 
			
		||||
              MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E4, &filament_change_load_length[3], 0, extrude_maxlength);
 | 
			
		||||
              #if EXTRUDERS > 4
 | 
			
		||||
                MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E5, &filament_change_load_length[4], 0, extrude_maxlength);
 | 
			
		||||
                #if EXTRUDERS > 5
 | 
			
		||||
                  MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E6, &filament_change_load_length[5], 0, extrude_maxlength);
 | 
			
		||||
                #endif // EXTRUDERS > 5
 | 
			
		||||
              #endif // EXTRUDERS > 4
 | 
			
		||||
            #endif // EXTRUDERS > 3
 | 
			
		||||
          #endif // EXTRUDERS > 2
 | 
			
		||||
@ -4405,6 +4510,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
              case 3: max_temp = HEATER_3_MAXTEMP; break;
 | 
			
		||||
              #if HOTENDS > 4
 | 
			
		||||
                case 4: max_temp = HEATER_4_MAXTEMP; break;
 | 
			
		||||
                #if HOTENDS > 5
 | 
			
		||||
                  case 5: max_temp = HEATER_5_MAXTEMP; break;
 | 
			
		||||
                #endif
 | 
			
		||||
              #endif
 | 
			
		||||
            #endif
 | 
			
		||||
          #endif
 | 
			
		||||
@ -4486,6 +4594,13 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
                  MENU_ITEM_P(submenu, msg4, lcd_temp_menu_e4_filament_change);
 | 
			
		||||
                else
 | 
			
		||||
                  MENU_ITEM_P(gcode, msg4, PSTR("M600 B0 T4"));
 | 
			
		||||
                #if E_STEPPERS > 5
 | 
			
		||||
                  PGM_P msg5 = PSTR(MSG_FILAMENTCHANGE " " MSG_E6);
 | 
			
		||||
                  if (thermalManager.targetTooColdToExtrude(5))
 | 
			
		||||
                    MENU_ITEM_P(submenu, msg5, lcd_temp_menu_e5_filament_change);
 | 
			
		||||
                  else
 | 
			
		||||
                    MENU_ITEM_P(gcode, msg5, PSTR("M600 B0 T5"));
 | 
			
		||||
                #endif // E_STEPPERS > 5
 | 
			
		||||
              #endif // E_STEPPERS > 4
 | 
			
		||||
            #endif // E_STEPPERS > 3
 | 
			
		||||
          #endif // E_STEPPERS > 2
 | 
			
		||||
@ -4529,6 +4644,13 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
                      MENU_ITEM_P(submenu, msg4, lcd_temp_menu_e4_filament_load);
 | 
			
		||||
                    else
 | 
			
		||||
                      MENU_ITEM_P(gcode, msg4, PSTR("M701 T4"));
 | 
			
		||||
                    #if E_STEPPERS > 5
 | 
			
		||||
                      PGM_P msg5 = PSTR(MSG_FILAMENTLOAD " " MSG_E6);
 | 
			
		||||
                      if (thermalManager.targetTooColdToExtrude(5))
 | 
			
		||||
                        MENU_ITEM_P(submenu, msg5, lcd_temp_menu_e5_filament_load);
 | 
			
		||||
                      else
 | 
			
		||||
                        MENU_ITEM_P(gcode, msg5, PSTR("M701 T5"));
 | 
			
		||||
                    #endif // E_STEPPERS > 5
 | 
			
		||||
                  #endif // E_STEPPERS > 4
 | 
			
		||||
                #endif // E_STEPPERS > 3
 | 
			
		||||
              #endif // E_STEPPERS > 2
 | 
			
		||||
@ -4551,6 +4673,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
                        && thermalManager.targetHotEnoughToExtrude(3)
 | 
			
		||||
                        #if E_STEPPERS > 4
 | 
			
		||||
                          && thermalManager.targetHotEnoughToExtrude(4)
 | 
			
		||||
                          #if E_STEPPERS > 5
 | 
			
		||||
                            && thermalManager.targetHotEnoughToExtrude(5)
 | 
			
		||||
                          #endif // E_STEPPERS > 5
 | 
			
		||||
                        #endif // E_STEPPERS > 4
 | 
			
		||||
                      #endif // E_STEPPERS > 3
 | 
			
		||||
                    #endif // E_STEPPERS > 2
 | 
			
		||||
@ -4583,6 +4708,12 @@ void lcd_quick_feedback(const bool clear_buttons) {
 | 
			
		||||
                      MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E5, PSTR("M702 T4"));
 | 
			
		||||
                    else
 | 
			
		||||
                      MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E5, lcd_temp_menu_e4_filament_unload);
 | 
			
		||||
                    #if E_STEPPERS > 5
 | 
			
		||||
                      if (thermalManager.targetHotEnoughToExtrude(5))
 | 
			
		||||
                        MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E6, PSTR("M702 T5"));
 | 
			
		||||
                      else
 | 
			
		||||
                        MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E6, lcd_temp_menu_e5_filament_unload);
 | 
			
		||||
                    #endif // E_STEPPERS > 5
 | 
			
		||||
                  #endif // E_STEPPERS > 4
 | 
			
		||||
                #endif // E_STEPPERS > 3
 | 
			
		||||
              #endif // E_STEPPERS > 2
 | 
			
		||||
 | 
			
		||||
@ -37,7 +37,7 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
// Change EEPROM version if the structure changes
 | 
			
		||||
#define EEPROM_VERSION "V57"
 | 
			
		||||
#define EEPROM_VERSION "V58"
 | 
			
		||||
#define EEPROM_OFFSET 100
 | 
			
		||||
 | 
			
		||||
// Check the integrity of data offsets.
 | 
			
		||||
@ -213,7 +213,7 @@ typedef struct SettingsDataStruct {
 | 
			
		||||
  //
 | 
			
		||||
  // PIDTEMP
 | 
			
		||||
  //
 | 
			
		||||
  PIDC hotendPID[MAX_EXTRUDERS];                        // M301 En PIDC / M303 En U
 | 
			
		||||
  PIDC hotendPID[HOTENDS];                              // M301 En PIDC / M303 En U
 | 
			
		||||
 | 
			
		||||
  int16_t lpq_len;                                      // M301 L
 | 
			
		||||
 | 
			
		||||
@ -244,14 +244,14 @@ typedef struct SettingsDataStruct {
 | 
			
		||||
  // !NO_VOLUMETRIC
 | 
			
		||||
  //
 | 
			
		||||
  bool parser_volumetric_enabled;                       // M200 D  parser.volumetric_enabled
 | 
			
		||||
  float planner_filament_size[MAX_EXTRUDERS];           // M200 T D  planner.filament_size[]
 | 
			
		||||
  float planner_filament_size[EXTRUDERS];               // M200 T D  planner.filament_size[]
 | 
			
		||||
 | 
			
		||||
  //
 | 
			
		||||
  // HAS_TRINAMIC
 | 
			
		||||
  //
 | 
			
		||||
  #define TMC_AXES (MAX_EXTRUDERS + 7)
 | 
			
		||||
  uint16_t tmc_stepper_current[TMC_AXES];               // M906 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4
 | 
			
		||||
  uint32_t tmc_hybrid_threshold[TMC_AXES];              // M913 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4
 | 
			
		||||
  uint16_t tmc_stepper_current[TMC_AXES];               // M906 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4 E5
 | 
			
		||||
  uint32_t tmc_hybrid_threshold[TMC_AXES];              // M913 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4 E5
 | 
			
		||||
  int16_t tmc_sgt[XYZ];                                 // M914 X Y Z
 | 
			
		||||
 | 
			
		||||
  //
 | 
			
		||||
@ -279,8 +279,8 @@ typedef struct SettingsDataStruct {
 | 
			
		||||
  //
 | 
			
		||||
  // ADVANCED_PAUSE_FEATURE
 | 
			
		||||
  //
 | 
			
		||||
  float filament_change_unload_length[MAX_EXTRUDERS],   // M603 T U
 | 
			
		||||
        filament_change_load_length[MAX_EXTRUDERS];     // M603 T L
 | 
			
		||||
  float filament_change_unload_length[EXTRUDERS],       // M603 T U
 | 
			
		||||
        filament_change_load_length[EXTRUDERS];         // M603 T L
 | 
			
		||||
 | 
			
		||||
} SettingsData;
 | 
			
		||||
 | 
			
		||||
@ -629,29 +629,23 @@ void MarlinSettings::postprocess() {
 | 
			
		||||
    EEPROM_WRITE(lcd_preheat_bed_temp);
 | 
			
		||||
    EEPROM_WRITE(lcd_preheat_fan_speed);
 | 
			
		||||
 | 
			
		||||
    for (uint8_t e = 0; e < MAX_EXTRUDERS; e++) {
 | 
			
		||||
 | 
			
		||||
    for (uint8_t e = 0; e < HOTENDS; e++) {
 | 
			
		||||
      #if ENABLED(PIDTEMP)
 | 
			
		||||
        if (e < HOTENDS) {
 | 
			
		||||
          EEPROM_WRITE(PID_PARAM(Kp, e));
 | 
			
		||||
          EEPROM_WRITE(PID_PARAM(Ki, e));
 | 
			
		||||
          EEPROM_WRITE(PID_PARAM(Kd, e));
 | 
			
		||||
          #if ENABLED(PID_EXTRUSION_SCALING)
 | 
			
		||||
            EEPROM_WRITE(PID_PARAM(Kc, e));
 | 
			
		||||
          #else
 | 
			
		||||
            dummy = 1.0f; // 1.0 = default kc
 | 
			
		||||
            EEPROM_WRITE(dummy);
 | 
			
		||||
          #endif
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
      #endif // !PIDTEMP
 | 
			
		||||
        {
 | 
			
		||||
          dummy = DUMMY_PID_VALUE; // When read, will not change the existing value
 | 
			
		||||
          EEPROM_WRITE(dummy); // Kp
 | 
			
		||||
          dummy = 0;
 | 
			
		||||
          for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy); // Ki, Kd, Kc
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        EEPROM_WRITE(PID_PARAM(Kp, e));
 | 
			
		||||
        EEPROM_WRITE(PID_PARAM(Ki, e));
 | 
			
		||||
        EEPROM_WRITE(PID_PARAM(Kd, e));
 | 
			
		||||
        #if ENABLED(PID_EXTRUSION_SCALING)
 | 
			
		||||
          EEPROM_WRITE(PID_PARAM(Kc, e));
 | 
			
		||||
        #else
 | 
			
		||||
          dummy = 1.0f; // 1.0 = default kc
 | 
			
		||||
          EEPROM_WRITE(dummy);
 | 
			
		||||
        #endif
 | 
			
		||||
      #else
 | 
			
		||||
        dummy = DUMMY_PID_VALUE; // When read, will not change the existing value
 | 
			
		||||
        EEPROM_WRITE(dummy); // Kp
 | 
			
		||||
        dummy = 0;
 | 
			
		||||
        for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy); // Ki, Kd, Kc
 | 
			
		||||
      #endif
 | 
			
		||||
    } // Hotends Loop
 | 
			
		||||
 | 
			
		||||
    _FIELD_TEST(lpq_len);
 | 
			
		||||
@ -705,17 +699,15 @@ void MarlinSettings::postprocess() {
 | 
			
		||||
      EEPROM_WRITE(parser.volumetric_enabled);
 | 
			
		||||
 | 
			
		||||
      // Save filament sizes
 | 
			
		||||
      for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
 | 
			
		||||
        if (q < COUNT(planner.filament_size)) dummy = planner.filament_size[q];
 | 
			
		||||
        EEPROM_WRITE(dummy);
 | 
			
		||||
      }
 | 
			
		||||
      for (uint8_t q = 0; q < COUNT(planner.filament_size); q++)
 | 
			
		||||
        EEPROM_WRITE(planner.filament_size[q]);
 | 
			
		||||
 | 
			
		||||
    #else
 | 
			
		||||
 | 
			
		||||
      const bool volumetric_enabled = false;
 | 
			
		||||
      dummy = DEFAULT_NOMINAL_FILAMENT_DIA;
 | 
			
		||||
      EEPROM_WRITE(volumetric_enabled);
 | 
			
		||||
      for (uint8_t q = MAX_EXTRUDERS; q--;) EEPROM_WRITE(dummy);
 | 
			
		||||
      for (uint8_t q = EXTRUDERS; q--;) EEPROM_WRITE(dummy);
 | 
			
		||||
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
@ -762,31 +754,48 @@ void MarlinSettings::postprocess() {
 | 
			
		||||
        #else
 | 
			
		||||
          0,
 | 
			
		||||
        #endif
 | 
			
		||||
        #if AXIS_IS_TMC(E0)
 | 
			
		||||
          stepperE0.getCurrent(),
 | 
			
		||||
        #else
 | 
			
		||||
          0,
 | 
			
		||||
        #endif
 | 
			
		||||
        #if AXIS_IS_TMC(E1)
 | 
			
		||||
          stepperE1.getCurrent(),
 | 
			
		||||
        #else
 | 
			
		||||
          0,
 | 
			
		||||
        #endif
 | 
			
		||||
        #if AXIS_IS_TMC(E2)
 | 
			
		||||
          stepperE2.getCurrent(),
 | 
			
		||||
        #else
 | 
			
		||||
          0,
 | 
			
		||||
        #endif
 | 
			
		||||
        #if AXIS_IS_TMC(E3)
 | 
			
		||||
          stepperE3.getCurrent(),
 | 
			
		||||
        #else
 | 
			
		||||
          0,
 | 
			
		||||
        #endif
 | 
			
		||||
        #if AXIS_IS_TMC(E4)
 | 
			
		||||
          stepperE4.getCurrent()
 | 
			
		||||
        #else
 | 
			
		||||
          0
 | 
			
		||||
        #endif
 | 
			
		||||
        #if MAX_EXTRUDERS
 | 
			
		||||
          #if AXIS_IS_TMC(E0)
 | 
			
		||||
            stepperE0.getCurrent(),
 | 
			
		||||
          #else
 | 
			
		||||
            0,
 | 
			
		||||
          #endif
 | 
			
		||||
          #if MAX_EXTRUDERS > 1
 | 
			
		||||
            #if AXIS_IS_TMC(E1)
 | 
			
		||||
              stepperE1.getCurrent(),
 | 
			
		||||
            #else
 | 
			
		||||
              0,
 | 
			
		||||
            #endif
 | 
			
		||||
            #if MAX_EXTRUDERS > 2
 | 
			
		||||
              #if AXIS_IS_TMC(E2)
 | 
			
		||||
                stepperE2.getCurrent(),
 | 
			
		||||
              #else
 | 
			
		||||
                0,
 | 
			
		||||
              #endif
 | 
			
		||||
              #if MAX_EXTRUDERS > 3
 | 
			
		||||
                  #if AXIS_IS_TMC(E3)
 | 
			
		||||
                  stepperE3.getCurrent(),
 | 
			
		||||
                #else
 | 
			
		||||
                  0,
 | 
			
		||||
                #endif
 | 
			
		||||
                #if MAX_EXTRUDERS > 4
 | 
			
		||||
                  #if AXIS_IS_TMC(E4)
 | 
			
		||||
                    stepperE4.getCurrent()
 | 
			
		||||
                  #else
 | 
			
		||||
                    0
 | 
			
		||||
                  #endif
 | 
			
		||||
                  #if MAX_EXTRUDERS > 5
 | 
			
		||||
                    #if AXIS_IS_TMC(E5)
 | 
			
		||||
                      stepperE5.getCurrent()
 | 
			
		||||
                    #else
 | 
			
		||||
                      0
 | 
			
		||||
                    #endif
 | 
			
		||||
                  #endif // MAX_EXTRUDERS > 5
 | 
			
		||||
                #endif // MAX_EXTRUDERS > 4
 | 
			
		||||
              #endif // MAX_EXTRUDERS > 3
 | 
			
		||||
            #endif // MAX_EXTRUDERS > 2
 | 
			
		||||
          #endif // MAX_EXTRUDERS > 1
 | 
			
		||||
        #endif // MAX_EXTRUDERS
 | 
			
		||||
      #else
 | 
			
		||||
        0
 | 
			
		||||
      #endif
 | 
			
		||||
@ -836,35 +845,69 @@ void MarlinSettings::postprocess() {
 | 
			
		||||
        #else
 | 
			
		||||
          Z3_HYBRID_THRESHOLD,
 | 
			
		||||
        #endif
 | 
			
		||||
        #if AXIS_HAS_STEALTHCHOP(E0)
 | 
			
		||||
          TMC_GET_PWMTHRS(E, E0),
 | 
			
		||||
        #else
 | 
			
		||||
          E0_HYBRID_THRESHOLD,
 | 
			
		||||
        #endif
 | 
			
		||||
        #if AXIS_HAS_STEALTHCHOP(E1)
 | 
			
		||||
          TMC_GET_PWMTHRS(E, E1),
 | 
			
		||||
        #else
 | 
			
		||||
          E1_HYBRID_THRESHOLD,
 | 
			
		||||
        #endif
 | 
			
		||||
        #if AXIS_HAS_STEALTHCHOP(E2)
 | 
			
		||||
          TMC_GET_PWMTHRS(E, E2),
 | 
			
		||||
        #else
 | 
			
		||||
          E2_HYBRID_THRESHOLD,
 | 
			
		||||
        #endif
 | 
			
		||||
        #if AXIS_HAS_STEALTHCHOP(E3)
 | 
			
		||||
          TMC_GET_PWMTHRS(E, E3),
 | 
			
		||||
        #else
 | 
			
		||||
          E3_HYBRID_THRESHOLD,
 | 
			
		||||
        #endif
 | 
			
		||||
        #if AXIS_HAS_STEALTHCHOP(E4)
 | 
			
		||||
          TMC_GET_PWMTHRS(E, E4)
 | 
			
		||||
        #else
 | 
			
		||||
          E4_HYBRID_THRESHOLD
 | 
			
		||||
        #endif
 | 
			
		||||
        #if MAX_EXTRUDERS
 | 
			
		||||
          #if AXIS_HAS_STEALTHCHOP(E0)
 | 
			
		||||
            TMC_GET_PWMTHRS(E, E0),
 | 
			
		||||
          #else
 | 
			
		||||
            E0_HYBRID_THRESHOLD,
 | 
			
		||||
          #endif
 | 
			
		||||
          #if MAX_EXTRUDERS > 1
 | 
			
		||||
            #if AXIS_HAS_STEALTHCHOP(E1)
 | 
			
		||||
              TMC_GET_PWMTHRS(E, E1),
 | 
			
		||||
            #else
 | 
			
		||||
              E1_HYBRID_THRESHOLD,
 | 
			
		||||
            #endif
 | 
			
		||||
            #if MAX_EXTRUDERS > 2
 | 
			
		||||
              #if AXIS_HAS_STEALTHCHOP(E2)
 | 
			
		||||
                TMC_GET_PWMTHRS(E, E2),
 | 
			
		||||
              #else
 | 
			
		||||
                E2_HYBRID_THRESHOLD,
 | 
			
		||||
              #endif
 | 
			
		||||
              #if MAX_EXTRUDERS > 3
 | 
			
		||||
                #if AXIS_HAS_STEALTHCHOP(E3)
 | 
			
		||||
                  TMC_GET_PWMTHRS(E, E3),
 | 
			
		||||
                #else
 | 
			
		||||
                  E3_HYBRID_THRESHOLD,
 | 
			
		||||
                #endif
 | 
			
		||||
                #if MAX_EXTRUDERS > 4
 | 
			
		||||
                  #if AXIS_HAS_STEALTHCHOP(E4)
 | 
			
		||||
                    TMC_GET_PWMTHRS(E, E4)
 | 
			
		||||
                  #else
 | 
			
		||||
                    E4_HYBRID_THRESHOLD
 | 
			
		||||
                  #endif
 | 
			
		||||
                  #if MAX_EXTRUDERS > 5
 | 
			
		||||
                    #if AXIS_HAS_STEALTHCHOP(E5)
 | 
			
		||||
                      TMC_GET_PWMTHRS(E, E5)
 | 
			
		||||
                    #else
 | 
			
		||||
                      E5_HYBRID_THRESHOLD
 | 
			
		||||
                    #endif
 | 
			
		||||
                  #endif // MAX_EXTRUDERS > 5
 | 
			
		||||
                #endif // MAX_EXTRUDERS > 4
 | 
			
		||||
              #endif // MAX_EXTRUDERS > 3
 | 
			
		||||
            #endif // MAX_EXTRUDERS > 2
 | 
			
		||||
          #endif // MAX_EXTRUDERS > 1
 | 
			
		||||
        #endif // MAX_EXTRUDERS
 | 
			
		||||
      #else
 | 
			
		||||
        100, 100, 3,          // X, Y, Z
 | 
			
		||||
        100, 100, 3, 3,       // X2, Y2, Z2, Z3
 | 
			
		||||
        30, 30, 30, 30, 30    // E0, E1, E2, E3, E4
 | 
			
		||||
        100, 100, 3,            // X, Y, Z
 | 
			
		||||
        100, 100, 3, 3          // X2, Y2, Z2, Z3
 | 
			
		||||
        #if MAX_EXTRUDERS
 | 
			
		||||
          , 30                  // E0
 | 
			
		||||
          #if MAX_EXTRUDERS > 1
 | 
			
		||||
            , 30                // E1
 | 
			
		||||
            #if MAX_EXTRUDERS > 2
 | 
			
		||||
              , 30              // E2
 | 
			
		||||
              #if MAX_EXTRUDERS > 3
 | 
			
		||||
                , 30            // E3
 | 
			
		||||
                #if MAX_EXTRUDERS > 4
 | 
			
		||||
                  , 30          // E4
 | 
			
		||||
                  #if MAX_EXTRUDERS > 5
 | 
			
		||||
                    , 30        // E5
 | 
			
		||||
                  #endif
 | 
			
		||||
                #endif
 | 
			
		||||
              #endif
 | 
			
		||||
            #endif
 | 
			
		||||
          #endif
 | 
			
		||||
        #endif
 | 
			
		||||
      #endif
 | 
			
		||||
    };
 | 
			
		||||
    EEPROM_WRITE(tmc_hybrid_threshold);
 | 
			
		||||
@ -951,17 +994,13 @@ void MarlinSettings::postprocess() {
 | 
			
		||||
    _FIELD_TEST(filament_change_unload_length);
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(ADVANCED_PAUSE_FEATURE)
 | 
			
		||||
      for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
 | 
			
		||||
        if (q < COUNT(filament_change_unload_length)) dummy = filament_change_unload_length[q];
 | 
			
		||||
        EEPROM_WRITE(dummy);
 | 
			
		||||
      }
 | 
			
		||||
      for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
 | 
			
		||||
        if (q < COUNT(filament_change_load_length)) dummy = filament_change_load_length[q];
 | 
			
		||||
        EEPROM_WRITE(dummy);
 | 
			
		||||
      for (uint8_t q = 0; q < COUNT(filament_change_unload_length); q++) {
 | 
			
		||||
        EEPROM_WRITE(filament_change_unload_length[q]);
 | 
			
		||||
        EEPROM_WRITE(filament_change_load_length[q]);
 | 
			
		||||
      }
 | 
			
		||||
    #else
 | 
			
		||||
      dummy = 0;
 | 
			
		||||
      for (uint8_t q = MAX_EXTRUDERS * 2; q--;) EEPROM_WRITE(dummy);
 | 
			
		||||
      for (uint8_t q = EXTRUDERS * 2; q--;) EEPROM_WRITE(dummy);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
@ -1271,9 +1310,9 @@ void MarlinSettings::postprocess() {
 | 
			
		||||
      //
 | 
			
		||||
 | 
			
		||||
      #if ENABLED(PIDTEMP)
 | 
			
		||||
        for (uint8_t e = 0; e < MAX_EXTRUDERS; e++) {
 | 
			
		||||
        for (uint8_t e = 0; e < HOTENDS; e++) {
 | 
			
		||||
          EEPROM_READ(dummy); // Kp
 | 
			
		||||
          if (e < HOTENDS && dummy != DUMMY_PID_VALUE) {
 | 
			
		||||
          if (dummy != DUMMY_PID_VALUE) {
 | 
			
		||||
            // do not need to scale PID values as the values in EEPROM are already scaled
 | 
			
		||||
            if (!validating) PID_PARAM(Kp, e) = dummy;
 | 
			
		||||
            EEPROM_READ(PID_PARAM(Ki, e));
 | 
			
		||||
@ -1284,13 +1323,12 @@ void MarlinSettings::postprocess() {
 | 
			
		||||
              EEPROM_READ(dummy);
 | 
			
		||||
            #endif
 | 
			
		||||
          }
 | 
			
		||||
          else {
 | 
			
		||||
          else
 | 
			
		||||
            for (uint8_t q=3; q--;) EEPROM_READ(dummy); // Ki, Kd, Kc
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      #else // !PIDTEMP
 | 
			
		||||
        // 4 x 4 = 16 slots for PID parameters
 | 
			
		||||
        for (uint8_t q = MAX_EXTRUDERS * 4; q--;) EEPROM_READ(dummy);  // Kp, Ki, Kd, Kc
 | 
			
		||||
        for (uint8_t q = HOTENDS * 4; q--;) EEPROM_READ(dummy);  // Kp, Ki, Kd, Kc
 | 
			
		||||
      #endif // !PIDTEMP
 | 
			
		||||
 | 
			
		||||
      //
 | 
			
		||||
@ -1359,16 +1397,15 @@ void MarlinSettings::postprocess() {
 | 
			
		||||
 | 
			
		||||
        EEPROM_READ(parser.volumetric_enabled);
 | 
			
		||||
 | 
			
		||||
        for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
 | 
			
		||||
        for (uint8_t q = 0; q < COUNT(planner.filament_size); q++) {
 | 
			
		||||
          EEPROM_READ(dummy);
 | 
			
		||||
          if (!validating && q < COUNT(planner.filament_size))
 | 
			
		||||
            planner.filament_size[q] = dummy;
 | 
			
		||||
          if (!validating) planner.filament_size[q] = dummy;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      #else
 | 
			
		||||
 | 
			
		||||
        EEPROM_READ(dummyb);
 | 
			
		||||
        for (uint8_t q=MAX_EXTRUDERS; q--;) EEPROM_READ(dummy);
 | 
			
		||||
        for (uint8_t q=EXTRUDERS; q--;) EEPROM_READ(dummy);
 | 
			
		||||
 | 
			
		||||
      #endif
 | 
			
		||||
 | 
			
		||||
@ -1422,6 +1459,9 @@ void MarlinSettings::postprocess() {
 | 
			
		||||
          #if AXIS_IS_TMC(E4)
 | 
			
		||||
            SET_CURR(E4);
 | 
			
		||||
          #endif
 | 
			
		||||
          #if AXIS_IS_TMC(E5)
 | 
			
		||||
            SET_CURR(E5);
 | 
			
		||||
          #endif
 | 
			
		||||
        }
 | 
			
		||||
      #else
 | 
			
		||||
        uint16_t val;
 | 
			
		||||
@ -1469,6 +1509,9 @@ void MarlinSettings::postprocess() {
 | 
			
		||||
          #if AXIS_HAS_STEALTHCHOP(E4)
 | 
			
		||||
            TMC_SET_PWMTHRS(E, E4);
 | 
			
		||||
          #endif
 | 
			
		||||
          #if AXIS_HAS_STEALTHCHOP(E5)
 | 
			
		||||
            TMC_SET_PWMTHRS(E, E5);
 | 
			
		||||
          #endif
 | 
			
		||||
        }
 | 
			
		||||
      #else
 | 
			
		||||
        uint32_t thrs_val;
 | 
			
		||||
@ -1580,16 +1623,14 @@ void MarlinSettings::postprocess() {
 | 
			
		||||
      _FIELD_TEST(filament_change_unload_length);
 | 
			
		||||
 | 
			
		||||
      #if ENABLED(ADVANCED_PAUSE_FEATURE)
 | 
			
		||||
        for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
 | 
			
		||||
        for (uint8_t q = 0; q < COUNT(filament_change_unload_length); q++) {
 | 
			
		||||
          EEPROM_READ(dummy);
 | 
			
		||||
          if (!validating && q < COUNT(filament_change_unload_length)) filament_change_unload_length[q] = dummy;
 | 
			
		||||
        }
 | 
			
		||||
        for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
 | 
			
		||||
          EEPROM_READ(dummy);
 | 
			
		||||
          if (!validating && q < COUNT(filament_change_load_length)) filament_change_load_length[q] = dummy;
 | 
			
		||||
        }
 | 
			
		||||
      #else
 | 
			
		||||
        for (uint8_t q = MAX_EXTRUDERS * 2; q--;) EEPROM_READ(dummy);
 | 
			
		||||
        for (uint8_t q = EXTRUDERS * 2; q--;) EEPROM_READ(dummy);
 | 
			
		||||
      #endif
 | 
			
		||||
 | 
			
		||||
      eeprom_error = size_error(eeprom_index - (EEPROM_OFFSET));
 | 
			
		||||
@ -2176,6 +2217,11 @@ void MarlinSettings::reset(PORTARG_SOLO) {
 | 
			
		||||
              CONFIG_ECHO_START;
 | 
			
		||||
              SERIAL_ECHOPAIR_P(port, "  M200 T4 D", LINEAR_UNIT(planner.filament_size[4]));
 | 
			
		||||
              SERIAL_EOL_P(port);
 | 
			
		||||
              #if EXTRUDERS > 5
 | 
			
		||||
                CONFIG_ECHO_START;
 | 
			
		||||
                SERIAL_ECHOPAIR_P(port, "  M200 T5 D", LINEAR_UNIT(planner.filament_size[5]));
 | 
			
		||||
                SERIAL_EOL_P(port);
 | 
			
		||||
              #endif // EXTRUDERS > 5
 | 
			
		||||
            #endif // EXTRUDERS > 4
 | 
			
		||||
          #endif // EXTRUDERS > 3
 | 
			
		||||
        #endif // EXTRUDERS > 2
 | 
			
		||||
@ -2681,6 +2727,10 @@ void MarlinSettings::reset(PORTARG_SOLO) {
 | 
			
		||||
        say_M906(PORTVAR_SOLO);
 | 
			
		||||
        SERIAL_ECHOLNPAIR_P(port, " T4 E", stepperE4.getCurrent());
 | 
			
		||||
      #endif
 | 
			
		||||
      #if E_STEPPERS > 5 && AXIS_IS_TMC(E5)
 | 
			
		||||
        say_M906(PORTVAR_SOLO);
 | 
			
		||||
        SERIAL_ECHOLNPAIR_P(port, " T5 E", stepperE5.getCurrent());
 | 
			
		||||
      #endif
 | 
			
		||||
      SERIAL_EOL_P(port);
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
@ -2748,6 +2798,10 @@ void MarlinSettings::reset(PORTARG_SOLO) {
 | 
			
		||||
          say_M913(PORTVAR_SOLO);
 | 
			
		||||
          SERIAL_ECHOLNPAIR_P(port, " T4 E", TMC_GET_PWMTHRS(E, E4));
 | 
			
		||||
        #endif
 | 
			
		||||
        #if E_STEPPERS > 5 && AXIS_IS_TMC(E5)
 | 
			
		||||
          say_M913(PORTVAR_SOLO);
 | 
			
		||||
          SERIAL_ECHOLNPAIR_P(port, " T5 E", TMC_GET_PWMTHRS(E, E5));
 | 
			
		||||
        #endif
 | 
			
		||||
        SERIAL_EOL_P(port);
 | 
			
		||||
      #endif // HYBRID_THRESHOLD
 | 
			
		||||
 | 
			
		||||
@ -2871,6 +2925,12 @@ void MarlinSettings::reset(PORTARG_SOLO) {
 | 
			
		||||
              say_M603(PORTVAR_SOLO);
 | 
			
		||||
              SERIAL_ECHOPAIR_P(port, "T4 L", LINEAR_UNIT(filament_change_load_length[4]));
 | 
			
		||||
              SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[4]));
 | 
			
		||||
              #if EXTRUDERS > 5
 | 
			
		||||
                CONFIG_ECHO_START;
 | 
			
		||||
                say_M603(PORTVAR_SOLO);
 | 
			
		||||
                SERIAL_ECHOPAIR_P(port, "T5 L", LINEAR_UNIT(filament_change_load_length[5]));
 | 
			
		||||
                SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[5]));
 | 
			
		||||
              #endif // EXTRUDERS > 5
 | 
			
		||||
            #endif // EXTRUDERS > 4
 | 
			
		||||
          #endif // EXTRUDERS > 3
 | 
			
		||||
        #endif // EXTRUDERS > 2
 | 
			
		||||
 | 
			
		||||
@ -1849,6 +1849,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
 | 
			
		||||
                DISABLE_IDLE_E(3);
 | 
			
		||||
                #if EXTRUDERS > 4
 | 
			
		||||
                  DISABLE_IDLE_E(4);
 | 
			
		||||
                  #if EXTRUDERS > 5
 | 
			
		||||
                    DISABLE_IDLE_E(5);
 | 
			
		||||
                  #endif // EXTRUDERS > 5
 | 
			
		||||
                #endif // EXTRUDERS > 4
 | 
			
		||||
              #endif // EXTRUDERS > 3
 | 
			
		||||
            #endif // EXTRUDERS > 2
 | 
			
		||||
@ -1871,6 +1874,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
 | 
			
		||||
                DISABLE_IDLE_E(3);
 | 
			
		||||
                #if EXTRUDERS > 4
 | 
			
		||||
                  DISABLE_IDLE_E(4);
 | 
			
		||||
                  #if EXTRUDERS > 5
 | 
			
		||||
                    DISABLE_IDLE_E(5);
 | 
			
		||||
                  #endif // EXTRUDERS > 5
 | 
			
		||||
                #endif // EXTRUDERS > 4
 | 
			
		||||
              #endif // EXTRUDERS > 3
 | 
			
		||||
            #endif // EXTRUDERS > 2
 | 
			
		||||
@ -1885,6 +1891,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
 | 
			
		||||
                DISABLE_IDLE_E(3);
 | 
			
		||||
                #if EXTRUDERS > 4
 | 
			
		||||
                  DISABLE_IDLE_E(4);
 | 
			
		||||
                  #if EXTRUDERS > 5
 | 
			
		||||
                    DISABLE_IDLE_E(5);
 | 
			
		||||
                  #endif
 | 
			
		||||
                #endif
 | 
			
		||||
              #endif
 | 
			
		||||
              enable_E2();
 | 
			
		||||
@ -1897,6 +1906,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
 | 
			
		||||
                DISABLE_IDLE_E(2);
 | 
			
		||||
                #if EXTRUDERS > 4
 | 
			
		||||
                  DISABLE_IDLE_E(4);
 | 
			
		||||
                  #if EXTRUDERS > 5
 | 
			
		||||
                    DISABLE_IDLE_E(5);
 | 
			
		||||
                  #endif
 | 
			
		||||
                #endif
 | 
			
		||||
                enable_E3();
 | 
			
		||||
                g_uc_extruder_last_move[3] = (BLOCK_BUFFER_SIZE) * 2;
 | 
			
		||||
@ -1907,9 +1919,23 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
 | 
			
		||||
                  DISABLE_IDLE_E(1);
 | 
			
		||||
                  DISABLE_IDLE_E(2);
 | 
			
		||||
                  DISABLE_IDLE_E(3);
 | 
			
		||||
                  #if EXTRUDERS > 5
 | 
			
		||||
                    DISABLE_IDLE_E(5);
 | 
			
		||||
                  #endif
 | 
			
		||||
                  enable_E4();
 | 
			
		||||
                  g_uc_extruder_last_move[4] = (BLOCK_BUFFER_SIZE) * 2;
 | 
			
		||||
                break;
 | 
			
		||||
                #if EXTRUDERS > 5
 | 
			
		||||
                  case 5:
 | 
			
		||||
                    DISABLE_IDLE_E(0);
 | 
			
		||||
                    DISABLE_IDLE_E(1);
 | 
			
		||||
                    DISABLE_IDLE_E(2);
 | 
			
		||||
                    DISABLE_IDLE_E(3);
 | 
			
		||||
                    DISABLE_IDLE_E(4);
 | 
			
		||||
                    enable_E5();
 | 
			
		||||
                    g_uc_extruder_last_move[5] = (BLOCK_BUFFER_SIZE) * 2;
 | 
			
		||||
                  break;
 | 
			
		||||
                #endif // EXTRUDERS > 5
 | 
			
		||||
              #endif // EXTRUDERS > 4
 | 
			
		||||
            #endif // EXTRUDERS > 3
 | 
			
		||||
          #endif // EXTRUDERS > 2
 | 
			
		||||
@ -1921,6 +1947,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
 | 
			
		||||
      enable_E2();
 | 
			
		||||
      enable_E3();
 | 
			
		||||
      enable_E4();
 | 
			
		||||
      enable_E5();
 | 
			
		||||
    #endif
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1982,6 +1982,9 @@ void Stepper::init() {
 | 
			
		||||
  #if HAS_E4_DIR
 | 
			
		||||
    E4_DIR_INIT;
 | 
			
		||||
  #endif
 | 
			
		||||
  #if HAS_E5_DIR
 | 
			
		||||
    E5_DIR_INIT;
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  // Init Enable Pins - steppers default to disabled.
 | 
			
		||||
  #if HAS_X_ENABLE
 | 
			
		||||
@ -2032,6 +2035,10 @@ void Stepper::init() {
 | 
			
		||||
    E4_ENABLE_INIT;
 | 
			
		||||
    if (!E_ENABLE_ON) E4_ENABLE_WRITE(HIGH);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if HAS_E5_ENABLE
 | 
			
		||||
    E5_ENABLE_INIT;
 | 
			
		||||
    if (!E_ENABLE_ON) E5_ENABLE_WRITE(HIGH);
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #define _STEP_INIT(AXIS) AXIS ##_STEP_INIT
 | 
			
		||||
  #define _WRITE_STEP(AXIS, HIGHLOW) AXIS ##_STEP_WRITE(HIGHLOW)
 | 
			
		||||
@ -2088,6 +2095,9 @@ void Stepper::init() {
 | 
			
		||||
  #if E_STEPPERS > 4 && HAS_E4_STEP
 | 
			
		||||
    E_AXIS_INIT(4);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if E_STEPPERS > 5 && HAS_E5_STEP
 | 
			
		||||
    E_AXIS_INIT(5);
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  // Init Stepper ISR to 122 Hz for quick starting
 | 
			
		||||
  HAL_timer_start(STEP_TIMER_NUM, 122);
 | 
			
		||||
@ -2524,6 +2534,10 @@ void Stepper::report_positions() {
 | 
			
		||||
      SET_OUTPUT(E4_MS1_PIN);
 | 
			
		||||
      SET_OUTPUT(E4_MS2_PIN);
 | 
			
		||||
    #endif
 | 
			
		||||
    #if HAS_E5_MICROSTEPS
 | 
			
		||||
      SET_OUTPUT(E5_MS1_PIN);
 | 
			
		||||
      SET_OUTPUT(E5_MS2_PIN);
 | 
			
		||||
    #endif
 | 
			
		||||
    static const uint8_t microstep_modes[] = MICROSTEP_MODES;
 | 
			
		||||
    for (uint16_t i = 0; i < COUNT(microstep_modes); i++)
 | 
			
		||||
      microstep_mode(i, microstep_modes[i]);
 | 
			
		||||
@ -2553,6 +2567,9 @@ void Stepper::report_positions() {
 | 
			
		||||
      #if HAS_E4_MICROSTEPS
 | 
			
		||||
        case 7: WRITE(E4_MS1_PIN, ms1); break;
 | 
			
		||||
      #endif
 | 
			
		||||
      #if HAS_E5_MICROSTEPS
 | 
			
		||||
        case 8: WRITE(E5_MS1_PIN, ms1); break;
 | 
			
		||||
      #endif
 | 
			
		||||
    }
 | 
			
		||||
    if (ms2 >= 0) switch (driver) {
 | 
			
		||||
      case 0: WRITE(X_MS2_PIN, ms2); break;
 | 
			
		||||
@ -2577,6 +2594,9 @@ void Stepper::report_positions() {
 | 
			
		||||
      #if HAS_E4_MICROSTEPS
 | 
			
		||||
        case 7: WRITE(E4_MS2_PIN, ms2); break;
 | 
			
		||||
      #endif
 | 
			
		||||
      #if HAS_E5_MICROSTEPS
 | 
			
		||||
        case 8: WRITE(E5_MS2_PIN, ms2); break;
 | 
			
		||||
      #endif
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -2638,6 +2658,11 @@ void Stepper::report_positions() {
 | 
			
		||||
      SERIAL_PROTOCOL(READ(E4_MS1_PIN));
 | 
			
		||||
      SERIAL_PROTOCOLLN(READ(E4_MS2_PIN));
 | 
			
		||||
    #endif
 | 
			
		||||
    #if HAS_E5_MICROSTEPS
 | 
			
		||||
      SERIAL_PROTOCOLPGM("E5: ");
 | 
			
		||||
      SERIAL_PROTOCOL(READ(E5_MS1_PIN));
 | 
			
		||||
      SERIAL_PROTOCOLLN(READ(E5_MS2_PIN));
 | 
			
		||||
    #endif
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
#endif // HAS_MICROSTEPS
 | 
			
		||||
 | 
			
		||||
@ -482,11 +482,48 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
 | 
			
		||||
#define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE)
 | 
			
		||||
#define E4_STEP_READ READ(E4_STEP_PIN)
 | 
			
		||||
 | 
			
		||||
// E5 Stepper
 | 
			
		||||
#if AXIS_DRIVER_TYPE(E5, L6470)
 | 
			
		||||
  extern L6470 stepperE5;
 | 
			
		||||
  #define E5_ENABLE_INIT NOOP
 | 
			
		||||
  #define E5_ENABLE_WRITE(STATE) do{ if (STATE) stepperE5.Step_Clock(stepperE5.getStatus() & STATUS_HIZ); else stepperE5.softFree(); }while(0)
 | 
			
		||||
  #define E5_ENABLE_READ (stepperE5.getStatus() & STATUS_HIZ)
 | 
			
		||||
  #define E5_DIR_INIT NOOP
 | 
			
		||||
  #define E5_DIR_WRITE(STATE) stepperE5.Step_Clock(STATE)
 | 
			
		||||
  #define E5_DIR_READ (stepperE5.getStatus() & STATUS_DIR)
 | 
			
		||||
#else
 | 
			
		||||
  #if AXIS_DRIVER_TYPE(E5, TMC26X)
 | 
			
		||||
    extern TMC26XStepper stepperE5;
 | 
			
		||||
    #define E5_ENABLE_INIT NOOP
 | 
			
		||||
    #define E5_ENABLE_WRITE(STATE) stepperE5.setEnabled(STATE)
 | 
			
		||||
    #define E5_ENABLE_READ stepperE5.isEnabled()
 | 
			
		||||
  #else
 | 
			
		||||
    #if AXIS_DRIVER_TYPE(E5, TMC2130)
 | 
			
		||||
      extern TMC2130Stepper stepperE5;
 | 
			
		||||
    #elif AXIS_DRIVER_TYPE(E5, TMC2208)
 | 
			
		||||
      extern TMC2208Stepper stepperE5;
 | 
			
		||||
    #endif
 | 
			
		||||
    #define E5_ENABLE_INIT SET_OUTPUT(E5_ENABLE_PIN)
 | 
			
		||||
    #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE)
 | 
			
		||||
    #define E5_ENABLE_READ READ(E5_ENABLE_PIN)
 | 
			
		||||
  #endif
 | 
			
		||||
  #define E5_DIR_INIT SET_OUTPUT(E5_DIR_PIN)
 | 
			
		||||
  #define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,STATE)
 | 
			
		||||
  #define E5_DIR_READ READ(E5_DIR_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
#define E5_STEP_INIT SET_OUTPUT(E5_STEP_PIN)
 | 
			
		||||
#define E5_STEP_WRITE(STATE) WRITE(E5_STEP_PIN,STATE)
 | 
			
		||||
#define E5_STEP_READ READ(E5_STEP_PIN)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Extruder indirection for the single E axis
 | 
			
		||||
 */
 | 
			
		||||
#if ENABLED(SWITCHING_EXTRUDER) // One stepper driver per two extruders, reversed on odd index
 | 
			
		||||
  #if EXTRUDERS > 4
 | 
			
		||||
  #if EXTRUDERS > 5
 | 
			
		||||
    #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0)
 | 
			
		||||
    #define   NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; case 4: E2_DIR_WRITE(!INVERT_E2_DIR); case 5: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0)
 | 
			
		||||
    #define    REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 4: E2_DIR_WRITE( INVERT_E2_DIR); case 5: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0)
 | 
			
		||||
  #elif EXTRUDERS > 4
 | 
			
		||||
    #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0)
 | 
			
		||||
    #define   NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; case 4: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0)
 | 
			
		||||
    #define    REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 4: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0)
 | 
			
		||||
@ -507,6 +544,10 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
 | 
			
		||||
  #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
 | 
			
		||||
  #define   NORM_E_DIR(E)   do{ E0_DIR_WRITE(TEST(E, 0) ? !INVERT_E0_DIR:  INVERT_E0_DIR); }while(0)
 | 
			
		||||
  #define    REV_E_DIR(E)   do{ E0_DIR_WRITE(TEST(E, 0) ?  INVERT_E0_DIR: !INVERT_E0_DIR); }while(0)
 | 
			
		||||
#elif E_STEPPERS > 5
 | 
			
		||||
  #define E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; case 4: E4_STEP_WRITE(V); case 5: E5_STEP_WRITE(V); } }while(0)
 | 
			
		||||
  #define   NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 4: E4_DIR_WRITE(!INVERT_E4_DIR); case 5: E5_DIR_WRITE(!INVERT_E5_DIR); } }while(0)
 | 
			
		||||
  #define    REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; case 4: E4_DIR_WRITE( INVERT_E4_DIR); case 5: E5_DIR_WRITE( INVERT_E5_DIR); } }while(0)
 | 
			
		||||
#elif E_STEPPERS > 4
 | 
			
		||||
  #define E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; case 4: E4_STEP_WRITE(V); } }while(0)
 | 
			
		||||
  #define   NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 4: E4_DIR_WRITE(!INVERT_E4_DIR); } }while(0)
 | 
			
		||||
 | 
			
		||||
@ -74,6 +74,7 @@ Temperature thermalManager;
 | 
			
		||||
    (HOTENDS > 2 && (E) == 2) ? PSTR(MSG_E3 " " MSG) : \
 | 
			
		||||
    (HOTENDS > 3 && (E) == 3) ? PSTR(MSG_E4 " " MSG) : \
 | 
			
		||||
    (HOTENDS > 4 && (E) == 4) ? PSTR(MSG_E5 " " MSG) : \
 | 
			
		||||
    (HOTENDS > 5 && (E) == 5) ? PSTR(MSG_E6 " " MSG) : \
 | 
			
		||||
    PSTR(MSG_E1 " " MSG)
 | 
			
		||||
#else
 | 
			
		||||
  #define TEMP_ERR_PSTR(MSG, E) \
 | 
			
		||||
@ -81,6 +82,7 @@ Temperature thermalManager;
 | 
			
		||||
    (HOTENDS > 2 && (E) == 2) ? PSTR(MSG_E3 " " MSG) : \
 | 
			
		||||
    (HOTENDS > 3 && (E) == 3) ? PSTR(MSG_E4 " " MSG) : \
 | 
			
		||||
    (HOTENDS > 4 && (E) == 4) ? PSTR(MSG_E5 " " MSG) : \
 | 
			
		||||
    (HOTENDS > 5 && (E) == 5) ? PSTR(MSG_E6 " " MSG) : \
 | 
			
		||||
    PSTR(MSG_E1 " " MSG)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -149,7 +151,7 @@ int16_t Temperature::current_temperature_raw[HOTENDS] = { 0 },
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if ENABLED(BABYSTEPPING)
 | 
			
		||||
  volatile int Temperature::babystepsTodo[XYZ] = { 0 };
 | 
			
		||||
  volatile int16_t Temperature::babystepsTodo[XYZ] = { 0 };
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if WATCH_HOTENDS
 | 
			
		||||
@ -527,13 +529,14 @@ int Temperature::getHeaterPower(const int heater) {
 | 
			
		||||
#if HAS_AUTO_FAN
 | 
			
		||||
 | 
			
		||||
  void Temperature::checkExtruderAutoFans() {
 | 
			
		||||
    static const pin_t fanPin[] PROGMEM = { E0_AUTO_FAN_PIN, E1_AUTO_FAN_PIN, E2_AUTO_FAN_PIN, E3_AUTO_FAN_PIN, E4_AUTO_FAN_PIN, CHAMBER_AUTO_FAN_PIN };
 | 
			
		||||
    static const pin_t fanPin[] PROGMEM = { E0_AUTO_FAN_PIN, E1_AUTO_FAN_PIN, E2_AUTO_FAN_PIN, E3_AUTO_FAN_PIN, E4_AUTO_FAN_PIN, E5_AUTO_FAN_PIN, CHAMBER_AUTO_FAN_PIN };
 | 
			
		||||
    static const uint8_t fanBit[] PROGMEM = {
 | 
			
		||||
                    0,
 | 
			
		||||
      AUTO_1_IS_0 ? 0 :               1,
 | 
			
		||||
      AUTO_2_IS_0 ? 0 : AUTO_2_IS_1 ? 1 :               2,
 | 
			
		||||
      AUTO_3_IS_0 ? 0 : AUTO_3_IS_1 ? 1 : AUTO_3_IS_2 ? 2 :               3,
 | 
			
		||||
      AUTO_4_IS_0 ? 0 : AUTO_4_IS_1 ? 1 : AUTO_4_IS_2 ? 2 : AUTO_4_IS_3 ? 3 : 4,
 | 
			
		||||
      AUTO_4_IS_0 ? 0 : AUTO_4_IS_1 ? 1 : AUTO_4_IS_2 ? 2 : AUTO_4_IS_3 ? 3 :                   4,
 | 
			
		||||
      AUTO_5_IS_0 ? 0 : AUTO_5_IS_1 ? 1 : AUTO_5_IS_2 ? 2 : AUTO_5_IS_3 ? 3 : AUTO_5_IS_4 ? 4 : 5,
 | 
			
		||||
      AUTO_CHAMBER_IS_0 ? 0 : AUTO_CHAMBER_IS_1 ? 1 : AUTO_CHAMBER_IS_2 ? 2 : AUTO_CHAMBER_IS_3 ? 3 : AUTO_CHAMBER_IS_4 ? 4 : 5
 | 
			
		||||
    };
 | 
			
		||||
    uint8_t fanState = 0;
 | 
			
		||||
@ -1193,6 +1196,9 @@ void Temperature::init() {
 | 
			
		||||
  #if HAS_TEMP_ADC_4
 | 
			
		||||
    HAL_ANALOG_SELECT(TEMP_4_PIN);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if HAS_TEMP_ADC_5
 | 
			
		||||
    HAL_ANALOG_SELECT(TEMP_5_PIN);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if HAS_HEATED_BED
 | 
			
		||||
    HAL_ANALOG_SELECT(TEMP_BED_PIN);
 | 
			
		||||
  #endif
 | 
			
		||||
@ -1226,7 +1232,7 @@ void Temperature::init() {
 | 
			
		||||
      SET_OUTPUT(E1_AUTO_FAN_PIN);
 | 
			
		||||
    #endif
 | 
			
		||||
  #endif
 | 
			
		||||
  #if HAS_AUTO_FAN_2 && !AUTO_2_IS_0 && !AUTO_2_IS_1
 | 
			
		||||
  #if HAS_AUTO_FAN_2 && !(AUTO_2_IS_0 || AUTO_2_IS_1)
 | 
			
		||||
    #if E2_AUTO_FAN_PIN == FAN1_PIN
 | 
			
		||||
      SET_OUTPUT(E2_AUTO_FAN_PIN);
 | 
			
		||||
      #if ENABLED(FAST_PWM_FAN)
 | 
			
		||||
@ -1236,7 +1242,7 @@ void Temperature::init() {
 | 
			
		||||
      SET_OUTPUT(E2_AUTO_FAN_PIN);
 | 
			
		||||
    #endif
 | 
			
		||||
  #endif
 | 
			
		||||
  #if HAS_AUTO_FAN_3 && !AUTO_3_IS_0 && !AUTO_3_IS_1 && !AUTO_3_IS_2
 | 
			
		||||
  #if HAS_AUTO_FAN_3 && !(AUTO_3_IS_0 || AUTO_3_IS_1 || AUTO_3_IS_2)
 | 
			
		||||
    #if E3_AUTO_FAN_PIN == FAN1_PIN
 | 
			
		||||
      SET_OUTPUT(E3_AUTO_FAN_PIN);
 | 
			
		||||
      #if ENABLED(FAST_PWM_FAN)
 | 
			
		||||
@ -1246,7 +1252,7 @@ void Temperature::init() {
 | 
			
		||||
      SET_OUTPUT(E3_AUTO_FAN_PIN);
 | 
			
		||||
    #endif
 | 
			
		||||
  #endif
 | 
			
		||||
  #if HAS_AUTO_FAN_4 && !AUTO_4_IS_0 && !AUTO_4_IS_1 && !AUTO_4_IS_2 && !AUTO_4_IS_3
 | 
			
		||||
  #if HAS_AUTO_FAN_4 && !(AUTO_4_IS_0 || AUTO_4_IS_1 || AUTO_4_IS_2 || AUTO_4_IS_3)
 | 
			
		||||
    #if E4_AUTO_FAN_PIN == FAN1_PIN
 | 
			
		||||
      SET_OUTPUT(E4_AUTO_FAN_PIN);
 | 
			
		||||
      #if ENABLED(FAST_PWM_FAN)
 | 
			
		||||
@ -1256,7 +1262,17 @@ void Temperature::init() {
 | 
			
		||||
      SET_OUTPUT(E4_AUTO_FAN_PIN);
 | 
			
		||||
    #endif
 | 
			
		||||
  #endif
 | 
			
		||||
  #if HAS_AUTO_CHAMBER_FAN && !AUTO_CHAMBER_IS_0 && !AUTO_CHAMBER_IS_1 && !AUTO_CHAMBER_IS_2 && !AUTO_CHAMBER_IS_3 && ! AUTO_CHAMBER_IS_4
 | 
			
		||||
  #if HAS_AUTO_FAN_5 && !(AUTO_5_IS_0 || AUTO_5_IS_1 || AUTO_5_IS_2 || AUTO_5_IS_3 || AUTO_5_IS_4)
 | 
			
		||||
    #if E5_AUTO_FAN_PIN == FAN1_PIN
 | 
			
		||||
      SET_OUTPUT(E5_AUTO_FAN_PIN);
 | 
			
		||||
      #if ENABLED(FAST_PWM_FAN)
 | 
			
		||||
        setPwmFrequency(E5_AUTO_FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8
 | 
			
		||||
      #endif
 | 
			
		||||
    #else
 | 
			
		||||
      SET_OUTPUT(E5_AUTO_FAN_PIN);
 | 
			
		||||
    #endif
 | 
			
		||||
  #endif
 | 
			
		||||
  #if HAS_AUTO_CHAMBER_FAN && !(AUTO_CHAMBER_IS_0 || AUTO_CHAMBER_IS_1 || AUTO_CHAMBER_IS_2 || AUTO_CHAMBER_IS_3 || AUTO_CHAMBER_IS_4 || AUTO_CHAMBER_IS_5)
 | 
			
		||||
    #if CHAMBER_AUTO_FAN_PIN == FAN1_PIN
 | 
			
		||||
      SET_OUTPUT(CHAMBER_AUTO_FAN_PIN);
 | 
			
		||||
      #if ENABLED(FAST_PWM_FAN)
 | 
			
		||||
@ -1321,6 +1337,14 @@ void Temperature::init() {
 | 
			
		||||
          #ifdef HEATER_4_MAXTEMP
 | 
			
		||||
            TEMP_MAX_ROUTINE(4);
 | 
			
		||||
          #endif
 | 
			
		||||
          #if HOTENDS > 5
 | 
			
		||||
            #ifdef HEATER_5_MINTEMP
 | 
			
		||||
              TEMP_MIN_ROUTINE(5);
 | 
			
		||||
            #endif
 | 
			
		||||
            #ifdef HEATER_5_MAXTEMP
 | 
			
		||||
              TEMP_MAX_ROUTINE(5);
 | 
			
		||||
            #endif
 | 
			
		||||
          #endif // HOTENDS > 5
 | 
			
		||||
        #endif // HOTENDS > 4
 | 
			
		||||
      #endif // HOTENDS > 3
 | 
			
		||||
    #endif // HOTENDS > 2
 | 
			
		||||
@ -1539,6 +1563,9 @@ void Temperature::disable_all_heaters() {
 | 
			
		||||
          DISABLE_HEATER(3);
 | 
			
		||||
          #if HOTENDS > 4
 | 
			
		||||
            DISABLE_HEATER(4);
 | 
			
		||||
            #if HOTENDS > 5
 | 
			
		||||
              DISABLE_HEATER(5);
 | 
			
		||||
            #endif // HOTENDS > 5
 | 
			
		||||
          #endif // HOTENDS > 4
 | 
			
		||||
        #endif // HOTENDS > 3
 | 
			
		||||
      #endif // HOTENDS > 2
 | 
			
		||||
@ -1665,10 +1692,13 @@ void Temperature::set_current_temp_raw() {
 | 
			
		||||
        current_temperature_raw[3] = raw_temp_value[3];
 | 
			
		||||
        #if HAS_TEMP_ADC_4
 | 
			
		||||
          current_temperature_raw[4] = raw_temp_value[4];
 | 
			
		||||
        #endif
 | 
			
		||||
      #endif
 | 
			
		||||
    #endif
 | 
			
		||||
  #endif
 | 
			
		||||
          #if HAS_TEMP_ADC_5
 | 
			
		||||
            current_temperature_raw[5] = raw_temp_value[5];
 | 
			
		||||
          #endif // HAS_TEMP_ADC_5
 | 
			
		||||
        #endif // HAS_TEMP_ADC_4
 | 
			
		||||
      #endif // HAS_TEMP_ADC_3
 | 
			
		||||
    #endif // HAS_TEMP_ADC_2
 | 
			
		||||
  #endif // HAS_TEMP_ADC_1
 | 
			
		||||
 | 
			
		||||
  #if HAS_HEATED_BED
 | 
			
		||||
    current_temperature_bed_raw = raw_temp_bed_value;
 | 
			
		||||
@ -1718,6 +1748,9 @@ void Temperature::readings_ready() {
 | 
			
		||||
          , TEMPDIR(3)
 | 
			
		||||
          #if HOTENDS > 4
 | 
			
		||||
            , TEMPDIR(4)
 | 
			
		||||
            #if HOTENDS > 5
 | 
			
		||||
              , TEMPDIR(5)
 | 
			
		||||
            #endif // HOTENDS > 5
 | 
			
		||||
          #endif // HOTENDS > 4
 | 
			
		||||
        #endif // HOTENDS > 3
 | 
			
		||||
      #endif // HOTENDS > 2
 | 
			
		||||
@ -1815,6 +1848,9 @@ void Temperature::isr() {
 | 
			
		||||
        ISR_STATICS(3);
 | 
			
		||||
        #if HOTENDS > 4
 | 
			
		||||
          ISR_STATICS(4);
 | 
			
		||||
          #if HOTENDS > 5
 | 
			
		||||
            ISR_STATICS(5);
 | 
			
		||||
          #endif // HOTENDS > 5
 | 
			
		||||
        #endif // HOTENDS > 4
 | 
			
		||||
      #endif // HOTENDS > 3
 | 
			
		||||
    #endif // HOTENDS > 2
 | 
			
		||||
@ -1851,6 +1887,10 @@ void Temperature::isr() {
 | 
			
		||||
            #if HOTENDS > 4
 | 
			
		||||
              soft_pwm_count_4 = (soft_pwm_count_4 & pwm_mask) + soft_pwm_amount[4];
 | 
			
		||||
              WRITE_HEATER_4(soft_pwm_count_4 > pwm_mask ? HIGH : LOW);
 | 
			
		||||
              #if HOTENDS > 5
 | 
			
		||||
                soft_pwm_count_5 = (soft_pwm_count_5 & pwm_mask) + soft_pwm_amount[5];
 | 
			
		||||
                WRITE_HEATER_5(soft_pwm_count_5 > pwm_mask ? HIGH : LOW);
 | 
			
		||||
              #endif // HOTENDS > 5
 | 
			
		||||
            #endif // HOTENDS > 4
 | 
			
		||||
          #endif // HOTENDS > 3
 | 
			
		||||
        #endif // HOTENDS > 2
 | 
			
		||||
@ -1886,6 +1926,9 @@ void Temperature::isr() {
 | 
			
		||||
            if (soft_pwm_count_3 <= pwm_count_tmp) WRITE_HEATER_3(LOW);
 | 
			
		||||
            #if HOTENDS > 4
 | 
			
		||||
              if (soft_pwm_count_4 <= pwm_count_tmp) WRITE_HEATER_4(LOW);
 | 
			
		||||
              #if HOTENDS > 5
 | 
			
		||||
                if (soft_pwm_count_5 <= pwm_count_tmp) WRITE_HEATER_5(LOW);
 | 
			
		||||
              #endif // HOTENDS > 5
 | 
			
		||||
            #endif // HOTENDS > 4
 | 
			
		||||
          #endif // HOTENDS > 3
 | 
			
		||||
        #endif // HOTENDS > 2
 | 
			
		||||
@ -1968,6 +2011,9 @@ void Temperature::isr() {
 | 
			
		||||
            SLOW_PWM_ROUTINE(3);
 | 
			
		||||
            #if HOTENDS > 4
 | 
			
		||||
              SLOW_PWM_ROUTINE(4);
 | 
			
		||||
              #if HOTENDS > 5
 | 
			
		||||
                SLOW_PWM_ROUTINE(5);
 | 
			
		||||
              #endif // HOTENDS > 5
 | 
			
		||||
            #endif // HOTENDS > 4
 | 
			
		||||
          #endif // HOTENDS > 3
 | 
			
		||||
        #endif // HOTENDS > 2
 | 
			
		||||
@ -1987,6 +2033,9 @@ void Temperature::isr() {
 | 
			
		||||
          PWM_OFF_ROUTINE(3);
 | 
			
		||||
          #if HOTENDS > 4
 | 
			
		||||
            PWM_OFF_ROUTINE(4);
 | 
			
		||||
            #if HOTENDS > 5
 | 
			
		||||
              PWM_OFF_ROUTINE(5);
 | 
			
		||||
            #endif // HOTENDS > 5
 | 
			
		||||
          #endif // HOTENDS > 4
 | 
			
		||||
        #endif // HOTENDS > 3
 | 
			
		||||
      #endif // HOTENDS > 2
 | 
			
		||||
@ -2047,6 +2096,9 @@ void Temperature::isr() {
 | 
			
		||||
            if (state_timer_heater_3 > 0) state_timer_heater_3--;
 | 
			
		||||
            #if HOTENDS > 4
 | 
			
		||||
              if (state_timer_heater_4 > 0) state_timer_heater_4--;
 | 
			
		||||
              #if HOTENDS > 5
 | 
			
		||||
                if (state_timer_heater_5 > 0) state_timer_heater_5--;
 | 
			
		||||
              #endif // HOTENDS > 5
 | 
			
		||||
            #endif // HOTENDS > 4
 | 
			
		||||
          #endif // HOTENDS > 3
 | 
			
		||||
        #endif // HOTENDS > 2
 | 
			
		||||
@ -2169,6 +2221,15 @@ void Temperature::isr() {
 | 
			
		||||
        break;
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    #if HAS_TEMP_ADC_5
 | 
			
		||||
      case PrepareTemp_5:
 | 
			
		||||
        HAL_START_ADC(TEMP_5_PIN);
 | 
			
		||||
        break;
 | 
			
		||||
      case MeasureTemp_5:
 | 
			
		||||
        ACCUMULATE_ADC(raw_temp_value[5]);
 | 
			
		||||
        break;
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(FILAMENT_WIDTH_SENSOR)
 | 
			
		||||
      case Prepare_FILWIDTH:
 | 
			
		||||
        HAL_START_ADC(FILWIDTH_PIN);
 | 
			
		||||
@ -2218,7 +2279,7 @@ void Temperature::isr() {
 | 
			
		||||
 | 
			
		||||
  #if ENABLED(BABYSTEPPING)
 | 
			
		||||
    LOOP_XYZ(axis) {
 | 
			
		||||
      const int curTodo = babystepsTodo[axis]; // get rid of volatile for performance
 | 
			
		||||
      const int16_t curTodo = babystepsTodo[axis]; // get rid of volatile for performance
 | 
			
		||||
      if (curTodo) {
 | 
			
		||||
        stepper.babystep((AxisEnum)axis, curTodo > 0);
 | 
			
		||||
        if (curTodo > 0) babystepsTodo[axis]--;
 | 
			
		||||
 | 
			
		||||
@ -163,7 +163,7 @@ class Temperature {
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(BABYSTEPPING)
 | 
			
		||||
      static volatile int babystepsTodo[3];
 | 
			
		||||
      static volatile int16_t babystepsTodo[3];
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(PREVENT_COLD_EXTRUSION)
 | 
			
		||||
 | 
			
		||||
@ -468,6 +468,15 @@
 | 
			
		||||
#ifndef E4_MS3_PIN
 | 
			
		||||
  #define E4_MS3_PIN -1
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef E5_MS1_PIN
 | 
			
		||||
  #define E5_MS1_PIN -1
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef E5_MS2_PIN
 | 
			
		||||
  #define E5_MS2_PIN -1
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef E5_MS3_PIN
 | 
			
		||||
  #define E5_MS3_PIN -1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef E0_STEP_PIN
 | 
			
		||||
  #define E0_STEP_PIN -1
 | 
			
		||||
@ -514,6 +523,15 @@
 | 
			
		||||
#ifndef E4_ENABLE_PIN
 | 
			
		||||
  #define E4_ENABLE_PIN -1
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef E5_STEP_PIN
 | 
			
		||||
  #define E5_STEP_PIN -1
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef E5_DIR_PIN
 | 
			
		||||
  #define E5_DIR_PIN -1
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef E5_ENABLE_PIN
 | 
			
		||||
  #define E5_ENABLE_PIN -1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef X_CS_PIN
 | 
			
		||||
  #define X_CS_PIN -1
 | 
			
		||||
@ -539,6 +557,9 @@
 | 
			
		||||
#ifndef E4_CS_PIN
 | 
			
		||||
  #define E4_CS_PIN -1
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef E5_CS_PIN
 | 
			
		||||
  #define E5_CS_PIN -1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef FAN_PIN
 | 
			
		||||
  #define FAN_PIN -1
 | 
			
		||||
@ -578,6 +599,9 @@
 | 
			
		||||
#ifndef HEATER_4_PIN
 | 
			
		||||
  #define HEATER_4_PIN -1
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef HEATER_5_PIN
 | 
			
		||||
  #define HEATER_5_PIN -1
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef HEATER_BED_PIN
 | 
			
		||||
  #define HEATER_BED_PIN -1
 | 
			
		||||
#endif
 | 
			
		||||
@ -597,6 +621,9 @@
 | 
			
		||||
#ifndef TEMP_4_PIN
 | 
			
		||||
  #define TEMP_4_PIN -1
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef TEMP_5_PIN
 | 
			
		||||
  #define TEMP_5_PIN -1
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef TEMP_BED_PIN
 | 
			
		||||
  #define TEMP_BED_PIN -1
 | 
			
		||||
#endif
 | 
			
		||||
@ -669,6 +696,13 @@
 | 
			
		||||
    #define E4_AUTO_FAN_PIN -1
 | 
			
		||||
  #endif
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef E5_AUTO_FAN_PIN
 | 
			
		||||
  #ifdef ORIG_E5_AUTO_FAN_PIN
 | 
			
		||||
    #define E5_AUTO_FAN_PIN ORIG_E5_AUTO_FAN_PIN
 | 
			
		||||
  #else
 | 
			
		||||
    #define E5_AUTO_FAN_PIN -1
 | 
			
		||||
  #endif
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef CHAMBER_AUTO_FAN_PIN
 | 
			
		||||
  #ifdef ORIG_CHAMBER_AUTO_FAN_PIN
 | 
			
		||||
    #define CHAMBER_AUTO_FAN_PIN ORIG_CHAMBER_AUTO_FAN_PIN
 | 
			
		||||
@ -683,6 +717,7 @@
 | 
			
		||||
#define _E2_PINS
 | 
			
		||||
#define _E3_PINS
 | 
			
		||||
#define _E4_PINS
 | 
			
		||||
#define _E5_PINS
 | 
			
		||||
 | 
			
		||||
#if ENABLED(SWITCHING_EXTRUDER)
 | 
			
		||||
                      // Tools 0 and 1 use E0
 | 
			
		||||
@ -706,6 +741,10 @@
 | 
			
		||||
      #if EXTRUDERS > 4
 | 
			
		||||
        #undef _E4_PINS
 | 
			
		||||
        #define _E4_PINS E4_STEP_PIN, E4_DIR_PIN, E4_ENABLE_PIN, E4_MS1_PIN, E4_MS2_PIN, E4_MS3_PIN, E4_CS_PIN,
 | 
			
		||||
        #if EXTRUDERS > 5
 | 
			
		||||
          #undef _E5_PINS
 | 
			
		||||
          #define _E5_PINS E5_STEP_PIN, E5_DIR_PIN, E5_ENABLE_PIN, E5_MS1_PIN, E5_MS2_PIN, E5_MS3_PIN, E5_CS_PIN,
 | 
			
		||||
        #endif // EXTRUDERS > 5
 | 
			
		||||
      #endif // EXTRUDERS > 4
 | 
			
		||||
    #endif // EXTRUDERS > 3
 | 
			
		||||
  #endif // EXTRUDERS > 2
 | 
			
		||||
@ -716,6 +755,7 @@
 | 
			
		||||
#define _H2_PINS
 | 
			
		||||
#define _H3_PINS
 | 
			
		||||
#define _H4_PINS
 | 
			
		||||
#define _H5_PINS
 | 
			
		||||
 | 
			
		||||
#if HOTENDS > 1
 | 
			
		||||
  #undef _H1_PINS
 | 
			
		||||
@ -728,7 +768,11 @@
 | 
			
		||||
      #define _H3_PINS HEATER_3_PIN, E3_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_3_PIN),
 | 
			
		||||
      #if HOTENDS > 4
 | 
			
		||||
        #undef _H4_PINS
 | 
			
		||||
        #define _H4_PINS HEATER_4_PIN, analogInputToDigitalPin(TEMP_4_PIN),
 | 
			
		||||
        #define _H4_PINS HEATER_4_PIN, E4_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_4_PIN),
 | 
			
		||||
        #if HOTENDS > 5
 | 
			
		||||
          #undef _H5_PINS
 | 
			
		||||
          #define _H5_PINS HEATER_5_PIN, E5_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_5_PIN),
 | 
			
		||||
        #endif // HOTENDS > 5
 | 
			
		||||
      #endif // HOTENDS > 4
 | 
			
		||||
    #endif // HOTENDS > 3
 | 
			
		||||
  #endif // HOTENDS > 2
 | 
			
		||||
@ -744,6 +788,10 @@
 | 
			
		||||
      #if MIXING_STEPPERS > 4
 | 
			
		||||
        #undef _E4_PINS
 | 
			
		||||
        #define _E4_PINS E4_STEP_PIN, E4_DIR_PIN, E4_ENABLE_PIN, E4_MS1_PIN, E4_MS2_PIN, E4_CS_PIN,
 | 
			
		||||
        #if MIXING_STEPPERS > 5
 | 
			
		||||
          #undef _E5_PINS
 | 
			
		||||
          #define _E5_PINS E5_STEP_PIN, E5_DIR_PIN, E5_ENABLE_PIN, E5_MS1_PIN, E5_MS2_PIN, E5_CS_PIN,
 | 
			
		||||
        #endif // MIXING_STEPPERS > 5
 | 
			
		||||
      #endif // MIXING_STEPPERS > 4
 | 
			
		||||
    #endif // MIXING_STEPPERS > 3
 | 
			
		||||
  #endif // MIXING_STEPPERS > 2
 | 
			
		||||
@ -856,7 +904,7 @@
 | 
			
		||||
    #ifndef X2_CS_PIN
 | 
			
		||||
      #define X2_CS_PIN   _EPIN(E_STEPPERS, CS)
 | 
			
		||||
    #endif
 | 
			
		||||
    #if E_STEPPERS > 4 || !PIN_EXISTS(X2_ENABLE)
 | 
			
		||||
    #if E_STEPPERS > MAX_EXTRUDERS || !PIN_EXISTS(X2_ENABLE)
 | 
			
		||||
      #error "No E stepper plug left for X2!"
 | 
			
		||||
    #endif
 | 
			
		||||
  #endif
 | 
			
		||||
@ -881,7 +929,7 @@
 | 
			
		||||
    #ifndef Y2_CS_PIN
 | 
			
		||||
      #define Y2_CS_PIN   _EPIN(Y2_E_INDEX, CS)
 | 
			
		||||
    #endif
 | 
			
		||||
    #if Y2_E_INDEX > 4 || !PIN_EXISTS(Y2_ENABLE)
 | 
			
		||||
    #if Y2_E_INDEX > MAX_EXTRUDERS || !PIN_EXISTS(Y2_ENABLE)
 | 
			
		||||
      #error "No E stepper plug left for Y2!"
 | 
			
		||||
    #endif
 | 
			
		||||
  #endif
 | 
			
		||||
@ -906,7 +954,7 @@
 | 
			
		||||
    #ifndef Z2_CS_PIN
 | 
			
		||||
      #define Z2_CS_PIN   _EPIN(Z2_E_INDEX, CS)
 | 
			
		||||
    #endif
 | 
			
		||||
    #if Z2_E_INDEX > 4 || !PIN_EXISTS(Z2_ENABLE)
 | 
			
		||||
    #if Z2_E_INDEX > MAX_EXTRUDERS || !PIN_EXISTS(Z2_ENABLE)
 | 
			
		||||
      #error "No E stepper plug left for Z2!"
 | 
			
		||||
    #endif
 | 
			
		||||
  #endif
 | 
			
		||||
@ -952,8 +1000,8 @@
 | 
			
		||||
    Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, Y_MIN_PIN, Y_MAX_PIN, Y_MS1_PIN, Y_MS2_PIN, Y_CS_PIN, \
 | 
			
		||||
    Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, Z_MIN_PIN, Z_MAX_PIN, Z_MS1_PIN, Z_MS2_PIN, Z_MS3_PIN, Z_CS_PIN, Z_MIN_PROBE_PIN, \
 | 
			
		||||
    PS_ON_PIN, HEATER_BED_PIN, FAN_PIN, FAN1_PIN, FAN2_PIN, CONTROLLER_FAN_PIN, \
 | 
			
		||||
    _E0_PINS _E1_PINS _E2_PINS _E3_PINS _E4_PINS BED_PINS \
 | 
			
		||||
    _H0_PINS _H1_PINS _H2_PINS _H3_PINS _H4_PINS \
 | 
			
		||||
    _E0_PINS _E1_PINS _E2_PINS _E3_PINS _E4_PINS _E5_PINS BED_PINS \
 | 
			
		||||
    _H0_PINS _H1_PINS _H2_PINS _H3_PINS _H4_PINS _H5_PINS \
 | 
			
		||||
    _X2_PINS _Y2_PINS _Z2_PINS _Z3_PINS \
 | 
			
		||||
    HAL_SENSITIVE_PINS \
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -361,6 +361,30 @@
 | 
			
		||||
#if PIN_EXISTS(E4_STEP)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, E4_STEP_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
#if PIN_EXISTS(E5_AUTO_FAN)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, E5_AUTO_FAN_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
#if PIN_EXISTS(E5_CS)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, E5_CS_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
#if PIN_EXISTS(E5_DIR)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, E5_DIR_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
#if PIN_EXISTS(E5_ENABLE)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, E5_ENABLE_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
#if PIN_EXISTS(E5_MS1)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, E5_MS1_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
#if PIN_EXISTS(E5_MS2)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, E5_MS2_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
#if PIN_EXISTS(E5_MS3)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, E5_MS3_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
#if PIN_EXISTS(E5_STEP)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, E5_STEP_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(ENET_CRS) && ENET_CRS >= 0
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, ENET_CRS)
 | 
			
		||||
#endif
 | 
			
		||||
@ -578,6 +602,9 @@
 | 
			
		||||
#if PIN_EXISTS(ORIG_E4_AUTO_FAN)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, ORIG_E4_AUTO_FAN_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
#if PIN_EXISTS(ORIG_E5_AUTO_FAN)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, ORIG_E5_AUTO_FAN_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
#if PIN_EXISTS(PHOTOGRAPH)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, PHOTOGRAPH_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
@ -689,6 +716,9 @@
 | 
			
		||||
#if PIN_EXISTS(SOL4)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, SOL4_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
#if PIN_EXISTS(SOL5)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, SOL5_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(SPARE_IO) && SPARE_IO >= 0
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, SPARE_IO)
 | 
			
		||||
#endif
 | 
			
		||||
@ -1043,3 +1073,9 @@
 | 
			
		||||
#if PIN_EXISTS(E4_SERIAL_RX)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, E4_SERIAL_RX_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
#if PIN_EXISTS(E5_SERIAL_TX)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, E5_SERIAL_TX_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
#if PIN_EXISTS(E5_SERIAL_RX)
 | 
			
		||||
  REPORT_NAME_DIGITAL(__LINE__, E5_SERIAL_RX_PIN)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user