From 19cf72e057c65a92ad12a18cd6926d0fd260641a Mon Sep 17 00:00:00 2001 From: Mark Zachmann Date: Wed, 6 Feb 2019 07:34:53 -0500 Subject: [PATCH] Support individual solenoid disable with M381 (#13008) --- Marlin/src/feature/solenoid.cpp | 86 ++++++++++++++------------ Marlin/src/feature/solenoid.h | 1 + Marlin/src/gcode/control/M380_M381.cpp | 13 +++- Marlin/src/gcode/gcode.cpp | 2 +- 4 files changed, 60 insertions(+), 42 deletions(-) diff --git a/Marlin/src/feature/solenoid.cpp b/Marlin/src/feature/solenoid.cpp index 4b9b5d48ca..521541bd64 100644 --- a/Marlin/src/feature/solenoid.cpp +++ b/Marlin/src/feature/solenoid.cpp @@ -28,60 +28,70 @@ #include "../module/motion.h" // for active_extruder -void enable_solenoid(const uint8_t num) { +#if ENABLED(MANUAL_SOLENOID_CONTROL) + #define HAS_SOLENOID(N) HAS_SOLENOID_##N +#else + #define HAS_SOLENOID(N) (HAS_SOLENOID_##N && EXTRUDERS > N) +#endif + +// Used primarily with MANUAL_SOLENOID_CONTROL +static void set_solenoid(const uint8_t num, const bool active) { + const uint8_t value = active ? HIGH : LOW; switch (num) { case 0: - OUT_WRITE(SOL0_PIN, HIGH); + OUT_WRITE(SOL0_PIN, value); break; - #if HAS_SOLENOID_1 && EXTRUDERS > 1 - case 1: - OUT_WRITE(SOL1_PIN, HIGH); - break; - #endif - #if HAS_SOLENOID_2 && EXTRUDERS > 2 - case 2: - OUT_WRITE(SOL2_PIN, HIGH); - break; - #endif - #if HAS_SOLENOID_3 && EXTRUDERS > 3 - case 3: - OUT_WRITE(SOL3_PIN, HIGH); - break; - #endif - #if HAS_SOLENOID_4 && EXTRUDERS > 4 - case 4: - OUT_WRITE(SOL4_PIN, HIGH); - break; - #endif - #if HAS_SOLENOID_5 && EXTRUDERS > 5 - case 5: - OUT_WRITE(SOL5_PIN, HIGH); - break; - #endif + #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(MSG_INVALID_SOLENOID); break; } } +void enable_solenoid(const uint8_t num) { set_solenoid(num, true); } +void disable_solenoid(const uint8_t num) { set_solenoid(num, false); } void enable_solenoid_on_active_extruder() { enable_solenoid(active_extruder); } void disable_all_solenoids() { - OUT_WRITE(SOL0_PIN, LOW); - #if HAS_SOLENOID_1 && EXTRUDERS > 1 - OUT_WRITE(SOL1_PIN, LOW); + disable_solenoid(0); + #if HAS_SOLENOID(1) + disable_solenoid(1); #endif - #if HAS_SOLENOID_2 && EXTRUDERS > 2 - OUT_WRITE(SOL2_PIN, LOW); + #if HAS_SOLENOID(2) + disable_solenoid(2); #endif - #if HAS_SOLENOID_3 && EXTRUDERS > 3 - OUT_WRITE(SOL3_PIN, LOW); + #if HAS_SOLENOID(3) + disable_solenoid(3); #endif - #if HAS_SOLENOID_4 && EXTRUDERS > 4 - OUT_WRITE(SOL4_PIN, LOW); + #if HAS_SOLENOID(4) + disable_solenoid(4); #endif - #if HAS_SOLENOID_5 && EXTRUDERS > 5 - OUT_WRITE(SOL5_PIN, LOW); + #if HAS_SOLENOID(5) + disable_solenoid(5); #endif } diff --git a/Marlin/src/feature/solenoid.h b/Marlin/src/feature/solenoid.h index 6652b19daa..812253aaa6 100644 --- a/Marlin/src/feature/solenoid.h +++ b/Marlin/src/feature/solenoid.h @@ -24,3 +24,4 @@ void enable_solenoid_on_active_extruder(); void disable_all_solenoids(); void enable_solenoid(const uint8_t num); +void disable_solenoid(const uint8_t num); diff --git a/Marlin/src/gcode/control/M380_M381.cpp b/Marlin/src/gcode/control/M380_M381.cpp index 7f4a3afc52..ab5dac4d3b 100644 --- a/Marlin/src/gcode/control/M380_M381.cpp +++ b/Marlin/src/gcode/control/M380_M381.cpp @@ -35,15 +35,22 @@ */ void GcodeSuite::M380() { #if ENABLED(MANUAL_SOLENOID_CONTROL) - enable_solenoid(parser.seenval('S') ? parser.value_int() : active_extruder); + enable_solenoid(parser.intval('S', active_extruder)); #else enable_solenoid_on_active_extruder(); #endif } /** - * M381: Disable all solenoids + * M381: Disable all solenoids if EXT_SOLENOID + * Disable selected/active solenoid if MANUAL_SOLENOID_CONTROL */ -void GcodeSuite::M381() { disable_all_solenoids(); } +void GcodeSuite::M381() { + #if ENABLED(MANUAL_SOLENOID_CONTROL) + disable_solenoid(parser.intval('S', active_extruder)); + #else + disable_all_solenoids(); + #endif +} #endif // EXT_SOLENOID || MANUAL_SOLENOID_CONTROL diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 2ca8e08c28..39b257bc0d 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -547,7 +547,7 @@ void GcodeSuite::process_parsed_command( #if ENABLED(EXT_SOLENOID) || ENABLED(MANUAL_SOLENOID_CONTROL) case 380: M380(); break; // M380: Activate solenoid on active (or specified) extruder - case 381: M381(); break; // M381: Disable all solenoids + case 381: M381(); break; // M381: Disable all solenoids or, if MANUAL_SOLENOID_CONTROL, active (or specified) solenoid #endif case 400: M400(); break; // M400: Finish all moves