@@ -1166,44 +1166,55 @@ int16_t Temperature::getHeaterPower(const heater_id_t heater_id) {
1166
1166
}
1167
1167
}
1168
1168
1169
- #define _EFANOVERLAP (A,B ) _FANOVERLAP(E##A,B)
1170
-
1171
1169
#if HAS_AUTO_FAN
1172
1170
1171
+ #define _EFANOVERLAP (I,N ) ((I != N) && _FANOVERLAP(I,E##N))
1172
+
1173
1173
#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 )
1175
1175
#else
1176
1176
#define INIT_E_AUTO_FAN_PIN (P ) SET_OUTPUT(P)
1177
1177
#endif
1178
1178
#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 )
1180
1180
#else
1181
1181
#define INIT_CHAMBER_AUTO_FAN_PIN (P ) SET_OUTPUT(P)
1182
1182
#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
1183
1188
1184
1189
#ifndef CHAMBER_FAN_INDEX
1185
1190
#define CHAMBER_FAN_INDEX HOTENDS
1186
1191
#endif
1187
1192
1188
1193
void Temperature::update_autofans () {
1189
- #define _EFAN (B,A ) _EFANOVERLAP(A,B ) ? B :
1194
+ #define _EFAN (I,N ) _EFANOVERLAP(I,N ) ? I :
1190
1195
static const uint8_t fanBit[] PROGMEM = {
1191
1196
0
1192
1197
#if HAS_MULTI_HOTEND
1193
1198
#define _NEXT_FAN (N ) , REPEAT2(N,_EFAN,N) N
1194
1199
RREPEAT_S (1 , HOTENDS, _NEXT_FAN)
1195
1200
#endif
1201
+ #define _NFAN HOTENDS
1196
1202
#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))
1199
1211
#endif
1200
1212
};
1201
1213
1202
1214
uint8_t fanState = 0 ;
1203
1215
HOTEND_LOOP () {
1204
- if (temp_hotend[e].celsius >= EXTRUDER_AUTO_FAN_TEMPERATURE) {
1216
+ if (temp_hotend[e].celsius >= EXTRUDER_AUTO_FAN_TEMPERATURE)
1205
1217
SBI (fanState, pgm_read_byte (&fanBit[e]));
1206
- }
1207
1218
}
1208
1219
1209
1220
#if HAS_AUTO_CHAMBER_FAN
@@ -1234,6 +1245,11 @@ int16_t Temperature::getHeaterPower(const heater_id_t heater_id) {
1234
1245
chamberfan_speed = fan_on ? CHAMBER_AUTO_FAN_SPEED : 0 ;
1235
1246
break ;
1236
1247
#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
1237
1253
default :
1238
1254
#if EITHER(AUTO_POWER_E_FANS, HAS_FANCHECK)
1239
1255
autofan_speed[realFan] = fan_on ? EXTRUDER_AUTO_FAN_SPEED : 0 ;
@@ -1247,35 +1263,16 @@ int16_t Temperature::getHeaterPower(const heater_id_t heater_id) {
1247
1263
#define _AUTOFAN_SPEED () EXTRUDER_AUTO_FAN_SPEED
1248
1264
#endif
1249
1265
#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))
1250
1267
1251
1268
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)
1276
1270
#if HAS_AUTO_CHAMBER_FAN && !AUTO_CHAMBER_IS_E
1277
1271
case CHAMBER_FAN_INDEX: _UPDATE_AUTO_FAN (CHAMBER, fan_on, CHAMBER_AUTO_FAN_SPEED); break ;
1278
1272
#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
1279
1276
}
1280
1277
SBI (fanDone, realFan);
1281
1278
}
@@ -2704,33 +2701,39 @@ void Temperature::init() {
2704
2701
HAL_timer_start (MF_TIMER_TEMP, TEMP_TIMER_FREQUENCY);
2705
2702
ENABLE_TEMPERATURE_INTERRUPT ();
2706
2703
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
2734
2737
2735
2738
#if HAS_HOTEND
2736
2739
#define _TEMP_MIN_E (NR ) do { \
0 commit comments