|
@@ -9843,25 +9843,41 @@ inline void gcode_M999() {
|
9843
|
9843
|
}
|
9844
|
9844
|
|
9845
|
9845
|
#if ENABLED(SWITCHING_EXTRUDER)
|
9846
|
|
- inline void move_extruder_servo(uint8_t e) {
|
9847
|
|
- const int angles[2] = SWITCHING_EXTRUDER_SERVO_ANGLES;
|
9848
|
|
- MOVE_SERVO(SWITCHING_EXTRUDER_SERVO_NR, angles[e]);
|
9849
|
|
- safe_delay(500);
|
|
9846
|
+ #if EXTRUDERS > 3
|
|
9847
|
+ #define REQ_ANGLES 4
|
|
9848
|
+ #define _SERVO_NR (e < 2 ? SWITCHING_EXTRUDER_SERVO_NR : SWITCHING_EXTRUDER_E23_SERVO_NR)
|
|
9849
|
+ #else
|
|
9850
|
+ #define REQ_ANGLES 2
|
|
9851
|
+ #define _SERVO_NR SWITCHING_EXTRUDER_SERVO_NR
|
|
9852
|
+ #endif
|
|
9853
|
+ inline void move_extruder_servo(const uint8_t e) {
|
|
9854
|
+ constexpr int16_t angles[] = SWITCHING_EXTRUDER_SERVO_ANGLES;
|
|
9855
|
+ static_assert(COUNT(angles) == REQ_ANGLES, "SWITCHING_EXTRUDER_SERVO_ANGLES needs " STRINGIFY(REQ_ANGLES) " angles.");
|
|
9856
|
+ stepper.synchronize();
|
|
9857
|
+ #if EXTRUDERS & 1
|
|
9858
|
+ if (e < EXTRUDERS - 1)
|
|
9859
|
+ #endif
|
|
9860
|
+ {
|
|
9861
|
+ MOVE_SERVO(_SERVO_NR, angles[e]);
|
|
9862
|
+ safe_delay(500);
|
|
9863
|
+ }
|
9850
|
9864
|
}
|
9851
|
|
-#endif
|
|
9865
|
+#endif // SWITCHING_EXTRUDER
|
9852
|
9866
|
|
9853
|
9867
|
#if ENABLED(SWITCHING_NOZZLE)
|
9854
|
|
- inline void move_nozzle_servo(uint8_t e) {
|
9855
|
|
- const int angles[2] = SWITCHING_NOZZLE_SERVO_ANGLES;
|
|
9868
|
+ inline void move_nozzle_servo(const uint8_t e) {
|
|
9869
|
+ const int16_t angles[2] = SWITCHING_NOZZLE_SERVO_ANGLES;
|
|
9870
|
+ stepper.synchronize();
|
9856
|
9871
|
MOVE_SERVO(SWITCHING_NOZZLE_SERVO_NR, angles[e]);
|
9857
|
9872
|
safe_delay(500);
|
9858
|
9873
|
}
|
9859
|
9874
|
#endif
|
9860
|
9875
|
|
9861
|
|
-inline void invalid_extruder_error(const uint8_t &e) {
|
|
9876
|
+inline void invalid_extruder_error(const uint8_t e) {
|
9862
|
9877
|
SERIAL_ECHO_START();
|
9863
|
9878
|
SERIAL_CHAR('T');
|
9864
|
9879
|
SERIAL_ECHO_F(e, DEC);
|
|
9880
|
+ SERIAL_CHAR(' ');
|
9865
|
9881
|
SERIAL_ECHOLN(MSG_INVALID_EXTRUDER);
|
9866
|
9882
|
}
|
9867
|
9883
|
|
|
@@ -9881,10 +9897,10 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
|
9881
|
9897
|
|
9882
|
9898
|
#else // !MIXING_EXTRUDER || MIXING_VIRTUAL_TOOLS <= 1
|
9883
|
9899
|
|
9884
|
|
- #if HOTENDS > 1
|
|
9900
|
+ if (tmp_extruder >= EXTRUDERS)
|
|
9901
|
+ return invalid_extruder_error(tmp_extruder);
|
9885
|
9902
|
|
9886
|
|
- if (tmp_extruder >= EXTRUDERS)
|
9887
|
|
- return invalid_extruder_error(tmp_extruder);
|
|
9903
|
+ #if HOTENDS > 1
|
9888
|
9904
|
|
9889
|
9905
|
const float old_feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : feedrate_mm_s;
|
9890
|
9906
|
|
|
@@ -10006,6 +10022,7 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
|
10006
|
10022
|
#else // !DUAL_X_CARRIAGE
|
10007
|
10023
|
|
10008
|
10024
|
#if ENABLED(SWITCHING_NOZZLE)
|
|
10025
|
+ #define DONT_SWITCH (SWITCHING_EXTRUDER_SERVO_NR == SWITCHING_NOZZLE_SERVO_NR)
|
10009
|
10026
|
// <0 if the new nozzle is higher, >0 if lower. A bigger raise when lower.
|
10010
|
10027
|
const float z_diff = hotend_offset[Z_AXIS][active_extruder] - hotend_offset[Z_AXIS][tmp_extruder],
|
10011
|
10028
|
z_raise = 0.3 + (z_diff > 0.0 ? z_diff : 0.0);
|
|
@@ -10013,16 +10030,7 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
|
10013
|
10030
|
// Always raise by some amount (destination copied from current_position earlier)
|
10014
|
10031
|
current_position[Z_AXIS] += z_raise;
|
10015
|
10032
|
planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder);
|
10016
|
|
- stepper.synchronize();
|
10017
|
|
-
|
10018
|
|
- move_nozzle_servo(active_extruder);
|
10019
|
|
- #endif
|
10020
|
|
-
|
10021
|
|
- #if ENABLED(SWITCHING_EXTRUDER)
|
10022
|
|
- #if !(ENABLED(SWITCHING_NOZZLE) && (SWITCHING_EXTRUDER_SERVO_NR == SWITCHING_NOZZLE_SERVO_NR))
|
10023
|
|
- stepper.synchronize();
|
10024
|
|
- move_extruder_servo(active_extruder);
|
10025
|
|
- #endif
|
|
10033
|
+ move_nozzle_servo(tmp_extruder);
|
10026
|
10034
|
#endif
|
10027
|
10035
|
|
10028
|
10036
|
/**
|
|
@@ -10167,19 +10175,18 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
|
10167
|
10175
|
|
10168
|
10176
|
#else // HOTENDS <= 1
|
10169
|
10177
|
|
10170
|
|
- // Set the new active extruder
|
10171
|
|
- active_extruder = tmp_extruder;
|
10172
|
|
-
|
10173
|
10178
|
UNUSED(fr_mm_s);
|
10174
|
10179
|
UNUSED(no_move);
|
10175
|
10180
|
|
10176
|
|
- #if ENABLED(SWITCHING_EXTRUDER)
|
10177
|
|
- stepper.synchronize();
|
10178
|
|
- move_extruder_servo(active_extruder);
|
10179
|
|
- #endif
|
|
10181
|
+ // Set the new active extruder
|
|
10182
|
+ active_extruder = tmp_extruder;
|
10180
|
10183
|
|
10181
|
10184
|
#endif // HOTENDS <= 1
|
10182
|
10185
|
|
|
10186
|
+ #if ENABLED(SWITCHING_EXTRUDER) && !DONT_SWITCH
|
|
10187
|
+ move_extruder_servo(active_extruder);
|
|
10188
|
+ #endif
|
|
10189
|
+
|
10183
|
10190
|
SERIAL_ECHO_START();
|
10184
|
10191
|
SERIAL_ECHOLNPAIR(MSG_ACTIVE_EXTRUDER, (int)active_extruder);
|
10185
|
10192
|
|