Skip to content

Commit

Permalink
Improve SPINDLE_FEATURE and LASER_FEATURE. Stop and restore cutter st…
Browse files Browse the repository at this point in the history
…atus during tool change
  • Loading branch information
DerAndere1 committed Jan 21, 2025
1 parent 31a86a8 commit 464a15c
Show file tree
Hide file tree
Showing 4 changed files with 145 additions and 72 deletions.
16 changes: 10 additions & 6 deletions Marlin/src/feature/spindle_laser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ void SpindleLaser::init() {
OUT_WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Init spindle to off
#endif
#if PIN_EXISTS(LASER_ENA)
OUT_WRITE(LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Init spindle to off
OUT_WRITE(LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Init laser to off
#endif
#if ENABLED(SPINDLE_CHANGE_DIR)
OUT_WRITE(SPINDLE_DIR_PIN, SPINDLE_INVERT_DIR); // Init rotation to clockwise (M3)
Expand All @@ -99,7 +99,7 @@ void SpindleLaser::init() {
hal.set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Set to lowest speed
#endif
#if ENABLED(LASER_FEATURE)
SET_PWM(SPINDLE_LASER_PWM_PIN);
SET_PWM(LASER_PWM_PIN);
hal.set_pwm_duty(pin_t(LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Set to lowest speed
#endif
#endif
Expand Down Expand Up @@ -190,10 +190,14 @@ void SpindleLaser::apply_power(const uint8_t opwr) {
#elif ENABLED(SPINDLE_SERVO)
servo[SPINDLE_SERVO_NR].move(opwr);
#else
if (active_tool_type == TYPE_LASER)
WRITE(LASER_ENA_PIN, enabled() ? SPINDLE_LASER_ACTIVE_STATE : !SPINDLE_LASER_ACTIVE_STATE);
else if (active_tool_type == TYPE_SPINDLE)
WRITE(SPINDLE_LASER_ENA_PIN, enabled() ? SPINDLE_LASER_ACTIVE_STATE : !SPINDLE_LASER_ACTIVE_STATE);
#if ENABLED(LASER_FEATURE)
if (active_tool_type == TYPE_LASER)
WRITE(LASER_ENA_PIN, enabled() ? SPINDLE_LASER_ACTIVE_STATE : !SPINDLE_LASER_ACTIVE_STATE);
#endif
#if ENABLED(SPINDLE_FEATURE)
if (active_tool_type == TYPE_SPINDLE)
WRITE(SPINDLE_LASER_ENA_PIN, enabled() ? SPINDLE_LASER_ACTIVE_STATE : !SPINDLE_LASER_ACTIVE_STATE);
#endif
isReadyForUI = true;
#endif
}
Expand Down
197 changes: 133 additions & 64 deletions Marlin/src/inc/SanityCheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -3915,71 +3915,140 @@ static_assert(_PLUS_TEST(3), "DEFAULT_MAX_ACCELERATION values must be positive."
#endif
#endif

#define _PIN_CONFLICT(P) (PIN_EXISTS(P) && P##_PIN == SPINDLE_LASER_PWM_PIN)
#if NONE(SPINDLE_SERVO, SPINDLE_LASER_USE_PWM) && !PIN_EXISTS(SPINDLE_LASER_ENA)
#error "(SPINDLE|LASER)_FEATURE requires SPINDLE_LASER_ENA_PIN, SPINDLE_LASER_USE_PWM, or SPINDLE_SERVO to control the power."
#elif ENABLED(SPINDLE_CHANGE_DIR) && !PIN_EXISTS(SPINDLE_DIR)
#error "SPINDLE_DIR_PIN is required for SPINDLE_CHANGE_DIR."
#elif ENABLED(SPINDLE_LASER_USE_PWM)
#if !defined(SPINDLE_LASER_PWM_PIN) || SPINDLE_LASER_PWM_PIN < 0
#error "SPINDLE_LASER_PWM_PIN is required for SPINDLE_LASER_USE_PWM."
#elif !_TEST_PWM(SPINDLE_LASER_PWM_PIN)
#error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin."
#elif !defined(SPINDLE_LASER_PWM_INVERT)
#error "SPINDLE_LASER_PWM_INVERT is required for (SPINDLE|LASER)_FEATURE."
#elif !(defined(SPEED_POWER_MIN) && defined(SPEED_POWER_MAX) && defined(SPEED_POWER_STARTUP))
#error "SPINDLE_LASER_USE_PWM equation constant(s) missing."
#elif _PIN_CONFLICT(X_MIN)
#error "SPINDLE_LASER_PWM_PIN conflicts with X_MIN_PIN."
#elif _PIN_CONFLICT(X_MAX)
#error "SPINDLE_LASER_PWM_PIN conflicts with X_MAX_PIN."
#elif _PIN_CONFLICT(Z_STEP)
#error "SPINDLE_LASER_PWM_PIN conflicts with Z_STEP_PIN."
#elif _PIN_CONFLICT(CASE_LIGHT)
#error "SPINDLE_LASER_PWM_PIN conflicts with CASE_LIGHT_PIN."
#elif _PIN_CONFLICT(E0_AUTO_FAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with E0_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E1_AUTO_FAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with E1_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E2_AUTO_FAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with E2_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E3_AUTO_FAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with E3_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E4_AUTO_FAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with E4_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E5_AUTO_FAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with E5_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E6_AUTO_FAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with E6_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E7_AUTO_FAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with E7_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(FAN0)
#error "SPINDLE_LASER_PWM_PIN conflicts with FAN0_PIN."
#elif _PIN_CONFLICT(FAN1)
#error "SPINDLE_LASER_PWM_PIN conflicts with FAN1_PIN."
#elif _PIN_CONFLICT(FAN2)
#error "SPINDLE_LASER_PWM_PIN conflicts with FAN2_PIN."
#elif _PIN_CONFLICT(FAN3)
#error "SPINDLE_LASER_PWM_PIN conflicts with FAN3_PIN."
#elif _PIN_CONFLICT(FAN4)
#error "SPINDLE_LASER_PWM_PIN conflicts with FAN4_PIN."
#elif _PIN_CONFLICT(FAN5)
#error "SPINDLE_LASER_PWM_PIN conflicts with FAN5_PIN."
#elif _PIN_CONFLICT(FAN6)
#error "SPINDLE_LASER_PWM_PIN conflicts with FAN6_PIN."
#elif _PIN_CONFLICT(FAN7)
#error "SPINDLE_LASER_PWM_PIN conflicts with FAN7_PIN."
#elif _PIN_CONFLICT(CONTROLLERFAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with CONTROLLERFAN_PIN."
#elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_XY)
#error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_XY."
#elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_Z)
#error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_Z."
#elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_E)
#error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_E."
#if ENABLED(SPINDLE_FEATURE)
#define _PIN_CONFLICT(P) (PIN_EXISTS(P) && P##_PIN == SPINDLE_LASER_PWM_PIN)
#if NONE(SPINDLE_SERVO, SPINDLE_LASER_USE_PWM) && !PIN_EXISTS(SPINDLE_LASER_ENA)
#error "(SPINDLE|LASER)_FEATURE requires SPINDLE_LASER_ENA_PIN, SPINDLE_LASER_USE_PWM, or SPINDLE_SERVO to control the power."
#elif ENABLED(SPINDLE_CHANGE_DIR) && !PIN_EXISTS(SPINDLE_DIR)
#error "SPINDLE_DIR_PIN is required for SPINDLE_CHANGE_DIR."
#elif ENABLED(SPINDLE_LASER_USE_PWM)
#if (!defined(SPINDLE_LASER_PWM_PIN) || SPINDLE_LASER_PWM_PIN < 0) && (!defined(LASER_PWM_PIN) || LASER_PWM_PIN < 0)
#error "SPINDLE_LASER_PWM_PIN is required for SPINDLE_LASER_USE_PWM."
#elif !_TEST_PWM(SPINDLE_LASER_PWM_PIN)
#error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin."
#elif !defined(SPINDLE_LASER_PWM_INVERT)
#error "SPINDLE_LASER_PWM_INVERT is required for (SPINDLE|LASER)_FEATURE."
#elif !(defined(SPEED_POWER_MIN) && defined(SPEED_POWER_MAX) && defined(SPEED_POWER_STARTUP))
#error "SPINDLE_LASER_USE_PWM equation constant(s) missing."
#elif _PIN_CONFLICT(X_MIN)
#error "SPINDLE_LASER_PWM_PIN conflicts with X_MIN_PIN."
#elif _PIN_CONFLICT(X_MAX)
#error "SPINDLE_LASER_PWM_PIN conflicts with X_MAX_PIN."
#elif _PIN_CONFLICT(Z_STEP)
#error "SPINDLE_LASER_PWM_PIN conflicts with Z_STEP_PIN."
#elif _PIN_CONFLICT(CASE_LIGHT)
#error "SPINDLE_LASER_PWM_PIN conflicts with CASE_LIGHT_PIN."
#elif _PIN_CONFLICT(E0_AUTO_FAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with E0_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E1_AUTO_FAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with E1_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E2_AUTO_FAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with E2_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E3_AUTO_FAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with E3_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E4_AUTO_FAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with E4_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E5_AUTO_FAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with E5_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E6_AUTO_FAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with E6_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E7_AUTO_FAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with E7_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(FAN0)
#error "SPINDLE_LASER_PWM_PIN conflicts with FAN0_PIN."
#elif _PIN_CONFLICT(FAN1)
#error "SPINDLE_LASER_PWM_PIN conflicts with FAN1_PIN."
#elif _PIN_CONFLICT(FAN2)
#error "SPINDLE_LASER_PWM_PIN conflicts with FAN2_PIN."
#elif _PIN_CONFLICT(FAN3)
#error "SPINDLE_LASER_PWM_PIN conflicts with FAN3_PIN."
#elif _PIN_CONFLICT(FAN4)
#error "SPINDLE_LASER_PWM_PIN conflicts with FAN4_PIN."
#elif _PIN_CONFLICT(FAN5)
#error "SPINDLE_LASER_PWM_PIN conflicts with FAN5_PIN."
#elif _PIN_CONFLICT(FAN6)
#error "SPINDLE_LASER_PWM_PIN conflicts with FAN6_PIN."
#elif _PIN_CONFLICT(FAN7)
#error "SPINDLE_LASER_PWM_PIN conflicts with FAN7_PIN."
#elif _PIN_CONFLICT(CONTROLLERFAN)
#error "SPINDLE_LASER_PWM_PIN conflicts with CONTROLLERFAN_PIN."
#elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_XY)
#error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_XY."
#elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_Z)
#error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_Z."
#elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_E)
#error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_E."
#endif
#endif
#undef _PIN_CONFLICT
#endif


#if ENABLED(LASER_FEATURE)
#define _PIN_CONFLICT(P) (PIN_EXISTS(P) && P##_PIN == LASER_PWM_PIN)
#if NONE(SPINDLE_SERVO, SPINDLE_LASER_USE_PWM) && !PIN_EXISTS(LASER_ENA)
#error "(SPINDLE|LASER)_FEATURE requires LASER_ENA_PIN, SPINDLE_LASER_USE_PWM, or SPINDLE_SERVO to control the power."
#elif ENABLED(SPINDLE_LASER_USE_PWM)
#if (!defined(SPINDLE_LASER_PWM_PIN) || SPINDLE_LASER_PWM_PIN < 0) && (!defined(LASER_PWM_PIN) || LASER_PWM_PIN < 0)
#error "LASER_PWM_PIN is required for SPINDLE_LASER_USE_PWM."
#elif !_TEST_PWM(LASER_PWM_PIN)
#error "LASER_PWM_PIN not assigned to a PWM pin."
#elif !defined(SPINDLE_LASER_PWM_INVERT)
#error "SPINDLE_LASER_PWM_INVERT is required for (SPINDLE|LASER)_FEATURE."
#elif !(defined(SPEED_POWER_MIN) && defined(SPEED_POWER_MAX) && defined(SPEED_POWER_STARTUP))
#error "SPINDLE_LASER_USE_PWM equation constant(s) missing."
#elif _PIN_CONFLICT(X_MIN)
#error "LASER_PWM_PIN conflicts with X_MIN_PIN."
#elif _PIN_CONFLICT(X_MAX)
#error "LASER_PWM_PIN conflicts with X_MAX_PIN."
#elif _PIN_CONFLICT(Z_STEP)
#error "LASER_PWM_PIN conflicts with Z_STEP_PIN."
#elif _PIN_CONFLICT(CASE_LIGHT)
#error "LASER_PWM_PIN conflicts with CASE_LIGHT_PIN."
#elif _PIN_CONFLICT(E0_AUTO_FAN)
#error "LASER_PWM_PIN conflicts with E0_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E1_AUTO_FAN)
#error "LASER_PWM_PIN conflicts with E1_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E2_AUTO_FAN)
#error "LASER_PWM_PIN conflicts with E2_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E3_AUTO_FAN)
#error "LASER_PWM_PIN conflicts with E3_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E4_AUTO_FAN)
#error "LASER_PWM_PIN conflicts with E4_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E5_AUTO_FAN)
#error "LASER_PWM_PIN conflicts with E5_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E6_AUTO_FAN)
#error "LASER_PWM_PIN conflicts with E6_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(E7_AUTO_FAN)
#error "LASER_PWM_PIN conflicts with E7_AUTO_FAN_PIN."
#elif _PIN_CONFLICT(FAN0)
#error "LASER_PWM_PIN conflicts with FAN0_PIN."
#elif _PIN_CONFLICT(FAN1)
#error "LASER_PWM_PIN conflicts with FAN1_PIN."
#elif _PIN_CONFLICT(FAN2)
#error "LASER_PWM_PIN conflicts with FAN2_PIN."
#elif _PIN_CONFLICT(FAN3)
#error "LASER_PWM_PIN conflicts with FAN3_PIN."
#elif _PIN_CONFLICT(FAN4)
#error "LASER_PWM_PIN conflicts with FAN4_PIN."
#elif _PIN_CONFLICT(FAN5)
#error "LASER_PWM_PIN conflicts with FAN5_PIN."
#elif _PIN_CONFLICT(FAN6)
#error "LASER_PWM_PIN conflicts with FAN6_PIN."
#elif _PIN_CONFLICT(FAN7)
#error "LASER_PWM_PIN conflicts with FAN7_PIN."
#elif _PIN_CONFLICT(CONTROLLERFAN)
#error "LASER_PWM_PIN conflicts with CONTROLLERFAN_PIN."
#elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_XY)
#error "LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_XY."
#elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_Z)
#error "LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_Z."
#elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_E)
#error "LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_E."
#endif
#endif
#undef _PIN_CONFLICT
#endif
#undef _PIN_CONFLICT

#ifdef LASER_SAFETY_TIMEOUT_MS
static_assert(LASER_SAFETY_TIMEOUT_MS < (DEFAULT_STEPPER_TIMEOUT_SEC) * 1000UL, "LASER_SAFETY_TIMEOUT_MS must be less than DEFAULT_STEPPER_TIMEOUT_SEC (" STRINGIFY(DEFAULT_STEPPER_TIMEOUT_SEC) " seconds)");
Expand Down Expand Up @@ -4430,4 +4499,4 @@ static_assert(WITHIN(MULTISTEPPING_LIMIT, 1, 128) && IS_POWER_OF_2(MULTISTEPPING
// Misc. Cleanup
#undef _TEST_PWM
#undef _NUM_AXES_STR
#undef _LOGICAL_AXES_STR
#undef _LOGICAL_AXES_STR
2 changes: 1 addition & 1 deletion buildroot/tests/BTT_SKR_PRO
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ exec_test $1 $2 "BigTreeTech SKR Pro | 3 Extruders | Auto-Fan | BLTOUCH | Mixed
restore_configs
opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 SERIAL_PORT -1 \
CUTTER_POWER_UNIT PERCENT \
SPINDLE_LASER_PWM_PIN HEATER_1_PIN SPINDLE_LASER_ENA_PIN HEATER_2_PIN \
LASER_PWM_PIN HEATER_1_PIN LASER_ENA_PIN HEATER_2_PIN \
TEMP_SENSOR_COOLER 1000 TEMP_COOLER_PIN PD13
opt_enable LASER_FEATURE LASER_SAFETY_TIMEOUT_MS REPRAP_DISCOUNT_SMART_CONTROLLER
exec_test $1 $2 "BigTreeTech SKR Pro | HD44780 | Laser (Percent) | Cooling | LCD" "$3"
Expand Down
2 changes: 1 addition & 1 deletion buildroot/tests/I3DBEEZ9_V1
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ exec_test $1 $2 "I3DBEE Z9 Board | 3 Extruders | Auto-Fan | BLTOUCH | Mixed TMC"
restore_configs
opt_set MOTHERBOARD BOARD_I3DBEEZ9_V1 SERIAL_PORT -1 \
CUTTER_POWER_UNIT PERCENT \
SPINDLE_LASER_PWM_PIN HEATER_1_PIN SPINDLE_LASER_ENA_PIN HEATER_2_PIN \
LASER_PWM_PIN HEATER_1_PIN LASER_ENA_PIN HEATER_2_PIN \
TEMP_SENSOR_COOLER 1000 TEMP_COOLER_PIN PD13
opt_enable LASER_FEATURE LASER_SAFETY_TIMEOUT_MS REPRAP_DISCOUNT_SMART_CONTROLLER
exec_test $1 $2 "I3DBEE Z9 Board | HD44780 | Laser (Percent) | Cooling | LCD" "$3"
Expand Down

0 comments on commit 464a15c

Please sign in to comment.