diff --git a/configuration/macros/heatsoaking.cfg b/configuration/macros/heatsoaking.cfg index 932ca65f3..5d292f77b 100644 --- a/configuration/macros/heatsoaking.cfg +++ b/configuration/macros/heatsoaking.cfg @@ -33,26 +33,37 @@ gcode: {% if settings is not defined %} { action_raise_error("No settings found for [gcode_macro RatOS]") } {% endif %} + {% set defsrc = params.DEFAULT|default(printer["gcode_macro HEATSOAK_SETTINGS"].default_source)|lower %} + {% set current = printer["gcode_macro RatOS"] %} + {% if not defsrc in ('startup', 'current') %} + { action_raise_error("DEFAULT must be either 'startup' or 'current'.") } + {% endif %} + {% set default_quality = (settings.variable_beacon_adaptive_heat_soak_layer_quality if defsrc == 'startup' else current.beacon_adaptive_heat_soak_layer_quality)|default(3)|int %} + {% set default_first_layer_duration_secs = (settings.variable_beacon_adaptive_heat_soak_maximum_first_layer_duration if defsrc == 'startup' else current.beacon_adaptive_heat_soak_maximum_first_layer_duration)|default(1800)|int %} {% if params.QUALITY is defined %} {% set quality = params.QUALITY|int %} {% if quality < 1 or quality > 5 %} { action_raise_error("QUALITY must be between 1 (rough) and 5 (maximum). Use 3 (normal) if unsure.") } {% endif %} {% else %} - {% set quality = settings.variable_beacon_adaptive_heat_soak_layer_quality|default(3)|int %} + {% set quality = default_quality %} {% endif %} {% if params.FIRST_LAYER_DURATION is defined %} {% set first_layer_duration_mins = params.FIRST_LAYER_DURATION|float %} {% if first_layer_duration_mins <= 0 %} { action_raise_error("FIRST_LAYER_DURATION must be a positive number specifying the maximum first layer duration in minutes.") } {% endif %} + {% if first_layer_duration_mins > 120 %} + CONSOLE_ECHO MSG="FIRST_LAYER_DURATION will be limited to 120 minutes. Values larger than this will not have an effect on soak time." + {% set first_layer_duration_mins = 120 %} + {% endif %} {% set first_layer_duration_secs = (first_layer_duration_mins * 60.0)|int %} {% else %} - {% set first_layer_duration_secs = settings.variable_beacon_adaptive_heat_soak_maximum_first_layer_duration|default(1800)|int %} - {% set first_layer_duration_mins = (first_layer_duration_secs / 60.0)|round(2) %} + {% set first_layer_duration_secs = default_first_layer_duration_secs %} + {% set first_layer_duration_mins = first_layer_duration_secs / 60.0 %} {% endif %} HEATSOAK_SETTINGS QUIET=1 beacon_adaptive_heat_soak=True beacon_adaptive_heat_soak_layer_quality={quality} beacon_adaptive_heat_soak_maximum_first_layer_duration={first_layer_duration_secs} - RATOS_ECHO MSG="Will use adaptive bed heatsoak with quality {quality} and maximum first layer duration of {"%.2g"|format(first_layer_duration_mins)} minutes." + RATOS_ECHO MSG="Will use adaptive bed heatsoak with quality {quality} and maximum first layer duration of {first_layer_duration_mins|int if (first_layer_duration_mins|float).is_integer() else first_layer_duration_mins|round(2)} minutes." [gcode_macro USE_FIXED_HEATSOAK] description: Temporarily enables fixed bed heatsoaking, will reset to printer.cfg settings when Klipper is restarted. @@ -62,15 +73,25 @@ gcode: {% if settings is not defined %} { action_raise_error("No settings found for [gcode_macro RatOS]") } {% endif %} + {% set defsrc = params.DEFAULT|default(printer["gcode_macro HEATSOAK_SETTINGS"].default_source)|lower %} + {% set current = printer["gcode_macro RatOS"] %} + {% if not defsrc in ('startup', 'current') %} + { action_raise_error("DEFAULT must be either 'startup' or 'current'.") } + {% endif %} + {% set default_duration = (settings.variable_bed_heat_soak_time if defsrc == 'startup' else current.bed_heat_soak_time)|default(0)|int %} {% if params.DURATION is defined %} {% set duration_mins = params.DURATION|float %} {% if duration_mins < 0 %} { action_raise_error("DURATION must be a non-negative number specifying the heatsoak duration in minutes.") } {% endif %} + {% if duration_mins > 720 %} + CONSOLE_ECHO MSG="DURATION will be limited to 720 minutes (12 hours). If you really need a larger value, adjust printer.cfg instead." + {% set duration_mins = 720 %} + {% endif %} {% set duration_secs = (duration_mins * 60.0)|int %} {% else %} - {% set duration_secs = settings.variable_bed_heat_soak_time|default(0)|int %} - {% set duration_mins = (duration_secs / 60.0)|round(2) %} + {% set duration_secs = default_duration %} + {% set duration_mins = duration_secs / 60.0 %} {% endif %} {% set has_beacon = printer.fastconfig.settings.beacon is defined %} {% if has_beacon %} @@ -81,7 +102,7 @@ gcode: {% if duration_mins < 1e-3 %} RATOS_ECHO MSG="Will use no bed heatsoak." {% else %} - RATOS_ECHO MSG="Will use fixed-duration bed heatsoak of {"%.2g"|format(duration_mins)} minutes." + RATOS_ECHO MSG="Will use fixed-duration bed heatsoak of {duration_mins|int if (duration_mins|float).is_integer() else duration_mins|round(2)} minutes." {% endif %} [gcode_macro USE_NO_HEATSOAK] @@ -93,6 +114,11 @@ gcode: description: Shows or adjusts heatsoak settings - With no arguments: shows current heatsoak settings, specify VERBOSE=1 for detailed output - With arguments: sets the specified settings. Use the full setting name without the variable_ prefix, e.g. bed_heat_soak_time=300 or beacon_adaptive_heat_soak_layer_quality=4. See printer.cfg for available settings. +variable_default_source: "startup" + # "startup" or "current", determines where default values are taken from when using the USE_ADAPTIVE_HEATSOAK and + # USE_FIXED_HEATSOAK commands. This can be overridden per call using the DEFAULT parameter with those commands. + # "startup" will use the original printer.cfg values from when Klipper was started, while "current" + # will use the current values which may have been modified by previous commands. gcode: # Avoid unwanted param detection by mainsail: uses of params2 won't be noticed. {% set params2 = params %} @@ -139,11 +165,11 @@ gcode: {% if is_adaptive %} {% set quality = current.beacon_adaptive_heat_soak_layer_quality|default(3)|int %} {% set first_layer_duration_secs = current.beacon_adaptive_heat_soak_maximum_first_layer_duration|default(1800)|int %} - {% set first_layer_duration_mins = (first_layer_duration_secs / 60.0)|round(2) %} - RATOS_ECHO MSG="Will use adaptive bed heatsoak with quality {quality} and maximum first layer duration of {"%.2g"|format(first_layer_duration_mins)} minutes." + {% set first_layer_duration_mins = first_layer_duration_secs / 60.0 %} + RATOS_ECHO MSG="Will use adaptive bed heatsoak with quality {quality} and maximum first layer duration of {first_layer_duration_mins|int if (first_layer_duration_mins|float).is_integer() else first_layer_duration_mins|round(2)} minutes." {% elif current.bed_heat_soak_time|default(0)|int > 0 %} - {% set duration_mins = (current.bed_heat_soak_time|int / 60.0)|round(2) %} - RATOS_ECHO MSG="Will use fixed-duration bed heatsoak of {"%.2g"|format(duration_mins)} minutes." + {% set duration_mins = (current.bed_heat_soak_time|int / 60.0) %} + RATOS_ECHO MSG="Will use fixed-duration bed heatsoak of {duration_mins|int if (duration_mins|float).is_integer() else duration_mins|round(2)} minutes." {% else %} RATOS_ECHO MSG="Will use no bed heatsoak." {% endif %}