diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 7474f43cb5..f38dfca9e5 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1176,50 +1176,30 @@ //#define FILAMENT_RUNOUT_SENSOR #if ENABLED(FILAMENT_RUNOUT_SENSOR) #define FIL_RUNOUT_ENABLED_DEFAULT true // Enable the sensor on startup. Override with M412 followed by M500. - #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN, and optionally a FIL_RUNOUT#_STATE/FIL_RUNOUT#_PULLUP/FIL_RUNOUT#_PULLDOWN, for each. - #define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present. - #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. - //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. - /** - * With this option each sensor can have a separate state than the first one. - * To override the state for a sensor, up to NUM_RUNOUT_SENSORS, set - * FIL_RUNOUT#_STATE, otherwise FIL_RUNOUT_STATE will be used. Similarly with - * FIL_RUNOUT#_PULLUP and FIL_RUNOUT#_PULLDOWN. - */ - //#define DISTINCT_FIL_RUNOUT_STATES - #ifdef DISTINCT_FIL_RUNOUT_STATES - //#define FIL_RUNOUT1_STATE LOW - //#define FIL_RUNOUT1_PULLUP - //#define FIL_RUNOUT1_PULLDOWN - - //#define FIL_RUNOUT2_STATE LOW - //#define FIL_RUNOUT2_PULLUP - //#define FIL_RUNOUT2_PULLDOWN + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + //#define DISTINCT_FIL_RUNOUT_STATES // Enable if runout sensors need distinct settings + #if DISABLED(DISTINCT_FIL_RUNOUT_STATES) + #define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present. + #define FIL_RUNOUT_PULL // Use internal pullup / pulldown for filament runout pins. + #else + #define FIL_RUNOUT1_STATE LOW + #define FIL_RUNOUT1_PULL + #define FIL_RUNOUT2_STATE LOW + #define FIL_RUNOUT2_PULL //#define FIL_RUNOUT3_STATE LOW - //#define FIL_RUNOUT3_PULLUP - //#define FIL_RUNOUT3_PULLDOWN - + //#define FIL_RUNOUT3_PULL //#define FIL_RUNOUT4_STATE LOW - //#define FIL_RUNOUT4_PULLUP - //#define FIL_RUNOUT4_PULLDOWN - + //#define FIL_RUNOUT4_PULL //#define FIL_RUNOUT5_STATE LOW - //#define FIL_RUNOUT5_PULLUP - //#define FIL_RUNOUT5_PULLDOWN - + //#define FIL_RUNOUT5_PULL //#define FIL_RUNOUT6_STATE LOW - //#define FIL_RUNOUT6_PULLUP - //#define FIL_RUNOUT6_PULLDOWN - + //#define FIL_RUNOUT6_PULL //#define FIL_RUNOUT7_STATE LOW - //#define FIL_RUNOUT7_PULLUP - //#define FIL_RUNOUT7_PULLDOWN - + //#define FIL_RUNOUT7_PULL //#define FIL_RUNOUT8_STATE LOW - //#define FIL_RUNOUT8_PULLUP - //#define FIL_RUNOUT8_PULLDOWN - #endif // DISTINCT_FIL_RUNOUT_STATES + //#define FIL_RUNOUT8_PULL + #endif // Set one or more commands to execute on filament runout. // (After 'M412 H' Marlin will ask the host to handle the process.) diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index 874abc6a9e..5aefb68edc 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -149,103 +149,33 @@ class FilamentSensorBase { public: static inline void setup() { - #if ENABLED(DISTINCT_FIL_RUNOUT_STATES) - #if ENABLED(FIL_RUNOUT1_PULLUP) - #define INIT_RUNOUT1_PIN(P) SET_INPUT_PULLUP(P) - #elif ENABLED(FIL_RUNOUT1_PULLDOWN) - #define INIT_RUNOUT1_PIN(P) SET_INPUT_PULLDOWN(P) - #else - #define INIT_RUNOUT1_PIN(P) SET_INPUT(P) - #endif - #if NUM_RUNOUT_SENSORS > 1 - #if ENABLED(FIL_RUNOUT2_PULLUP) - #define INIT_RUNOUT2_PIN(P) SET_INPUT_PULLUP(P) - #elif ENABLED(FIL_RUNOUT2_PULLDOWN) - #define INIT_RUNOUT2_PIN(P) SET_INPUT_PULLDOWN(P) - #else - #define INIT_RUNOUT2_PIN(P) SET_INPUT(P) - #endif - #endif - #if NUM_RUNOUT_SENSORS > 2 - #if ENABLED(FIL_RUNOUT3_PULLUP) - #define INIT_RUNOUT3_PIN(P) SET_INPUT_PULLUP(P) - #elif ENABLED(FIL_RUNOUT3_PULLDOWN) - #define INIT_RUNOUT3_PIN(P) SET_INPUT_PULLDOWN(P) - #else - #define INIT_RUNOUT3_PIN(P) SET_INPUT(P) - #endif - #endif - #if NUM_RUNOUT_SENSORS > 3 - #if ENABLED(FIL_RUNOUT4_PULLUP) - #define INIT_RUNOUT4_PIN(P) SET_INPUT_PULLUP(P) - #elif ENABLED(FIL_RUNOUT4_PULLDOWN) - #define INIT_RUNOUT4_PIN(P) SET_INPUT_PULLDOWN(P) - #else - #define INIT_RUNOUT4_PIN(P) SET_INPUT(P) - #endif - #endif - #if NUM_RUNOUT_SENSORS > 4 - #if ENABLED(FIL_RUNOUT5_PULLUP) - #define INIT_RUNOUT5_PIN(P) SET_INPUT_PULLUP(P) - #elif ENABLED(FIL_RUNOUT5_PULLDOWN) - #define INIT_RUNOUT5_PIN(P) SET_INPUT_PULLDOWN(P) - #else - #define INIT_RUNOUT5_PIN(P) SET_INPUT(P) - #endif - #endif - #if NUM_RUNOUT_SENSORS > 5 - #if ENABLED(FIL_RUNOUT6_PULLUP) - #define INIT_RUNOUT6_PIN(P) SET_INPUT_PULLUP(P) - #elif ENABLED(FIL_RUNOUT6_PULLDOWN) - #define INIT_RUNOUT6_PIN(P) SET_INPUT_PULLDOWN(P) - #else - #define INIT_RUNOUT6_PIN(P) SET_INPUT(P) - #endif - #endif - #if NUM_RUNOUT_SENSORS > 6 - #if ENABLED(FIL_RUNOUT7_PULLUP) - #define INIT_RUNOUT7_PIN(P) SET_INPUT_PULLUP(P) - #elif ENABLED(FIL_RUNOUT7_PULLDOWN) - #define INIT_RUNOUT7_PIN(P) SET_INPUT_PULLDOWN(P) - #else - #define INIT_RUNOUT7_PIN(P) SET_INPUT(P) - #endif - #endif - #if NUM_RUNOUT_SENSORS > 7 - #if ENABLED(FIL_RUNOUT8_PULLUP) - #define INIT_RUNOUT8_PIN(P) SET_INPUT_PULLUP(P) - #elif ENABLED(FIL_RUNOUT8_PULLDOWN) - #define INIT_RUNOUT8_PIN(P) SET_INPUT_PULLDOWN(P) - #else - #define INIT_RUNOUT8_PIN(P) SET_INPUT(P) - #endif - #endif - #else // !DISTINCT_FIL_RUNOUT_STATES - #if ENABLED(FIL_RUNOUT_PULLUP) - #define INIT_RUNOUT_PIN(P) SET_INPUT_PULLUP(P) - #elif ENABLED(FIL_RUNOUT_PULLDOWN) - #define INIT_RUNOUT_PIN(P) SET_INPUT_PULLDOWN(P) - #else - #define INIT_RUNOUT_PIN(P) SET_INPUT(P) - #endif - #endif // !DISTINCT_FIL_RUNOUT_STATES - - #if ENABLED(DISTINCT_FIL_RUNOUT_STATES) - #define _INIT_RUNOUT(N) INIT_RUNOUT##N##_PIN(FIL_RUNOUT##N##_PIN); - #else - #define _INIT_RUNOUT(N) INIT_RUNOUT_PIN(FIL_RUNOUT##N##_PIN); + #define _INIT_RUNOUT_PIN(N,P) do{ if (DISABLED(FIL_RUNOUT##N##_PULL)) SET_INPUT(P) else if (FIL_RUNOUT##N##_STATE) SET_INPUT_PULLDOWN(P); else SET_INPUT_PULLUP(P); }while(0) + #define INIT_RUNOUT_PIN(N,P) _INIT_RUNOUT_PIN(TERN_(DISTINCT_FIL_RUNOUT_STATES, N),P) + #if NUM_RUNOUT_SENSORS >= 1 + INIT_RUNOUT_PIN(1, P) #endif - REPEAT_S(1, INCREMENT(NUM_RUNOUT_SENSORS), _INIT_RUNOUT) - #undef _INIT_RUNOUT - - #undef INIT_RUNOUT1_PIN - #undef INIT_RUNOUT2_PIN - #undef INIT_RUNOUT3_PIN - #undef INIT_RUNOUT4_PIN - #undef INIT_RUNOUT5_PIN - #undef INIT_RUNOUT6_PIN - #undef INIT_RUNOUT7_PIN - #undef INIT_RUNOUT8_PIN + #if NUM_RUNOUT_SENSORS >= 2 + INIT_RUNOUT_PIN(2, P) + #endif + #if NUM_RUNOUT_SENSORS >= 3 + INIT_RUNOUT_PIN(3, P) + #endif + #if NUM_RUNOUT_SENSORS >= 4 + INIT_RUNOUT_PIN(4, P) + #endif + #if NUM_RUNOUT_SENSORS >= 5 + INIT_RUNOUT_PIN(5, P) + #endif + #if NUM_RUNOUT_SENSORS >= 6 + INIT_RUNOUT_PIN(6, P) + #endif + #if NUM_RUNOUT_SENSORS >= 7 + INIT_RUNOUT_PIN(7, P) + #endif + #if NUM_RUNOUT_SENSORS >= 8 + INIT_RUNOUT_PIN(8, P) + #endif + #undef _INIT_RUNOUT_PIN #undef INIT_RUNOUT_PIN } diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index a217f886ec..4da0a65b14 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -810,112 +810,51 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS * Filament Runout needs one or more pins and either SD Support or Auto print start detection */ #if HAS_FILAMENT_SENSOR + #if !PIN_EXISTS(FIL_RUNOUT) #error "FILAMENT_RUNOUT_SENSOR requires FIL_RUNOUT_PIN." #elif NUM_RUNOUT_SENSORS > E_STEPPERS #error "NUM_RUNOUT_SENSORS cannot exceed the number of E steppers." - #elif NUM_RUNOUT_SENSORS > 8 - #error "NUM_RUNOUT_SENSORS cannot exceed 8" - #elif NUM_RUNOUT_SENSORS > 1 && !PIN_EXISTS(FIL_RUNOUT2) - #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 1 requires FIL_RUNOUT2_PIN." - #elif NUM_RUNOUT_SENSORS > 2 && !PIN_EXISTS(FIL_RUNOUT3) - #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 2 requires FIL_RUNOUT3_PIN." - #elif NUM_RUNOUT_SENSORS > 3 && !PIN_EXISTS(FIL_RUNOUT4) - #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 3 requires FIL_RUNOUT4_PIN." - #elif NUM_RUNOUT_SENSORS > 4 && !PIN_EXISTS(FIL_RUNOUT5) - #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 4 requires FIL_RUNOUT5_PIN." - #elif NUM_RUNOUT_SENSORS > 5 && !PIN_EXISTS(FIL_RUNOUT6) - #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 5 requires FIL_RUNOUT6_PIN." - #elif NUM_RUNOUT_SENSORS > 6 && !PIN_EXISTS(FIL_RUNOUT7) - #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 6 requires FIL_RUNOUT7_PIN." - #elif NUM_RUNOUT_SENSORS > 7 && !PIN_EXISTS(FIL_RUNOUT8) - #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 7 requires FIL_RUNOUT8_PIN." - #elif NONE(SDSUPPORT, PRINTJOB_TIMER_AUTOSTART) - #error "FILAMENT_RUNOUT_SENSOR requires SDSUPPORT or PRINTJOB_TIMER_AUTOSTART." + #elif NUM_RUNOUT_SENSORS >= 2 && !PIN_EXISTS(FIL_RUNOUT2) + #error "FIL_RUNOUT2_PIN is required with NUM_RUNOUT_SENSORS >= 2." + #elif NUM_RUNOUT_SENSORS >= 3 && !PIN_EXISTS(FIL_RUNOUT3) + #error "FIL_RUNOUT3_PIN is required with NUM_RUNOUT_SENSORS >= 3." + #elif NUM_RUNOUT_SENSORS >= 4 && !PIN_EXISTS(FIL_RUNOUT4) + #error "FIL_RUNOUT4_PIN is required with NUM_RUNOUT_SENSORS >= 4." + #elif NUM_RUNOUT_SENSORS >= 5 && !PIN_EXISTS(FIL_RUNOUT5) + #error "FIL_RUNOUT5_PIN is required with NUM_RUNOUT_SENSORS >= 5." + #elif NUM_RUNOUT_SENSORS >= 6 && !PIN_EXISTS(FIL_RUNOUT6) + #error "FIL_RUNOUT6_PIN is required with NUM_RUNOUT_SENSORS >= 6." + #elif NUM_RUNOUT_SENSORS >= 7 && !PIN_EXISTS(FIL_RUNOUT7) + #error "FIL_RUNOUT7_PIN is required with NUM_RUNOUT_SENSORS >= 7." + #elif NUM_RUNOUT_SENSORS >= 8 && !PIN_EXISTS(FIL_RUNOUT8) + #error "FIL_RUNOUT8_PIN is required with NUM_RUNOUT_SENSORS >= 8." #elif FILAMENT_RUNOUT_DISTANCE_MM < 0 #error "FILAMENT_RUNOUT_DISTANCE_MM must be greater than or equal to zero." #elif DISABLED(ADVANCED_PAUSE_FEATURE) static_assert(nullptr == strstr(FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required to use M600 with FILAMENT_RUNOUT_SENSOR."); #endif + #if ENABLED(DISTINCT_FIL_RUNOUT_STATES) - #if BOTH(FIL_RUNOUT1_PULLUP, FIL_RUNOUT1_PULLDOWN) - #error "Enable only one of FIL_RUNOUT1_PULLUP or FIL_RUNOUT1_PULLDOWN." + #if NUM_RUNOUT_SENSORS >= 1 && !defined(FIL_RUNOUT1_STATE) + #error "FIL_RUNOUT1_STATE is required with NUM_RUNOUT_SENSORS >= 2." + #elif NUM_RUNOUT_SENSORS >= 2 && !defined(FIL_RUNOUT2_STATE) + #error "FIL_RUNOUT2_STATE is required with NUM_RUNOUT_SENSORS >= 2." + #elif NUM_RUNOUT_SENSORS >= 3 && !defined(FIL_RUNOUT3_STATE) + #error "FIL_RUNOUT3_STATE is required with NUM_RUNOUT_SENSORS >= 3." + #elif NUM_RUNOUT_SENSORS >= 4 && !defined(FIL_RUNOUT4_STATE) + #error "FIL_RUNOUT4_STATE is required with NUM_RUNOUT_SENSORS >= 4." + #elif NUM_RUNOUT_SENSORS >= 5 && !defined(FIL_RUNOUT5_STATE) + #error "FIL_RUNOUT5_STATE is required with NUM_RUNOUT_SENSORS >= 5." + #elif NUM_RUNOUT_SENSORS >= 6 && !defined(FIL_RUNOUT6_STATE) + #error "FIL_RUNOUT6_STATE is required with NUM_RUNOUT_SENSORS >= 6." + #elif NUM_RUNOUT_SENSORS >= 7 && !defined(FIL_RUNOUT7_STATE) + #error "FIL_RUNOUT7_STATE is required with NUM_RUNOUT_SENSORS >= 7." + #elif NUM_RUNOUT_SENSORS >= 8 && !defined(FIL_RUNOUT8_STATE) + #error "FIL_RUNOUT8_STATE is required with NUM_RUNOUT_SENSORS >= 8." #endif - #if NUM_RUNOUT_SENSORS > 1 - #if BOTH(FIL_RUNOUT2_PULLUP, FIL_RUNOUT2_PULLDOWN) - #error "Enable only one of FIL_RUNOUT2_PULLUP or FIL_RUNOUT2_PULLDOWN." - #endif - #endif - #if NUM_RUNOUT_SENSORS > 2 - #if BOTH(FIL_RUNOUT3_PULLUP, FIL_RUNOUT3_PULLDOWN) - #error "Enable only one of FIL_RUNOUT3_PULLUP or FIL_RUNOUT3_PULLDOWN." - #endif - #endif - #if NUM_RUNOUT_SENSORS > 3 - #if BOTH(FIL_RUNOUT4_PULLUP, FIL_RUNOUT4_PULLDOWN) - #error "Enable only one of FIL_RUNOUT4_PULLUP or FIL_RUNOUT4_PULLDOWN." - #endif - #endif - #if NUM_RUNOUT_SENSORS > 4 - #if BOTH(FIL_RUNOUT5_PULLUP, FIL_RUNOUT5_PULLDOWN) - #error "Enable only one of FIL_RUNOUT5_PULLUP or FIL_RUNOUT5_PULLDOWN." - #endif - #endif - #if NUM_RUNOUT_SENSORS > 5 - #if BOTH(FIL_RUNOUT6_PULLUP, FIL_RUNOUT6_PULLDOWN) - #error "Enable only one of FIL_RUNOUT6_PULLUP or FIL_RUNOUT6_PULLDOWN." - #endif - #endif - #if NUM_RUNOUT_SENSORS > 6 - #if BOTH(FIL_RUNOUT7_PULLUP, FIL_RUNOUT7_PULLDOWN) - #error "Enable only one of FIL_RUNOUT7_PULLUP or FIL_RUNOUT7_PULLDOWN." - #endif - #endif - #if NUM_RUNOUT_SENSORS > 7 - #if BOTH(FIL_RUNOUT8_PULLUP, FIL_RUNOUT8_PULLDOWN) - #error "Enable only one of FIL_RUNOUT8_PULLUP or FIL_RUNOUT8_PULLDOWN." - #endif - #endif - #else // !ENABLED(DISTINCT_FIL_RUNOUT_STATES) - #if MANY(defined(FIL_RUNOUT1_STATE), FIL_RUNOUT1_PULLUP, FIL_RUNOUT1_PULLDOWN) - #warning "You have defined FIL_RUNOUT1_STATE/FIL_RUNOUT1_PULLUP/FIL_RUNOUT1_PULLDOWN but you haven't defined DISTINCT_FIL_RUNOUT_STATES" - #endif - #if NUM_RUNOUT_SENSORS > 1 - #if MANY(defined(FIL_RUNOUT2_STATE), FIL_RUNOUT2_PULLUP, FIL_RUNOUT2_PULLDOWN) - #warning "You have defined FIL_RUNOUT2_STATE/FIL_RUNOUT2_PULLUP/FIL_RUNOUT2_PULLDOWN but you haven't defined DISTINCT_FIL_RUNOUT_STATES" - #endif - #endif - #if NUM_RUNOUT_SENSORS > 2 - #if MANY(defined(FIL_RUNOUT3_STATE), FIL_RUNOUT3_PULLUP, FIL_RUNOUT3_PULLDOWN) - #warning "You have defined FIL_RUNOUT3_STATE/FIL_RUNOUT3_PULLUP/FIL_RUNOUT3_PULLDOWN but you haven't defined DISTINCT_FIL_RUNOUT_STATES" - #endif - #endif - #if NUM_RUNOUT_SENSORS > 3 - #if MANY(defined(FIL_RUNOUT4_STATE), FIL_RUNOUT4_PULLUP, FIL_RUNOUT4_PULLDOWN) - #warning "You have defined FIL_RUNOUT4_STATE/FIL_RUNOUT4_PULLUP/FIL_RUNOUT4_PULLDOWN but you haven't defined DISTINCT_FIL_RUNOUT_STATES" - #endif - #endif - #if NUM_RUNOUT_SENSORS > 4 - #if MANY(defined(FIL_RUNOUT5_STATE), FIL_RUNOUT5_PULLUP, FIL_RUNOUT5_PULLDOWN) - #warning "You have defined FIL_RUNOUT5_STATE/FIL_RUNOUT5_PULLUP/FIL_RUNOUT5_PULLDOWN but you haven't defined DISTINCT_FIL_RUNOUT_STATES" - #endif - #endif - #if NUM_RUNOUT_SENSORS > 5 - #if MANY(defined(FIL_RUNOUT6_STATE), FIL_RUNOUT6_PULLUP, FIL_RUNOUT6_PULLDOWN) - #warning "You have defined FIL_RUNOUT6_STATE/FIL_RUNOUT6_PULLUP/FIL_RUNOUT6_PULLDOWN but you haven't defined DISTINCT_FIL_RUNOUT_STATES" - #endif - #endif - #if NUM_RUNOUT_SENSORS > 6 - #if MANY(defined(FIL_RUNOUT7_STATE), FIL_RUNOUT7_PULLUP, FIL_RUNOUT7_PULLDOWN) - #warning "You have defined FIL_RUNOUT7_STATE/FIL_RUNOUT7_PULLUP/FIL_RUNOUT7_PULLDOWN but you haven't defined DISTINCT_FIL_RUNOUT_STATES" - #endif - #endif - #if NUM_RUNOUT_SENSORS > 7 - #if MANY(defined(FIL_RUNOUT8_STATE), FIL_RUNOUT8_PULLUP, FIL_RUNOUT8_PULLDOWN) - #warning "You have defined FIL_RUNOUT8_STATE/FIL_RUNOUT8_PULLUP/FIL_RUNOUT8_PULLDOWN but you haven't defined DISTINCT_FIL_RUNOUT_STATES" - #endif - #endif - #endif // ENABLED(DISTINCT_FIL_RUNOUT_STATES) + #endif + #endif /**