Skip to content

Commit cd0bfcd

Browse files
committed
πŸ§‘β€πŸ’» Auto Fan / Cooler Fan updates (MarlinFirmware#25554)
1 parent bcf3098 commit cd0bfcd

File tree

3 files changed

+84
-82
lines changed

3 files changed

+84
-82
lines changed

β€ŽMarlin/src/inc/Conditionals_post.h

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2567,10 +2567,21 @@
25672567

25682568
#if ANY(HAS_AUTO_FAN_0, HAS_AUTO_FAN_1, HAS_AUTO_FAN_2, HAS_AUTO_FAN_3, HAS_AUTO_FAN_4, HAS_AUTO_FAN_5, HAS_AUTO_FAN_6, HAS_AUTO_FAN_7, HAS_AUTO_CHAMBER_FAN, HAS_AUTO_COOLER_FAN)
25692569
#define HAS_AUTO_FAN 1
2570-
#endif
2571-
#define _FANOVERLAP(A,B) (A##_AUTO_FAN_PIN == E##B##_AUTO_FAN_PIN)
2572-
#if HAS_AUTO_FAN && (_FANOVERLAP(CHAMBER,0) || _FANOVERLAP(CHAMBER,1) || _FANOVERLAP(CHAMBER,2) || _FANOVERLAP(CHAMBER,3) || _FANOVERLAP(CHAMBER,4) || _FANOVERLAP(CHAMBER,5) || _FANOVERLAP(CHAMBER,6) || _FANOVERLAP(CHAMBER,7))
2573-
#define AUTO_CHAMBER_IS_E 1
2570+
#define _FANOVERLAP(I,T) (T##_AUTO_FAN_PIN == E##I##_AUTO_FAN_PIN)
2571+
#if HAS_AUTO_CHAMBER_FAN
2572+
#define _CHFANOVERLAP(I) || _FANOVERLAP(I,CHAMBER)
2573+
#if (0 REPEAT(8, _CHFANOVERLAP))
2574+
#define AUTO_CHAMBER_IS_E 1
2575+
#endif
2576+
#undef _CHFANOVERLAP
2577+
#endif
2578+
#if HAS_AUTO_COOLER_FAN
2579+
#define _COFANOVERLAP(I) || _FANOVERLAP(I,COOLER)
2580+
#if (0 REPEAT(8, _COFANOVERLAP))
2581+
#define AUTO_COOLER_IS_E 1
2582+
#endif
2583+
#undef _COFANOVERLAP
2584+
#endif
25742585
#endif
25752586

25762587
// Fans check
@@ -2615,6 +2626,9 @@
26152626
#if !HAS_AUTO_CHAMBER_FAN || AUTO_CHAMBER_IS_E
26162627
#undef AUTO_POWER_CHAMBER_FAN
26172628
#endif
2629+
#if !HAS_AUTO_COOLER_FAN || AUTO_COOLER_IS_E
2630+
#undef AUTO_POWER_COOLER_FAN
2631+
#endif
26182632

26192633
// Print Cooling fans (limit)
26202634
#ifdef NUM_M106_FANS

β€ŽMarlin/src/inc/SanityCheck.h

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2948,24 +2948,9 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE, "Movement bounds (X_MIN_POS, X_MAX_POS
29482948
* Auto Fan check for PWM pins
29492949
*/
29502950
#if HAS_AUTO_FAN && EXTRUDER_AUTO_FAN_SPEED != 255
2951-
#define AF_ERR_SUFF "_AUTO_FAN_PIN is not a PWM pin. Set EXTRUDER_AUTO_FAN_SPEED to 255."
2952-
#if HAS_AUTO_FAN_0
2953-
static_assert(_TEST_PWM(E0_AUTO_FAN_PIN), "E0" AF_ERR_SUFF);
2954-
#elif HAS_AUTO_FAN_1
2955-
static_assert(_TEST_PWM(E1_AUTO_FAN_PIN), "E1" AF_ERR_SUFF);
2956-
#elif HAS_AUTO_FAN_2
2957-
static_assert(_TEST_PWM(E2_AUTO_FAN_PIN), "E2" AF_ERR_SUFF);
2958-
#elif HAS_AUTO_FAN_3
2959-
static_assert(_TEST_PWM(E3_AUTO_FAN_PIN), "E3" AF_ERR_SUFF);
2960-
#elif HAS_AUTO_FAN_4
2961-
static_assert(_TEST_PWM(E4_AUTO_FAN_PIN), "E4" AF_ERR_SUFF);
2962-
#elif HAS_AUTO_FAN_5
2963-
static_assert(_TEST_PWM(E5_AUTO_FAN_PIN), "E5" AF_ERR_SUFF);
2964-
#elif HAS_AUTO_FAN_6
2965-
static_assert(_TEST_PWM(E6_AUTO_FAN_PIN), "E6" AF_ERR_SUFF);
2966-
#elif HAS_AUTO_FAN_7
2967-
static_assert(_TEST_PWM(E7_AUTO_FAN_PIN), "E7" AF_ERR_SUFF);
2968-
#endif
2951+
#define AF_ASSERT(N) OPTCODE(HAS_AUTO_FAN_##N, static_assert(_TEST_PWM(E##N##_AUTO_FAN_PIN), "E" STRINGIFY(N) "_AUTO_FAN_PIN is not a PWM pin. Set EXTRUDER_AUTO_FAN_SPEED to 255."))
2952+
REPEAT(8, AF_ASSERT)
2953+
#undef AF_ASSERT
29692954
#endif
29702955

29712956
/**

β€ŽMarlin/src/module/temperature.cpp

Lines changed: 63 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,44 +1166,55 @@ int16_t Temperature::getHeaterPower(const heater_id_t heater_id) {
11661166
}
11671167
}
11681168

1169-
#define _EFANOVERLAP(A,B) _FANOVERLAP(E##A,B)
1170-
11711169
#if HAS_AUTO_FAN
11721170

1171+
#define _EFANOVERLAP(I,N) ((I != N) && _FANOVERLAP(I,E##N))
1172+
11731173
#if EXTRUDER_AUTO_FAN_SPEED != 255
1174-
#define INIT_E_AUTO_FAN_PIN(P) do{ if (P == FAN1_PIN || P == FAN2_PIN) { SET_PWM(P); SET_FAST_PWM_FREQ(P); } else SET_OUTPUT(P); }while(0)
1174+
#define INIT_E_AUTO_FAN_PIN(P) do{ if (PWM_PIN(P)) { SET_PWM(P); SET_FAST_PWM_FREQ(P); } else SET_OUTPUT(P); }while(0)
11751175
#else
11761176
#define INIT_E_AUTO_FAN_PIN(P) SET_OUTPUT(P)
11771177
#endif
11781178
#if CHAMBER_AUTO_FAN_SPEED != 255
1179-
#define INIT_CHAMBER_AUTO_FAN_PIN(P) do{ if (P == FAN1_PIN || P == FAN2_PIN) { SET_PWM(P); SET_FAST_PWM_FREQ(P); } else SET_OUTPUT(P); }while(0)
1179+
#define INIT_CHAMBER_AUTO_FAN_PIN(P) do{ if (PWM_PIN(P)) { SET_PWM(P); SET_FAST_PWM_FREQ(P); } else SET_OUTPUT(P); }while(0)
11801180
#else
11811181
#define INIT_CHAMBER_AUTO_FAN_PIN(P) SET_OUTPUT(P)
11821182
#endif
1183+
#if COOLER_AUTO_FAN_SPEED != 255
1184+
#define INIT_COOLER_AUTO_FAN_PIN(P) do{ if (PWM_PIN(P)) { SET_PWM(P); SET_FAST_PWM_FREQ(P); } else SET_OUTPUT(P); }while(0)
1185+
#else
1186+
#define INIT_COOLER_AUTO_FAN_PIN(P) SET_OUTPUT(P)
1187+
#endif
11831188

11841189
#ifndef CHAMBER_FAN_INDEX
11851190
#define CHAMBER_FAN_INDEX HOTENDS
11861191
#endif
11871192

11881193
void Temperature::update_autofans() {
1189-
#define _EFAN(B,A) _EFANOVERLAP(A,B) ? B :
1194+
#define _EFAN(I,N) _EFANOVERLAP(I,N) ? I :
11901195
static const uint8_t fanBit[] PROGMEM = {
11911196
0
11921197
#if HAS_MULTI_HOTEND
11931198
#define _NEXT_FAN(N) , REPEAT2(N,_EFAN,N) N
11941199
RREPEAT_S(1, HOTENDS, _NEXT_FAN)
11951200
#endif
1201+
#define _NFAN HOTENDS
11961202
#if HAS_AUTO_CHAMBER_FAN
1197-
#define _CFAN(B) _FANOVERLAP(CHAMBER,B) ? B :
1198-
, REPEAT(HOTENDS,_CFAN) (HOTENDS)
1203+
#define _CHFAN(I) _FANOVERLAP(I,CHAMBER) ? I :
1204+
, (REPEAT(HOTENDS,_CHFAN) (_NFAN))
1205+
#undef _NFAN
1206+
#define _NFAN INCREMENT(HOTENDS)
1207+
#endif
1208+
#if HAS_AUTO_COOLER_FAN
1209+
#define _COFAN(I) _FANOVERLAP(I,COOLER) ? I :
1210+
, (REPEAT(HOTENDS,_COFAN) (_NFAN))
11991211
#endif
12001212
};
12011213

12021214
uint8_t fanState = 0;
12031215
HOTEND_LOOP() {
1204-
if (temp_hotend[e].celsius >= EXTRUDER_AUTO_FAN_TEMPERATURE) {
1216+
if (temp_hotend[e].celsius >= EXTRUDER_AUTO_FAN_TEMPERATURE)
12051217
SBI(fanState, pgm_read_byte(&fanBit[e]));
1206-
}
12071218
}
12081219

12091220
#if HAS_AUTO_CHAMBER_FAN
@@ -1234,6 +1245,11 @@ int16_t Temperature::getHeaterPower(const heater_id_t heater_id) {
12341245
chamberfan_speed = fan_on ? CHAMBER_AUTO_FAN_SPEED : 0;
12351246
break;
12361247
#endif
1248+
#if ENABLED(AUTO_POWER_COOLER_FAN)
1249+
case COOLER_FAN_INDEX:
1250+
coolerfan_speed = fan_on ? COOLER_AUTO_FAN_SPEED : 0;
1251+
break;
1252+
#endif
12371253
default:
12381254
#if EITHER(AUTO_POWER_E_FANS, HAS_FANCHECK)
12391255
autofan_speed[realFan] = fan_on ? EXTRUDER_AUTO_FAN_SPEED : 0;
@@ -1247,35 +1263,16 @@ int16_t Temperature::getHeaterPower(const heater_id_t heater_id) {
12471263
#define _AUTOFAN_SPEED() EXTRUDER_AUTO_FAN_SPEED
12481264
#endif
12491265
#define _AUTOFAN_CASE(N) case N: _UPDATE_AUTO_FAN(E##N, fan_on, _AUTOFAN_SPEED()); break
1266+
#define AUTOFAN_CASE(N) OPTCODE(HAS_AUTO_FAN_##N, _AUTOFAN_CASE(N))
12501267

12511268
switch (f) {
1252-
#if HAS_AUTO_FAN_0
1253-
_AUTOFAN_CASE(0);
1254-
#endif
1255-
#if HAS_AUTO_FAN_1
1256-
_AUTOFAN_CASE(1);
1257-
#endif
1258-
#if HAS_AUTO_FAN_2
1259-
_AUTOFAN_CASE(2);
1260-
#endif
1261-
#if HAS_AUTO_FAN_3
1262-
_AUTOFAN_CASE(3);
1263-
#endif
1264-
#if HAS_AUTO_FAN_4
1265-
_AUTOFAN_CASE(4);
1266-
#endif
1267-
#if HAS_AUTO_FAN_5
1268-
_AUTOFAN_CASE(5);
1269-
#endif
1270-
#if HAS_AUTO_FAN_6
1271-
_AUTOFAN_CASE(6);
1272-
#endif
1273-
#if HAS_AUTO_FAN_7
1274-
_AUTOFAN_CASE(7);
1275-
#endif
1269+
REPEAT(8, AUTOFAN_CASE)
12761270
#if HAS_AUTO_CHAMBER_FAN && !AUTO_CHAMBER_IS_E
12771271
case CHAMBER_FAN_INDEX: _UPDATE_AUTO_FAN(CHAMBER, fan_on, CHAMBER_AUTO_FAN_SPEED); break;
12781272
#endif
1273+
#if HAS_AUTO_COOLER_FAN && !AUTO_COOLER_IS_E
1274+
case COOLER_FAN_INDEX: _UPDATE_AUTO_FAN(COOLER, fan_on, COOLER_AUTO_FAN_SPEED); break;
1275+
#endif
12791276
}
12801277
SBI(fanDone, realFan);
12811278
}
@@ -2704,33 +2701,39 @@ void Temperature::init() {
27042701
HAL_timer_start(MF_TIMER_TEMP, TEMP_TIMER_FREQUENCY);
27052702
ENABLE_TEMPERATURE_INTERRUPT();
27062703

2707-
#if HAS_AUTO_FAN_0
2708-
INIT_E_AUTO_FAN_PIN(E0_AUTO_FAN_PIN);
2709-
#endif
2710-
#if HAS_AUTO_FAN_1 && !_EFANOVERLAP(1,0)
2711-
INIT_E_AUTO_FAN_PIN(E1_AUTO_FAN_PIN);
2712-
#endif
2713-
#if HAS_AUTO_FAN_2 && !(_EFANOVERLAP(2,0) || _EFANOVERLAP(2,1))
2714-
INIT_E_AUTO_FAN_PIN(E2_AUTO_FAN_PIN);
2715-
#endif
2716-
#if HAS_AUTO_FAN_3 && !(_EFANOVERLAP(3,0) || _EFANOVERLAP(3,1) || _EFANOVERLAP(3,2))
2717-
INIT_E_AUTO_FAN_PIN(E3_AUTO_FAN_PIN);
2718-
#endif
2719-
#if HAS_AUTO_FAN_4 && !(_EFANOVERLAP(4,0) || _EFANOVERLAP(4,1) || _EFANOVERLAP(4,2) || _EFANOVERLAP(4,3))
2720-
INIT_E_AUTO_FAN_PIN(E4_AUTO_FAN_PIN);
2721-
#endif
2722-
#if HAS_AUTO_FAN_5 && !(_EFANOVERLAP(5,0) || _EFANOVERLAP(5,1) || _EFANOVERLAP(5,2) || _EFANOVERLAP(5,3) || _EFANOVERLAP(5,4))
2723-
INIT_E_AUTO_FAN_PIN(E5_AUTO_FAN_PIN);
2724-
#endif
2725-
#if HAS_AUTO_FAN_6 && !(_EFANOVERLAP(6,0) || _EFANOVERLAP(6,1) || _EFANOVERLAP(6,2) || _EFANOVERLAP(6,3) || _EFANOVERLAP(6,4) || _EFANOVERLAP(6,5))
2726-
INIT_E_AUTO_FAN_PIN(E6_AUTO_FAN_PIN);
2727-
#endif
2728-
#if HAS_AUTO_FAN_7 && !(_EFANOVERLAP(7,0) || _EFANOVERLAP(7,1) || _EFANOVERLAP(7,2) || _EFANOVERLAP(7,3) || _EFANOVERLAP(7,4) || _EFANOVERLAP(7,5) || _EFANOVERLAP(7,6))
2729-
INIT_E_AUTO_FAN_PIN(E7_AUTO_FAN_PIN);
2730-
#endif
2731-
#if HAS_AUTO_CHAMBER_FAN && !AUTO_CHAMBER_IS_E
2732-
INIT_CHAMBER_AUTO_FAN_PIN(CHAMBER_AUTO_FAN_PIN);
2733-
#endif
2704+
#if HAS_AUTO_FAN
2705+
#define _OREFAN(I,N) || _EFANOVERLAP(I,N)
2706+
#if HAS_AUTO_FAN_0
2707+
INIT_E_AUTO_FAN_PIN(E0_AUTO_FAN_PIN);
2708+
#endif
2709+
#if HAS_AUTO_FAN_1 && !_EFANOVERLAP(0,1)
2710+
INIT_E_AUTO_FAN_PIN(E1_AUTO_FAN_PIN);
2711+
#endif
2712+
#if HAS_AUTO_FAN_2 && !(0 REPEAT2(2, _OREFAN, 2))
2713+
INIT_E_AUTO_FAN_PIN(E2_AUTO_FAN_PIN);
2714+
#endif
2715+
#if HAS_AUTO_FAN_3 && !(0 REPEAT2(3, _OREFAN, 3))
2716+
INIT_E_AUTO_FAN_PIN(E3_AUTO_FAN_PIN);
2717+
#endif
2718+
#if HAS_AUTO_FAN_4 && !(0 REPEAT2(4, _OREFAN, 4))
2719+
INIT_E_AUTO_FAN_PIN(E4_AUTO_FAN_PIN);
2720+
#endif
2721+
#if HAS_AUTO_FAN_5 && !(0 REPEAT2(5, _OREFAN, 5))
2722+
INIT_E_AUTO_FAN_PIN(E5_AUTO_FAN_PIN);
2723+
#endif
2724+
#if HAS_AUTO_FAN_6 && !(0 REPEAT2(6, _OREFAN, 6))
2725+
INIT_E_AUTO_FAN_PIN(E6_AUTO_FAN_PIN);
2726+
#endif
2727+
#if HAS_AUTO_FAN_7 && !(0 REPEAT2(7, _OREFAN, 7))
2728+
INIT_E_AUTO_FAN_PIN(E7_AUTO_FAN_PIN);
2729+
#endif
2730+
#if HAS_AUTO_CHAMBER_FAN && !AUTO_CHAMBER_IS_E
2731+
INIT_CHAMBER_AUTO_FAN_PIN(CHAMBER_AUTO_FAN_PIN);
2732+
#endif
2733+
#if HAS_AUTO_COOLER_FAN && !AUTO_COOLER_IS_E
2734+
INIT_COOLER_AUTO_FAN_PIN(COOLER_AUTO_FAN_PIN);
2735+
#endif
2736+
#endif // HAS_AUTO_FAN
27342737

27352738
#if HAS_HOTEND
27362739
#define _TEMP_MIN_E(NR) do{ \

0 commit comments

Comments
Β (0)