Add HAS_HEATED_BED conditional (#10494)

This commit is contained in:
Scott Lahteine 2018-04-22 23:40:49 -05:00 committed by GitHub
parent 6b50a50676
commit b19d8182c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 304 additions and 264 deletions

View File

@ -696,7 +696,6 @@
#define HAS_TEMP_HOTEND (HAS_TEMP_0 || ENABLED(HEATER_0_USES_MAX6675))
#define HAS_TEMP_BED (PIN_EXISTS(TEMP_BED) && TEMP_SENSOR_BED != 0 && TEMP_SENSOR_BED > -2)
#define HAS_TEMP_CHAMBER (PIN_EXISTS(TEMP_CHAMBER) && TEMP_SENSOR_CHAMBER != 0 && TEMP_SENSOR_CHAMBER > -2)
#define HAS_TEMP_SENSOR (HAS_TEMP_HOTEND || HAS_TEMP_BED || HAS_TEMP_CHAMBER)
// Heaters
#define HAS_HEATER_0 (PIN_EXISTS(HEATER_0))
@ -706,8 +705,11 @@
#define HAS_HEATER_4 (PIN_EXISTS(HEATER_4))
#define HAS_HEATER_BED (PIN_EXISTS(HEATER_BED))
#define HAS_HEATED_BED (HAS_TEMP_BED && HAS_HEATER_BED)
#define HAS_TEMP_SENSOR (HAS_TEMP_HOTEND || HAS_HEATED_BED || HAS_TEMP_CHAMBER)
// Thermal protection
#define HAS_THERMALLY_PROTECTED_BED (ENABLED(THERMAL_PROTECTION_BED) && HAS_TEMP_BED && HAS_HEATER_BED)
#define HAS_THERMALLY_PROTECTED_BED (HAS_HEATED_BED && ENABLED(THERMAL_PROTECTION_BED))
#define WATCH_HOTENDS (ENABLED(THERMAL_PROTECTION_HOTENDS) && WATCH_TEMP_PERIOD > 0)
#define WATCH_THE_BED (HAS_THERMALLY_PROTECTED_BED && WATCH_BED_TEMP_PERIOD > 0)
@ -804,7 +806,7 @@
/**
* Heated bed requires settings
*/
#if HAS_HEATER_BED
#if HAS_HEATED_BED
#ifndef MAX_BED_POWER
#define MAX_BED_POWER 255
#endif

View File

@ -481,7 +481,7 @@
*/
inline bool turn_on_heaters() {
millis_t next = millis() + 5000UL;
#if HAS_TEMP_BED
#if HAS_HEATED_BED
#if ENABLED(ULTRA_LCD)
if (g26_bed_temp > 25) {
lcd_setstatusPGM(PSTR("G26 Heating Bed."), 99);
@ -841,7 +841,7 @@
#endif
if (!g26_keep_heaters_on) {
#if HAS_TEMP_BED
#if HAS_HEATED_BED
thermalManager.setTargetBed(0);
#endif
thermalManager.setTargetHotend(0, 0);

View File

@ -572,7 +572,7 @@ uint8_t target_extruder;
#define ADJUST_DELTA(V) NOOP
#endif
#if HAS_TEMP_BED && ENABLED(WAIT_FOR_BED_HEATER)
#if HAS_HEATED_BED && ENABLED(WAIT_FOR_BED_HEATER)
const static char msg_wait_for_bed_heating[] PROGMEM = "Wait for bed heating...\n";
#endif
@ -2213,7 +2213,7 @@ void clean_up_after_endstop_or_probe_move() {
if (DEBUGGING(LEVELING)) DEBUG_POS(">>> do_probe_move", current_position);
#endif
#if HAS_TEMP_BED && ENABLED(WAIT_FOR_BED_HEATER)
#if HAS_HEATED_BED && ENABLED(WAIT_FOR_BED_HEATER)
// Wait for bed to heat back up between probing points
if (thermalManager.isHeatingBed()) {
serialprintPGM(msg_wait_for_bed_heating);
@ -2937,7 +2937,7 @@ static void do_homing_move(const AxisEnum axis, const float distance, const floa
}
#endif
#if HOMING_Z_WITH_PROBE && HAS_TEMP_BED && ENABLED(WAIT_FOR_BED_HEATER)
#if HOMING_Z_WITH_PROBE && HAS_HEATED_BED && ENABLED(WAIT_FOR_BED_HEATER)
// Wait for bed to heat back up between probing points
if (axis == Z_AXIS && distance < 0 && thermalManager.isHeatingBed()) {
serialprintPGM(msg_wait_for_bed_heating);
@ -7891,7 +7891,7 @@ inline void gcode_M105() {
#if HAS_TEMP_SENSOR
SERIAL_PROTOCOLPGM(MSG_OK);
thermalManager.print_heaterstates();
#else // !HAS_TEMP_HOTEND && !HAS_TEMP_BED
#else // !HAS_TEMP_SENSOR
SERIAL_ERROR_START();
SERIAL_ERRORLNPGM(MSG_ERR_NO_THERMISTORS);
#endif
@ -8155,7 +8155,15 @@ inline void gcode_M109() {
#endif
}
#if HAS_TEMP_BED
#if HAS_HEATED_BED
/**
* M140: Set bed temperature
*/
inline void gcode_M140() {
if (DEBUGGING(DRYRUN)) return;
if (parser.seenval('S')) thermalManager.setTargetBed(parser.value_celsius());
}
#ifndef MIN_COOLING_SLOPE_DEG_BED
#define MIN_COOLING_SLOPE_DEG_BED 1.50
@ -8287,7 +8295,7 @@ inline void gcode_M109() {
#endif
}
#endif // HAS_TEMP_BED
#endif // HAS_HEATED_BED
/**
* M110: Set Current Line Number
@ -8382,14 +8390,6 @@ inline void gcode_M111() {
#endif // BARICUDA
/**
* M140: Set bed temperature
*/
inline void gcode_M140() {
if (DEBUGGING(DRYRUN)) return;
if (parser.seenval('S')) thermalManager.setTargetBed(parser.value_celsius());
}
#if ENABLED(ULTIPANEL)
/**
@ -12065,8 +12065,6 @@ void process_parsed_command() {
case 113: gcode_M113(); break; // M113: Set Host Keepalive Interval
#endif
case 140: gcode_M140(); break; // M140: Set Bed Temperature
case 105: gcode_M105(); KEEPALIVE_STATE(NOT_BUSY); return; // M105: Report Temperatures (and say "ok")
#if ENABLED(AUTO_REPORT_TEMPERATURES)
@ -12075,7 +12073,8 @@ void process_parsed_command() {
case 109: gcode_M109(); break; // M109: Set Hotend Temperature. Wait for target.
#if HAS_TEMP_BED
#if HAS_HEATED_BED
case 140: gcode_M140(); break; // M140: Set Bed Temperature
case 190: gcode_M190(); break; // M190: Set Bed Temperature. Wait for target.
#endif
@ -13688,7 +13687,7 @@ void prepare_move_to_destination() {
if (ELAPSED(millis(), next_status_led_update_ms)) {
next_status_led_update_ms += 500; // Update every 0.5s
float max_temp = 0.0;
#if HAS_TEMP_BED
#if HAS_HEATED_BED
max_temp = MAX3(max_temp, thermalManager.degTargetBed(), thermalManager.degBed());
#endif
HOTEND_LOOP()

View File

@ -134,7 +134,7 @@
// STATUS_SCREEN_HOTEND_TEXT_X(i) to modify draw locations.
#include "_Statusscreen.h"
#elif HAS_TEMP_BED
#elif HAS_HEATED_BED
#define STATUS_SCREEN_X ( 8 + (HOTENDS ? 0 : 64))
#define STATUS_SCREENWIDTH (120 - (HOTENDS ? 0 : 64))
@ -319,7 +319,7 @@
};
#endif // HOTENDS
#else // !HAS_TEMP_BED
#else // !HAS_HEATED_BED
#define STATUS_SCREEN_X ( 8 + (HOTENDS ? 0 : 96))
#define STATUS_SCREENWIDTH (120 - (HOTENDS ? 0 : 96))
@ -505,7 +505,7 @@
#endif // HOTENDS
#endif // !HAS_TEMP_BED
#endif // !HAS_HEATED_BED
#if ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY) || ENABLED(MESH_EDIT_GFX_OVERLAY)

View File

@ -69,7 +69,9 @@ static char sd_filename[MAXPATHNAMELENGTH];
SERIAL_PROTOCOLPAIR("leveling: ", int(job_recovery_info.leveling));
SERIAL_PROTOCOLLNPAIR(" fade: ", int(job_recovery_info.fade));
#endif
#if HAS_HEATED_BED
SERIAL_PROTOCOLLNPAIR("target_temperature_bed: ", job_recovery_info.target_temperature_bed);
#endif
SERIAL_PROTOCOLLNPAIR("cmd_queue_index_r: ", job_recovery_info.cmd_queue_index_r);
SERIAL_PROTOCOLLNPAIR("commands_in_queue: ", job_recovery_info.commands_in_queue);
if (recovery)
@ -198,7 +200,9 @@ void save_job_recovery_info() {
COPY(job_recovery_info.current_position, current_position);
job_recovery_info.feedrate = feedrate_mm_s;
COPY(job_recovery_info.target_temperature, thermalManager.target_temperature);
#if HAS_HEATED_BED
job_recovery_info.target_temperature_bed = thermalManager.target_temperature_bed;
#endif
COPY(job_recovery_info.fanSpeeds, fanSpeeds);
#if HAS_LEVELING

View File

@ -41,9 +41,12 @@ typedef struct {
// Machine state
float current_position[NUM_AXIS], feedrate;
int16_t target_temperature[HOTENDS],
target_temperature_bed,
fanSpeeds[FAN_COUNT];
#if HAS_HEATED_BED
int16_t target_temperature_bed;
#endif
#if HAS_LEVELING
bool leveling;
float fade;

View File

@ -45,7 +45,7 @@ FORCE_INLINE void _draw_heater_status(const uint8_t x, const int8_t heater, cons
UNUSED(blink);
#endif
#if HAS_TEMP_BED
#if HAS_HEATED_BED
const bool isBed = heater < 0;
#else
constexpr bool isBed = false;
@ -53,33 +53,49 @@ FORCE_INLINE void _draw_heater_status(const uint8_t x, const int8_t heater, cons
if (PAGE_UNDER(7)) {
#if HEATER_IDLE_HANDLER
const bool is_idle = (!isBed ? thermalManager.is_heater_idle(heater) :
#if HAS_TEMP_BED
thermalManager.is_bed_idle()
#else
false
const bool is_idle = (
#if HAS_HEATED_BED
isBed ? thermalManager.is_bed_idle() :
#endif
thermalManager.is_heater_idle(heater)
);
if (blink || !is_idle)
#endif
_draw_centered_temp((isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater)) + 0.5, x, 7); }
_draw_centered_temp(0.5 + (
#if HAS_HEATED_BED
isBed ? thermalManager.degTargetBed() :
#endif
thermalManager.degTargetHotend(heater)
), x, 7
);
}
if (PAGE_CONTAINS(21, 28))
_draw_centered_temp((isBed ? thermalManager.degBed() : thermalManager.degHotend(heater)) + 0.5, x, 28);
_draw_centered_temp(0.5 + (
#if HAS_HEATED_BED
isBed ? thermalManager.degBed() :
#endif
thermalManager.degHotend(heater)
), x, 28
);
if (PAGE_CONTAINS(17, 20)) {
const uint8_t h = isBed ? 7 : HEAT_INDICATOR_X,
y = isBed ? 18 : 17;
if (isBed ? thermalManager.isHeatingBed() : thermalManager.isHeatingHotend(heater)) {
if (
#if HAS_HEATED_BED
isBed ? thermalManager.isHeatingBed() :
#endif
thermalManager.isHeatingHotend(heater)
) {
u8g.setColorIndex(0); // white on black
u8g.drawBox(x + h, y, 2, 2);
u8g.setColorIndex(1); // black on white
}
else {
else
u8g.drawBox(x + h, y, 2, 2);
}
}
}
FORCE_INLINE void _draw_axis_label(const AxisEnum axis, const char* const pstr, const bool blink) {
@ -199,7 +215,7 @@ static void lcd_implementation_status_screen() {
HOTEND_LOOP() _draw_heater_status(STATUS_SCREEN_HOTEND_TEXT_X(e), e, blink);
// Heated bed
#if HOTENDS < 4 && HAS_TEMP_BED
#if HOTENDS < 4 && HAS_HEATED_BED
_draw_heater_status(STATUS_SCREEN_BED_TEXT_X, -1, blink);
#endif

View File

@ -525,12 +525,12 @@ void ST7920_Lite_Status_Screen::draw_heat_icon(const bool whichIcon, const bool
static struct {
bool E1_show_target : 1;
bool E2_show_target : 1;
#if HAS_HEATER_BED
#if HAS_HEATED_BED
bool bed_show_target : 1;
#endif
} display_state = {
true, true
#if HAS_HEATER_BED
#if HAS_HEATED_BED
, true
#endif
};
@ -569,7 +569,7 @@ void ST7920_Lite_Status_Screen::draw_extruder_2_temp(const int16_t temp, const i
display_state.E2_show_target = show_target;
}
#if HAS_HEATER_BED
#if HAS_HEATED_BED
void ST7920_Lite_Status_Screen::draw_bed_temp(const int16_t temp, const int16_t target, bool forceUpdate) {
const bool show_target = target && FAR(temp, target);
draw_temps(2
@ -680,7 +680,7 @@ bool ST7920_Lite_Status_Screen::indicators_changed() {
#if EXTRUDERS == 2
const int16_t extruder_2_target = thermalManager.degTargetHotend(1);
#endif
#if HAS_HEATER_BED
#if HAS_HEATED_BED
const int16_t bed_target = thermalManager.degTargetBed();
#endif
static uint16_t last_checksum = 0;
@ -688,7 +688,7 @@ bool ST7920_Lite_Status_Screen::indicators_changed() {
#if EXTRUDERS == 2
^ extruder_2_target
#endif
#if HAS_HEATER_BED
#if HAS_HEATED_BED
^ bed_target
#endif
;
@ -709,7 +709,7 @@ void ST7920_Lite_Status_Screen::update_indicators(const bool forceUpdate) {
const int16_t extruder_2_temp = thermalManager.degHotend(1),
extruder_2_target = thermalManager.degTargetHotend(1);
#endif
#if HAS_HEATER_BED
#if HAS_HEATED_BED
const int16_t bed_temp = thermalManager.degBed(),
bed_target = thermalManager.degTargetBed();
#endif
@ -718,7 +718,7 @@ void ST7920_Lite_Status_Screen::update_indicators(const bool forceUpdate) {
#if EXTRUDERS == 2
draw_extruder_2_temp(extruder_2_temp, extruder_2_target, forceUpdate);
#endif
#if HAS_HEATER_BED
#if HAS_HEATED_BED
draw_bed_temp(bed_temp, bed_target, forceUpdate);
#endif
draw_fan_speed(fan_speed);
@ -727,7 +727,7 @@ void ST7920_Lite_Status_Screen::update_indicators(const bool forceUpdate) {
// Update the fan and bed animations
if (fan_speed > 0) draw_fan_icon(blink);
#if HAS_HEATER_BED
#if HAS_HEATED_BED
if (bed_target > 0)
draw_heat_icon(blink, true);
else

View File

@ -62,7 +62,7 @@ Temperature thermalManager;
* Macros to include the heater id in temp errors. The compiler's dead-code
* elimination should (hopefully) optimize out the unused strings.
*/
#if HAS_TEMP_BED
#if HAS_HEATED_BED
#define TEMP_ERR_PSTR(MSG, E) \
(E) == -1 ? PSTR(MSG ## _BED) : \
(HOTENDS > 1 && (E) == 1) ? PSTR(MSG_E2 " " MSG) : \
@ -81,21 +81,51 @@ Temperature thermalManager;
// public:
float Temperature::current_temperature[HOTENDS] = { 0.0 },
Temperature::current_temperature_chamber = 0.0,
Temperature::current_temperature_bed = 0.0;
float Temperature::current_temperature[HOTENDS] = { 0.0 };
int16_t Temperature::current_temperature_raw[HOTENDS] = { 0 },
Temperature::target_temperature[HOTENDS] = { 0 },
Temperature::current_temperature_chamber_raw = 0,
Temperature::current_temperature_bed_raw = 0;
Temperature::target_temperature[HOTENDS] = { 0 };
#if ENABLED(AUTO_POWER_E_FANS)
int16_t Temperature::autofan_speed[HOTENDS] = { 0 };
#endif
#if HAS_HEATER_BED
int16_t Temperature::target_temperature_bed = 0;
#if HAS_HEATED_BED
float Temperature::current_temperature_bed = 0.0;
int16_t Temperature::current_temperature_bed_raw = 0,
Temperature::target_temperature_bed = 0;
uint8_t Temperature::soft_pwm_amount_bed;
#ifdef BED_MINTEMP
int16_t Temperature::bed_minttemp_raw = HEATER_BED_RAW_LO_TEMP;
#endif
#ifdef BED_MAXTEMP
int16_t Temperature::bed_maxttemp_raw = HEATER_BED_RAW_HI_TEMP;
#endif
#if WATCH_THE_BED
uint16_t Temperature::watch_target_bed_temp = 0;
millis_t Temperature::watch_bed_next_ms = 0;
#endif
#if ENABLED(PIDTEMPBED)
float Temperature::bedKp, Temperature::bedKi, Temperature::bedKd, // Initialized by settings.load()
Temperature::temp_iState_bed = { 0 },
Temperature::temp_dState_bed = { 0 },
Temperature::pTerm_bed,
Temperature::iTerm_bed,
Temperature::dTerm_bed,
Temperature::pid_error_bed;
#else
millis_t Temperature::next_bed_check_ms;
#endif
uint16_t Temperature::raw_temp_bed_value = 0;
#if HEATER_IDLE_HANDLER
millis_t Temperature::bed_idle_timeout_ms = 0;
bool Temperature::bed_idle_timeout_exceeded = false;
#endif
#endif // HAS_HEATED_BED
#if HAS_TEMP_CHAMBER
float Temperature::current_temperature_chamber = 0.0;
int16_t Temperature::current_temperature_chamber_raw = 0;
uint16_t Temperature::raw_temp_chamber_value = 0;
#endif
// Initialized by settings.load()
@ -113,11 +143,6 @@ int16_t Temperature::current_temperature_raw[HOTENDS] = { 0 },
#endif
#endif
// Initialized by settings.load()
#if ENABLED(PIDTEMPBED)
float Temperature::bedKp, Temperature::bedKi, Temperature::bedKd;
#endif
#if ENABLED(BABYSTEPPING)
volatile int Temperature::babystepsTodo[XYZ] = { 0 };
#endif
@ -127,18 +152,11 @@ int16_t Temperature::current_temperature_raw[HOTENDS] = { 0 },
millis_t Temperature::watch_heater_next_ms[HOTENDS] = { 0 };
#endif
#if WATCH_THE_BED
uint16_t Temperature::watch_target_bed_temp = 0;
millis_t Temperature::watch_bed_next_ms = 0;
#endif
#if ENABLED(PREVENT_COLD_EXTRUSION)
bool Temperature::allow_cold_extrude = false;
int16_t Temperature::extrude_min_temp = EXTRUDE_MINTEMP;
#endif
// private:
#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)
uint16_t Temperature::redundant_temperature_raw = 0;
float Temperature::redundant_temperature = 0.0;
@ -164,20 +182,7 @@ volatile bool Temperature::temp_meas_ready = false;
bool Temperature::pid_reset[HOTENDS];
#endif
#if ENABLED(PIDTEMPBED)
float Temperature::temp_iState_bed = { 0 },
Temperature::temp_dState_bed = { 0 },
Temperature::pTerm_bed,
Temperature::iTerm_bed,
Temperature::dTerm_bed,
Temperature::pid_error_bed;
#else
millis_t Temperature::next_bed_check_ms;
#endif
uint16_t Temperature::raw_temp_value[MAX_EXTRUDERS] = { 0 },
Temperature::raw_temp_chamber_value = 0,
Temperature::raw_temp_bed_value = 0;
uint16_t Temperature::raw_temp_value[MAX_EXTRUDERS] = { 0 };
// Init min and max temp with extreme values to prevent false errors during startup
int16_t Temperature::minttemp_raw[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_RAW_LO_TEMP , HEATER_1_RAW_LO_TEMP , HEATER_2_RAW_LO_TEMP, HEATER_3_RAW_LO_TEMP, HEATER_4_RAW_LO_TEMP),
@ -193,14 +198,6 @@ int16_t Temperature::minttemp_raw[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_RAW_LO_TE
millis_t Temperature::preheat_end_time[HOTENDS] = { 0 };
#endif
#ifdef BED_MINTEMP
int16_t Temperature::bed_minttemp_raw = HEATER_BED_RAW_LO_TEMP;
#endif
#ifdef BED_MAXTEMP
int16_t Temperature::bed_maxttemp_raw = HEATER_BED_RAW_HI_TEMP;
#endif
#if ENABLED(FILAMENT_WIDTH_SENSOR)
int8_t Temperature::meas_shift_index; // Index of a delayed sample in buffer
#endif
@ -209,8 +206,7 @@ int16_t Temperature::minttemp_raw[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_RAW_LO_TE
millis_t Temperature::next_auto_fan_check_ms = 0;
#endif
uint8_t Temperature::soft_pwm_amount[HOTENDS],
Temperature::soft_pwm_amount_bed;
uint8_t Temperature::soft_pwm_amount[HOTENDS];
#if ENABLED(FAN_SOFT_PWM)
uint8_t Temperature::soft_pwm_amount_fan[FAN_COUNT],
@ -228,10 +224,6 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS],
#if HEATER_IDLE_HANDLER
millis_t Temperature::heater_idle_timeout_ms[HOTENDS] = { 0 };
bool Temperature::heater_idle_timeout_exceeded[HOTENDS] = { false };
#if HAS_TEMP_BED
millis_t Temperature::bed_idle_timeout_ms = 0;
bool Temperature::bed_idle_timeout_exceeded = false;
#endif
#endif
#if ENABLED(ADC_KEYPAD)
@ -541,8 +533,13 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS],
Temperature::Temperature() { }
int Temperature::getHeaterPower(int heater) {
return heater < 0 ? soft_pwm_amount_bed : soft_pwm_amount[heater];
int Temperature::getHeaterPower(const int heater) {
return (
#if HAS_HEATED_BED
heater < 0 ? soft_pwm_amount_bed :
#endif
soft_pwm_amount[heater]
);
}
#if HAS_AUTO_FAN
@ -841,6 +838,8 @@ void Temperature::manage_heater() {
}
#endif // FILAMENT_WIDTH_SENSOR
#if HAS_HEATED_BED
#if WATCH_THE_BED
// Make sure temperature is increasing
if (watch_bed_next_ms && ELAPSED(ms, watch_bed_next_ms)) { // Time to check the bed?
@ -863,8 +862,6 @@ void Temperature::manage_heater() {
#endif
#endif
#if HAS_TEMP_BED
#if HEATER_IDLE_HANDLER
if (!bed_idle_timeout_exceeded && bed_idle_timeout_ms && ELAPSED(ms, bed_idle_timeout_ms))
bed_idle_timeout_exceeded = true;
@ -904,7 +901,7 @@ void Temperature::manage_heater() {
}
#endif
}
#endif // HAS_TEMP_BED
#endif // HAS_HEATED_BED
}
#define PGM_RD_W(x) (short)pgm_read_word(&x)
@ -952,7 +949,7 @@ float Temperature::analog2temp(const int raw, const uint8_t e) {
return ((raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR) * (TEMP_SENSOR_AD595_GAIN)) + TEMP_SENSOR_AD595_OFFSET;
}
#if HAS_TEMP_BED
#if HAS_HEATED_BED
// Derived from RepRap FiveD extruder::getTemperature()
// For bed temperature measurement.
float Temperature::analog2tempBed(const int raw) {
@ -986,7 +983,7 @@ float Temperature::analog2temp(const int raw, const uint8_t e) {
#endif
}
#endif // HAS_TEMP_BED
#endif // HAS_HEATED_BED
#if HAS_TEMP_CHAMBER
// Derived from RepRap FiveD extruder::getTemperature()
@ -1036,7 +1033,7 @@ void Temperature::updateTemperaturesFromRawValues() {
#endif
HOTEND_LOOP()
current_temperature[e] = Temperature::analog2temp(current_temperature_raw[e], e);
#if HAS_TEMP_BED
#if HAS_HEATED_BED
current_temperature_bed = Temperature::analog2tempBed(current_temperature_bed_raw);
#endif
#if HAS_TEMP_CHAMBER
@ -1127,7 +1124,7 @@ void Temperature::init() {
#if HAS_HEATER_4
SET_OUTPUT(HEATER_3_PIN);
#endif
#if HAS_HEATER_BED
#if HAS_HEATED_BED
SET_OUTPUT(HEATER_BED_PIN);
#endif
@ -1192,7 +1189,7 @@ void Temperature::init() {
#if HAS_TEMP_4
ANALOG_SELECT(TEMP_4_PIN);
#endif
#if HAS_TEMP_BED
#if HAS_HEATED_BED
ANALOG_SELECT(TEMP_BED_PIN);
#endif
#if HAS_TEMP_CHAMBER
@ -1327,7 +1324,7 @@ void Temperature::init() {
#endif // HOTENDS > 2
#endif // HOTENDS > 1
#if HAS_TEMP_BED
#if HAS_HEATED_BED
#ifdef BED_MINTEMP
while (analog2tempBed(bed_minttemp_raw) < BED_MINTEMP) {
#if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP
@ -1346,7 +1343,7 @@ void Temperature::init() {
#endif
}
#endif // BED_MAXTEMP
#endif // HAS_TEMP_BED
#endif // HAS_HEATED_BED
#if ENABLED(PROBING_HEATERS_OFF)
paused = false;
@ -1463,7 +1460,7 @@ void Temperature::init() {
#if HEATER_IDLE_HANDLER
// If the heater idle timeout expires, restart
if ((heater_id >= 0 && heater_idle_timeout_exceeded[heater_id])
#if HAS_TEMP_BED
#if HAS_HEATED_BED
|| (heater_id < 0 && bed_idle_timeout_exceeded)
#endif
) {
@ -1509,7 +1506,10 @@ void Temperature::disable_all_heaters() {
#endif
HOTEND_LOOP() setTargetHotend(0, e);
#if HAS_HEATED_BED
setTargetBed(0);
#endif
// Unpause and reset everything
#if ENABLED(PROBING_HEATERS_OFF)
@ -1541,10 +1541,10 @@ void Temperature::disable_all_heaters() {
#endif // HOTENDS > 1
#endif
#if HAS_TEMP_BED
#if HAS_HEATED_BED
target_temperature_bed = 0;
soft_pwm_amount_bed = 0;
#if HAS_HEATER_BED
#if HAS_HEATED_BED
WRITE_HEATER_BED(LOW);
#endif
#endif
@ -1557,13 +1557,13 @@ void Temperature::disable_all_heaters() {
paused = p;
if (p) {
HOTEND_LOOP() start_heater_idle_timer(e, 0); // timeout immediately
#if HAS_TEMP_BED
#if HAS_HEATED_BED
start_bed_idle_timer(0); // timeout immediately
#endif
}
else {
HOTEND_LOOP() reset_heater_idle_timer(e);
#if HAS_TEMP_BED
#if HAS_HEATED_BED
reset_bed_idle_timer();
#endif
}
@ -1673,8 +1673,13 @@ void Temperature::set_current_temp_raw() {
#endif
#endif
#endif
#if HAS_HEATED_BED
current_temperature_bed_raw = raw_temp_bed_value;
#endif
#if HAS_TEMP_CHAMBER
current_temperature_chamber_raw = raw_temp_chamber_value;
#endif
temp_meas_ready = true;
}
@ -1821,7 +1826,7 @@ void Temperature::isr() {
#endif // HOTENDS > 3
#endif // HOTENDS > 2
#endif // HOTENDS > 1
#if HAS_HEATER_BED
#if HAS_HEATED_BED
ISR_STATICS(BED);
#endif
@ -1862,7 +1867,7 @@ void Temperature::isr() {
#endif // HOTENDS > 2
#endif // HOTENDS > 1
#if HAS_HEATER_BED
#if HAS_HEATED_BED
soft_pwm_count_BED = (soft_pwm_count_BED & pwm_mask) + soft_pwm_amount_bed;
WRITE_HEATER_BED(soft_pwm_count_BED > pwm_mask ? HIGH : LOW);
#endif
@ -1897,7 +1902,7 @@ void Temperature::isr() {
#endif // HOTENDS > 2
#endif // HOTENDS > 1
#if HAS_HEATER_BED
#if HAS_HEATED_BED
if (soft_pwm_count_BED <= pwm_count_tmp) WRITE_HEATER_BED(LOW);
#endif
@ -1978,7 +1983,7 @@ void Temperature::isr() {
#endif // HOTENDS > 3
#endif // HOTENDS > 2
#endif // HOTENDS > 1
#if HAS_HEATER_BED
#if HAS_HEATED_BED
_SLOW_PWM_ROUTINE(BED, soft_pwm_amount_bed); // BED
#endif
@ -1997,7 +2002,7 @@ void Temperature::isr() {
#endif // HOTENDS > 3
#endif // HOTENDS > 2
#endif // HOTENDS > 1
#if HAS_HEATER_BED
#if HAS_HEATED_BED
PWM_OFF_ROUTINE(BED); // BED
#endif
@ -2057,7 +2062,7 @@ void Temperature::isr() {
#endif // HOTENDS > 3
#endif // HOTENDS > 2
#endif // HOTENDS > 1
#if HAS_HEATER_BED
#if HAS_HEATED_BED
if (state_timer_heater_BED > 0) state_timer_heater_BED--;
#endif
} // ((pwm_count >> SOFT_PWM_SCALE) & 0x3F) == 0
@ -2113,7 +2118,7 @@ void Temperature::isr() {
break;
#endif
#if HAS_TEMP_BED
#if HAS_HEATED_BED
case PrepareTemp_BED:
START_ADC(TEMP_BED_PIN);
break;
@ -2216,8 +2221,14 @@ void Temperature::isr() {
#endif
ZERO(raw_temp_value);
#if HAS_HEATED_BED
raw_temp_bed_value = 0;
#endif
#if HAS_TEMP_CHAMBER
raw_temp_chamber_value = 0;
#endif
#define TEMPDIR(N) ((HEATER_##N##_RAW_LO_TEMP) > (HEATER_##N##_RAW_HI_TEMP) ? -1 : 1)
@ -2263,7 +2274,7 @@ void Temperature::isr() {
#endif
}
#if HAS_TEMP_BED
#if HAS_HEATED_BED
#if HEATER_BED_RAW_LO_TEMP > HEATER_BED_RAW_HI_TEMP
#define GEBED <=
#else
@ -2331,15 +2342,15 @@ void Temperature::isr() {
#endif
const int8_t e=-3
) {
#if !(HAS_TEMP_BED && HAS_TEMP_HOTEND && HAS_TEMP_CHAMBER) && HOTENDS <= 1
#if !(HAS_HEATED_BED && HAS_TEMP_HOTEND && HAS_TEMP_CHAMBER) && HOTENDS <= 1
UNUSED(e);
#endif
SERIAL_PROTOCOLCHAR(' ');
SERIAL_PROTOCOLCHAR(
#if HAS_TEMP_CHAMBER && HAS_TEMP_BED && HAS_TEMP_HOTEND
#if HAS_TEMP_CHAMBER && HAS_HEATED_BED && HAS_TEMP_HOTEND
e == -2 ? 'C' : e == -1 ? 'B' : 'T'
#elif HAS_TEMP_BED && HAS_TEMP_HOTEND
#elif HAS_HEATED_BED && HAS_TEMP_HOTEND
e == -1 ? 'B' : 'T'
#elif HAS_TEMP_HOTEND
'T'
@ -2370,7 +2381,7 @@ void Temperature::isr() {
#endif
);
#endif
#if HAS_TEMP_BED
#if HAS_HEATED_BED
print_heater_state(degBed(), degTargetBed()
#if ENABLED(SHOW_TEMP_ADC_VALUES)
, rawBedTemp()
@ -2396,7 +2407,7 @@ void Temperature::isr() {
#endif
SERIAL_PROTOCOLPGM(" @:");
SERIAL_PROTOCOL(getHeaterPower(target_extruder));
#if HAS_TEMP_BED
#if HAS_HEATED_BED
SERIAL_PROTOCOLPGM(" B@:");
SERIAL_PROTOCOL(getHeaterPower(-1));
#endif

View File

@ -77,7 +77,7 @@ enum ADCSensorState : char {
PrepareTemp_4,
MeasureTemp_4,
#endif
#if HAS_TEMP_BED
#if HAS_HEATED_BED
PrepareTemp_BED,
MeasureTemp_BED,
#endif
@ -115,35 +115,21 @@ enum ADCSensorState : char {
#define unscalePID_d(d) ( (d) * PID_dT )
#endif
#if !HAS_HEATER_BED
constexpr int16_t target_temperature_bed = 0;
#endif
class Temperature {
public:
static float current_temperature[HOTENDS],
current_temperature_chamber,
current_temperature_bed;
static volatile bool in_temp_isr;
static float current_temperature[HOTENDS];
static int16_t current_temperature_raw[HOTENDS],
target_temperature[HOTENDS],
current_temperature_chamber_raw,
current_temperature_bed_raw;
target_temperature[HOTENDS];
static uint8_t soft_pwm_amount[HOTENDS];
#if ENABLED(AUTO_POWER_E_FANS)
static int16_t autofan_speed[HOTENDS];
#endif
#if HAS_HEATER_BED
static int16_t target_temperature_bed;
#endif
static volatile bool in_temp_isr;
static uint8_t soft_pwm_amount[HOTENDS],
soft_pwm_amount_bed;
#if ENABLED(FAN_SOFT_PWM)
static uint8_t soft_pwm_amount_fan[FAN_COUNT],
soft_pwm_count_fan[FAN_COUNT];
@ -171,24 +157,24 @@ class Temperature {
#endif
#if HAS_HEATED_BED
static float current_temperature_bed;
static int16_t current_temperature_bed_raw, target_temperature_bed;
static uint8_t soft_pwm_amount_bed;
#if ENABLED(PIDTEMPBED)
static float bedKp, bedKi, bedKd;
#endif
#endif
#if HAS_TEMP_CHAMBER
static float current_temperature_chamber;
static int16_t current_temperature_chamber_raw;
#endif
#if ENABLED(BABYSTEPPING)
static volatile int babystepsTodo[3];
#endif
#if WATCH_HOTENDS
static uint16_t watch_target_temp[HOTENDS];
static millis_t watch_heater_next_ms[HOTENDS];
#endif
#if WATCH_THE_BED
static uint16_t watch_target_bed_temp;
static millis_t watch_bed_next_ms;
#endif
#if ENABLED(PREVENT_COLD_EXTRUSION)
static bool allow_cold_extrude;
static int16_t extrude_min_temp;
@ -215,13 +201,19 @@ class Temperature {
private:
static volatile bool temp_meas_ready;
static uint16_t raw_temp_value[MAX_EXTRUDERS];
#if WATCH_HOTENDS
static uint16_t watch_target_temp[HOTENDS];
static millis_t watch_heater_next_ms[HOTENDS];
#endif
#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)
static uint16_t redundant_temperature_raw;
static float redundant_temperature;
#endif
static volatile bool temp_meas_ready;
#if ENABLED(PIDTEMP)
static float temp_iState[HOTENDS],
temp_dState[HOTENDS],
@ -240,6 +232,18 @@ class Temperature {
static bool pid_reset[HOTENDS];
#endif
// Init min and max temp with extreme values to prevent false errors during startup
static int16_t minttemp_raw[HOTENDS],
maxttemp_raw[HOTENDS],
minttemp[HOTENDS],
maxttemp[HOTENDS];
#if HAS_HEATED_BED
static uint16_t raw_temp_bed_value;
#if WATCH_THE_BED
static uint16_t watch_target_bed_temp;
static millis_t watch_bed_next_ms;
#endif
#if ENABLED(PIDTEMPBED)
static float temp_iState_bed,
temp_dState_bed,
@ -250,16 +254,22 @@ class Temperature {
#else
static millis_t next_bed_check_ms;
#endif
#if HEATER_IDLE_HANDLER
static millis_t bed_idle_timeout_ms;
static bool bed_idle_timeout_exceeded;
#endif
#ifdef BED_MINTEMP
static int16_t bed_minttemp_raw;
#endif
#ifdef BED_MAXTEMP
static int16_t bed_maxttemp_raw;
#endif
#endif
static uint16_t raw_temp_value[MAX_EXTRUDERS],
raw_temp_chamber_value,
raw_temp_bed_value;
#if HAS_TEMP_CHAMBER
static uint16_t raw_temp_chamber_value;
#endif
// Init min and max temp with extreme values to prevent false errors during startup
static int16_t minttemp_raw[HOTENDS],
maxttemp_raw[HOTENDS],
minttemp[HOTENDS],
maxttemp[HOTENDS];
#ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED
static uint8_t consecutive_low_temperature_error[HOTENDS];
@ -269,14 +279,6 @@ class Temperature {
static millis_t preheat_end_time[HOTENDS];
#endif
#ifdef BED_MINTEMP
static int16_t bed_minttemp_raw;
#endif
#ifdef BED_MAXTEMP
static int16_t bed_maxttemp_raw;
#endif
#if ENABLED(FILAMENT_WIDTH_SENSOR)
static int8_t meas_shift_index; // Index of a delayed sample in buffer
#endif
@ -296,10 +298,6 @@ class Temperature {
#if HEATER_IDLE_HANDLER
static millis_t heater_idle_timeout_ms[HOTENDS];
static bool heater_idle_timeout_exceeded[HOTENDS];
#if HAS_TEMP_BED
static millis_t bed_idle_timeout_ms;
static bool bed_idle_timeout_exceeded;
#endif
#endif
public:
@ -321,7 +319,7 @@ class Temperature {
*/
static float analog2temp(const int raw, const uint8_t e);
#if HAS_TEMP_BED
#if HAS_HEATED_BED
static float analog2tempBed(const int raw);
#endif
#if HAS_TEMP_CHAMBER
@ -380,8 +378,6 @@ class Temperature {
#endif
return current_temperature[HOTEND_INDEX];
}
FORCE_INLINE static float degBed() { return current_temperature_bed; }
FORCE_INLINE static float degChamber() { return current_temperature_chamber; }
#if ENABLED(SHOW_TEMP_ADC_VALUES)
FORCE_INLINE static int16_t rawHotendTemp(const uint8_t e) {
@ -390,8 +386,6 @@ class Temperature {
#endif
return current_temperature_raw[HOTEND_INDEX];
}
FORCE_INLINE static int16_t rawBedTemp() { return current_temperature_bed_raw; }
FORCE_INLINE static int16_t rawChamberTemp() { return current_temperature_chamber_raw; }
#endif
FORCE_INLINE static int16_t degTargetHotend(const uint8_t e) {
@ -401,16 +395,10 @@ class Temperature {
return target_temperature[HOTEND_INDEX];
}
FORCE_INLINE static int16_t degTargetBed() { return target_temperature_bed; }
#if WATCH_HOTENDS
static void start_watching_heater(const uint8_t e = 0);
#endif
#if WATCH_THE_BED
static void start_watching_bed();
#endif
static void setTargetHotend(const int16_t celsius, const uint8_t e) {
#if HOTENDS == 1
UNUSED(e);
@ -430,8 +418,30 @@ class Temperature {
#endif
}
FORCE_INLINE static bool isHeatingHotend(const uint8_t e) {
#if HOTENDS == 1
UNUSED(e);
#endif
return target_temperature[HOTEND_INDEX] > current_temperature[HOTEND_INDEX];
}
FORCE_INLINE static bool isCoolingHotend(const uint8_t e) {
#if HOTENDS == 1
UNUSED(e);
#endif
return target_temperature[HOTEND_INDEX] < current_temperature[HOTEND_INDEX];
}
#if HAS_HEATED_BED
#if ENABLED(SHOW_TEMP_ADC_VALUES)
FORCE_INLINE static int16_t rawBedTemp() { return current_temperature_bed_raw; }
#endif
FORCE_INLINE static float degBed() { return current_temperature_bed; }
FORCE_INLINE static int16_t degTargetBed() { return target_temperature_bed; }
FORCE_INLINE static bool isHeatingBed() { return target_temperature_bed > current_temperature_bed; }
FORCE_INLINE static bool isCoolingBed() { return target_temperature_bed < current_temperature_bed; }
static void setTargetBed(const int16_t celsius) {
#if HAS_HEATER_BED
#if ENABLED(AUTO_POWER_CONTROL)
powerManager.power_on();
#endif
@ -445,24 +455,19 @@ class Temperature {
#if WATCH_THE_BED
start_watching_bed();
#endif
#endif
}
FORCE_INLINE static bool isHeatingHotend(const uint8_t e) {
#if HOTENDS == 1
UNUSED(e);
#if WATCH_THE_BED
static void start_watching_bed();
#endif
#endif
return target_temperature[HOTEND_INDEX] > current_temperature[HOTEND_INDEX];
}
FORCE_INLINE static bool isHeatingBed() { return target_temperature_bed > current_temperature_bed; }
FORCE_INLINE static bool isCoolingHotend(const uint8_t e) {
#if HOTENDS == 1
UNUSED(e);
#if HAS_TEMP_CHAMBER
#if ENABLED(SHOW_TEMP_ADC_VALUES)
FORCE_INLINE static int16_t rawChamberTemp() { return current_temperature_chamber_raw; }
#endif
FORCE_INLINE static float degChamber() { return current_temperature_chamber; }
#endif
return target_temperature[HOTEND_INDEX] < current_temperature[HOTEND_INDEX];
}
FORCE_INLINE static bool isCoolingBed() { return target_temperature_bed < current_temperature_bed; }
FORCE_INLINE static bool wait_for_heating(const uint8_t e) {
return degTargetHotend(e) > TEMP_HYSTERESIS && abs(degHotend(e) - degTargetHotend(e)) > TEMP_HYSTERESIS;
@ -471,7 +476,7 @@ class Temperature {
/**
* The software PWM power for a heater
*/
static int getHeaterPower(int heater);
static int getHeaterPower(const int heater);
/**
* Switch off all heaters, set all target temperatures to 0
@ -564,7 +569,7 @@ class Temperature {
return heater_idle_timeout_exceeded[HOTEND_INDEX];
}
#if HAS_TEMP_BED
#if HAS_HEATED_BED
static void start_bed_idle_timer(const millis_t timeout_ms) {
bed_idle_timeout_ms = millis() + timeout_ms;
bed_idle_timeout_exceeded = false;

View File

@ -882,9 +882,11 @@ void kill_screen(const char* lcd_msg) {
#endif
));
#if HAS_HEATED_BED
// Restore the bed temperature
sprintf_P(cmd, PSTR("M190 S%i"), job_recovery_info.target_temperature_bed);
enqueue_and_echo_command(cmd);
#endif
// Restore all hotend temperatures
HOTEND_LOOP() {
@ -1422,7 +1424,7 @@ void kill_screen(const char* lcd_msg) {
//
// Bed:
//
#if HAS_TEMP_BED
#if HAS_HEATED_BED
MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_BED, &thermalManager.target_temperature_bed, 0, BED_MAXTEMP - 15, watch_temp_callback_bed);
#endif
@ -2127,7 +2129,7 @@ void kill_screen(const char* lcd_msg) {
x_plot = 0,
y_plot = 0;
#if HAS_TEMP_BED
#if HAS_HEATED_BED
static int16_t custom_bed_temp = 50;
#endif
@ -2137,7 +2139,7 @@ void kill_screen(const char* lcd_msg) {
void _lcd_ubl_build_custom_mesh() {
char UBL_LCD_GCODE[20];
enqueue_and_echo_commands_P(PSTR("G28"));
#if HAS_TEMP_BED
#if HAS_HEATED_BED
sprintf_P(UBL_LCD_GCODE, PSTR("M190 S%i"), custom_bed_temp);
lcd_enqueue_command(UBL_LCD_GCODE);
#endif
@ -2158,7 +2160,7 @@ void kill_screen(const char* lcd_msg) {
START_MENU();
MENU_BACK(MSG_UBL_BUILD_MESH_MENU);
MENU_ITEM_EDIT(int3, MSG_UBL_CUSTOM_HOTEND_TEMP, &custom_hotend_temp, EXTRUDE_MINTEMP, (HEATER_0_MAXTEMP - 10));
#if HAS_TEMP_BED
#if HAS_HEATED_BED
MENU_ITEM_EDIT(int3, MSG_UBL_CUSTOM_BED_TEMP, &custom_bed_temp, BED_MINTEMP, (BED_MAXTEMP - 15));
#endif
MENU_ITEM(function, MSG_UBL_BUILD_CUSTOM_MESH, _lcd_ubl_build_custom_mesh);
@ -2217,7 +2219,7 @@ void kill_screen(const char* lcd_msg) {
void _lcd_ubl_validate_custom_mesh() {
char UBL_LCD_GCODE[24];
const int temp =
#if HAS_TEMP_BED
#if HAS_HEATED_BED
custom_bed_temp
#else
0
@ -2240,7 +2242,7 @@ void kill_screen(const char* lcd_msg) {
void _lcd_ubl_validate_mesh() {
START_MENU();
MENU_BACK(MSG_UBL_TOOLS);
#if HAS_TEMP_BED
#if HAS_HEATED_BED
MENU_ITEM(gcode, MSG_UBL_VALIDATE_PLA_MESH, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_1_TEMP_BED) " H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P"));
MENU_ITEM(gcode, MSG_UBL_VALIDATE_ABS_MESH, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_2_TEMP_BED) " H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P"));
#else
@ -2344,7 +2346,7 @@ void kill_screen(const char* lcd_msg) {
void _lcd_ubl_build_mesh() {
START_MENU();
MENU_BACK(MSG_UBL_TOOLS);
#if HAS_TEMP_BED
#if HAS_HEATED_BED
MENU_ITEM(gcode, MSG_UBL_BUILD_PLA_MESH, PSTR(
"G28\n"
"M190 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\n"
@ -2736,7 +2738,7 @@ void kill_screen(const char* lcd_msg) {
//
bool has_heat = false;
HOTEND_LOOP() if (thermalManager.target_temperature[HOTEND_INDEX]) { has_heat = true; break; }
#if HAS_TEMP_BED
#if HAS_HEATED_BED
if (thermalManager.target_temperature_bed) has_heat = true;
#endif
if (has_heat) MENU_ITEM(function, MSG_COOLDOWN, lcd_cooldown);
@ -3456,7 +3458,7 @@ void kill_screen(const char* lcd_msg) {
//
// Bed:
//
#if HAS_TEMP_BED
#if HAS_HEATED_BED
MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_BED, &thermalManager.target_temperature_bed, 0, BED_MAXTEMP - 15, watch_temp_callback_bed);
#endif

View File

@ -617,14 +617,13 @@ FORCE_INLINE void _draw_axis_label(const AxisEnum axis, const char* const pstr,
}
FORCE_INLINE void _draw_heater_status(const int8_t heater, const char prefix, const bool blink) {
#if TEMP_SENSOR_BED
#if HAS_HEATED_BED
const bool isBed = heater < 0;
#else
constexpr bool isBed = false;
#endif
const float t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater)),
t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater));
#else
const float t1 = thermalManager.degHotend(heater), t2 = thermalManager.degTargetHotend(heater);
#endif
if (prefix >= 0) lcd.print(prefix);
@ -634,12 +633,11 @@ FORCE_INLINE void _draw_heater_status(const int8_t heater, const char prefix, co
#if !HEATER_IDLE_HANDLER
UNUSED(blink);
#else
const bool is_idle = (!isBed ? thermalManager.is_heater_idle(heater) :
#if HAS_TEMP_BED
thermalManager.is_bed_idle()
#else
false
const bool is_idle = (
#if HAS_HEATED_BED
isBed ? thermalManager.is_bed_idle() :
#endif
thermalManager.is_heater_idle(heater)
);
if (!blink && is_idle) {