🐛 More explicit allocation of solenoids

In reference to #22887
This commit is contained in:
Scott Lahteine 2021-10-24 23:32:34 -05:00
parent 5b478cd5f6
commit f179e25cc6
4 changed files with 41 additions and 61 deletions

View File

@ -260,7 +260,6 @@
#define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders
#define PARKING_EXTRUDER_GRAB_DISTANCE 1 // (mm) Distance to move beyond the parking point to grab the extruder #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // (mm) Distance to move beyond the parking point to grab the extruder
//#define MANUAL_SOLENOID_CONTROL // Manual control of docking solenoids with M380 S / M381
#if ENABLED(PARKING_EXTRUDER) #if ENABLED(PARKING_EXTRUDER)

View File

@ -34,28 +34,12 @@
#include "../module/tool_change.h" #include "../module/tool_change.h"
#endif #endif
#define HAS_SOLENOID(N) (HAS_SOLENOID_##N && (ENABLED(MANUAL_SOLENOID_CONTROL) || N < EXTRUDERS))
// Used primarily with MANUAL_SOLENOID_CONTROL // Used primarily with MANUAL_SOLENOID_CONTROL
static void set_solenoid(const uint8_t num, const bool active) { static void set_solenoid(const uint8_t num, const bool active) {
const uint8_t value = active ? PE_MAGNET_ON_STATE : !PE_MAGNET_ON_STATE; const uint8_t value = active ? PE_MAGNET_ON_STATE : !PE_MAGNET_ON_STATE;
#define _SOL_CASE(N) case N: TERN_(HAS_SOLENOID_##N, OUT_WRITE(SOL##N##_PIN, value)); break;
switch (num) { switch (num) {
case 0: OUT_WRITE(SOL0_PIN, value); break; REPEAT(8, _SOL_CASE)
#if HAS_SOLENOID(1)
case 1: OUT_WRITE(SOL1_PIN, value); break;
#endif
#if HAS_SOLENOID(2)
case 2: OUT_WRITE(SOL2_PIN, value); break;
#endif
#if HAS_SOLENOID(3)
case 3: OUT_WRITE(SOL3_PIN, value); break;
#endif
#if HAS_SOLENOID(4)
case 4: OUT_WRITE(SOL4_PIN, value); break;
#endif
#if HAS_SOLENOID(5)
case 5: OUT_WRITE(SOL5_PIN, value); break;
#endif
default: SERIAL_ECHO_MSG(STR_INVALID_SOLENOID); break; default: SERIAL_ECHO_MSG(STR_INVALID_SOLENOID); break;
} }
@ -67,25 +51,11 @@ static void set_solenoid(const uint8_t num, const bool active) {
void enable_solenoid(const uint8_t num) { set_solenoid(num, true); } void enable_solenoid(const uint8_t num) { set_solenoid(num, true); }
void disable_solenoid(const uint8_t num) { set_solenoid(num, false); } void disable_solenoid(const uint8_t num) { set_solenoid(num, false); }
void enable_solenoid_on_active_extruder() { enable_solenoid(active_extruder); } void enable_solenoid_on_active_extruder() { }
void disable_all_solenoids() { void disable_all_solenoids() {
disable_solenoid(0); #define _SOL_DISABLE(N) TERN_(HAS_SOLENOID_##N, disable_solenoid(N));
#if HAS_SOLENOID(1) REPEAT(8, _SOL_DISABLE)
disable_solenoid(1);
#endif
#if HAS_SOLENOID(2)
disable_solenoid(2);
#endif
#if HAS_SOLENOID(3)
disable_solenoid(3);
#endif
#if HAS_SOLENOID(4)
disable_solenoid(4);
#endif
#if HAS_SOLENOID(5)
disable_solenoid(5);
#endif
} }
#endif // EXT_SOLENOID || MANUAL_SOLENOID_CONTROL #endif // EXT_SOLENOID || MANUAL_SOLENOID_CONTROL

View File

@ -1633,9 +1633,6 @@
#if PIN_EXISTS(E0_MS1) #if PIN_EXISTS(E0_MS1)
#define HAS_E0_MS_PINS 1 #define HAS_E0_MS_PINS 1
#endif #endif
#if PIN_EXISTS(SOL0)
#define HAS_SOLENOID_0 1
#endif
#if E_STEPPERS > 1 #if E_STEPPERS > 1
#if PIN_EXISTS(E1_ENABLE) || AXIS_IS_L64XX(E1) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E1)) #if PIN_EXISTS(E1_ENABLE) || AXIS_IS_L64XX(E1) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E1))
@ -1650,9 +1647,6 @@
#if PIN_EXISTS(E1_MS1) #if PIN_EXISTS(E1_MS1)
#define HAS_E1_MS_PINS 1 #define HAS_E1_MS_PINS 1
#endif #endif
#if PIN_EXISTS(SOL1)
#define HAS_SOLENOID_1 1
#endif
#endif #endif
#if E_STEPPERS > 2 #if E_STEPPERS > 2
@ -1668,9 +1662,6 @@
#if PIN_EXISTS(E2_MS1) #if PIN_EXISTS(E2_MS1)
#define HAS_E2_MS_PINS 1 #define HAS_E2_MS_PINS 1
#endif #endif
#if PIN_EXISTS(SOL2)
#define HAS_SOLENOID_2 1
#endif
#endif #endif
#if E_STEPPERS > 3 #if E_STEPPERS > 3
@ -1686,9 +1677,6 @@
#if PIN_EXISTS(E3_MS1) #if PIN_EXISTS(E3_MS1)
#define HAS_E3_MS_PINS 1 #define HAS_E3_MS_PINS 1
#endif #endif
#if PIN_EXISTS(SOL3)
#define HAS_SOLENOID_3 1
#endif
#endif #endif
#if E_STEPPERS > 4 #if E_STEPPERS > 4
@ -1704,9 +1692,6 @@
#if PIN_EXISTS(E4_MS1) #if PIN_EXISTS(E4_MS1)
#define HAS_E4_MS_PINS 1 #define HAS_E4_MS_PINS 1
#endif #endif
#if PIN_EXISTS(SOL4)
#define HAS_SOLENOID_4 1
#endif
#endif #endif
#if E_STEPPERS > 5 #if E_STEPPERS > 5
@ -1722,9 +1707,6 @@
#if PIN_EXISTS(E5_MS1) #if PIN_EXISTS(E5_MS1)
#define HAS_E5_MS_PINS 1 #define HAS_E5_MS_PINS 1
#endif #endif
#if PIN_EXISTS(SOL5)
#define HAS_SOLENOID_5 1
#endif
#endif #endif
#if E_STEPPERS > 6 #if E_STEPPERS > 6
@ -1740,9 +1722,6 @@
#if PIN_EXISTS(E6_MS1) #if PIN_EXISTS(E6_MS1)
#define HAS_E6_MS_PINS 1 #define HAS_E6_MS_PINS 1
#endif #endif
#if PIN_EXISTS(SOL6)
#define HAS_SOLENOID_6 1
#endif
#endif #endif
#if E_STEPPERS > 7 #if E_STEPPERS > 7
@ -1758,9 +1737,6 @@
#if PIN_EXISTS(E7_MS1) #if PIN_EXISTS(E7_MS1)
#define HAS_E7_MS_PINS 1 #define HAS_E7_MS_PINS 1
#endif #endif
#if PIN_EXISTS(SOL7)
#define HAS_SOLENOID_7 1
#endif
#endif #endif
#if !defined(DISABLE_INACTIVE_E) && ENABLED(DISABLE_E) #if !defined(DISABLE_INACTIVE_E) && ENABLED(DISABLE_E)
@ -1770,6 +1746,41 @@
#undef DISABLE_INACTIVE_E #undef DISABLE_INACTIVE_E
#endif // HAS_EXTRUDERS #endif // HAS_EXTRUDERS
/**
* Set solenoid flags if any features use solenoids
* - EXT_SOLENOID (M380, M381) to enable/disable the extruder solenoid
* - MANUAL_SOLENOID_CONTROL (M380, M381) to enable/disable solenoids by index
* - PARKING_EXTRUDER uses SOL0_PIN and SOL1_PIN
* - SOLENOID_PROBE uses SOL1_PIN
* - Z_PROBE_SLED uses SOL1_PIN, when defined (unless EXT_SOLENOID is enabled)
*/
#if ANY(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL, PARKING_EXTRUDER, SOLENOID_PROBE, Z_PROBE_SLED)
#if PIN_EXISTS(SOL0) && (EITHER(MANUAL_SOLENOID_CONTROL, PARKING_EXTRUDER) || BOTH(EXT_SOLENOID, HAS_EXTRUDERS))
#define HAS_SOLENOID_0 1
#endif
#if PIN_EXISTS(SOL1) && (ANY(MANUAL_SOLENOID_CONTROL, PARKING_EXTRUDER, SOLENOID_PROBE, Z_PROBE_SLED) || TERN0(EXT_SOLENOID, E_STEPPERS > 1))
#define HAS_SOLENOID_1 1
#endif
#if PIN_EXISTS(SOL2) && (ENABLED(MANUAL_SOLENOID_CONTROL) || TERN0(EXT_SOLENOID, E_STEPPERS > 2))
#define HAS_SOLENOID_2 2
#endif
#if PIN_EXISTS(SOL3) && (ENABLED(MANUAL_SOLENOID_CONTROL) || TERN0(EXT_SOLENOID, E_STEPPERS > 3))
#define HAS_SOLENOID_3 3
#endif
#if PIN_EXISTS(SOL4) && (ENABLED(MANUAL_SOLENOID_CONTROL) || TERN0(EXT_SOLENOID, E_STEPPERS > 4))
#define HAS_SOLENOID_4 4
#endif
#if PIN_EXISTS(SOL5) && (ENABLED(MANUAL_SOLENOID_CONTROL) || TERN0(EXT_SOLENOID, E_STEPPERS > 5))
#define HAS_SOLENOID_5 5
#endif
#if PIN_EXISTS(SOL6) && (ENABLED(MANUAL_SOLENOID_CONTROL) || TERN0(EXT_SOLENOID, E_STEPPERS > 6))
#define HAS_SOLENOID_6 6
#endif
#if PIN_EXISTS(SOL7) && (ENABLED(MANUAL_SOLENOID_CONTROL) || TERN0(EXT_SOLENOID, E_STEPPERS > 7))
#define HAS_SOLENOID_7 7
#endif
#endif
// //
// Trinamic Stepper Drivers // Trinamic Stepper Drivers
// //

View File

@ -1239,7 +1239,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
/** /**
* (Magnetic) Parking Extruder requirements * (Magnetic) Parking Extruder requirements
*/ */
#if ANY(PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER) #if EITHER(PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER)
#if ENABLED(EXT_SOLENOID) #if ENABLED(EXT_SOLENOID)
#error "(MAGNETIC_)PARKING_EXTRUDER and EXT_SOLENOID are incompatible. (Pins are used twice.)" #error "(MAGNETIC_)PARKING_EXTRUDER and EXT_SOLENOID are incompatible. (Pins are used twice.)"
#elif EXTRUDERS != 2 #elif EXTRUDERS != 2