|
|
@ -472,8 +472,8 @@ int Temperature::getHeaterPower(int heater) { |
|
|
|
#if HAS_AUTO_FAN |
|
|
|
|
|
|
|
void Temperature::checkExtruderAutoFans() { |
|
|
|
constexpr int8_t fanPin[] = { E0_AUTO_FAN_PIN, E1_AUTO_FAN_PIN, E2_AUTO_FAN_PIN, E3_AUTO_FAN_PIN, E4_AUTO_FAN_PIN }; |
|
|
|
constexpr int fanBit[] = { |
|
|
|
static const int8_t fanPin[] PROGMEM = { E0_AUTO_FAN_PIN, E1_AUTO_FAN_PIN, E2_AUTO_FAN_PIN, E3_AUTO_FAN_PIN, E4_AUTO_FAN_PIN }; |
|
|
|
static const uint8_t fanBit[] PROGMEM = { |
|
|
|
0, |
|
|
|
AUTO_1_IS_0 ? 0 : 1, |
|
|
|
AUTO_2_IS_0 ? 0 : AUTO_2_IS_1 ? 1 : 2, |
|
|
@ -482,20 +482,20 @@ int Temperature::getHeaterPower(int heater) { |
|
|
|
}; |
|
|
|
uint8_t fanState = 0; |
|
|
|
|
|
|
|
HOTEND_LOOP() { |
|
|
|
HOTEND_LOOP() |
|
|
|
if (current_temperature[e] > EXTRUDER_AUTO_FAN_TEMPERATURE) |
|
|
|
SBI(fanState, fanBit[e]); |
|
|
|
} |
|
|
|
SBI(fanState, pgm_read_byte(&fanBit[e])); |
|
|
|
|
|
|
|
uint8_t fanDone = 0; |
|
|
|
for (uint8_t f = 0; f < COUNT(fanPin); f++) { |
|
|
|
int8_t pin = fanPin[f]; |
|
|
|
if (pin >= 0 && !TEST(fanDone, fanBit[f])) { |
|
|
|
uint8_t newFanSpeed = TEST(fanState, fanBit[f]) ? EXTRUDER_AUTO_FAN_SPEED : 0; |
|
|
|
int8_t pin = pgm_read_byte(&fanPin[f]); |
|
|
|
const uint8_t bit = pgm_read_byte(&fanBit[f]); |
|
|
|
if (pin >= 0 && !TEST(fanDone, bit)) { |
|
|
|
uint8_t newFanSpeed = TEST(fanState, bit) ? EXTRUDER_AUTO_FAN_SPEED : 0; |
|
|
|
// this idiom allows both digital and PWM fan outputs (see M42 handling).
|
|
|
|
digitalWrite(pin, newFanSpeed); |
|
|
|
analogWrite(pin, newFanSpeed); |
|
|
|
SBI(fanDone, fanBit[f]); |
|
|
|
SBI(fanDone, bit); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|