2017-09-06 13:28:31 +02:00
/**
* Marlin 3 D Printer Firmware
2020-02-03 15:00:57 +01:00
* Copyright ( c ) 2020 MarlinFirmware [ https : //github.com/MarlinFirmware/Marlin]
2017-09-06 13:28:31 +02:00
*
* Based on Sprinter and grbl .
2019-06-28 06:57:50 +02:00
* Copyright ( c ) 2011 Camiel Gubbels / Erik van der Zalm
2017-09-06 13:28:31 +02:00
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2020-07-23 05:20:14 +02:00
* along with this program . If not , see < https : //www.gnu.org/licenses/>.
2017-09-06 13:28:31 +02:00
*
*/
2017-09-17 10:43:45 +02:00
# include "../inc/MarlinConfig.h"
2019-03-17 05:43:06 +01:00
# if EITHER(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL)
2017-09-06 13:28:31 +02:00
2017-09-17 10:43:45 +02:00
# include "solenoid.h"
# include "../module/motion.h" // for active_extruder
2021-01-01 21:54:44 +01:00
// PARKING_EXTRUDER options alter the default behavior of solenoids, this ensures compliance of M380-381
# if ENABLED(PARKING_EXTRUDER)
# include "../module/tool_change.h"
# define SOLENOID_MAGNETIZED_STATE (TERN_(PARKING_EXTRUDER_SOLENOIDS_INVERT,!)PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE)
2019-02-06 13:34:53 +01:00
# else
2021-01-01 21:54:44 +01:00
# define SOLENOID_MAGNETIZED_STATE HIGH
2019-02-06 13:34:53 +01:00
# endif
2021-01-01 21:54:44 +01:00
# define HAS_SOLENOID(N) (HAS_SOLENOID_##N && TERN(MANUAL_SOLENOID_CONTROL, true, EXTRUDERS > N))
2019-02-06 13:34:53 +01:00
// Used primarily with MANUAL_SOLENOID_CONTROL
static void set_solenoid ( const uint8_t num , const bool active ) {
2021-01-01 21:54:44 +01:00
const uint8_t value = active ? SOLENOID_MAGNETIZED_STATE : ! SOLENOID_MAGNETIZED_STATE ;
2017-09-06 13:28:31 +02:00
switch ( num ) {
case 0 :
2019-02-06 13:34:53 +01:00
OUT_WRITE ( SOL0_PIN , value ) ;
2021-01-01 21:54:44 +01:00
TERN_ ( PARKING_EXTRUDER , if ( ! active & & active_extruder = = 0 ) parking_extruder_set_parked ( ) ) ; // If active extruder's solenoid is disabled, carriage is considered parked
2017-09-06 13:28:31 +02:00
break ;
2019-02-06 13:34:53 +01:00
# if HAS_SOLENOID(1)
case 1 :
OUT_WRITE ( SOL1_PIN , value ) ;
2021-01-01 21:54:44 +01:00
TERN_ ( PARKING_EXTRUDER , if ( ! active & & active_extruder = = 1 ) parking_extruder_set_parked ( ) ) ; // If active extruder's solenoid is disabled, carriage is considered parked
2019-02-06 13:34:53 +01:00
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
2017-09-06 13:28:31 +02:00
default :
2020-02-26 10:02:03 +01:00
SERIAL_ECHO_MSG ( STR_INVALID_SOLENOID ) ;
2017-09-06 13:28:31 +02:00
break ;
}
}
2019-02-06 13:34:53 +01:00
void enable_solenoid ( const uint8_t num ) { set_solenoid ( num , true ) ; }
void disable_solenoid ( const uint8_t num ) { set_solenoid ( num , false ) ; }
2017-09-06 13:28:31 +02:00
void enable_solenoid_on_active_extruder ( ) { enable_solenoid ( active_extruder ) ; }
void disable_all_solenoids ( ) {
2019-02-06 13:34:53 +01:00
disable_solenoid ( 0 ) ;
# if HAS_SOLENOID(1)
disable_solenoid ( 1 ) ;
2017-09-06 13:28:31 +02:00
# endif
2019-02-06 13:34:53 +01:00
# if HAS_SOLENOID(2)
disable_solenoid ( 2 ) ;
2017-09-06 13:28:31 +02:00
# endif
2019-02-06 13:34:53 +01:00
# if HAS_SOLENOID(3)
disable_solenoid ( 3 ) ;
2017-09-06 13:28:31 +02:00
# endif
2019-02-06 13:34:53 +01:00
# if HAS_SOLENOID(4)
disable_solenoid ( 4 ) ;
2017-09-06 13:28:31 +02:00
# endif
2019-02-06 13:34:53 +01:00
# if HAS_SOLENOID(5)
disable_solenoid ( 5 ) ;
2018-09-13 08:35:55 +02:00
# endif
2017-09-06 13:28:31 +02:00
}
2019-03-17 05:43:06 +01:00
# endif // EXT_SOLENOID || MANUAL_SOLENOID_CONTROL