diff --git a/Marlin/src/gcode/temperature/M104_M109.cpp b/Marlin/src/gcode/temperature/M104_M109.cpp index e80541d20e..3a33425ad5 100644 --- a/Marlin/src/gcode/temperature/M104_M109.cpp +++ b/Marlin/src/gcode/temperature/M104_M109.cpp @@ -72,7 +72,11 @@ void GcodeSuite::M104() { #if ENABLED(ULTRA_LCD) if (parser.value_celsius() > thermalManager.degHotend(e)) - lcd_status_printf_P(0, PSTR("E%i %s"), e + 1, MSG_HEATING); + #if HOTENDS > 1 + lcd_status_printf_P(0, PSTR("E%i " MSG_HEATING), e + 1); + #else + LCD_MESSAGEPGM("E " MSG_HEATING); + #endif #endif } @@ -127,8 +131,13 @@ void GcodeSuite::M109() { #endif #if ENABLED(ULTRA_LCD) - if (thermalManager.isHeatingHotend(target_extruder)) - lcd_status_printf_P(0, PSTR("E%i %s"), target_extruder + 1, MSG_HEATING); + const bool heating = thermalManager.isHeatingHotend(target_extruder); + if (heating || !no_wait_for_cooling) + #if HOTENDS > 1 + lcd_status_printf_P(0, heating ? PSTR("E%i " MSG_HEATING) : PSTR("E%i " MSG_COOLING), target_extruder + 1); + #else + lcd_setstatusPGM(heating ? PSTR("E " MSG_HEATING) : PSTR("E " MSG_COOLING)); + #endif #endif } else return; @@ -234,7 +243,7 @@ void GcodeSuite::M109() { } while (wait_for_heatup && TEMP_CONDITIONS); if (wait_for_heatup) { - LCD_MESSAGEPGM(MSG_HEATING_COMPLETE); + lcd_setstatusPGM(wants_to_cool ? PSTR(MSG_COOLING_COMPLETE) : PSTR(MSG_HEATING_COMPLETE)); #if ENABLED(PRINTER_EVENT_LEDS) leds.set_white(); #endif diff --git a/Marlin/src/gcode/temperature/M140_M190.cpp b/Marlin/src/gcode/temperature/M140_M190.cpp index c0a7d7950a..d17f47f667 100644 --- a/Marlin/src/gcode/temperature/M140_M190.cpp +++ b/Marlin/src/gcode/temperature/M140_M190.cpp @@ -61,7 +61,6 @@ void GcodeSuite::M140() { void GcodeSuite::M190() { if (DEBUGGING(DRYRUN)) return; - LCD_MESSAGEPGM(MSG_BED_HEATING); const bool no_wait_for_cooling = parser.seenval('S'); if (no_wait_for_cooling || parser.seenval('R')) { thermalManager.setTargetBed(parser.value_celsius()); @@ -72,6 +71,8 @@ void GcodeSuite::M190() { } else return; + lcd_setstatusPGM(thermalManager.isHeatingBed() ? PSTR(MSG_BED_HEATING) : PSTR(MSG_BED_COOLING)); + #if TEMP_BED_RESIDENCY_TIME > 0 millis_t residency_start_ms = 0; // Loop until the temperature has stabilized diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index c6aebfbfed..b5f2d770eb 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -783,6 +783,9 @@ #ifndef MSG_HEATING_FAILED_LCD #define MSG_HEATING_FAILED_LCD _UxGT("Heating failed") #endif +#ifndef MSG_HEATING_FAILED_LCD_BED + #define MSG_HEATING_FAILED_LCD_BED _UxGT("Bed heating failed") +#endif #ifndef MSG_ERR_REDUNDANT_TEMP #define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: REDUNDANT TEMP") #endif @@ -828,8 +831,17 @@ #ifndef MSG_HEATING_COMPLETE #define MSG_HEATING_COMPLETE _UxGT("Heating done.") #endif +#ifndef MSG_COOLING + #define MSG_COOLING _UxGT("Cooling...") +#endif +#ifndef MSG_COOLING_COMPLETE + #define MSG_COOLING_COMPLETE _UxGT("Cooling done.") +#endif #ifndef MSG_BED_HEATING - #define MSG_BED_HEATING _UxGT("Bed Heating.") + #define MSG_BED_HEATING _UxGT("Bed heating.") +#endif +#ifndef MSG_BED_COOLING + #define MSG_BED_COOLING _UxGT("Bed cooling.") #endif #ifndef MSG_BED_DONE #define MSG_BED_DONE _UxGT("Bed done.") diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index ccc933b54a..b40ea8f225 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -59,6 +59,24 @@ 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 + #define _BED_ERR_PSTR(MSG, E) (E) == -1 ? PSTR(MSG ## _BED) : +#else + #define _BED_ERR_PSTR(MSG, E) +#endif + +#define TEMP_ERR_PSTR(MSG, E) \ + _BED_ERR_PSTR(MSG, E) \ + (HOTENDS > 1 && (E) == 1) ? PSTR(MSG_E2 " " MSG) : \ + (HOTENDS > 2 && (E) == 2) ? PSTR(MSG_E3 " " MSG) : \ + (HOTENDS > 3 && (E) == 3) ? PSTR(MSG_E4 " " MSG) : \ + (HOTENDS > 4 && (E) == 4) ? PSTR(MSG_E5 " " MSG) : \ + PSTR(MSG_E1 " " MSG) + // public: float Temperature::current_temperature[HOTENDS] = { 0.0 }, @@ -447,12 +465,10 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS], if (current > watch_temp_target) heated = true; // - Flag if target temperature reached } else if (ELAPSED(ms, temp_change_ms)) // Watch timer expired - _temp_error(hotend, PSTR(MSG_T_HEATING_FAILED), PSTR(MSG_HEATING_FAILED_LCD)); + _temp_error(hotend, PSTR(MSG_T_HEATING_FAILED), TEMP_ERR_PSTR(MSG_HEATING_FAILED_LCD, hotend)); } else if (current < target - (MAX_OVERSHOOT_PID_AUTOTUNE)) // Heated, then temperature fell too far? - _temp_error(hotend, PSTR(MSG_T_THERMAL_RUNAWAY), - hotend >= 0 ? PSTR(MSG_THERMAL_RUNAWAY) : PSTR(MSG_THERMAL_RUNAWAY_BED) - ); + _temp_error(hotend, PSTR(MSG_T_THERMAL_RUNAWAY), TEMP_ERR_PSTR(MSG_THERMAL_RUNAWAY, hotend)); } #endif } // every 2 seconds @@ -591,24 +607,10 @@ void Temperature::_temp_error(const int8_t e, const char * const serial_msg, con } void Temperature::max_temp_error(const int8_t e) { - #if HAS_TEMP_BED - _temp_error(e, PSTR(MSG_T_MAXTEMP), e >= 0 ? PSTR(MSG_ERR_MAXTEMP) : PSTR(MSG_ERR_MAXTEMP_BED)); - #else - _temp_error(HOTEND_INDEX, PSTR(MSG_T_MAXTEMP), PSTR(MSG_ERR_MAXTEMP)); - #if HOTENDS == 1 - UNUSED(e); - #endif - #endif + _temp_error(e, PSTR(MSG_T_MAXTEMP), TEMP_ERR_PSTR(MSG_ERR_MAXTEMP, e)); } void Temperature::min_temp_error(const int8_t e) { - #if HAS_TEMP_BED - _temp_error(e, PSTR(MSG_T_MINTEMP), e >= 0 ? PSTR(MSG_ERR_MINTEMP) : PSTR(MSG_ERR_MINTEMP_BED)); - #else - _temp_error(HOTEND_INDEX, PSTR(MSG_T_MINTEMP), PSTR(MSG_ERR_MINTEMP)); - #if HOTENDS == 1 - UNUSED(e); - #endif - #endif + _temp_error(e, PSTR(MSG_T_MINTEMP), TEMP_ERR_PSTR(MSG_ERR_MINTEMP, e)); } float Temperature::get_pid_output(const int8_t e) { @@ -812,7 +814,7 @@ void Temperature::manage_heater() { // Make sure temperature is increasing if (watch_heater_next_ms[e] && ELAPSED(ms, watch_heater_next_ms[e])) { // Time to check this extruder? if (degHotend(e) < watch_target_temp[e]) // Failed to increase enough? - _temp_error(e, PSTR(MSG_T_HEATING_FAILED), PSTR(MSG_HEATING_FAILED_LCD)); + _temp_error(e, PSTR(MSG_T_HEATING_FAILED), TEMP_ERR_PSTR(MSG_HEATING_FAILED_LCD, e)); else // Start again if the target is still far off start_watching_heater(e); } @@ -850,7 +852,7 @@ void Temperature::manage_heater() { // Make sure temperature is increasing if (watch_bed_next_ms && ELAPSED(ms, watch_bed_next_ms)) { // Time to check the bed? if (degBed() < watch_target_bed_temp) // Failed to increase enough? - _temp_error(-1, PSTR(MSG_T_HEATING_FAILED), PSTR(MSG_HEATING_FAILED_LCD)); + _temp_error(-1, PSTR(MSG_T_HEATING_FAILED), TEMP_ERR_PSTR(MSG_HEATING_FAILED_LCD, -1)); else // Start again if the target is still far off start_watching_bed(); } @@ -1453,9 +1455,7 @@ void Temperature::init() { else if (PENDING(millis(), *timer)) break; *state = TRRunaway; case TRRunaway: - _temp_error(heater_id, PSTR(MSG_T_THERMAL_RUNAWAY), - heater_id >= 0 ? PSTR(MSG_THERMAL_RUNAWAY) : PSTR(MSG_THERMAL_RUNAWAY_BED) - ); + _temp_error(heater_id, PSTR(MSG_T_THERMAL_RUNAWAY), TEMP_ERR_PSTR(MSG_THERMAL_RUNAWAY, heater_id)); } }