=============== Log rollover at Sun May 25 00:03:04 2025 ===============
Starting Klippy...
Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock']
Git version: 'v0.12.0-396-gb7233d119-dirty'
Untracked files: klippy/extras/beacon.py, klippy/extras/gcode_shell_command.py, klippy/extras/linear_movement_vibrations.py, klippy/extras/ratos.py, klippy/extras/ratos_homing.py, klippy/extras/resonance_generator.py, klippy/extras/z_offset_probe.py, klippy/kinematics/ratos_hybrid_corexy.py
Branch: master
Remote: origin
Tracked URL: https://github.com/Klipper3d/klipper.git
CPU: 4 core ?
Python: '3.9.2 (default, Mar 20 2025, 22:21:41) \n[GCC 10.2.1 20210110]'
Start printer at Sun May 25 00:03:05 2025 (1748127785.8 21.8)
===== Config file =====
[gcode_macro ECHO_T_VARS]
description = Echo Toolhead variables to the console.
gcode =
{% set t = params.T|default(0) %}
RATOS_ECHO MSG="T{t} Variables"
{% for var, value in printer["gcode_macro T%s" % t].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro ECHO_RATOS_VARS]
description = Echo RatOS variables to the console.
gcode =
{% for var, value in printer["gcode_macro RatOS"].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro RatOS]
description = RatOS variable storage macro, will echo variables to the console when run.
variable_relative_extrusion = False
variable_force_absolute_position = False
variable_preheat_extruder = True
variable_preheat_extruder_temp = 150
variable_macro_travel_speed = 150
variable_macro_travel_accel = 2000
variable_macro_z_speed = 15
variable_bed_margin_x = [0, 0]
variable_bed_margin_y = [0, 0]
variable_printable_x_min = 0
variable_printable_x_max = 0
variable_printable_y_min = 0
variable_printable_y_max = 0
variable_end_print_motors_off = True
variable_status_color_ok = "00FF00"
variable_status_color_error = "FF0000"
variable_status_color_unknown = "FFFF00"
variable_end_print_retract_filament = 10
gcode =
ECHO_RATOS_VARS
[delayed_gcode RATOS_INIT]
initial_duration = 0.1
gcode =
RATOS_ECHO MSG="Welcome to RatOS!"
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator. Use the link in the sidebar to proceed with the setup."
[delayed_gcode RATOS_LOGO]
initial_duration = 2
gcode =
HELLO_RATOS
[gcode_macro INITIAL_FRONTEND_UPDATE]
gcode =
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_error = printer["gcode_macro RatOS"].status_color_error|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_unknown}"'
{% endif %}
{% set t0_sensor = "undefined" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].filament_detected|lower == "true" %}
{% set t0_sensor = "detected" %}
{% else %}
{% set t0_sensor = "empty" %}
{% endif %}
{% else %}
{% set t0_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set t1_sensor = "undefined" %}
{% if printer["dual_carriage"] is defined and printer["filament_switch_sensor toolhead_filament_sensor_t1"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].filament_detected|lower == "true" %}
{% set t1_sensor = "detected" %}
{% else %}
{% set t1_sensor = "empty" %}
{% endif %}
{% else %}
{% set t1_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set svv = printer.save_variables.variables %}
{% if svv.t0_filament is defined and printer["gcode_macro T0"] is defined %}
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
{% if t0_sensor != "empty" %}
{% set t0_filament_type = svv.t0_filament[0]|default('')|string %}
{% set t0_filament_name = svv.t0_filament[1]|default('')|string %}
{% set t0_filament_temp = svv.t0_filament[2]|default(0)|float %}
{% if t0_filament_name != '' and t0_filament_type != '' and t0_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{t0_filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{t0_filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={t0_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
{% if svv.t1_filament is defined and printer["gcode_macro T1"] is defined %}
{% if printer["gcode_macro T1"].filament_name is defined and printer["gcode_macro T1"].filament_type is defined and printer["gcode_macro T1"].filament_temp is defined %}
{% if t1_sensor != "empty" %}
{% set t1_filament_type = svv.t1_filament[0]|default('')|string %}
{% set t1_filament_name = svv.t1_filament[1]|default('')|string %}
{% set t1_filament_temp = svv.t1_filament[2]|default(0)|float %}
{% if t1_filament_name != '' and t1_filament_type != '' and t1_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='"{t1_filament_name}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='"{t1_filament_type}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE={t1_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t1_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro CALCULATE_PRINTABLE_AREA]
gcode =
{% set bed_margin_x = printer["gcode_macro RatOS"].bed_margin_x %}
{% set bed_margin_y = printer["gcode_macro RatOS"].bed_margin_y %}
{% set tool = 0 if printer["gcode_macro T0"] is not defined or printer["gcode_macro T0"].active else 1 %}
{% set max_x = printer.toolhead.axis_maximum.x if printer["dual_carriage"] is defined and tool == 0 else printer.toolhead.axis_maximum.x - bed_margin_x[1] %}
{% if printer["dual_carriage"] is defined %}
{% set max_x = printer.toolhead.axis_maximum.x %}
{% endif %}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="printer.toolhead.axis_maximum.x {printer.toolhead.axis_maximum.x}"
{% set max_y = printer.toolhead.axis_maximum.y - bed_margin_y[1]%}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_x_max VALUE={max_x}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_y_max VALUE={max_y}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="Printable area calculated: X: 0,{max_x} Y: 0,{max_y}"
[gcode_macro CACHE_TOOLHEAD_SETTINGS]
variable_cache = {"global": {"accel": 1000, "ratio": 0.5, "speed": 50, "scv": 5}}
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set dummy = cache.__setitem__(key, {"accel": printer.toolhead.max_accel, "ratio": printer.toolhead.minimum_cruise_ratio, "speed": printer.toolhead.max_velocity, "scv": printer.toolhead.square_corner_velocity}) %}
SET_GCODE_VARIABLE MACRO=CACHE_TOOLHEAD_SETTINGS VARIABLE=cache VALUE="{cache | pprint | replace("\n", "") | replace("\"", "\\\"")}"
DEBUG_ECHO PREFIX="CACHE_TOOLHEAD_SETTINGS" MSG="Toolhead settings cached for {key}. {printer.toolhead.max_accel} accel, {printer.toolhead.minimum_cruise_ratio} ratio, {printer.toolhead.max_velocity} velocity, {printer.toolhead.square_corner_velocity} scv."
[gcode_macro RESTORE_TOOLHEAD_SETTINGS]
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set values = printer["gcode_macro CACHE_TOOLHEAD_SETTINGS"].cache.__getitem__(key) %}
{% if values is not defined or values == 'None' %}
{ action_raise_error("RESTORE_TOOLHEAD_SETTINGS: Toolhead settings not cached for key '" ~ key ~ "'.") }
{% endif %}
SET_VELOCITY_LIMIT ACCEL={values.accel} MINIMUM_CRUISE_RATIO={values.ratio} VELOCITY={values.speed} SQUARE_CORNER_VELOCITY={values.scv}
DEBUG_ECHO PREFIX="RESTORE_TOOLHEAD_SETTINGS" MSG="Toolhead settings restored. {values.accel} accel, {values.ratio} ratio, {values.speed} velocity, {values.scv} scv."
[gcode_macro SET_MACRO_TRAVEL_SETTINGS]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set accel = printer["gcode_macro RatOS"].macro_travel_accel %}
SET_VELOCITY_LIMIT ACCEL={accel} MINIMUM_CRUISE_RATIO=0.5 VELOCITY={speed} SQUARE_CORNER_VELOCITY={5}
DEBUG_ECHO PREFIX="SET_MACRO_TRAVEL_SETTINGS" MSG="Macro travel settings set. {accel} accel, {speed} velocity"
[gcode_macro SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% if printer["dual_carriage"] is not defined %}
SET_KINEMATIC_POSITION X={printable_x_max / 2} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
{% else %}
IDEX_SET_CENTER_KINEMATIC_POSITION
{% endif %}
[gcode_macro IDEX_SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set center_x = printable_x_max / 2 %}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x - (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x + (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
[gcode_macro VERIFY_HYBRID_INVERTED]
gcode =
{% set inverted = False %}
{% if printer.configfile.settings.ratos_hybrid_corexy is defined and printer.configfile.settings.ratos_hybrid_corexy.inverted is defined %}
{% if printer.configfile.settings.ratos_hybrid_corexy.inverted|lower == 'true' %}
{% set inverted = True %}
{% endif %}
{% endif %}
{% if inverted == False %}
{ action_emergency_stop("ratos_hybrid_corexy NOT INVERTED! Inverted hybrid core-xy bugfix not detected.") }
{% endif %}
[gcode_macro RATOS_ECHO]
gcode =
{% set prefix = "RatOS" %}
{% set debug = params.DEBUG|default(0)|int %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " | " ~ params.PREFIX %}
{% endif %}
{% set prefix = prefix ~ ":" %}
{% set msg = "" %}
{% if params.MSG is defined %}
{% set msg = params.MSG %}
{% else %}
{% set msg = "No msg parameter provided (this is a bug or unintended use)." %}
{% endif %}
{% if not debug %}
M117 {prefix} {msg}
{% endif %}
RATOS_LOG PREFIX="{prefix}" MSG="{msg}"
{% if not debug %}
RESPOND PREFIX="{prefix}" MSG="{msg}"
{% else %}
CONSOLE_ECHO TITLE="{prefix}" TYPE="debug" MSG="{msg}"
{% endif %}
[gcode_macro ENABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=True
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=prefix_filter VALUE="'{params.FILTER|default('')|lower}'"
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging enabled."
[gcode_macro DISABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=False
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging disabled."
[gcode_macro DEBUG_ECHO]
variable_enabled = False
variable_prefix_filter = ''
gcode =
{% set prefix = "DEBUG" %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " - " ~ params.PREFIX %}
{% endif %}
{% if enabled and (prefix_filter|lower == '' or prefix_filter|lower in params.PREFIX|lower) %}
RATOS_ECHO PREFIX="{prefix}" MSG="{params.MSG}" DEBUG=1
{% endif %}
[gcode_macro START_FEATURE]
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="Start {params.FEATURE} feature gcode"
{% set scv = printer.toolhead.square_corner_velocity|int|default(5) %}
{% set accel = printer.toolhead.max_accel|int|default(10000) %}
{% set ratio = printer.toolhead.minimum_cruise_ratio|float|default(0.5) %}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="scv" VALUE={scv}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="accel" VALUE={accel}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="ratio" VALUE={ratio}
_USER_START_FEATURE FEATURE="{params.FEATURE}"
[gcode_macro END_FEATURE]
variable_scv = 5
variable_accel = 10000
variable_ratio = 0.5
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="End {params.FEATURE} feature gcode"
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={scv} ACCEL={accel} MINIMUM_CRUISE_RATIO={ratio}
_USER_END_FEATURE FEATURE="{params.FEATURE}" SCV={scv} ACCEL={accel} RATIO={ratio}
[gcode_macro _ON_LAYER_CHANGE]
variable_layer_number = 0
description = INTERNAL USE ONLY. Call it from the slicers after layer change custom gcode
gcode =
{% set layer = params.LAYER|int %}
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE={layer}
SET_PRINT_STATS_INFO CURRENT_LAYER={layer}
[gcode_macro _LEARN_MORE_CALIBRATION]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/calibration" %}
{% set link_text = "RatOS Calibration Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_CHAMBER_FILTER]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter Control" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_FILAMENT]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/filaments" %}
{% set link_text = "RatOS Filament Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _CONSOLE_SAVE_CONFIG]
gcode =
M118 Click SAVE_CONFIG to save the settings to your printer.cfg.
[gcode_macro SAVE_Z_OFFSET]
gcode =
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SAVE_MULTIPLIER
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _LOAD_RATOS_SKEW_PROFILE]
gcode =
{% set ratos_skew_profile = printer["gcode_macro RatOS"].skew_profile|default("") %}
{% if ratos_skew_profile != "" %}
{% if printer.configfile.config["skew_correction %s" % ratos_skew_profile] is defined %}
SKEW_PROFILE LOAD={ratos_skew_profile}
GET_CURRENT_SKEW
{% else %}
{% set line_1 = '"Could not find skew profile %s!_N_Clearing skew correction."' % ratos_skew_profile %}
CONSOLE_ECHO TITLE="Missing skew profile!" TYPE="warning" MSG={line_1}
SET_SKEW CLEAR=1
{% endif %}
{% endif %}
[gcode_macro M601]
gcode =
PAUSE
[idle_timeout]
gcode =
{% if printer.webhooks.state|lower == 'ready' %}
{% if printer.pause_resume.is_paused|lower == 'false' %}
RATOS_ECHO PREFIX="IDLE" MSG="2 hours since last activity. Powering off heaters and motors.."
TURN_OFF_HEATERS
M84
{% endif %}
{% endif %}
timeout = 7200
[temperature_sensor raspberry_pi]
sensor_type = temperature_host
[virtual_sdcard]
path = ~/printer_data/gcodes
[display_status]
[pause_resume]
[respond]
[ratos]
[mcu]
serial = /tmp/klipper_host_mcu
[printer]
kinematics = none
max_velocity = 1
max_accel = 1
[gcode_macro PAUSE]
rename_existing = PAUSE_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
[gcode_macro RESUME]
rename_existing = RESUME_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
[gcode_macro CANCEL_PRINT]
rename_existing = CANCEL_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
=======================
mcu 'mcu': Starting connect
Loaded MCU 'mcu' 119 commands (?-20240727_132503-fv-az659-741 / gcc: (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110 binutils: (GNU Binutils for Raspbian) 2.35.2)
MCU 'mcu' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256
Sending MCU 'mcu' printer configuration...
Configured MCU 'mcu' (1024 moves)
Config error
Traceback (most recent call last):
File "/home/pi/klipper/klippy/klippy.py", line 135, in _connect
cb()
File "/home/pi/klipper/klippy/extras/ratos.py", line 58, in _connect
self.register_command_overrides()
File "/home/pi/klipper/klippy/extras/ratos.py", line 86, in register_command_overrides
self.register_override('TEST_RESONANCES', self.override_TEST_RESONANCES, desc=(self.desc_TEST_RESONANCES))
File "/home/pi/klipper/klippy/extras/ratos.py", line 97, in register_override
raise self.printer.config_error("Existing command '%s' not found in RatOS override" % (command,))
configparser.Error: Existing command 'TEST_RESONANCES' not found in RatOS override
webhooks client 4134071624: New connection
webhooks client 4134071624: Client info {'program': 'Moonraker', 'version': 'v0.9.3-0-g71f9e67'}
Starting Klippy...
Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock']
Git version: 'v0.12.0-396-gb7233d119-dirty'
Untracked files: klippy/extras/beacon.py, klippy/extras/gcode_shell_command.py, klippy/extras/linear_movement_vibrations.py, klippy/extras/ratos.py, klippy/extras/ratos_homing.py, klippy/extras/resonance_generator.py, klippy/extras/z_offset_probe.py, klippy/kinematics/ratos_hybrid_corexy.py
Branch: master
Remote: origin
Tracked URL: https://github.com/Klipper3d/klipper.git
CPU: 4 core ?
Python: '3.9.2 (default, Mar 20 2025, 22:21:41) \n[GCC 10.2.1 20210110]'
Start printer at Sun May 25 00:03:41 2025 (1748127821.5 57.5)
===== Config file =====
[gcode_macro ECHO_T_VARS]
description = Echo Toolhead variables to the console.
gcode =
{% set t = params.T|default(0) %}
RATOS_ECHO MSG="T{t} Variables"
{% for var, value in printer["gcode_macro T%s" % t].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro ECHO_RATOS_VARS]
description = Echo RatOS variables to the console.
gcode =
{% for var, value in printer["gcode_macro RatOS"].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro RatOS]
description = RatOS variable storage macro, will echo variables to the console when run.
variable_relative_extrusion = False
variable_force_absolute_position = False
variable_preheat_extruder = True
variable_preheat_extruder_temp = 150
variable_macro_travel_speed = 150
variable_macro_travel_accel = 2000
variable_macro_z_speed = 15
variable_bed_margin_x = [0, 0]
variable_bed_margin_y = [0, 0]
variable_printable_x_min = 0
variable_printable_x_max = 0
variable_printable_y_min = 0
variable_printable_y_max = 0
variable_end_print_motors_off = True
variable_status_color_ok = "00FF00"
variable_status_color_error = "FF0000"
variable_status_color_unknown = "FFFF00"
variable_end_print_retract_filament = 10
gcode =
ECHO_RATOS_VARS
[delayed_gcode RATOS_INIT]
initial_duration = 0.1
gcode =
RATOS_ECHO MSG="Welcome to RatOS!"
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator. Use the link in the sidebar to proceed with the setup."
[delayed_gcode RATOS_LOGO]
initial_duration = 2
gcode =
HELLO_RATOS
[gcode_macro INITIAL_FRONTEND_UPDATE]
gcode =
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_error = printer["gcode_macro RatOS"].status_color_error|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_unknown}"'
{% endif %}
{% set t0_sensor = "undefined" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].filament_detected|lower == "true" %}
{% set t0_sensor = "detected" %}
{% else %}
{% set t0_sensor = "empty" %}
{% endif %}
{% else %}
{% set t0_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set t1_sensor = "undefined" %}
{% if printer["dual_carriage"] is defined and printer["filament_switch_sensor toolhead_filament_sensor_t1"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].filament_detected|lower == "true" %}
{% set t1_sensor = "detected" %}
{% else %}
{% set t1_sensor = "empty" %}
{% endif %}
{% else %}
{% set t1_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set svv = printer.save_variables.variables %}
{% if svv.t0_filament is defined and printer["gcode_macro T0"] is defined %}
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
{% if t0_sensor != "empty" %}
{% set t0_filament_type = svv.t0_filament[0]|default('')|string %}
{% set t0_filament_name = svv.t0_filament[1]|default('')|string %}
{% set t0_filament_temp = svv.t0_filament[2]|default(0)|float %}
{% if t0_filament_name != '' and t0_filament_type != '' and t0_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{t0_filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{t0_filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={t0_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
{% if svv.t1_filament is defined and printer["gcode_macro T1"] is defined %}
{% if printer["gcode_macro T1"].filament_name is defined and printer["gcode_macro T1"].filament_type is defined and printer["gcode_macro T1"].filament_temp is defined %}
{% if t1_sensor != "empty" %}
{% set t1_filament_type = svv.t1_filament[0]|default('')|string %}
{% set t1_filament_name = svv.t1_filament[1]|default('')|string %}
{% set t1_filament_temp = svv.t1_filament[2]|default(0)|float %}
{% if t1_filament_name != '' and t1_filament_type != '' and t1_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='"{t1_filament_name}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='"{t1_filament_type}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE={t1_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t1_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro CALCULATE_PRINTABLE_AREA]
gcode =
{% set bed_margin_x = printer["gcode_macro RatOS"].bed_margin_x %}
{% set bed_margin_y = printer["gcode_macro RatOS"].bed_margin_y %}
{% set tool = 0 if printer["gcode_macro T0"] is not defined or printer["gcode_macro T0"].active else 1 %}
{% set max_x = printer.toolhead.axis_maximum.x if printer["dual_carriage"] is defined and tool == 0 else printer.toolhead.axis_maximum.x - bed_margin_x[1] %}
{% if printer["dual_carriage"] is defined %}
{% set max_x = printer.toolhead.axis_maximum.x %}
{% endif %}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="printer.toolhead.axis_maximum.x {printer.toolhead.axis_maximum.x}"
{% set max_y = printer.toolhead.axis_maximum.y - bed_margin_y[1]%}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_x_max VALUE={max_x}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_y_max VALUE={max_y}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="Printable area calculated: X: 0,{max_x} Y: 0,{max_y}"
[gcode_macro CACHE_TOOLHEAD_SETTINGS]
variable_cache = {"global": {"accel": 1000, "ratio": 0.5, "speed": 50, "scv": 5}}
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set dummy = cache.__setitem__(key, {"accel": printer.toolhead.max_accel, "ratio": printer.toolhead.minimum_cruise_ratio, "speed": printer.toolhead.max_velocity, "scv": printer.toolhead.square_corner_velocity}) %}
SET_GCODE_VARIABLE MACRO=CACHE_TOOLHEAD_SETTINGS VARIABLE=cache VALUE="{cache | pprint | replace("\n", "") | replace("\"", "\\\"")}"
DEBUG_ECHO PREFIX="CACHE_TOOLHEAD_SETTINGS" MSG="Toolhead settings cached for {key}. {printer.toolhead.max_accel} accel, {printer.toolhead.minimum_cruise_ratio} ratio, {printer.toolhead.max_velocity} velocity, {printer.toolhead.square_corner_velocity} scv."
[gcode_macro RESTORE_TOOLHEAD_SETTINGS]
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set values = printer["gcode_macro CACHE_TOOLHEAD_SETTINGS"].cache.__getitem__(key) %}
{% if values is not defined or values == 'None' %}
{ action_raise_error("RESTORE_TOOLHEAD_SETTINGS: Toolhead settings not cached for key '" ~ key ~ "'.") }
{% endif %}
SET_VELOCITY_LIMIT ACCEL={values.accel} MINIMUM_CRUISE_RATIO={values.ratio} VELOCITY={values.speed} SQUARE_CORNER_VELOCITY={values.scv}
DEBUG_ECHO PREFIX="RESTORE_TOOLHEAD_SETTINGS" MSG="Toolhead settings restored. {values.accel} accel, {values.ratio} ratio, {values.speed} velocity, {values.scv} scv."
[gcode_macro SET_MACRO_TRAVEL_SETTINGS]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set accel = printer["gcode_macro RatOS"].macro_travel_accel %}
SET_VELOCITY_LIMIT ACCEL={accel} MINIMUM_CRUISE_RATIO=0.5 VELOCITY={speed} SQUARE_CORNER_VELOCITY={5}
DEBUG_ECHO PREFIX="SET_MACRO_TRAVEL_SETTINGS" MSG="Macro travel settings set. {accel} accel, {speed} velocity"
[gcode_macro SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% if printer["dual_carriage"] is not defined %}
SET_KINEMATIC_POSITION X={printable_x_max / 2} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
{% else %}
IDEX_SET_CENTER_KINEMATIC_POSITION
{% endif %}
[gcode_macro IDEX_SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set center_x = printable_x_max / 2 %}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x - (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x + (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
[gcode_macro VERIFY_HYBRID_INVERTED]
gcode =
{% set inverted = False %}
{% if printer.configfile.settings.ratos_hybrid_corexy is defined and printer.configfile.settings.ratos_hybrid_corexy.inverted is defined %}
{% if printer.configfile.settings.ratos_hybrid_corexy.inverted|lower == 'true' %}
{% set inverted = True %}
{% endif %}
{% endif %}
{% if inverted == False %}
{ action_emergency_stop("ratos_hybrid_corexy NOT INVERTED! Inverted hybrid core-xy bugfix not detected.") }
{% endif %}
[gcode_macro RATOS_ECHO]
gcode =
{% set prefix = "RatOS" %}
{% set debug = params.DEBUG|default(0)|int %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " | " ~ params.PREFIX %}
{% endif %}
{% set prefix = prefix ~ ":" %}
{% set msg = "" %}
{% if params.MSG is defined %}
{% set msg = params.MSG %}
{% else %}
{% set msg = "No msg parameter provided (this is a bug or unintended use)." %}
{% endif %}
{% if not debug %}
M117 {prefix} {msg}
{% endif %}
RATOS_LOG PREFIX="{prefix}" MSG="{msg}"
{% if not debug %}
RESPOND PREFIX="{prefix}" MSG="{msg}"
{% else %}
CONSOLE_ECHO TITLE="{prefix}" TYPE="debug" MSG="{msg}"
{% endif %}
[gcode_macro ENABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=True
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=prefix_filter VALUE="'{params.FILTER|default('')|lower}'"
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging enabled."
[gcode_macro DISABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=False
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging disabled."
[gcode_macro DEBUG_ECHO]
variable_enabled = False
variable_prefix_filter = ''
gcode =
{% set prefix = "DEBUG" %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " - " ~ params.PREFIX %}
{% endif %}
{% if enabled and (prefix_filter|lower == '' or prefix_filter|lower in params.PREFIX|lower) %}
RATOS_ECHO PREFIX="{prefix}" MSG="{params.MSG}" DEBUG=1
{% endif %}
[gcode_macro START_FEATURE]
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="Start {params.FEATURE} feature gcode"
{% set scv = printer.toolhead.square_corner_velocity|int|default(5) %}
{% set accel = printer.toolhead.max_accel|int|default(10000) %}
{% set ratio = printer.toolhead.minimum_cruise_ratio|float|default(0.5) %}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="scv" VALUE={scv}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="accel" VALUE={accel}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="ratio" VALUE={ratio}
_USER_START_FEATURE FEATURE="{params.FEATURE}"
[gcode_macro END_FEATURE]
variable_scv = 5
variable_accel = 10000
variable_ratio = 0.5
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="End {params.FEATURE} feature gcode"
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={scv} ACCEL={accel} MINIMUM_CRUISE_RATIO={ratio}
_USER_END_FEATURE FEATURE="{params.FEATURE}" SCV={scv} ACCEL={accel} RATIO={ratio}
[gcode_macro _ON_LAYER_CHANGE]
variable_layer_number = 0
description = INTERNAL USE ONLY. Call it from the slicers after layer change custom gcode
gcode =
{% set layer = params.LAYER|int %}
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE={layer}
SET_PRINT_STATS_INFO CURRENT_LAYER={layer}
[gcode_macro _LEARN_MORE_CALIBRATION]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/calibration" %}
{% set link_text = "RatOS Calibration Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_CHAMBER_FILTER]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter Control" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_FILAMENT]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/filaments" %}
{% set link_text = "RatOS Filament Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _CONSOLE_SAVE_CONFIG]
gcode =
M118 Click SAVE_CONFIG to save the settings to your printer.cfg.
[gcode_macro SAVE_Z_OFFSET]
gcode =
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SAVE_MULTIPLIER
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _LOAD_RATOS_SKEW_PROFILE]
gcode =
{% set ratos_skew_profile = printer["gcode_macro RatOS"].skew_profile|default("") %}
{% if ratos_skew_profile != "" %}
{% if printer.configfile.config["skew_correction %s" % ratos_skew_profile] is defined %}
SKEW_PROFILE LOAD={ratos_skew_profile}
GET_CURRENT_SKEW
{% else %}
{% set line_1 = '"Could not find skew profile %s!_N_Clearing skew correction."' % ratos_skew_profile %}
CONSOLE_ECHO TITLE="Missing skew profile!" TYPE="warning" MSG={line_1}
SET_SKEW CLEAR=1
{% endif %}
{% endif %}
[gcode_macro M601]
gcode =
PAUSE
[idle_timeout]
gcode =
{% if printer.webhooks.state|lower == 'ready' %}
{% if printer.pause_resume.is_paused|lower == 'false' %}
RATOS_ECHO PREFIX="IDLE" MSG="2 hours since last activity. Powering off heaters and motors.."
TURN_OFF_HEATERS
M84
{% endif %}
{% endif %}
timeout = 7200
[temperature_sensor raspberry_pi]
sensor_type = temperature_host
[virtual_sdcard]
path = ~/printer_data/gcodes
[display_status]
[pause_resume]
[respond]
[ratos]
[mcu]
serial = /tmp/klipper_host_mcu
[printer]
kinematics = none
max_velocity = 1
max_accel = 1
[gcode_macro PAUSE]
rename_existing = PAUSE_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
[gcode_macro RESUME]
rename_existing = RESUME_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
[gcode_macro CANCEL_PRINT]
rename_existing = CANCEL_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
=======================
mcu 'mcu': Starting connect
webhooks client 4128232904: New connection
webhooks client 4128232904: Client info {'program': 'Moonraker', 'version': 'v0.9.3-0-g71f9e67'}
Loaded MCU 'mcu' 119 commands (?-20240727_132503-fv-az659-741 / gcc: (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110 binutils: (GNU Binutils for Raspbian) 2.35.2)
MCU 'mcu' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256
Configured MCU 'mcu' (1024 moves)
Config error
Traceback (most recent call last):
File "/home/pi/klipper/klippy/klippy.py", line 135, in _connect
cb()
File "/home/pi/klipper/klippy/extras/ratos.py", line 58, in _connect
self.register_command_overrides()
File "/home/pi/klipper/klippy/extras/ratos.py", line 86, in register_command_overrides
self.register_override('TEST_RESONANCES', self.override_TEST_RESONANCES, desc=(self.desc_TEST_RESONANCES))
File "/home/pi/klipper/klippy/extras/ratos.py", line 97, in register_override
raise self.printer.config_error("Existing command '%s' not found in RatOS override" % (command,))
configparser.Error: Existing command 'TEST_RESONANCES' not found in RatOS override
Starting Klippy...
Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock']
Git version: 'v0.12.0-396-gb7233d119-dirty'
Untracked files: klippy/extras/beacon.py, klippy/extras/gcode_shell_command.py, klippy/extras/linear_movement_vibrations.py, klippy/extras/ratos.py, klippy/extras/ratos_homing.py, klippy/extras/resonance_generator.py, klippy/extras/z_offset_probe.py, klippy/kinematics/ratos_hybrid_corexy.py
Branch: master
Remote: origin
Tracked URL: https://github.com/Klipper3d/klipper.git
CPU: 4 core ?
Python: '3.9.2 (default, Mar 20 2025, 22:21:41) \n[GCC 10.2.1 20210110]'
Start printer at Sun May 25 00:06:23 2025 (1748127983.1 24.6)
===== Config file =====
[gcode_macro ECHO_T_VARS]
description = Echo Toolhead variables to the console.
gcode =
{% set t = params.T|default(0) %}
RATOS_ECHO MSG="T{t} Variables"
{% for var, value in printer["gcode_macro T%s" % t].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro ECHO_RATOS_VARS]
description = Echo RatOS variables to the console.
gcode =
{% for var, value in printer["gcode_macro RatOS"].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro RatOS]
description = RatOS variable storage macro, will echo variables to the console when run.
variable_relative_extrusion = False
variable_force_absolute_position = False
variable_preheat_extruder = True
variable_preheat_extruder_temp = 150
variable_macro_travel_speed = 150
variable_macro_travel_accel = 2000
variable_macro_z_speed = 15
variable_bed_margin_x = [0, 0]
variable_bed_margin_y = [0, 0]
variable_printable_x_min = 0
variable_printable_x_max = 0
variable_printable_y_min = 0
variable_printable_y_max = 0
variable_end_print_motors_off = True
variable_status_color_ok = "00FF00"
variable_status_color_error = "FF0000"
variable_status_color_unknown = "FFFF00"
variable_end_print_retract_filament = 10
gcode =
ECHO_RATOS_VARS
[delayed_gcode RATOS_INIT]
initial_duration = 0.1
gcode =
RATOS_ECHO MSG="Welcome to RatOS!"
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator. Use the link in the sidebar to proceed with the setup."
[delayed_gcode RATOS_LOGO]
initial_duration = 2
gcode =
HELLO_RATOS
[gcode_macro INITIAL_FRONTEND_UPDATE]
gcode =
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_error = printer["gcode_macro RatOS"].status_color_error|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_unknown}"'
{% endif %}
{% set t0_sensor = "undefined" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].filament_detected|lower == "true" %}
{% set t0_sensor = "detected" %}
{% else %}
{% set t0_sensor = "empty" %}
{% endif %}
{% else %}
{% set t0_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set t1_sensor = "undefined" %}
{% if printer["dual_carriage"] is defined and printer["filament_switch_sensor toolhead_filament_sensor_t1"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].filament_detected|lower == "true" %}
{% set t1_sensor = "detected" %}
{% else %}
{% set t1_sensor = "empty" %}
{% endif %}
{% else %}
{% set t1_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set svv = printer.save_variables.variables %}
{% if svv.t0_filament is defined and printer["gcode_macro T0"] is defined %}
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
{% if t0_sensor != "empty" %}
{% set t0_filament_type = svv.t0_filament[0]|default('')|string %}
{% set t0_filament_name = svv.t0_filament[1]|default('')|string %}
{% set t0_filament_temp = svv.t0_filament[2]|default(0)|float %}
{% if t0_filament_name != '' and t0_filament_type != '' and t0_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{t0_filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{t0_filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={t0_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
{% if svv.t1_filament is defined and printer["gcode_macro T1"] is defined %}
{% if printer["gcode_macro T1"].filament_name is defined and printer["gcode_macro T1"].filament_type is defined and printer["gcode_macro T1"].filament_temp is defined %}
{% if t1_sensor != "empty" %}
{% set t1_filament_type = svv.t1_filament[0]|default('')|string %}
{% set t1_filament_name = svv.t1_filament[1]|default('')|string %}
{% set t1_filament_temp = svv.t1_filament[2]|default(0)|float %}
{% if t1_filament_name != '' and t1_filament_type != '' and t1_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='"{t1_filament_name}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='"{t1_filament_type}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE={t1_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t1_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro CALCULATE_PRINTABLE_AREA]
gcode =
{% set bed_margin_x = printer["gcode_macro RatOS"].bed_margin_x %}
{% set bed_margin_y = printer["gcode_macro RatOS"].bed_margin_y %}
{% set tool = 0 if printer["gcode_macro T0"] is not defined or printer["gcode_macro T0"].active else 1 %}
{% set max_x = printer.toolhead.axis_maximum.x if printer["dual_carriage"] is defined and tool == 0 else printer.toolhead.axis_maximum.x - bed_margin_x[1] %}
{% if printer["dual_carriage"] is defined %}
{% set max_x = printer.toolhead.axis_maximum.x %}
{% endif %}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="printer.toolhead.axis_maximum.x {printer.toolhead.axis_maximum.x}"
{% set max_y = printer.toolhead.axis_maximum.y - bed_margin_y[1]%}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_x_max VALUE={max_x}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_y_max VALUE={max_y}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="Printable area calculated: X: 0,{max_x} Y: 0,{max_y}"
[gcode_macro CACHE_TOOLHEAD_SETTINGS]
variable_cache = {"global": {"accel": 1000, "ratio": 0.5, "speed": 50, "scv": 5}}
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set dummy = cache.__setitem__(key, {"accel": printer.toolhead.max_accel, "ratio": printer.toolhead.minimum_cruise_ratio, "speed": printer.toolhead.max_velocity, "scv": printer.toolhead.square_corner_velocity}) %}
SET_GCODE_VARIABLE MACRO=CACHE_TOOLHEAD_SETTINGS VARIABLE=cache VALUE="{cache | pprint | replace("\n", "") | replace("\"", "\\\"")}"
DEBUG_ECHO PREFIX="CACHE_TOOLHEAD_SETTINGS" MSG="Toolhead settings cached for {key}. {printer.toolhead.max_accel} accel, {printer.toolhead.minimum_cruise_ratio} ratio, {printer.toolhead.max_velocity} velocity, {printer.toolhead.square_corner_velocity} scv."
[gcode_macro RESTORE_TOOLHEAD_SETTINGS]
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set values = printer["gcode_macro CACHE_TOOLHEAD_SETTINGS"].cache.__getitem__(key) %}
{% if values is not defined or values == 'None' %}
{ action_raise_error("RESTORE_TOOLHEAD_SETTINGS: Toolhead settings not cached for key '" ~ key ~ "'.") }
{% endif %}
SET_VELOCITY_LIMIT ACCEL={values.accel} MINIMUM_CRUISE_RATIO={values.ratio} VELOCITY={values.speed} SQUARE_CORNER_VELOCITY={values.scv}
DEBUG_ECHO PREFIX="RESTORE_TOOLHEAD_SETTINGS" MSG="Toolhead settings restored. {values.accel} accel, {values.ratio} ratio, {values.speed} velocity, {values.scv} scv."
[gcode_macro SET_MACRO_TRAVEL_SETTINGS]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set accel = printer["gcode_macro RatOS"].macro_travel_accel %}
SET_VELOCITY_LIMIT ACCEL={accel} MINIMUM_CRUISE_RATIO=0.5 VELOCITY={speed} SQUARE_CORNER_VELOCITY={5}
DEBUG_ECHO PREFIX="SET_MACRO_TRAVEL_SETTINGS" MSG="Macro travel settings set. {accel} accel, {speed} velocity"
[gcode_macro SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% if printer["dual_carriage"] is not defined %}
SET_KINEMATIC_POSITION X={printable_x_max / 2} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
{% else %}
IDEX_SET_CENTER_KINEMATIC_POSITION
{% endif %}
[gcode_macro IDEX_SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set center_x = printable_x_max / 2 %}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x - (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x + (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
[gcode_macro VERIFY_HYBRID_INVERTED]
gcode =
{% set inverted = False %}
{% if printer.configfile.settings.ratos_hybrid_corexy is defined and printer.configfile.settings.ratos_hybrid_corexy.inverted is defined %}
{% if printer.configfile.settings.ratos_hybrid_corexy.inverted|lower == 'true' %}
{% set inverted = True %}
{% endif %}
{% endif %}
{% if inverted == False %}
{ action_emergency_stop("ratos_hybrid_corexy NOT INVERTED! Inverted hybrid core-xy bugfix not detected.") }
{% endif %}
[gcode_macro RATOS_ECHO]
gcode =
{% set prefix = "RatOS" %}
{% set debug = params.DEBUG|default(0)|int %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " | " ~ params.PREFIX %}
{% endif %}
{% set prefix = prefix ~ ":" %}
{% set msg = "" %}
{% if params.MSG is defined %}
{% set msg = params.MSG %}
{% else %}
{% set msg = "No msg parameter provided (this is a bug or unintended use)." %}
{% endif %}
{% if not debug %}
M117 {prefix} {msg}
{% endif %}
RATOS_LOG PREFIX="{prefix}" MSG="{msg}"
{% if not debug %}
RESPOND PREFIX="{prefix}" MSG="{msg}"
{% else %}
CONSOLE_ECHO TITLE="{prefix}" TYPE="debug" MSG="{msg}"
{% endif %}
[gcode_macro ENABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=True
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=prefix_filter VALUE="'{params.FILTER|default('')|lower}'"
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging enabled."
[gcode_macro DISABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=False
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging disabled."
[gcode_macro DEBUG_ECHO]
variable_enabled = False
variable_prefix_filter = ''
gcode =
{% set prefix = "DEBUG" %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " - " ~ params.PREFIX %}
{% endif %}
{% if enabled and (prefix_filter|lower == '' or prefix_filter|lower in params.PREFIX|lower) %}
RATOS_ECHO PREFIX="{prefix}" MSG="{params.MSG}" DEBUG=1
{% endif %}
[gcode_macro START_FEATURE]
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="Start {params.FEATURE} feature gcode"
{% set scv = printer.toolhead.square_corner_velocity|int|default(5) %}
{% set accel = printer.toolhead.max_accel|int|default(10000) %}
{% set ratio = printer.toolhead.minimum_cruise_ratio|float|default(0.5) %}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="scv" VALUE={scv}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="accel" VALUE={accel}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="ratio" VALUE={ratio}
_USER_START_FEATURE FEATURE="{params.FEATURE}"
[gcode_macro END_FEATURE]
variable_scv = 5
variable_accel = 10000
variable_ratio = 0.5
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="End {params.FEATURE} feature gcode"
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={scv} ACCEL={accel} MINIMUM_CRUISE_RATIO={ratio}
_USER_END_FEATURE FEATURE="{params.FEATURE}" SCV={scv} ACCEL={accel} RATIO={ratio}
[gcode_macro _ON_LAYER_CHANGE]
variable_layer_number = 0
description = INTERNAL USE ONLY. Call it from the slicers after layer change custom gcode
gcode =
{% set layer = params.LAYER|int %}
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE={layer}
SET_PRINT_STATS_INFO CURRENT_LAYER={layer}
[gcode_macro _LEARN_MORE_CALIBRATION]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/calibration" %}
{% set link_text = "RatOS Calibration Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_CHAMBER_FILTER]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter Control" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_FILAMENT]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/filaments" %}
{% set link_text = "RatOS Filament Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _CONSOLE_SAVE_CONFIG]
gcode =
M118 Click SAVE_CONFIG to save the settings to your printer.cfg.
[gcode_macro SAVE_Z_OFFSET]
gcode =
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SAVE_MULTIPLIER
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _LOAD_RATOS_SKEW_PROFILE]
gcode =
{% set ratos_skew_profile = printer["gcode_macro RatOS"].skew_profile|default("") %}
{% if ratos_skew_profile != "" %}
{% if printer.configfile.config["skew_correction %s" % ratos_skew_profile] is defined %}
SKEW_PROFILE LOAD={ratos_skew_profile}
GET_CURRENT_SKEW
{% else %}
{% set line_1 = '"Could not find skew profile %s!_N_Clearing skew correction."' % ratos_skew_profile %}
CONSOLE_ECHO TITLE="Missing skew profile!" TYPE="warning" MSG={line_1}
SET_SKEW CLEAR=1
{% endif %}
{% endif %}
[gcode_macro M601]
gcode =
PAUSE
[idle_timeout]
gcode =
{% if printer.webhooks.state|lower == 'ready' %}
{% if printer.pause_resume.is_paused|lower == 'false' %}
RATOS_ECHO PREFIX="IDLE" MSG="2 hours since last activity. Powering off heaters and motors.."
TURN_OFF_HEATERS
M84
{% endif %}
{% endif %}
timeout = 7200
[temperature_sensor raspberry_pi]
sensor_type = temperature_host
[virtual_sdcard]
path = ~/printer_data/gcodes
[display_status]
[pause_resume]
[respond]
[ratos]
[mcu]
serial = /tmp/klipper_host_mcu
[printer]
kinematics = none
max_velocity = 1
max_accel = 1
[gcode_macro PAUSE]
rename_existing = PAUSE_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
[gcode_macro RESUME]
rename_existing = RESUME_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
[gcode_macro CANCEL_PRINT]
rename_existing = CANCEL_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
=======================
mcu 'mcu': Starting connect
webhooks client 4125685216: New connection
webhooks client 4125685216: Client info {'program': 'Moonraker', 'version': 'v0.9.3-0-g71f9e67'}
Loaded MCU 'mcu' 119 commands (?-20240727_132503-fv-az659-741 / gcc: (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110 binutils: (GNU Binutils for Raspbian) 2.35.2)
MCU 'mcu' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256
Sending MCU 'mcu' printer configuration...
Configured MCU 'mcu' (1024 moves)
Config error
Traceback (most recent call last):
File "/home/pi/klipper/klippy/klippy.py", line 135, in _connect
cb()
File "/home/pi/klipper/klippy/extras/ratos.py", line 58, in _connect
self.register_command_overrides()
File "/home/pi/klipper/klippy/extras/ratos.py", line 86, in register_command_overrides
self.register_override('TEST_RESONANCES', self.override_TEST_RESONANCES, desc=(self.desc_TEST_RESONANCES))
File "/home/pi/klipper/klippy/extras/ratos.py", line 97, in register_override
raise self.printer.config_error("Existing command '%s' not found in RatOS override" % (command,))
configparser.Error: Existing command 'TEST_RESONANCES' not found in RatOS override
Starting Klippy...
Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock']
Git version: 'v0.12.0-396-gb7233d119-dirty'
Untracked files: klippy/extras/beacon.py, klippy/extras/gcode_shell_command.py, klippy/extras/linear_movement_vibrations.py, klippy/extras/ratos.py, klippy/extras/ratos_homing.py, klippy/extras/resonance_generator.py, klippy/extras/z_offset_probe.py, klippy/kinematics/ratos_hybrid_corexy.py
Branch: master
Remote: origin
Tracked URL: https://github.com/Klipper3d/klipper.git
CPU: 4 core ?
Python: '3.9.2 (default, Mar 20 2025, 22:21:41) \n[GCC 10.2.1 20210110]'
Start printer at Sun May 25 00:06:57 2025 (1748128017.4 58.8)
===== Config file =====
[gcode_macro ECHO_T_VARS]
description = Echo Toolhead variables to the console.
gcode =
{% set t = params.T|default(0) %}
RATOS_ECHO MSG="T{t} Variables"
{% for var, value in printer["gcode_macro T%s" % t].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro ECHO_RATOS_VARS]
description = Echo RatOS variables to the console.
gcode =
{% for var, value in printer["gcode_macro RatOS"].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro RatOS]
description = RatOS variable storage macro, will echo variables to the console when run.
variable_relative_extrusion = False
variable_force_absolute_position = False
variable_preheat_extruder = True
variable_preheat_extruder_temp = 150
variable_macro_travel_speed = 150
variable_macro_travel_accel = 2000
variable_macro_z_speed = 15
variable_bed_margin_x = [0, 0]
variable_bed_margin_y = [0, 0]
variable_printable_x_min = 0
variable_printable_x_max = 0
variable_printable_y_min = 0
variable_printable_y_max = 0
variable_end_print_motors_off = True
variable_status_color_ok = "00FF00"
variable_status_color_error = "FF0000"
variable_status_color_unknown = "FFFF00"
variable_end_print_retract_filament = 10
gcode =
ECHO_RATOS_VARS
[delayed_gcode RATOS_INIT]
initial_duration = 0.1
gcode =
RATOS_ECHO MSG="Welcome to RatOS!"
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator. Use the link in the sidebar to proceed with the setup."
[delayed_gcode RATOS_LOGO]
initial_duration = 2
gcode =
HELLO_RATOS
[gcode_macro INITIAL_FRONTEND_UPDATE]
gcode =
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_error = printer["gcode_macro RatOS"].status_color_error|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_unknown}"'
{% endif %}
{% set t0_sensor = "undefined" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].filament_detected|lower == "true" %}
{% set t0_sensor = "detected" %}
{% else %}
{% set t0_sensor = "empty" %}
{% endif %}
{% else %}
{% set t0_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set t1_sensor = "undefined" %}
{% if printer["dual_carriage"] is defined and printer["filament_switch_sensor toolhead_filament_sensor_t1"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].filament_detected|lower == "true" %}
{% set t1_sensor = "detected" %}
{% else %}
{% set t1_sensor = "empty" %}
{% endif %}
{% else %}
{% set t1_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set svv = printer.save_variables.variables %}
{% if svv.t0_filament is defined and printer["gcode_macro T0"] is defined %}
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
{% if t0_sensor != "empty" %}
{% set t0_filament_type = svv.t0_filament[0]|default('')|string %}
{% set t0_filament_name = svv.t0_filament[1]|default('')|string %}
{% set t0_filament_temp = svv.t0_filament[2]|default(0)|float %}
{% if t0_filament_name != '' and t0_filament_type != '' and t0_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{t0_filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{t0_filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={t0_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
{% if svv.t1_filament is defined and printer["gcode_macro T1"] is defined %}
{% if printer["gcode_macro T1"].filament_name is defined and printer["gcode_macro T1"].filament_type is defined and printer["gcode_macro T1"].filament_temp is defined %}
{% if t1_sensor != "empty" %}
{% set t1_filament_type = svv.t1_filament[0]|default('')|string %}
{% set t1_filament_name = svv.t1_filament[1]|default('')|string %}
{% set t1_filament_temp = svv.t1_filament[2]|default(0)|float %}
{% if t1_filament_name != '' and t1_filament_type != '' and t1_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='"{t1_filament_name}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='"{t1_filament_type}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE={t1_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t1_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro CALCULATE_PRINTABLE_AREA]
gcode =
{% set bed_margin_x = printer["gcode_macro RatOS"].bed_margin_x %}
{% set bed_margin_y = printer["gcode_macro RatOS"].bed_margin_y %}
{% set tool = 0 if printer["gcode_macro T0"] is not defined or printer["gcode_macro T0"].active else 1 %}
{% set max_x = printer.toolhead.axis_maximum.x if printer["dual_carriage"] is defined and tool == 0 else printer.toolhead.axis_maximum.x - bed_margin_x[1] %}
{% if printer["dual_carriage"] is defined %}
{% set max_x = printer.toolhead.axis_maximum.x %}
{% endif %}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="printer.toolhead.axis_maximum.x {printer.toolhead.axis_maximum.x}"
{% set max_y = printer.toolhead.axis_maximum.y - bed_margin_y[1]%}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_x_max VALUE={max_x}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_y_max VALUE={max_y}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="Printable area calculated: X: 0,{max_x} Y: 0,{max_y}"
[gcode_macro CACHE_TOOLHEAD_SETTINGS]
variable_cache = {"global": {"accel": 1000, "ratio": 0.5, "speed": 50, "scv": 5}}
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set dummy = cache.__setitem__(key, {"accel": printer.toolhead.max_accel, "ratio": printer.toolhead.minimum_cruise_ratio, "speed": printer.toolhead.max_velocity, "scv": printer.toolhead.square_corner_velocity}) %}
SET_GCODE_VARIABLE MACRO=CACHE_TOOLHEAD_SETTINGS VARIABLE=cache VALUE="{cache | pprint | replace("\n", "") | replace("\"", "\\\"")}"
DEBUG_ECHO PREFIX="CACHE_TOOLHEAD_SETTINGS" MSG="Toolhead settings cached for {key}. {printer.toolhead.max_accel} accel, {printer.toolhead.minimum_cruise_ratio} ratio, {printer.toolhead.max_velocity} velocity, {printer.toolhead.square_corner_velocity} scv."
[gcode_macro RESTORE_TOOLHEAD_SETTINGS]
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set values = printer["gcode_macro CACHE_TOOLHEAD_SETTINGS"].cache.__getitem__(key) %}
{% if values is not defined or values == 'None' %}
{ action_raise_error("RESTORE_TOOLHEAD_SETTINGS: Toolhead settings not cached for key '" ~ key ~ "'.") }
{% endif %}
SET_VELOCITY_LIMIT ACCEL={values.accel} MINIMUM_CRUISE_RATIO={values.ratio} VELOCITY={values.speed} SQUARE_CORNER_VELOCITY={values.scv}
DEBUG_ECHO PREFIX="RESTORE_TOOLHEAD_SETTINGS" MSG="Toolhead settings restored. {values.accel} accel, {values.ratio} ratio, {values.speed} velocity, {values.scv} scv."
[gcode_macro SET_MACRO_TRAVEL_SETTINGS]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set accel = printer["gcode_macro RatOS"].macro_travel_accel %}
SET_VELOCITY_LIMIT ACCEL={accel} MINIMUM_CRUISE_RATIO=0.5 VELOCITY={speed} SQUARE_CORNER_VELOCITY={5}
DEBUG_ECHO PREFIX="SET_MACRO_TRAVEL_SETTINGS" MSG="Macro travel settings set. {accel} accel, {speed} velocity"
[gcode_macro SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% if printer["dual_carriage"] is not defined %}
SET_KINEMATIC_POSITION X={printable_x_max / 2} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
{% else %}
IDEX_SET_CENTER_KINEMATIC_POSITION
{% endif %}
[gcode_macro IDEX_SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set center_x = printable_x_max / 2 %}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x - (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x + (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
[gcode_macro VERIFY_HYBRID_INVERTED]
gcode =
{% set inverted = False %}
{% if printer.configfile.settings.ratos_hybrid_corexy is defined and printer.configfile.settings.ratos_hybrid_corexy.inverted is defined %}
{% if printer.configfile.settings.ratos_hybrid_corexy.inverted|lower == 'true' %}
{% set inverted = True %}
{% endif %}
{% endif %}
{% if inverted == False %}
{ action_emergency_stop("ratos_hybrid_corexy NOT INVERTED! Inverted hybrid core-xy bugfix not detected.") }
{% endif %}
[gcode_macro RATOS_ECHO]
gcode =
{% set prefix = "RatOS" %}
{% set debug = params.DEBUG|default(0)|int %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " | " ~ params.PREFIX %}
{% endif %}
{% set prefix = prefix ~ ":" %}
{% set msg = "" %}
{% if params.MSG is defined %}
{% set msg = params.MSG %}
{% else %}
{% set msg = "No msg parameter provided (this is a bug or unintended use)." %}
{% endif %}
{% if not debug %}
M117 {prefix} {msg}
{% endif %}
RATOS_LOG PREFIX="{prefix}" MSG="{msg}"
{% if not debug %}
RESPOND PREFIX="{prefix}" MSG="{msg}"
{% else %}
CONSOLE_ECHO TITLE="{prefix}" TYPE="debug" MSG="{msg}"
{% endif %}
[gcode_macro ENABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=True
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=prefix_filter VALUE="'{params.FILTER|default('')|lower}'"
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging enabled."
[gcode_macro DISABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=False
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging disabled."
[gcode_macro DEBUG_ECHO]
variable_enabled = False
variable_prefix_filter = ''
gcode =
{% set prefix = "DEBUG" %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " - " ~ params.PREFIX %}
{% endif %}
{% if enabled and (prefix_filter|lower == '' or prefix_filter|lower in params.PREFIX|lower) %}
RATOS_ECHO PREFIX="{prefix}" MSG="{params.MSG}" DEBUG=1
{% endif %}
[gcode_macro START_FEATURE]
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="Start {params.FEATURE} feature gcode"
{% set scv = printer.toolhead.square_corner_velocity|int|default(5) %}
{% set accel = printer.toolhead.max_accel|int|default(10000) %}
{% set ratio = printer.toolhead.minimum_cruise_ratio|float|default(0.5) %}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="scv" VALUE={scv}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="accel" VALUE={accel}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="ratio" VALUE={ratio}
_USER_START_FEATURE FEATURE="{params.FEATURE}"
[gcode_macro END_FEATURE]
variable_scv = 5
variable_accel = 10000
variable_ratio = 0.5
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="End {params.FEATURE} feature gcode"
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={scv} ACCEL={accel} MINIMUM_CRUISE_RATIO={ratio}
_USER_END_FEATURE FEATURE="{params.FEATURE}" SCV={scv} ACCEL={accel} RATIO={ratio}
[gcode_macro _ON_LAYER_CHANGE]
variable_layer_number = 0
description = INTERNAL USE ONLY. Call it from the slicers after layer change custom gcode
gcode =
{% set layer = params.LAYER|int %}
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE={layer}
SET_PRINT_STATS_INFO CURRENT_LAYER={layer}
[gcode_macro _LEARN_MORE_CALIBRATION]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/calibration" %}
{% set link_text = "RatOS Calibration Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_CHAMBER_FILTER]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter Control" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_FILAMENT]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/filaments" %}
{% set link_text = "RatOS Filament Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _CONSOLE_SAVE_CONFIG]
gcode =
M118 Click SAVE_CONFIG to save the settings to your printer.cfg.
[gcode_macro SAVE_Z_OFFSET]
gcode =
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SAVE_MULTIPLIER
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _LOAD_RATOS_SKEW_PROFILE]
gcode =
{% set ratos_skew_profile = printer["gcode_macro RatOS"].skew_profile|default("") %}
{% if ratos_skew_profile != "" %}
{% if printer.configfile.config["skew_correction %s" % ratos_skew_profile] is defined %}
SKEW_PROFILE LOAD={ratos_skew_profile}
GET_CURRENT_SKEW
{% else %}
{% set line_1 = '"Could not find skew profile %s!_N_Clearing skew correction."' % ratos_skew_profile %}
CONSOLE_ECHO TITLE="Missing skew profile!" TYPE="warning" MSG={line_1}
SET_SKEW CLEAR=1
{% endif %}
{% endif %}
[gcode_macro M601]
gcode =
PAUSE
[idle_timeout]
gcode =
{% if printer.webhooks.state|lower == 'ready' %}
{% if printer.pause_resume.is_paused|lower == 'false' %}
RATOS_ECHO PREFIX="IDLE" MSG="2 hours since last activity. Powering off heaters and motors.."
TURN_OFF_HEATERS
M84
{% endif %}
{% endif %}
timeout = 7200
[temperature_sensor raspberry_pi]
sensor_type = temperature_host
[virtual_sdcard]
path = ~/printer_data/gcodes
[display_status]
[pause_resume]
[respond]
[ratos]
[mcu]
serial = /tmp/klipper_host_mcu
[printer]
kinematics = none
max_velocity = 1
max_accel = 1
[gcode_macro PAUSE]
rename_existing = PAUSE_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
[gcode_macro RESUME]
rename_existing = RESUME_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
[gcode_macro CANCEL_PRINT]
rename_existing = CANCEL_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
=======================
mcu 'mcu': Starting connect
webhooks client 4122633696: New connection
webhooks client 4122633696: Client info {'program': 'Moonraker', 'version': 'v0.9.3-0-g71f9e67'}
Loaded MCU 'mcu' 119 commands (?-20240727_132503-fv-az659-741 / gcc: (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110 binutils: (GNU Binutils for Raspbian) 2.35.2)
MCU 'mcu' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256
Configured MCU 'mcu' (1024 moves)
Config error
Traceback (most recent call last):
File "/home/pi/klipper/klippy/klippy.py", line 135, in _connect
cb()
File "/home/pi/klipper/klippy/extras/ratos.py", line 58, in _connect
self.register_command_overrides()
File "/home/pi/klipper/klippy/extras/ratos.py", line 86, in register_command_overrides
self.register_override('TEST_RESONANCES', self.override_TEST_RESONANCES, desc=(self.desc_TEST_RESONANCES))
File "/home/pi/klipper/klippy/extras/ratos.py", line 97, in register_override
raise self.printer.config_error("Existing command '%s' not found in RatOS override" % (command,))
configparser.Error: Existing command 'TEST_RESONANCES' not found in RatOS override
Starting Klippy...
Starting Klippy...
Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock']
Git version: 'v0.12.0-396-gb7233d119-dirty'
Untracked files: klippy/extras/beacon.py, klippy/extras/gcode_shell_command.py, klippy/extras/linear_movement_vibrations.py, klippy/extras/ratos.py, klippy/extras/ratos_homing.py, klippy/extras/resonance_generator.py, klippy/extras/z_offset_probe.py, klippy/kinematics/ratos_hybrid_corexy.py
Branch: master
Remote: origin
Tracked URL: https://github.com/Klipper3d/klipper.git
CPU: 4 core ?
Python: '3.9.2 (default, Mar 20 2025, 22:21:41) \n[GCC 10.2.1 20210110]'
Start printer at Sun May 25 00:07:59 2025 (1748128079.5 121.0)
===== Config file =====
[gcode_macro ECHO_T_VARS]
description = Echo Toolhead variables to the console.
gcode =
{% set t = params.T|default(0) %}
RATOS_ECHO MSG="T{t} Variables"
{% for var, value in printer["gcode_macro T%s" % t].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro ECHO_RATOS_VARS]
description = Echo RatOS variables to the console.
gcode =
{% for var, value in printer["gcode_macro RatOS"].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro RatOS]
description = RatOS variable storage macro, will echo variables to the console when run.
variable_relative_extrusion = False
variable_force_absolute_position = False
variable_preheat_extruder = True
variable_preheat_extruder_temp = 150
variable_macro_travel_speed = 150
variable_macro_travel_accel = 2000
variable_macro_z_speed = 15
variable_bed_margin_x = [0, 0]
variable_bed_margin_y = [0, 0]
variable_printable_x_min = 0
variable_printable_x_max = 0
variable_printable_y_min = 0
variable_printable_y_max = 0
variable_end_print_motors_off = True
variable_status_color_ok = "00FF00"
variable_status_color_error = "FF0000"
variable_status_color_unknown = "FFFF00"
variable_end_print_retract_filament = 10
gcode =
ECHO_RATOS_VARS
[delayed_gcode RATOS_INIT]
initial_duration = 0.1
gcode =
RATOS_ECHO MSG="Welcome to RatOS!"
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator. Use the link in the sidebar to proceed with the setup."
[delayed_gcode RATOS_LOGO]
initial_duration = 2
gcode =
HELLO_RATOS
[gcode_macro INITIAL_FRONTEND_UPDATE]
gcode =
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_error = printer["gcode_macro RatOS"].status_color_error|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_unknown}"'
{% endif %}
{% set t0_sensor = "undefined" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].filament_detected|lower == "true" %}
{% set t0_sensor = "detected" %}
{% else %}
{% set t0_sensor = "empty" %}
{% endif %}
{% else %}
{% set t0_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set t1_sensor = "undefined" %}
{% if printer["dual_carriage"] is defined and printer["filament_switch_sensor toolhead_filament_sensor_t1"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].filament_detected|lower == "true" %}
{% set t1_sensor = "detected" %}
{% else %}
{% set t1_sensor = "empty" %}
{% endif %}
{% else %}
{% set t1_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set svv = printer.save_variables.variables %}
{% if svv.t0_filament is defined and printer["gcode_macro T0"] is defined %}
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
{% if t0_sensor != "empty" %}
{% set t0_filament_type = svv.t0_filament[0]|default('')|string %}
{% set t0_filament_name = svv.t0_filament[1]|default('')|string %}
{% set t0_filament_temp = svv.t0_filament[2]|default(0)|float %}
{% if t0_filament_name != '' and t0_filament_type != '' and t0_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{t0_filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{t0_filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={t0_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
{% if svv.t1_filament is defined and printer["gcode_macro T1"] is defined %}
{% if printer["gcode_macro T1"].filament_name is defined and printer["gcode_macro T1"].filament_type is defined and printer["gcode_macro T1"].filament_temp is defined %}
{% if t1_sensor != "empty" %}
{% set t1_filament_type = svv.t1_filament[0]|default('')|string %}
{% set t1_filament_name = svv.t1_filament[1]|default('')|string %}
{% set t1_filament_temp = svv.t1_filament[2]|default(0)|float %}
{% if t1_filament_name != '' and t1_filament_type != '' and t1_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='"{t1_filament_name}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='"{t1_filament_type}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE={t1_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t1_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro CALCULATE_PRINTABLE_AREA]
gcode =
{% set bed_margin_x = printer["gcode_macro RatOS"].bed_margin_x %}
{% set bed_margin_y = printer["gcode_macro RatOS"].bed_margin_y %}
{% set tool = 0 if printer["gcode_macro T0"] is not defined or printer["gcode_macro T0"].active else 1 %}
{% set max_x = printer.toolhead.axis_maximum.x if printer["dual_carriage"] is defined and tool == 0 else printer.toolhead.axis_maximum.x - bed_margin_x[1] %}
{% if printer["dual_carriage"] is defined %}
{% set max_x = printer.toolhead.axis_maximum.x %}
{% endif %}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="printer.toolhead.axis_maximum.x {printer.toolhead.axis_maximum.x}"
{% set max_y = printer.toolhead.axis_maximum.y - bed_margin_y[1]%}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_x_max VALUE={max_x}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_y_max VALUE={max_y}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="Printable area calculated: X: 0,{max_x} Y: 0,{max_y}"
[gcode_macro CACHE_TOOLHEAD_SETTINGS]
variable_cache = {"global": {"accel": 1000, "ratio": 0.5, "speed": 50, "scv": 5}}
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set dummy = cache.__setitem__(key, {"accel": printer.toolhead.max_accel, "ratio": printer.toolhead.minimum_cruise_ratio, "speed": printer.toolhead.max_velocity, "scv": printer.toolhead.square_corner_velocity}) %}
SET_GCODE_VARIABLE MACRO=CACHE_TOOLHEAD_SETTINGS VARIABLE=cache VALUE="{cache | pprint | replace("\n", "") | replace("\"", "\\\"")}"
DEBUG_ECHO PREFIX="CACHE_TOOLHEAD_SETTINGS" MSG="Toolhead settings cached for {key}. {printer.toolhead.max_accel} accel, {printer.toolhead.minimum_cruise_ratio} ratio, {printer.toolhead.max_velocity} velocity, {printer.toolhead.square_corner_velocity} scv."
[gcode_macro RESTORE_TOOLHEAD_SETTINGS]
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set values = printer["gcode_macro CACHE_TOOLHEAD_SETTINGS"].cache.__getitem__(key) %}
{% if values is not defined or values == 'None' %}
{ action_raise_error("RESTORE_TOOLHEAD_SETTINGS: Toolhead settings not cached for key '" ~ key ~ "'.") }
{% endif %}
SET_VELOCITY_LIMIT ACCEL={values.accel} MINIMUM_CRUISE_RATIO={values.ratio} VELOCITY={values.speed} SQUARE_CORNER_VELOCITY={values.scv}
DEBUG_ECHO PREFIX="RESTORE_TOOLHEAD_SETTINGS" MSG="Toolhead settings restored. {values.accel} accel, {values.ratio} ratio, {values.speed} velocity, {values.scv} scv."
[gcode_macro SET_MACRO_TRAVEL_SETTINGS]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set accel = printer["gcode_macro RatOS"].macro_travel_accel %}
SET_VELOCITY_LIMIT ACCEL={accel} MINIMUM_CRUISE_RATIO=0.5 VELOCITY={speed} SQUARE_CORNER_VELOCITY={5}
DEBUG_ECHO PREFIX="SET_MACRO_TRAVEL_SETTINGS" MSG="Macro travel settings set. {accel} accel, {speed} velocity"
[gcode_macro SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% if printer["dual_carriage"] is not defined %}
SET_KINEMATIC_POSITION X={printable_x_max / 2} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
{% else %}
IDEX_SET_CENTER_KINEMATIC_POSITION
{% endif %}
[gcode_macro IDEX_SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set center_x = printable_x_max / 2 %}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x - (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x + (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
[gcode_macro VERIFY_HYBRID_INVERTED]
gcode =
{% set inverted = False %}
{% if printer.configfile.settings.ratos_hybrid_corexy is defined and printer.configfile.settings.ratos_hybrid_corexy.inverted is defined %}
{% if printer.configfile.settings.ratos_hybrid_corexy.inverted|lower == 'true' %}
{% set inverted = True %}
{% endif %}
{% endif %}
{% if inverted == False %}
{ action_emergency_stop("ratos_hybrid_corexy NOT INVERTED! Inverted hybrid core-xy bugfix not detected.") }
{% endif %}
[gcode_macro RATOS_ECHO]
gcode =
{% set prefix = "RatOS" %}
{% set debug = params.DEBUG|default(0)|int %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " | " ~ params.PREFIX %}
{% endif %}
{% set prefix = prefix ~ ":" %}
{% set msg = "" %}
{% if params.MSG is defined %}
{% set msg = params.MSG %}
{% else %}
{% set msg = "No msg parameter provided (this is a bug or unintended use)." %}
{% endif %}
{% if not debug %}
M117 {prefix} {msg}
{% endif %}
RATOS_LOG PREFIX="{prefix}" MSG="{msg}"
{% if not debug %}
RESPOND PREFIX="{prefix}" MSG="{msg}"
{% else %}
CONSOLE_ECHO TITLE="{prefix}" TYPE="debug" MSG="{msg}"
{% endif %}
[gcode_macro ENABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=True
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=prefix_filter VALUE="'{params.FILTER|default('')|lower}'"
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging enabled."
[gcode_macro DISABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=False
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging disabled."
[gcode_macro DEBUG_ECHO]
variable_enabled = False
variable_prefix_filter = ''
gcode =
{% set prefix = "DEBUG" %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " - " ~ params.PREFIX %}
{% endif %}
{% if enabled and (prefix_filter|lower == '' or prefix_filter|lower in params.PREFIX|lower) %}
RATOS_ECHO PREFIX="{prefix}" MSG="{params.MSG}" DEBUG=1
{% endif %}
[gcode_macro START_FEATURE]
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="Start {params.FEATURE} feature gcode"
{% set scv = printer.toolhead.square_corner_velocity|int|default(5) %}
{% set accel = printer.toolhead.max_accel|int|default(10000) %}
{% set ratio = printer.toolhead.minimum_cruise_ratio|float|default(0.5) %}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="scv" VALUE={scv}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="accel" VALUE={accel}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="ratio" VALUE={ratio}
_USER_START_FEATURE FEATURE="{params.FEATURE}"
[gcode_macro END_FEATURE]
variable_scv = 5
variable_accel = 10000
variable_ratio = 0.5
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="End {params.FEATURE} feature gcode"
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={scv} ACCEL={accel} MINIMUM_CRUISE_RATIO={ratio}
_USER_END_FEATURE FEATURE="{params.FEATURE}" SCV={scv} ACCEL={accel} RATIO={ratio}
[gcode_macro _ON_LAYER_CHANGE]
variable_layer_number = 0
description = INTERNAL USE ONLY. Call it from the slicers after layer change custom gcode
gcode =
{% set layer = params.LAYER|int %}
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE={layer}
SET_PRINT_STATS_INFO CURRENT_LAYER={layer}
[gcode_macro _LEARN_MORE_CALIBRATION]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/calibration" %}
{% set link_text = "RatOS Calibration Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_CHAMBER_FILTER]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter Control" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_FILAMENT]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/filaments" %}
{% set link_text = "RatOS Filament Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _CONSOLE_SAVE_CONFIG]
gcode =
M118 Click SAVE_CONFIG to save the settings to your printer.cfg.
[gcode_macro SAVE_Z_OFFSET]
gcode =
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SAVE_MULTIPLIER
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _LOAD_RATOS_SKEW_PROFILE]
gcode =
{% set ratos_skew_profile = printer["gcode_macro RatOS"].skew_profile|default("") %}
{% if ratos_skew_profile != "" %}
{% if printer.configfile.config["skew_correction %s" % ratos_skew_profile] is defined %}
SKEW_PROFILE LOAD={ratos_skew_profile}
GET_CURRENT_SKEW
{% else %}
{% set line_1 = '"Could not find skew profile %s!_N_Clearing skew correction."' % ratos_skew_profile %}
CONSOLE_ECHO TITLE="Missing skew profile!" TYPE="warning" MSG={line_1}
SET_SKEW CLEAR=1
{% endif %}
{% endif %}
[gcode_macro M601]
gcode =
PAUSE
[idle_timeout]
gcode =
{% if printer.webhooks.state|lower == 'ready' %}
{% if printer.pause_resume.is_paused|lower == 'false' %}
RATOS_ECHO PREFIX="IDLE" MSG="2 hours since last activity. Powering off heaters and motors.."
TURN_OFF_HEATERS
M84
{% endif %}
{% endif %}
timeout = 7200
[temperature_sensor raspberry_pi]
sensor_type = temperature_host
[virtual_sdcard]
path = ~/printer_data/gcodes
[display_status]
[pause_resume]
[respond]
[ratos]
[mcu]
serial = /tmp/klipper_host_mcu
[printer]
kinematics = none
max_velocity = 1
max_accel = 1
[gcode_macro PAUSE]
rename_existing = PAUSE_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
[gcode_macro RESUME]
rename_existing = RESUME_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
[gcode_macro CANCEL_PRINT]
rename_existing = CANCEL_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
=======================
mcu 'mcu': Starting connect
webhooks client 4126250464: New connection
webhooks client 4126250464: Client info {'program': 'Moonraker', 'version': 'v0.9.3-0-g71f9e67'}
Loaded MCU 'mcu' 119 commands (?-20240727_132503-fv-az659-741 / gcc: (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110 binutils: (GNU Binutils for Raspbian) 2.35.2)
MCU 'mcu' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256
Configured MCU 'mcu' (1024 moves)
Config error
Traceback (most recent call last):
File "/home/pi/klipper/klippy/klippy.py", line 135, in _connect
cb()
File "/home/pi/klipper/klippy/extras/ratos.py", line 58, in _connect
self.register_command_overrides()
File "/home/pi/klipper/klippy/extras/ratos.py", line 86, in register_command_overrides
self.register_override('TEST_RESONANCES', self.override_TEST_RESONANCES, desc=(self.desc_TEST_RESONANCES))
File "/home/pi/klipper/klippy/extras/ratos.py", line 97, in register_override
raise self.printer.config_error("Existing command '%s' not found in RatOS override" % (command,))
configparser.Error: Existing command 'TEST_RESONANCES' not found in RatOS override
Starting Klippy...
Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock']
Git version: 'v0.12.0-396-gb7233d119-dirty'
Untracked files: klippy/extras/beacon.py, klippy/extras/gcode_shell_command.py, klippy/extras/linear_movement_vibrations.py, klippy/extras/ratos.py, klippy/extras/ratos_homing.py, klippy/extras/resonance_generator.py, klippy/extras/z_offset_probe.py, klippy/kinematics/ratos_hybrid_corexy.py
Branch: master
Remote: origin
Tracked URL: https://github.com/Klipper3d/klipper.git
CPU: 4 core ?
Python: '3.9.2 (default, Mar 20 2025, 22:21:41) \n[GCC 10.2.1 20210110]'
Start printer at Sun May 25 00:10:11 2025 (1748128211.8 253.2)
===== Config file =====
[gcode_macro ECHO_T_VARS]
description = Echo Toolhead variables to the console.
gcode =
{% set t = params.T|default(0) %}
RATOS_ECHO MSG="T{t} Variables"
{% for var, value in printer["gcode_macro T%s" % t].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro ECHO_RATOS_VARS]
description = Echo RatOS variables to the console.
gcode =
{% for var, value in printer["gcode_macro RatOS"].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro RatOS]
description = RatOS variable storage macro, will echo variables to the console when run.
variable_relative_extrusion = False
variable_force_absolute_position = False
variable_preheat_extruder = True
variable_preheat_extruder_temp = 150
variable_macro_travel_speed = 150
variable_macro_travel_accel = 2000
variable_macro_z_speed = 15
variable_bed_margin_x = [0, 0]
variable_bed_margin_y = [0, 0]
variable_printable_x_min = 0
variable_printable_x_max = 0
variable_printable_y_min = 0
variable_printable_y_max = 0
variable_end_print_motors_off = True
variable_status_color_ok = "00FF00"
variable_status_color_error = "FF0000"
variable_status_color_unknown = "FFFF00"
variable_end_print_retract_filament = 10
gcode =
ECHO_RATOS_VARS
[delayed_gcode RATOS_INIT]
initial_duration = 0.1
gcode =
RATOS_ECHO MSG="Welcome to RatOS!"
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator. Use the link in the sidebar to proceed with the setup."
[delayed_gcode RATOS_LOGO]
initial_duration = 2
gcode =
HELLO_RATOS
[gcode_macro INITIAL_FRONTEND_UPDATE]
gcode =
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_error = printer["gcode_macro RatOS"].status_color_error|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_unknown}"'
{% endif %}
{% set t0_sensor = "undefined" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].filament_detected|lower == "true" %}
{% set t0_sensor = "detected" %}
{% else %}
{% set t0_sensor = "empty" %}
{% endif %}
{% else %}
{% set t0_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set t1_sensor = "undefined" %}
{% if printer["dual_carriage"] is defined and printer["filament_switch_sensor toolhead_filament_sensor_t1"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].filament_detected|lower == "true" %}
{% set t1_sensor = "detected" %}
{% else %}
{% set t1_sensor = "empty" %}
{% endif %}
{% else %}
{% set t1_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set svv = printer.save_variables.variables %}
{% if svv.t0_filament is defined and printer["gcode_macro T0"] is defined %}
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
{% if t0_sensor != "empty" %}
{% set t0_filament_type = svv.t0_filament[0]|default('')|string %}
{% set t0_filament_name = svv.t0_filament[1]|default('')|string %}
{% set t0_filament_temp = svv.t0_filament[2]|default(0)|float %}
{% if t0_filament_name != '' and t0_filament_type != '' and t0_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{t0_filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{t0_filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={t0_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
{% if svv.t1_filament is defined and printer["gcode_macro T1"] is defined %}
{% if printer["gcode_macro T1"].filament_name is defined and printer["gcode_macro T1"].filament_type is defined and printer["gcode_macro T1"].filament_temp is defined %}
{% if t1_sensor != "empty" %}
{% set t1_filament_type = svv.t1_filament[0]|default('')|string %}
{% set t1_filament_name = svv.t1_filament[1]|default('')|string %}
{% set t1_filament_temp = svv.t1_filament[2]|default(0)|float %}
{% if t1_filament_name != '' and t1_filament_type != '' and t1_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='"{t1_filament_name}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='"{t1_filament_type}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE={t1_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t1_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro CALCULATE_PRINTABLE_AREA]
gcode =
{% set bed_margin_x = printer["gcode_macro RatOS"].bed_margin_x %}
{% set bed_margin_y = printer["gcode_macro RatOS"].bed_margin_y %}
{% set tool = 0 if printer["gcode_macro T0"] is not defined or printer["gcode_macro T0"].active else 1 %}
{% set max_x = printer.toolhead.axis_maximum.x if printer["dual_carriage"] is defined and tool == 0 else printer.toolhead.axis_maximum.x - bed_margin_x[1] %}
{% if printer["dual_carriage"] is defined %}
{% set max_x = printer.toolhead.axis_maximum.x %}
{% endif %}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="printer.toolhead.axis_maximum.x {printer.toolhead.axis_maximum.x}"
{% set max_y = printer.toolhead.axis_maximum.y - bed_margin_y[1]%}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_x_max VALUE={max_x}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_y_max VALUE={max_y}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="Printable area calculated: X: 0,{max_x} Y: 0,{max_y}"
[gcode_macro CACHE_TOOLHEAD_SETTINGS]
variable_cache = {"global": {"accel": 1000, "ratio": 0.5, "speed": 50, "scv": 5}}
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set dummy = cache.__setitem__(key, {"accel": printer.toolhead.max_accel, "ratio": printer.toolhead.minimum_cruise_ratio, "speed": printer.toolhead.max_velocity, "scv": printer.toolhead.square_corner_velocity}) %}
SET_GCODE_VARIABLE MACRO=CACHE_TOOLHEAD_SETTINGS VARIABLE=cache VALUE="{cache | pprint | replace("\n", "") | replace("\"", "\\\"")}"
DEBUG_ECHO PREFIX="CACHE_TOOLHEAD_SETTINGS" MSG="Toolhead settings cached for {key}. {printer.toolhead.max_accel} accel, {printer.toolhead.minimum_cruise_ratio} ratio, {printer.toolhead.max_velocity} velocity, {printer.toolhead.square_corner_velocity} scv."
[gcode_macro RESTORE_TOOLHEAD_SETTINGS]
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set values = printer["gcode_macro CACHE_TOOLHEAD_SETTINGS"].cache.__getitem__(key) %}
{% if values is not defined or values == 'None' %}
{ action_raise_error("RESTORE_TOOLHEAD_SETTINGS: Toolhead settings not cached for key '" ~ key ~ "'.") }
{% endif %}
SET_VELOCITY_LIMIT ACCEL={values.accel} MINIMUM_CRUISE_RATIO={values.ratio} VELOCITY={values.speed} SQUARE_CORNER_VELOCITY={values.scv}
DEBUG_ECHO PREFIX="RESTORE_TOOLHEAD_SETTINGS" MSG="Toolhead settings restored. {values.accel} accel, {values.ratio} ratio, {values.speed} velocity, {values.scv} scv."
[gcode_macro SET_MACRO_TRAVEL_SETTINGS]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set accel = printer["gcode_macro RatOS"].macro_travel_accel %}
SET_VELOCITY_LIMIT ACCEL={accel} MINIMUM_CRUISE_RATIO=0.5 VELOCITY={speed} SQUARE_CORNER_VELOCITY={5}
DEBUG_ECHO PREFIX="SET_MACRO_TRAVEL_SETTINGS" MSG="Macro travel settings set. {accel} accel, {speed} velocity"
[gcode_macro SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% if printer["dual_carriage"] is not defined %}
SET_KINEMATIC_POSITION X={printable_x_max / 2} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
{% else %}
IDEX_SET_CENTER_KINEMATIC_POSITION
{% endif %}
[gcode_macro IDEX_SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set center_x = printable_x_max / 2 %}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x - (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x + (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
[gcode_macro VERIFY_HYBRID_INVERTED]
gcode =
{% set inverted = False %}
{% if printer.configfile.settings.ratos_hybrid_corexy is defined and printer.configfile.settings.ratos_hybrid_corexy.inverted is defined %}
{% if printer.configfile.settings.ratos_hybrid_corexy.inverted|lower == 'true' %}
{% set inverted = True %}
{% endif %}
{% endif %}
{% if inverted == False %}
{ action_emergency_stop("ratos_hybrid_corexy NOT INVERTED! Inverted hybrid core-xy bugfix not detected.") }
{% endif %}
[gcode_macro RATOS_ECHO]
gcode =
{% set prefix = "RatOS" %}
{% set debug = params.DEBUG|default(0)|int %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " | " ~ params.PREFIX %}
{% endif %}
{% set prefix = prefix ~ ":" %}
{% set msg = "" %}
{% if params.MSG is defined %}
{% set msg = params.MSG %}
{% else %}
{% set msg = "No msg parameter provided (this is a bug or unintended use)." %}
{% endif %}
{% if not debug %}
M117 {prefix} {msg}
{% endif %}
RATOS_LOG PREFIX="{prefix}" MSG="{msg}"
{% if not debug %}
RESPOND PREFIX="{prefix}" MSG="{msg}"
{% else %}
CONSOLE_ECHO TITLE="{prefix}" TYPE="debug" MSG="{msg}"
{% endif %}
[gcode_macro ENABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=True
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=prefix_filter VALUE="'{params.FILTER|default('')|lower}'"
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging enabled."
[gcode_macro DISABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=False
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging disabled."
[gcode_macro DEBUG_ECHO]
variable_enabled = False
variable_prefix_filter = ''
gcode =
{% set prefix = "DEBUG" %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " - " ~ params.PREFIX %}
{% endif %}
{% if enabled and (prefix_filter|lower == '' or prefix_filter|lower in params.PREFIX|lower) %}
RATOS_ECHO PREFIX="{prefix}" MSG="{params.MSG}" DEBUG=1
{% endif %}
[gcode_macro START_FEATURE]
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="Start {params.FEATURE} feature gcode"
{% set scv = printer.toolhead.square_corner_velocity|int|default(5) %}
{% set accel = printer.toolhead.max_accel|int|default(10000) %}
{% set ratio = printer.toolhead.minimum_cruise_ratio|float|default(0.5) %}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="scv" VALUE={scv}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="accel" VALUE={accel}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="ratio" VALUE={ratio}
_USER_START_FEATURE FEATURE="{params.FEATURE}"
[gcode_macro END_FEATURE]
variable_scv = 5
variable_accel = 10000
variable_ratio = 0.5
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="End {params.FEATURE} feature gcode"
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={scv} ACCEL={accel} MINIMUM_CRUISE_RATIO={ratio}
_USER_END_FEATURE FEATURE="{params.FEATURE}" SCV={scv} ACCEL={accel} RATIO={ratio}
[gcode_macro _ON_LAYER_CHANGE]
variable_layer_number = 0
description = INTERNAL USE ONLY. Call it from the slicers after layer change custom gcode
gcode =
{% set layer = params.LAYER|int %}
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE={layer}
SET_PRINT_STATS_INFO CURRENT_LAYER={layer}
[gcode_macro _LEARN_MORE_CALIBRATION]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/calibration" %}
{% set link_text = "RatOS Calibration Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_CHAMBER_FILTER]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter Control" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_FILAMENT]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/filaments" %}
{% set link_text = "RatOS Filament Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _CONSOLE_SAVE_CONFIG]
gcode =
M118 Click SAVE_CONFIG to save the settings to your printer.cfg.
[gcode_macro SAVE_Z_OFFSET]
gcode =
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SAVE_MULTIPLIER
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _LOAD_RATOS_SKEW_PROFILE]
gcode =
{% set ratos_skew_profile = printer["gcode_macro RatOS"].skew_profile|default("") %}
{% if ratos_skew_profile != "" %}
{% if printer.configfile.config["skew_correction %s" % ratos_skew_profile] is defined %}
SKEW_PROFILE LOAD={ratos_skew_profile}
GET_CURRENT_SKEW
{% else %}
{% set line_1 = '"Could not find skew profile %s!_N_Clearing skew correction."' % ratos_skew_profile %}
CONSOLE_ECHO TITLE="Missing skew profile!" TYPE="warning" MSG={line_1}
SET_SKEW CLEAR=1
{% endif %}
{% endif %}
[gcode_macro M601]
gcode =
PAUSE
[idle_timeout]
gcode =
{% if printer.webhooks.state|lower == 'ready' %}
{% if printer.pause_resume.is_paused|lower == 'false' %}
RATOS_ECHO PREFIX="IDLE" MSG="2 hours since last activity. Powering off heaters and motors.."
TURN_OFF_HEATERS
M84
{% endif %}
{% endif %}
timeout = 7200
[temperature_sensor raspberry_pi]
sensor_type = temperature_host
[virtual_sdcard]
path = ~/printer_data/gcodes
[display_status]
[pause_resume]
[respond]
[ratos]
[mcu]
serial = /tmp/klipper_host_mcu
[printer]
kinematics = none
max_velocity = 1
max_accel = 1
[gcode_macro PAUSE]
rename_existing = PAUSE_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
[gcode_macro RESUME]
rename_existing = RESUME_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
[gcode_macro CANCEL_PRINT]
rename_existing = CANCEL_BASE
gcode =
RATOS_ECHO MSG="Please setup your printer through the RatOS configurator at /configure"
=======================
mcu 'mcu': Starting connect
webhooks client 4128925152: New connection
webhooks client 4128925152: Client info {'program': 'Moonraker', 'version': 'v0.9.3-0-g71f9e67'}
Loaded MCU 'mcu' 119 commands (?-20240727_132503-fv-az659-741 / gcc: (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110 binutils: (GNU Binutils for Raspbian) 2.35.2)
MCU 'mcu' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256
Configured MCU 'mcu' (1024 moves)
Config error
Traceback (most recent call last):
File "/home/pi/klipper/klippy/klippy.py", line 135, in _connect
cb()
File "/home/pi/klipper/klippy/extras/ratos.py", line 58, in _connect
self.register_command_overrides()
File "/home/pi/klipper/klippy/extras/ratos.py", line 86, in register_command_overrides
self.register_override('TEST_RESONANCES', self.override_TEST_RESONANCES, desc=(self.desc_TEST_RESONANCES))
File "/home/pi/klipper/klippy/extras/ratos.py", line 97, in register_override
raise self.printer.config_error("Existing command '%s' not found in RatOS override" % (command,))
configparser.Error: Existing command 'TEST_RESONANCES' not found in RatOS override
webhooks client 4128925152: Disconnected
Restarting printer
Start printer at Sun May 25 00:13:01 2025 (1748128381.9 423.4)
===== Config file =====
[mcu rpi]
serial = /tmp/klipper_host_mcu
[board_pins btt-kraken]
aliases =
x_step_pin=PC14,
x_dir_pin=PC13,
x_enable_pin=PE6,
x_uart_pin=PD6,
x_diag_pin=PC15,
x_endstop_pin=PC15,
y_step_pin=PE5,
y_dir_pin=PE4,
y_enable_pin=PE3,
y_uart_pin=PD6,
y_diag_pin=PF0,
y_endstop_pin=PF0,
z0_step_pin=PG11,
z0_dir_pin=PD7,
z0_enable_pin=PG12,
z0_uart_pin=PA15,
z0_diag_pin=PF4,
z1_step_pin=PB4,
z1_dir_pin=PB3,
z1_enable_pin=PB5,
z1_uart_pin=PA9,
z1_diag_pin=PF10,
z2_step_pin=PG15,
z2_dir_pin=PB6,
z2_enable_pin=PG14,
z2_uart_pin=PA10,
z2_diag_pin=PC0,
z3_step_pin=PG9,
z3_dir_pin=PG10,
z3_enable_pin=PG13,
z3_uart_pin=PD2,
z3_diag_pin=PF3,
e_step_pin=PG9,
e_dir_pin=PG10,
e_enable_pin=PG13,
e_uart_pin=PD2,
e_diag_pin=PF1,
e_heater_pin=PF6,
e_sensor_pin=PB1,
stepper_spi_mosi_pin=PC8,
stepper_spi_miso_pin=PC7,
stepper_spi_sclk_pin=PC6,
adxl345_cs_pin=PE10,
bltouch_sensor_pin=PG1,
bltouch_control_pin=PE9,
probe_pin=PG1,
fan_part_cooling_pin=PA0,
fan_toolhead_cooling_pin=PA1,
fan_controller_board_pin=PA2,
heater_bed_heating_pin=PF5,
heater_bed_sensor_pin=PB0,
4p_fan_part_cooling_pin=PA6,
4p_fan_part_cooling_tach_pin=PC1,
4p_toolhead_cooling_pin=PE8,
4p_toolhead_cooling_tach_pin=PG0,
4p_controller_board_pin=PE8,
4p_controller_board_tach_pin=PG0
[mcu]
serial = /dev/RatOS/btt-kraken
[temperature_sensor Kraken]
sensor_type = temperature_mcu
[adxl345 controlboard]
cs_pin = PE10
spi_software_mosi_pin = PE14
spi_software_miso_pin = PE13
spi_software_sclk_pin = PE12
[board_pins toolboard_t0]
mcu = toolboard_t0
aliases =
e_step_pin=PB7,
e_dir_pin=PB6,
e_enable_pin=PB4,
e_uart_pin=PB5,
e_heater_pin=PA0,
e_sensor_pin=PA3,
stepper_spi_mosi_pin=null,
stepper_spi_miso_pin=null,
stepper_spi_sclk_pin=null,
adxl345_cs_pin=PA4,
bltouch_sensor_pin=PA15,
bltouch_control_pin=PB3,
probe_pin=PA15,
fan_part_cooling_pin=PA10,
fan_toolhead_cooling_pin=PA9,
fan_controller_board_pin=null,
heater_bed_heating_pin=null,
heater_bed_sensor_pin=null,
4p_fan_part_cooling_pin=null,
4p_fan_part_cooling_tach_pin=null,
4p_toolhead_cooling_pin=null,
4p_toolhead_cooling_tach_pin=null,
4p_controller_board_pin=null,
4p_controller_board_tach_pin=null
[mcu toolboard_t0]
serial = /dev/RatOS/ldo-orbitool-o2-t0
[temperature_sensor Orbitool_O2_T0]
sensor_type = temperature_mcu
sensor_mcu = toolboard_t0
[lis2dw toolboard_t0]
axes_map = x, z, y
cs_pin = toolboard_t0:PA4
spi_bus = spi1
[extruder]
max_power = 0.995
rotation_distance = 4.63
full_steps_per_rotation = 200
filament_diameter = 1.750
max_extrude_only_velocity = 60
max_extrude_only_distance = 200
nozzle_diameter = 0.5
heater_pin = toolboard_t0:PA0
sensor_type = PT1000
pullup_resistor = 2200
sensor_pin = toolboard_t0:PA3
min_extrude_temp = 170
min_temp = 0
max_temp = 285
pressure_advance = 0.05
step_pin = toolboard_t0:PB7
dir_pin = !toolboard_t0:e_dir_pin
enable_pin = !toolboard_t0:PB4
microsteps = 64
control = pid
pid_kp = 21.673
pid_ki = 1.338
pid_kd = 87.776
[adc_temperature hotend_power_scale]
temperature1 = 119
voltage1 = 1.91
temperature2 = 239
voltage2 = 3.82
[fan]
max_power = 0.995
shutdown_speed = 1.0
pin = PA6
cycle_time = 0.00004
tachometer_pin = ^PC1
tachometer_poll_interval = 0.0005
[heater_fan toolhead_cooling_fan]
max_power = 0.995
cycle_time = 0.0001
shutdown_speed = 0
pin = PA1
fan_speed = 1
heater = extruder
[output_pin O2_RUN_LED]
pin = toolboard_t0:PB8
shutdown_value = 0
value = 1
[temperature_sensor hotend_power_draw]
sensor_pin = toolboard_t0:PA2
sensor_type = hotend_power_scale
[gcode_macro RatOS]
variable_homing = "endstops"
variable_z_probe = "static"
variable_sensorless_x_current = 0.49699999999999994
variable_sensorless_y_current = 0.7242
variable_safe_home_x = "middle"
variable_safe_home_y = "middle"
variable_driver_type_x = "tmc2209"
variable_driver_type_y = "tmc2209"
variable_stowable_probe_stop_on_error = False
variable_chamber_filter_enable = True
variable_chamber_filter_speed = 0.5
variable_chamber_filter_disable_speed = 1.0
variable_chamber_filter_enable_at = "after_print_start"
variable_chamber_filter_disable_period = 300
variable_chamber_filter_disable_bed_temp = 0
variable_chamber_heater_enable = True
variable_chamber_heater_bed_temp = 115
variable_chamber_heater_preheating_temp = 150
variable_chamber_heater_heating_temp_offset = 25
variable_chamber_heater_control_external_heater = False
variable_chamber_heater_air_circulation_enable = True
variable_chamber_heater_air_circulation_fan_speed = 0.35
variable_chamber_heater_air_circulation_y_pos = 0
variable_chamber_heater_air_circulation_z_pos = 100
variable_chamber_heater_extra_fan_speed = 1.0
variable_chamber_heater_filter_fan_speed = 1.0
variable_led_status_action = 0.0,1.0,1.0
variable_led_status_success = 0.0,1.0,0.0
variable_led_status_error = 1.0,0.0,1.0
variable_led_status_on = 1.0,1.0,1.0
variable_led_status_off = 0.0,0.0,1.0
variable_led_status_standby = 0.1,0.1,0.1
variable_led_status_heating = 1.0,0.0,0.0
variable_led_status_cooling = 0.0,0.0,1.0
variable_calibrate_bed_mesh = True
variable_adaptive_mesh = True
variable_start_print_park_in = "front"
variable_start_print_park_z_height = 50
variable_end_print_park_in = "back"
variable_pause_print_park_in = "front"
variable_end_print_park_z_hop = 20
variable_nozzle_priming = "primeblob"
variable_nozzle_prime_start_x = "max"
variable_nozzle_prime_start_y = "min"
variable_nozzle_prime_direction = "auto"
variable_nozzle_prime_bridge_fan = 102
variable_probe_for_priming_result = None
variable_probe_for_priming_end_result = None
variable_probe_for_priming_result_t1 = None
variable_probe_for_priming_end_result_t1 = None
variable_probe_for_priming_disable_mesh_constraints = False
variable_adaptive_prime_offset_threshold = -1.0
variable_last_z_offset = None
variable_runout_park_in = "front"
variable_enable_unload_tip_forming = False
variable_filament_unload_length = 150
description = RatOS variable storage macro, will echo variables to the console when run.
variable_relative_extrusion = False
variable_force_absolute_position = False
variable_preheat_extruder = True
variable_preheat_extruder_temp = 150
variable_macro_travel_speed = 300
variable_macro_travel_accel = 3000
variable_macro_z_speed = 15
variable_bed_margin_x = [0, 0]
variable_bed_margin_y = [0, 0]
variable_printable_x_min = 0
variable_printable_x_max = 0
variable_printable_y_min = 0
variable_printable_y_max = 0
variable_end_print_motors_off = True
variable_status_color_ok = "00FF00"
variable_status_color_error = "FF0000"
variable_status_color_unknown = "FFFF00"
variable_end_print_retract_filament = 10
gcode =
ECHO_RATOS_VARS
variable_beacon_bed_mesh_scv = 25
variable_beacon_contact_z_homing = False
variable_beacon_contact_start_print_true_zero = True
variable_beacon_contact_wipe_before_true_zero = True
variable_beacon_contact_true_zero_temp = 150
variable_beacon_contact_prime_probing = True
variable_beacon_contact_expansion_compensation = True
variable_beacon_contact_bed_mesh = False
variable_beacon_contact_bed_mesh_samples = 2
variable_beacon_contact_z_tilt_adjust = False
variable_beacon_contact_z_tilt_adjust_samples = 2
variable_beacon_scan_compensation_enable = False
variable_beacon_scan_compensation_profile = "Contact"
variable_beacon_scan_compensation_probe_count = 15,15
variable_beacon_contact_poke_bottom_limit = -1
variable_homing_x = "sensorless"
variable_homing_y = "sensorless"
variable_x_driver_types = ["tmc5160"]
variable_x_axes = ["x"]
variable_y_driver_types = ["tmc5160"]
variable_y_axes = ["y"]
variable_z_driver_types = ["tmc5160", "tmc5160", "tmc5160", "tmc5160"]
variable_z_axes = ["z", "z1", "z2", "z3"]
[ratos_homing]
axes = xyz
z_hop = 15
z_hop_speed = 15
gcode =
_LED_ON
{% set prev_stop_on_error = printer["gcode_macro RatOS"].stowable_probe_stop_on_error %}
{% if printer["dual_carriage"] is defined %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set target_idex_mode = printer["dual_carriage"].carriage_1|lower %}
_IDEX_SINGLE
_SELECT_TOOL T={default_toolhead} TOOLSHIFT=false
{% endif %}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE=True
M400
G90
{% set X = true if params.X is defined else false %}
{% set Y = true if params.Y is defined else false %}
{% set Z = true if params.Z is defined else false %}
{% if printer["gcode_macro RatOS"].home_y_first|default(false)|lower == 'true' %}
HOME_Y X={X} Y={Y} Z={Z}
HOME_X X={X} Y={Y} Z={Z}
{% else %}
HOME_X X={X} Y={Y} Z={Z}
HOME_Y X={X} Y={Y} Z={Z}
{% endif %}
HOME_Z X={X} Y={Y} Z={Z}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE={prev_stop_on_error}
{% if printer["dual_carriage"] is defined %}
{% if target_idex_mode == "copy" %}
_IDEX_COPY
{% elif target_idex_mode == "mirror" %}
_IDEX_MIRROR
{% endif %}
{% endif %}
[gcode_macro HOME_X]
gcode =
{% set x_homed = 'x' in printer.toolhead.homed_axes %}
{% set homing = printer["gcode_macro RatOS"].homing|lower %}
{% set homing_x = printer["gcode_macro RatOS"].homing_x|lower %}
{% set homing_x = homing_x if homing_x else homing %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_X" MSG="printable_x_max: {printable_x_max}, safe_home_x: {safe_home_x}, axis_maximum.x: {printer.toolhead.axis_maximum.x}, bed_margin_x: {printer['gcode_macro RatOS'].bed_margin_x}"
{% if X or not Y and not Z %}
{% if homing_x == 'endstop' %}
G28 X
{% elif homing_x == 'sensorless' %}
{% if printer["dual_carriage"] is defined %}
{ action_emergency_stop("sensorless homing not supported on IDEX!") }
{% endif %}
HOME_X_SENSORLESS
{% else %}
{ action_emergency_stop("expected RatOS variable_homing_x to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_x, homing)) }
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set parking_position = printer["gcode_macro T%s" % (0 if default_toolhead==1 else 1)].parking_position|float %}
SET_DUAL_CARRIAGE CARRIAGE={0 if default_toolhead==1 else 1} MODE=PRIMARY
G1 X{parking_position} F{speed}
SET_DUAL_CARRIAGE CARRIAGE={default_toolhead} MODE=PRIMARY
{% endif %}
{% set x_homed = True %}
G0 X{safe_home_x} F{speed}
M400
{% endif %}
[gcode_macro HOME_Y]
gcode =
{% set y_homed = 'y' in printer.toolhead.homed_axes %}
{% set homing = printer["gcode_macro RatOS"].homing|lower %}
{% set homing_y = printer["gcode_macro RatOS"].homing_y|lower %}
{% set homing_y = homing_y if homing_y else homing %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_Y" MSG="printable_y_max: {printable_y_max}, safe_home_y: {safe_home_y}, axis_maximum.y: {printer.toolhead.axis_maximum.y}, bed_margin_y: {printer['gcode_macro RatOS'].bed_margin_y}"
{% if Y or not X and not Z %}
{% if homing_y == 'endstop' %}
G28 Y
{% elif homing_y == 'sensorless' %}
HOME_Y_SENSORLESS
{% else %}
{ action_emergency_stop("expected RatOS variable_homing_y to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_y, homing)) }
{% endif %}
{% set y_homed = True %}
G0 Y{safe_home_y} F{speed}
{% endif %}
[gcode_macro HOME_Z]
gcode =
{% set x_homed = 'x' in printer.toolhead.homed_axes %}
{% set y_homed = 'y' in printer.toolhead.homed_axes %}
{% set z_probe = printer["gcode_macro RatOS"].z_probe %}
{% set beacon_contact_z_homing = true if printer["gcode_macro RatOS"].beacon_contact_z_homing|default(false)|lower == 'true' else false %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_Z" MSG="x_homed: {x_homed}, y_homed: {y_homed}, z_probe: {z_probe}, beacon_contact_z_homing: {beacon_contact_z_homing}"
{% if Z or not Y and not X %}
RATOS_ECHO MSG="Homing Z"
{% if x_homed == False or y_homed == False %}
{ action_emergency_stop("X and Y must be homed before homing Z") }
{% else %}
{% if z_probe == "stowable" %}
DEPLOY_PROBE
_MOVE_TO_SAFE_Z_HOME
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_homing %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% else %}
G28 Z
{% endif %}
_Z_HOP
STOW_PROBE
{% else %}
_MOVE_TO_SAFE_Z_HOME
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_homing %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% else %}
G28 Z
{% endif %}
_Z_HOP
{% endif %}
{% endif %}
{% endif %}
[gcode_macro HOME_X_SENSORLESS]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="home_x_sensorless"
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
M204 S1000
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endif %}
G4 P300
G28 X
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].x_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].y_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current}
{% endif %}
G4 P300
RESTORE_TOOLHEAD_SETTINGS KEY="home_x_sensorless"
[gcode_macro HOME_Y_SENSORLESS]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="home_y_sensorless"
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
M204 S1000
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endif %}
G4 P300
G28 Y
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].x_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].y_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current}
{% endif %}
G4 P300
RESTORE_TOOLHEAD_SETTINGS KEY="home_y_sensorless"
[gcode_macro _Z_HOP]
description = Move Z axis up by Z_HOP distance at Z_HOP_SPEED. In relative mode it will move Z axis up by Z_HOP distance. In absolute mode it will move Z axis to Z_HOP distance.
gcode =
{% set z_hop = printer.configfile.config.ratos_homing.z_hop|float %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
G0 Z{z_hop} F{z_hop_speed}
[gcode_macro _MOVE_TO_SAFE_Z_HOME]
description = Move to safe home position with optional Z_HOP (pass Z_HOP=True as parameter)
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% if params.Z_HOP is defined %}
_Z_HOP
{% endif %}
DEBUG_ECHO PREFIX="_MOVE_TO_SAFE_Z_HOME" MSG="axis_maximum.x: {printer.toolhead.axis_maximum.x}, axis_maximum.y: {printer.toolhead.axis_maximum.y}, bed_margin_x: {printer['gcode_macro RatOS'].bed_margin_x}, bed_margin_y: {printer['gcode_macro RatOS'].bed_margin_y}, safe_home_x: {safe_home_x}, safe_home_y: {safe_home_y}, printable_x_max: {printable_x_max}, printable_y_max: {printable_y_max}"
G0 X{safe_home_x} Y{safe_home_y} F{speed}
[gcode_macro MAYBE_HOME]
description = Only home unhomed axis
variable_is_kinematic_position_overriden = False
gcode =
{% if printer["gcode_macro MAYBE_HOME"].is_kinematic_position_overriden|lower == 'true' %}
RATOS_ECHO MSG="SET_CENTER_KINEMATIC_POSITION has been abused. Homing all axes. Please refrain from using SET_CENTER_KINEMATIC_POSITION outside of debugging purposes."
G28
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=False
{% else %}
{% set axes = '' %}
{% set isHomed = true %}
{% set axesToHome = '' %}
{% if params.X is defined %}
{% set axes = axes ~ 'X ' %}
{% if 'x' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'X ' %}
{% endif %}
{% endif %}
{% if params.Y is defined %}
{% set axes = axes ~ 'Y ' %}
{% if 'y' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Y ' %}
{% endif %}
{% endif %}
{% if params.Z is defined %}
{% set axes = axes ~ 'Z ' %}
{% if 'z' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Z ' %}
{% endif %}
{% endif %}
{% if params.X is not defined and params.Y is not defined and params.Z is not defined %}
{% set axes = '' %}
{% if 'x' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'X ' %}
{% endif %}
{% if 'y' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Y ' %}
{% endif %}
{% if 'z' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Z ' %}
{% endif %}
{% endif %}
{% if isHomed is false %}
RATOS_ECHO MSG="Homing {axesToHome}"
G28 {axesToHome}
{% else %}
RATOS_ECHO MSG="All requested axes already homed, skipping.."
{% endif %}
{% endif %}
[gcode_macro PID_CALIBRATE_HOTEND]
description = Perform a PID calibration test for a given extruder heater.
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set temp = params.TEMP|default(220)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_HOTEND" MSG="TEMP={temp}"
{% if printer["dual_carriage"] is not defined %}
RATOS_ECHO MSG="PID calibration hotend heater T0 at {temp}°C..."
PID_CALIBRATE HEATER=extruder TARGET={temp}
_CONSOLE_SAVE_CONFIG
{% else %}
{% if toolhead==0 or toolhead==1 %}
RATOS_ECHO MSG="PID calibration hotend heater T{toolhead} at {temp}°C..."
PID_CALIBRATE HEATER=extruder{'' if toolhead==0 else toolhead} TARGET={temp}
_CONSOLE_SAVE_CONFIG
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
_LEARN_MORE_CALIBRATION
[gcode_macro PID_CALIBRATE_BED]
description = Perform a PID calibration test for the bed heater.
gcode =
{% set temp = params.TEMP|default(80)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_BED" MSG="TEMP={temp}"
RATOS_ECHO MSG="PID calibration bed heater at {temp}°C..."
PID_CALIBRATE HEATER=heater_bed TARGET={temp}
_CONSOLE_SAVE_CONFIG
_LEARN_MORE_CALIBRATION
[gcode_macro PID_CALIBRATE_CHAMBER_HEATER]
description = Perform a PID calibration test for the chamber heater.
gcode =
{% set temp = params.TEMP|default(150)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_CHAMBER_HEATER" MSG="TEMP={temp}"
{% if printer["heater_generic chamber_heater"] is defined %}
RATOS_ECHO MSG="PID calibration chamber heater at {temp}°C..."
PID_CALIBRATE HEATER=chamber_heater TARGET={temp}
_CONSOLE_SAVE_CONFIG
_LEARN_MORE_CALIBRATION
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_heater" %}
{% set link_text = "RatOS Chamber Heater" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber heater found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro INITIALIZE_PA_TUNING]
description = Start a pressure advance tuning tower.
gcode =
{% set start = params.START|default(0.0)|float %}
{% set factor = params.FACTOR|default(0.001)|float %}
{% set layer_number = printer["gcode_macro _ON_LAYER_CHANGE"].layer_number|default(0)|int %}
{% set is_printing_gcode = true if printer["gcode_macro START_PRINT"].is_printing_gcode|default(true)|lower == 'true' else false %}
{% if is_printing_gcode and layer_number < 2 %}
DEBUG_ECHO PREFIX="START_PA_TOWER" MSG="START: {start}, FACTOR: {factor}"
RATOS_ECHO MSG="Starting presssure advance tuning tower..."
TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START={start} FACTOR={factor}
{% endif %}
_LEARN_MORE_CALIBRATION
[gcode_macro CHAMBER_FILTER_ON]
gcode =
{% if printer["fan_generic filter"] is defined %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Activating chamber filter..."
_CHAMBER_FILTER_TURN_ON
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber filter found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro CHAMBER_FILTER_OFF]
gcode =
{% if printer["fan_generic filter"] is defined %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Deactivating chamber filter..."
_CHAMBER_FILTER_TURN_OFF
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber filter found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro _CHAMBER_FILTER_ON]
gcode =
{% set at = params.AT|default('')|lower %}
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set chamber_filter_enable_at = printer["gcode_macro RatOS"].chamber_filter_enable_at|default('after_print_start')|lower %}
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_ON" MSG="at: {at}, chamber_filter_enable: {chamber_filter_enable}, chamber_filter_enable_at: {chamber_filter_enable_at}, chamber_filter_speed: {chamber_filter_speed}"
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if chamber_filter_enable_at == at %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Activating chamber filter..."
_CHAMBER_FILTER_TURN_ON AT={at}
{% if chamber_filter_enable_at == "print_end" %}
_LED_CHAMBER_FILTER_ON
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _CHAMBER_FILTER_OFF]
gcode =
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set filter_disable_period = printer["gcode_macro RatOS"].chamber_filter_disable_period|default(0)|int %}
{% set filter_disable_bed_temp = printer["gcode_macro RatOS"].chamber_filter_disable_bed_temp|default(0)|int %}
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_OFF" MSG="chamber_filter_enable: {chamber_filter_enable}, filter_disable_period: {filter_disable_period}, filter_disable_bed_temp: {filter_disable_bed_temp}"
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if filter_disable_period > 0 %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Waiting {filter_disable_period} seconds before turning chamber filter off..."
UPDATE_DELAYED_GCODE ID=_CHAMBER_FILTER_OFF_TIMER DURATION={filter_disable_period}
{% endif %}
{% if filter_disable_bed_temp > 0 %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Waiting for bed temp to cool down to {filter_disable_bed_temp}°C to turn filter off..."
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM=0 MAXIMUM={filter_disable_bed_temp}
_CHAMBER_FILTER_TURN_OFF
_LED_CHAMBER_FILTER_OFF
{% endif %}
{% endif %}
[delayed_gcode _CHAMBER_FILTER_OFF_TIMER]
gcode =
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_OFF_TIMER" MSG="executed"
_CHAMBER_FILTER_TURN_OFF
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Chamber filter turned off!"
_LED_CHAMBER_FILTER_OFF
[gcode_macro _CHAMBER_FILTER_TURN_ON]
gcode =
{% set at = params.AT|default('')|lower %}
{% set chamber_filter_speed = printer["gcode_macro RatOS"].chamber_filter_speed|default(0)|float %}
{% if at == "print_end" %}
{% set chamber_filter_speed = printer["gcode_macro RatOS"].chamber_filter_disable_speed|default(0)|float %}
{% endif %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_FILTER_OFF_TIMER DURATION=0
SET_FAN_SPEED FAN=filter SPEED={chamber_filter_speed}
[gcode_macro _CHAMBER_FILTER_TURN_OFF]
gcode =
SET_FAN_SPEED FAN=filter SPEED=0
[gcode_macro _CHAMBER_FILTER_SANITY_CHECK]
gcode =
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set filter_disable_period = printer["gcode_macro RatOS"].chamber_filter_disable_period|default(0)|int %}
{% set filter_disable_bed_temp = printer["gcode_macro RatOS"].chamber_filter_disable_bed_temp|default(0)|int %}
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if filter_disable_bed_temp > 0 and filter_disable_period > 0 %}
_LEARN_MORE_CHAMBER_FILTER
{action_respond_info("Wrong chamber filter options configured! Set 'filter_disable_bed_temp' or 'filter_disable_period' variable, not both.")}
{% endif %}
{% if filter_disable_bed_temp == 0 and filter_disable_period == 0 %}
_LEARN_MORE_CHAMBER_FILTER
{action_respond_info("Wrong chamber filter options configured! Set 'filter_disable_bed_temp' or 'filter_disable_period' variable.")}
{% endif %}
{% endif %}
[gcode_macro CHAMBER_HEATER_ON]
gcode =
{% set chamber_temp = params.CHAMBER_TEMP|default(45)|int %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp} IS_FROM_START_PRINT=False
[gcode_macro CHAMBER_HEATER_OFF]
gcode =
_CHAMBER_HEATER_OFF
[gcode_macro _CHAMBER_HEATER_ON]
variable_chamber_temp = 0
gcode =
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set start_chamber_temp = params.START_CHAMBER_TEMP|default(0)|int %}
{% set is_from_start_print = true if params.IS_FROM_START_PRINT|default(True)|lower == 'true' else false %}
{% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set chamber_heater_enable = true if printer["gcode_macro RatOS"].chamber_heater_enable|default(true)|lower == 'true' else false %}
{% set chamber_heater_bed_temp = printer["gcode_macro RatOS"].chamber_heater_bed_temp|default(115)|int %}
{% set chamber_heater_preheating_temp = printer["gcode_macro RatOS"].chamber_heater_preheating_temp|default(150)|int %}
{% set chamber_heater_heating_temp_offset = printer["gcode_macro RatOS"].chamber_heater_heating_temp_offset|default(20)|int %}
{% set chamber_heater_control_external_heater = true if printer["gcode_macro RatOS"].chamber_heater_control_external_heater|default(true)|lower == 'true' else false %}
{% set chamber_heater_air_circulation_enable = true if printer["gcode_macro RatOS"].chamber_heater_air_circulation_enable|default(true)|lower == 'true' else false %}
{% set chamber_heater_air_circulation_fan_speed = printer["gcode_macro RatOS"].chamber_heater_air_circulation_fan_speed|default(0.35)|float %}
{% set chamber_heater_air_circulation_y_pos = printer["gcode_macro RatOS"].chamber_heater_air_circulation_y_pos|default(0)|float %}
{% set chamber_heater_air_circulation_z_pos = printer["gcode_macro RatOS"].chamber_heater_air_circulation_z_pos|default(100)|float %}
DEBUG_ECHO PREFIX="_CHAMBER_HEATER_ON" MSG="chamber_heater_enable: {chamber_heater_enable}, chamber_heater_preheating_temp: {chamber_heater_preheating_temp}, chamber_heater_heating_temp_offset: {chamber_heater_heating_temp_offset}, bed_temp: {bed_temp}, chamber_temp: {chamber_temp}, start_chamber_temp: {start_chamber_temp}"
{% if chamber_heater_enable and chamber_temp > 0 and chamber_heater_bed_temp > 0 %}
_LED_HEATING
RATOS_ECHO MSG="Preheating chamber to {(start_chamber_temp if start_chamber_temp > 0 else chamber_temp)}°C..."
{% set chamber_temp_sensor = "extruder" %}
{% if printer["dual_carriage"] is defined and default_toolhead == 1 %}
{% set chamber_temp_sensor = "extruder1" %}
{% endif %}
{% if printer["temperature_sensor chamber"] is defined %}
{% set chamber_temp_sensor = "temperature_sensor chamber" %}
{% endif %}
{% set current_chamber_temp = printer['%s' % chamber_temp_sensor].temperature|int %}
{% set needs_heating = current_chamber_temp < (start_chamber_temp if start_chamber_temp > 0 else chamber_temp) %}
{% if needs_heating %}
_USER_CHAMBER_HEATER_BEFORE_PREHEATING
{% endif %}
{% if needs_heating %}
{% if chamber_heater_air_circulation_enable and chamber_heater_air_circulation_fan_speed > 0 %}
{% if not is_from_start_print %}
MAYBE_HOME
{% endif %}
G0 Z{chamber_heater_air_circulation_z_pos} F{z_speed}
G0 Y{chamber_heater_air_circulation_y_pos} F{speed}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={chamber_heater_air_circulation_fan_speed if default_toolhead == 0 else 0}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={chamber_heater_air_circulation_fan_speed if default_toolhead == 1 else 0}
{% else %}
M106 S{(255 * chamber_heater_air_circulation_fan_speed)}
{% endif %}
{% else %}
{% if is_from_start_print %}
G0 Z{z} F{z_speed}
{% endif %}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=_CHAMBER_HEATER_ON VARIABLE=chamber_temp VALUE={chamber_temp}
{% if needs_heating %}
M140 S{chamber_heater_bed_temp}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={chamber_heater_preheating_temp}
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=1.0
{% endif %}
{% endif %}
{% if needs_heating %}
_CHAMBER_HEATER_EXTRA_FAN_ON
{% endif %}
{% if needs_heating %}
TEMPERATURE_WAIT SENSOR="{chamber_temp_sensor}" MINIMUM={(start_chamber_temp if start_chamber_temp > 0 else chamber_temp)}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={(chamber_temp + chamber_heater_heating_temp_offset)}
{% endif %}
{% endif %}
{% if printer["fan_generic filter"] is defined %}
{% if printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float > 0 %}
SET_FAN_SPEED FAN=filter SPEED=0
_CHAMBER_FILTER_ON AT="before_print_start"
{% endif %}
{% endif %}
{% if needs_heating %}
{% if chamber_heater_air_circulation_enable and chamber_heater_air_circulation_fan_speed > 0 %}
G28 Z
{% endif %}
{% endif %}
{% if needs_heating %}
_USER_CHAMBER_HEATER_AFTER_PREHEATING
{% endif %}
{% if printer["temperature_sensor chamber"] is defined %}
{% if printer["heater_generic chamber_heater"] is defined %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined and chamber_heater_control_external_heater %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED=0
SET_FAN_SPEED FAN=part_fan_t1 SPEED=0
{% else %}
M106 S0
{% endif %}
_LED_SUCCESS
{% endif %}
[gcode_macro _CHAMBER_HEATER_OFF]
gcode =
RATOS_ECHO MSG="Deactivating chamber heater..."
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=0
SET_GCODE_VARIABLE MACRO=_CHAMBER_HEATER_ON VARIABLE=chamber_temp VALUE=0
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=0
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=0.0
{% endif %}
_CHAMBER_HEATER_EXTRA_FAN_OFF
[delayed_gcode _CHAMBER_HEATER_CONTROL]
initial_duration = 0.
gcode =
{% set chamber_temp = printer["gcode_macro _CHAMBER_HEATER_ON"].chamber_temp|default(0)|int %}
{% set chamber_heater_heating_temp_offset = printer["gcode_macro RatOS"].chamber_heater_heating_temp_offset|default(20)|int %}
{% set current_chamber_temp = printer['temperature_sensor chamber'].temperature|int %}
{% if current_chamber_temp < chamber_temp %}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={(chamber_temp + chamber_heater_heating_temp_offset)}
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=1.0
{% endif %}
{% endif %}
{% if current_chamber_temp >= chamber_temp %}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=0
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=0.0
{% endif %}
{% endif %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
[gcode_macro _CHAMBER_HEATER_EXTRA_FAN_ON]
gcode =
{% set chamber_heater_extra_fan_speed = printer["gcode_macro RatOS"].chamber_heater_extra_fan_speed|default(0.0)|float %}
{% if printer["fan_generic chamber_heater_extra_fan"] is defined %}
{% if chamber_heater_extra_fan_speed > 0 %}
SET_FAN_SPEED FAN=chamber_heater_extra_fan SPEED={chamber_heater_extra_fan_speed}
{% endif %}
{% endif %}
[gcode_macro _CHAMBER_HEATER_EXTRA_FAN_OFF]
gcode =
{% if printer["fan_generic chamber_heater_extra_fan"] is defined %}
SET_FAN_SPEED FAN=chamber_heater_extra_fan SPEED=0
{% endif %}
[gcode_macro _USER_CHAMBER_HEATER_BEFORE_PREHEATING]
description = Will be executed before chamber preheating, only if heating is needed.
gcode =
[gcode_macro _USER_CHAMBER_HEATER_AFTER_PREHEATING]
description = Will be executed after chamber preheating, only if heating was needed.
gcode =
[gcode_macro _LED_START_PRINTING]
gcode =
_LED_ACTION
[gcode_macro _LED_START_PRINTING_ERROR]
gcode =
_LED_ERROR
[gcode_macro _LED_PRINTING]
gcode =
_LED_ON TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_PAUSE]
gcode =
_LED_ACTION
[gcode_macro _LED_CHAMBER_FILTER_ON]
gcode =
_LED_ACTION
[gcode_macro _LED_CHAMBER_FILTER_OFF]
gcode =
_LED_STANDBY
[gcode_macro _LED_LOADING_FILAMENT]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_LOADED]
gcode =
_LED_SUCCESS TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_RUNOUT]
gcode =
_LED_ERROR TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_CLOG]
gcode =
_LED_ERROR TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_UNLOADING_FILAMENT]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_UNLOADED]
gcode =
_LED_SUCCESS TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_DEACTIVATE_TOOLHEAD]
gcode =
_LED_OFF TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_TOOLHEAD_STANDBY]
gcode =
_LED_STANDBY TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_TOOLHEAD_WAKEUP]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_MOTORS_OFF]
gcode =
_LED_STANDBY
_LED_VAOC_OFF
[gcode_macro _LED_INPUT_SHAPER_START]
gcode =
_LED_ACTION
[gcode_macro _LED_INPUT_SHAPER_END]
gcode =
_LED_ON
[gcode_macro _LED_BEACON_CALIBRATION_START]
gcode =
_LED_ACTION
[gcode_macro _LED_BEACON_CALIBRATION_END]
gcode =
_LED_ON
[gcode_macro _LED_BEACON_CALIBRATION_ERROR]
gcode =
_LED_ERROR
[gcode_macro _LED_VAOC_ON]
gcode =
{% if printer['neopixel vaoc_led'] is defined %}
SET_LED LED=vaoc_led RED=1.0 GREEN=1.0 BLUE=1.0
{% endif %}
[gcode_macro _LED_VAOC_OFF]
gcode =
{% if printer['neopixel vaoc_led'] is defined %}
SET_LED LED=vaoc_led RED=0.0 GREEN=0.0 BLUE=0.0
{% endif %}
[gcode_macro _LED_ACTION]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_action %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_SUCCESS]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_success %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_HEATING]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_heating %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_COOLING]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_cooling %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_ERROR]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_error %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_ON]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_on %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_OFF]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_off %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_STANDBY]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_standby %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_SET]
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set r = params.R|default(0)|float %}
{% set g = params.G|default(0)|float %}
{% set b = params.B|default(0)|float %}
{% if toolhead >= 0 %}
{% if printer['neopixel nozzle_led_t%s' % toolhead] is defined %}
SET_LED LED={'nozzle_led_t%s' % toolhead} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% else %}
{% if printer['neopixel nozzle_led_t0'] is defined %}
SET_LED LED={'nozzle_led_t0'} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% if printer['neopixel nozzle_led_t1'] is defined %}
SET_LED LED={'nozzle_led_t1'} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% endif %}
_USER_LED_SET { rawparams }
[gcode_macro _USER_LED_SET]
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set r = params.R|default(0)|float %}
{% set g = params.G|default(0)|float %}
{% set b = params.B|default(0)|float %}
[gcode_macro LOAD_FILAMENT]
description = Loads new filament. Note: be careful with PETG, make sure you inspect the tip of your filament before loading to avoid jams.
variable_ignore_min_extrude_temp = True
gcode =
_LEARN_MORE_FILAMENT
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set filament_name = params._NAME|default('')|string %}
{% set filament_type = params._TYPE|default('')|string %}
{% if filament_name == '' or filament_type == '' %}
{% set filament_name = 'unknown' %}
{% set filament_type = 'unknown' %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
_DEFAULT_LOAD_FILAMENT TEMP={temp} NAME={filament_name} TYPE={filament_type}
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Loading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead==0 or toolhead==1 %}
_IDEX_LOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead} NAME={filament_name} TYPE={filament_type}
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
[gcode_macro _DEFAULT_LOAD_FILAMENT]
description = Load filament macro for non IDEX printers.
gcode =
{% set temp = params.TEMP|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_DEFAULT_LOAD_FILAMENT" MSG="TEMP={temp}"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
_LED_LOADING_FILAMENT TOOLHEAD=0
SAVE_GCODE_STATE NAME=load_state
{% if printer.extruder.temperature|int < temp or printer.extruder.can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating extruder to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={temp}
_LOAD_FILAMENT TOOLHEAD=0
RESTORE_GCODE_STATE NAME=load_state
{% if filament_name != '' and filament_type != '' %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('{filament_type}', '{filament_name}', {temp})"
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={temp}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
_LED_FILAMENT_LOADED TOOLHEAD=0
[gcode_macro _IDEX_LOAD_FILAMENT]
description = Load filament macro for IDEX printer.
gcode =
{% set temp = params.TEMP|int %}
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_IDEX_LOAD_FILAMENT" MSG="TEMP: {temp}, TOOLHEAD: {toolhead}"
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_LOADING_FILAMENT TOOLHEAD={toolhead}
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
{% if not printer.pause_resume.is_paused %}
{% if printer[target_extruder].temperature|int < temp or printer[target_extruder].can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating T{toolhead} to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={temp}
{% endif %}
_LOAD_FILAMENT TOOLHEAD={toolhead} TEMP={temp}
{% if filament_name != '' and filament_type != '' %}
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('{filament_type}', '{filament_name}', {temp})"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='"{filament_name}"'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='"{filament_type}"'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE={temp}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_ok}"'
_LED_FILAMENT_LOADED TOOLHEAD={toolhead}
[gcode_macro _LOAD_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT" MSG="TOOLHEAD: {toolhead}"
_MOVE_TO_LOADING_POSITION TOOLHEAD={toolhead}
_LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE TOOLHEAD={toolhead}
_LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE TOOLHEAD={toolhead}
_CLEANING_MOVE TOOLHEAD={toolhead}
[gcode_macro _LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set extruder_load_speed = printer["gcode_macro T%s" % toolhead].extruder_load_speed|float * 60 %}
{% set extruder_gear_to_cooling_position_distance = printer["gcode_macro T%s" % toolhead].extruder_gear_to_cooling_position_distance|float %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Loading filament into hotend.."
G92 E0
G0 E{extruder_gear_to_cooling_position_distance} F{extruder_load_speed}
G92 E0
M400
RATOS_ECHO MSG="Filament loaded into hotend."
[gcode_macro _LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set load_speed = printer["gcode_macro T%s" % toolhead].filament_load_speed|float * 60 %}
{% set filament_loading_nozzle_offset = printer["gcode_macro T%s" % toolhead].filament_loading_nozzle_offset|float %}
{% set cooling_position_to_nozzle_distance = printer["gcode_macro T%s" % toolhead].cooling_position_to_nozzle_distance|float %}
{% set purge_after_load = printer["gcode_macro T%s" % toolhead].purge_after_load|float %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Loading filament into nozzle... Please wait!"
G92 E0
G0 E{cooling_position_to_nozzle_distance + filament_loading_nozzle_offset} F{load_speed}
G92 E0
G4 P1000
_PURGE_FILAMENT TOOLHEAD={toolhead} E={purge_after_load}
RATOS_ECHO MSG="Filament loaded into nozzle!"
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_INSERT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_INSERT" MSG="TOOLHEAD: {toolhead}"
{% set filament_grabbing_length = printer["gcode_macro T%s" % toolhead].filament_grabbing_length|float %}
{% set filament_grabbing_speed = printer["gcode_macro T%s" % toolhead].filament_grabbing_speed|float %}
{% set resume_after_insert = true if printer["gcode_macro T%s" % toolhead].resume_after_insert|default(true)|lower == 'true' else false %}
{% set enable_insert_detection = true if printer["gcode_macro T%s" % toolhead].enable_insert_detection|default(true)|lower == 'true' else false %}
{% set current_idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% if enable_insert_detection %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_INSERT" MSG="toolhead: {toolhead}, filament_grabbing_length: {filament_grabbing_length}, filament_grabbing_speed: {filament_grabbing_speed}, current_idex_mode: {current_idex_mode}"
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Loading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
FORCE_MOVE STEPPER={'extruder%s' % ('' if toolhead == 0 else toolhead)} DISTANCE={filament_grabbing_length} VELOCITY={filament_grabbing_speed}
M400
{% if printer.pause_resume.is_paused %}
LOAD_FILAMENT TOOLHEAD={toolhead}
{% if resume_after_insert %}
RESUME
{% endif %}
{% else %}
{% if not printer.virtual_sdcard.is_active %}
LOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_INSERT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_INSERT" MSG="TOOLHEAD: {toolhead}"
[gcode_macro _PURGE_BEFORE_UNLOAD]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set purge_before_unload = printer["gcode_macro T%s" % toolhead].purge_before_unload|float %}
DEBUG_ECHO PREFIX="_PURGE_BEFORE_UNLOAD" MSG="TOOLHEAD: {toolhead}"
{% if purge_before_unload > 0 %}
G92 E0
G0 E{purge_before_unload} F300
G92 E0
M400
{% endif %}
[gcode_macro _PURGE_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set e = params.E|int %}
{% set r = params.R|default(0)|int %}
DEBUG_ECHO PREFIX="_PURGE_FILAMENT" MSG="TOOLHEAD: {toolhead}, E: {e}"
{% if e > 0 %}
G92 E0
G0 E{e} F300
G92 E0
M400
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={0.4 if toolhead == 0 else 0}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={0.4 if toolhead == 1 else 0}
{% else %}
M106 S{(255 * 0.4)}
{% endif %}
{% endif %}
G4 P3000
{% if r > 0 %}
G92 E0
G0 E-{r} F300
G92 E0
M400
{% endif %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED=0
SET_FAN_SPEED FAN=part_fan_t1 SPEED=0
{% else %}
M106 S0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _MOVE_TO_PARKING_POSITION]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_MOVE_TO_PARKING_POSITION" MSG="TOOLHEAD: {toolhead}"
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].parking_position is defined %}
{% set parking_position = printer["gcode_macro T%s" % toolhead].parking_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
G1 X{parking_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _MOVE_TO_LOADING_POSITION]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_MOVE_TO_LOADING_POSITION" MSG="TOOLHEAD: {toolhead}"
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].loading_position is defined %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% set act_t = 1 if idex_mode == 'primary' else 0 %}
{% if act_t == toolhead %}
{% set loading_position = printer["gcode_macro T%s" % toolhead].loading_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
G1 X{loading_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _CLEANING_MOVE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].parking_position is defined and printer["gcode_macro T%s" % toolhead].loading_position is defined %}
{% set loading_position = printer["gcode_macro T%s" % toolhead].loading_position|float %}
{% set parking_position = printer["gcode_macro T%s" % toolhead].parking_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
{% set cleaning_position = loading_position %}
{% if loading_position == parking_position %}
{% if loading_position > 0 %}
{% set cleaning_position = loading_position - 30 %}
{% else %}
{% set cleaning_position = loading_position + 30 %}
{% endif %}
{% endif %}
G1 X{parking_position} F{speed}
G1 X{cleaning_position} F{speed}
G1 X{parking_position} F{speed}
G1 X{cleaning_position} F{speed}
G1 X{parking_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _START_PRINT_BED_MESH]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="start_print_bed_mesh"
SET_MACRO_TRAVEL_SETTINGS
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set X=[params.X0|default(-1)|float, params.X1|default(-1)|float] %}
{% set Y=[params.Y0|default(-1)|float, params.Y1|default(-1)|float] %}
DEBUG_ECHO PREFIX="_START_PRINT_BED_MESH" MSG="idex_mode: {idex_mode}, X: {X}, Y: {Y}"
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set X=[0, printable_x_max] %}
{% endif %}
{% set beacon_bed_mesh_scv = printer["gcode_macro RatOS"].beacon_bed_mesh_scv|default(25)|int %}
{% set beacon_contact_bed_mesh_samples = printer["gcode_macro RatOS"].beacon_contact_bed_mesh_samples|default(2)|int %}
{% set beacon_contact_bed_mesh = true if printer["gcode_macro RatOS"].beacon_contact_bed_mesh|default(false)|lower == 'true' else false %}
{% if printer.configfile.settings.beacon is defined and not beacon_contact_bed_mesh %}
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={beacon_bed_mesh_scv}
{% endif %}
{% set default_profile = printer["gcode_macro RatOS"].bed_mesh_profile|default('ratos') %}
{% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %}
BED_MESH_CLEAR
{% if printer["gcode_macro RatOS"].adaptive_mesh|lower == 'true' %}
CALIBRATE_ADAPTIVE_MESH PROFILE={default_profile} X0={X[0]} X1={X[1]} Y0={Y[0]} Y1={Y[1]} T={params.T|int} BOTH_TOOLHEADS={params.BOTH_TOOLHEADS} IDEX_MODE={idex_mode}
{% else %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% endif %}
BED_MESH_PROFILE LOAD={default_profile}
{% elif printer["gcode_macro RatOS"].bed_mesh_profile is defined %}
BED_MESH_CLEAR
BED_MESH_PROFILE LOAD={printer["gcode_macro RatOS"].bed_mesh_profile}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print_bed_mesh"
[gcode_macro CALIBRATE_ADAPTIVE_MESH]
gcode =
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_bed_mesh_samples = printer["gcode_macro RatOS"].beacon_contact_bed_mesh_samples|default(2)|int %}
{% set beacon_contact_bed_mesh = true if printer["gcode_macro RatOS"].beacon_contact_bed_mesh|default(false)|lower == 'true' else false %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set default_profile = params.PROFILE %}
{% set x0 = params.X0|default(-1)|float %}
{% set y0 = params.Y0|default(-1)|float %}
{% set x1 = params.X1|default(-1)|float %}
{% set y1 = params.Y1|default(-1)|float %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Recieved coordinates X0={x0} Y0={y0} X1={x1} Y1={y1}"
{% if x0 >= x1 or y0 >= y1 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Invalid coordinates received. Please check your slicer settings. Falling back to full bed mesh."
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% else %}
{% set mesh_config = printer.configfile.config.bed_mesh %}
{% set min_x = mesh_config.mesh_min.split(",")[0]|float %}
{% set min_y = mesh_config.mesh_min.split(",")[1]|float %}
{% set max_x = mesh_config.mesh_max.split(",")[0]|float %}
{% set max_y = mesh_config.mesh_max.split(",")[1]|float %}
{% set mesh_x0 = [[x0, max_x]|min, min_x]|max %}
{% set mesh_y0 = [[y0, max_y]|min, min_y]|max %}
{% set mesh_x1 = [[x1, max_x]|min, min_x]|max %}
{% set mesh_y1 = [[y1, max_y]|min, min_y]|max %}
{% if mesh_x0 == min_x and mesh_y0 == min_y and mesh_x1 == max_x and mesh_y1 == max_y %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Print is using the full bed, falling back to full bed mesh."
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% else %}
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
DEPLOY_PROBE
{% endif %}
{% set probe_count_x = mesh_config.probe_count.split(",")[0]|int %}
{% if mesh_config.probe_count.split(",")|length == 2 %}
{% set probe_count_y = mesh_config.probe_count.split(",")[1]|int %}
{% else %}
{% set probe_count_y = mesh_config.probe_count.split(",")[0]|int %}
{% endif %}
{% set probe_x_step = (max_x - min_x) / probe_count_x %}
{% set probe_y_step = (max_y - min_y) / probe_count_y %}
{% set mesh_count_x = ([(mesh_x1 - mesh_x0) / probe_x_step, 3]|max)|int %}
{% set mesh_count_y = ([(mesh_y1 - mesh_y0) / probe_y_step, 3]|max)|int %}
{% set min_mesh_count = [mesh_count_x, mesh_count_y]|min %}
{% set max_mesh_count = [mesh_count_x, mesh_count_y]|max %}
{% set algorithm = mesh_config.algorithm %}
{% if algorithm|lower == 'lagrange' and max_mesh_count > 6 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="cannot exceed a probe_count of 6 when using lagrange interpolation. Falling back to bicubic interpolation."
{% set algorithm = 'bicubic' %}
{% endif %}
{% if algorithm|lower == 'bicubic' and min_mesh_count < 4 %}
{% if max_mesh_count > 6 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="invalid probe_count option when using bicubic interpolation. Combination of 3 points on one axis with more than 6 on another is not permitted. Forcing minimum mesh count to be 4."
{% set min_mesh_count = 4 %}
{% else %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="bicubic interpolation with a probe_count of less than 4 points detected. Forcing lagrange interpolation."
{% set algorithm = 'lagrange' %}
{% endif %}
{% endif %}
{% set mesh_count_x = ([min_mesh_count, mesh_count_x]|max)|int %}
{% set mesh_count_x = ([max_mesh_count, mesh_count_x]|min)|int %}
{% set mesh_count_y = ([min_mesh_count, mesh_count_y]|max)|int %}
{% set mesh_count_y = ([max_mesh_count, mesh_count_y]|min)|int %}
{% set should_prime = printer["gcode_macro RatOS"].nozzle_priming == 'primeblob' %}
{% if printer["dual_carriage"] is not defined %}
{% set probe_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printable_y_max) < printable_y_max / 2 %}
{% else %}
{% set probe_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printable_y_max) < printable_y_max / 2 %}
{% endif %}
{% if printer.configfile.settings.beacon is defined and printer.configfile.settings.beacon.mesh_runs % 2 != 0 and probe_first %}
{% set probe_first = false %}
{% elif printer.configfile.settings.beacon is defined and printer.configfile.settings.beacon.mesh_runs % 2 == 0 and not probe_first %}
{% set probe_first = true %}
{% endif %}
{% if should_prime and probe_first %}
{% if printer["dual_carriage"] is not defined %}
PROBE_FOR_PRIMING
{% else %}
{% if both_toolheads %}
PROBE_FOR_PRIMING TOOLHEAD=0 IDEX_MODE={idex_mode}
PROBE_FOR_PRIMING TOOLHEAD=1 IDEX_MODE={idex_mode}
{% else %}
PROBE_FOR_PRIMING TOOLHEAD={params.T|int} IDEX_MODE={idex_mode}
{% endif %}
{% endif %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="mesh coordinates X0={mesh_x0} Y0={mesh_y0} X1={mesh_x1} Y1={mesh_y1}"
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile} ALGORITHM={algorithm} MESH_MIN={mesh_x0},{mesh_y0} MESH_MAX={mesh_x1},{mesh_y1} PROBE_COUNT={mesh_count_x},{mesh_count_y} RELATIVE_REFERENCE_INDEX=-1
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile} ALGORITHM={algorithm} MESH_MIN={mesh_x0},{mesh_y0} MESH_MAX={mesh_x1},{mesh_y1} PROBE_COUNT={mesh_count_x},{mesh_count_y} RELATIVE_REFERENCE_INDEX=-1
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% if should_prime and not probe_first %}
{% if printer["dual_carriage"] is not defined %}
PROBE_FOR_PRIMING
{% else %}
{% if both_toolheads %}
PROBE_FOR_PRIMING TOOLHEAD=0 IDEX_MODE={idex_mode}
PROBE_FOR_PRIMING TOOLHEAD=1 IDEX_MODE={idex_mode}
{% else %}
PROBE_FOR_PRIMING TOOLHEAD={params.T|int} IDEX_MODE={idex_mode}
{% endif %}
{% endif %}
{% endif %}
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
STOW_PROBE
{% endif %}
{% endif %}
{% endif %}
[gcode_macro M84]
rename_existing = M84.1
gcode =
M84.1
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
{% if printer["dual_carriage"] is defined %}
_SET_TOOLHEAD_OFFSET T={printer["gcode_macro RatOS"].default_toolhead|int} MOVE=0
SET_GCODE_VARIABLE MACRO=SET_PRESSURE_ADVANCE VARIABLE=snyc_toolheads VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_REMAP_TOOLHEADS VARIABLE=enabled VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% if printer["gcode_macro _VAOC"] is defined %}
SET_GCODE_VARIABLE MACRO=_VAOC VARIABLE=is_started VALUE=False
SET_GCODE_VARIABLE MACRO=_VAOC VARIABLE=is_started_at_temp VALUE=False
{% endif %}
SET_GCODE_OFFSET X=0 Y=0 Z=0 MOVE=0
_IDEX_SINGLE INIT=1
{% endif %}
SET_SKEW CLEAR=1
_LED_MOTORS_OFF
[gcode_macro M104]
rename_existing = M104.1
gcode =
{% set s = params.S|default(0)|int %}
{% set t = params.T|default(-1)|int %}
{% set t = 0 if t == -1 else t %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
DEBUG_ECHO PREFIX="M104" MSG="s: {s}, t: {t}"
{% if printer["gcode_macro T%s" % t] is defined %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set temperature_offset_t0 = printer["gcode_macro T0"].temperature_offset|default(0)|int %}
{% set temperature_offset_t1 = printer["gcode_macro T1"].temperature_offset|default(0)|int %}
{% set s0 = [s + temperature_offset_t0, 0]|max %}
{% set s1 = [s + temperature_offset_t1, 0]|max %}
{% if temperature_offset_t0 != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset_t0}°C added to toolhead T0."
{% endif %}
{% if temperature_offset_t1 != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset_t1}°C added to toolhead T1."
{% endif %}
{% else %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set s = [s + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
{% set is_in_standby = false %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% if toolchange_standby_temp > -1 %}
{% set is_in_standby = true if printer["gcode_macro T%s" % t].standby|default(false)|lower == 'true' else false %}
{% endif %}
{% endif %}
{% if not is_in_standby %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
M104.1 S{s0} T0
M104.1 S{s1} T1
{% else %}
M104.1 S{s} T{t}
{% endif %}
{% endif %}
[gcode_macro M109]
rename_existing = M109.1
gcode =
{% set s = params.S|default(0)|int %}
{% set t = params.T|default(-1)|int %}
{% set t = 0 if t == -1 else t %}
DEBUG_ECHO PREFIX="M109" MSG="s: {s}, t: {t}"
{% if printer["gcode_macro T%s" % t] is defined %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set s = [s + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="M109" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% set is_in_standby = false %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% if toolchange_standby_temp > -1 %}
{% set is_in_standby = true if printer["gcode_macro T%s" % t].standby|default(false)|lower == 'true' else false %}
{% endif %}
{% endif %}
{% if not is_in_standby %}
M109.1 S{s} T{t}
{% endif %}
[gcode_macro SET_HEATER_TEMPERATURE]
rename_existing = SET_HEATER_TEMPERATURE_BASE
gcode =
{% set heater = params.HEATER|default("") %}
{% set target = params.TARGET|default(0)|int %}
DEBUG_ECHO PREFIX="SET_HEATER_TEMPERATURE" MSG="heater: {heater}, target: {target}"
{% if heater|lower == "extruder" or heater|lower == "extruder1" %}
{% set t = 0 if heater|lower == "extruder" else 1 %}
{% if printer["gcode_macro T%s" % t] is defined and target > 0 %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set target = [target + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="SET_HEATER_TEMPERATURE" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
SET_HEATER_TEMPERATURE_BASE HEATER="{heater}" TARGET={target}
[gcode_macro TEMPERATURE_WAIT]
rename_existing = TEMPERATURE_WAIT_BASE
gcode =
{% set sensor = params.SENSOR|default("") %}
{% set minimum = params.MINIMUM|default(-1)|int %}
{% set maximum = params.MAXIMUM|default(-1)|int %}
DEBUG_ECHO PREFIX="TEMPERATURE_WAIT" MSG="sensor: {sensor}, minimum: {minimum}, maximum: {maximum}"
{% if sensor|lower == "extruder" or sensor|lower == "extruder1" %}
{% set t = 0 if sensor|lower == "extruder" else 1 %}
{% if printer["gcode_macro T%s" % t] is defined and (minimum > 0 or maximum > 0) %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% if minimum > -1 %}
{% set minimum = [minimum + temperature_offset, 0]|max %}
{% endif %}
{% if maximum > -1 %}
{% set maximum = [maximum + temperature_offset, 0]|max %}
{% endif %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
{% if minimum > -1 and maximum > -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MINIMUM: {minimum}, MAXIMUM: {maximum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MINIMUM={minimum} MAXIMUM={maximum}
{% elif minimum > -1 and maximum == -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MINIMUM: {minimum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MINIMUM={minimum}
{% elif minimum == -1 and maximum > -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MAXIMUM: {maximum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MAXIMUM={maximum}
{% endif %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Temperature for toolhead T{t} reached."
[gcode_macro SET_GCODE_OFFSET]
rename_existing = SET_GCODE_OFFSET_ORG
gcode =
SET_GCODE_OFFSET_ORG { rawparams }
{% if printer.configfile.settings.beacon is defined and (params.Z_ADJUST is defined or params.Z is defined) %}
_BEACON_APPLY_RUNTIME_MULTIPLIER
{% endif %}
[gcode_macro SDCARD_PRINT_FILE]
rename_existing = SDCARD_PRINT_FILE_BASE
gcode =
{% if printer["ratos"] is defined %}
PROCESS_GCODE_FILE { rawparams }
{% else %}
SDCARD_PRINT_FILE_BASE { rawparams }
{% endif %}
[gcode_macro SKEW_PROFILE]
rename_existing = SKEW_PROFILE_BASE
variable_loaded_profile = ""
gcode =
{% if params.LOAD is defined %}
{% if printer.configfile.settings["skew_correction %s" % params.LOAD] is defined %}
SET_GCODE_VARIABLE MACRO=SKEW_PROFILE VARIABLE=loaded_profile VALUE='"{params.LOAD}"'
{% endif %}
{% endif %}
SKEW_PROFILE_BASE { rawparams }
[gcode_macro SET_SKEW]
rename_existing = SET_SKEW_BASE
gcode =
{% if params.CLEAR is defined %}
{% if params.CLEAR|default(0)|int == 1 %}
SET_GCODE_VARIABLE MACRO=SKEW_PROFILE VARIABLE=loaded_profile VALUE='""'
{% endif %}
{% endif %}
SET_SKEW_BASE { rawparams }
[gcode_macro SET_VELOCITY_LIMIT]
rename_existing = SET_VELOCITY_LIMIT_BASE
gcode =
{% if params.ACCEL_TO_DECEL is defined %}
{% if params.ACCEL is defined %}
{% set accel = params.ACCEL|float %}
{% else %}
{% set accel = printer.toolhead.max_accel|float %}
{% endif %}
{% if params.VELOCITY is defined %}
{% set velocity = params.VELOCITY|float %}
{% else %}
{% set velocity = printer.toolhead.max_velocity|float %}
{% endif %}
{% if params.SQUARE_CORNER_VELOCITY is defined %}
{% set scv = params.SQUARE_CORNER_VELOCITY|float %}
{% else %}
{% set scv = printer.toolhead.square_corner_velocity|float %}
{% endif %}
{% set mcr = params.ACCEL_TO_DECEL|float / accel %}
DEBUG_ECHO PREFIX="SET_VELOCITY_LIMIT" MSG="ACCEL={accel}, VELOCITY={velocity}, SQUARE_CORNER_VELOCITY={scv}, MINIMUM_CRUISE_RATIO={mcr}"
SET_VELOCITY_LIMIT_BASE ACCEL={accel} VELOCITY={velocity} SQUARE_CORNER_VELOCITY={scv} MINIMUM_CRUISE_RATIO={1-mcr}
{% else %}
SET_VELOCITY_LIMIT_BASE { rawparams }
{% endif %}
[gcode_macro _START_PRINT_PARK]
gcode =
{% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set start_print_park_in = printer["gcode_macro RatOS"].start_print_park_in %}
{% set start_print_park_x = printer["gcode_macro RatOS"].start_print_park_x %}
{% if start_print_park_in == 'primeblob' %}
{% set z = 3 %}
{% endif %}
{% if printer["dual_carriage"] is defined and not (printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
{% if printer["gcode_macro RatOS"].start_print_park_x is defined and printer["gcode_macro RatOS"].start_print_park_x != '' %}
RATOS_ECHO PREFIX="WARNING" MSG="start_print_park_x is ignored for IDEX printers"
{% endif %}
PARK_TOOLHEAD
G90
{% endif %}
_PARK LOCATION={start_print_park_in} X={start_print_park_x}
G0 Z{z} F{z_speed}
[gcode_macro _END_PRINT_PARK]
gcode =
{% if printer["dual_carriage"] is defined %}
{% if printer["gcode_macro RatOS"].end_print_park_x is defined and printer["gcode_macro RatOS"].end_print_park_x != '' %}
RATOS_ECHO PREFIX="WARNING" MSG="end_print_park_x is ignored for IDEX printers"
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
_IDEX_SINGLE X={parking_position}
PARK_TOOLHEAD
G90
{% endif %}
_PARK LOCATION={printer["gcode_macro RatOS"].end_print_park_in} X={printer["gcode_macro RatOS"].end_print_park_x}
[gcode_macro _PARK]
gcode =
{% set x = params.X %}
{% set location = params.LOCATION|default('back')|lower %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% set nozzle_priming = printer["gcode_macro RatOS"].nozzle_priming|lower %}
CACHE_TOOLHEAD_SETTINGS KEY="park"
SET_MACRO_TRAVEL_SETTINGS
{% if x != '' %}
{% if x|float >= printer.toolhead.axis_minimum.x + 5 and x|float <= printable_x_max - 5 %}
{% set park_x = x|float %}
{% else %}
{action_respond_info('The requested X co-ordinate is outside the defined axis bounds - using defaults')}
{% set park_x = printable_x_max / 2 %}
{% endif %}
{% else %}
{% set park_x = printable_x_max / 2 %}
{% endif %}
{% if location == 'back' %}
{% set park_y = printable_y_max - 15 %}
{% elif location == 'front' %}
{% set park_y = printer.toolhead.axis_minimum.y + 5 %}
{% elif location == 'center' %}
{% set park_y = printable_y_max / 2 %}
{% elif location == 'primeblob' and printer["dual_carriage"] is defined %}
{% set park_y = printable_y_max - 15 %}
{% endif %}
{% if location == 'primeblob' and printer["dual_carriage"] is not defined %}
{% if (nozzle_priming == 'primeblob' or nozzle_priming == 'primeline') %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set park_x = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set park_x = printable_x_max - 5 %}
{% else %}
{% set park_x = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set park_y = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set park_y = printable_y_max - 5 %}
{% else %}
{% set park_y = nozzle_prime_start_y|float %}
{% endif %}
{% endif %}
{% endif %}
G90
{% if printer["dual_carriage"] is not defined %}
G0 X{park_x} Y{park_y} F{speed}
{% else %}
G0 Y{park_y} F{speed}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="park"
[gcode_macro SAVE_PROBE_RESULT]
gcode =
{% set beacon_contact_prime_probing = true if printer["gcode_macro RatOS"].beacon_contact_prime_probing|default(false)|lower == 'true' else false %}
{% set last_z_offset = 9999.9 %}
{% if printer.configfile.settings.beacon is defined %}
{% set current_z = printer.toolhead.position.z|float %}
{% if beacon_contact_prime_probing %}
{% set last_z_offset = printer.beacon.last_z_result %}
{% else %}
{% set last_z_offset = printer.beacon.last_sample.dist - current_z %}
{% endif %}
{% elif printer.configfile.settings.bltouch is defined %}
{% set config_offset = printer.configfile.settings.bltouch.z_offset|float %}
{% set last_z_offset = printer.probe.last_z_result - config_offset %}
{% elif printer.configfile.settings.probe is defined %}
{% set config_offset = printer.configfile.settings.probe.z_offset|float %}
{% set last_z_offset = printer.probe.last_z_result - config_offset %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Saving offset adjustment of {last_z_offset} in {params.VARIABLE|default('last_z_offset')}"
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE={params.VARIABLE|default('last_z_offset')} VALUE={last_z_offset}
[gcode_macro PROBE_FOR_PRIMING]
gcode =
{% set probe_for_priming_disable_mesh_constraints = true if printer["gcode_macro RatOS"].probe_for_priming_disable_mesh_constraints|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].nozzle_priming|lower != 'false' %}
SAVE_GCODE_STATE NAME=probe_for_priming_state
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the prime location.."
CACHE_TOOLHEAD_SETTINGS KEY="probe_for_priming"
SET_MACRO_TRAVEL_SETTINGS
{% set t = params.TOOLHEAD|default(-1)|int %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% if idex_mode == '' %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set x_start = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set x_start = printable_x_max - 5 %}
{% else %}
{% set x_start = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% else %}
{% set y_start = nozzle_prime_start_y|float %}
{% endif %}
{% else %}
{% set center_x = printable_x_max / 2 %}
{% if t == 0 %}
{% set x_start = 5 %}
{% else %}
{% set x_start = printable_x_max - 5 %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% endif %}
{% endif %}
{% set z = printer.configfile.settings.bed_mesh.horizontal_move_z|float %}
{% set mesh_config = printer.configfile.config.bed_mesh %}
{% if printer.configfile.settings.bltouch is defined %}
{% set x_offset = printer.configfile.settings.bltouch.x_offset|float %}
{% set y_offset = printer.configfile.settings.bltouch.y_offset|float %}
{% set z_offset = printer.configfile.settings.bltouch.z_offset|float %}
{% elif printer.configfile.settings.probe is defined %}
{% set x_offset = printer.configfile.settings.probe.x_offset|float %}
{% set y_offset = printer.configfile.settings.probe.y_offset|float %}
{% set z_offset = printer.configfile.settings.probe.z_offset|float %}
{% elif printer.configfile.settings.beacon is defined %}
{% set x_offset = printer.configfile.settings.beacon.x_offset|float %}
{% set y_offset = printer.configfile.settings.beacon.y_offset|float %}
{% set z_offset = printer.configfile.settings.beacon.trigger_distance|float %}
{% else %}
{ action_raise_error("No probe, beacon or bltouch section found. Adaptive priming only works with a [probe], [beacon] or [bltouch] section defined.") }
{% endif %}
{% if z < z_offset %}
{ action_raise_error("Horizontal move Z ({z}) is below your probe's Z offset ({z_offset}). Please adjust your horizontal_move_z setting in [bed_mesh] to be above {z}.") }
{% endif %}
{% if not probe_for_priming_disable_mesh_constraints %}
{% set min_x = mesh_config.mesh_min.split(",")[0]|float - x_offset %}
{% set min_y = mesh_config.mesh_min.split(",")[1]|float - y_offset %}
{% set max_x = mesh_config.mesh_max.split(",")[0]|float - x_offset %}
{% set max_y = mesh_config.mesh_max.split(",")[1]|float - y_offset %}
{% set x_start = [[x_start, max_x]|min, min_x]|max %}
{% set y_start = [[y_start, max_y]|min, min_y]|max %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the start of the prime location at {x_start}, {y_start}"
G90
M83
G0 Z{z} F{z_speed}
G1 X{x_start} Y{y_start} F{speed}
PROBE_CURRENT_POSITION
{% if t == 1 %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result_t1
{% else %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result
{% endif %}
{% if idex_mode == '' %}
{% set x_end = x_start %}
{% set y_end = y_start + 45 %}
{% else %}
{% if t==1 %}
{% set x_end = x_start - 45 %}
{% else %}
{% set x_end = x_start + 45 %}
{% endif %}
{% set y_end = y_start %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the end of the prime location at {x_end}, {y_end}"
G1 X{x_end} Y{y_end} F{speed}
PROBE_CURRENT_POSITION
{% if t == 1 %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_end_result_t1
{% else %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_end_result
{% endif %}
RESTORE_GCODE_STATE NAME=probe_for_priming_state
RESTORE_TOOLHEAD_SETTINGS KEY="probe_for_priming"
{% endif %}
[gcode_macro RESET_PRIME_PROBE_STATE]
gcode =
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result VALUE=None
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_end_result VALUE=None
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result_t1 VALUE=None
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_end_result_t1 VALUE=None
{% endif %}
[gcode_macro PROBE_CURRENT_POSITION]
gcode =
{% set beacon_contact_prime_probing = true if printer["gcode_macro RatOS"].beacon_contact_prime_probing|default(false)|lower == 'true' else false %}
SAVE_GCODE_STATE NAME=probe_current_position_state
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
ASSERT_PROBE_DEPLOYED
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_prime_probing %}
PROBE PROBE_METHOD=contact SAMPLES=1
{% else %}
PROBE
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
BEACON_QUERY
{% else %}
RESTORE_GCODE_STATE NAME=probe_current_position_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_z_speed|float}
{% endif %}
[gcode_macro PRIME_BLOB]
description = Prints a primeblob, used internally, if configured, as part of the START_PRINT macro.
variable_x_offset = 5
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="prime_blob"
SET_MACRO_TRAVEL_SETTINGS
RATOS_ECHO PREFIX="Priming" MSG="Priming nozzle with prime blob.."
{% set current_toolhead = 0 %}
{% set target_idex_mode = '' %}
{% set extruder = 'extruder' %}
{% if printer["dual_carriage"] is defined %}
{% if params.IDEX_MODE is defined %}
{% set target_idex_mode = params.IDEX_MODE|default('')|lower %}
{% else %}
{ action_raise_error("IDEX_MODE parameter not found for PRIME_BLOB macro. This is likely a bug.") }
{% endif %}
RATOS_ECHO PREFIX="Priming" MSG="Priming in IDEX {target_idex_mode} mode.."
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set current_toolhead = 1 if current_idex_mode=='primary' else 0 %}
{% set extruder = 'extruder1' if current_toolhead == 1 else 'extruder' %}
{% endif %}
{% if target_idex_mode != "copy" or target_idex_mode != "mirror" %}
SAVE_GCODE_STATE NAME=prime_blob_state
{% endif %}
{% set first_y = printer["gcode_macro START_PRINT"].first_y|default(-1)|float %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set fan_speed = printer["gcode_macro RatOS"].nozzle_prime_bridge_fan|float %}
{% set nozzle_diameter = printer.configfile.settings[extruder].nozzle_diameter|float %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set has_start_offset_t0 = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) != 9999.9 %}
{% if printer["dual_carriage"] is defined %}
{% set has_start_offset_t1 = printer["gcode_macro RatOS"].probe_for_priming_result_t1|float(9999.9) != 9999.9 %}
{% endif %}
{% set start_print_park_in = printer["gcode_macro RatOS"].start_print_park_in %}
{% set start_print_park_z_height = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set nozzle_prime_direction = printer["gcode_macro RatOS"].nozzle_prime_direction|lower %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% set initial_toolhead = params.INITIAL_TOOLHEAD|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% if target_idex_mode == '' %}
{% set x_factor = 0 %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set x_start = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set x_start = printable_x_max - 5 %}
{% else %}
{% set x_start = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% set y_factor = 1 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% set y_factor = -1 %}
{% else %}
{% set y_start = nozzle_prime_start_y|float %}
{% if nozzle_prime_start_y|float < printable_y_max / 2 %}
{% set y_factor = 1 %}
{% else %}
{% set y_factor = -1 %}
{% endif %}
{% endif %}
{% if nozzle_prime_direction == 'forwards' %}
{% set y_factor = 1 %}
{% elif nozzle_prime_direction == 'backwards' %}
{% set y_factor = -1 %}
{% endif %}
{% if start_print_park_in == 'primeblob' %}
{% set z = 3 %}
{% else %}
{% set z = start_print_park_z_height %}
{% endif %}
{% else %}
{% set center_x = printable_x_max / 2 %}
{% set y_factor = 0 %}
{% if target_idex_mode == 'copy' or target_idex_mode == 'mirror' %}
{% set x_start = center_x / 2 + 5 %}
{% set x_factor = 1 %}
{% else %}
{% if both_toolheads and initial_toolhead != current_toolhead %}
{% if current_toolhead == 0 %}
{% set x_start = 55 %}
{% set x_factor = -1 %}
{% elif current_toolhead == 1 %}
{% set x_start = printable_x_max - 55 %}
{% set x_factor = 1 %}
{% endif %}
{% else %}
{% if current_toolhead == 0 %}
{% set x_start = 5 %}
{% set x_factor = 1 %}
{% elif current_toolhead == 1 %}
{% set x_start = printable_x_max - 5 %}
{% set x_factor = -1 %}
{% endif %}
{% endif %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_x_max - 5 %}
{% endif %}
{% set z = 10 %}
{% endif %}
{% set start_z_offset = 0 %}
{% set end_z_offset = 0 %}
{% if has_start_offset_t0 %}
{% set start_z_probe_result_t0 = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %}
{% set end_z_probe_result_t0 = printer["gcode_macro RatOS"].probe_for_priming_end_result|float(9999.9) %}
{% if printer.configfile.settings.bltouch is not defined and printer.configfile.settings.probe is not defined and printer.configfile.settings.beacon is not defined %}
{ action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe], [beacon] or [bltouch].") }
{% endif %}
{% if start_z_probe_result_t0 == 9999.9 %}
{ action_raise_error("No start probe result found for prime area. This is likely a bug.") }
{% endif %}
{% if end_z_probe_result_t0 == 9999.9 %}
{ action_raise_error("No end probe result found for prime area. This is likely a bug.") }
{% endif %}
{% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %}
{% if start_z_probe_result_t0 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (start_z_probe_result_t0) ) }
{% endif %}
{% if end_z_probe_result_t0 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (end_z_probe_result_t0) ) }
{% endif %}
{% set start_z_offset = start_z_probe_result_t0 %}
{% set end_z_offset = end_z_probe_result_t0 %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if current_toolhead == 1 or both_toolheads or target_idex_mode == "copy" or target_idex_mode == "mirror" %}
{% if has_start_offset_t1 %}
{% set start_z_probe_result_t1 = printer["gcode_macro RatOS"].probe_for_priming_result_t1|float(9999.9) %}
{% set end_z_probe_result_t1 = printer["gcode_macro RatOS"].probe_for_priming_end_result_t1|float(9999.9) %}
{% if printer.configfile.settings.bltouch is not defined and printer.configfile.settings.probe is not defined and printer.configfile.settings.beacon is not defined %}
{ action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe], [beacon] or [bltouch].") }
{% endif %}
{% if start_z_probe_result_t1 == 9999.9 %}
{ action_raise_error("No start probe result found for prime area. This is likely a bug.") }
{% endif %}
{% if end_z_probe_result_t1 == 9999.9 %}
{ action_raise_error("No end probe result found for prime area. This is likely a bug.") }
{% endif %}
{% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %}
{% if start_z_probe_result_t1 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (start_z_probe_result_t1) ) }
{% endif %}
{% if end_z_probe_result_t1 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (end_z_probe_result_t1) ) }
{% endif %}
{% set start_z_offset = [start_z_offset, start_z_probe_result_t1]|max %}
{% set end_z_offset = [end_z_offset, start_z_probe_result_t1]|max %}
{% endif %}
{% endif %}
{% if target_idex_mode != 'copy' and target_idex_mode != 'mirror' %}
{% if both_toolheads and initial_toolhead != current_toolhead %}
{% set original_start_z_offset = start_z_offset %}
{% set original_end_z_offset = end_z_offset %}
{% set start_z_offset = original_end_z_offset %}
{% set end_z_offset = original_start_z_offset %}
{% endif %}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SET_NOZZLE_TEMP_OFFSET TOOLHEAD={current_toolhead}
{% endif %}
DEBUG_ECHO PREFIX="PRIME_BLOB" MSG="x_start: {x_start}, y_start: {y_start}, x_factor: {x_factor}, y_factor: {y_factor}, z: {z}, start_z_offset: {start_z_offset}, end_z_offset: {end_z_offset}"
G90
M83
RATOS_ECHO PREFIX="Priming" MSG="Lifting Z to {z}.."
G0 Z{z} F{z_speed}
{% if printer["dual_carriage"] is not defined %}
RATOS_ECHO PREFIX="Priming" MSG="Moving to {x_start}, {y_start} along the edge of the print area.."
{% if start_print_park_in != 'primeblob' %}
G1 X{x_start} F{speed}
G1 Y{y_start + (15 * y_factor)} F{speed}
{% endif %}
{% else %}
G1 Y{y_start + (15 * y_factor)} F{speed}
{% if target_idex_mode=="copy" or target_idex_mode=="mirror" %}
RATOS_ECHO PREFIX="Priming" MSG="Mirroring move to {x_start}, {y_start} along the edge of the print area.."
_IDEX_MIRROR PRIMING=1
{% else %}
RATOS_ECHO PREFIX="Priming" MSG="Moving to {x_start}, {y_start} along the edge of the print area.."
{% endif %}
G1 X{x_start} F{speed}
{% endif %}
RATOS_ECHO PREFIX="Priming" MSG="Starting prime blob.."
G1 Z{0.5 + start_z_offset} F{z_speed}
G1 Y{y_start} F{speed}
G1 F300 E{14 / ((0.4 / nozzle_diameter) ** 2)}
G1 F300 E{14 / ((0.4 / nozzle_diameter) ** 2)}
M106 S{fan_speed}
G1 Z5 F100 E5
G92 E0
RATOS_ECHO PREFIX="Priming" MSG="Bridging with {((fan_speed/255) * 100)|int}% fan speed.."
G1 F3000 X{x_start + (15 * x_factor)} Y{y_start + (15 * y_factor)} E{1 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (20 * x_factor)} Y{y_start + (20 * y_factor)} Z{3.8 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (34 * x_factor)} Y{y_start + (34 * y_factor)} Z{2.6 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (38 * x_factor)} Y{y_start + (38 * y_factor)} Z{1.4 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (42 * x_factor)} Y{y_start + (42 * y_factor)} Z{0.2 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
M106 S0
G1 F3000 X{x_start + (46 * x_factor)} Y{y_start + (46 * y_factor)} Z{0.2 + end_z_offset} E0.6
G1 F{speed} X{x_start + (50 * x_factor)} Y{y_start + (50 * y_factor)}
{% if target_idex_mode == "copy" or target_idex_mode == "mirror" %}
G0 Z3 F{z_speed}
{% endif %}
{% if target_idex_mode == "copy" %}
{% if first_y >= 0 %}
_IDEX_COPY DANCE=0 Y={first_y}
{% else %}
_IDEX_COPY DANCE=0 Y={params.Y1}
{% endif %}
{% endif %}
{% if target_idex_mode != "copy" or target_idex_mode != "mirror" %}
RESTORE_GCODE_STATE NAME=prime_blob_state
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="prime_blob"
G92 E0
[gcode_macro UNLOAD_FILAMENT]
description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams.
variable_ignore_min_extrude_temp = True
gcode =
_LEARN_MORE_FILAMENT
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set filament_name = params._NAME|default('')|string %}
{% set filament_type = params._TYPE|default('')|string %}
{% set temp = params.TEMP|default(220)|int %}
{% if printer["dual_carriage"] is not defined %}
_DEFAULT_UNLOAD_FILAMENT TEMP={temp} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Unloading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead==0 or toolhead==1 %}
_IDEX_UNLOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
[gcode_macro _LEGACY_UNLOAD_FILAMENT]
description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams.
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set unload_speed = 5 * 60 %}
{% set unload_length = printer["gcode_macro RatOS"].filament_unload_length|float %}
M117 Unloading filament...
G0 E10 F300
G0 E-5 F3600
G4 P3000
G0 E5 F6000
G0 E-15 F6000
G0 E-{unload_length} F{unload_speed}
_CLEANING_MOVE TOOLHEAD={toolhead}
M117 Filament unloaded!
RESPOND MSG="Filament unloaded! Please inspect the tip of the filament before reloading."
[gcode_macro _DEFAULT_UNLOAD_FILAMENT]
description = Unload filament macro for non IDEX printers.
gcode =
{% set temp = params.TEMP|default(220)|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set enable_unload_tip_forming = true if printer["gcode_macro RatOS"].enable_unload_tip_forming|default(false)|lower == 'true' else false %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_DEFAULT_UNLOAD_FILAMENT" MSG="TEMP: {temp}"
_LED_UNLOADING_FILAMENT TOOLHEAD=0
SAVE_GCODE_STATE NAME=unload_state
{% if printer.extruder.temperature|int < temp or printer.extruder.can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating extruder to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={temp}
G4 P3000
{% if enable_unload_tip_forming %}
_UNLOAD_FILAMENT TOOLHEAD=0 NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_LEGACY_UNLOAD_FILAMENT TOOLHEAD=0
{% endif %}
RESTORE_GCODE_STATE NAME=unload_state
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD=0
[gcode_macro _IDEX_UNLOAD_FILAMENT]
description = Unload filament macro for IDEX printer.
gcode =
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set enable_unload_tip_forming = true if printer["gcode_macro RatOS"].enable_unload_tip_forming|default(false)|lower == 'true' else false %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_IDEX_UNLOAD_FILAMENT" MSG="TEMP: {temp}, TOOLHEAD: {toolhead}"
_LED_UNLOADING_FILAMENT TOOLHEAD={toolhead}
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
{% if not printer.pause_resume.is_paused %}
{% if printer[target_extruder].temperature|int < temp or printer[target_extruder].can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating T{toolhead} to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={temp}
{% endif %}
G4 P3000
{% if enable_unload_tip_forming %}
_UNLOAD_FILAMENT TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_LEGACY_UNLOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead}
{% endif %}
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD={toolhead}
[gcode_macro _UNLOAD_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT" MSG="TOOLHEAD: {toolhead}"
_MOVE_TO_LOADING_POSITION TOOLHEAD={toolhead}
_UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
_UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER TOOLHEAD={toolhead}
_CLEANING_MOVE TOOLHEAD={toolhead}
[gcode_macro _UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Unloading filament from nozzle to cooling zone... Please wait!"
_PURGE_BEFORE_UNLOAD TOOLHEAD={toolhead}
{% if printer["gcode_macro _UNLOAD_WITHOUT_TIP_FORMING"] is defined %}
_UNLOAD_WITHOUT_TIP_FORMING TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_UNLOAD_WITH_TIP_FORMING NAME='{filament_name}' TYPE='{filament_type}'
{% endif %}
G4 P3000
[gcode_macro _UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set extruder_load_speed = printer["gcode_macro T%s" % toolhead].extruder_load_speed|float * 60 %}
{% set extruder_gear_to_cooling_position_distance = printer["gcode_macro T%s" % toolhead].extruder_gear_to_cooling_position_distance|float %}
{% set tooolhead_sensor_to_extruder_gear_distance = printer["gcode_macro T%s" % toolhead].tooolhead_sensor_to_extruder_gear_distance|float %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER" MSG="TOOLHEAD: {toolhead}"
G0 E-{extruder_gear_to_cooling_position_distance + tooolhead_sensor_to_extruder_gear_distance + 50} F{extruder_load_speed}
RATOS_ECHO MSG="Filament unloaded! Please inspect the tip of the filament before reloading."
[gcode_macro _UNLOAD_WITH_TIP_FORMING]
gcode =
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% if filament_name != '' and filament_type != '' %}
_UNLOAD_KNOWN_FILAMENT NAME={filament_name} TYPE={filament_type}
{% else %}
_UNLOAD_UNKNOWN_FILAMENT TOOLHEAD={toolhead}
{% endif %}
[gcode_macro _UNLOAD_KNOWN_FILAMENT]
description = User overrideable tip forming macro if slicer filament profiles are known
gcode =
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
RATOS_ECHO PREFIX="FILAMENT TYPE" MSG='{filament_type}'
RATOS_ECHO PREFIX="FILAMENT PROFILE" MSG='{filament_name}'
{% if filament_name == "Prusament PETG @V-Minion" %}
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
{% elif filament_name == "Nobufil PETG @V-Minion" %}
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
{% else %}
RATOS_ECHO PREFIX="_UNLOAD_KNOWN_FILAMENT" MSG="Filament profile not found!"
_UNLOAD_UNKNOWN_FILAMENT
{% endif %}
[gcode_macro _UNLOAD_UNKNOWN_FILAMENT]
description = User overrideable standard tip forming macro
gcode =
DEBUG_ECHO PREFIX="_UNLOAD_UNKNOWN_FILAMENT" MSG="Using standard tip forming macro!"
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
[gcode_macro _TIP_FORMING]
gcode =
{% set cooling_moves = params.COOLING_MOVES|default(4)|int %}
{% set cooling_move_length = params.COOLING_MOVE_LENGTH|default(10)|float %}
{% set start_cooling_speed = params.START_COOLING_SPEED|default(10)|float * 60 %}
{% set end_cooling_speed = params.END_COOLING_SPEED|default(50)|float * 60 %}
{% if cooling_moves == 0 %}
{% set cooling_move_length = 0 %}
{% endif %}
{% set dip = true if params.DIP|default(false)|lower == "true" else false %}
{% set dip_length = params.DIP_LENGTH|default(22)|float %}
{% set dip_speed = params.DIP_SPEED|default(30)|float * 60 %}
{% set dip_retract_speed = params.DIP_RETRACT_SPEED|default(70)|float * 60 %}
{% set retract_length = params.RETRACT_LENGTH|default(18)|float %}
{% set start_retract_speed = params.START_RETRACT_SPEED|default(120)|float * 60 %}
{% set end_retract_speed = params.END_RETRACT_SPEED|default(20)|float * 60 %}
DEBUG_ECHO PREFIX="_TIP_FORMING" MSG="cooling_moves: {cooling_moves}, cooling_move_length: {cooling_move_length}, start_cooling_speed: {start_cooling_speed}, end_cooling_speed: {end_cooling_speed}, dip: {dip}, dip_length: {dip_length}, dip_speed: {dip_speed}, dip_retract_speed: {dip_retract_speed}, retract_length: {retract_length}, start_retract_speed: {start_retract_speed}, end_retract_speed: {end_retract_speed}"
M220 S100
G92 E0
{% set retract = retract_length + cooling_move_length / 2 - 15 %}
G1 E-15 F{start_retract_speed}
G1 E-{0.7 * retract} F{1.0 * end_retract_speed}
G1 E-{0.2 * retract} F{0.5 * end_retract_speed}
G1 E-{0.1 * retract} F{0.3 * end_retract_speed}
G92 E0
{% if cooling_moves > 0 %}
{% set i = (end_cooling_speed - start_cooling_speed) / (2 * cooling_moves - 1) %}
{% for m in range(cooling_moves) %}
G1 E{cooling_move_length} F{(start_cooling_speed + i * m * 2)}
G1 E-{cooling_move_length} F{(start_cooling_speed + i * (m * 2 + 1))}
{% endfor %}
{% endif %}
G92 E0
{% if dip %}
G1 E{dip_length} F{dip_speed}
G4 P100
G1 E-{dip_length} F{dip_retract_speed}
{% endif %}
G92 E0
M400
[gcode_macro _ON_FILAMENT_SENSOR_BUTTON_PRESSED]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_FILAMENT_SENSOR_BUTTON_PRESSED" MSG="TOOLHEAD: {toolhead}"
{% if not printer.virtual_sdcard.is_active %}
UNLOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_RUNOUT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_runout_detection = true if printer["gcode_macro T%s" % toolhead].enable_runout_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_RUNOUT" MSG="TOOLHEAD: {toolhead}"
{% if enable_runout_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=false
{% endif %}
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_CLOG]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_clog_detection = true if printer["gcode_macro T%s" % toolhead].enable_clog_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_CLOG" MSG="TOOLHEAD: {toolhead}"
{% if enable_clog_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=true
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_RUNOUT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_runout_detection = true if printer["gcode_macro T%s" % toolhead].enable_runout_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_RUNOUT" MSG="TOOLHEAD: {toolhead}"
{% if enable_runout_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=false
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_CLOG]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_clog_detection = true if printer["gcode_macro T%s" % toolhead].enable_clog_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_CLOG" MSG="TOOLHEAD: {toolhead}"
{% if enable_clog_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=true
{% endif %}
[gcode_macro _ON_FILAMENT_END]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set clogged = true if params.CLOGGED|default(false)|lower == 'true' else false %}
{% set unload_after_runout = printer["gcode_macro T%s" % toolhead].unload_after_runout|float %}
{% if clogged %}
_LED_FILAMENT_CLOG TOOLHEAD={toolhead}
{% else %}
_LED_FILAMENT_RUNOUT TOOLHEAD={toolhead}
{% endif %}
DEBUG_ECHO PREFIX="_ON_FILAMENT_END" MSG="TOOLHEAD: {toolhead}"
{% if printer.virtual_sdcard.is_active %}
{% if not printer.pause_resume.is_paused %}
PAUSE RUNOUT=True
{% endif %}
{% if not clogged and unload_after_runout %}
UNLOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
{% if not clogged and printer["dual_carriage"] is defined %}
{% if printer["gcode_macro _IDEX_JOIN_SPOOLS"].enabled|default(false)|lower == 'true'%}
_JOIN_SPOOL TOOLHEAD={toolhead}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro M600]
description = Executes a color change by pausing the printer an unloading the filament.
gcode =
PAUSE
UNLOAD_FILAMENT
RATOS_ECHO MSG="Please load new filament and resume"
[gcode_macro COLD_PULL]
description = Automated hotend cold pull.
gcode =
{% set extrusion_temp = params.EXTRUSION_TEMP|default(220)|int %}
{% set cold_pull_temp = params.COLD_PULL_TEMP|default(80)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% if printer["dual_carriage"] is not defined %}
{% set toolhead = 0 %}
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Unloading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead != 0 and toolhead != 1 %}
{action_raise_error("Please select toolhead! 0 = left, 1 = right toolhead")}
{% endif %}
{% endif %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
_LED_UNLOADING_FILAMENT TOOLHEAD={toolhead}
SAVE_GCODE_STATE NAME=cold_pull_state
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
RATOS_ECHO MSG="Heating T{toolhead} to {extrusion_temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={extrusion_temp}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={extrusion_temp} MAXIMUM={extrusion_temp + 2}
G4 P3000
RATOS_ECHO MSG="extruding..."
G92 E0
G1 E30 F300
G92 E0
RATOS_ECHO MSG="Heating T{toolhead} to {cold_pull_temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={cold_pull_temp}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={cold_pull_temp} MAXIMUM={cold_pull_temp + 2}
G4 P10000
RATOS_ECHO MSG="cold pull..."
FORCE_MOVE STEPPER={target_extruder} DISTANCE=-40 VELOCITY=5 ACCEL=100
RATOS_ECHO MSG="eject filament..."
FORCE_MOVE STEPPER={target_extruder} DISTANCE=-200 VELOCITY=20 ACCEL=500
RATOS_ECHO MSG="cooling down extruder..."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET=0
RESTORE_GCODE_STATE NAME=cold_pull_state
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD={toolhead}
CONSOLE_ECHO TITLE="Cold pull finished!" MSG="Please remove the filament from the PTFE tube and cut the end off. Do NOT try to load it again." TYPE="warning"
[gcode_macro _USER_START_PRINT_BEFORE_HOMING]
gcode =
[gcode_macro _USER_START_PRINT_AFTER_HEATING_BED]
gcode =
[gcode_macro _USER_START_PRINT_BED_MESH]
gcode =
[gcode_macro _USER_START_PRINT_PARK]
gcode =
[gcode_macro _USER_START_PRINT_AFTER_HEATING_EXTRUDER]
gcode =
[gcode_macro _USER_START_PRINT_HEAT_CHAMBER]
description = Uses the extruder sensor to wait for chamber temp. Override the _START_PRINT_HEAT_CHAMBER macro to implement heated chamber handling.
gcode =
{% set chamber_heater_bed_temp = printer["gcode_macro RatOS"].chamber_heater_bed_temp|default(115)|int %}
[gcode_macro _USER_END_PRINT_BEFORE_HEATERS_OFF]
gcode =
[gcode_macro _USER_END_PRINT_AFTER_HEATERS_OFF]
gcode =
[gcode_macro _USER_END_PRINT_PARK]
gcode =
[gcode_macro _USER_END_PRINT_FINISHED]
description = User hook for when the print is finished after gcode state has been restored.
gcode =
[gcode_macro _USER_START_PRINT]
gcode =
[gcode_macro _USER_END_START_PRINT]
gcode =
[gcode_macro _USER_START_FEATURE]
gcode =
[gcode_macro _USER_END_FEATURE]
gcode =
[gcode_macro ECHO_T_VARS]
description = Echo Toolhead variables to the console.
gcode =
{% set t = params.T|default(0) %}
RATOS_ECHO MSG="T{t} Variables"
{% for var, value in printer["gcode_macro T%s" % t].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro ECHO_RATOS_VARS]
description = Echo RatOS variables to the console.
gcode =
{% for var, value in printer["gcode_macro RatOS"].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[delayed_gcode RATOS_INIT]
initial_duration = 0.1
gcode =
_LED_STANDBY
CALCULATE_PRINTABLE_AREA
INITIAL_FRONTEND_UPDATE
_CHAMBER_FILTER_SANITY_CHECK
[delayed_gcode RATOS_LOGO]
initial_duration = 2
gcode =
HELLO_RATOS
[gcode_macro INITIAL_FRONTEND_UPDATE]
gcode =
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_error = printer["gcode_macro RatOS"].status_color_error|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_unknown}"'
{% endif %}
{% set t0_sensor = "undefined" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].filament_detected|lower == "true" %}
{% set t0_sensor = "detected" %}
{% else %}
{% set t0_sensor = "empty" %}
{% endif %}
{% else %}
{% set t0_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set t1_sensor = "undefined" %}
{% if printer["dual_carriage"] is defined and printer["filament_switch_sensor toolhead_filament_sensor_t1"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].filament_detected|lower == "true" %}
{% set t1_sensor = "detected" %}
{% else %}
{% set t1_sensor = "empty" %}
{% endif %}
{% else %}
{% set t1_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set svv = printer.save_variables.variables %}
{% if svv.t0_filament is defined and printer["gcode_macro T0"] is defined %}
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
{% if t0_sensor != "empty" %}
{% set t0_filament_type = svv.t0_filament[0]|default('')|string %}
{% set t0_filament_name = svv.t0_filament[1]|default('')|string %}
{% set t0_filament_temp = svv.t0_filament[2]|default(0)|float %}
{% if t0_filament_name != '' and t0_filament_type != '' and t0_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{t0_filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{t0_filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={t0_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
{% if svv.t1_filament is defined and printer["gcode_macro T1"] is defined %}
{% if printer["gcode_macro T1"].filament_name is defined and printer["gcode_macro T1"].filament_type is defined and printer["gcode_macro T1"].filament_temp is defined %}
{% if t1_sensor != "empty" %}
{% set t1_filament_type = svv.t1_filament[0]|default('')|string %}
{% set t1_filament_name = svv.t1_filament[1]|default('')|string %}
{% set t1_filament_temp = svv.t1_filament[2]|default(0)|float %}
{% if t1_filament_name != '' and t1_filament_type != '' and t1_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='"{t1_filament_name}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='"{t1_filament_type}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE={t1_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t1_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro CALCULATE_PRINTABLE_AREA]
gcode =
{% set bed_margin_x = printer["gcode_macro RatOS"].bed_margin_x %}
{% set bed_margin_y = printer["gcode_macro RatOS"].bed_margin_y %}
{% set tool = 0 if printer["gcode_macro T0"] is not defined or printer["gcode_macro T0"].active else 1 %}
{% set max_x = printer.toolhead.axis_maximum.x if printer["dual_carriage"] is defined and tool == 0 else printer.toolhead.axis_maximum.x - bed_margin_x[1] %}
{% if printer["dual_carriage"] is defined %}
{% set max_x = printer.toolhead.axis_maximum.x %}
{% endif %}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="printer.toolhead.axis_maximum.x {printer.toolhead.axis_maximum.x}"
{% set max_y = printer.toolhead.axis_maximum.y - bed_margin_y[1]%}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_x_max VALUE={max_x}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_y_max VALUE={max_y}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="Printable area calculated: X: 0,{max_x} Y: 0,{max_y}"
[gcode_macro CACHE_TOOLHEAD_SETTINGS]
variable_cache = {"global": {"accel": 1000, "ratio": 0.5, "speed": 50, "scv": 5}}
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set dummy = cache.__setitem__(key, {"accel": printer.toolhead.max_accel, "ratio": printer.toolhead.minimum_cruise_ratio, "speed": printer.toolhead.max_velocity, "scv": printer.toolhead.square_corner_velocity}) %}
SET_GCODE_VARIABLE MACRO=CACHE_TOOLHEAD_SETTINGS VARIABLE=cache VALUE="{cache | pprint | replace("\n", "") | replace("\"", "\\\"")}"
DEBUG_ECHO PREFIX="CACHE_TOOLHEAD_SETTINGS" MSG="Toolhead settings cached for {key}. {printer.toolhead.max_accel} accel, {printer.toolhead.minimum_cruise_ratio} ratio, {printer.toolhead.max_velocity} velocity, {printer.toolhead.square_corner_velocity} scv."
[gcode_macro RESTORE_TOOLHEAD_SETTINGS]
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set values = printer["gcode_macro CACHE_TOOLHEAD_SETTINGS"].cache.__getitem__(key) %}
{% if values is not defined or values == 'None' %}
{ action_raise_error("RESTORE_TOOLHEAD_SETTINGS: Toolhead settings not cached for key '" ~ key ~ "'.") }
{% endif %}
SET_VELOCITY_LIMIT ACCEL={values.accel} MINIMUM_CRUISE_RATIO={values.ratio} VELOCITY={values.speed} SQUARE_CORNER_VELOCITY={values.scv}
DEBUG_ECHO PREFIX="RESTORE_TOOLHEAD_SETTINGS" MSG="Toolhead settings restored. {values.accel} accel, {values.ratio} ratio, {values.speed} velocity, {values.scv} scv."
[gcode_macro SET_MACRO_TRAVEL_SETTINGS]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set accel = printer["gcode_macro RatOS"].macro_travel_accel %}
SET_VELOCITY_LIMIT ACCEL={accel} MINIMUM_CRUISE_RATIO=0.5 VELOCITY={speed} SQUARE_CORNER_VELOCITY={5}
DEBUG_ECHO PREFIX="SET_MACRO_TRAVEL_SETTINGS" MSG="Macro travel settings set. {accel} accel, {speed} velocity"
[gcode_macro SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% if printer["dual_carriage"] is not defined %}
SET_KINEMATIC_POSITION X={printable_x_max / 2} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
{% else %}
IDEX_SET_CENTER_KINEMATIC_POSITION
{% endif %}
[gcode_macro IDEX_SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set center_x = printable_x_max / 2 %}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x - (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x + (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
[gcode_macro VERIFY_HYBRID_INVERTED]
gcode =
{% set inverted = False %}
{% if printer.configfile.settings.ratos_hybrid_corexy is defined and printer.configfile.settings.ratos_hybrid_corexy.inverted is defined %}
{% if printer.configfile.settings.ratos_hybrid_corexy.inverted|lower == 'true' %}
{% set inverted = True %}
{% endif %}
{% endif %}
{% if inverted == False %}
{ action_emergency_stop("ratos_hybrid_corexy NOT INVERTED! Inverted hybrid core-xy bugfix not detected.") }
{% endif %}
[gcode_macro RATOS_ECHO]
gcode =
{% set prefix = "RatOS" %}
{% set debug = params.DEBUG|default(0)|int %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " | " ~ params.PREFIX %}
{% endif %}
{% set prefix = prefix ~ ":" %}
{% set msg = "" %}
{% if params.MSG is defined %}
{% set msg = params.MSG %}
{% else %}
{% set msg = "No msg parameter provided (this is a bug or unintended use)." %}
{% endif %}
{% if not debug %}
M117 {prefix} {msg}
{% endif %}
RATOS_LOG PREFIX="{prefix}" MSG="{msg}"
{% if not debug %}
RESPOND PREFIX="{prefix}" MSG="{msg}"
{% else %}
CONSOLE_ECHO TITLE="{prefix}" TYPE="debug" MSG="{msg}"
{% endif %}
[gcode_macro ENABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=True
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=prefix_filter VALUE="'{params.FILTER|default('')|lower}'"
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging enabled."
[gcode_macro DISABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=False
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging disabled."
[gcode_macro DEBUG_ECHO]
variable_enabled = False
variable_prefix_filter = ''
gcode =
{% set prefix = "DEBUG" %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " - " ~ params.PREFIX %}
{% endif %}
{% if enabled and (prefix_filter|lower == '' or prefix_filter|lower in params.PREFIX|lower) %}
RATOS_ECHO PREFIX="{prefix}" MSG="{params.MSG}" DEBUG=1
{% endif %}
[gcode_macro START_FEATURE]
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="Start {params.FEATURE} feature gcode"
{% set scv = printer.toolhead.square_corner_velocity|int|default(5) %}
{% set accel = printer.toolhead.max_accel|int|default(10000) %}
{% set ratio = printer.toolhead.minimum_cruise_ratio|float|default(0.5) %}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="scv" VALUE={scv}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="accel" VALUE={accel}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="ratio" VALUE={ratio}
_USER_START_FEATURE FEATURE="{params.FEATURE}"
[gcode_macro END_FEATURE]
variable_scv = 5
variable_accel = 10000
variable_ratio = 0.5
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="End {params.FEATURE} feature gcode"
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={scv} ACCEL={accel} MINIMUM_CRUISE_RATIO={ratio}
_USER_END_FEATURE FEATURE="{params.FEATURE}" SCV={scv} ACCEL={accel} RATIO={ratio}
[gcode_macro _ON_LAYER_CHANGE]
variable_layer_number = 0
description = INTERNAL USE ONLY. Call it from the slicers after layer change custom gcode
gcode =
{% set layer = params.LAYER|int %}
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE={layer}
SET_PRINT_STATS_INFO CURRENT_LAYER={layer}
[gcode_macro _LEARN_MORE_CALIBRATION]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/calibration" %}
{% set link_text = "RatOS Calibration Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_CHAMBER_FILTER]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter Control" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_FILAMENT]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/filaments" %}
{% set link_text = "RatOS Filament Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _CONSOLE_SAVE_CONFIG]
gcode =
M118 Click SAVE_CONFIG to save the settings to your printer.cfg.
[gcode_macro SAVE_Z_OFFSET]
gcode =
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SAVE_MULTIPLIER
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _LOAD_RATOS_SKEW_PROFILE]
gcode =
{% set ratos_skew_profile = printer["gcode_macro RatOS"].skew_profile|default("") %}
{% if ratos_skew_profile != "" %}
{% if printer.configfile.config["skew_correction %s" % ratos_skew_profile] is defined %}
SKEW_PROFILE LOAD={ratos_skew_profile}
GET_CURRENT_SKEW
{% else %}
{% set line_1 = '"Could not find skew profile %s!_N_Clearing skew correction."' % ratos_skew_profile %}
CONSOLE_ECHO TITLE="Missing skew profile!" TYPE="warning" MSG={line_1}
SET_SKEW CLEAR=1
{% endif %}
{% endif %}
[gcode_macro M601]
gcode =
PAUSE
[gcode_macro PAUSE]
description = Pauses the print
rename_existing = PAUSE_BASE
variable_extrude = 1.5
variable_retract = 1.5
variable_fan_speed = 0
variable_idex_mode = ""
variable_idex_toolhead = 0
variable_idex_toolhead_x = 0.0
variable_idex_toolhead_y = 0.0
variable_idex_toolhead_z = 0.0
gcode =
{% set runout_detected = true if params.RUNOUT|default(false)|lower == 'true' else false %}
_LED_PAUSE
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set idex_toolhead = 1 if idex_mode == 'primary' else 0 %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
SAVE_GCODE_STATE NAME=PAUSE_state
{% else %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_mode VALUE='"{idex_mode}"'
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead VALUE={idex_toolhead}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_x VALUE={printer.gcode_move.gcode_position.x|float}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_y VALUE={printer.gcode_move.gcode_position.y|float}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_z VALUE={printer.gcode_move.gcode_position.z|float}
DEBUG_ECHO PREFIX="PAUSE" MSG="idex_mode: {idex_mode}, idex_toolhead: {idex_toolhead}, idex_toolhead_x: {idex_toolhead_x}, idex_toolhead_y: {idex_toolhead_y}, idex_toolhead_z: {idex_toolhead_z}"
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
CACHE_TOOLHEAD_SETTINGS KEY="pause"
SET_MACRO_TRAVEL_SETTINGS
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set current_z = printer.toolhead.position.z|float %}
{% if current_z < (max_z - 20.0) %}
{% set z_safe = 20.0 %}
{% else %}
{% set z_safe = max_z - current_z %}
{% endif %}
PAUSE_BASE
{% if printer["dual_carriage"] is not defined %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan"].speed|float}
{% else %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t0"].speed|float}
{% else %}
{% if idex_toolhead == 0 %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t0"].speed|float}
{% else %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t1"].speed|float}
{% endif %}
{% endif %}
{% endif %}
M106 S0
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' else false %}
{% if idex_mode != '' %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' and printer['extruder1'].can_extrude|lower == 'true' else false %}
{% else %}
{% if printer.toolhead.extruder == 'extruder1' %}
{% set can_extrude = true if printer['extruder1'].can_extrude|lower == 'true' else false %}
{% endif %}
{% endif %}
{% endif %}
{% set R = printer["gcode_macro PAUSE"].retract|float %}
{% if can_extrude %}
G91
G1 E-{R} F2100
G90
{% else %}
{action_respond_info("Extruder not hot enough")}
{% endif %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set pause_print_park_x = printer["gcode_macro RatOS"].pause_print_park_x %}
{% set pause_print_park_in = printer["gcode_macro RatOS"].pause_print_park_in %}
{% if runout_detected %}
{% set pause_print_park_x = printer["gcode_macro RatOS"].runout_park_x %}
{% set pause_print_park_in = printer["gcode_macro RatOS"].runout_park_in %}
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
DEBUG_ECHO PREFIX="PAUSE" MSG="z_speed: {z_speed}, pause_print_park_x: {pause_print_park_x}, pause_print_park_in: {pause_print_park_in}, default_toolhead: {default_toolhead}"
{% if "xyz" in printer.toolhead.homed_axes %}
G91
G1 Z{z_safe} F{z_speed}
G90
{% if printer["dual_carriage"] is not defined %}
_PARK LOCATION={pause_print_park_in} X={pause_print_park_x}
{% else %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
_IDEX_SINGLE X={parking_position}
{% else %}
PARK_TOOLHEAD
{% endif %}
_PARK LOCATION={pause_print_park_in} X={pause_print_park_x}
{% endif %}
{% else %}
{action_respond_info("Printer not homed")}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="pause"
[gcode_macro RESUME]
description = Resumes the print if the printer is paused.
rename_existing = RESUME_BASE
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set target_idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set target_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% endif %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' else false %}
{% if target_idex_mode != '' %}
{% if target_idex_mode == 'copy' or target_idex_mode == 'mirror' %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' and printer['extruder1'].can_extrude|lower == 'true' else false %}
{% else %}
{% if printer.toolhead.extruder == 'extruder1' %}
{% set can_extrude = true if printer['extruder1'].can_extrude|lower == 'true' else false %}
{% endif %}
{% endif %}
{% endif %}
{% set fan_speed = printer["gcode_macro PAUSE"].fan_speed|float %}
{% if printer["dual_carriage"] is not defined %}
M106 S{(fan_speed * 255)}
{% else %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% else %}
{% if params.TOOLHEAD is defined %}
{% if params.TOOLHEAD == 0 %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
{% else %}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% endif %}
{% else %}
{% if printer["gcode_macro PAUSE"].idex_toolhead == 0 %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
{% else %}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% endif %}
{% endif %}
{% endif %}
M106.1 S{fan_speed}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if target_idex_mode == "copy" %}
_IDEX_COPY DANCE=0
{% elif target_idex_mode == "mirror" %}
_IDEX_MIRROR DANCE=0
{% else %}
{% if params.TOOLHEAD is defined %}
_SELECT_TOOL T={params.TOOLHEAD} X=-1 Y=-1 TOOLSHIFT=false
{% else %}
_SELECT_TOOL T={printer["gcode_macro PAUSE"].idex_toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% endif %}
{% set x = printer["gcode_macro PAUSE"].idex_toolhead_x|float %}
{% set y = printer["gcode_macro PAUSE"].idex_toolhead_y|float %}
{% set z = printer["gcode_macro PAUSE"].idex_toolhead_z|float %}
G1 X{x} Y{y} Z{z} F{speed}
{% if params.TOOLHEAD is defined %}
SAVE_GCODE_STATE NAME=PAUSE_STATE
{% endif %}
{% endif %}
{% if params.TOOLHEAD is not defined %}
{% set E = printer["gcode_macro PAUSE"].extrude|float %}
{% if can_extrude %}
G91
G1 E{E} F2100
G90
{% else %}
{action_respond_info("Extruder not hot enough")}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 MOVE_SPEED={speed}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=True
RESUME_BASE
_LED_PRINTING
[gcode_macro CANCEL_PRINT]
description = Cancels the printer
rename_existing = CANCEL_PRINT_BASE
gcode =
END_PRINT
TURN_OFF_HEATERS
CLEAR_PAUSE
CANCEL_PRINT_BASE
[gcode_macro START_PRINT]
description = Start print procedure, use this in your Slicer.
variable_post_processor_version = 2
variable_is_printing_gcode = False
variable_both_toolheads = True
variable_object_xoffset = 0
variable_first_x = -1
variable_first_y = -1
variable_total_toolshifts = 0
variable_initial_tool = 0
variable_extruder_first_layer_temp = ""
variable_extruder_other_layer_temp = ""
gcode =
{% if "xyz" in printer.toolhead.homed_axes and printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% if printer["gcode_macro _VAOC"].is_started|default(true)|lower == 'true' %}
_VAOC_END
{% endif %}
{% endif %}
_LED_START_PRINTING
CACHE_TOOLHEAD_SETTINGS KEY="start_print"
_USER_START_PRINT { rawparams }
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% set hotend_heat_soak_time = printer["gcode_macro RatOS"].hotend_heat_soak_time|default(0)|int %}
{% set z_probe_stowable = printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set X0 = params.X0|default(-1)|float %}
{% set X1 = params.X1|default(-1)|float %}
{% set Y0 = params.Y0|default(-1)|float %}
{% set Y1 = params.Y1|default(-1)|float %}
{% if first_x == -1 or first_y == -1 %}
{% set first_x = params.FIRST_X|default(-1)|float %}
{% set first_y = params.FIRST_Y|default(-1)|float %}
{% endif %}
{% set total_toolshifts = params.TOTAL_TOOLSHIFTS|default(0)|int %}
{% set initial_tool = params.INITIAL_TOOL|default(default_toolhead)|int %}
{% set start_chamber_temp = params.START_CHAMBER_TEMP|default(0)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set bed_temp = params.BED_TEMP|default(printer.heater_bed.target, true)|float %}
{% set total_layer_count = params.TOTAL_LAYER_COUNT|default(0)|int %}
{% set extruder_first_layer_temp = (params.EXTRUDER_TEMP|default("")).split(",") %}
RATOS_ECHO MSG="First print coordinates X:{first_x} Y:{first_y}"
{% if params.TOTAL_LAYER_COUNT is not defined %}
{% set link_url = "https://os.ratrig.com/docs/slicers" %}
{% set link_text = "RatOS Slicer Configuration" %}
{% set line_1 = '"Your slicer gcode settings are not up to date._N_Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="Incomplete Slicer Configuration detected" TYPE="warning" MSG={line_1}
{% endif %}
SET_PRINT_STATS_INFO CURRENT_LAYER=1
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE=1
{% if total_layer_count > 0 %}
SET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set swap_toolheads = true if printer["gcode_macro _IDEX_REMAP_TOOLHEADS"].enabled|default(false)|lower == 'true' else false %}
{% if swap_toolheads %}
{% set initial_tool = 0 if initial_tool == 1 else 1 %}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=active VALUE=True
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=active VALUE=True
{% endif %}
{% set both_toolheads = true %}
{% if total_toolshifts == 0 %}
{% set both_toolheads = false %}
{% endif %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
_IDEX_SINGLE X={parking_position}
{% endif %}
{% if both_toolheads and (idex_mode == "copy" or idex_mode == "mirror") %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Gcode tool changes found. Copy and mirror mode do not support toolchanges.")}
{% endif %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set both_toolheads = true %}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=initial_tool VALUE={initial_tool}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=first_x VALUE={first_x}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=first_y VALUE={first_y}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=total_toolshifts VALUE={total_toolshifts}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=both_toolheads VALUE={both_toolheads}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_first_layer_temp VALUE="'{params.EXTRUDER_TEMP}'"
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_other_layer_temp VALUE="'{params.EXTRUDER_OTHER_LAYER_TEMP}'"
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=_TOOLCHANGE VARIABLE=toolshift_count VALUE=0
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set svv = printer.save_variables.variables %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set parking_position_t0 = printer["gcode_macro T0"].parking_position|float %}
{% set parking_position_t1 = printer["gcode_macro T1"].parking_position|float %}
{% set stepper_x_position_min = printer.configfile.settings.stepper_x.position_min|float %}
{% set stepper_x_position_endstop = printer.configfile.settings.stepper_x.position_endstop|float %}
{% set dual_carriage_position_max = printer.configfile.settings.dual_carriage.position_max|float %}
{% set dual_carriage_position_endstop = printer.configfile.settings.dual_carriage.position_endstop|float %}
{% set x_parking_space = parking_position_t0 - (stepper_x_position_endstop , stepper_x_position_min)|max %}
{% set dc_parking_space = (dual_carriage_position_endstop , dual_carriage_position_max)|min - parking_position_t1 %}
{% if svv.idex_xoffset|abs >= (x_parking_space - 0.5) or svv.idex_xoffset|abs >= (dc_parking_space - 0.5) %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Toolhead x-offset is too high for the available parking space. Calibrate your X and DC endstop positions and make sure you stay below 1mm." % (copy_mode_max_width)) }
{% endif %}
{% endif %}
{% if (idex_mode == "copy" or idex_mode == "mirror") and printer.configfile.settings.ratos.enable_gcode_transform %}
{% if params.MIN_X is not defined or params.MAX_X is not defined %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Something went wrong! Missing important post processor start print parameter!") }
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=object_xoffset VALUE=0
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set boundary_box_min_x = params.MIN_X|default(0)|float %}
{% set boundary_box_max_x = params.MAX_X|default(printable_x_max)|float %}
{% set svv = printer.save_variables.variables %}
{% if default_toolhead == 0 %}
{% set boundary_box_max_x = boundary_box_max_x + svv.idex_xoffset %}
{% else %}
{% set boundary_box_min_x = boundary_box_min_x - svv.idex_xoffset %}
{% endif %}
{% set center_x = printable_x_max / 2.0 %}
{% set safe_distance = printer.configfile.settings.dual_carriage.safe_distance|float %}
{% set object_width = boundary_box_max_x - boundary_box_min_x %}
{% set copy_mode_max_width = center_x %}
{% set mirror_mode_max_width = center_x - safe_distance / 2.0 %}
DEBUG_ECHO PREFIX="START_PRINT" MSG="OBJECT_WIDTH: {object_width} BOUNDARY_BOX_MIN_X: {boundary_box_min_x} BOUNDARY_BOX_MAX_X: {boundary_box_max_x} CENTER_X: {center_x} SAFE_DISTANCE: {safe_distance}"
{% if idex_mode == "copy" and object_width > copy_mode_max_width %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Object is too big for copy mode! Max supported width is %s mm" % (copy_mode_max_width)) }
{% endif %}
{% if idex_mode == "mirror" and object_width > mirror_mode_max_width %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Object is too big for mirror mode! Max supported width is %s mm" % (mirror_mode_max_width)) }
{% endif %}
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
{% set object_xoffset = (printable_x_max - boundary_box_max_x - boundary_box_min_x) / 2 %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=object_xoffset VALUE={object_xoffset}
{% endif %}
{% endif %}
{% set has_initial_toolhead_filament_sensor = true if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool] is defined else false %}
{% if has_initial_toolhead_filament_sensor %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s filament sensor is empty." % (initial_tool)) }
{% endif %}
{% endif %}
{% endif %}
{% set has_initial_bowden_filament_sensor = true if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool] is defined else false %}
{% if has_initial_bowden_filament_sensor %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool].enabled|lower == "true" %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s bowden sensor is empty." % (initial_tool)) }
{% endif %}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined and both_toolheads %}
{% set has_secondary_toolhead_filament_sensor = true if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)] is defined else false %}
{% if has_secondary_toolhead_filament_sensor %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s filament sensor is empty." % (1 if initial_tool == 0 else 0)) }
{% endif %}
{% endif %}
{% endif %}
{% set has_secondary_bowden_filament_sensor = true if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)] is defined else false %}
{% if has_secondary_bowden_filament_sensor %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].enabled|lower == "true" %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s bowden sensor is empty." % (1 if initial_tool == 0 else 0)) }
{% endif %}
{% endif %}
{% endif %}
{% endif %}
_CHAMBER_FILTER_ON AT="before_print_start"
{% if printer["dual_carriage"] is defined %}
{% if printer["gcode_macro _IDEX_JOIN_SPOOLS"].enabled|default(false)|lower == 'true' %}
{% if both_toolheads %}
RATOS_ECHO MSG="Spool join is not possible if both toolheads are in use!"
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% endif %}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if idex_mode == '' %}
_SET_TOOLHEAD_OFFSET T={default_toolhead} MOVE={1 if "xyz" in printer.toolhead.homed_axes else 0}
{% endif %}
{% endif %}
CLEAR_PAUSE
{% if printer["gcode_macro RatOS"].force_absolute_position|lower == 'true' %}
G90
{% endif %}
SAVE_GCODE_STATE NAME=start_print_state
G21
G90
M82
_USER_START_PRINT_BEFORE_HOMING { rawparams }
{% if z_probe_stowable == true %}
STOWABLE_PROBE_BEGIN_BATCH
{% endif %}
MAYBE_HOME
_Z_HOP
{% if idex_mode != '' and not (printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
PARK_TOOLHEAD
{% endif %}
{% if chamber_temp > 0 %}
{% if printer["fan_generic filter"] is defined %}
{% if printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float > 0 %}
SET_FAN_SPEED FAN=filter SPEED={printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float}
{% endif %}
{% endif %}
_CHAMBER_HEATER_ON START_CHAMBER_TEMP={start_chamber_temp} CHAMBER_TEMP={chamber_temp}
_USER_START_PRINT_HEAT_CHAMBER { rawparams } CHAMBER_TEMP={chamber_temp}
{% endif %}
_START_PRINT_BEFORE_HEATING_BED T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
RATOS_ECHO MSG="Heating bed..."
M190 S{bed_temp}
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
_USER_START_PRINT_AFTER_HEATING_BED { rawparams }
_START_PRINT_AFTER_HEATING_BED T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
_USER_START_PRINT_BED_MESH { rawparams } X0={X0} X1={X1} Y0={Y0} Y1={Y1}
_START_PRINT_BED_MESH X0={X0} X1={X1} Y0={Y0} Y1={Y1} T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
{% if z_probe_stowable == true %}
STOWABLE_PROBE_END_BATCH
{% endif %}
{% if idex_mode == '' %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={extruder_first_layer_temp[0]|float}
{% else %}
{% if initial_tool == 0 or both_toolheads or (default_toolhead == 0 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={extruder_first_layer_temp[0]|float}
{% endif %}
{% if initial_tool == 1 or both_toolheads or (default_toolhead == 1 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
SET_HEATER_TEMPERATURE HEATER="extruder1" TARGET={extruder_first_layer_temp[1]|float}
{% endif %}
{% endif %}
_USER_START_PRINT_PARK { rawparams }
_START_PRINT_PARK
RATOS_ECHO MSG="Heating Extruder..."
{% if idex_mode == '' %}
TEMPERATURE_WAIT SENSOR="extruder" MINIMUM={extruder_first_layer_temp[0]|float} MAXIMUM={extruder_first_layer_temp[0]|float + 5}
{% else %}
{% if initial_tool == 0 or both_toolheads or (default_toolhead == 0 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
TEMPERATURE_WAIT SENSOR="extruder" MINIMUM={extruder_first_layer_temp[0]|float} MAXIMUM={extruder_first_layer_temp[0]|float + 5}
{% endif %}
{% if initial_tool == 1 or both_toolheads or (default_toolhead == 1 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
TEMPERATURE_WAIT SENSOR="extruder1" MINIMUM={extruder_first_layer_temp[1]|float} MAXIMUM={extruder_first_layer_temp[1]|float + 5}
{% endif %}
{% endif %}
{% if hotend_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking hotend for {hotend_heat_soak_time} seconds..."
G4 P{(hotend_heat_soak_time * 1000)}
{% endif %}
{% if idex_mode == '' %}
_LED_PRINTING
{% else %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
_LED_PRINTING
{% else %}
{% if both_toolheads %}
_LED_PRINTING TOOLHEAD={initial_tool}
{% if toolchange_standby_temp > -1 %}
_LED_TOOLHEAD_STANDBY TOOLHEAD={0 if initial_tool == 1 else 1}
{% else %}
_LED_PRINTING TOOLHEAD={0 if initial_tool == 1 else 1}
{% endif %}
{% else %}
_LED_PRINTING TOOLHEAD={initial_tool}
_LED_DEACTIVATE_TOOLHEAD TOOLHEAD={0 if initial_tool == 1 else 1}
{% endif %}
{% endif %}
{% endif %}
_USER_START_PRINT_AFTER_HEATING_EXTRUDER { rawparams } X0={X0} X1={X1} Y0={Y0} Y1={Y1}
_START_PRINT_AFTER_HEATING_EXTRUDER X0={X0} X1={X1} Y0={Y0} Y1={Y1} INITIAL_TOOLHEAD={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
{% if idex_mode != '' %}
{% if not both_toolheads %}
{% if initial_tool != default_toolhead %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
{% endif %}
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
{% if toolchange_standby_temp > -1 %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if initial_tool == 1 else 'extruder1'} TARGET={toolchange_standby_temp}
{% endif %}
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% set x_offset = printer.toolhead.position.x|float - printer.gcode_move.gcode_position.x|float %}
{% endif %}
RESTORE_GCODE_STATE NAME=start_print_state
{% if idex_mode != '' %}
{% set act_idex_mode = printer["dual_carriage"].carriage_1|default('')|lower %}
{% if act_idex_mode == "copy" or act_idex_mode == "mirror" %}
SET_GCODE_OFFSET X={x_offset} MOVE=0
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% if idex_mode == "copy" and idex_mode != act_idex_mode %}
_IDEX_COPY DANCE=0
{% elif idex_mode == "mirror" and idex_mode != act_idex_mode %}
_IDEX_MIRROR DANCE=0
{% endif %}
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
RATOS_ECHO MSG="Adjusting object x-offset by {(object_xoffset)} mm"
SET_GCODE_OFFSET X_ADJUST={object_xoffset} MOVE=0
{% endif %}
{% else %}
_SELECT_TOOL T={initial_tool} TOOLSHIFT=false
{% if initial_tool != default_toolhead %}
{% set svv = printer.save_variables.variables %}
SAVE_VARIABLE VARIABLE=idex_applied_offset VALUE={default_toolhead}
_SET_TOOLHEAD_OFFSET T={initial_tool} MOVE=0
{% endif %}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
_BEACON_SET_NOZZLE_TEMP_OFFSET TOOLHEAD={initial_tool}
{% endif %}
_SET_EXTRUSION_MODE
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=True
{% if printer["gcode_macro _SELECT_TOOL"] is defined %}
SET_GCODE_VARIABLE MACRO=_SELECT_TOOL VARIABLE=last_timestamp VALUE={printer["print_stats"].print_duration}
{% endif %}
_USER_END_START_PRINT { rawparams }
G92 E0
_CHAMBER_FILTER_ON AT="after_print_start"
RATOS_ECHO MSG="Printing..."
[gcode_macro _START_PRINT_BEFORE_HEATING_BED]
gcode =
{% set target_idex_mode = params.IDEX_MODE|default("")|lower %}
{% set initial_toolhead = params.T|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %}
{% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% set act_t = 1 if idex_mode == 'primary' else 0 %}
{% set auto_z_offset_calibration = False %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% set is_fixed = true if printer["gcode_macro _VAOC"].is_fixed|default(true)|lower == 'true' else false %}
{% if printer["gcode_macro _VAOC"].auto_z_offset_calibration|default("false")|lower == 'true' and is_fixed %}
{% if target_idex_mode != "copy" and target_idex_mode != "mirror" %}
{% if both_toolheads or initial_toolhead != default_toolhead %}
{% set auto_z_offset_calibration = True %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set is_stowable_probe = true if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' else false %}
{% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %}
RATOS_ECHO MSG="Pre-heating extruder..."
{% if printer["dual_carriage"] is defined %}
{% if auto_z_offset_calibration %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={min_temp}
SET_HEATER_TEMPERATURE HEATER="extruder1" TARGET={min_temp}
{% else %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET={min_temp}
{% endif %}
{% else %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={min_temp}
{% endif %}
{% endif %}
{% if not is_stowable_probe %}
{% if printer["dual_carriage"] is defined and act_t != default_toolhead %}
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=True
{% endif %}
RATOS_ECHO MSG="Heat soaking z probe..."
{% if auto_z_offset_calibration %}
{% set safe_distance = printer.configfile.settings.dual_carriage.safe_distance|float %}
{% if default_toolhead == 0 %}
_SELECT_TOOL T=0 TOOLSHIFT=false
G1 X{safe_home_x - safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
G1 X{safe_home_x + safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
{% elif default_toolhead == 1 %}
_SELECT_TOOL T=1 TOOLSHIFT=false
G1 X{safe_home_x + safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
G1 X{safe_home_x - safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
{% endif %}
{% else %}
_MOVE_TO_SAFE_Z_HOME
{% endif %}
G0 Z2 F{z_speed}
{% endif %}
[gcode_macro _START_PRINT_AFTER_HEATING_BED]
gcode =
{% set target_idex_mode = params.IDEX_MODE|default("")|lower %}
{% set initial_toolhead = params.T|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %}
{% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set auto_z_offset_calibration = False %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% set is_fixed = true if printer["gcode_macro _VAOC"].is_fixed|default(true)|lower == 'true' else false %}
{% if printer["gcode_macro _VAOC"].auto_z_offset_calibration|default("false")|lower == 'true' and is_fixed %}
{% if target_idex_mode != "copy" and target_idex_mode != "mirror" %}
{% if both_toolheads or initial_toolhead != default_toolhead %}
{% set auto_z_offset_calibration = True %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_wipe_before_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_wipe_before_true_zero|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %}
RATOS_ECHO MSG="Waiting for extruder to be preheated..."
{% if printer["dual_carriage"] is defined %}
{% if auto_z_offset_calibration %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
TEMPERATURE_WAIT SENSOR=extruder1 MINIMUM={min_temp} MAXIMUM={max_temp}
{% else %}
{% if default_toolhead == 0 %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
{% else %}
TEMPERATURE_WAIT SENSOR=extruder1 MINIMUM={min_temp} MAXIMUM={max_temp}
{% endif %}
{% endif %}
{% else %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_Z_HOP
{% endif %}
{% if auto_z_offset_calibration %}
{% set parking_position_t0 = printer["gcode_macro T0"].parking_position|float %}
{% set parking_position_t1 = printer["gcode_macro T1"].parking_position|float %}
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=True
PARK_TOOLHEAD
_CLEANING_MOVE TOOLHEAD={default_toolhead}
_SELECT_TOOL T={0 if default_toolhead == 1 else 1} X={parking_position_t0 if default_toolhead == 1 else parking_position_t1} Y=0 TOOLSHIFT=false
_CLEANING_MOVE TOOLHEAD={0 if default_toolhead == 1 else 1}
_VAOC_CALIBRATE_Z_OFFSET AUTO_Z_OFFSET=True
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=false
{% endif %}
{% set needs_rehoming = False %}
{% if printer.z_tilt is defined and not printer.z_tilt.applied %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% set needs_rehoming = True %}
{% endif %}
{% if printer.quad_gantry_level is defined and not printer.quad_gantry_level.applied %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% set needs_rehoming = True %}
{% endif %}
{% if needs_rehoming %}
G28 Z
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero %}
{% if beacon_contact_wipe_before_true_zero %}
_START_PRINT_AFTER_HEATING_BED_PROBE_FOR_WIPE
{% endif %}
_START_PRINT_AFTER_HEATING_CONTACT_WITH_OPTIONAL_WIPE
{% endif %}
[gcode_macro _START_PRINT_AFTER_HEATING_BED_PROBE_FOR_WIPE]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
G0 Z5 F{z_speed}
G0 X50 Y10 F{speed}
PROBE PROBE_METHOD=contact SAMPLES=1
BEACON_QUERY
[gcode_macro _START_PRINT_AFTER_HEATING_CONTACT_WITH_OPTIONAL_WIPE]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_true_zero_location = printer["gcode_macro RatOS"].beacon_contact_true_zero_location|default("front")|lower %}
{% set beacon_contact_true_zero_margin_x = printer["gcode_macro RatOS"].beacon_contact_true_zero_margin_x|default(30)|int %}
{% set beacon_contact_wipe_before_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_wipe_before_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_wipe_before_true_zero %}
{% if printer.beacon.last_probe_result|lower == "ok" %}
{% set last_z_offset = printer.beacon.last_z_result %}
RATOS_ECHO MSG="Auto calibration nozzle wipe with probe result {last_z_offset}..."
G0 Z{(0.2 + last_z_offset)} F{z_speed}
G0 X70 F300
{% else %}
RATOS_ECHO MSG="Skipping auto calibration nozzle wipe because probing failed!"
{% endif %}
{% endif %}
G0 Z5 F{z_speed}
_MOVE_TO_SAFE_Z_HOME
RATOS_ECHO MSG="Heating extruder to probing temperature..."
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET={beacon_contact_true_zero_temp}
TEMPERATURE_WAIT SENSOR={"extruder" if default_toolhead == 0 else "extruder1"} MINIMUM={beacon_contact_true_zero_temp} MAXIMUM={beacon_contact_true_zero_temp + 5}
RATOS_ECHO MSG="Beacon contact auto calibration..."
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
G0 Z5 F{z_speed}
[gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER]
gcode =
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set first_x = printer["gcode_macro START_PRINT"].first_x|default(-1)|float %}
{% set first_y = printer["gcode_macro START_PRINT"].first_y|default(-1)|float %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set center_x = printable_x_max / 2.0 %}
{% set center_y = printable_y_max / 2.0 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% if printer["dual_carriage"] is defined %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
{% endif %}
{% set X0 = params.X0|default(-1)|int %}
{% set X1 = params.X1|default(-1)|int %}
{% set Y0 = params.Y0|default(-1)|int %}
{% set Y1 = params.Y1|default(-1)|int %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set initial_toolhead = params.INITIAL_TOOLHEAD|default(default_toolhead)|int %}
{% if idex_mode == '' %}
_PRIME
{% else %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
RATOS_ECHO PREFIX="IDEX" MSG="using combined prime offset for IDEX {idex_mode} mode"
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% else %}
{% if both_toolheads %}
{% if initial_toolhead == 0 %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T1"
_SELECT_TOOL T=1 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T0"
_SELECT_TOOL T=0 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% else %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T0"
_SELECT_TOOL T=0 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T1"
_SELECT_TOOL T=1 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% endif %}
{% else %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T{initial_toolhead}"
_SELECT_TOOL T={initial_toolhead} TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% endif %}
{% endif %}
{% endif %}
CACHE_TOOLHEAD_SETTINGS KEY="start_print_after_heating_extruder"
SET_MACRO_TRAVEL_SETTINGS
{% if (X0 > -1 and Y1 > -1) or (first_x > 0 and first_y > 0) %}
{% if printer["dual_carriage"] is defined %}
{% set acceleration = printer["gcode_macro RatOS"].toolchange_travel_accel %}
{% set max_accel = printer.toolhead.max_accel|float %}
{% set square_corner_velocity = printer.toolhead.square_corner_velocity|float %}
SET_VELOCITY_LIMIT ACCEL={acceleration} MINIMUM_CRUISE_RATIO=0 SQUARE_CORNER_VELOCITY=20
{% endif %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
G0 Z3 F{z_speed}
{% endif %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro RatOS"].nozzle_priming|lower == 'false' %}
{% set first_z = 1 %}
{% else %}
{% set first_z = 3 %}
{% endif %}
{% if idex_mode == "mirror" %}
{% if first_y >= 0 %}
G0 Y{first_y} F{speed}
{% else %}
G0 Y{Y1} F{speed}
{% endif %}
{% endif %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro RatOS"].nozzle_priming|lower == 'false' %}
_MOVE_TO_LOADING_POSITION TOOLHEAD={initial_toolhead}
_PURGE_FILAMENT TOOLHEAD={initial_toolhead} E={printer["gcode_macro RatOS"].toolchange_first_purge|default(50)|float}
_CLEANING_MOVE TOOLHEAD={initial_toolhead}
{% endif %}
{% if first_x >= 0 and first_y >= 0 %}
G0 X{first_x} Y{first_y} Z{first_z} F{speed}
{% else %}
{% set first_x = X0 %}
{% set first_y = Y0 %}
{% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' or printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %}
{% set first_x = X0 %}
{% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %}
{% set first_x = X1 %}
{% else %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_x|float <= center_x %}
{% set first_x = X0 %}
{% else %}
{% set first_x = X1 %}
{% endif %}
{% endif %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %}
{% set first_y = Y0 %}
{% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %}
{% set first_y = Y1 %}
{% else %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_y|float <= center_y %}
{% set first_y = Y0 %}
{% else %}
{% set first_y = Y1 %}
{% endif %}
{% endif %}
{% endif %}
G0 X{first_x} Y{first_y} Z{first_z} F{speed}
{% endif %}
{% endif %}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print_after_heating_extruder"
_LOAD_RATOS_SKEW_PROFILE
[gcode_macro _PRIME]
gcode =
{% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' or printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %}
PRIME_BLOB INITIAL_TOOLHEAD={params.INITIAL_TOOLHEAD} BOTH_TOOLHEADS={params.BOTH_TOOLHEADS} IDEX_MODE={params.IDEX_MODE} Y1={params.Y1}
{% endif %}
[gcode_macro END_PRINT]
description = End print procedure, use this in your Slicer.
gcode =
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
SAVE_GCODE_STATE NAME=end_print_state
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=_IDEX_REMAP_TOOLHEADS VARIABLE=enabled VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
{% set object_xoffset = printer["gcode_macro START_PRINT"].object_xoffset|default(0)|float %}
RATOS_ECHO MSG="Adjusting object x-offset by {(0-object_xoffset)} mm"
SET_GCODE_OFFSET X_ADJUST={(0-object_xoffset)}
{% endif %}
{% endif %}
_USER_END_PRINT_BEFORE_HEATERS_OFF { rawparams }
_END_PRINT_BEFORE_HEATERS_OFF
TURN_OFF_HEATERS
_USER_END_PRINT_AFTER_HEATERS_OFF { rawparams }
_END_PRINT_AFTER_HEATERS_OFF
_USER_END_PRINT_PARK { rawparams }
_END_PRINT_PARK
{% if printer["gcode_macro RatOS"].skew_profile is defined %}
SET_SKEW CLEAR=1
{% endif %}
{% if printer["dual_carriage"] is not defined and printer["gcode_macro RatOS"].end_print_motors_off|lower != 'false' %}
M84
{% endif %}
M107
BED_MESH_CLEAR
RATOS_ECHO MSG="Done :)"
RESTORE_GCODE_STATE NAME=end_print_state
{% if printer["dual_carriage"] is defined %}
M84
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
{% if printer["dual_carriage"] is not defined %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
SET_GCODE_OFFSET Z=0 MOVE=0
{% endif %}
{% endif %}
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print"
_CHAMBER_FILTER_ON AT="print_end"
_CHAMBER_FILTER_OFF
_CHAMBER_HEATER_OFF
_USER_END_PRINT_FINISHED { rawparams }
[gcode_macro _END_PRINT_BEFORE_HEATERS_OFF]
gcode =
RATOS_ECHO MSG="Cleaning up..."
[gcode_macro _END_PRINT_AFTER_HEATERS_OFF]
gcode =
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set current_z = printer.toolhead.position.z|float %}
{% set z_hop = printer["gcode_macro RatOS"].end_print_park_z_hop|float %}
{% set r = printer["gcode_macro RatOS"].end_print_retract_filament|default(4)|float %}
{% if current_z < (max_z - z_hop) %}
{% set z_safe = z_hop %}
{% else %}
{% set z_safe = max_z - current_z %}
{% endif %}
G91
G1 E-2 F3600
G0 Z{z_safe} F3600
G1 E-{(r-2)} F3600
G90
[gcode_macro _SET_EXTRUSION_MODE]
gcode =
{% if printer["gcode_macro RatOS"].relative_extrusion|lower == 'true' %}
M83
{% else %}
M82
{% endif %}
[gcode_macro GENERATE_SHAPER_GRAPHS]
description = Genarates input shaper resonances graphs for analysis. Uses the AXIS parameter for if you only want to do one axis at a time, (eg. GENERATE_SHAPER_GRAPHS AXIS=X)
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="generate_shaper_graphs"
SET_MACRO_TRAVEL_SETTINGS
CACHE_IS_GRAPH_FILES
_LED_INPUT_SHAPER_START
{% set axis = params.AXIS|default('')|lower %}
{% set freq_start = params.FREQUENCY_START|default(10)|int %}
{% set freq_end = params.FREQUENCY_END|default(133)|int %}
{% set hz_per_sec = params.HZ_PER_SEC|default(1)|float %}
{% if axis != '' %}
{% if axis == 'x' %}
MAYBE_HOME
TEST_RESONANCES AXIS=X FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_x
{% elif axis == 'y' %}
MAYBE_HOME
TEST_RESONANCES AXIS=Y FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_y
{% else %}
{action_raise_error("Unknown axis specified. Expected X or Y.")}
{% endif %}
{% else %}
MAYBE_HOME
TEST_RESONANCES AXIS=X FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
TEST_RESONANCES AXIS=Y FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_x
RUN_SHELL_COMMAND CMD=generate_shaper_graph_y
{% endif %}
_LED_INPUT_SHAPER_END
RESTORE_TOOLHEAD_SETTINGS KEY="generate_shaper_graphs"
_LEARN_MORE_CALIBRATION
SHOW_IS_GRAPH_FILES TITLE="Shaper graph"
[gcode_shell_command generate_shaper_graph_x]
command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-x.sh
timeout = 60.
verbose = True
[gcode_shell_command generate_shaper_graph_y]
command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-y.sh
timeout = 60.
verbose = True
[gcode_macro MEASURE_COREXY_BELT_TENSION]
description = Generates resonance graph used to ensure belts are equally tensioned.
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="measure_corexy_belt_tension"
SET_MACRO_TRAVEL_SETTINGS
CACHE_IS_GRAPH_FILES
_LED_INPUT_SHAPER_START
{% set freq_start = params.FREQUENCY_START|default(10)|int %}
{% set freq_end = params.FREQUENCY_END|default(133)|int %}
{% set hz_per_sec = params.HZ_PER_SEC|default(1)|float %}
MAYBE_HOME
TEST_RESONANCES AXIS=1,1 OUTPUT=raw_data NAME=belt-tension-upper FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
TEST_RESONANCES AXIS=1,-1 OUTPUT=raw_data NAME=belt-tension-lower FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_belt_tension_graph
_LED_INPUT_SHAPER_END
RESTORE_TOOLHEAD_SETTINGS KEY="measure_corexy_belt_tension"
_LEARN_MORE_CALIBRATION
SHOW_IS_GRAPH_FILES TITLE="Belt Tension Graph"
[gcode_shell_command generate_belt_tension_graph]
command = /home/pi/printer_data/config/RatOS/scripts/generate-belt-tension-graph.sh
timeout = 90.
verbose = True
[idle_timeout]
gcode =
{% if printer.webhooks.state|lower == 'ready' %}
{% if printer.pause_resume.is_paused|lower == 'false' %}
RATOS_ECHO PREFIX="IDLE" MSG="2 hours since last activity. Powering off heaters and motors.."
TURN_OFF_HEATERS
M84
{% endif %}
{% endif %}
timeout = 7200
[temperature_sensor raspberry_pi]
sensor_type = temperature_host
[skew_correction]
[input_shaper]
[virtual_sdcard]
path = ~/printer_data/gcodes
[display_status]
[pause_resume]
[force_move]
enable_force_move = True
[respond]
[resonance_generator]
[ratos]
allow_unknown_gcode_generator = True
[exclude_object]
[heater_bed]
heater_pin = heater_bed_heating_pin
sensor_pin = heater_bed_sensor_pin
sensor_type = Generic 3950
min_temp = 0
max_temp = 120
pwm_cycle_time = 0.02
control = pid
pid_kp = 68.203
pid_ki = 2.842
pid_kd = 409.216
[controller_fan controller_fan]
pin = fan_controller_board_pin
[printer]
kinematics = corexy
max_velocity = 300
max_accel = 3000
max_z_velocity = 20
max_z_accel = 350
square_corner_velocity = 5
minimum_cruise_ratio = 0.5
[gcode_macro QUAD_GANTRY_LEVEL]
rename_existing = QUAD_GANTRY_LEVEL_ORIG
gcode =
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
DEPLOY_PROBE
{% endif %}
QUAD_GANTRY_LEVEL_ORIG
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
STOW_PROBE
{% endif %}
[stepper_x]
position_max = 350
position_endstop = 350
step_pin = PC14
dir_pin = !x_dir_pin
enable_pin = !PE6
microsteps = 64
full_steps_per_rotation = 400
rotation_distance = 40
homing_speed = 50
endstop_pin = tmc5160_stepper_x:virtual_endstop
homing_retract_dist = 0
position_min = 0
[stepper_y]
position_max = 350
position_endstop = 350
step_pin = PE5
dir_pin = y_dir_pin
enable_pin = !PE3
microsteps = 64
full_steps_per_rotation = 400
rotation_distance = 40
homing_speed = 50
endstop_pin = tmc5160_stepper_y:virtual_endstop
homing_retract_dist = 0
position_min = 0
[stepper_z]
position_max = 310
step_pin = PG11
dir_pin = !z0_dir_pin
enable_pin = !PG12
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
position_min = -5
homing_speed = 10
endstop_pin = probe:z_virtual_endstop
[bed_mesh]
speed = 300
horizontal_move_z = 10
mesh_min = 20,30
mesh_max = 310,310
fade_start = 0.6
fade_end = 10.0
probe_count = 5,5
algorithm = bicubic
[quad_gantry_level]
gantry_corners =
-60,-10
410,420
points =
50,25
50,275
300,275
300,25
speed = 300
horizontal_move_z = 10
retries = 5
retry_tolerance = 0.0075
max_adjust = 10
[gcode_macro G32]
gcode =
SAVE_GCODE_STATE NAME=STATE_G32
G90
G28
QUAD_GANTRY_LEVEL
G28
G0 X175 Y175 Z30 F3600
RESTORE_GCODE_STATE NAME=STATE_G32
[firmware_retraction]
retract_speed = 60
unretract_extra_length = 0
unretract_speed = 60
retract_length = 0.5
[resonance_tester]
accel_chip_x = beacon
accel_chip_y = beacon
probe_points =
175,175,20
[tmc5160 stepper_x]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD6
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.022
diag1_pin = ^!x_diag_pin
driver_sgt = 0
[tmc5160 stepper_y]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD5
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.022
diag1_pin = ^!y_diag_pin
driver_sgt = 0
[tmc5160 stepper_z]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA15
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[tmc5160 stepper_z1]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA9
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z1]
step_pin = PB4
dir_pin = !z1_dir_pin
enable_pin = !PB5
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc5160 stepper_z2]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA10
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z2]
step_pin = PG15
dir_pin = !z2_dir_pin
enable_pin = !PG14
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc5160 stepper_z3]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD2
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z3]
step_pin = PG9
dir_pin = !z3_dir_pin
enable_pin = !PG13
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc2209 extruder]
stealthchop_threshold = 0
interpolate = False
uart_pin = toolboard_t0:PB5
run_current = 0.707
driver_tbl = 0
driver_toff = 4
driver_hend = 6
driver_hstrt = 7
sense_resistor = 0.11
[beacon]
serial = /dev/beacon
x_offset = 0
y_offset = 22.5
mesh_main_direction = x
mesh_runs = 1
speed = 15.
lift_speed = 80.
contact_max_hotend_temperature = 275
[delayed_gcode _BEACON_INIT]
initial_duration = 1
gcode =
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
{% set svv = printer.save_variables.variables %}
{% set nozzle_expansion_coefficient_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(0)|float %}
{% if nozzle_expansion_coefficient_multiplier == 0 %}
{% if printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier is not defined %}
{% set nozzle_expansion_coefficient_multiplier = 1.0 %}
{% else %}
{% set nozzle_expansion_coefficient_multiplier = printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier|default(1.0)|float %}
{% endif %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_multiplier VALUE={nozzle_expansion_coefficient_multiplier}
{% endif %}
{% if printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier is defined %}
CONSOLE_ECHO TITLE="Deprecated gcode variable" TYPE="warning" MSG={'"Please remove the variable beacon_contact_expansion_multiplier from your config file."'}
{% endif %}
[gcode_macro BEACON_RATOS_CALIBRATION]
gcode =
RATOS_ECHO MSG="Did you mean BEACON_RATOS_CALIBRATE?"
[gcode_macro BEACON_RATOS_CALIBRATE]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
BEACON_INITIAL_CALIBRATION _AUTOMATED=True
{% if beacon_contact_start_print_true_zero %}
BEACON_POKE_TEST _AUTOMATED=True
_BEACON_CHECK_POKE
{% if printer["dual_carriage"] is not defined %}
BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET _AUTOMATED=True
{% endif %}
{% endif %}
{% if chamber_temp > 0 %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
BEACON_FINAL_CALIBRATION _AUTOMATED=True BED_TEMP={bed_temp} CHAMBER_TEMP={chamber_temp}
{% if beacon_contact_start_print_true_zero %}
BEACON_MEASURE_GANTRY_TWIST
_BEACON_MAYBE_SCAN_COMPENSATION
{% endif %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% if chamber_temp > 0 %}
_CHAMBER_HEATER_OFF
{% endif %}
{% if beacon_contact_start_print_true_zero %}
{% if printer["dual_carriage"] is not defined %}
_BEACON_ECHO_NOZZLE_TEMP_OFFSETS
{% endif %}
_BEACON_ECHO_POKE
{% endif %}
RATOS_ECHO MSG="Beacon calibration finished!"
_LED_BEACON_CALIBRATION_END
RATOS_ECHO MSG="Saving config and restarting klipper..."
SAVE_CONFIG
[gcode_macro BEACON_INITIAL_CALIBRATION]
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed * 60 %}
MAYBE_HOME X=True Y=True
_LED_BEACON_CALIBRATION_START
G90
_MOVE_TO_SAFE_Z_HOME
BEACON_AUTO_CALIBRATE
_Z_HOP
RATOS_ECHO MSG="Initial beacon contact calibration finished!"
{% if not automated %}
_CONSOLE_SAVE_CONFIG
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro BEACON_FINAL_CALIBRATION]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
_BEACON_HOME_AND_ABL
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
_LED_BEACON_CALIBRATION_START
G90
G0 Z2 F{z_hop_speed}
RATOS_ECHO MSG="Waiting for calibration temperature..."
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=150
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp}
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} MAXIMUM={(bed_temp + 5)}
TEMPERATURE_WAIT SENSOR={'extruder' if default_toolhead == 0 else 'extruder1'} MINIMUM=150 MAXIMUM=155
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
_Z_HOP
BEACON_AUTO_CALIBRATE
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% endif %}
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_OFF
{% endif %}
_Z_HOP
RATOS_ECHO MSG="Final beacon contact calibration finished!"
{% if not automated %}
_CONSOLE_SAVE_CONFIG
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro BEACON_POKE_TEST]
variable_poke_result_1 = -1
variable_poke_result_2 = -1
variable_poke_result_3 = -1
variable_poke_result_4 = -1
variable_poke_result_5 = -1
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_1 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_2 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_3 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_4 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_5 VALUE=-1
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
G0 Z5 F{z_hop_speed}
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=1
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=2
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=3
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=4
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=5
_Z_HOP
RATOS_ECHO MSG="Beacon poke test finished!"
{% if not automated %}
_BEACON_ECHO_POKE
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro _BEACON_PROBE_POKE]
gcode =
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
BEACON_POKE speed=3 top=5 bottom={poke_bottom}
BEACON_QUERY
[gcode_macro _BEACON_STORE_POKE]
gcode =
{% set i = params.I|default(1)|int %}
{% set last_z = printer.beacon.last_poke_result|default(0)|float %}
{% if printer.beacon.last_poke_result|lower != "none" %}
{% if printer.beacon.last_poke_result.error == 0 %}
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE={"poke_result_%s" % i} VALUE={printer.beacon.last_poke_result.latency}
{% endif %}
{% endif %}
[gcode_macro _BEACON_CHECK_POKE]
gcode =
{% set p1 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_1|int %}
{% set p2 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_2|int %}
{% set p3 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_3|int %}
{% set p4 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_4|int %}
{% set p5 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_5|int %}
{% if p1 == -1 or p2 == -1 or p3 == -1 or p4 == -1 or p5 == -1 %}
_LED_BEACON_CALIBRATION_ERROR
{ action_raise_error("Beacon poke test error!") }
{% endif %}
{% set avg = (p1 + p2 + p3 + p4 + p5) / 5 %}
{% if avg > 6 %}
_LED_BEACON_CALIBRATION_ERROR
{ action_raise_error("Beacon poke test failed!") }
{% endif %}
[gcode_macro _BEACON_ECHO_POKE]
gcode =
{% set p1 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_1|int %}
{% set p2 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_2|int %}
{% set p3 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_3|int %}
{% set p4 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_4|int %}
{% set p5 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_5|int %}
{% set avg = (p1 + p2 + p3 + p4 + p5) / 5 %}
{% if avg <= 1 %}
{% set type = "success" %}
{% set note = "Extremely low noise, rarely achieved" %}
{% elif avg > 1 and avg <= 4 %}
{% set type = "info" %}
{% set note = "Excellent performance for a typical printer" %}
{% elif avg > 4 and avg <= 8 %}
{% set type = "warning" %}
{% set note = "Acceptable performance, machine may have considerable cyclic axis noise" %}
{% elif avg > 8 and avg <= 11 %}
{% set type = "alert" %}
{% set note = "Not ideal, may want to verify proper mounting or use thinner stackups" %}
{% elif avg > 11 %}
{% set type = "alert" %}
{% set note = "Reason for concern, present setup may be risky to continue with" %}
{% endif %}
CONSOLE_ECHO TITLE="Beacon poke test result:" TYPE={type} MSG={'"Average latency: %.2f_N_%s"' % (avg, note)}
[gcode_macro BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET]
variable_reference_z = 0.0
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set test_margin = 30 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero %}
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
RATOS_ECHO PREFIX="BEACON" MSG="Nozzle temperature offset calibration..."
{% for i in range(10) %}
beacon_poke speed=3 top=5 bottom={poke_bottom}
{% endfor %}
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=250
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET=0
{% if not automated %}
_BEACON_ECHO_NOZZLE_TEMP_OFFSETS
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
{% endif %}
[gcode_macro _BEACON_PROBE_NOZZLE_TEMP_OFFSET]
gcode =
{% set temp = params.TEMP|int %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set hotend_heat_soak_time = printer["gcode_macro RatOS"].hotend_heat_soak_time|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% set idex_zcontrolpoint = svv.idex_zcontrolpoint|default(150)|float %}
RATOS_ECHO PREFIX="BEACON" MSG="Waiting for nozzle to reach {temp}°C..."
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET={temp}
TEMPERATURE_WAIT SENSOR={"extruder" if default_toolhead == 0 else "extruder1"} MINIMUM={temp} MAXIMUM={temp + 2}
{% if hotend_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking hotend for {hotend_heat_soak_time} seconds..."
G4 P{(hotend_heat_soak_time * 1000)}
{% endif %}
RATOS_ECHO PREFIX="BEACON" MSG="Probing with nozzle temperature {temp}°C..."
PROBE PROBE_METHOD=contact PROBE_SPEED=3 LIFT_SPEED=15 SAMPLES=5 SAMPLE_RETRACT_DIST=3 SAMPLES_TOLERANCE=0.005 SAMPLES_TOLERANCE_RETRIES=10 SAMPLES_RESULT=median
BEACON_QUERY
G0 Z5 F{z_speed}
[gcode_macro _BEACON_STORE_NOZZLE_TEMP_OFFSET]
gcode =
{% set temp = params.TEMP|int %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% set last_z = printer.beacon.last_z_result|default(0)|float %}
{% if temp == 150 %}
SET_GCODE_VARIABLE MACRO=BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET VARIABLE=reference_z VALUE={last_z}
{% else %}
{% set reference_z = printer["gcode_macro BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET"].reference_z|default(0)|float %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_t{default_toolhead} VALUE={(last_z - reference_z)}
{% endif %}
[gcode_macro _BEACON_ECHO_NOZZLE_TEMP_OFFSETS]
gcode =
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% if default_toolhead == 0 %}
CONSOLE_ECHO TYPE="info" MSG={'"T0 expansion coefficient %.6f"' % svv.nozzle_expansion_coefficient_t0}
{% else %}
CONSOLE_ECHO TYPE="info" MSG={'"T1 expansion coefficient %.6f"' % svv.nozzle_expansion_coefficient_t1}
{% endif %}
[gcode_macro _BEACON_SET_NOZZLE_TEMP_OFFSET]
variable_runtime_temp = 0
gcode =
{% set toolhead = params.TOOLHEAD|default(0)|int %}
{% set reset = true if params.RESET|default(false)|lower == 'true' else false %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set svv = printer.save_variables.variables %}
{% if reset %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_applied_offset VALUE=0
{% else %}
{% if beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
{% set nozzle_expansion_coefficient_t0 = svv.nozzle_expansion_coefficient_t0|default(0)|float %}
{% if printer["dual_carriage"] is defined %}
{% set nozzle_expansion_coefficient_t1 = svv.nozzle_expansion_coefficient_t1|default(0)|float %}
{% endif %}
{% set nozzle_expansion_coefficient_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(1.0)|float %}
{% set applied_offset = svv.nozzle_expansion_applied_offset|default(0)|float %}
{% set temp = printer['extruder' if toolhead == 0 else 'extruder1'].target|float %}
{% set temp_offset = temp - beacon_contact_true_zero_temp %}
{% set expansion_coefficient = nozzle_expansion_coefficient_t0 if toolhead == 0 else nozzle_expansion_coefficient_t1 %}
{% set expansion_offset = nozzle_expansion_coefficient_multiplier * (temp_offset * (expansion_coefficient / 100)) %}
{% set new_offset = ((-applied_offset) + expansion_offset) %}
SET_GCODE_OFFSET Z_ADJUST={new_offset} MOVE=1 SPEED={z_speed}
SAVE_VARIABLE VARIABLE=nozzle_expansion_applied_offset VALUE={expansion_offset}
SET_GCODE_VARIABLE MACRO=_BEACON_SET_NOZZLE_TEMP_OFFSET VARIABLE=runtime_temp VALUE={temp}
RATOS_ECHO PREFIX="BEACON" MSG={'"Nozzle expansion offset of %.6fmm applied to T%s"' % (expansion_offset, toolhead)}
DEBUG_ECHO PREFIX="_BEACON_SET_NOZZLE_TEMP_OFFSET" MSG="multiplier: {nozzle_expansion_coefficient_multiplier}, coefficient: {expansion_coefficient}, temp_offset: {temp_offset}, expansion_offset: {expansion_offset}, applied_offset: {applied_offset}, new_offset: {new_offset}"
{% endif %}
{% endif %}
[gcode_macro BEACON_MEASURE_GANTRY_TWIST]
variable_needs_compensation = False
variable_reference_z = 0.0
variable_front = 0.0
variable_front_left = 0.0
variable_front_right = 0.0
variable_back = 0.0
variable_back_left = 0.0
variable_back_right = 0.0
variable_right = 0.0
variable_left = 0.0
variable_margin_x = 40
variable_margin_y = 40
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=False
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
RATOS_ECHO PREFIX="BEACON" MSG="Measure gantry twist..."
{% for i in range(10) %}
beacon_poke speed=3 top=5 bottom={poke_bottom}
{% endfor %}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="center"
G0 X{margin_x} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front_left"
G0 X{safe_home_x} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front"
G0 X{(printable_x_max - margin_x)} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front_right"
G0 X{(printable_x_max - margin_x)} Y{safe_home_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="right"
G0 X{(printable_x_max - margin_x)} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back_right"
G0 X{safe_home_x} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back"
G0 X{margin_x} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back_left"
G0 X{margin_x} Y{safe_home_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="left"
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
_BEACON_ECHO_GANTRY_TWIST
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro _BEACON_PROBE_GANTRY_TWIST]
gcode =
RATOS_ECHO PREFIX="BEACON" MSG="Probing..."
BEACON_OFFSET_COMPARE
BEACON_QUERY
[gcode_macro _BEACON_STORE_GANTRY_TWIST]
gcode =
{% set location = params.LOCATION|lower %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set last_z = printer.beacon.last_offset_result["delta"]|default(0)|float %}
{% if location == "center" %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=reference_z VALUE={last_z}
{% else %}
{% set reference_z = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].reference_z|default(0)|float %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE={location} VALUE={(last_z - reference_z)}
{% endif %}
[gcode_macro _BEACON_ECHO_GANTRY_TWIST]
gcode =
{% set reference_z = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].reference_z|default(0)|float * 1000 %}
{% set front_left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front_left|default(0)|float * 1000 %}
{% set front = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front|default(0)|float * 1000 %}
{% set front_right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front_right|default(0)|float * 1000 %}
{% set right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].right|default(0)|float * 1000 %}
{% set back_right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back_right|default(0)|float * 1000 %}
{% set back = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back|default(0)|float * 1000 %}
{% set back_left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back_left|default(0)|float * 1000 %}
{% set left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].left|default(0)|float * 1000 %}
{% set line_1 = "Front left: %.6fμm" % (front_left) %}
{% set line_2 = "Front center: %.6fμm" % (front) %}
{% set line_3 = "Front right: %.6fμm" % (front_right) %}
{% set line_4 = "Left center: %.6fμm" % (left) %}
{% set line_5 = "Right center: %.6fμm" % (right) %}
{% set line_6 = "Back left: %.6fμm" % (back_left) %}
{% set line_7 = "Back center: %.6fμm" % (back) %}
{% set line_8 = "Back right: %.6fμm" % (back_right) %}
{% set max_value = [(front_left|abs), (front|abs), (front_right|abs), (left|abs), (right|abs), (back_left|abs), (back|abs), (back_right|abs)]|max %}
{% if max_value <= 50 %}
{% set type = "success" %}
{% set recommendation = "Very low gantry twist: %.6fμm._N_No beacon scan compensation needed." % max_value %}
{% elif max_value > 50 and max_value <= 100 %}
{% set type = "info" %}
{% set recommendation = "Low gantry twist: %.6fμm._N_You may experience first layer inconsistensies, consider beacon scan compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 100 and max_value <= 150 %}
{% set type = "warning" %}
{% set recommendation = "High gantry twist: %.6fμm._N_High chance of first layer problems, beacon scan compensation is highly encouraged." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 150 and max_value <= 200 %}
{% set type = "alert" %}
{% set recommendation = "Very High gantry twist: %.6fμm._N_You will encounter first layer problems on large prints unless you activate beacon scan compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 200 %}
{% set type = "alert" %}
{% set recommendation = "Extremely high gantry twist: %.6fμm._N_You have significant scan/contact inconsistency which is indicative of mechanical problems, please investigate before resorting to software compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% endif %}
CONSOLE_ECHO TITLE="Gantry twist relative to the center" TYPE={type} MSG={'"_N_%s_N__N_%s_N_%s_N_%s_N_%s_N_%s_N_%s_N_%s_N_%s"' % (recommendation, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8)}
[gcode_macro BEACON_CREATE_SCAN_COMPENSATION_MESH]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set profile = params.PROFILE|default("Contact")|string %}
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_scan_compensation_enable = true if printer["gcode_macro RatOS"].beacon_scan_compensation_enable|default(false)|lower == 'true' else false %}
{% set probe_count = printer["gcode_macro RatOS"].beacon_scan_compensation_probe_count %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% if not beacon_scan_compensation_enable %}
RATOS_ECHO MSG="Beacon scan compensation is disabled!"
{% else %}
MAYBE_HOME
_MOVE_TO_SAFE_Z_HOME
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_LED_BEACON_CALIBRATION_START
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=150
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp}
RATOS_ECHO MSG="Please wait..."
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} MAXIMUM={(bed_temp + 5)}
TEMPERATURE_WAIT SENSOR={'extruder' if default_toolhead == 0 else 'extruder1'} MINIMUM=150 MAXIMUM=155
{% endif %}
{% if not automated %}
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
{% endif %}
{% if printer.z_tilt is defined %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% endif %}
{% if printer.quad_gantry_level is defined %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% endif %}
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES=2 SAMPLES_DROP=1 SAMPLES_TOLERANCE_RETRIES=10 PROBE_COUNT={probe_count[0]},{probe_count[1]} PROFILE={profile}
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% endif %}
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_OFF
{% endif %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
RATOS_ECHO MSG="Beacon scan compensation mesh created!"
{% if not automated %}
RATOS_ECHO MSG="Saving config and restarting klipper..."
SAVE_CONFIG
{% endif %}
{% endif %}
[gcode_macro _BEACON_APPLY_SCAN_COMPENSATION]
gcode =
{% set beacon_scan_compensation_profile = printer["gcode_macro RatOS"].beacon_scan_compensation_profile %}
{% set beacon_scan_compensation_enable = true if printer["gcode_macro RatOS"].beacon_scan_compensation_enable|default(false)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_SCAN_COMPENSATION" MSG="beacon_scan_compensation_profile {beacon_scan_compensation_profile}, beacon_scan_compensation_enable {beacon_scan_compensation_enable}"
{% if beacon_scan_compensation_enable %}
BEACON_APPLY_SCAN_COMPENSATION PROFILE={beacon_scan_compensation_profile}
{% endif %}
[gcode_macro _BEACON_MAYBE_SCAN_COMPENSATION]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set needs_scan_compensation = true if printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].needs_compensation|default(false)|lower == 'true' else false %}
{% if needs_scan_compensation %}
BEACON_CREATE_SCAN_COMPENSATION_MESH _AUTOMATED=True BED_TEMP={bed_temp} CHAMBER_TEMP={chamber_temp}
{% endif %}
[gcode_macro _BEACON_HOME_AND_ABL]
gcode =
MAYBE_HOME X=True Y=True
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% set needs_rehoming = False %}
{% if printer.z_tilt is defined and not printer.z_tilt.applied %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% set needs_rehoming = True %}
{% endif %}
{% if printer.quad_gantry_level is defined and not printer.quad_gantry_level.applied %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% set needs_rehoming = True %}
{% endif %}
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% if needs_rehoming %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% endif %}
[gcode_macro _BEACON_SAVE_MULTIPLIER]
gcode =
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set multiplier = printer["gcode_macro _BEACON_APPLY_RUNTIME_MULTIPLIER"].runtime_multiplier|default(-1.0)|float %}
DEBUG_ECHO PREFIX="_BEACON_SAVE_MULTIPLIER" MSG="multiplier: {multiplier}, beacon_contact_start_print_true_zero: {beacon_contact_start_print_true_zero}, beacon_contact_expansion_compensation: {beacon_contact_expansion_compensation}"
{% if multiplier > 0 and beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_multiplier VALUE={multiplier}
SET_GCODE_VARIABLE MACRO=_BEACON_APPLY_RUNTIME_MULTIPLIER VARIABLE=runtime_multiplier VALUE=-1.0
CONSOLE_ECHO TITLE="Hotend thermal expansion compensation" TYPE="success" MSG={'"New value is: %.6f_N_The new multiplier value has been saved to the configuration."' % multiplier}
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _BEACON_APPLY_RUNTIME_MULTIPLIER]
variable_runtime_multiplier = -1.0
gcode =
{% set toolhead = 0 %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set toolhead = 1 if idex_mode == 'primary' else 0 %}
{% endif %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set layer_number = printer["gcode_macro _ON_LAYER_CHANGE"].layer_number|default(0)|int %}
{% set is_printing_gcode = true if printer["gcode_macro START_PRINT"].is_printing_gcode|default(true)|lower == 'true' else false %}
{% if layer_number == 0 and is_printing_gcode %}
{% set link_url = "https://os.ratrig.com/docs/slicers" %}
{% set link_text = "RatOS Slicer Documentation" %}
{% set line_1 = '"Your slicer is not correctly reporting layer information. See the layer change custom g-code in the %s".' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="Missing layer information" TYPE="warning" MSG={line_1}
{% endif %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_RUNTIME_MULTIPLIER" MSG="layer_number: {layer_number}, is_printing_gcode: {is_printing_gcode}, beacon_contact_start_print_true_zero: {beacon_contact_start_print_true_zero}, beacon_contact_expansion_compensation: {beacon_contact_expansion_compensation}"
{% if layer_number == 1 and is_printing_gcode and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
{% set svv = printer.save_variables.variables %}
{% set nozzle_expansion_coefficient = svv.nozzle_expansion_coefficient_t0|default(0)|float %}
{% if toolhead == 1 %}
{% set nozzle_expansion_coefficient = svv.nozzle_expansion_coefficient_t1|default(0)|float %}
{% endif %}
{% set beacon_contact_expansion_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(1.0)|float %}
{% set print_temp = printer["gcode_macro _BEACON_SET_NOZZLE_TEMP_OFFSET"].runtime_temp|default(0)|int %}
{% if print_temp > 0 %}
{% set z_offset = printer.gcode_move.homing_origin.z|float %}
{% set temp_delta = print_temp - beacon_contact_true_zero_temp %}
{% set coefficient_per_degree = nozzle_expansion_coefficient / 100 %}
{% set z_offset_per_degree = z_offset / temp_delta %}
{% set new_multiplier = z_offset_per_degree / coefficient_per_degree %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_RUNTIME_MULTIPLIER" MSG="print_temp: {print_temp}, z_offset: {z_offset}, temp_delta: {temp_delta}, nozzle_expansion_coefficient: {nozzle_expansion_coefficient}, coefficient_per_degree: {coefficient_per_degree}, z_offset_per_degree: {z_offset_per_degree}, old_multiplier: {beacon_contact_expansion_multiplier}, new_multiplier: {new_multiplier}"
SET_GCODE_VARIABLE MACRO=_BEACON_APPLY_RUNTIME_MULTIPLIER VARIABLE=runtime_multiplier VALUE={new_multiplier}
{% endif %}
{% endif %}
[gcode_macro T0]
variable_join = 0
variable_remap = 0
variable_alert = ""
variable_filament_name = ""
variable_filament_type = ""
variable_filament_temp = 0
variable_runout_sensor = ""
variable_active = True
variable_color = "7bff33"
variable_hotend_type = "SF"
variable_has_cht_nozzle = True
variable_cooling_position_to_nozzle_distance = 40
variable_tooolhead_sensor_to_extruder_gear_distance = 15
variable_extruder_gear_to_cooling_position_distance = 30
variable_filament_loading_nozzle_offset = -5
variable_filament_grabbing_length = 5
variable_filament_grabbing_speed = 1
variable_enable_insert_detection = True
variable_enable_runout_detection = True
variable_enable_clog_detection = True
variable_unload_after_runout = True
variable_purge_after_load = 0
variable_purge_before_unload = 0
variable_extruder_load_speed = 60
variable_filament_load_speed = 10
variable_standby = False
variable_temperature_offset = 0
variable_has_oozeguard = False
variable_has_front_arm_nozzle_wiper = False
variable_resume_after_insert = False
gcode =
{% set x = params.X|default(-1.0)|float %}
{% set y = params.Y|default(-1.0)|float %}
{% set z = params.Z|default(0.0)|float %}
{% set s = params.S|default(1)|int %}
{% if printer["gcode_macro _SELECT_TOOL"] is defined %}
_SELECT_TOOL T=0 X={x} Y={y} Z={z} TOOLSHIFT={s}
{% endif %}
[save_variables]
filename = /home/pi/printer_data/config/ratos-variables.cfg
=======================
Extruder max_extrude_ratio=0.415752
mcu 'mcu': Starting serial connect
webhooks client 4120164168: New connection
webhooks client 4120164168: Client info {'program': 'Moonraker', 'version': 'v0.9.3-0-g71f9e67'}
mcu 'mcu': got {'count': 309, 'sum': 257571, 'sumsq': 1275523, '#name': 'stats', '#sent_time': 427.771190078, '#receive_time': 427.815390004}
Loaded MCU 'mcu' 118 commands (v0.12.0-396-gb7233d119 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34)
MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 BUS_PINS_i2c3_PA8_PC9=PA8,PC9 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h723xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1
mcu 'rpi': Starting connect
Loaded MCU 'rpi' 119 commands (?-20240727_132503-fv-az659-741 / gcc: (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110 binutils: (GNU Binutils for Raspbian) 2.35.2)
MCU 'rpi' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256
mcu 'toolboard_t0': Starting serial connect
Loaded MCU 'toolboard_t0' 100 commands (v0.12.0-396-gb7233d119 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34)
MCU 'toolboard_t0' config: ADC_MAX=4095 BUS_PINS_i2c1=PB6,PB7 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB7=PB8,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c1_PF1_PF0=PF1,PF0 BUS_PINS_i2c1a=PF1,PF0 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 CLOCK_FREQ=48000000 MCU=stm32f042x6 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PF0,PF1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1
mcu_temperature 'mcu' nominal base=-275.577689 slope=1631.474104
mcu_temperature 'toolboard_t0' nominal base=342.920354 slope=-724.778761
mcu 'beacon': Starting serial connect
Loaded MCU 'beacon' 45 commands (Beacon 2.1.0 / )
MCU 'beacon' config: ADC_MAX=4095 BEACON_ACCEL_BITS=12 BEACON_ACCEL_SCALE_16G=7.81 BEACON_ACCEL_SCALE_2G=0.98 BEACON_ACCEL_SCALE_4G=1.95 BEACON_ACCEL_SCALE_8G=3.91 BEACON_ADC_SMOOTH_COUNT=16 BEACON_HAS_ACCEL=1 BEACON_REV=H CLOCK_FREQ=32000000 MCU=beacon STATS_SUMSQ_BASE=256
Config error
Traceback (most recent call last):
File "/home/pi/klipper/klippy/klippy.py", line 135, in _connect
cb()
File "/home/pi/klipper/klippy/mcu.py", line 748, in _connect
self._send_config(None)
File "/home/pi/klipper/klippy/mcu.py", line 679, in _send_config
cb()
File "/home/pi/klipper/klippy/mcu.py", line 456, in _build_config
raise pins.error("shutdown value must be 0.0 or 1.0 on soft pwm")
pins.error: shutdown value must be 0.0 or 1.0 on soft pwm
webhooks client 4120164168: Disconnected
Starting Klippy...
Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock']
Git version: 'v0.12.0-396-gb7233d119-dirty'
Untracked files: klippy/extras/beacon.py, klippy/extras/gcode_shell_command.py, klippy/extras/linear_movement_vibrations.py, klippy/extras/ratos.py, klippy/extras/ratos_homing.py, klippy/extras/resonance_generator.py, klippy/extras/z_offset_probe.py, klippy/kinematics/ratos_hybrid_corexy.py
Branch: master
Remote: origin
Tracked URL: https://github.com/Klipper3d/klipper.git
CPU: 4 core ?
Python: '3.9.2 (default, Mar 20 2025, 22:21:41) \n[GCC 10.2.1 20210110]'
Start printer at Sun May 25 00:16:39 2025 (1748128599.7 21.6)
===== Config file =====
[mcu rpi]
serial = /tmp/klipper_host_mcu
[board_pins btt-kraken]
aliases =
x_step_pin=PC14,
x_dir_pin=PC13,
x_enable_pin=PE6,
x_uart_pin=PD6,
x_diag_pin=PC15,
x_endstop_pin=PC15,
y_step_pin=PE5,
y_dir_pin=PE4,
y_enable_pin=PE3,
y_uart_pin=PD6,
y_diag_pin=PF0,
y_endstop_pin=PF0,
z0_step_pin=PG11,
z0_dir_pin=PD7,
z0_enable_pin=PG12,
z0_uart_pin=PA15,
z0_diag_pin=PF4,
z1_step_pin=PB4,
z1_dir_pin=PB3,
z1_enable_pin=PB5,
z1_uart_pin=PA9,
z1_diag_pin=PF10,
z2_step_pin=PG15,
z2_dir_pin=PB6,
z2_enable_pin=PG14,
z2_uart_pin=PA10,
z2_diag_pin=PC0,
z3_step_pin=PG9,
z3_dir_pin=PG10,
z3_enable_pin=PG13,
z3_uart_pin=PD2,
z3_diag_pin=PF3,
e_step_pin=PG9,
e_dir_pin=PG10,
e_enable_pin=PG13,
e_uart_pin=PD2,
e_diag_pin=PF1,
e_heater_pin=PF6,
e_sensor_pin=PB1,
stepper_spi_mosi_pin=PC8,
stepper_spi_miso_pin=PC7,
stepper_spi_sclk_pin=PC6,
adxl345_cs_pin=PE10,
bltouch_sensor_pin=PG1,
bltouch_control_pin=PE9,
probe_pin=PG1,
fan_part_cooling_pin=PA0,
fan_toolhead_cooling_pin=PA1,
fan_controller_board_pin=PA2,
heater_bed_heating_pin=PF5,
heater_bed_sensor_pin=PB0,
4p_fan_part_cooling_pin=PA6,
4p_fan_part_cooling_tach_pin=PC1,
4p_toolhead_cooling_pin=PE8,
4p_toolhead_cooling_tach_pin=PG0,
4p_controller_board_pin=PE8,
4p_controller_board_tach_pin=PG0
[mcu]
serial = /dev/RatOS/btt-kraken
[temperature_sensor Kraken]
sensor_type = temperature_mcu
[adxl345 controlboard]
cs_pin = PE10
spi_software_mosi_pin = PE14
spi_software_miso_pin = PE13
spi_software_sclk_pin = PE12
[board_pins toolboard_t0]
mcu = toolboard_t0
aliases =
e_step_pin=PB7,
e_dir_pin=PB6,
e_enable_pin=PB4,
e_uart_pin=PB5,
e_heater_pin=PA0,
e_sensor_pin=PA3,
stepper_spi_mosi_pin=null,
stepper_spi_miso_pin=null,
stepper_spi_sclk_pin=null,
adxl345_cs_pin=PA4,
bltouch_sensor_pin=PA15,
bltouch_control_pin=PB3,
probe_pin=PA15,
fan_part_cooling_pin=PA10,
fan_toolhead_cooling_pin=PA9,
fan_controller_board_pin=null,
heater_bed_heating_pin=null,
heater_bed_sensor_pin=null,
4p_fan_part_cooling_pin=null,
4p_fan_part_cooling_tach_pin=null,
4p_toolhead_cooling_pin=null,
4p_toolhead_cooling_tach_pin=null,
4p_controller_board_pin=null,
4p_controller_board_tach_pin=null
[mcu toolboard_t0]
serial = /dev/RatOS/ldo-orbitool-o2-t0
[temperature_sensor Orbitool_O2_T0]
sensor_type = temperature_mcu
sensor_mcu = toolboard_t0
[lis2dw toolboard_t0]
axes_map = x, z, y
cs_pin = toolboard_t0:PA4
spi_bus = spi1
[extruder]
max_power = 0.995
rotation_distance = 4.63
full_steps_per_rotation = 200
filament_diameter = 1.750
max_extrude_only_velocity = 60
max_extrude_only_distance = 200
nozzle_diameter = 0.5
heater_pin = toolboard_t0:PA0
sensor_type = PT1000
pullup_resistor = 2200
sensor_pin = toolboard_t0:PA3
min_extrude_temp = 170
min_temp = 0
max_temp = 285
pressure_advance = 0.05
step_pin = toolboard_t0:PB7
dir_pin = !toolboard_t0:e_dir_pin
enable_pin = !toolboard_t0:PB4
microsteps = 64
control = pid
pid_kp = 21.673
pid_ki = 1.338
pid_kd = 87.776
[adc_temperature hotend_power_scale]
temperature1 = 119
voltage1 = 1.91
temperature2 = 239
voltage2 = 3.82
[fan]
max_power = 0.995
shutdown_speed = 1.0
pin = PA6
cycle_time = 0.00004
tachometer_pin = ^PC1
tachometer_poll_interval = 0.0005
[heater_fan toolhead_cooling_fan]
max_power = 0.995
cycle_time = 0.0001
shutdown_speed = 0
pin = PA1
fan_speed = 1
heater = extruder
[output_pin O2_RUN_LED]
pin = toolboard_t0:PB8
shutdown_value = 0
value = 1
[temperature_sensor hotend_power_draw]
sensor_pin = toolboard_t0:PA2
sensor_type = hotend_power_scale
[gcode_macro RatOS]
variable_homing = "endstops"
variable_z_probe = "static"
variable_sensorless_x_current = 0.49699999999999994
variable_sensorless_y_current = 0.7242
variable_safe_home_x = "middle"
variable_safe_home_y = "middle"
variable_driver_type_x = "tmc2209"
variable_driver_type_y = "tmc2209"
variable_stowable_probe_stop_on_error = False
variable_chamber_filter_enable = True
variable_chamber_filter_speed = 0.5
variable_chamber_filter_disable_speed = 1.0
variable_chamber_filter_enable_at = "after_print_start"
variable_chamber_filter_disable_period = 300
variable_chamber_filter_disable_bed_temp = 0
variable_chamber_heater_enable = True
variable_chamber_heater_bed_temp = 115
variable_chamber_heater_preheating_temp = 150
variable_chamber_heater_heating_temp_offset = 25
variable_chamber_heater_control_external_heater = False
variable_chamber_heater_air_circulation_enable = True
variable_chamber_heater_air_circulation_fan_speed = 0.35
variable_chamber_heater_air_circulation_y_pos = 0
variable_chamber_heater_air_circulation_z_pos = 100
variable_chamber_heater_extra_fan_speed = 1.0
variable_chamber_heater_filter_fan_speed = 1.0
variable_led_status_action = 0.0,1.0,1.0
variable_led_status_success = 0.0,1.0,0.0
variable_led_status_error = 1.0,0.0,1.0
variable_led_status_on = 1.0,1.0,1.0
variable_led_status_off = 0.0,0.0,1.0
variable_led_status_standby = 0.1,0.1,0.1
variable_led_status_heating = 1.0,0.0,0.0
variable_led_status_cooling = 0.0,0.0,1.0
variable_calibrate_bed_mesh = True
variable_adaptive_mesh = True
variable_start_print_park_in = "front"
variable_start_print_park_z_height = 50
variable_end_print_park_in = "back"
variable_pause_print_park_in = "front"
variable_end_print_park_z_hop = 20
variable_nozzle_priming = "primeblob"
variable_nozzle_prime_start_x = "max"
variable_nozzle_prime_start_y = "min"
variable_nozzle_prime_direction = "auto"
variable_nozzle_prime_bridge_fan = 102
variable_probe_for_priming_result = None
variable_probe_for_priming_end_result = None
variable_probe_for_priming_result_t1 = None
variable_probe_for_priming_end_result_t1 = None
variable_probe_for_priming_disable_mesh_constraints = False
variable_adaptive_prime_offset_threshold = -1.0
variable_last_z_offset = None
variable_runout_park_in = "front"
variable_enable_unload_tip_forming = False
variable_filament_unload_length = 150
description = RatOS variable storage macro, will echo variables to the console when run.
variable_relative_extrusion = False
variable_force_absolute_position = False
variable_preheat_extruder = True
variable_preheat_extruder_temp = 150
variable_macro_travel_speed = 300
variable_macro_travel_accel = 3000
variable_macro_z_speed = 15
variable_bed_margin_x = [0, 0]
variable_bed_margin_y = [0, 0]
variable_printable_x_min = 0
variable_printable_x_max = 0
variable_printable_y_min = 0
variable_printable_y_max = 0
variable_end_print_motors_off = True
variable_status_color_ok = "00FF00"
variable_status_color_error = "FF0000"
variable_status_color_unknown = "FFFF00"
variable_end_print_retract_filament = 10
gcode =
ECHO_RATOS_VARS
variable_beacon_bed_mesh_scv = 25
variable_beacon_contact_z_homing = False
variable_beacon_contact_start_print_true_zero = True
variable_beacon_contact_wipe_before_true_zero = True
variable_beacon_contact_true_zero_temp = 150
variable_beacon_contact_prime_probing = True
variable_beacon_contact_expansion_compensation = True
variable_beacon_contact_bed_mesh = False
variable_beacon_contact_bed_mesh_samples = 2
variable_beacon_contact_z_tilt_adjust = False
variable_beacon_contact_z_tilt_adjust_samples = 2
variable_beacon_scan_compensation_enable = False
variable_beacon_scan_compensation_profile = "Contact"
variable_beacon_scan_compensation_probe_count = 15,15
variable_beacon_contact_poke_bottom_limit = -1
variable_homing_x = "sensorless"
variable_homing_y = "sensorless"
variable_x_driver_types = ["tmc5160"]
variable_x_axes = ["x"]
variable_y_driver_types = ["tmc5160"]
variable_y_axes = ["y"]
variable_z_driver_types = ["tmc5160", "tmc5160", "tmc5160", "tmc5160"]
variable_z_axes = ["z", "z1", "z2", "z3"]
[ratos_homing]
axes = xyz
z_hop = 15
z_hop_speed = 15
gcode =
_LED_ON
{% set prev_stop_on_error = printer["gcode_macro RatOS"].stowable_probe_stop_on_error %}
{% if printer["dual_carriage"] is defined %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set target_idex_mode = printer["dual_carriage"].carriage_1|lower %}
_IDEX_SINGLE
_SELECT_TOOL T={default_toolhead} TOOLSHIFT=false
{% endif %}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE=True
M400
G90
{% set X = true if params.X is defined else false %}
{% set Y = true if params.Y is defined else false %}
{% set Z = true if params.Z is defined else false %}
{% if printer["gcode_macro RatOS"].home_y_first|default(false)|lower == 'true' %}
HOME_Y X={X} Y={Y} Z={Z}
HOME_X X={X} Y={Y} Z={Z}
{% else %}
HOME_X X={X} Y={Y} Z={Z}
HOME_Y X={X} Y={Y} Z={Z}
{% endif %}
HOME_Z X={X} Y={Y} Z={Z}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE={prev_stop_on_error}
{% if printer["dual_carriage"] is defined %}
{% if target_idex_mode == "copy" %}
_IDEX_COPY
{% elif target_idex_mode == "mirror" %}
_IDEX_MIRROR
{% endif %}
{% endif %}
[gcode_macro HOME_X]
gcode =
{% set x_homed = 'x' in printer.toolhead.homed_axes %}
{% set homing = printer["gcode_macro RatOS"].homing|lower %}
{% set homing_x = printer["gcode_macro RatOS"].homing_x|lower %}
{% set homing_x = homing_x if homing_x else homing %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_X" MSG="printable_x_max: {printable_x_max}, safe_home_x: {safe_home_x}, axis_maximum.x: {printer.toolhead.axis_maximum.x}, bed_margin_x: {printer['gcode_macro RatOS'].bed_margin_x}"
{% if X or not Y and not Z %}
{% if homing_x == 'endstop' %}
G28 X
{% elif homing_x == 'sensorless' %}
{% if printer["dual_carriage"] is defined %}
{ action_emergency_stop("sensorless homing not supported on IDEX!") }
{% endif %}
HOME_X_SENSORLESS
{% else %}
{ action_emergency_stop("expected RatOS variable_homing_x to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_x, homing)) }
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set parking_position = printer["gcode_macro T%s" % (0 if default_toolhead==1 else 1)].parking_position|float %}
SET_DUAL_CARRIAGE CARRIAGE={0 if default_toolhead==1 else 1} MODE=PRIMARY
G1 X{parking_position} F{speed}
SET_DUAL_CARRIAGE CARRIAGE={default_toolhead} MODE=PRIMARY
{% endif %}
{% set x_homed = True %}
G0 X{safe_home_x} F{speed}
M400
{% endif %}
[gcode_macro HOME_Y]
gcode =
{% set y_homed = 'y' in printer.toolhead.homed_axes %}
{% set homing = printer["gcode_macro RatOS"].homing|lower %}
{% set homing_y = printer["gcode_macro RatOS"].homing_y|lower %}
{% set homing_y = homing_y if homing_y else homing %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_Y" MSG="printable_y_max: {printable_y_max}, safe_home_y: {safe_home_y}, axis_maximum.y: {printer.toolhead.axis_maximum.y}, bed_margin_y: {printer['gcode_macro RatOS'].bed_margin_y}"
{% if Y or not X and not Z %}
{% if homing_y == 'endstop' %}
G28 Y
{% elif homing_y == 'sensorless' %}
HOME_Y_SENSORLESS
{% else %}
{ action_emergency_stop("expected RatOS variable_homing_y to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_y, homing)) }
{% endif %}
{% set y_homed = True %}
G0 Y{safe_home_y} F{speed}
{% endif %}
[gcode_macro HOME_Z]
gcode =
{% set x_homed = 'x' in printer.toolhead.homed_axes %}
{% set y_homed = 'y' in printer.toolhead.homed_axes %}
{% set z_probe = printer["gcode_macro RatOS"].z_probe %}
{% set beacon_contact_z_homing = true if printer["gcode_macro RatOS"].beacon_contact_z_homing|default(false)|lower == 'true' else false %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_Z" MSG="x_homed: {x_homed}, y_homed: {y_homed}, z_probe: {z_probe}, beacon_contact_z_homing: {beacon_contact_z_homing}"
{% if Z or not Y and not X %}
RATOS_ECHO MSG="Homing Z"
{% if x_homed == False or y_homed == False %}
{ action_emergency_stop("X and Y must be homed before homing Z") }
{% else %}
{% if z_probe == "stowable" %}
DEPLOY_PROBE
_MOVE_TO_SAFE_Z_HOME
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_homing %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% else %}
G28 Z
{% endif %}
_Z_HOP
STOW_PROBE
{% else %}
_MOVE_TO_SAFE_Z_HOME
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_homing %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% else %}
G28 Z
{% endif %}
_Z_HOP
{% endif %}
{% endif %}
{% endif %}
[gcode_macro HOME_X_SENSORLESS]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="home_x_sensorless"
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
M204 S1000
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endif %}
G4 P300
G28 X
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].x_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].y_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current}
{% endif %}
G4 P300
RESTORE_TOOLHEAD_SETTINGS KEY="home_x_sensorless"
[gcode_macro HOME_Y_SENSORLESS]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="home_y_sensorless"
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
M204 S1000
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endif %}
G4 P300
G28 Y
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].x_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].y_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current}
{% endif %}
G4 P300
RESTORE_TOOLHEAD_SETTINGS KEY="home_y_sensorless"
[gcode_macro _Z_HOP]
description = Move Z axis up by Z_HOP distance at Z_HOP_SPEED. In relative mode it will move Z axis up by Z_HOP distance. In absolute mode it will move Z axis to Z_HOP distance.
gcode =
{% set z_hop = printer.configfile.config.ratos_homing.z_hop|float %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
G0 Z{z_hop} F{z_hop_speed}
[gcode_macro _MOVE_TO_SAFE_Z_HOME]
description = Move to safe home position with optional Z_HOP (pass Z_HOP=True as parameter)
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% if params.Z_HOP is defined %}
_Z_HOP
{% endif %}
DEBUG_ECHO PREFIX="_MOVE_TO_SAFE_Z_HOME" MSG="axis_maximum.x: {printer.toolhead.axis_maximum.x}, axis_maximum.y: {printer.toolhead.axis_maximum.y}, bed_margin_x: {printer['gcode_macro RatOS'].bed_margin_x}, bed_margin_y: {printer['gcode_macro RatOS'].bed_margin_y}, safe_home_x: {safe_home_x}, safe_home_y: {safe_home_y}, printable_x_max: {printable_x_max}, printable_y_max: {printable_y_max}"
G0 X{safe_home_x} Y{safe_home_y} F{speed}
[gcode_macro MAYBE_HOME]
description = Only home unhomed axis
variable_is_kinematic_position_overriden = False
gcode =
{% if printer["gcode_macro MAYBE_HOME"].is_kinematic_position_overriden|lower == 'true' %}
RATOS_ECHO MSG="SET_CENTER_KINEMATIC_POSITION has been abused. Homing all axes. Please refrain from using SET_CENTER_KINEMATIC_POSITION outside of debugging purposes."
G28
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=False
{% else %}
{% set axes = '' %}
{% set isHomed = true %}
{% set axesToHome = '' %}
{% if params.X is defined %}
{% set axes = axes ~ 'X ' %}
{% if 'x' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'X ' %}
{% endif %}
{% endif %}
{% if params.Y is defined %}
{% set axes = axes ~ 'Y ' %}
{% if 'y' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Y ' %}
{% endif %}
{% endif %}
{% if params.Z is defined %}
{% set axes = axes ~ 'Z ' %}
{% if 'z' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Z ' %}
{% endif %}
{% endif %}
{% if params.X is not defined and params.Y is not defined and params.Z is not defined %}
{% set axes = '' %}
{% if 'x' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'X ' %}
{% endif %}
{% if 'y' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Y ' %}
{% endif %}
{% if 'z' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Z ' %}
{% endif %}
{% endif %}
{% if isHomed is false %}
RATOS_ECHO MSG="Homing {axesToHome}"
G28 {axesToHome}
{% else %}
RATOS_ECHO MSG="All requested axes already homed, skipping.."
{% endif %}
{% endif %}
[gcode_macro PID_CALIBRATE_HOTEND]
description = Perform a PID calibration test for a given extruder heater.
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set temp = params.TEMP|default(220)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_HOTEND" MSG="TEMP={temp}"
{% if printer["dual_carriage"] is not defined %}
RATOS_ECHO MSG="PID calibration hotend heater T0 at {temp}°C..."
PID_CALIBRATE HEATER=extruder TARGET={temp}
_CONSOLE_SAVE_CONFIG
{% else %}
{% if toolhead==0 or toolhead==1 %}
RATOS_ECHO MSG="PID calibration hotend heater T{toolhead} at {temp}°C..."
PID_CALIBRATE HEATER=extruder{'' if toolhead==0 else toolhead} TARGET={temp}
_CONSOLE_SAVE_CONFIG
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
_LEARN_MORE_CALIBRATION
[gcode_macro PID_CALIBRATE_BED]
description = Perform a PID calibration test for the bed heater.
gcode =
{% set temp = params.TEMP|default(80)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_BED" MSG="TEMP={temp}"
RATOS_ECHO MSG="PID calibration bed heater at {temp}°C..."
PID_CALIBRATE HEATER=heater_bed TARGET={temp}
_CONSOLE_SAVE_CONFIG
_LEARN_MORE_CALIBRATION
[gcode_macro PID_CALIBRATE_CHAMBER_HEATER]
description = Perform a PID calibration test for the chamber heater.
gcode =
{% set temp = params.TEMP|default(150)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_CHAMBER_HEATER" MSG="TEMP={temp}"
{% if printer["heater_generic chamber_heater"] is defined %}
RATOS_ECHO MSG="PID calibration chamber heater at {temp}°C..."
PID_CALIBRATE HEATER=chamber_heater TARGET={temp}
_CONSOLE_SAVE_CONFIG
_LEARN_MORE_CALIBRATION
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_heater" %}
{% set link_text = "RatOS Chamber Heater" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber heater found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro INITIALIZE_PA_TUNING]
description = Start a pressure advance tuning tower.
gcode =
{% set start = params.START|default(0.0)|float %}
{% set factor = params.FACTOR|default(0.001)|float %}
{% set layer_number = printer["gcode_macro _ON_LAYER_CHANGE"].layer_number|default(0)|int %}
{% set is_printing_gcode = true if printer["gcode_macro START_PRINT"].is_printing_gcode|default(true)|lower == 'true' else false %}
{% if is_printing_gcode and layer_number < 2 %}
DEBUG_ECHO PREFIX="START_PA_TOWER" MSG="START: {start}, FACTOR: {factor}"
RATOS_ECHO MSG="Starting presssure advance tuning tower..."
TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START={start} FACTOR={factor}
{% endif %}
_LEARN_MORE_CALIBRATION
[gcode_macro CHAMBER_FILTER_ON]
gcode =
{% if printer["fan_generic filter"] is defined %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Activating chamber filter..."
_CHAMBER_FILTER_TURN_ON
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber filter found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro CHAMBER_FILTER_OFF]
gcode =
{% if printer["fan_generic filter"] is defined %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Deactivating chamber filter..."
_CHAMBER_FILTER_TURN_OFF
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber filter found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro _CHAMBER_FILTER_ON]
gcode =
{% set at = params.AT|default('')|lower %}
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set chamber_filter_enable_at = printer["gcode_macro RatOS"].chamber_filter_enable_at|default('after_print_start')|lower %}
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_ON" MSG="at: {at}, chamber_filter_enable: {chamber_filter_enable}, chamber_filter_enable_at: {chamber_filter_enable_at}, chamber_filter_speed: {chamber_filter_speed}"
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if chamber_filter_enable_at == at %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Activating chamber filter..."
_CHAMBER_FILTER_TURN_ON AT={at}
{% if chamber_filter_enable_at == "print_end" %}
_LED_CHAMBER_FILTER_ON
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _CHAMBER_FILTER_OFF]
gcode =
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set filter_disable_period = printer["gcode_macro RatOS"].chamber_filter_disable_period|default(0)|int %}
{% set filter_disable_bed_temp = printer["gcode_macro RatOS"].chamber_filter_disable_bed_temp|default(0)|int %}
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_OFF" MSG="chamber_filter_enable: {chamber_filter_enable}, filter_disable_period: {filter_disable_period}, filter_disable_bed_temp: {filter_disable_bed_temp}"
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if filter_disable_period > 0 %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Waiting {filter_disable_period} seconds before turning chamber filter off..."
UPDATE_DELAYED_GCODE ID=_CHAMBER_FILTER_OFF_TIMER DURATION={filter_disable_period}
{% endif %}
{% if filter_disable_bed_temp > 0 %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Waiting for bed temp to cool down to {filter_disable_bed_temp}°C to turn filter off..."
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM=0 MAXIMUM={filter_disable_bed_temp}
_CHAMBER_FILTER_TURN_OFF
_LED_CHAMBER_FILTER_OFF
{% endif %}
{% endif %}
[delayed_gcode _CHAMBER_FILTER_OFF_TIMER]
gcode =
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_OFF_TIMER" MSG="executed"
_CHAMBER_FILTER_TURN_OFF
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Chamber filter turned off!"
_LED_CHAMBER_FILTER_OFF
[gcode_macro _CHAMBER_FILTER_TURN_ON]
gcode =
{% set at = params.AT|default('')|lower %}
{% set chamber_filter_speed = printer["gcode_macro RatOS"].chamber_filter_speed|default(0)|float %}
{% if at == "print_end" %}
{% set chamber_filter_speed = printer["gcode_macro RatOS"].chamber_filter_disable_speed|default(0)|float %}
{% endif %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_FILTER_OFF_TIMER DURATION=0
SET_FAN_SPEED FAN=filter SPEED={chamber_filter_speed}
[gcode_macro _CHAMBER_FILTER_TURN_OFF]
gcode =
SET_FAN_SPEED FAN=filter SPEED=0
[gcode_macro _CHAMBER_FILTER_SANITY_CHECK]
gcode =
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set filter_disable_period = printer["gcode_macro RatOS"].chamber_filter_disable_period|default(0)|int %}
{% set filter_disable_bed_temp = printer["gcode_macro RatOS"].chamber_filter_disable_bed_temp|default(0)|int %}
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if filter_disable_bed_temp > 0 and filter_disable_period > 0 %}
_LEARN_MORE_CHAMBER_FILTER
{action_respond_info("Wrong chamber filter options configured! Set 'filter_disable_bed_temp' or 'filter_disable_period' variable, not both.")}
{% endif %}
{% if filter_disable_bed_temp == 0 and filter_disable_period == 0 %}
_LEARN_MORE_CHAMBER_FILTER
{action_respond_info("Wrong chamber filter options configured! Set 'filter_disable_bed_temp' or 'filter_disable_period' variable.")}
{% endif %}
{% endif %}
[gcode_macro CHAMBER_HEATER_ON]
gcode =
{% set chamber_temp = params.CHAMBER_TEMP|default(45)|int %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp} IS_FROM_START_PRINT=False
[gcode_macro CHAMBER_HEATER_OFF]
gcode =
_CHAMBER_HEATER_OFF
[gcode_macro _CHAMBER_HEATER_ON]
variable_chamber_temp = 0
gcode =
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set start_chamber_temp = params.START_CHAMBER_TEMP|default(0)|int %}
{% set is_from_start_print = true if params.IS_FROM_START_PRINT|default(True)|lower == 'true' else false %}
{% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set chamber_heater_enable = true if printer["gcode_macro RatOS"].chamber_heater_enable|default(true)|lower == 'true' else false %}
{% set chamber_heater_bed_temp = printer["gcode_macro RatOS"].chamber_heater_bed_temp|default(115)|int %}
{% set chamber_heater_preheating_temp = printer["gcode_macro RatOS"].chamber_heater_preheating_temp|default(150)|int %}
{% set chamber_heater_heating_temp_offset = printer["gcode_macro RatOS"].chamber_heater_heating_temp_offset|default(20)|int %}
{% set chamber_heater_control_external_heater = true if printer["gcode_macro RatOS"].chamber_heater_control_external_heater|default(true)|lower == 'true' else false %}
{% set chamber_heater_air_circulation_enable = true if printer["gcode_macro RatOS"].chamber_heater_air_circulation_enable|default(true)|lower == 'true' else false %}
{% set chamber_heater_air_circulation_fan_speed = printer["gcode_macro RatOS"].chamber_heater_air_circulation_fan_speed|default(0.35)|float %}
{% set chamber_heater_air_circulation_y_pos = printer["gcode_macro RatOS"].chamber_heater_air_circulation_y_pos|default(0)|float %}
{% set chamber_heater_air_circulation_z_pos = printer["gcode_macro RatOS"].chamber_heater_air_circulation_z_pos|default(100)|float %}
DEBUG_ECHO PREFIX="_CHAMBER_HEATER_ON" MSG="chamber_heater_enable: {chamber_heater_enable}, chamber_heater_preheating_temp: {chamber_heater_preheating_temp}, chamber_heater_heating_temp_offset: {chamber_heater_heating_temp_offset}, bed_temp: {bed_temp}, chamber_temp: {chamber_temp}, start_chamber_temp: {start_chamber_temp}"
{% if chamber_heater_enable and chamber_temp > 0 and chamber_heater_bed_temp > 0 %}
_LED_HEATING
RATOS_ECHO MSG="Preheating chamber to {(start_chamber_temp if start_chamber_temp > 0 else chamber_temp)}°C..."
{% set chamber_temp_sensor = "extruder" %}
{% if printer["dual_carriage"] is defined and default_toolhead == 1 %}
{% set chamber_temp_sensor = "extruder1" %}
{% endif %}
{% if printer["temperature_sensor chamber"] is defined %}
{% set chamber_temp_sensor = "temperature_sensor chamber" %}
{% endif %}
{% set current_chamber_temp = printer['%s' % chamber_temp_sensor].temperature|int %}
{% set needs_heating = current_chamber_temp < (start_chamber_temp if start_chamber_temp > 0 else chamber_temp) %}
{% if needs_heating %}
_USER_CHAMBER_HEATER_BEFORE_PREHEATING
{% endif %}
{% if needs_heating %}
{% if chamber_heater_air_circulation_enable and chamber_heater_air_circulation_fan_speed > 0 %}
{% if not is_from_start_print %}
MAYBE_HOME
{% endif %}
G0 Z{chamber_heater_air_circulation_z_pos} F{z_speed}
G0 Y{chamber_heater_air_circulation_y_pos} F{speed}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={chamber_heater_air_circulation_fan_speed if default_toolhead == 0 else 0}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={chamber_heater_air_circulation_fan_speed if default_toolhead == 1 else 0}
{% else %}
M106 S{(255 * chamber_heater_air_circulation_fan_speed)}
{% endif %}
{% else %}
{% if is_from_start_print %}
G0 Z{z} F{z_speed}
{% endif %}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=_CHAMBER_HEATER_ON VARIABLE=chamber_temp VALUE={chamber_temp}
{% if needs_heating %}
M140 S{chamber_heater_bed_temp}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={chamber_heater_preheating_temp}
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=1.0
{% endif %}
{% endif %}
{% if needs_heating %}
_CHAMBER_HEATER_EXTRA_FAN_ON
{% endif %}
{% if needs_heating %}
TEMPERATURE_WAIT SENSOR="{chamber_temp_sensor}" MINIMUM={(start_chamber_temp if start_chamber_temp > 0 else chamber_temp)}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={(chamber_temp + chamber_heater_heating_temp_offset)}
{% endif %}
{% endif %}
{% if printer["fan_generic filter"] is defined %}
{% if printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float > 0 %}
SET_FAN_SPEED FAN=filter SPEED=0
_CHAMBER_FILTER_ON AT="before_print_start"
{% endif %}
{% endif %}
{% if needs_heating %}
{% if chamber_heater_air_circulation_enable and chamber_heater_air_circulation_fan_speed > 0 %}
G28 Z
{% endif %}
{% endif %}
{% if needs_heating %}
_USER_CHAMBER_HEATER_AFTER_PREHEATING
{% endif %}
{% if printer["temperature_sensor chamber"] is defined %}
{% if printer["heater_generic chamber_heater"] is defined %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined and chamber_heater_control_external_heater %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED=0
SET_FAN_SPEED FAN=part_fan_t1 SPEED=0
{% else %}
M106 S0
{% endif %}
_LED_SUCCESS
{% endif %}
[gcode_macro _CHAMBER_HEATER_OFF]
gcode =
RATOS_ECHO MSG="Deactivating chamber heater..."
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=0
SET_GCODE_VARIABLE MACRO=_CHAMBER_HEATER_ON VARIABLE=chamber_temp VALUE=0
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=0
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=0.0
{% endif %}
_CHAMBER_HEATER_EXTRA_FAN_OFF
[delayed_gcode _CHAMBER_HEATER_CONTROL]
initial_duration = 0.
gcode =
{% set chamber_temp = printer["gcode_macro _CHAMBER_HEATER_ON"].chamber_temp|default(0)|int %}
{% set chamber_heater_heating_temp_offset = printer["gcode_macro RatOS"].chamber_heater_heating_temp_offset|default(20)|int %}
{% set current_chamber_temp = printer['temperature_sensor chamber'].temperature|int %}
{% if current_chamber_temp < chamber_temp %}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={(chamber_temp + chamber_heater_heating_temp_offset)}
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=1.0
{% endif %}
{% endif %}
{% if current_chamber_temp >= chamber_temp %}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=0
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=0.0
{% endif %}
{% endif %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
[gcode_macro _CHAMBER_HEATER_EXTRA_FAN_ON]
gcode =
{% set chamber_heater_extra_fan_speed = printer["gcode_macro RatOS"].chamber_heater_extra_fan_speed|default(0.0)|float %}
{% if printer["fan_generic chamber_heater_extra_fan"] is defined %}
{% if chamber_heater_extra_fan_speed > 0 %}
SET_FAN_SPEED FAN=chamber_heater_extra_fan SPEED={chamber_heater_extra_fan_speed}
{% endif %}
{% endif %}
[gcode_macro _CHAMBER_HEATER_EXTRA_FAN_OFF]
gcode =
{% if printer["fan_generic chamber_heater_extra_fan"] is defined %}
SET_FAN_SPEED FAN=chamber_heater_extra_fan SPEED=0
{% endif %}
[gcode_macro _USER_CHAMBER_HEATER_BEFORE_PREHEATING]
description = Will be executed before chamber preheating, only if heating is needed.
gcode =
[gcode_macro _USER_CHAMBER_HEATER_AFTER_PREHEATING]
description = Will be executed after chamber preheating, only if heating was needed.
gcode =
[gcode_macro _LED_START_PRINTING]
gcode =
_LED_ACTION
[gcode_macro _LED_START_PRINTING_ERROR]
gcode =
_LED_ERROR
[gcode_macro _LED_PRINTING]
gcode =
_LED_ON TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_PAUSE]
gcode =
_LED_ACTION
[gcode_macro _LED_CHAMBER_FILTER_ON]
gcode =
_LED_ACTION
[gcode_macro _LED_CHAMBER_FILTER_OFF]
gcode =
_LED_STANDBY
[gcode_macro _LED_LOADING_FILAMENT]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_LOADED]
gcode =
_LED_SUCCESS TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_RUNOUT]
gcode =
_LED_ERROR TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_CLOG]
gcode =
_LED_ERROR TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_UNLOADING_FILAMENT]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_UNLOADED]
gcode =
_LED_SUCCESS TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_DEACTIVATE_TOOLHEAD]
gcode =
_LED_OFF TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_TOOLHEAD_STANDBY]
gcode =
_LED_STANDBY TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_TOOLHEAD_WAKEUP]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_MOTORS_OFF]
gcode =
_LED_STANDBY
_LED_VAOC_OFF
[gcode_macro _LED_INPUT_SHAPER_START]
gcode =
_LED_ACTION
[gcode_macro _LED_INPUT_SHAPER_END]
gcode =
_LED_ON
[gcode_macro _LED_BEACON_CALIBRATION_START]
gcode =
_LED_ACTION
[gcode_macro _LED_BEACON_CALIBRATION_END]
gcode =
_LED_ON
[gcode_macro _LED_BEACON_CALIBRATION_ERROR]
gcode =
_LED_ERROR
[gcode_macro _LED_VAOC_ON]
gcode =
{% if printer['neopixel vaoc_led'] is defined %}
SET_LED LED=vaoc_led RED=1.0 GREEN=1.0 BLUE=1.0
{% endif %}
[gcode_macro _LED_VAOC_OFF]
gcode =
{% if printer['neopixel vaoc_led'] is defined %}
SET_LED LED=vaoc_led RED=0.0 GREEN=0.0 BLUE=0.0
{% endif %}
[gcode_macro _LED_ACTION]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_action %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_SUCCESS]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_success %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_HEATING]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_heating %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_COOLING]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_cooling %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_ERROR]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_error %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_ON]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_on %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_OFF]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_off %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_STANDBY]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_standby %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_SET]
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set r = params.R|default(0)|float %}
{% set g = params.G|default(0)|float %}
{% set b = params.B|default(0)|float %}
{% if toolhead >= 0 %}
{% if printer['neopixel nozzle_led_t%s' % toolhead] is defined %}
SET_LED LED={'nozzle_led_t%s' % toolhead} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% else %}
{% if printer['neopixel nozzle_led_t0'] is defined %}
SET_LED LED={'nozzle_led_t0'} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% if printer['neopixel nozzle_led_t1'] is defined %}
SET_LED LED={'nozzle_led_t1'} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% endif %}
_USER_LED_SET { rawparams }
[gcode_macro _USER_LED_SET]
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set r = params.R|default(0)|float %}
{% set g = params.G|default(0)|float %}
{% set b = params.B|default(0)|float %}
[gcode_macro LOAD_FILAMENT]
description = Loads new filament. Note: be careful with PETG, make sure you inspect the tip of your filament before loading to avoid jams.
variable_ignore_min_extrude_temp = True
gcode =
_LEARN_MORE_FILAMENT
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set filament_name = params._NAME|default('')|string %}
{% set filament_type = params._TYPE|default('')|string %}
{% if filament_name == '' or filament_type == '' %}
{% set filament_name = 'unknown' %}
{% set filament_type = 'unknown' %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
_DEFAULT_LOAD_FILAMENT TEMP={temp} NAME={filament_name} TYPE={filament_type}
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Loading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead==0 or toolhead==1 %}
_IDEX_LOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead} NAME={filament_name} TYPE={filament_type}
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
[gcode_macro _DEFAULT_LOAD_FILAMENT]
description = Load filament macro for non IDEX printers.
gcode =
{% set temp = params.TEMP|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_DEFAULT_LOAD_FILAMENT" MSG="TEMP={temp}"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
_LED_LOADING_FILAMENT TOOLHEAD=0
SAVE_GCODE_STATE NAME=load_state
{% if printer.extruder.temperature|int < temp or printer.extruder.can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating extruder to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={temp}
_LOAD_FILAMENT TOOLHEAD=0
RESTORE_GCODE_STATE NAME=load_state
{% if filament_name != '' and filament_type != '' %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('{filament_type}', '{filament_name}', {temp})"
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={temp}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
_LED_FILAMENT_LOADED TOOLHEAD=0
[gcode_macro _IDEX_LOAD_FILAMENT]
description = Load filament macro for IDEX printer.
gcode =
{% set temp = params.TEMP|int %}
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_IDEX_LOAD_FILAMENT" MSG="TEMP: {temp}, TOOLHEAD: {toolhead}"
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_LOADING_FILAMENT TOOLHEAD={toolhead}
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
{% if not printer.pause_resume.is_paused %}
{% if printer[target_extruder].temperature|int < temp or printer[target_extruder].can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating T{toolhead} to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={temp}
{% endif %}
_LOAD_FILAMENT TOOLHEAD={toolhead} TEMP={temp}
{% if filament_name != '' and filament_type != '' %}
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('{filament_type}', '{filament_name}', {temp})"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='"{filament_name}"'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='"{filament_type}"'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE={temp}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_ok}"'
_LED_FILAMENT_LOADED TOOLHEAD={toolhead}
[gcode_macro _LOAD_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT" MSG="TOOLHEAD: {toolhead}"
_MOVE_TO_LOADING_POSITION TOOLHEAD={toolhead}
_LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE TOOLHEAD={toolhead}
_LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE TOOLHEAD={toolhead}
_CLEANING_MOVE TOOLHEAD={toolhead}
[gcode_macro _LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set extruder_load_speed = printer["gcode_macro T%s" % toolhead].extruder_load_speed|float * 60 %}
{% set extruder_gear_to_cooling_position_distance = printer["gcode_macro T%s" % toolhead].extruder_gear_to_cooling_position_distance|float %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Loading filament into hotend.."
G92 E0
G0 E{extruder_gear_to_cooling_position_distance} F{extruder_load_speed}
G92 E0
M400
RATOS_ECHO MSG="Filament loaded into hotend."
[gcode_macro _LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set load_speed = printer["gcode_macro T%s" % toolhead].filament_load_speed|float * 60 %}
{% set filament_loading_nozzle_offset = printer["gcode_macro T%s" % toolhead].filament_loading_nozzle_offset|float %}
{% set cooling_position_to_nozzle_distance = printer["gcode_macro T%s" % toolhead].cooling_position_to_nozzle_distance|float %}
{% set purge_after_load = printer["gcode_macro T%s" % toolhead].purge_after_load|float %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Loading filament into nozzle... Please wait!"
G92 E0
G0 E{cooling_position_to_nozzle_distance + filament_loading_nozzle_offset} F{load_speed}
G92 E0
G4 P1000
_PURGE_FILAMENT TOOLHEAD={toolhead} E={purge_after_load}
RATOS_ECHO MSG="Filament loaded into nozzle!"
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_INSERT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_INSERT" MSG="TOOLHEAD: {toolhead}"
{% set filament_grabbing_length = printer["gcode_macro T%s" % toolhead].filament_grabbing_length|float %}
{% set filament_grabbing_speed = printer["gcode_macro T%s" % toolhead].filament_grabbing_speed|float %}
{% set resume_after_insert = true if printer["gcode_macro T%s" % toolhead].resume_after_insert|default(true)|lower == 'true' else false %}
{% set enable_insert_detection = true if printer["gcode_macro T%s" % toolhead].enable_insert_detection|default(true)|lower == 'true' else false %}
{% set current_idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% if enable_insert_detection %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_INSERT" MSG="toolhead: {toolhead}, filament_grabbing_length: {filament_grabbing_length}, filament_grabbing_speed: {filament_grabbing_speed}, current_idex_mode: {current_idex_mode}"
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Loading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
FORCE_MOVE STEPPER={'extruder%s' % ('' if toolhead == 0 else toolhead)} DISTANCE={filament_grabbing_length} VELOCITY={filament_grabbing_speed}
M400
{% if printer.pause_resume.is_paused %}
LOAD_FILAMENT TOOLHEAD={toolhead}
{% if resume_after_insert %}
RESUME
{% endif %}
{% else %}
{% if not printer.virtual_sdcard.is_active %}
LOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_INSERT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_INSERT" MSG="TOOLHEAD: {toolhead}"
[gcode_macro _PURGE_BEFORE_UNLOAD]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set purge_before_unload = printer["gcode_macro T%s" % toolhead].purge_before_unload|float %}
DEBUG_ECHO PREFIX="_PURGE_BEFORE_UNLOAD" MSG="TOOLHEAD: {toolhead}"
{% if purge_before_unload > 0 %}
G92 E0
G0 E{purge_before_unload} F300
G92 E0
M400
{% endif %}
[gcode_macro _PURGE_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set e = params.E|int %}
{% set r = params.R|default(0)|int %}
DEBUG_ECHO PREFIX="_PURGE_FILAMENT" MSG="TOOLHEAD: {toolhead}, E: {e}"
{% if e > 0 %}
G92 E0
G0 E{e} F300
G92 E0
M400
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={0.4 if toolhead == 0 else 0}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={0.4 if toolhead == 1 else 0}
{% else %}
M106 S{(255 * 0.4)}
{% endif %}
{% endif %}
G4 P3000
{% if r > 0 %}
G92 E0
G0 E-{r} F300
G92 E0
M400
{% endif %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED=0
SET_FAN_SPEED FAN=part_fan_t1 SPEED=0
{% else %}
M106 S0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _MOVE_TO_PARKING_POSITION]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_MOVE_TO_PARKING_POSITION" MSG="TOOLHEAD: {toolhead}"
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].parking_position is defined %}
{% set parking_position = printer["gcode_macro T%s" % toolhead].parking_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
G1 X{parking_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _MOVE_TO_LOADING_POSITION]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_MOVE_TO_LOADING_POSITION" MSG="TOOLHEAD: {toolhead}"
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].loading_position is defined %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% set act_t = 1 if idex_mode == 'primary' else 0 %}
{% if act_t == toolhead %}
{% set loading_position = printer["gcode_macro T%s" % toolhead].loading_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
G1 X{loading_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _CLEANING_MOVE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].parking_position is defined and printer["gcode_macro T%s" % toolhead].loading_position is defined %}
{% set loading_position = printer["gcode_macro T%s" % toolhead].loading_position|float %}
{% set parking_position = printer["gcode_macro T%s" % toolhead].parking_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
{% set cleaning_position = loading_position %}
{% if loading_position == parking_position %}
{% if loading_position > 0 %}
{% set cleaning_position = loading_position - 30 %}
{% else %}
{% set cleaning_position = loading_position + 30 %}
{% endif %}
{% endif %}
G1 X{parking_position} F{speed}
G1 X{cleaning_position} F{speed}
G1 X{parking_position} F{speed}
G1 X{cleaning_position} F{speed}
G1 X{parking_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _START_PRINT_BED_MESH]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="start_print_bed_mesh"
SET_MACRO_TRAVEL_SETTINGS
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set X=[params.X0|default(-1)|float, params.X1|default(-1)|float] %}
{% set Y=[params.Y0|default(-1)|float, params.Y1|default(-1)|float] %}
DEBUG_ECHO PREFIX="_START_PRINT_BED_MESH" MSG="idex_mode: {idex_mode}, X: {X}, Y: {Y}"
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set X=[0, printable_x_max] %}
{% endif %}
{% set beacon_bed_mesh_scv = printer["gcode_macro RatOS"].beacon_bed_mesh_scv|default(25)|int %}
{% set beacon_contact_bed_mesh_samples = printer["gcode_macro RatOS"].beacon_contact_bed_mesh_samples|default(2)|int %}
{% set beacon_contact_bed_mesh = true if printer["gcode_macro RatOS"].beacon_contact_bed_mesh|default(false)|lower == 'true' else false %}
{% if printer.configfile.settings.beacon is defined and not beacon_contact_bed_mesh %}
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={beacon_bed_mesh_scv}
{% endif %}
{% set default_profile = printer["gcode_macro RatOS"].bed_mesh_profile|default('ratos') %}
{% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %}
BED_MESH_CLEAR
{% if printer["gcode_macro RatOS"].adaptive_mesh|lower == 'true' %}
CALIBRATE_ADAPTIVE_MESH PROFILE={default_profile} X0={X[0]} X1={X[1]} Y0={Y[0]} Y1={Y[1]} T={params.T|int} BOTH_TOOLHEADS={params.BOTH_TOOLHEADS} IDEX_MODE={idex_mode}
{% else %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% endif %}
BED_MESH_PROFILE LOAD={default_profile}
{% elif printer["gcode_macro RatOS"].bed_mesh_profile is defined %}
BED_MESH_CLEAR
BED_MESH_PROFILE LOAD={printer["gcode_macro RatOS"].bed_mesh_profile}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print_bed_mesh"
[gcode_macro CALIBRATE_ADAPTIVE_MESH]
gcode =
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_bed_mesh_samples = printer["gcode_macro RatOS"].beacon_contact_bed_mesh_samples|default(2)|int %}
{% set beacon_contact_bed_mesh = true if printer["gcode_macro RatOS"].beacon_contact_bed_mesh|default(false)|lower == 'true' else false %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set default_profile = params.PROFILE %}
{% set x0 = params.X0|default(-1)|float %}
{% set y0 = params.Y0|default(-1)|float %}
{% set x1 = params.X1|default(-1)|float %}
{% set y1 = params.Y1|default(-1)|float %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Recieved coordinates X0={x0} Y0={y0} X1={x1} Y1={y1}"
{% if x0 >= x1 or y0 >= y1 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Invalid coordinates received. Please check your slicer settings. Falling back to full bed mesh."
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% else %}
{% set mesh_config = printer.configfile.config.bed_mesh %}
{% set min_x = mesh_config.mesh_min.split(",")[0]|float %}
{% set min_y = mesh_config.mesh_min.split(",")[1]|float %}
{% set max_x = mesh_config.mesh_max.split(",")[0]|float %}
{% set max_y = mesh_config.mesh_max.split(",")[1]|float %}
{% set mesh_x0 = [[x0, max_x]|min, min_x]|max %}
{% set mesh_y0 = [[y0, max_y]|min, min_y]|max %}
{% set mesh_x1 = [[x1, max_x]|min, min_x]|max %}
{% set mesh_y1 = [[y1, max_y]|min, min_y]|max %}
{% if mesh_x0 == min_x and mesh_y0 == min_y and mesh_x1 == max_x and mesh_y1 == max_y %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Print is using the full bed, falling back to full bed mesh."
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% else %}
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
DEPLOY_PROBE
{% endif %}
{% set probe_count_x = mesh_config.probe_count.split(",")[0]|int %}
{% if mesh_config.probe_count.split(",")|length == 2 %}
{% set probe_count_y = mesh_config.probe_count.split(",")[1]|int %}
{% else %}
{% set probe_count_y = mesh_config.probe_count.split(",")[0]|int %}
{% endif %}
{% set probe_x_step = (max_x - min_x) / probe_count_x %}
{% set probe_y_step = (max_y - min_y) / probe_count_y %}
{% set mesh_count_x = ([(mesh_x1 - mesh_x0) / probe_x_step, 3]|max)|int %}
{% set mesh_count_y = ([(mesh_y1 - mesh_y0) / probe_y_step, 3]|max)|int %}
{% set min_mesh_count = [mesh_count_x, mesh_count_y]|min %}
{% set max_mesh_count = [mesh_count_x, mesh_count_y]|max %}
{% set algorithm = mesh_config.algorithm %}
{% if algorithm|lower == 'lagrange' and max_mesh_count > 6 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="cannot exceed a probe_count of 6 when using lagrange interpolation. Falling back to bicubic interpolation."
{% set algorithm = 'bicubic' %}
{% endif %}
{% if algorithm|lower == 'bicubic' and min_mesh_count < 4 %}
{% if max_mesh_count > 6 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="invalid probe_count option when using bicubic interpolation. Combination of 3 points on one axis with more than 6 on another is not permitted. Forcing minimum mesh count to be 4."
{% set min_mesh_count = 4 %}
{% else %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="bicubic interpolation with a probe_count of less than 4 points detected. Forcing lagrange interpolation."
{% set algorithm = 'lagrange' %}
{% endif %}
{% endif %}
{% set mesh_count_x = ([min_mesh_count, mesh_count_x]|max)|int %}
{% set mesh_count_x = ([max_mesh_count, mesh_count_x]|min)|int %}
{% set mesh_count_y = ([min_mesh_count, mesh_count_y]|max)|int %}
{% set mesh_count_y = ([max_mesh_count, mesh_count_y]|min)|int %}
{% set should_prime = printer["gcode_macro RatOS"].nozzle_priming == 'primeblob' %}
{% if printer["dual_carriage"] is not defined %}
{% set probe_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printable_y_max) < printable_y_max / 2 %}
{% else %}
{% set probe_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printable_y_max) < printable_y_max / 2 %}
{% endif %}
{% if printer.configfile.settings.beacon is defined and printer.configfile.settings.beacon.mesh_runs % 2 != 0 and probe_first %}
{% set probe_first = false %}
{% elif printer.configfile.settings.beacon is defined and printer.configfile.settings.beacon.mesh_runs % 2 == 0 and not probe_first %}
{% set probe_first = true %}
{% endif %}
{% if should_prime and probe_first %}
{% if printer["dual_carriage"] is not defined %}
PROBE_FOR_PRIMING
{% else %}
{% if both_toolheads %}
PROBE_FOR_PRIMING TOOLHEAD=0 IDEX_MODE={idex_mode}
PROBE_FOR_PRIMING TOOLHEAD=1 IDEX_MODE={idex_mode}
{% else %}
PROBE_FOR_PRIMING TOOLHEAD={params.T|int} IDEX_MODE={idex_mode}
{% endif %}
{% endif %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="mesh coordinates X0={mesh_x0} Y0={mesh_y0} X1={mesh_x1} Y1={mesh_y1}"
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile} ALGORITHM={algorithm} MESH_MIN={mesh_x0},{mesh_y0} MESH_MAX={mesh_x1},{mesh_y1} PROBE_COUNT={mesh_count_x},{mesh_count_y} RELATIVE_REFERENCE_INDEX=-1
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile} ALGORITHM={algorithm} MESH_MIN={mesh_x0},{mesh_y0} MESH_MAX={mesh_x1},{mesh_y1} PROBE_COUNT={mesh_count_x},{mesh_count_y} RELATIVE_REFERENCE_INDEX=-1
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% if should_prime and not probe_first %}
{% if printer["dual_carriage"] is not defined %}
PROBE_FOR_PRIMING
{% else %}
{% if both_toolheads %}
PROBE_FOR_PRIMING TOOLHEAD=0 IDEX_MODE={idex_mode}
PROBE_FOR_PRIMING TOOLHEAD=1 IDEX_MODE={idex_mode}
{% else %}
PROBE_FOR_PRIMING TOOLHEAD={params.T|int} IDEX_MODE={idex_mode}
{% endif %}
{% endif %}
{% endif %}
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
STOW_PROBE
{% endif %}
{% endif %}
{% endif %}
[gcode_macro M84]
rename_existing = M84.1
gcode =
M84.1
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
{% if printer["dual_carriage"] is defined %}
_SET_TOOLHEAD_OFFSET T={printer["gcode_macro RatOS"].default_toolhead|int} MOVE=0
SET_GCODE_VARIABLE MACRO=SET_PRESSURE_ADVANCE VARIABLE=snyc_toolheads VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_REMAP_TOOLHEADS VARIABLE=enabled VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% if printer["gcode_macro _VAOC"] is defined %}
SET_GCODE_VARIABLE MACRO=_VAOC VARIABLE=is_started VALUE=False
SET_GCODE_VARIABLE MACRO=_VAOC VARIABLE=is_started_at_temp VALUE=False
{% endif %}
SET_GCODE_OFFSET X=0 Y=0 Z=0 MOVE=0
_IDEX_SINGLE INIT=1
{% endif %}
SET_SKEW CLEAR=1
_LED_MOTORS_OFF
[gcode_macro M104]
rename_existing = M104.1
gcode =
{% set s = params.S|default(0)|int %}
{% set t = params.T|default(-1)|int %}
{% set t = 0 if t == -1 else t %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
DEBUG_ECHO PREFIX="M104" MSG="s: {s}, t: {t}"
{% if printer["gcode_macro T%s" % t] is defined %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set temperature_offset_t0 = printer["gcode_macro T0"].temperature_offset|default(0)|int %}
{% set temperature_offset_t1 = printer["gcode_macro T1"].temperature_offset|default(0)|int %}
{% set s0 = [s + temperature_offset_t0, 0]|max %}
{% set s1 = [s + temperature_offset_t1, 0]|max %}
{% if temperature_offset_t0 != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset_t0}°C added to toolhead T0."
{% endif %}
{% if temperature_offset_t1 != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset_t1}°C added to toolhead T1."
{% endif %}
{% else %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set s = [s + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
{% set is_in_standby = false %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% if toolchange_standby_temp > -1 %}
{% set is_in_standby = true if printer["gcode_macro T%s" % t].standby|default(false)|lower == 'true' else false %}
{% endif %}
{% endif %}
{% if not is_in_standby %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
M104.1 S{s0} T0
M104.1 S{s1} T1
{% else %}
M104.1 S{s} T{t}
{% endif %}
{% endif %}
[gcode_macro M109]
rename_existing = M109.1
gcode =
{% set s = params.S|default(0)|int %}
{% set t = params.T|default(-1)|int %}
{% set t = 0 if t == -1 else t %}
DEBUG_ECHO PREFIX="M109" MSG="s: {s}, t: {t}"
{% if printer["gcode_macro T%s" % t] is defined %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set s = [s + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="M109" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% set is_in_standby = false %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% if toolchange_standby_temp > -1 %}
{% set is_in_standby = true if printer["gcode_macro T%s" % t].standby|default(false)|lower == 'true' else false %}
{% endif %}
{% endif %}
{% if not is_in_standby %}
M109.1 S{s} T{t}
{% endif %}
[gcode_macro SET_HEATER_TEMPERATURE]
rename_existing = SET_HEATER_TEMPERATURE_BASE
gcode =
{% set heater = params.HEATER|default("") %}
{% set target = params.TARGET|default(0)|int %}
DEBUG_ECHO PREFIX="SET_HEATER_TEMPERATURE" MSG="heater: {heater}, target: {target}"
{% if heater|lower == "extruder" or heater|lower == "extruder1" %}
{% set t = 0 if heater|lower == "extruder" else 1 %}
{% if printer["gcode_macro T%s" % t] is defined and target > 0 %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set target = [target + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="SET_HEATER_TEMPERATURE" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
SET_HEATER_TEMPERATURE_BASE HEATER="{heater}" TARGET={target}
[gcode_macro TEMPERATURE_WAIT]
rename_existing = TEMPERATURE_WAIT_BASE
gcode =
{% set sensor = params.SENSOR|default("") %}
{% set minimum = params.MINIMUM|default(-1)|int %}
{% set maximum = params.MAXIMUM|default(-1)|int %}
DEBUG_ECHO PREFIX="TEMPERATURE_WAIT" MSG="sensor: {sensor}, minimum: {minimum}, maximum: {maximum}"
{% if sensor|lower == "extruder" or sensor|lower == "extruder1" %}
{% set t = 0 if sensor|lower == "extruder" else 1 %}
{% if printer["gcode_macro T%s" % t] is defined and (minimum > 0 or maximum > 0) %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% if minimum > -1 %}
{% set minimum = [minimum + temperature_offset, 0]|max %}
{% endif %}
{% if maximum > -1 %}
{% set maximum = [maximum + temperature_offset, 0]|max %}
{% endif %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
{% if minimum > -1 and maximum > -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MINIMUM: {minimum}, MAXIMUM: {maximum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MINIMUM={minimum} MAXIMUM={maximum}
{% elif minimum > -1 and maximum == -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MINIMUM: {minimum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MINIMUM={minimum}
{% elif minimum == -1 and maximum > -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MAXIMUM: {maximum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MAXIMUM={maximum}
{% endif %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Temperature for toolhead T{t} reached."
[gcode_macro SET_GCODE_OFFSET]
rename_existing = SET_GCODE_OFFSET_ORG
gcode =
SET_GCODE_OFFSET_ORG { rawparams }
{% if printer.configfile.settings.beacon is defined and (params.Z_ADJUST is defined or params.Z is defined) %}
_BEACON_APPLY_RUNTIME_MULTIPLIER
{% endif %}
[gcode_macro SDCARD_PRINT_FILE]
rename_existing = SDCARD_PRINT_FILE_BASE
gcode =
{% if printer["ratos"] is defined %}
PROCESS_GCODE_FILE { rawparams }
{% else %}
SDCARD_PRINT_FILE_BASE { rawparams }
{% endif %}
[gcode_macro SKEW_PROFILE]
rename_existing = SKEW_PROFILE_BASE
variable_loaded_profile = ""
gcode =
{% if params.LOAD is defined %}
{% if printer.configfile.settings["skew_correction %s" % params.LOAD] is defined %}
SET_GCODE_VARIABLE MACRO=SKEW_PROFILE VARIABLE=loaded_profile VALUE='"{params.LOAD}"'
{% endif %}
{% endif %}
SKEW_PROFILE_BASE { rawparams }
[gcode_macro SET_SKEW]
rename_existing = SET_SKEW_BASE
gcode =
{% if params.CLEAR is defined %}
{% if params.CLEAR|default(0)|int == 1 %}
SET_GCODE_VARIABLE MACRO=SKEW_PROFILE VARIABLE=loaded_profile VALUE='""'
{% endif %}
{% endif %}
SET_SKEW_BASE { rawparams }
[gcode_macro SET_VELOCITY_LIMIT]
rename_existing = SET_VELOCITY_LIMIT_BASE
gcode =
{% if params.ACCEL_TO_DECEL is defined %}
{% if params.ACCEL is defined %}
{% set accel = params.ACCEL|float %}
{% else %}
{% set accel = printer.toolhead.max_accel|float %}
{% endif %}
{% if params.VELOCITY is defined %}
{% set velocity = params.VELOCITY|float %}
{% else %}
{% set velocity = printer.toolhead.max_velocity|float %}
{% endif %}
{% if params.SQUARE_CORNER_VELOCITY is defined %}
{% set scv = params.SQUARE_CORNER_VELOCITY|float %}
{% else %}
{% set scv = printer.toolhead.square_corner_velocity|float %}
{% endif %}
{% set mcr = params.ACCEL_TO_DECEL|float / accel %}
DEBUG_ECHO PREFIX="SET_VELOCITY_LIMIT" MSG="ACCEL={accel}, VELOCITY={velocity}, SQUARE_CORNER_VELOCITY={scv}, MINIMUM_CRUISE_RATIO={mcr}"
SET_VELOCITY_LIMIT_BASE ACCEL={accel} VELOCITY={velocity} SQUARE_CORNER_VELOCITY={scv} MINIMUM_CRUISE_RATIO={1-mcr}
{% else %}
SET_VELOCITY_LIMIT_BASE { rawparams }
{% endif %}
[gcode_macro _START_PRINT_PARK]
gcode =
{% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set start_print_park_in = printer["gcode_macro RatOS"].start_print_park_in %}
{% set start_print_park_x = printer["gcode_macro RatOS"].start_print_park_x %}
{% if start_print_park_in == 'primeblob' %}
{% set z = 3 %}
{% endif %}
{% if printer["dual_carriage"] is defined and not (printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
{% if printer["gcode_macro RatOS"].start_print_park_x is defined and printer["gcode_macro RatOS"].start_print_park_x != '' %}
RATOS_ECHO PREFIX="WARNING" MSG="start_print_park_x is ignored for IDEX printers"
{% endif %}
PARK_TOOLHEAD
G90
{% endif %}
_PARK LOCATION={start_print_park_in} X={start_print_park_x}
G0 Z{z} F{z_speed}
[gcode_macro _END_PRINT_PARK]
gcode =
{% if printer["dual_carriage"] is defined %}
{% if printer["gcode_macro RatOS"].end_print_park_x is defined and printer["gcode_macro RatOS"].end_print_park_x != '' %}
RATOS_ECHO PREFIX="WARNING" MSG="end_print_park_x is ignored for IDEX printers"
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
_IDEX_SINGLE X={parking_position}
PARK_TOOLHEAD
G90
{% endif %}
_PARK LOCATION={printer["gcode_macro RatOS"].end_print_park_in} X={printer["gcode_macro RatOS"].end_print_park_x}
[gcode_macro _PARK]
gcode =
{% set x = params.X %}
{% set location = params.LOCATION|default('back')|lower %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% set nozzle_priming = printer["gcode_macro RatOS"].nozzle_priming|lower %}
CACHE_TOOLHEAD_SETTINGS KEY="park"
SET_MACRO_TRAVEL_SETTINGS
{% if x != '' %}
{% if x|float >= printer.toolhead.axis_minimum.x + 5 and x|float <= printable_x_max - 5 %}
{% set park_x = x|float %}
{% else %}
{action_respond_info('The requested X co-ordinate is outside the defined axis bounds - using defaults')}
{% set park_x = printable_x_max / 2 %}
{% endif %}
{% else %}
{% set park_x = printable_x_max / 2 %}
{% endif %}
{% if location == 'back' %}
{% set park_y = printable_y_max - 15 %}
{% elif location == 'front' %}
{% set park_y = printer.toolhead.axis_minimum.y + 5 %}
{% elif location == 'center' %}
{% set park_y = printable_y_max / 2 %}
{% elif location == 'primeblob' and printer["dual_carriage"] is defined %}
{% set park_y = printable_y_max - 15 %}
{% endif %}
{% if location == 'primeblob' and printer["dual_carriage"] is not defined %}
{% if (nozzle_priming == 'primeblob' or nozzle_priming == 'primeline') %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set park_x = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set park_x = printable_x_max - 5 %}
{% else %}
{% set park_x = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set park_y = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set park_y = printable_y_max - 5 %}
{% else %}
{% set park_y = nozzle_prime_start_y|float %}
{% endif %}
{% endif %}
{% endif %}
G90
{% if printer["dual_carriage"] is not defined %}
G0 X{park_x} Y{park_y} F{speed}
{% else %}
G0 Y{park_y} F{speed}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="park"
[gcode_macro SAVE_PROBE_RESULT]
gcode =
{% set beacon_contact_prime_probing = true if printer["gcode_macro RatOS"].beacon_contact_prime_probing|default(false)|lower == 'true' else false %}
{% set last_z_offset = 9999.9 %}
{% if printer.configfile.settings.beacon is defined %}
{% set current_z = printer.toolhead.position.z|float %}
{% if beacon_contact_prime_probing %}
{% set last_z_offset = printer.beacon.last_z_result %}
{% else %}
{% set last_z_offset = printer.beacon.last_sample.dist - current_z %}
{% endif %}
{% elif printer.configfile.settings.bltouch is defined %}
{% set config_offset = printer.configfile.settings.bltouch.z_offset|float %}
{% set last_z_offset = printer.probe.last_z_result - config_offset %}
{% elif printer.configfile.settings.probe is defined %}
{% set config_offset = printer.configfile.settings.probe.z_offset|float %}
{% set last_z_offset = printer.probe.last_z_result - config_offset %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Saving offset adjustment of {last_z_offset} in {params.VARIABLE|default('last_z_offset')}"
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE={params.VARIABLE|default('last_z_offset')} VALUE={last_z_offset}
[gcode_macro PROBE_FOR_PRIMING]
gcode =
{% set probe_for_priming_disable_mesh_constraints = true if printer["gcode_macro RatOS"].probe_for_priming_disable_mesh_constraints|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].nozzle_priming|lower != 'false' %}
SAVE_GCODE_STATE NAME=probe_for_priming_state
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the prime location.."
CACHE_TOOLHEAD_SETTINGS KEY="probe_for_priming"
SET_MACRO_TRAVEL_SETTINGS
{% set t = params.TOOLHEAD|default(-1)|int %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% if idex_mode == '' %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set x_start = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set x_start = printable_x_max - 5 %}
{% else %}
{% set x_start = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% else %}
{% set y_start = nozzle_prime_start_y|float %}
{% endif %}
{% else %}
{% set center_x = printable_x_max / 2 %}
{% if t == 0 %}
{% set x_start = 5 %}
{% else %}
{% set x_start = printable_x_max - 5 %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% endif %}
{% endif %}
{% set z = printer.configfile.settings.bed_mesh.horizontal_move_z|float %}
{% set mesh_config = printer.configfile.config.bed_mesh %}
{% if printer.configfile.settings.bltouch is defined %}
{% set x_offset = printer.configfile.settings.bltouch.x_offset|float %}
{% set y_offset = printer.configfile.settings.bltouch.y_offset|float %}
{% set z_offset = printer.configfile.settings.bltouch.z_offset|float %}
{% elif printer.configfile.settings.probe is defined %}
{% set x_offset = printer.configfile.settings.probe.x_offset|float %}
{% set y_offset = printer.configfile.settings.probe.y_offset|float %}
{% set z_offset = printer.configfile.settings.probe.z_offset|float %}
{% elif printer.configfile.settings.beacon is defined %}
{% set x_offset = printer.configfile.settings.beacon.x_offset|float %}
{% set y_offset = printer.configfile.settings.beacon.y_offset|float %}
{% set z_offset = printer.configfile.settings.beacon.trigger_distance|float %}
{% else %}
{ action_raise_error("No probe, beacon or bltouch section found. Adaptive priming only works with a [probe], [beacon] or [bltouch] section defined.") }
{% endif %}
{% if z < z_offset %}
{ action_raise_error("Horizontal move Z ({z}) is below your probe's Z offset ({z_offset}). Please adjust your horizontal_move_z setting in [bed_mesh] to be above {z}.") }
{% endif %}
{% if not probe_for_priming_disable_mesh_constraints %}
{% set min_x = mesh_config.mesh_min.split(",")[0]|float - x_offset %}
{% set min_y = mesh_config.mesh_min.split(",")[1]|float - y_offset %}
{% set max_x = mesh_config.mesh_max.split(",")[0]|float - x_offset %}
{% set max_y = mesh_config.mesh_max.split(",")[1]|float - y_offset %}
{% set x_start = [[x_start, max_x]|min, min_x]|max %}
{% set y_start = [[y_start, max_y]|min, min_y]|max %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the start of the prime location at {x_start}, {y_start}"
G90
M83
G0 Z{z} F{z_speed}
G1 X{x_start} Y{y_start} F{speed}
PROBE_CURRENT_POSITION
{% if t == 1 %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result_t1
{% else %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result
{% endif %}
{% if idex_mode == '' %}
{% set x_end = x_start %}
{% set y_end = y_start + 45 %}
{% else %}
{% if t==1 %}
{% set x_end = x_start - 45 %}
{% else %}
{% set x_end = x_start + 45 %}
{% endif %}
{% set y_end = y_start %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the end of the prime location at {x_end}, {y_end}"
G1 X{x_end} Y{y_end} F{speed}
PROBE_CURRENT_POSITION
{% if t == 1 %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_end_result_t1
{% else %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_end_result
{% endif %}
RESTORE_GCODE_STATE NAME=probe_for_priming_state
RESTORE_TOOLHEAD_SETTINGS KEY="probe_for_priming"
{% endif %}
[gcode_macro RESET_PRIME_PROBE_STATE]
gcode =
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result VALUE=None
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_end_result VALUE=None
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result_t1 VALUE=None
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_end_result_t1 VALUE=None
{% endif %}
[gcode_macro PROBE_CURRENT_POSITION]
gcode =
{% set beacon_contact_prime_probing = true if printer["gcode_macro RatOS"].beacon_contact_prime_probing|default(false)|lower == 'true' else false %}
SAVE_GCODE_STATE NAME=probe_current_position_state
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
ASSERT_PROBE_DEPLOYED
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_prime_probing %}
PROBE PROBE_METHOD=contact SAMPLES=1
{% else %}
PROBE
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
BEACON_QUERY
{% else %}
RESTORE_GCODE_STATE NAME=probe_current_position_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_z_speed|float}
{% endif %}
[gcode_macro PRIME_BLOB]
description = Prints a primeblob, used internally, if configured, as part of the START_PRINT macro.
variable_x_offset = 5
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="prime_blob"
SET_MACRO_TRAVEL_SETTINGS
RATOS_ECHO PREFIX="Priming" MSG="Priming nozzle with prime blob.."
{% set current_toolhead = 0 %}
{% set target_idex_mode = '' %}
{% set extruder = 'extruder' %}
{% if printer["dual_carriage"] is defined %}
{% if params.IDEX_MODE is defined %}
{% set target_idex_mode = params.IDEX_MODE|default('')|lower %}
{% else %}
{ action_raise_error("IDEX_MODE parameter not found for PRIME_BLOB macro. This is likely a bug.") }
{% endif %}
RATOS_ECHO PREFIX="Priming" MSG="Priming in IDEX {target_idex_mode} mode.."
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set current_toolhead = 1 if current_idex_mode=='primary' else 0 %}
{% set extruder = 'extruder1' if current_toolhead == 1 else 'extruder' %}
{% endif %}
{% if target_idex_mode != "copy" or target_idex_mode != "mirror" %}
SAVE_GCODE_STATE NAME=prime_blob_state
{% endif %}
{% set first_y = printer["gcode_macro START_PRINT"].first_y|default(-1)|float %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set fan_speed = printer["gcode_macro RatOS"].nozzle_prime_bridge_fan|float %}
{% set nozzle_diameter = printer.configfile.settings[extruder].nozzle_diameter|float %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set has_start_offset_t0 = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) != 9999.9 %}
{% if printer["dual_carriage"] is defined %}
{% set has_start_offset_t1 = printer["gcode_macro RatOS"].probe_for_priming_result_t1|float(9999.9) != 9999.9 %}
{% endif %}
{% set start_print_park_in = printer["gcode_macro RatOS"].start_print_park_in %}
{% set start_print_park_z_height = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set nozzle_prime_direction = printer["gcode_macro RatOS"].nozzle_prime_direction|lower %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% set initial_toolhead = params.INITIAL_TOOLHEAD|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% if target_idex_mode == '' %}
{% set x_factor = 0 %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set x_start = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set x_start = printable_x_max - 5 %}
{% else %}
{% set x_start = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% set y_factor = 1 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% set y_factor = -1 %}
{% else %}
{% set y_start = nozzle_prime_start_y|float %}
{% if nozzle_prime_start_y|float < printable_y_max / 2 %}
{% set y_factor = 1 %}
{% else %}
{% set y_factor = -1 %}
{% endif %}
{% endif %}
{% if nozzle_prime_direction == 'forwards' %}
{% set y_factor = 1 %}
{% elif nozzle_prime_direction == 'backwards' %}
{% set y_factor = -1 %}
{% endif %}
{% if start_print_park_in == 'primeblob' %}
{% set z = 3 %}
{% else %}
{% set z = start_print_park_z_height %}
{% endif %}
{% else %}
{% set center_x = printable_x_max / 2 %}
{% set y_factor = 0 %}
{% if target_idex_mode == 'copy' or target_idex_mode == 'mirror' %}
{% set x_start = center_x / 2 + 5 %}
{% set x_factor = 1 %}
{% else %}
{% if both_toolheads and initial_toolhead != current_toolhead %}
{% if current_toolhead == 0 %}
{% set x_start = 55 %}
{% set x_factor = -1 %}
{% elif current_toolhead == 1 %}
{% set x_start = printable_x_max - 55 %}
{% set x_factor = 1 %}
{% endif %}
{% else %}
{% if current_toolhead == 0 %}
{% set x_start = 5 %}
{% set x_factor = 1 %}
{% elif current_toolhead == 1 %}
{% set x_start = printable_x_max - 5 %}
{% set x_factor = -1 %}
{% endif %}
{% endif %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_x_max - 5 %}
{% endif %}
{% set z = 10 %}
{% endif %}
{% set start_z_offset = 0 %}
{% set end_z_offset = 0 %}
{% if has_start_offset_t0 %}
{% set start_z_probe_result_t0 = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %}
{% set end_z_probe_result_t0 = printer["gcode_macro RatOS"].probe_for_priming_end_result|float(9999.9) %}
{% if printer.configfile.settings.bltouch is not defined and printer.configfile.settings.probe is not defined and printer.configfile.settings.beacon is not defined %}
{ action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe], [beacon] or [bltouch].") }
{% endif %}
{% if start_z_probe_result_t0 == 9999.9 %}
{ action_raise_error("No start probe result found for prime area. This is likely a bug.") }
{% endif %}
{% if end_z_probe_result_t0 == 9999.9 %}
{ action_raise_error("No end probe result found for prime area. This is likely a bug.") }
{% endif %}
{% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %}
{% if start_z_probe_result_t0 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (start_z_probe_result_t0) ) }
{% endif %}
{% if end_z_probe_result_t0 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (end_z_probe_result_t0) ) }
{% endif %}
{% set start_z_offset = start_z_probe_result_t0 %}
{% set end_z_offset = end_z_probe_result_t0 %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if current_toolhead == 1 or both_toolheads or target_idex_mode == "copy" or target_idex_mode == "mirror" %}
{% if has_start_offset_t1 %}
{% set start_z_probe_result_t1 = printer["gcode_macro RatOS"].probe_for_priming_result_t1|float(9999.9) %}
{% set end_z_probe_result_t1 = printer["gcode_macro RatOS"].probe_for_priming_end_result_t1|float(9999.9) %}
{% if printer.configfile.settings.bltouch is not defined and printer.configfile.settings.probe is not defined and printer.configfile.settings.beacon is not defined %}
{ action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe], [beacon] or [bltouch].") }
{% endif %}
{% if start_z_probe_result_t1 == 9999.9 %}
{ action_raise_error("No start probe result found for prime area. This is likely a bug.") }
{% endif %}
{% if end_z_probe_result_t1 == 9999.9 %}
{ action_raise_error("No end probe result found for prime area. This is likely a bug.") }
{% endif %}
{% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %}
{% if start_z_probe_result_t1 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (start_z_probe_result_t1) ) }
{% endif %}
{% if end_z_probe_result_t1 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (end_z_probe_result_t1) ) }
{% endif %}
{% set start_z_offset = [start_z_offset, start_z_probe_result_t1]|max %}
{% set end_z_offset = [end_z_offset, start_z_probe_result_t1]|max %}
{% endif %}
{% endif %}
{% if target_idex_mode != 'copy' and target_idex_mode != 'mirror' %}
{% if both_toolheads and initial_toolhead != current_toolhead %}
{% set original_start_z_offset = start_z_offset %}
{% set original_end_z_offset = end_z_offset %}
{% set start_z_offset = original_end_z_offset %}
{% set end_z_offset = original_start_z_offset %}
{% endif %}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SET_NOZZLE_TEMP_OFFSET TOOLHEAD={current_toolhead}
{% endif %}
DEBUG_ECHO PREFIX="PRIME_BLOB" MSG="x_start: {x_start}, y_start: {y_start}, x_factor: {x_factor}, y_factor: {y_factor}, z: {z}, start_z_offset: {start_z_offset}, end_z_offset: {end_z_offset}"
G90
M83
RATOS_ECHO PREFIX="Priming" MSG="Lifting Z to {z}.."
G0 Z{z} F{z_speed}
{% if printer["dual_carriage"] is not defined %}
RATOS_ECHO PREFIX="Priming" MSG="Moving to {x_start}, {y_start} along the edge of the print area.."
{% if start_print_park_in != 'primeblob' %}
G1 X{x_start} F{speed}
G1 Y{y_start + (15 * y_factor)} F{speed}
{% endif %}
{% else %}
G1 Y{y_start + (15 * y_factor)} F{speed}
{% if target_idex_mode=="copy" or target_idex_mode=="mirror" %}
RATOS_ECHO PREFIX="Priming" MSG="Mirroring move to {x_start}, {y_start} along the edge of the print area.."
_IDEX_MIRROR PRIMING=1
{% else %}
RATOS_ECHO PREFIX="Priming" MSG="Moving to {x_start}, {y_start} along the edge of the print area.."
{% endif %}
G1 X{x_start} F{speed}
{% endif %}
RATOS_ECHO PREFIX="Priming" MSG="Starting prime blob.."
G1 Z{0.5 + start_z_offset} F{z_speed}
G1 Y{y_start} F{speed}
G1 F300 E{14 / ((0.4 / nozzle_diameter) ** 2)}
G1 F300 E{14 / ((0.4 / nozzle_diameter) ** 2)}
M106 S{fan_speed}
G1 Z5 F100 E5
G92 E0
RATOS_ECHO PREFIX="Priming" MSG="Bridging with {((fan_speed/255) * 100)|int}% fan speed.."
G1 F3000 X{x_start + (15 * x_factor)} Y{y_start + (15 * y_factor)} E{1 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (20 * x_factor)} Y{y_start + (20 * y_factor)} Z{3.8 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (34 * x_factor)} Y{y_start + (34 * y_factor)} Z{2.6 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (38 * x_factor)} Y{y_start + (38 * y_factor)} Z{1.4 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (42 * x_factor)} Y{y_start + (42 * y_factor)} Z{0.2 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
M106 S0
G1 F3000 X{x_start + (46 * x_factor)} Y{y_start + (46 * y_factor)} Z{0.2 + end_z_offset} E0.6
G1 F{speed} X{x_start + (50 * x_factor)} Y{y_start + (50 * y_factor)}
{% if target_idex_mode == "copy" or target_idex_mode == "mirror" %}
G0 Z3 F{z_speed}
{% endif %}
{% if target_idex_mode == "copy" %}
{% if first_y >= 0 %}
_IDEX_COPY DANCE=0 Y={first_y}
{% else %}
_IDEX_COPY DANCE=0 Y={params.Y1}
{% endif %}
{% endif %}
{% if target_idex_mode != "copy" or target_idex_mode != "mirror" %}
RESTORE_GCODE_STATE NAME=prime_blob_state
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="prime_blob"
G92 E0
[gcode_macro UNLOAD_FILAMENT]
description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams.
variable_ignore_min_extrude_temp = True
gcode =
_LEARN_MORE_FILAMENT
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set filament_name = params._NAME|default('')|string %}
{% set filament_type = params._TYPE|default('')|string %}
{% set temp = params.TEMP|default(220)|int %}
{% if printer["dual_carriage"] is not defined %}
_DEFAULT_UNLOAD_FILAMENT TEMP={temp} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Unloading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead==0 or toolhead==1 %}
_IDEX_UNLOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
[gcode_macro _LEGACY_UNLOAD_FILAMENT]
description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams.
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set unload_speed = 5 * 60 %}
{% set unload_length = printer["gcode_macro RatOS"].filament_unload_length|float %}
M117 Unloading filament...
G0 E10 F300
G0 E-5 F3600
G4 P3000
G0 E5 F6000
G0 E-15 F6000
G0 E-{unload_length} F{unload_speed}
_CLEANING_MOVE TOOLHEAD={toolhead}
M117 Filament unloaded!
RESPOND MSG="Filament unloaded! Please inspect the tip of the filament before reloading."
[gcode_macro _DEFAULT_UNLOAD_FILAMENT]
description = Unload filament macro for non IDEX printers.
gcode =
{% set temp = params.TEMP|default(220)|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set enable_unload_tip_forming = true if printer["gcode_macro RatOS"].enable_unload_tip_forming|default(false)|lower == 'true' else false %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_DEFAULT_UNLOAD_FILAMENT" MSG="TEMP: {temp}"
_LED_UNLOADING_FILAMENT TOOLHEAD=0
SAVE_GCODE_STATE NAME=unload_state
{% if printer.extruder.temperature|int < temp or printer.extruder.can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating extruder to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={temp}
G4 P3000
{% if enable_unload_tip_forming %}
_UNLOAD_FILAMENT TOOLHEAD=0 NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_LEGACY_UNLOAD_FILAMENT TOOLHEAD=0
{% endif %}
RESTORE_GCODE_STATE NAME=unload_state
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD=0
[gcode_macro _IDEX_UNLOAD_FILAMENT]
description = Unload filament macro for IDEX printer.
gcode =
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set enable_unload_tip_forming = true if printer["gcode_macro RatOS"].enable_unload_tip_forming|default(false)|lower == 'true' else false %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_IDEX_UNLOAD_FILAMENT" MSG="TEMP: {temp}, TOOLHEAD: {toolhead}"
_LED_UNLOADING_FILAMENT TOOLHEAD={toolhead}
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
{% if not printer.pause_resume.is_paused %}
{% if printer[target_extruder].temperature|int < temp or printer[target_extruder].can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating T{toolhead} to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={temp}
{% endif %}
G4 P3000
{% if enable_unload_tip_forming %}
_UNLOAD_FILAMENT TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_LEGACY_UNLOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead}
{% endif %}
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD={toolhead}
[gcode_macro _UNLOAD_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT" MSG="TOOLHEAD: {toolhead}"
_MOVE_TO_LOADING_POSITION TOOLHEAD={toolhead}
_UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
_UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER TOOLHEAD={toolhead}
_CLEANING_MOVE TOOLHEAD={toolhead}
[gcode_macro _UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Unloading filament from nozzle to cooling zone... Please wait!"
_PURGE_BEFORE_UNLOAD TOOLHEAD={toolhead}
{% if printer["gcode_macro _UNLOAD_WITHOUT_TIP_FORMING"] is defined %}
_UNLOAD_WITHOUT_TIP_FORMING TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_UNLOAD_WITH_TIP_FORMING NAME='{filament_name}' TYPE='{filament_type}'
{% endif %}
G4 P3000
[gcode_macro _UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set extruder_load_speed = printer["gcode_macro T%s" % toolhead].extruder_load_speed|float * 60 %}
{% set extruder_gear_to_cooling_position_distance = printer["gcode_macro T%s" % toolhead].extruder_gear_to_cooling_position_distance|float %}
{% set tooolhead_sensor_to_extruder_gear_distance = printer["gcode_macro T%s" % toolhead].tooolhead_sensor_to_extruder_gear_distance|float %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER" MSG="TOOLHEAD: {toolhead}"
G0 E-{extruder_gear_to_cooling_position_distance + tooolhead_sensor_to_extruder_gear_distance + 50} F{extruder_load_speed}
RATOS_ECHO MSG="Filament unloaded! Please inspect the tip of the filament before reloading."
[gcode_macro _UNLOAD_WITH_TIP_FORMING]
gcode =
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% if filament_name != '' and filament_type != '' %}
_UNLOAD_KNOWN_FILAMENT NAME={filament_name} TYPE={filament_type}
{% else %}
_UNLOAD_UNKNOWN_FILAMENT TOOLHEAD={toolhead}
{% endif %}
[gcode_macro _UNLOAD_KNOWN_FILAMENT]
description = User overrideable tip forming macro if slicer filament profiles are known
gcode =
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
RATOS_ECHO PREFIX="FILAMENT TYPE" MSG='{filament_type}'
RATOS_ECHO PREFIX="FILAMENT PROFILE" MSG='{filament_name}'
{% if filament_name == "Prusament PETG @V-Minion" %}
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
{% elif filament_name == "Nobufil PETG @V-Minion" %}
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
{% else %}
RATOS_ECHO PREFIX="_UNLOAD_KNOWN_FILAMENT" MSG="Filament profile not found!"
_UNLOAD_UNKNOWN_FILAMENT
{% endif %}
[gcode_macro _UNLOAD_UNKNOWN_FILAMENT]
description = User overrideable standard tip forming macro
gcode =
DEBUG_ECHO PREFIX="_UNLOAD_UNKNOWN_FILAMENT" MSG="Using standard tip forming macro!"
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
[gcode_macro _TIP_FORMING]
gcode =
{% set cooling_moves = params.COOLING_MOVES|default(4)|int %}
{% set cooling_move_length = params.COOLING_MOVE_LENGTH|default(10)|float %}
{% set start_cooling_speed = params.START_COOLING_SPEED|default(10)|float * 60 %}
{% set end_cooling_speed = params.END_COOLING_SPEED|default(50)|float * 60 %}
{% if cooling_moves == 0 %}
{% set cooling_move_length = 0 %}
{% endif %}
{% set dip = true if params.DIP|default(false)|lower == "true" else false %}
{% set dip_length = params.DIP_LENGTH|default(22)|float %}
{% set dip_speed = params.DIP_SPEED|default(30)|float * 60 %}
{% set dip_retract_speed = params.DIP_RETRACT_SPEED|default(70)|float * 60 %}
{% set retract_length = params.RETRACT_LENGTH|default(18)|float %}
{% set start_retract_speed = params.START_RETRACT_SPEED|default(120)|float * 60 %}
{% set end_retract_speed = params.END_RETRACT_SPEED|default(20)|float * 60 %}
DEBUG_ECHO PREFIX="_TIP_FORMING" MSG="cooling_moves: {cooling_moves}, cooling_move_length: {cooling_move_length}, start_cooling_speed: {start_cooling_speed}, end_cooling_speed: {end_cooling_speed}, dip: {dip}, dip_length: {dip_length}, dip_speed: {dip_speed}, dip_retract_speed: {dip_retract_speed}, retract_length: {retract_length}, start_retract_speed: {start_retract_speed}, end_retract_speed: {end_retract_speed}"
M220 S100
G92 E0
{% set retract = retract_length + cooling_move_length / 2 - 15 %}
G1 E-15 F{start_retract_speed}
G1 E-{0.7 * retract} F{1.0 * end_retract_speed}
G1 E-{0.2 * retract} F{0.5 * end_retract_speed}
G1 E-{0.1 * retract} F{0.3 * end_retract_speed}
G92 E0
{% if cooling_moves > 0 %}
{% set i = (end_cooling_speed - start_cooling_speed) / (2 * cooling_moves - 1) %}
{% for m in range(cooling_moves) %}
G1 E{cooling_move_length} F{(start_cooling_speed + i * m * 2)}
G1 E-{cooling_move_length} F{(start_cooling_speed + i * (m * 2 + 1))}
{% endfor %}
{% endif %}
G92 E0
{% if dip %}
G1 E{dip_length} F{dip_speed}
G4 P100
G1 E-{dip_length} F{dip_retract_speed}
{% endif %}
G92 E0
M400
[gcode_macro _ON_FILAMENT_SENSOR_BUTTON_PRESSED]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_FILAMENT_SENSOR_BUTTON_PRESSED" MSG="TOOLHEAD: {toolhead}"
{% if not printer.virtual_sdcard.is_active %}
UNLOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_RUNOUT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_runout_detection = true if printer["gcode_macro T%s" % toolhead].enable_runout_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_RUNOUT" MSG="TOOLHEAD: {toolhead}"
{% if enable_runout_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=false
{% endif %}
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_CLOG]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_clog_detection = true if printer["gcode_macro T%s" % toolhead].enable_clog_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_CLOG" MSG="TOOLHEAD: {toolhead}"
{% if enable_clog_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=true
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_RUNOUT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_runout_detection = true if printer["gcode_macro T%s" % toolhead].enable_runout_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_RUNOUT" MSG="TOOLHEAD: {toolhead}"
{% if enable_runout_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=false
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_CLOG]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_clog_detection = true if printer["gcode_macro T%s" % toolhead].enable_clog_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_CLOG" MSG="TOOLHEAD: {toolhead}"
{% if enable_clog_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=true
{% endif %}
[gcode_macro _ON_FILAMENT_END]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set clogged = true if params.CLOGGED|default(false)|lower == 'true' else false %}
{% set unload_after_runout = printer["gcode_macro T%s" % toolhead].unload_after_runout|float %}
{% if clogged %}
_LED_FILAMENT_CLOG TOOLHEAD={toolhead}
{% else %}
_LED_FILAMENT_RUNOUT TOOLHEAD={toolhead}
{% endif %}
DEBUG_ECHO PREFIX="_ON_FILAMENT_END" MSG="TOOLHEAD: {toolhead}"
{% if printer.virtual_sdcard.is_active %}
{% if not printer.pause_resume.is_paused %}
PAUSE RUNOUT=True
{% endif %}
{% if not clogged and unload_after_runout %}
UNLOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
{% if not clogged and printer["dual_carriage"] is defined %}
{% if printer["gcode_macro _IDEX_JOIN_SPOOLS"].enabled|default(false)|lower == 'true'%}
_JOIN_SPOOL TOOLHEAD={toolhead}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro M600]
description = Executes a color change by pausing the printer an unloading the filament.
gcode =
PAUSE
UNLOAD_FILAMENT
RATOS_ECHO MSG="Please load new filament and resume"
[gcode_macro COLD_PULL]
description = Automated hotend cold pull.
gcode =
{% set extrusion_temp = params.EXTRUSION_TEMP|default(220)|int %}
{% set cold_pull_temp = params.COLD_PULL_TEMP|default(80)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% if printer["dual_carriage"] is not defined %}
{% set toolhead = 0 %}
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Unloading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead != 0 and toolhead != 1 %}
{action_raise_error("Please select toolhead! 0 = left, 1 = right toolhead")}
{% endif %}
{% endif %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
_LED_UNLOADING_FILAMENT TOOLHEAD={toolhead}
SAVE_GCODE_STATE NAME=cold_pull_state
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
RATOS_ECHO MSG="Heating T{toolhead} to {extrusion_temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={extrusion_temp}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={extrusion_temp} MAXIMUM={extrusion_temp + 2}
G4 P3000
RATOS_ECHO MSG="extruding..."
G92 E0
G1 E30 F300
G92 E0
RATOS_ECHO MSG="Heating T{toolhead} to {cold_pull_temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={cold_pull_temp}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={cold_pull_temp} MAXIMUM={cold_pull_temp + 2}
G4 P10000
RATOS_ECHO MSG="cold pull..."
FORCE_MOVE STEPPER={target_extruder} DISTANCE=-40 VELOCITY=5 ACCEL=100
RATOS_ECHO MSG="eject filament..."
FORCE_MOVE STEPPER={target_extruder} DISTANCE=-200 VELOCITY=20 ACCEL=500
RATOS_ECHO MSG="cooling down extruder..."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET=0
RESTORE_GCODE_STATE NAME=cold_pull_state
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD={toolhead}
CONSOLE_ECHO TITLE="Cold pull finished!" MSG="Please remove the filament from the PTFE tube and cut the end off. Do NOT try to load it again." TYPE="warning"
[gcode_macro _USER_START_PRINT_BEFORE_HOMING]
gcode =
[gcode_macro _USER_START_PRINT_AFTER_HEATING_BED]
gcode =
[gcode_macro _USER_START_PRINT_BED_MESH]
gcode =
[gcode_macro _USER_START_PRINT_PARK]
gcode =
[gcode_macro _USER_START_PRINT_AFTER_HEATING_EXTRUDER]
gcode =
[gcode_macro _USER_START_PRINT_HEAT_CHAMBER]
description = Uses the extruder sensor to wait for chamber temp. Override the _START_PRINT_HEAT_CHAMBER macro to implement heated chamber handling.
gcode =
{% set chamber_heater_bed_temp = printer["gcode_macro RatOS"].chamber_heater_bed_temp|default(115)|int %}
[gcode_macro _USER_END_PRINT_BEFORE_HEATERS_OFF]
gcode =
[gcode_macro _USER_END_PRINT_AFTER_HEATERS_OFF]
gcode =
[gcode_macro _USER_END_PRINT_PARK]
gcode =
[gcode_macro _USER_END_PRINT_FINISHED]
description = User hook for when the print is finished after gcode state has been restored.
gcode =
[gcode_macro _USER_START_PRINT]
gcode =
[gcode_macro _USER_END_START_PRINT]
gcode =
[gcode_macro _USER_START_FEATURE]
gcode =
[gcode_macro _USER_END_FEATURE]
gcode =
[gcode_macro ECHO_T_VARS]
description = Echo Toolhead variables to the console.
gcode =
{% set t = params.T|default(0) %}
RATOS_ECHO MSG="T{t} Variables"
{% for var, value in printer["gcode_macro T%s" % t].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro ECHO_RATOS_VARS]
description = Echo RatOS variables to the console.
gcode =
{% for var, value in printer["gcode_macro RatOS"].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[delayed_gcode RATOS_INIT]
initial_duration = 0.1
gcode =
_LED_STANDBY
CALCULATE_PRINTABLE_AREA
INITIAL_FRONTEND_UPDATE
_CHAMBER_FILTER_SANITY_CHECK
[delayed_gcode RATOS_LOGO]
initial_duration = 2
gcode =
HELLO_RATOS
[gcode_macro INITIAL_FRONTEND_UPDATE]
gcode =
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_error = printer["gcode_macro RatOS"].status_color_error|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_unknown}"'
{% endif %}
{% set t0_sensor = "undefined" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].filament_detected|lower == "true" %}
{% set t0_sensor = "detected" %}
{% else %}
{% set t0_sensor = "empty" %}
{% endif %}
{% else %}
{% set t0_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set t1_sensor = "undefined" %}
{% if printer["dual_carriage"] is defined and printer["filament_switch_sensor toolhead_filament_sensor_t1"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].filament_detected|lower == "true" %}
{% set t1_sensor = "detected" %}
{% else %}
{% set t1_sensor = "empty" %}
{% endif %}
{% else %}
{% set t1_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set svv = printer.save_variables.variables %}
{% if svv.t0_filament is defined and printer["gcode_macro T0"] is defined %}
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
{% if t0_sensor != "empty" %}
{% set t0_filament_type = svv.t0_filament[0]|default('')|string %}
{% set t0_filament_name = svv.t0_filament[1]|default('')|string %}
{% set t0_filament_temp = svv.t0_filament[2]|default(0)|float %}
{% if t0_filament_name != '' and t0_filament_type != '' and t0_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{t0_filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{t0_filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={t0_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
{% if svv.t1_filament is defined and printer["gcode_macro T1"] is defined %}
{% if printer["gcode_macro T1"].filament_name is defined and printer["gcode_macro T1"].filament_type is defined and printer["gcode_macro T1"].filament_temp is defined %}
{% if t1_sensor != "empty" %}
{% set t1_filament_type = svv.t1_filament[0]|default('')|string %}
{% set t1_filament_name = svv.t1_filament[1]|default('')|string %}
{% set t1_filament_temp = svv.t1_filament[2]|default(0)|float %}
{% if t1_filament_name != '' and t1_filament_type != '' and t1_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='"{t1_filament_name}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='"{t1_filament_type}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE={t1_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t1_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro CALCULATE_PRINTABLE_AREA]
gcode =
{% set bed_margin_x = printer["gcode_macro RatOS"].bed_margin_x %}
{% set bed_margin_y = printer["gcode_macro RatOS"].bed_margin_y %}
{% set tool = 0 if printer["gcode_macro T0"] is not defined or printer["gcode_macro T0"].active else 1 %}
{% set max_x = printer.toolhead.axis_maximum.x if printer["dual_carriage"] is defined and tool == 0 else printer.toolhead.axis_maximum.x - bed_margin_x[1] %}
{% if printer["dual_carriage"] is defined %}
{% set max_x = printer.toolhead.axis_maximum.x %}
{% endif %}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="printer.toolhead.axis_maximum.x {printer.toolhead.axis_maximum.x}"
{% set max_y = printer.toolhead.axis_maximum.y - bed_margin_y[1]%}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_x_max VALUE={max_x}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_y_max VALUE={max_y}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="Printable area calculated: X: 0,{max_x} Y: 0,{max_y}"
[gcode_macro CACHE_TOOLHEAD_SETTINGS]
variable_cache = {"global": {"accel": 1000, "ratio": 0.5, "speed": 50, "scv": 5}}
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set dummy = cache.__setitem__(key, {"accel": printer.toolhead.max_accel, "ratio": printer.toolhead.minimum_cruise_ratio, "speed": printer.toolhead.max_velocity, "scv": printer.toolhead.square_corner_velocity}) %}
SET_GCODE_VARIABLE MACRO=CACHE_TOOLHEAD_SETTINGS VARIABLE=cache VALUE="{cache | pprint | replace("\n", "") | replace("\"", "\\\"")}"
DEBUG_ECHO PREFIX="CACHE_TOOLHEAD_SETTINGS" MSG="Toolhead settings cached for {key}. {printer.toolhead.max_accel} accel, {printer.toolhead.minimum_cruise_ratio} ratio, {printer.toolhead.max_velocity} velocity, {printer.toolhead.square_corner_velocity} scv."
[gcode_macro RESTORE_TOOLHEAD_SETTINGS]
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set values = printer["gcode_macro CACHE_TOOLHEAD_SETTINGS"].cache.__getitem__(key) %}
{% if values is not defined or values == 'None' %}
{ action_raise_error("RESTORE_TOOLHEAD_SETTINGS: Toolhead settings not cached for key '" ~ key ~ "'.") }
{% endif %}
SET_VELOCITY_LIMIT ACCEL={values.accel} MINIMUM_CRUISE_RATIO={values.ratio} VELOCITY={values.speed} SQUARE_CORNER_VELOCITY={values.scv}
DEBUG_ECHO PREFIX="RESTORE_TOOLHEAD_SETTINGS" MSG="Toolhead settings restored. {values.accel} accel, {values.ratio} ratio, {values.speed} velocity, {values.scv} scv."
[gcode_macro SET_MACRO_TRAVEL_SETTINGS]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set accel = printer["gcode_macro RatOS"].macro_travel_accel %}
SET_VELOCITY_LIMIT ACCEL={accel} MINIMUM_CRUISE_RATIO=0.5 VELOCITY={speed} SQUARE_CORNER_VELOCITY={5}
DEBUG_ECHO PREFIX="SET_MACRO_TRAVEL_SETTINGS" MSG="Macro travel settings set. {accel} accel, {speed} velocity"
[gcode_macro SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% if printer["dual_carriage"] is not defined %}
SET_KINEMATIC_POSITION X={printable_x_max / 2} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
{% else %}
IDEX_SET_CENTER_KINEMATIC_POSITION
{% endif %}
[gcode_macro IDEX_SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set center_x = printable_x_max / 2 %}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x - (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x + (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
[gcode_macro VERIFY_HYBRID_INVERTED]
gcode =
{% set inverted = False %}
{% if printer.configfile.settings.ratos_hybrid_corexy is defined and printer.configfile.settings.ratos_hybrid_corexy.inverted is defined %}
{% if printer.configfile.settings.ratos_hybrid_corexy.inverted|lower == 'true' %}
{% set inverted = True %}
{% endif %}
{% endif %}
{% if inverted == False %}
{ action_emergency_stop("ratos_hybrid_corexy NOT INVERTED! Inverted hybrid core-xy bugfix not detected.") }
{% endif %}
[gcode_macro RATOS_ECHO]
gcode =
{% set prefix = "RatOS" %}
{% set debug = params.DEBUG|default(0)|int %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " | " ~ params.PREFIX %}
{% endif %}
{% set prefix = prefix ~ ":" %}
{% set msg = "" %}
{% if params.MSG is defined %}
{% set msg = params.MSG %}
{% else %}
{% set msg = "No msg parameter provided (this is a bug or unintended use)." %}
{% endif %}
{% if not debug %}
M117 {prefix} {msg}
{% endif %}
RATOS_LOG PREFIX="{prefix}" MSG="{msg}"
{% if not debug %}
RESPOND PREFIX="{prefix}" MSG="{msg}"
{% else %}
CONSOLE_ECHO TITLE="{prefix}" TYPE="debug" MSG="{msg}"
{% endif %}
[gcode_macro ENABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=True
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=prefix_filter VALUE="'{params.FILTER|default('')|lower}'"
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging enabled."
[gcode_macro DISABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=False
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging disabled."
[gcode_macro DEBUG_ECHO]
variable_enabled = False
variable_prefix_filter = ''
gcode =
{% set prefix = "DEBUG" %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " - " ~ params.PREFIX %}
{% endif %}
{% if enabled and (prefix_filter|lower == '' or prefix_filter|lower in params.PREFIX|lower) %}
RATOS_ECHO PREFIX="{prefix}" MSG="{params.MSG}" DEBUG=1
{% endif %}
[gcode_macro START_FEATURE]
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="Start {params.FEATURE} feature gcode"
{% set scv = printer.toolhead.square_corner_velocity|int|default(5) %}
{% set accel = printer.toolhead.max_accel|int|default(10000) %}
{% set ratio = printer.toolhead.minimum_cruise_ratio|float|default(0.5) %}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="scv" VALUE={scv}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="accel" VALUE={accel}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="ratio" VALUE={ratio}
_USER_START_FEATURE FEATURE="{params.FEATURE}"
[gcode_macro END_FEATURE]
variable_scv = 5
variable_accel = 10000
variable_ratio = 0.5
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="End {params.FEATURE} feature gcode"
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={scv} ACCEL={accel} MINIMUM_CRUISE_RATIO={ratio}
_USER_END_FEATURE FEATURE="{params.FEATURE}" SCV={scv} ACCEL={accel} RATIO={ratio}
[gcode_macro _ON_LAYER_CHANGE]
variable_layer_number = 0
description = INTERNAL USE ONLY. Call it from the slicers after layer change custom gcode
gcode =
{% set layer = params.LAYER|int %}
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE={layer}
SET_PRINT_STATS_INFO CURRENT_LAYER={layer}
[gcode_macro _LEARN_MORE_CALIBRATION]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/calibration" %}
{% set link_text = "RatOS Calibration Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_CHAMBER_FILTER]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter Control" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_FILAMENT]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/filaments" %}
{% set link_text = "RatOS Filament Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _CONSOLE_SAVE_CONFIG]
gcode =
M118 Click SAVE_CONFIG to save the settings to your printer.cfg.
[gcode_macro SAVE_Z_OFFSET]
gcode =
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SAVE_MULTIPLIER
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _LOAD_RATOS_SKEW_PROFILE]
gcode =
{% set ratos_skew_profile = printer["gcode_macro RatOS"].skew_profile|default("") %}
{% if ratos_skew_profile != "" %}
{% if printer.configfile.config["skew_correction %s" % ratos_skew_profile] is defined %}
SKEW_PROFILE LOAD={ratos_skew_profile}
GET_CURRENT_SKEW
{% else %}
{% set line_1 = '"Could not find skew profile %s!_N_Clearing skew correction."' % ratos_skew_profile %}
CONSOLE_ECHO TITLE="Missing skew profile!" TYPE="warning" MSG={line_1}
SET_SKEW CLEAR=1
{% endif %}
{% endif %}
[gcode_macro M601]
gcode =
PAUSE
[gcode_macro PAUSE]
description = Pauses the print
rename_existing = PAUSE_BASE
variable_extrude = 1.5
variable_retract = 1.5
variable_fan_speed = 0
variable_idex_mode = ""
variable_idex_toolhead = 0
variable_idex_toolhead_x = 0.0
variable_idex_toolhead_y = 0.0
variable_idex_toolhead_z = 0.0
gcode =
{% set runout_detected = true if params.RUNOUT|default(false)|lower == 'true' else false %}
_LED_PAUSE
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set idex_toolhead = 1 if idex_mode == 'primary' else 0 %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
SAVE_GCODE_STATE NAME=PAUSE_state
{% else %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_mode VALUE='"{idex_mode}"'
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead VALUE={idex_toolhead}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_x VALUE={printer.gcode_move.gcode_position.x|float}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_y VALUE={printer.gcode_move.gcode_position.y|float}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_z VALUE={printer.gcode_move.gcode_position.z|float}
DEBUG_ECHO PREFIX="PAUSE" MSG="idex_mode: {idex_mode}, idex_toolhead: {idex_toolhead}, idex_toolhead_x: {idex_toolhead_x}, idex_toolhead_y: {idex_toolhead_y}, idex_toolhead_z: {idex_toolhead_z}"
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
CACHE_TOOLHEAD_SETTINGS KEY="pause"
SET_MACRO_TRAVEL_SETTINGS
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set current_z = printer.toolhead.position.z|float %}
{% if current_z < (max_z - 20.0) %}
{% set z_safe = 20.0 %}
{% else %}
{% set z_safe = max_z - current_z %}
{% endif %}
PAUSE_BASE
{% if printer["dual_carriage"] is not defined %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan"].speed|float}
{% else %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t0"].speed|float}
{% else %}
{% if idex_toolhead == 0 %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t0"].speed|float}
{% else %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t1"].speed|float}
{% endif %}
{% endif %}
{% endif %}
M106 S0
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' else false %}
{% if idex_mode != '' %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' and printer['extruder1'].can_extrude|lower == 'true' else false %}
{% else %}
{% if printer.toolhead.extruder == 'extruder1' %}
{% set can_extrude = true if printer['extruder1'].can_extrude|lower == 'true' else false %}
{% endif %}
{% endif %}
{% endif %}
{% set R = printer["gcode_macro PAUSE"].retract|float %}
{% if can_extrude %}
G91
G1 E-{R} F2100
G90
{% else %}
{action_respond_info("Extruder not hot enough")}
{% endif %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set pause_print_park_x = printer["gcode_macro RatOS"].pause_print_park_x %}
{% set pause_print_park_in = printer["gcode_macro RatOS"].pause_print_park_in %}
{% if runout_detected %}
{% set pause_print_park_x = printer["gcode_macro RatOS"].runout_park_x %}
{% set pause_print_park_in = printer["gcode_macro RatOS"].runout_park_in %}
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
DEBUG_ECHO PREFIX="PAUSE" MSG="z_speed: {z_speed}, pause_print_park_x: {pause_print_park_x}, pause_print_park_in: {pause_print_park_in}, default_toolhead: {default_toolhead}"
{% if "xyz" in printer.toolhead.homed_axes %}
G91
G1 Z{z_safe} F{z_speed}
G90
{% if printer["dual_carriage"] is not defined %}
_PARK LOCATION={pause_print_park_in} X={pause_print_park_x}
{% else %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
_IDEX_SINGLE X={parking_position}
{% else %}
PARK_TOOLHEAD
{% endif %}
_PARK LOCATION={pause_print_park_in} X={pause_print_park_x}
{% endif %}
{% else %}
{action_respond_info("Printer not homed")}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="pause"
[gcode_macro RESUME]
description = Resumes the print if the printer is paused.
rename_existing = RESUME_BASE
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set target_idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set target_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% endif %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' else false %}
{% if target_idex_mode != '' %}
{% if target_idex_mode == 'copy' or target_idex_mode == 'mirror' %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' and printer['extruder1'].can_extrude|lower == 'true' else false %}
{% else %}
{% if printer.toolhead.extruder == 'extruder1' %}
{% set can_extrude = true if printer['extruder1'].can_extrude|lower == 'true' else false %}
{% endif %}
{% endif %}
{% endif %}
{% set fan_speed = printer["gcode_macro PAUSE"].fan_speed|float %}
{% if printer["dual_carriage"] is not defined %}
M106 S{(fan_speed * 255)}
{% else %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% else %}
{% if params.TOOLHEAD is defined %}
{% if params.TOOLHEAD == 0 %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
{% else %}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% endif %}
{% else %}
{% if printer["gcode_macro PAUSE"].idex_toolhead == 0 %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
{% else %}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% endif %}
{% endif %}
{% endif %}
M106.1 S{fan_speed}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if target_idex_mode == "copy" %}
_IDEX_COPY DANCE=0
{% elif target_idex_mode == "mirror" %}
_IDEX_MIRROR DANCE=0
{% else %}
{% if params.TOOLHEAD is defined %}
_SELECT_TOOL T={params.TOOLHEAD} X=-1 Y=-1 TOOLSHIFT=false
{% else %}
_SELECT_TOOL T={printer["gcode_macro PAUSE"].idex_toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% endif %}
{% set x = printer["gcode_macro PAUSE"].idex_toolhead_x|float %}
{% set y = printer["gcode_macro PAUSE"].idex_toolhead_y|float %}
{% set z = printer["gcode_macro PAUSE"].idex_toolhead_z|float %}
G1 X{x} Y{y} Z{z} F{speed}
{% if params.TOOLHEAD is defined %}
SAVE_GCODE_STATE NAME=PAUSE_STATE
{% endif %}
{% endif %}
{% if params.TOOLHEAD is not defined %}
{% set E = printer["gcode_macro PAUSE"].extrude|float %}
{% if can_extrude %}
G91
G1 E{E} F2100
G90
{% else %}
{action_respond_info("Extruder not hot enough")}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 MOVE_SPEED={speed}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=True
RESUME_BASE
_LED_PRINTING
[gcode_macro CANCEL_PRINT]
description = Cancels the printer
rename_existing = CANCEL_PRINT_BASE
gcode =
END_PRINT
TURN_OFF_HEATERS
CLEAR_PAUSE
CANCEL_PRINT_BASE
[gcode_macro START_PRINT]
description = Start print procedure, use this in your Slicer.
variable_post_processor_version = 2
variable_is_printing_gcode = False
variable_both_toolheads = True
variable_object_xoffset = 0
variable_first_x = -1
variable_first_y = -1
variable_total_toolshifts = 0
variable_initial_tool = 0
variable_extruder_first_layer_temp = ""
variable_extruder_other_layer_temp = ""
gcode =
{% if "xyz" in printer.toolhead.homed_axes and printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% if printer["gcode_macro _VAOC"].is_started|default(true)|lower == 'true' %}
_VAOC_END
{% endif %}
{% endif %}
_LED_START_PRINTING
CACHE_TOOLHEAD_SETTINGS KEY="start_print"
_USER_START_PRINT { rawparams }
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% set hotend_heat_soak_time = printer["gcode_macro RatOS"].hotend_heat_soak_time|default(0)|int %}
{% set z_probe_stowable = printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set X0 = params.X0|default(-1)|float %}
{% set X1 = params.X1|default(-1)|float %}
{% set Y0 = params.Y0|default(-1)|float %}
{% set Y1 = params.Y1|default(-1)|float %}
{% if first_x == -1 or first_y == -1 %}
{% set first_x = params.FIRST_X|default(-1)|float %}
{% set first_y = params.FIRST_Y|default(-1)|float %}
{% endif %}
{% set total_toolshifts = params.TOTAL_TOOLSHIFTS|default(0)|int %}
{% set initial_tool = params.INITIAL_TOOL|default(default_toolhead)|int %}
{% set start_chamber_temp = params.START_CHAMBER_TEMP|default(0)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set bed_temp = params.BED_TEMP|default(printer.heater_bed.target, true)|float %}
{% set total_layer_count = params.TOTAL_LAYER_COUNT|default(0)|int %}
{% set extruder_first_layer_temp = (params.EXTRUDER_TEMP|default("")).split(",") %}
RATOS_ECHO MSG="First print coordinates X:{first_x} Y:{first_y}"
{% if params.TOTAL_LAYER_COUNT is not defined %}
{% set link_url = "https://os.ratrig.com/docs/slicers" %}
{% set link_text = "RatOS Slicer Configuration" %}
{% set line_1 = '"Your slicer gcode settings are not up to date._N_Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="Incomplete Slicer Configuration detected" TYPE="warning" MSG={line_1}
{% endif %}
SET_PRINT_STATS_INFO CURRENT_LAYER=1
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE=1
{% if total_layer_count > 0 %}
SET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set swap_toolheads = true if printer["gcode_macro _IDEX_REMAP_TOOLHEADS"].enabled|default(false)|lower == 'true' else false %}
{% if swap_toolheads %}
{% set initial_tool = 0 if initial_tool == 1 else 1 %}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=active VALUE=True
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=active VALUE=True
{% endif %}
{% set both_toolheads = true %}
{% if total_toolshifts == 0 %}
{% set both_toolheads = false %}
{% endif %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
_IDEX_SINGLE X={parking_position}
{% endif %}
{% if both_toolheads and (idex_mode == "copy" or idex_mode == "mirror") %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Gcode tool changes found. Copy and mirror mode do not support toolchanges.")}
{% endif %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set both_toolheads = true %}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=initial_tool VALUE={initial_tool}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=first_x VALUE={first_x}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=first_y VALUE={first_y}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=total_toolshifts VALUE={total_toolshifts}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=both_toolheads VALUE={both_toolheads}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_first_layer_temp VALUE="'{params.EXTRUDER_TEMP}'"
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_other_layer_temp VALUE="'{params.EXTRUDER_OTHER_LAYER_TEMP}'"
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=_TOOLCHANGE VARIABLE=toolshift_count VALUE=0
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set svv = printer.save_variables.variables %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set parking_position_t0 = printer["gcode_macro T0"].parking_position|float %}
{% set parking_position_t1 = printer["gcode_macro T1"].parking_position|float %}
{% set stepper_x_position_min = printer.configfile.settings.stepper_x.position_min|float %}
{% set stepper_x_position_endstop = printer.configfile.settings.stepper_x.position_endstop|float %}
{% set dual_carriage_position_max = printer.configfile.settings.dual_carriage.position_max|float %}
{% set dual_carriage_position_endstop = printer.configfile.settings.dual_carriage.position_endstop|float %}
{% set x_parking_space = parking_position_t0 - (stepper_x_position_endstop , stepper_x_position_min)|max %}
{% set dc_parking_space = (dual_carriage_position_endstop , dual_carriage_position_max)|min - parking_position_t1 %}
{% if svv.idex_xoffset|abs >= (x_parking_space - 0.5) or svv.idex_xoffset|abs >= (dc_parking_space - 0.5) %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Toolhead x-offset is too high for the available parking space. Calibrate your X and DC endstop positions and make sure you stay below 1mm." % (copy_mode_max_width)) }
{% endif %}
{% endif %}
{% if (idex_mode == "copy" or idex_mode == "mirror") and printer.configfile.settings.ratos.enable_gcode_transform %}
{% if params.MIN_X is not defined or params.MAX_X is not defined %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Something went wrong! Missing important post processor start print parameter!") }
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=object_xoffset VALUE=0
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set boundary_box_min_x = params.MIN_X|default(0)|float %}
{% set boundary_box_max_x = params.MAX_X|default(printable_x_max)|float %}
{% set svv = printer.save_variables.variables %}
{% if default_toolhead == 0 %}
{% set boundary_box_max_x = boundary_box_max_x + svv.idex_xoffset %}
{% else %}
{% set boundary_box_min_x = boundary_box_min_x - svv.idex_xoffset %}
{% endif %}
{% set center_x = printable_x_max / 2.0 %}
{% set safe_distance = printer.configfile.settings.dual_carriage.safe_distance|float %}
{% set object_width = boundary_box_max_x - boundary_box_min_x %}
{% set copy_mode_max_width = center_x %}
{% set mirror_mode_max_width = center_x - safe_distance / 2.0 %}
DEBUG_ECHO PREFIX="START_PRINT" MSG="OBJECT_WIDTH: {object_width} BOUNDARY_BOX_MIN_X: {boundary_box_min_x} BOUNDARY_BOX_MAX_X: {boundary_box_max_x} CENTER_X: {center_x} SAFE_DISTANCE: {safe_distance}"
{% if idex_mode == "copy" and object_width > copy_mode_max_width %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Object is too big for copy mode! Max supported width is %s mm" % (copy_mode_max_width)) }
{% endif %}
{% if idex_mode == "mirror" and object_width > mirror_mode_max_width %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Object is too big for mirror mode! Max supported width is %s mm" % (mirror_mode_max_width)) }
{% endif %}
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
{% set object_xoffset = (printable_x_max - boundary_box_max_x - boundary_box_min_x) / 2 %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=object_xoffset VALUE={object_xoffset}
{% endif %}
{% endif %}
{% set has_initial_toolhead_filament_sensor = true if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool] is defined else false %}
{% if has_initial_toolhead_filament_sensor %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s filament sensor is empty." % (initial_tool)) }
{% endif %}
{% endif %}
{% endif %}
{% set has_initial_bowden_filament_sensor = true if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool] is defined else false %}
{% if has_initial_bowden_filament_sensor %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool].enabled|lower == "true" %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s bowden sensor is empty." % (initial_tool)) }
{% endif %}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined and both_toolheads %}
{% set has_secondary_toolhead_filament_sensor = true if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)] is defined else false %}
{% if has_secondary_toolhead_filament_sensor %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s filament sensor is empty." % (1 if initial_tool == 0 else 0)) }
{% endif %}
{% endif %}
{% endif %}
{% set has_secondary_bowden_filament_sensor = true if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)] is defined else false %}
{% if has_secondary_bowden_filament_sensor %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].enabled|lower == "true" %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s bowden sensor is empty." % (1 if initial_tool == 0 else 0)) }
{% endif %}
{% endif %}
{% endif %}
{% endif %}
_CHAMBER_FILTER_ON AT="before_print_start"
{% if printer["dual_carriage"] is defined %}
{% if printer["gcode_macro _IDEX_JOIN_SPOOLS"].enabled|default(false)|lower == 'true' %}
{% if both_toolheads %}
RATOS_ECHO MSG="Spool join is not possible if both toolheads are in use!"
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% endif %}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if idex_mode == '' %}
_SET_TOOLHEAD_OFFSET T={default_toolhead} MOVE={1 if "xyz" in printer.toolhead.homed_axes else 0}
{% endif %}
{% endif %}
CLEAR_PAUSE
{% if printer["gcode_macro RatOS"].force_absolute_position|lower == 'true' %}
G90
{% endif %}
SAVE_GCODE_STATE NAME=start_print_state
G21
G90
M82
_USER_START_PRINT_BEFORE_HOMING { rawparams }
{% if z_probe_stowable == true %}
STOWABLE_PROBE_BEGIN_BATCH
{% endif %}
MAYBE_HOME
_Z_HOP
{% if idex_mode != '' and not (printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
PARK_TOOLHEAD
{% endif %}
{% if chamber_temp > 0 %}
{% if printer["fan_generic filter"] is defined %}
{% if printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float > 0 %}
SET_FAN_SPEED FAN=filter SPEED={printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float}
{% endif %}
{% endif %}
_CHAMBER_HEATER_ON START_CHAMBER_TEMP={start_chamber_temp} CHAMBER_TEMP={chamber_temp}
_USER_START_PRINT_HEAT_CHAMBER { rawparams } CHAMBER_TEMP={chamber_temp}
{% endif %}
_START_PRINT_BEFORE_HEATING_BED T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
RATOS_ECHO MSG="Heating bed..."
M190 S{bed_temp}
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
_USER_START_PRINT_AFTER_HEATING_BED { rawparams }
_START_PRINT_AFTER_HEATING_BED T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
_USER_START_PRINT_BED_MESH { rawparams } X0={X0} X1={X1} Y0={Y0} Y1={Y1}
_START_PRINT_BED_MESH X0={X0} X1={X1} Y0={Y0} Y1={Y1} T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
{% if z_probe_stowable == true %}
STOWABLE_PROBE_END_BATCH
{% endif %}
{% if idex_mode == '' %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={extruder_first_layer_temp[0]|float}
{% else %}
{% if initial_tool == 0 or both_toolheads or (default_toolhead == 0 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={extruder_first_layer_temp[0]|float}
{% endif %}
{% if initial_tool == 1 or both_toolheads or (default_toolhead == 1 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
SET_HEATER_TEMPERATURE HEATER="extruder1" TARGET={extruder_first_layer_temp[1]|float}
{% endif %}
{% endif %}
_USER_START_PRINT_PARK { rawparams }
_START_PRINT_PARK
RATOS_ECHO MSG="Heating Extruder..."
{% if idex_mode == '' %}
TEMPERATURE_WAIT SENSOR="extruder" MINIMUM={extruder_first_layer_temp[0]|float} MAXIMUM={extruder_first_layer_temp[0]|float + 5}
{% else %}
{% if initial_tool == 0 or both_toolheads or (default_toolhead == 0 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
TEMPERATURE_WAIT SENSOR="extruder" MINIMUM={extruder_first_layer_temp[0]|float} MAXIMUM={extruder_first_layer_temp[0]|float + 5}
{% endif %}
{% if initial_tool == 1 or both_toolheads or (default_toolhead == 1 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
TEMPERATURE_WAIT SENSOR="extruder1" MINIMUM={extruder_first_layer_temp[1]|float} MAXIMUM={extruder_first_layer_temp[1]|float + 5}
{% endif %}
{% endif %}
{% if hotend_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking hotend for {hotend_heat_soak_time} seconds..."
G4 P{(hotend_heat_soak_time * 1000)}
{% endif %}
{% if idex_mode == '' %}
_LED_PRINTING
{% else %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
_LED_PRINTING
{% else %}
{% if both_toolheads %}
_LED_PRINTING TOOLHEAD={initial_tool}
{% if toolchange_standby_temp > -1 %}
_LED_TOOLHEAD_STANDBY TOOLHEAD={0 if initial_tool == 1 else 1}
{% else %}
_LED_PRINTING TOOLHEAD={0 if initial_tool == 1 else 1}
{% endif %}
{% else %}
_LED_PRINTING TOOLHEAD={initial_tool}
_LED_DEACTIVATE_TOOLHEAD TOOLHEAD={0 if initial_tool == 1 else 1}
{% endif %}
{% endif %}
{% endif %}
_USER_START_PRINT_AFTER_HEATING_EXTRUDER { rawparams } X0={X0} X1={X1} Y0={Y0} Y1={Y1}
_START_PRINT_AFTER_HEATING_EXTRUDER X0={X0} X1={X1} Y0={Y0} Y1={Y1} INITIAL_TOOLHEAD={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
{% if idex_mode != '' %}
{% if not both_toolheads %}
{% if initial_tool != default_toolhead %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
{% endif %}
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
{% if toolchange_standby_temp > -1 %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if initial_tool == 1 else 'extruder1'} TARGET={toolchange_standby_temp}
{% endif %}
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% set x_offset = printer.toolhead.position.x|float - printer.gcode_move.gcode_position.x|float %}
{% endif %}
RESTORE_GCODE_STATE NAME=start_print_state
{% if idex_mode != '' %}
{% set act_idex_mode = printer["dual_carriage"].carriage_1|default('')|lower %}
{% if act_idex_mode == "copy" or act_idex_mode == "mirror" %}
SET_GCODE_OFFSET X={x_offset} MOVE=0
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% if idex_mode == "copy" and idex_mode != act_idex_mode %}
_IDEX_COPY DANCE=0
{% elif idex_mode == "mirror" and idex_mode != act_idex_mode %}
_IDEX_MIRROR DANCE=0
{% endif %}
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
RATOS_ECHO MSG="Adjusting object x-offset by {(object_xoffset)} mm"
SET_GCODE_OFFSET X_ADJUST={object_xoffset} MOVE=0
{% endif %}
{% else %}
_SELECT_TOOL T={initial_tool} TOOLSHIFT=false
{% if initial_tool != default_toolhead %}
{% set svv = printer.save_variables.variables %}
SAVE_VARIABLE VARIABLE=idex_applied_offset VALUE={default_toolhead}
_SET_TOOLHEAD_OFFSET T={initial_tool} MOVE=0
{% endif %}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
_BEACON_SET_NOZZLE_TEMP_OFFSET TOOLHEAD={initial_tool}
{% endif %}
_SET_EXTRUSION_MODE
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=True
{% if printer["gcode_macro _SELECT_TOOL"] is defined %}
SET_GCODE_VARIABLE MACRO=_SELECT_TOOL VARIABLE=last_timestamp VALUE={printer["print_stats"].print_duration}
{% endif %}
_USER_END_START_PRINT { rawparams }
G92 E0
_CHAMBER_FILTER_ON AT="after_print_start"
RATOS_ECHO MSG="Printing..."
[gcode_macro _START_PRINT_BEFORE_HEATING_BED]
gcode =
{% set target_idex_mode = params.IDEX_MODE|default("")|lower %}
{% set initial_toolhead = params.T|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %}
{% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% set act_t = 1 if idex_mode == 'primary' else 0 %}
{% set auto_z_offset_calibration = False %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% set is_fixed = true if printer["gcode_macro _VAOC"].is_fixed|default(true)|lower == 'true' else false %}
{% if printer["gcode_macro _VAOC"].auto_z_offset_calibration|default("false")|lower == 'true' and is_fixed %}
{% if target_idex_mode != "copy" and target_idex_mode != "mirror" %}
{% if both_toolheads or initial_toolhead != default_toolhead %}
{% set auto_z_offset_calibration = True %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set is_stowable_probe = true if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' else false %}
{% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %}
RATOS_ECHO MSG="Pre-heating extruder..."
{% if printer["dual_carriage"] is defined %}
{% if auto_z_offset_calibration %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={min_temp}
SET_HEATER_TEMPERATURE HEATER="extruder1" TARGET={min_temp}
{% else %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET={min_temp}
{% endif %}
{% else %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={min_temp}
{% endif %}
{% endif %}
{% if not is_stowable_probe %}
{% if printer["dual_carriage"] is defined and act_t != default_toolhead %}
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=True
{% endif %}
RATOS_ECHO MSG="Heat soaking z probe..."
{% if auto_z_offset_calibration %}
{% set safe_distance = printer.configfile.settings.dual_carriage.safe_distance|float %}
{% if default_toolhead == 0 %}
_SELECT_TOOL T=0 TOOLSHIFT=false
G1 X{safe_home_x - safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
G1 X{safe_home_x + safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
{% elif default_toolhead == 1 %}
_SELECT_TOOL T=1 TOOLSHIFT=false
G1 X{safe_home_x + safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
G1 X{safe_home_x - safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
{% endif %}
{% else %}
_MOVE_TO_SAFE_Z_HOME
{% endif %}
G0 Z2 F{z_speed}
{% endif %}
[gcode_macro _START_PRINT_AFTER_HEATING_BED]
gcode =
{% set target_idex_mode = params.IDEX_MODE|default("")|lower %}
{% set initial_toolhead = params.T|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %}
{% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set auto_z_offset_calibration = False %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% set is_fixed = true if printer["gcode_macro _VAOC"].is_fixed|default(true)|lower == 'true' else false %}
{% if printer["gcode_macro _VAOC"].auto_z_offset_calibration|default("false")|lower == 'true' and is_fixed %}
{% if target_idex_mode != "copy" and target_idex_mode != "mirror" %}
{% if both_toolheads or initial_toolhead != default_toolhead %}
{% set auto_z_offset_calibration = True %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_wipe_before_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_wipe_before_true_zero|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %}
RATOS_ECHO MSG="Waiting for extruder to be preheated..."
{% if printer["dual_carriage"] is defined %}
{% if auto_z_offset_calibration %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
TEMPERATURE_WAIT SENSOR=extruder1 MINIMUM={min_temp} MAXIMUM={max_temp}
{% else %}
{% if default_toolhead == 0 %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
{% else %}
TEMPERATURE_WAIT SENSOR=extruder1 MINIMUM={min_temp} MAXIMUM={max_temp}
{% endif %}
{% endif %}
{% else %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_Z_HOP
{% endif %}
{% if auto_z_offset_calibration %}
{% set parking_position_t0 = printer["gcode_macro T0"].parking_position|float %}
{% set parking_position_t1 = printer["gcode_macro T1"].parking_position|float %}
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=True
PARK_TOOLHEAD
_CLEANING_MOVE TOOLHEAD={default_toolhead}
_SELECT_TOOL T={0 if default_toolhead == 1 else 1} X={parking_position_t0 if default_toolhead == 1 else parking_position_t1} Y=0 TOOLSHIFT=false
_CLEANING_MOVE TOOLHEAD={0 if default_toolhead == 1 else 1}
_VAOC_CALIBRATE_Z_OFFSET AUTO_Z_OFFSET=True
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=false
{% endif %}
{% set needs_rehoming = False %}
{% if printer.z_tilt is defined and not printer.z_tilt.applied %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% set needs_rehoming = True %}
{% endif %}
{% if printer.quad_gantry_level is defined and not printer.quad_gantry_level.applied %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% set needs_rehoming = True %}
{% endif %}
{% if needs_rehoming %}
G28 Z
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero %}
{% if beacon_contact_wipe_before_true_zero %}
_START_PRINT_AFTER_HEATING_BED_PROBE_FOR_WIPE
{% endif %}
_START_PRINT_AFTER_HEATING_CONTACT_WITH_OPTIONAL_WIPE
{% endif %}
[gcode_macro _START_PRINT_AFTER_HEATING_BED_PROBE_FOR_WIPE]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
G0 Z5 F{z_speed}
G0 X50 Y10 F{speed}
PROBE PROBE_METHOD=contact SAMPLES=1
BEACON_QUERY
[gcode_macro _START_PRINT_AFTER_HEATING_CONTACT_WITH_OPTIONAL_WIPE]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_true_zero_location = printer["gcode_macro RatOS"].beacon_contact_true_zero_location|default("front")|lower %}
{% set beacon_contact_true_zero_margin_x = printer["gcode_macro RatOS"].beacon_contact_true_zero_margin_x|default(30)|int %}
{% set beacon_contact_wipe_before_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_wipe_before_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_wipe_before_true_zero %}
{% if printer.beacon.last_probe_result|lower == "ok" %}
{% set last_z_offset = printer.beacon.last_z_result %}
RATOS_ECHO MSG="Auto calibration nozzle wipe with probe result {last_z_offset}..."
G0 Z{(0.2 + last_z_offset)} F{z_speed}
G0 X70 F300
{% else %}
RATOS_ECHO MSG="Skipping auto calibration nozzle wipe because probing failed!"
{% endif %}
{% endif %}
G0 Z5 F{z_speed}
_MOVE_TO_SAFE_Z_HOME
RATOS_ECHO MSG="Heating extruder to probing temperature..."
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET={beacon_contact_true_zero_temp}
TEMPERATURE_WAIT SENSOR={"extruder" if default_toolhead == 0 else "extruder1"} MINIMUM={beacon_contact_true_zero_temp} MAXIMUM={beacon_contact_true_zero_temp + 5}
RATOS_ECHO MSG="Beacon contact auto calibration..."
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
G0 Z5 F{z_speed}
[gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER]
gcode =
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set first_x = printer["gcode_macro START_PRINT"].first_x|default(-1)|float %}
{% set first_y = printer["gcode_macro START_PRINT"].first_y|default(-1)|float %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set center_x = printable_x_max / 2.0 %}
{% set center_y = printable_y_max / 2.0 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% if printer["dual_carriage"] is defined %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
{% endif %}
{% set X0 = params.X0|default(-1)|int %}
{% set X1 = params.X1|default(-1)|int %}
{% set Y0 = params.Y0|default(-1)|int %}
{% set Y1 = params.Y1|default(-1)|int %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set initial_toolhead = params.INITIAL_TOOLHEAD|default(default_toolhead)|int %}
{% if idex_mode == '' %}
_PRIME
{% else %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
RATOS_ECHO PREFIX="IDEX" MSG="using combined prime offset for IDEX {idex_mode} mode"
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% else %}
{% if both_toolheads %}
{% if initial_toolhead == 0 %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T1"
_SELECT_TOOL T=1 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T0"
_SELECT_TOOL T=0 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% else %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T0"
_SELECT_TOOL T=0 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T1"
_SELECT_TOOL T=1 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% endif %}
{% else %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T{initial_toolhead}"
_SELECT_TOOL T={initial_toolhead} TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% endif %}
{% endif %}
{% endif %}
CACHE_TOOLHEAD_SETTINGS KEY="start_print_after_heating_extruder"
SET_MACRO_TRAVEL_SETTINGS
{% if (X0 > -1 and Y1 > -1) or (first_x > 0 and first_y > 0) %}
{% if printer["dual_carriage"] is defined %}
{% set acceleration = printer["gcode_macro RatOS"].toolchange_travel_accel %}
{% set max_accel = printer.toolhead.max_accel|float %}
{% set square_corner_velocity = printer.toolhead.square_corner_velocity|float %}
SET_VELOCITY_LIMIT ACCEL={acceleration} MINIMUM_CRUISE_RATIO=0 SQUARE_CORNER_VELOCITY=20
{% endif %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
G0 Z3 F{z_speed}
{% endif %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro RatOS"].nozzle_priming|lower == 'false' %}
{% set first_z = 1 %}
{% else %}
{% set first_z = 3 %}
{% endif %}
{% if idex_mode == "mirror" %}
{% if first_y >= 0 %}
G0 Y{first_y} F{speed}
{% else %}
G0 Y{Y1} F{speed}
{% endif %}
{% endif %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro RatOS"].nozzle_priming|lower == 'false' %}
_MOVE_TO_LOADING_POSITION TOOLHEAD={initial_toolhead}
_PURGE_FILAMENT TOOLHEAD={initial_toolhead} E={printer["gcode_macro RatOS"].toolchange_first_purge|default(50)|float}
_CLEANING_MOVE TOOLHEAD={initial_toolhead}
{% endif %}
{% if first_x >= 0 and first_y >= 0 %}
G0 X{first_x} Y{first_y} Z{first_z} F{speed}
{% else %}
{% set first_x = X0 %}
{% set first_y = Y0 %}
{% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' or printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %}
{% set first_x = X0 %}
{% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %}
{% set first_x = X1 %}
{% else %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_x|float <= center_x %}
{% set first_x = X0 %}
{% else %}
{% set first_x = X1 %}
{% endif %}
{% endif %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %}
{% set first_y = Y0 %}
{% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %}
{% set first_y = Y1 %}
{% else %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_y|float <= center_y %}
{% set first_y = Y0 %}
{% else %}
{% set first_y = Y1 %}
{% endif %}
{% endif %}
{% endif %}
G0 X{first_x} Y{first_y} Z{first_z} F{speed}
{% endif %}
{% endif %}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print_after_heating_extruder"
_LOAD_RATOS_SKEW_PROFILE
[gcode_macro _PRIME]
gcode =
{% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' or printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %}
PRIME_BLOB INITIAL_TOOLHEAD={params.INITIAL_TOOLHEAD} BOTH_TOOLHEADS={params.BOTH_TOOLHEADS} IDEX_MODE={params.IDEX_MODE} Y1={params.Y1}
{% endif %}
[gcode_macro END_PRINT]
description = End print procedure, use this in your Slicer.
gcode =
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
SAVE_GCODE_STATE NAME=end_print_state
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=_IDEX_REMAP_TOOLHEADS VARIABLE=enabled VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
{% set object_xoffset = printer["gcode_macro START_PRINT"].object_xoffset|default(0)|float %}
RATOS_ECHO MSG="Adjusting object x-offset by {(0-object_xoffset)} mm"
SET_GCODE_OFFSET X_ADJUST={(0-object_xoffset)}
{% endif %}
{% endif %}
_USER_END_PRINT_BEFORE_HEATERS_OFF { rawparams }
_END_PRINT_BEFORE_HEATERS_OFF
TURN_OFF_HEATERS
_USER_END_PRINT_AFTER_HEATERS_OFF { rawparams }
_END_PRINT_AFTER_HEATERS_OFF
_USER_END_PRINT_PARK { rawparams }
_END_PRINT_PARK
{% if printer["gcode_macro RatOS"].skew_profile is defined %}
SET_SKEW CLEAR=1
{% endif %}
{% if printer["dual_carriage"] is not defined and printer["gcode_macro RatOS"].end_print_motors_off|lower != 'false' %}
M84
{% endif %}
M107
BED_MESH_CLEAR
RATOS_ECHO MSG="Done :)"
RESTORE_GCODE_STATE NAME=end_print_state
{% if printer["dual_carriage"] is defined %}
M84
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
{% if printer["dual_carriage"] is not defined %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
SET_GCODE_OFFSET Z=0 MOVE=0
{% endif %}
{% endif %}
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print"
_CHAMBER_FILTER_ON AT="print_end"
_CHAMBER_FILTER_OFF
_CHAMBER_HEATER_OFF
_USER_END_PRINT_FINISHED { rawparams }
[gcode_macro _END_PRINT_BEFORE_HEATERS_OFF]
gcode =
RATOS_ECHO MSG="Cleaning up..."
[gcode_macro _END_PRINT_AFTER_HEATERS_OFF]
gcode =
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set current_z = printer.toolhead.position.z|float %}
{% set z_hop = printer["gcode_macro RatOS"].end_print_park_z_hop|float %}
{% set r = printer["gcode_macro RatOS"].end_print_retract_filament|default(4)|float %}
{% if current_z < (max_z - z_hop) %}
{% set z_safe = z_hop %}
{% else %}
{% set z_safe = max_z - current_z %}
{% endif %}
G91
G1 E-2 F3600
G0 Z{z_safe} F3600
G1 E-{(r-2)} F3600
G90
[gcode_macro _SET_EXTRUSION_MODE]
gcode =
{% if printer["gcode_macro RatOS"].relative_extrusion|lower == 'true' %}
M83
{% else %}
M82
{% endif %}
[gcode_macro GENERATE_SHAPER_GRAPHS]
description = Genarates input shaper resonances graphs for analysis. Uses the AXIS parameter for if you only want to do one axis at a time, (eg. GENERATE_SHAPER_GRAPHS AXIS=X)
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="generate_shaper_graphs"
SET_MACRO_TRAVEL_SETTINGS
CACHE_IS_GRAPH_FILES
_LED_INPUT_SHAPER_START
{% set axis = params.AXIS|default('')|lower %}
{% set freq_start = params.FREQUENCY_START|default(10)|int %}
{% set freq_end = params.FREQUENCY_END|default(133)|int %}
{% set hz_per_sec = params.HZ_PER_SEC|default(1)|float %}
{% if axis != '' %}
{% if axis == 'x' %}
MAYBE_HOME
TEST_RESONANCES AXIS=X FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_x
{% elif axis == 'y' %}
MAYBE_HOME
TEST_RESONANCES AXIS=Y FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_y
{% else %}
{action_raise_error("Unknown axis specified. Expected X or Y.")}
{% endif %}
{% else %}
MAYBE_HOME
TEST_RESONANCES AXIS=X FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
TEST_RESONANCES AXIS=Y FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_x
RUN_SHELL_COMMAND CMD=generate_shaper_graph_y
{% endif %}
_LED_INPUT_SHAPER_END
RESTORE_TOOLHEAD_SETTINGS KEY="generate_shaper_graphs"
_LEARN_MORE_CALIBRATION
SHOW_IS_GRAPH_FILES TITLE="Shaper graph"
[gcode_shell_command generate_shaper_graph_x]
command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-x.sh
timeout = 60.
verbose = True
[gcode_shell_command generate_shaper_graph_y]
command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-y.sh
timeout = 60.
verbose = True
[gcode_macro MEASURE_COREXY_BELT_TENSION]
description = Generates resonance graph used to ensure belts are equally tensioned.
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="measure_corexy_belt_tension"
SET_MACRO_TRAVEL_SETTINGS
CACHE_IS_GRAPH_FILES
_LED_INPUT_SHAPER_START
{% set freq_start = params.FREQUENCY_START|default(10)|int %}
{% set freq_end = params.FREQUENCY_END|default(133)|int %}
{% set hz_per_sec = params.HZ_PER_SEC|default(1)|float %}
MAYBE_HOME
TEST_RESONANCES AXIS=1,1 OUTPUT=raw_data NAME=belt-tension-upper FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
TEST_RESONANCES AXIS=1,-1 OUTPUT=raw_data NAME=belt-tension-lower FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_belt_tension_graph
_LED_INPUT_SHAPER_END
RESTORE_TOOLHEAD_SETTINGS KEY="measure_corexy_belt_tension"
_LEARN_MORE_CALIBRATION
SHOW_IS_GRAPH_FILES TITLE="Belt Tension Graph"
[gcode_shell_command generate_belt_tension_graph]
command = /home/pi/printer_data/config/RatOS/scripts/generate-belt-tension-graph.sh
timeout = 90.
verbose = True
[idle_timeout]
gcode =
{% if printer.webhooks.state|lower == 'ready' %}
{% if printer.pause_resume.is_paused|lower == 'false' %}
RATOS_ECHO PREFIX="IDLE" MSG="2 hours since last activity. Powering off heaters and motors.."
TURN_OFF_HEATERS
M84
{% endif %}
{% endif %}
timeout = 7200
[temperature_sensor raspberry_pi]
sensor_type = temperature_host
[skew_correction]
[input_shaper]
[virtual_sdcard]
path = ~/printer_data/gcodes
[display_status]
[pause_resume]
[force_move]
enable_force_move = True
[respond]
[resonance_generator]
[ratos]
allow_unknown_gcode_generator = True
[exclude_object]
[heater_bed]
heater_pin = heater_bed_heating_pin
sensor_pin = heater_bed_sensor_pin
sensor_type = Generic 3950
min_temp = 0
max_temp = 120
pwm_cycle_time = 0.02
control = pid
pid_kp = 68.203
pid_ki = 2.842
pid_kd = 409.216
[controller_fan controller_fan]
pin = fan_controller_board_pin
[printer]
kinematics = corexy
max_velocity = 300
max_accel = 3000
max_z_velocity = 20
max_z_accel = 350
square_corner_velocity = 5
minimum_cruise_ratio = 0.5
[gcode_macro QUAD_GANTRY_LEVEL]
rename_existing = QUAD_GANTRY_LEVEL_ORIG
gcode =
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
DEPLOY_PROBE
{% endif %}
QUAD_GANTRY_LEVEL_ORIG
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
STOW_PROBE
{% endif %}
[stepper_x]
position_max = 350
position_endstop = 350
step_pin = PC14
dir_pin = !x_dir_pin
enable_pin = !PE6
microsteps = 64
full_steps_per_rotation = 400
rotation_distance = 40
homing_speed = 50
endstop_pin = tmc5160_stepper_x:virtual_endstop
homing_retract_dist = 0
position_min = 0
[stepper_y]
position_max = 350
position_endstop = 350
step_pin = PE5
dir_pin = y_dir_pin
enable_pin = !PE3
microsteps = 64
full_steps_per_rotation = 400
rotation_distance = 40
homing_speed = 50
endstop_pin = tmc5160_stepper_y:virtual_endstop
homing_retract_dist = 0
position_min = 0
[stepper_z]
position_max = 310
step_pin = PG11
dir_pin = !z0_dir_pin
enable_pin = !PG12
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
position_min = -5
homing_speed = 10
endstop_pin = probe:z_virtual_endstop
[bed_mesh]
speed = 300
horizontal_move_z = 10
mesh_min = 20,30
mesh_max = 310,310
fade_start = 0.6
fade_end = 10.0
probe_count = 5,5
algorithm = bicubic
[quad_gantry_level]
gantry_corners =
-60,-10
410,420
points =
50,25
50,275
300,275
300,25
speed = 300
horizontal_move_z = 10
retries = 5
retry_tolerance = 0.0075
max_adjust = 10
[gcode_macro G32]
gcode =
SAVE_GCODE_STATE NAME=STATE_G32
G90
G28
QUAD_GANTRY_LEVEL
G28
G0 X175 Y175 Z30 F3600
RESTORE_GCODE_STATE NAME=STATE_G32
[firmware_retraction]
retract_speed = 60
unretract_extra_length = 0
unretract_speed = 60
retract_length = 0.5
[resonance_tester]
accel_chip_x = beacon
accel_chip_y = beacon
probe_points =
175,175,20
[tmc5160 stepper_x]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD6
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.022
diag1_pin = ^!x_diag_pin
driver_sgt = 0
[tmc5160 stepper_y]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD5
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.022
diag1_pin = ^!y_diag_pin
driver_sgt = 0
[tmc5160 stepper_z]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA15
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[tmc5160 stepper_z1]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA9
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z1]
step_pin = PB4
dir_pin = !z1_dir_pin
enable_pin = !PB5
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc5160 stepper_z2]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA10
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z2]
step_pin = PG15
dir_pin = !z2_dir_pin
enable_pin = !PG14
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc5160 stepper_z3]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD2
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z3]
step_pin = PG9
dir_pin = !z3_dir_pin
enable_pin = !PG13
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc2209 extruder]
stealthchop_threshold = 0
interpolate = False
uart_pin = toolboard_t0:PB5
run_current = 0.707
driver_tbl = 0
driver_toff = 4
driver_hend = 6
driver_hstrt = 7
sense_resistor = 0.11
[beacon]
serial = /dev/beacon
x_offset = 0
y_offset = 22.5
mesh_main_direction = x
mesh_runs = 1
speed = 15.
lift_speed = 80.
contact_max_hotend_temperature = 275
[delayed_gcode _BEACON_INIT]
initial_duration = 1
gcode =
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
{% set svv = printer.save_variables.variables %}
{% set nozzle_expansion_coefficient_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(0)|float %}
{% if nozzle_expansion_coefficient_multiplier == 0 %}
{% if printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier is not defined %}
{% set nozzle_expansion_coefficient_multiplier = 1.0 %}
{% else %}
{% set nozzle_expansion_coefficient_multiplier = printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier|default(1.0)|float %}
{% endif %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_multiplier VALUE={nozzle_expansion_coefficient_multiplier}
{% endif %}
{% if printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier is defined %}
CONSOLE_ECHO TITLE="Deprecated gcode variable" TYPE="warning" MSG={'"Please remove the variable beacon_contact_expansion_multiplier from your config file."'}
{% endif %}
[gcode_macro BEACON_RATOS_CALIBRATION]
gcode =
RATOS_ECHO MSG="Did you mean BEACON_RATOS_CALIBRATE?"
[gcode_macro BEACON_RATOS_CALIBRATE]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
BEACON_INITIAL_CALIBRATION _AUTOMATED=True
{% if beacon_contact_start_print_true_zero %}
BEACON_POKE_TEST _AUTOMATED=True
_BEACON_CHECK_POKE
{% if printer["dual_carriage"] is not defined %}
BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET _AUTOMATED=True
{% endif %}
{% endif %}
{% if chamber_temp > 0 %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
BEACON_FINAL_CALIBRATION _AUTOMATED=True BED_TEMP={bed_temp} CHAMBER_TEMP={chamber_temp}
{% if beacon_contact_start_print_true_zero %}
BEACON_MEASURE_GANTRY_TWIST
_BEACON_MAYBE_SCAN_COMPENSATION
{% endif %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% if chamber_temp > 0 %}
_CHAMBER_HEATER_OFF
{% endif %}
{% if beacon_contact_start_print_true_zero %}
{% if printer["dual_carriage"] is not defined %}
_BEACON_ECHO_NOZZLE_TEMP_OFFSETS
{% endif %}
_BEACON_ECHO_POKE
{% endif %}
RATOS_ECHO MSG="Beacon calibration finished!"
_LED_BEACON_CALIBRATION_END
RATOS_ECHO MSG="Saving config and restarting klipper..."
SAVE_CONFIG
[gcode_macro BEACON_INITIAL_CALIBRATION]
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed * 60 %}
MAYBE_HOME X=True Y=True
_LED_BEACON_CALIBRATION_START
G90
_MOVE_TO_SAFE_Z_HOME
BEACON_AUTO_CALIBRATE
_Z_HOP
RATOS_ECHO MSG="Initial beacon contact calibration finished!"
{% if not automated %}
_CONSOLE_SAVE_CONFIG
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro BEACON_FINAL_CALIBRATION]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
_BEACON_HOME_AND_ABL
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
_LED_BEACON_CALIBRATION_START
G90
G0 Z2 F{z_hop_speed}
RATOS_ECHO MSG="Waiting for calibration temperature..."
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=150
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp}
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} MAXIMUM={(bed_temp + 5)}
TEMPERATURE_WAIT SENSOR={'extruder' if default_toolhead == 0 else 'extruder1'} MINIMUM=150 MAXIMUM=155
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
_Z_HOP
BEACON_AUTO_CALIBRATE
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% endif %}
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_OFF
{% endif %}
_Z_HOP
RATOS_ECHO MSG="Final beacon contact calibration finished!"
{% if not automated %}
_CONSOLE_SAVE_CONFIG
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro BEACON_POKE_TEST]
variable_poke_result_1 = -1
variable_poke_result_2 = -1
variable_poke_result_3 = -1
variable_poke_result_4 = -1
variable_poke_result_5 = -1
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_1 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_2 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_3 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_4 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_5 VALUE=-1
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
G0 Z5 F{z_hop_speed}
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=1
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=2
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=3
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=4
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=5
_Z_HOP
RATOS_ECHO MSG="Beacon poke test finished!"
{% if not automated %}
_BEACON_ECHO_POKE
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro _BEACON_PROBE_POKE]
gcode =
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
BEACON_POKE speed=3 top=5 bottom={poke_bottom}
BEACON_QUERY
[gcode_macro _BEACON_STORE_POKE]
gcode =
{% set i = params.I|default(1)|int %}
{% set last_z = printer.beacon.last_poke_result|default(0)|float %}
{% if printer.beacon.last_poke_result|lower != "none" %}
{% if printer.beacon.last_poke_result.error == 0 %}
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE={"poke_result_%s" % i} VALUE={printer.beacon.last_poke_result.latency}
{% endif %}
{% endif %}
[gcode_macro _BEACON_CHECK_POKE]
gcode =
{% set p1 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_1|int %}
{% set p2 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_2|int %}
{% set p3 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_3|int %}
{% set p4 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_4|int %}
{% set p5 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_5|int %}
{% if p1 == -1 or p2 == -1 or p3 == -1 or p4 == -1 or p5 == -1 %}
_LED_BEACON_CALIBRATION_ERROR
{ action_raise_error("Beacon poke test error!") }
{% endif %}
{% set avg = (p1 + p2 + p3 + p4 + p5) / 5 %}
{% if avg > 6 %}
_LED_BEACON_CALIBRATION_ERROR
{ action_raise_error("Beacon poke test failed!") }
{% endif %}
[gcode_macro _BEACON_ECHO_POKE]
gcode =
{% set p1 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_1|int %}
{% set p2 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_2|int %}
{% set p3 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_3|int %}
{% set p4 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_4|int %}
{% set p5 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_5|int %}
{% set avg = (p1 + p2 + p3 + p4 + p5) / 5 %}
{% if avg <= 1 %}
{% set type = "success" %}
{% set note = "Extremely low noise, rarely achieved" %}
{% elif avg > 1 and avg <= 4 %}
{% set type = "info" %}
{% set note = "Excellent performance for a typical printer" %}
{% elif avg > 4 and avg <= 8 %}
{% set type = "warning" %}
{% set note = "Acceptable performance, machine may have considerable cyclic axis noise" %}
{% elif avg > 8 and avg <= 11 %}
{% set type = "alert" %}
{% set note = "Not ideal, may want to verify proper mounting or use thinner stackups" %}
{% elif avg > 11 %}
{% set type = "alert" %}
{% set note = "Reason for concern, present setup may be risky to continue with" %}
{% endif %}
CONSOLE_ECHO TITLE="Beacon poke test result:" TYPE={type} MSG={'"Average latency: %.2f_N_%s"' % (avg, note)}
[gcode_macro BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET]
variable_reference_z = 0.0
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set test_margin = 30 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero %}
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
RATOS_ECHO PREFIX="BEACON" MSG="Nozzle temperature offset calibration..."
{% for i in range(10) %}
beacon_poke speed=3 top=5 bottom={poke_bottom}
{% endfor %}
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=250
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET=0
{% if not automated %}
_BEACON_ECHO_NOZZLE_TEMP_OFFSETS
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
{% endif %}
[gcode_macro _BEACON_PROBE_NOZZLE_TEMP_OFFSET]
gcode =
{% set temp = params.TEMP|int %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set hotend_heat_soak_time = printer["gcode_macro RatOS"].hotend_heat_soak_time|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% set idex_zcontrolpoint = svv.idex_zcontrolpoint|default(150)|float %}
RATOS_ECHO PREFIX="BEACON" MSG="Waiting for nozzle to reach {temp}°C..."
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET={temp}
TEMPERATURE_WAIT SENSOR={"extruder" if default_toolhead == 0 else "extruder1"} MINIMUM={temp} MAXIMUM={temp + 2}
{% if hotend_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking hotend for {hotend_heat_soak_time} seconds..."
G4 P{(hotend_heat_soak_time * 1000)}
{% endif %}
RATOS_ECHO PREFIX="BEACON" MSG="Probing with nozzle temperature {temp}°C..."
PROBE PROBE_METHOD=contact PROBE_SPEED=3 LIFT_SPEED=15 SAMPLES=5 SAMPLE_RETRACT_DIST=3 SAMPLES_TOLERANCE=0.005 SAMPLES_TOLERANCE_RETRIES=10 SAMPLES_RESULT=median
BEACON_QUERY
G0 Z5 F{z_speed}
[gcode_macro _BEACON_STORE_NOZZLE_TEMP_OFFSET]
gcode =
{% set temp = params.TEMP|int %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% set last_z = printer.beacon.last_z_result|default(0)|float %}
{% if temp == 150 %}
SET_GCODE_VARIABLE MACRO=BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET VARIABLE=reference_z VALUE={last_z}
{% else %}
{% set reference_z = printer["gcode_macro BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET"].reference_z|default(0)|float %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_t{default_toolhead} VALUE={(last_z - reference_z)}
{% endif %}
[gcode_macro _BEACON_ECHO_NOZZLE_TEMP_OFFSETS]
gcode =
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% if default_toolhead == 0 %}
CONSOLE_ECHO TYPE="info" MSG={'"T0 expansion coefficient %.6f"' % svv.nozzle_expansion_coefficient_t0}
{% else %}
CONSOLE_ECHO TYPE="info" MSG={'"T1 expansion coefficient %.6f"' % svv.nozzle_expansion_coefficient_t1}
{% endif %}
[gcode_macro _BEACON_SET_NOZZLE_TEMP_OFFSET]
variable_runtime_temp = 0
gcode =
{% set toolhead = params.TOOLHEAD|default(0)|int %}
{% set reset = true if params.RESET|default(false)|lower == 'true' else false %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set svv = printer.save_variables.variables %}
{% if reset %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_applied_offset VALUE=0
{% else %}
{% if beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
{% set nozzle_expansion_coefficient_t0 = svv.nozzle_expansion_coefficient_t0|default(0)|float %}
{% if printer["dual_carriage"] is defined %}
{% set nozzle_expansion_coefficient_t1 = svv.nozzle_expansion_coefficient_t1|default(0)|float %}
{% endif %}
{% set nozzle_expansion_coefficient_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(1.0)|float %}
{% set applied_offset = svv.nozzle_expansion_applied_offset|default(0)|float %}
{% set temp = printer['extruder' if toolhead == 0 else 'extruder1'].target|float %}
{% set temp_offset = temp - beacon_contact_true_zero_temp %}
{% set expansion_coefficient = nozzle_expansion_coefficient_t0 if toolhead == 0 else nozzle_expansion_coefficient_t1 %}
{% set expansion_offset = nozzle_expansion_coefficient_multiplier * (temp_offset * (expansion_coefficient / 100)) %}
{% set new_offset = ((-applied_offset) + expansion_offset) %}
SET_GCODE_OFFSET Z_ADJUST={new_offset} MOVE=1 SPEED={z_speed}
SAVE_VARIABLE VARIABLE=nozzle_expansion_applied_offset VALUE={expansion_offset}
SET_GCODE_VARIABLE MACRO=_BEACON_SET_NOZZLE_TEMP_OFFSET VARIABLE=runtime_temp VALUE={temp}
RATOS_ECHO PREFIX="BEACON" MSG={'"Nozzle expansion offset of %.6fmm applied to T%s"' % (expansion_offset, toolhead)}
DEBUG_ECHO PREFIX="_BEACON_SET_NOZZLE_TEMP_OFFSET" MSG="multiplier: {nozzle_expansion_coefficient_multiplier}, coefficient: {expansion_coefficient}, temp_offset: {temp_offset}, expansion_offset: {expansion_offset}, applied_offset: {applied_offset}, new_offset: {new_offset}"
{% endif %}
{% endif %}
[gcode_macro BEACON_MEASURE_GANTRY_TWIST]
variable_needs_compensation = False
variable_reference_z = 0.0
variable_front = 0.0
variable_front_left = 0.0
variable_front_right = 0.0
variable_back = 0.0
variable_back_left = 0.0
variable_back_right = 0.0
variable_right = 0.0
variable_left = 0.0
variable_margin_x = 40
variable_margin_y = 40
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=False
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
RATOS_ECHO PREFIX="BEACON" MSG="Measure gantry twist..."
{% for i in range(10) %}
beacon_poke speed=3 top=5 bottom={poke_bottom}
{% endfor %}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="center"
G0 X{margin_x} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front_left"
G0 X{safe_home_x} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front"
G0 X{(printable_x_max - margin_x)} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front_right"
G0 X{(printable_x_max - margin_x)} Y{safe_home_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="right"
G0 X{(printable_x_max - margin_x)} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back_right"
G0 X{safe_home_x} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back"
G0 X{margin_x} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back_left"
G0 X{margin_x} Y{safe_home_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="left"
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
_BEACON_ECHO_GANTRY_TWIST
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro _BEACON_PROBE_GANTRY_TWIST]
gcode =
RATOS_ECHO PREFIX="BEACON" MSG="Probing..."
BEACON_OFFSET_COMPARE
BEACON_QUERY
[gcode_macro _BEACON_STORE_GANTRY_TWIST]
gcode =
{% set location = params.LOCATION|lower %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set last_z = printer.beacon.last_offset_result["delta"]|default(0)|float %}
{% if location == "center" %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=reference_z VALUE={last_z}
{% else %}
{% set reference_z = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].reference_z|default(0)|float %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE={location} VALUE={(last_z - reference_z)}
{% endif %}
[gcode_macro _BEACON_ECHO_GANTRY_TWIST]
gcode =
{% set reference_z = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].reference_z|default(0)|float * 1000 %}
{% set front_left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front_left|default(0)|float * 1000 %}
{% set front = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front|default(0)|float * 1000 %}
{% set front_right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front_right|default(0)|float * 1000 %}
{% set right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].right|default(0)|float * 1000 %}
{% set back_right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back_right|default(0)|float * 1000 %}
{% set back = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back|default(0)|float * 1000 %}
{% set back_left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back_left|default(0)|float * 1000 %}
{% set left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].left|default(0)|float * 1000 %}
{% set line_1 = "Front left: %.6fμm" % (front_left) %}
{% set line_2 = "Front center: %.6fμm" % (front) %}
{% set line_3 = "Front right: %.6fμm" % (front_right) %}
{% set line_4 = "Left center: %.6fμm" % (left) %}
{% set line_5 = "Right center: %.6fμm" % (right) %}
{% set line_6 = "Back left: %.6fμm" % (back_left) %}
{% set line_7 = "Back center: %.6fμm" % (back) %}
{% set line_8 = "Back right: %.6fμm" % (back_right) %}
{% set max_value = [(front_left|abs), (front|abs), (front_right|abs), (left|abs), (right|abs), (back_left|abs), (back|abs), (back_right|abs)]|max %}
{% if max_value <= 50 %}
{% set type = "success" %}
{% set recommendation = "Very low gantry twist: %.6fμm._N_No beacon scan compensation needed." % max_value %}
{% elif max_value > 50 and max_value <= 100 %}
{% set type = "info" %}
{% set recommendation = "Low gantry twist: %.6fμm._N_You may experience first layer inconsistensies, consider beacon scan compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 100 and max_value <= 150 %}
{% set type = "warning" %}
{% set recommendation = "High gantry twist: %.6fμm._N_High chance of first layer problems, beacon scan compensation is highly encouraged." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 150 and max_value <= 200 %}
{% set type = "alert" %}
{% set recommendation = "Very High gantry twist: %.6fμm._N_You will encounter first layer problems on large prints unless you activate beacon scan compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 200 %}
{% set type = "alert" %}
{% set recommendation = "Extremely high gantry twist: %.6fμm._N_You have significant scan/contact inconsistency which is indicative of mechanical problems, please investigate before resorting to software compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% endif %}
CONSOLE_ECHO TITLE="Gantry twist relative to the center" TYPE={type} MSG={'"_N_%s_N__N_%s_N_%s_N_%s_N_%s_N_%s_N_%s_N_%s_N_%s"' % (recommendation, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8)}
[gcode_macro BEACON_CREATE_SCAN_COMPENSATION_MESH]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set profile = params.PROFILE|default("Contact")|string %}
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_scan_compensation_enable = true if printer["gcode_macro RatOS"].beacon_scan_compensation_enable|default(false)|lower == 'true' else false %}
{% set probe_count = printer["gcode_macro RatOS"].beacon_scan_compensation_probe_count %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% if not beacon_scan_compensation_enable %}
RATOS_ECHO MSG="Beacon scan compensation is disabled!"
{% else %}
MAYBE_HOME
_MOVE_TO_SAFE_Z_HOME
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_LED_BEACON_CALIBRATION_START
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=150
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp}
RATOS_ECHO MSG="Please wait..."
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} MAXIMUM={(bed_temp + 5)}
TEMPERATURE_WAIT SENSOR={'extruder' if default_toolhead == 0 else 'extruder1'} MINIMUM=150 MAXIMUM=155
{% endif %}
{% if not automated %}
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
{% endif %}
{% if printer.z_tilt is defined %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% endif %}
{% if printer.quad_gantry_level is defined %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% endif %}
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES=2 SAMPLES_DROP=1 SAMPLES_TOLERANCE_RETRIES=10 PROBE_COUNT={probe_count[0]},{probe_count[1]} PROFILE={profile}
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% endif %}
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_OFF
{% endif %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
RATOS_ECHO MSG="Beacon scan compensation mesh created!"
{% if not automated %}
RATOS_ECHO MSG="Saving config and restarting klipper..."
SAVE_CONFIG
{% endif %}
{% endif %}
[gcode_macro _BEACON_APPLY_SCAN_COMPENSATION]
gcode =
{% set beacon_scan_compensation_profile = printer["gcode_macro RatOS"].beacon_scan_compensation_profile %}
{% set beacon_scan_compensation_enable = true if printer["gcode_macro RatOS"].beacon_scan_compensation_enable|default(false)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_SCAN_COMPENSATION" MSG="beacon_scan_compensation_profile {beacon_scan_compensation_profile}, beacon_scan_compensation_enable {beacon_scan_compensation_enable}"
{% if beacon_scan_compensation_enable %}
BEACON_APPLY_SCAN_COMPENSATION PROFILE={beacon_scan_compensation_profile}
{% endif %}
[gcode_macro _BEACON_MAYBE_SCAN_COMPENSATION]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set needs_scan_compensation = true if printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].needs_compensation|default(false)|lower == 'true' else false %}
{% if needs_scan_compensation %}
BEACON_CREATE_SCAN_COMPENSATION_MESH _AUTOMATED=True BED_TEMP={bed_temp} CHAMBER_TEMP={chamber_temp}
{% endif %}
[gcode_macro _BEACON_HOME_AND_ABL]
gcode =
MAYBE_HOME X=True Y=True
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% set needs_rehoming = False %}
{% if printer.z_tilt is defined and not printer.z_tilt.applied %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% set needs_rehoming = True %}
{% endif %}
{% if printer.quad_gantry_level is defined and not printer.quad_gantry_level.applied %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% set needs_rehoming = True %}
{% endif %}
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% if needs_rehoming %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% endif %}
[gcode_macro _BEACON_SAVE_MULTIPLIER]
gcode =
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set multiplier = printer["gcode_macro _BEACON_APPLY_RUNTIME_MULTIPLIER"].runtime_multiplier|default(-1.0)|float %}
DEBUG_ECHO PREFIX="_BEACON_SAVE_MULTIPLIER" MSG="multiplier: {multiplier}, beacon_contact_start_print_true_zero: {beacon_contact_start_print_true_zero}, beacon_contact_expansion_compensation: {beacon_contact_expansion_compensation}"
{% if multiplier > 0 and beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_multiplier VALUE={multiplier}
SET_GCODE_VARIABLE MACRO=_BEACON_APPLY_RUNTIME_MULTIPLIER VARIABLE=runtime_multiplier VALUE=-1.0
CONSOLE_ECHO TITLE="Hotend thermal expansion compensation" TYPE="success" MSG={'"New value is: %.6f_N_The new multiplier value has been saved to the configuration."' % multiplier}
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _BEACON_APPLY_RUNTIME_MULTIPLIER]
variable_runtime_multiplier = -1.0
gcode =
{% set toolhead = 0 %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set toolhead = 1 if idex_mode == 'primary' else 0 %}
{% endif %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set layer_number = printer["gcode_macro _ON_LAYER_CHANGE"].layer_number|default(0)|int %}
{% set is_printing_gcode = true if printer["gcode_macro START_PRINT"].is_printing_gcode|default(true)|lower == 'true' else false %}
{% if layer_number == 0 and is_printing_gcode %}
{% set link_url = "https://os.ratrig.com/docs/slicers" %}
{% set link_text = "RatOS Slicer Documentation" %}
{% set line_1 = '"Your slicer is not correctly reporting layer information. See the layer change custom g-code in the %s".' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="Missing layer information" TYPE="warning" MSG={line_1}
{% endif %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_RUNTIME_MULTIPLIER" MSG="layer_number: {layer_number}, is_printing_gcode: {is_printing_gcode}, beacon_contact_start_print_true_zero: {beacon_contact_start_print_true_zero}, beacon_contact_expansion_compensation: {beacon_contact_expansion_compensation}"
{% if layer_number == 1 and is_printing_gcode and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
{% set svv = printer.save_variables.variables %}
{% set nozzle_expansion_coefficient = svv.nozzle_expansion_coefficient_t0|default(0)|float %}
{% if toolhead == 1 %}
{% set nozzle_expansion_coefficient = svv.nozzle_expansion_coefficient_t1|default(0)|float %}
{% endif %}
{% set beacon_contact_expansion_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(1.0)|float %}
{% set print_temp = printer["gcode_macro _BEACON_SET_NOZZLE_TEMP_OFFSET"].runtime_temp|default(0)|int %}
{% if print_temp > 0 %}
{% set z_offset = printer.gcode_move.homing_origin.z|float %}
{% set temp_delta = print_temp - beacon_contact_true_zero_temp %}
{% set coefficient_per_degree = nozzle_expansion_coefficient / 100 %}
{% set z_offset_per_degree = z_offset / temp_delta %}
{% set new_multiplier = z_offset_per_degree / coefficient_per_degree %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_RUNTIME_MULTIPLIER" MSG="print_temp: {print_temp}, z_offset: {z_offset}, temp_delta: {temp_delta}, nozzle_expansion_coefficient: {nozzle_expansion_coefficient}, coefficient_per_degree: {coefficient_per_degree}, z_offset_per_degree: {z_offset_per_degree}, old_multiplier: {beacon_contact_expansion_multiplier}, new_multiplier: {new_multiplier}"
SET_GCODE_VARIABLE MACRO=_BEACON_APPLY_RUNTIME_MULTIPLIER VARIABLE=runtime_multiplier VALUE={new_multiplier}
{% endif %}
{% endif %}
[gcode_macro T0]
variable_join = 0
variable_remap = 0
variable_alert = ""
variable_filament_name = ""
variable_filament_type = ""
variable_filament_temp = 0
variable_runout_sensor = ""
variable_active = True
variable_color = "7bff33"
variable_hotend_type = "SF"
variable_has_cht_nozzle = True
variable_cooling_position_to_nozzle_distance = 40
variable_tooolhead_sensor_to_extruder_gear_distance = 15
variable_extruder_gear_to_cooling_position_distance = 30
variable_filament_loading_nozzle_offset = -5
variable_filament_grabbing_length = 5
variable_filament_grabbing_speed = 1
variable_enable_insert_detection = True
variable_enable_runout_detection = True
variable_enable_clog_detection = True
variable_unload_after_runout = True
variable_purge_after_load = 0
variable_purge_before_unload = 0
variable_extruder_load_speed = 60
variable_filament_load_speed = 10
variable_standby = False
variable_temperature_offset = 0
variable_has_oozeguard = False
variable_has_front_arm_nozzle_wiper = False
variable_resume_after_insert = False
gcode =
{% set x = params.X|default(-1.0)|float %}
{% set y = params.Y|default(-1.0)|float %}
{% set z = params.Z|default(0.0)|float %}
{% set s = params.S|default(1)|int %}
{% if printer["gcode_macro _SELECT_TOOL"] is defined %}
_SELECT_TOOL T=0 X={x} Y={y} Z={z} TOOLSHIFT={s}
{% endif %}
[save_variables]
filename = /home/pi/printer_data/config/ratos-variables.cfg
=======================
Extruder max_extrude_ratio=0.415752
mcu 'mcu': Starting serial connect
webhooks client 4102800936: New connection
webhooks client 4102800936: Client info {'program': 'Moonraker', 'version': 'v0.9.3-0-g71f9e67'}
Loaded MCU 'mcu' 118 commands (v0.12.0-396-gb7233d119 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34)
MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 BUS_PINS_i2c3_PA8_PC9=PA8,PC9 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h723xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1
mcu 'rpi': Starting connect
Loaded MCU 'rpi' 119 commands (?-20240727_132503-fv-az659-741 / gcc: (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110 binutils: (GNU Binutils for Raspbian) 2.35.2)
MCU 'rpi' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256
mcu 'toolboard_t0': Starting serial connect
Loaded MCU 'toolboard_t0' 100 commands (v0.12.0-396-gb7233d119 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34)
MCU 'toolboard_t0' config: ADC_MAX=4095 BUS_PINS_i2c1=PB6,PB7 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB7=PB8,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c1_PF1_PF0=PF1,PF0 BUS_PINS_i2c1a=PF1,PF0 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 CLOCK_FREQ=48000000 MCU=stm32f042x6 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PF0,PF1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1
mcu_temperature 'mcu' nominal base=-275.577689 slope=1631.474104
mcu_temperature 'toolboard_t0' nominal base=342.920354 slope=-724.778761
mcu 'beacon': Starting serial connect
Loaded MCU 'beacon' 45 commands (Beacon 2.1.0 / )
MCU 'beacon' config: ADC_MAX=4095 BEACON_ACCEL_BITS=12 BEACON_ACCEL_SCALE_16G=7.81 BEACON_ACCEL_SCALE_2G=0.98 BEACON_ACCEL_SCALE_4G=1.95 BEACON_ACCEL_SCALE_8G=3.91 BEACON_ADC_SMOOTH_COUNT=16 BEACON_HAS_ACCEL=1 BEACON_REV=H CLOCK_FREQ=32000000 MCU=beacon STATS_SUMSQ_BASE=256
Config error
Traceback (most recent call last):
File "/home/pi/klipper/klippy/klippy.py", line 135, in _connect
cb()
File "/home/pi/klipper/klippy/mcu.py", line 748, in _connect
self._send_config(None)
File "/home/pi/klipper/klippy/mcu.py", line 679, in _send_config
cb()
File "/home/pi/klipper/klippy/mcu.py", line 456, in _build_config
raise pins.error("shutdown value must be 0.0 or 1.0 on soft pwm")
pins.error: shutdown value must be 0.0 or 1.0 on soft pwm
webhooks client 4102800936: Disconnected
Starting Klippy...
Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock']
Git version: 'v0.12.0-396-gb7233d119-dirty'
Untracked files: klippy/extras/beacon.py, klippy/extras/gcode_shell_command.py, klippy/extras/linear_movement_vibrations.py, klippy/extras/ratos.py, klippy/extras/ratos_homing.py, klippy/extras/resonance_generator.py, klippy/extras/z_offset_probe.py, klippy/kinematics/ratos_hybrid_corexy.py
Branch: master
Remote: origin
Tracked URL: https://github.com/Klipper3d/klipper.git
CPU: 4 core ?
Python: '3.9.2 (default, Mar 20 2025, 22:21:41) \n[GCC 10.2.1 20210110]'
Start printer at Sun May 25 00:19:54 2025 (1748128794.0 21.5)
===== Config file =====
[mcu rpi]
serial = /tmp/klipper_host_mcu
[board_pins btt-kraken]
aliases =
x_step_pin=PC14,
x_dir_pin=PC13,
x_enable_pin=PE6,
x_uart_pin=PD6,
x_diag_pin=PC15,
x_endstop_pin=PC15,
y_step_pin=PE5,
y_dir_pin=PE4,
y_enable_pin=PE3,
y_uart_pin=PD6,
y_diag_pin=PF0,
y_endstop_pin=PF0,
z0_step_pin=PG11,
z0_dir_pin=PD7,
z0_enable_pin=PG12,
z0_uart_pin=PA15,
z0_diag_pin=PF4,
z1_step_pin=PB4,
z1_dir_pin=PB3,
z1_enable_pin=PB5,
z1_uart_pin=PA9,
z1_diag_pin=PF10,
z2_step_pin=PG15,
z2_dir_pin=PB6,
z2_enable_pin=PG14,
z2_uart_pin=PA10,
z2_diag_pin=PC0,
z3_step_pin=PG9,
z3_dir_pin=PG10,
z3_enable_pin=PG13,
z3_uart_pin=PD2,
z3_diag_pin=PF3,
e_step_pin=PG9,
e_dir_pin=PG10,
e_enable_pin=PG13,
e_uart_pin=PD2,
e_diag_pin=PF1,
e_heater_pin=PF6,
e_sensor_pin=PB1,
stepper_spi_mosi_pin=PC8,
stepper_spi_miso_pin=PC7,
stepper_spi_sclk_pin=PC6,
adxl345_cs_pin=PE10,
bltouch_sensor_pin=PG1,
bltouch_control_pin=PE9,
probe_pin=PG1,
fan_part_cooling_pin=PA0,
fan_toolhead_cooling_pin=PA1,
fan_controller_board_pin=PA2,
heater_bed_heating_pin=PF5,
heater_bed_sensor_pin=PB0,
4p_fan_part_cooling_pin=PA6,
4p_fan_part_cooling_tach_pin=PC1,
4p_toolhead_cooling_pin=PE8,
4p_toolhead_cooling_tach_pin=PG0,
4p_controller_board_pin=PE8,
4p_controller_board_tach_pin=PG0
[mcu]
serial = /dev/RatOS/btt-kraken
[temperature_sensor Kraken]
sensor_type = temperature_mcu
[adxl345 controlboard]
cs_pin = PE10
spi_software_mosi_pin = PE14
spi_software_miso_pin = PE13
spi_software_sclk_pin = PE12
[board_pins toolboard_t0]
mcu = toolboard_t0
aliases =
e_step_pin=PB7,
e_dir_pin=PB6,
e_enable_pin=PB4,
e_uart_pin=PB5,
e_heater_pin=PA0,
e_sensor_pin=PA3,
stepper_spi_mosi_pin=null,
stepper_spi_miso_pin=null,
stepper_spi_sclk_pin=null,
adxl345_cs_pin=PA4,
bltouch_sensor_pin=PA15,
bltouch_control_pin=PB3,
probe_pin=PA15,
fan_part_cooling_pin=PA10,
fan_toolhead_cooling_pin=PA9,
fan_controller_board_pin=null,
heater_bed_heating_pin=null,
heater_bed_sensor_pin=null,
4p_fan_part_cooling_pin=null,
4p_fan_part_cooling_tach_pin=null,
4p_toolhead_cooling_pin=null,
4p_toolhead_cooling_tach_pin=null,
4p_controller_board_pin=null,
4p_controller_board_tach_pin=null
[mcu toolboard_t0]
serial = /dev/RatOS/ldo-orbitool-o2-t0
[temperature_sensor Orbitool_O2_T0]
sensor_type = temperature_mcu
sensor_mcu = toolboard_t0
[lis2dw toolboard_t0]
axes_map = x, z, y
cs_pin = toolboard_t0:PA4
spi_bus = spi1
[extruder]
max_power = 0.995
rotation_distance = 4.63
full_steps_per_rotation = 200
filament_diameter = 1.750
max_extrude_only_velocity = 60
max_extrude_only_distance = 200
nozzle_diameter = 0.5
heater_pin = toolboard_t0:PA0
sensor_type = PT1000
pullup_resistor = 2200
sensor_pin = toolboard_t0:PA3
min_extrude_temp = 170
min_temp = 0
max_temp = 285
pressure_advance = 0.05
step_pin = toolboard_t0:PB7
dir_pin = !toolboard_t0:e_dir_pin
enable_pin = !toolboard_t0:PB4
microsteps = 64
control = pid
pid_kp = 21.673
pid_ki = 1.338
pid_kd = 87.776
[adc_temperature hotend_power_scale]
temperature1 = 119
voltage1 = 1.91
temperature2 = 239
voltage2 = 3.82
[fan]
max_power = 0.995
shutdown_speed = 1.0
pin = PA6
cycle_time = 0.00004
tachometer_pin = ^PC1
tachometer_poll_interval = 0.0005
[heater_fan toolhead_cooling_fan]
max_power = 0.995
cycle_time = 0.0001
shutdown_speed = 0
pin = PA1
fan_speed = 1
heater = extruder
[output_pin O2_RUN_LED]
pin = toolboard_t0:PB8
shutdown_value = 0
value = 1
[temperature_sensor hotend_power_draw]
sensor_pin = toolboard_t0:PA2
sensor_type = hotend_power_scale
[gcode_macro RatOS]
variable_homing = "endstops"
variable_z_probe = "static"
variable_sensorless_x_current = 0.49699999999999994
variable_sensorless_y_current = 0.7242
variable_safe_home_x = "middle"
variable_safe_home_y = "middle"
variable_driver_type_x = "tmc2209"
variable_driver_type_y = "tmc2209"
variable_stowable_probe_stop_on_error = False
variable_chamber_filter_enable = True
variable_chamber_filter_speed = 0.5
variable_chamber_filter_disable_speed = 1.0
variable_chamber_filter_enable_at = "after_print_start"
variable_chamber_filter_disable_period = 300
variable_chamber_filter_disable_bed_temp = 0
variable_chamber_heater_enable = True
variable_chamber_heater_bed_temp = 115
variable_chamber_heater_preheating_temp = 150
variable_chamber_heater_heating_temp_offset = 25
variable_chamber_heater_control_external_heater = False
variable_chamber_heater_air_circulation_enable = True
variable_chamber_heater_air_circulation_fan_speed = 0.35
variable_chamber_heater_air_circulation_y_pos = 0
variable_chamber_heater_air_circulation_z_pos = 100
variable_chamber_heater_extra_fan_speed = 1.0
variable_chamber_heater_filter_fan_speed = 1.0
variable_led_status_action = 0.0,1.0,1.0
variable_led_status_success = 0.0,1.0,0.0
variable_led_status_error = 1.0,0.0,1.0
variable_led_status_on = 1.0,1.0,1.0
variable_led_status_off = 0.0,0.0,1.0
variable_led_status_standby = 0.1,0.1,0.1
variable_led_status_heating = 1.0,0.0,0.0
variable_led_status_cooling = 0.0,0.0,1.0
variable_calibrate_bed_mesh = True
variable_adaptive_mesh = True
variable_start_print_park_in = "front"
variable_start_print_park_z_height = 50
variable_end_print_park_in = "back"
variable_pause_print_park_in = "front"
variable_end_print_park_z_hop = 20
variable_nozzle_priming = "primeblob"
variable_nozzle_prime_start_x = "max"
variable_nozzle_prime_start_y = "min"
variable_nozzle_prime_direction = "auto"
variable_nozzle_prime_bridge_fan = 102
variable_probe_for_priming_result = None
variable_probe_for_priming_end_result = None
variable_probe_for_priming_result_t1 = None
variable_probe_for_priming_end_result_t1 = None
variable_probe_for_priming_disable_mesh_constraints = False
variable_adaptive_prime_offset_threshold = -1.0
variable_last_z_offset = None
variable_runout_park_in = "front"
variable_enable_unload_tip_forming = False
variable_filament_unload_length = 150
description = RatOS variable storage macro, will echo variables to the console when run.
variable_relative_extrusion = False
variable_force_absolute_position = False
variable_preheat_extruder = True
variable_preheat_extruder_temp = 150
variable_macro_travel_speed = 300
variable_macro_travel_accel = 3000
variable_macro_z_speed = 15
variable_bed_margin_x = [0, 0]
variable_bed_margin_y = [0, 0]
variable_printable_x_min = 0
variable_printable_x_max = 0
variable_printable_y_min = 0
variable_printable_y_max = 0
variable_end_print_motors_off = True
variable_status_color_ok = "00FF00"
variable_status_color_error = "FF0000"
variable_status_color_unknown = "FFFF00"
variable_end_print_retract_filament = 10
gcode =
ECHO_RATOS_VARS
variable_beacon_bed_mesh_scv = 25
variable_beacon_contact_z_homing = False
variable_beacon_contact_start_print_true_zero = True
variable_beacon_contact_wipe_before_true_zero = True
variable_beacon_contact_true_zero_temp = 150
variable_beacon_contact_prime_probing = True
variable_beacon_contact_expansion_compensation = True
variable_beacon_contact_bed_mesh = False
variable_beacon_contact_bed_mesh_samples = 2
variable_beacon_contact_z_tilt_adjust = False
variable_beacon_contact_z_tilt_adjust_samples = 2
variable_beacon_scan_compensation_enable = False
variable_beacon_scan_compensation_profile = "Contact"
variable_beacon_scan_compensation_probe_count = 15,15
variable_beacon_contact_poke_bottom_limit = -1
variable_homing_x = "sensorless"
variable_homing_y = "sensorless"
variable_x_driver_types = ["tmc5160"]
variable_x_axes = ["x"]
variable_y_driver_types = ["tmc5160"]
variable_y_axes = ["y"]
variable_z_driver_types = ["tmc5160", "tmc5160", "tmc5160", "tmc5160"]
variable_z_axes = ["z", "z1", "z2", "z3"]
[ratos_homing]
axes = xyz
z_hop = 15
z_hop_speed = 15
gcode =
_LED_ON
{% set prev_stop_on_error = printer["gcode_macro RatOS"].stowable_probe_stop_on_error %}
{% if printer["dual_carriage"] is defined %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set target_idex_mode = printer["dual_carriage"].carriage_1|lower %}
_IDEX_SINGLE
_SELECT_TOOL T={default_toolhead} TOOLSHIFT=false
{% endif %}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE=True
M400
G90
{% set X = true if params.X is defined else false %}
{% set Y = true if params.Y is defined else false %}
{% set Z = true if params.Z is defined else false %}
{% if printer["gcode_macro RatOS"].home_y_first|default(false)|lower == 'true' %}
HOME_Y X={X} Y={Y} Z={Z}
HOME_X X={X} Y={Y} Z={Z}
{% else %}
HOME_X X={X} Y={Y} Z={Z}
HOME_Y X={X} Y={Y} Z={Z}
{% endif %}
HOME_Z X={X} Y={Y} Z={Z}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE={prev_stop_on_error}
{% if printer["dual_carriage"] is defined %}
{% if target_idex_mode == "copy" %}
_IDEX_COPY
{% elif target_idex_mode == "mirror" %}
_IDEX_MIRROR
{% endif %}
{% endif %}
[gcode_macro HOME_X]
gcode =
{% set x_homed = 'x' in printer.toolhead.homed_axes %}
{% set homing = printer["gcode_macro RatOS"].homing|lower %}
{% set homing_x = printer["gcode_macro RatOS"].homing_x|lower %}
{% set homing_x = homing_x if homing_x else homing %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_X" MSG="printable_x_max: {printable_x_max}, safe_home_x: {safe_home_x}, axis_maximum.x: {printer.toolhead.axis_maximum.x}, bed_margin_x: {printer['gcode_macro RatOS'].bed_margin_x}"
{% if X or not Y and not Z %}
{% if homing_x == 'endstop' %}
G28 X
{% elif homing_x == 'sensorless' %}
{% if printer["dual_carriage"] is defined %}
{ action_emergency_stop("sensorless homing not supported on IDEX!") }
{% endif %}
HOME_X_SENSORLESS
{% else %}
{ action_emergency_stop("expected RatOS variable_homing_x to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_x, homing)) }
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set parking_position = printer["gcode_macro T%s" % (0 if default_toolhead==1 else 1)].parking_position|float %}
SET_DUAL_CARRIAGE CARRIAGE={0 if default_toolhead==1 else 1} MODE=PRIMARY
G1 X{parking_position} F{speed}
SET_DUAL_CARRIAGE CARRIAGE={default_toolhead} MODE=PRIMARY
{% endif %}
{% set x_homed = True %}
G0 X{safe_home_x} F{speed}
M400
{% endif %}
[gcode_macro HOME_Y]
gcode =
{% set y_homed = 'y' in printer.toolhead.homed_axes %}
{% set homing = printer["gcode_macro RatOS"].homing|lower %}
{% set homing_y = printer["gcode_macro RatOS"].homing_y|lower %}
{% set homing_y = homing_y if homing_y else homing %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_Y" MSG="printable_y_max: {printable_y_max}, safe_home_y: {safe_home_y}, axis_maximum.y: {printer.toolhead.axis_maximum.y}, bed_margin_y: {printer['gcode_macro RatOS'].bed_margin_y}"
{% if Y or not X and not Z %}
{% if homing_y == 'endstop' %}
G28 Y
{% elif homing_y == 'sensorless' %}
HOME_Y_SENSORLESS
{% else %}
{ action_emergency_stop("expected RatOS variable_homing_y to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_y, homing)) }
{% endif %}
{% set y_homed = True %}
G0 Y{safe_home_y} F{speed}
{% endif %}
[gcode_macro HOME_Z]
gcode =
{% set x_homed = 'x' in printer.toolhead.homed_axes %}
{% set y_homed = 'y' in printer.toolhead.homed_axes %}
{% set z_probe = printer["gcode_macro RatOS"].z_probe %}
{% set beacon_contact_z_homing = true if printer["gcode_macro RatOS"].beacon_contact_z_homing|default(false)|lower == 'true' else false %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_Z" MSG="x_homed: {x_homed}, y_homed: {y_homed}, z_probe: {z_probe}, beacon_contact_z_homing: {beacon_contact_z_homing}"
{% if Z or not Y and not X %}
RATOS_ECHO MSG="Homing Z"
{% if x_homed == False or y_homed == False %}
{ action_emergency_stop("X and Y must be homed before homing Z") }
{% else %}
{% if z_probe == "stowable" %}
DEPLOY_PROBE
_MOVE_TO_SAFE_Z_HOME
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_homing %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% else %}
G28 Z
{% endif %}
_Z_HOP
STOW_PROBE
{% else %}
_MOVE_TO_SAFE_Z_HOME
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_homing %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% else %}
G28 Z
{% endif %}
_Z_HOP
{% endif %}
{% endif %}
{% endif %}
[gcode_macro HOME_X_SENSORLESS]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="home_x_sensorless"
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
M204 S1000
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endif %}
G4 P300
G28 X
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].x_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].y_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current}
{% endif %}
G4 P300
RESTORE_TOOLHEAD_SETTINGS KEY="home_x_sensorless"
[gcode_macro HOME_Y_SENSORLESS]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="home_y_sensorless"
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
M204 S1000
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endif %}
G4 P300
G28 Y
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].x_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].y_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current}
{% endif %}
G4 P300
RESTORE_TOOLHEAD_SETTINGS KEY="home_y_sensorless"
[gcode_macro _Z_HOP]
description = Move Z axis up by Z_HOP distance at Z_HOP_SPEED. In relative mode it will move Z axis up by Z_HOP distance. In absolute mode it will move Z axis to Z_HOP distance.
gcode =
{% set z_hop = printer.configfile.config.ratos_homing.z_hop|float %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
G0 Z{z_hop} F{z_hop_speed}
[gcode_macro _MOVE_TO_SAFE_Z_HOME]
description = Move to safe home position with optional Z_HOP (pass Z_HOP=True as parameter)
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% if params.Z_HOP is defined %}
_Z_HOP
{% endif %}
DEBUG_ECHO PREFIX="_MOVE_TO_SAFE_Z_HOME" MSG="axis_maximum.x: {printer.toolhead.axis_maximum.x}, axis_maximum.y: {printer.toolhead.axis_maximum.y}, bed_margin_x: {printer['gcode_macro RatOS'].bed_margin_x}, bed_margin_y: {printer['gcode_macro RatOS'].bed_margin_y}, safe_home_x: {safe_home_x}, safe_home_y: {safe_home_y}, printable_x_max: {printable_x_max}, printable_y_max: {printable_y_max}"
G0 X{safe_home_x} Y{safe_home_y} F{speed}
[gcode_macro MAYBE_HOME]
description = Only home unhomed axis
variable_is_kinematic_position_overriden = False
gcode =
{% if printer["gcode_macro MAYBE_HOME"].is_kinematic_position_overriden|lower == 'true' %}
RATOS_ECHO MSG="SET_CENTER_KINEMATIC_POSITION has been abused. Homing all axes. Please refrain from using SET_CENTER_KINEMATIC_POSITION outside of debugging purposes."
G28
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=False
{% else %}
{% set axes = '' %}
{% set isHomed = true %}
{% set axesToHome = '' %}
{% if params.X is defined %}
{% set axes = axes ~ 'X ' %}
{% if 'x' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'X ' %}
{% endif %}
{% endif %}
{% if params.Y is defined %}
{% set axes = axes ~ 'Y ' %}
{% if 'y' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Y ' %}
{% endif %}
{% endif %}
{% if params.Z is defined %}
{% set axes = axes ~ 'Z ' %}
{% if 'z' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Z ' %}
{% endif %}
{% endif %}
{% if params.X is not defined and params.Y is not defined and params.Z is not defined %}
{% set axes = '' %}
{% if 'x' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'X ' %}
{% endif %}
{% if 'y' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Y ' %}
{% endif %}
{% if 'z' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Z ' %}
{% endif %}
{% endif %}
{% if isHomed is false %}
RATOS_ECHO MSG="Homing {axesToHome}"
G28 {axesToHome}
{% else %}
RATOS_ECHO MSG="All requested axes already homed, skipping.."
{% endif %}
{% endif %}
[gcode_macro PID_CALIBRATE_HOTEND]
description = Perform a PID calibration test for a given extruder heater.
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set temp = params.TEMP|default(220)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_HOTEND" MSG="TEMP={temp}"
{% if printer["dual_carriage"] is not defined %}
RATOS_ECHO MSG="PID calibration hotend heater T0 at {temp}°C..."
PID_CALIBRATE HEATER=extruder TARGET={temp}
_CONSOLE_SAVE_CONFIG
{% else %}
{% if toolhead==0 or toolhead==1 %}
RATOS_ECHO MSG="PID calibration hotend heater T{toolhead} at {temp}°C..."
PID_CALIBRATE HEATER=extruder{'' if toolhead==0 else toolhead} TARGET={temp}
_CONSOLE_SAVE_CONFIG
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
_LEARN_MORE_CALIBRATION
[gcode_macro PID_CALIBRATE_BED]
description = Perform a PID calibration test for the bed heater.
gcode =
{% set temp = params.TEMP|default(80)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_BED" MSG="TEMP={temp}"
RATOS_ECHO MSG="PID calibration bed heater at {temp}°C..."
PID_CALIBRATE HEATER=heater_bed TARGET={temp}
_CONSOLE_SAVE_CONFIG
_LEARN_MORE_CALIBRATION
[gcode_macro PID_CALIBRATE_CHAMBER_HEATER]
description = Perform a PID calibration test for the chamber heater.
gcode =
{% set temp = params.TEMP|default(150)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_CHAMBER_HEATER" MSG="TEMP={temp}"
{% if printer["heater_generic chamber_heater"] is defined %}
RATOS_ECHO MSG="PID calibration chamber heater at {temp}°C..."
PID_CALIBRATE HEATER=chamber_heater TARGET={temp}
_CONSOLE_SAVE_CONFIG
_LEARN_MORE_CALIBRATION
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_heater" %}
{% set link_text = "RatOS Chamber Heater" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber heater found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro INITIALIZE_PA_TUNING]
description = Start a pressure advance tuning tower.
gcode =
{% set start = params.START|default(0.0)|float %}
{% set factor = params.FACTOR|default(0.001)|float %}
{% set layer_number = printer["gcode_macro _ON_LAYER_CHANGE"].layer_number|default(0)|int %}
{% set is_printing_gcode = true if printer["gcode_macro START_PRINT"].is_printing_gcode|default(true)|lower == 'true' else false %}
{% if is_printing_gcode and layer_number < 2 %}
DEBUG_ECHO PREFIX="START_PA_TOWER" MSG="START: {start}, FACTOR: {factor}"
RATOS_ECHO MSG="Starting presssure advance tuning tower..."
TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START={start} FACTOR={factor}
{% endif %}
_LEARN_MORE_CALIBRATION
[gcode_macro CHAMBER_FILTER_ON]
gcode =
{% if printer["fan_generic filter"] is defined %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Activating chamber filter..."
_CHAMBER_FILTER_TURN_ON
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber filter found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro CHAMBER_FILTER_OFF]
gcode =
{% if printer["fan_generic filter"] is defined %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Deactivating chamber filter..."
_CHAMBER_FILTER_TURN_OFF
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber filter found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro _CHAMBER_FILTER_ON]
gcode =
{% set at = params.AT|default('')|lower %}
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set chamber_filter_enable_at = printer["gcode_macro RatOS"].chamber_filter_enable_at|default('after_print_start')|lower %}
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_ON" MSG="at: {at}, chamber_filter_enable: {chamber_filter_enable}, chamber_filter_enable_at: {chamber_filter_enable_at}, chamber_filter_speed: {chamber_filter_speed}"
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if chamber_filter_enable_at == at %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Activating chamber filter..."
_CHAMBER_FILTER_TURN_ON AT={at}
{% if chamber_filter_enable_at == "print_end" %}
_LED_CHAMBER_FILTER_ON
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _CHAMBER_FILTER_OFF]
gcode =
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set filter_disable_period = printer["gcode_macro RatOS"].chamber_filter_disable_period|default(0)|int %}
{% set filter_disable_bed_temp = printer["gcode_macro RatOS"].chamber_filter_disable_bed_temp|default(0)|int %}
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_OFF" MSG="chamber_filter_enable: {chamber_filter_enable}, filter_disable_period: {filter_disable_period}, filter_disable_bed_temp: {filter_disable_bed_temp}"
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if filter_disable_period > 0 %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Waiting {filter_disable_period} seconds before turning chamber filter off..."
UPDATE_DELAYED_GCODE ID=_CHAMBER_FILTER_OFF_TIMER DURATION={filter_disable_period}
{% endif %}
{% if filter_disable_bed_temp > 0 %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Waiting for bed temp to cool down to {filter_disable_bed_temp}°C to turn filter off..."
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM=0 MAXIMUM={filter_disable_bed_temp}
_CHAMBER_FILTER_TURN_OFF
_LED_CHAMBER_FILTER_OFF
{% endif %}
{% endif %}
[delayed_gcode _CHAMBER_FILTER_OFF_TIMER]
gcode =
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_OFF_TIMER" MSG="executed"
_CHAMBER_FILTER_TURN_OFF
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Chamber filter turned off!"
_LED_CHAMBER_FILTER_OFF
[gcode_macro _CHAMBER_FILTER_TURN_ON]
gcode =
{% set at = params.AT|default('')|lower %}
{% set chamber_filter_speed = printer["gcode_macro RatOS"].chamber_filter_speed|default(0)|float %}
{% if at == "print_end" %}
{% set chamber_filter_speed = printer["gcode_macro RatOS"].chamber_filter_disable_speed|default(0)|float %}
{% endif %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_FILTER_OFF_TIMER DURATION=0
SET_FAN_SPEED FAN=filter SPEED={chamber_filter_speed}
[gcode_macro _CHAMBER_FILTER_TURN_OFF]
gcode =
SET_FAN_SPEED FAN=filter SPEED=0
[gcode_macro _CHAMBER_FILTER_SANITY_CHECK]
gcode =
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set filter_disable_period = printer["gcode_macro RatOS"].chamber_filter_disable_period|default(0)|int %}
{% set filter_disable_bed_temp = printer["gcode_macro RatOS"].chamber_filter_disable_bed_temp|default(0)|int %}
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if filter_disable_bed_temp > 0 and filter_disable_period > 0 %}
_LEARN_MORE_CHAMBER_FILTER
{action_respond_info("Wrong chamber filter options configured! Set 'filter_disable_bed_temp' or 'filter_disable_period' variable, not both.")}
{% endif %}
{% if filter_disable_bed_temp == 0 and filter_disable_period == 0 %}
_LEARN_MORE_CHAMBER_FILTER
{action_respond_info("Wrong chamber filter options configured! Set 'filter_disable_bed_temp' or 'filter_disable_period' variable.")}
{% endif %}
{% endif %}
[gcode_macro CHAMBER_HEATER_ON]
gcode =
{% set chamber_temp = params.CHAMBER_TEMP|default(45)|int %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp} IS_FROM_START_PRINT=False
[gcode_macro CHAMBER_HEATER_OFF]
gcode =
_CHAMBER_HEATER_OFF
[gcode_macro _CHAMBER_HEATER_ON]
variable_chamber_temp = 0
gcode =
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set start_chamber_temp = params.START_CHAMBER_TEMP|default(0)|int %}
{% set is_from_start_print = true if params.IS_FROM_START_PRINT|default(True)|lower == 'true' else false %}
{% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set chamber_heater_enable = true if printer["gcode_macro RatOS"].chamber_heater_enable|default(true)|lower == 'true' else false %}
{% set chamber_heater_bed_temp = printer["gcode_macro RatOS"].chamber_heater_bed_temp|default(115)|int %}
{% set chamber_heater_preheating_temp = printer["gcode_macro RatOS"].chamber_heater_preheating_temp|default(150)|int %}
{% set chamber_heater_heating_temp_offset = printer["gcode_macro RatOS"].chamber_heater_heating_temp_offset|default(20)|int %}
{% set chamber_heater_control_external_heater = true if printer["gcode_macro RatOS"].chamber_heater_control_external_heater|default(true)|lower == 'true' else false %}
{% set chamber_heater_air_circulation_enable = true if printer["gcode_macro RatOS"].chamber_heater_air_circulation_enable|default(true)|lower == 'true' else false %}
{% set chamber_heater_air_circulation_fan_speed = printer["gcode_macro RatOS"].chamber_heater_air_circulation_fan_speed|default(0.35)|float %}
{% set chamber_heater_air_circulation_y_pos = printer["gcode_macro RatOS"].chamber_heater_air_circulation_y_pos|default(0)|float %}
{% set chamber_heater_air_circulation_z_pos = printer["gcode_macro RatOS"].chamber_heater_air_circulation_z_pos|default(100)|float %}
DEBUG_ECHO PREFIX="_CHAMBER_HEATER_ON" MSG="chamber_heater_enable: {chamber_heater_enable}, chamber_heater_preheating_temp: {chamber_heater_preheating_temp}, chamber_heater_heating_temp_offset: {chamber_heater_heating_temp_offset}, bed_temp: {bed_temp}, chamber_temp: {chamber_temp}, start_chamber_temp: {start_chamber_temp}"
{% if chamber_heater_enable and chamber_temp > 0 and chamber_heater_bed_temp > 0 %}
_LED_HEATING
RATOS_ECHO MSG="Preheating chamber to {(start_chamber_temp if start_chamber_temp > 0 else chamber_temp)}°C..."
{% set chamber_temp_sensor = "extruder" %}
{% if printer["dual_carriage"] is defined and default_toolhead == 1 %}
{% set chamber_temp_sensor = "extruder1" %}
{% endif %}
{% if printer["temperature_sensor chamber"] is defined %}
{% set chamber_temp_sensor = "temperature_sensor chamber" %}
{% endif %}
{% set current_chamber_temp = printer['%s' % chamber_temp_sensor].temperature|int %}
{% set needs_heating = current_chamber_temp < (start_chamber_temp if start_chamber_temp > 0 else chamber_temp) %}
{% if needs_heating %}
_USER_CHAMBER_HEATER_BEFORE_PREHEATING
{% endif %}
{% if needs_heating %}
{% if chamber_heater_air_circulation_enable and chamber_heater_air_circulation_fan_speed > 0 %}
{% if not is_from_start_print %}
MAYBE_HOME
{% endif %}
G0 Z{chamber_heater_air_circulation_z_pos} F{z_speed}
G0 Y{chamber_heater_air_circulation_y_pos} F{speed}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={chamber_heater_air_circulation_fan_speed if default_toolhead == 0 else 0}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={chamber_heater_air_circulation_fan_speed if default_toolhead == 1 else 0}
{% else %}
M106 S{(255 * chamber_heater_air_circulation_fan_speed)}
{% endif %}
{% else %}
{% if is_from_start_print %}
G0 Z{z} F{z_speed}
{% endif %}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=_CHAMBER_HEATER_ON VARIABLE=chamber_temp VALUE={chamber_temp}
{% if needs_heating %}
M140 S{chamber_heater_bed_temp}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={chamber_heater_preheating_temp}
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=1.0
{% endif %}
{% endif %}
{% if needs_heating %}
_CHAMBER_HEATER_EXTRA_FAN_ON
{% endif %}
{% if needs_heating %}
TEMPERATURE_WAIT SENSOR="{chamber_temp_sensor}" MINIMUM={(start_chamber_temp if start_chamber_temp > 0 else chamber_temp)}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={(chamber_temp + chamber_heater_heating_temp_offset)}
{% endif %}
{% endif %}
{% if printer["fan_generic filter"] is defined %}
{% if printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float > 0 %}
SET_FAN_SPEED FAN=filter SPEED=0
_CHAMBER_FILTER_ON AT="before_print_start"
{% endif %}
{% endif %}
{% if needs_heating %}
{% if chamber_heater_air_circulation_enable and chamber_heater_air_circulation_fan_speed > 0 %}
G28 Z
{% endif %}
{% endif %}
{% if needs_heating %}
_USER_CHAMBER_HEATER_AFTER_PREHEATING
{% endif %}
{% if printer["temperature_sensor chamber"] is defined %}
{% if printer["heater_generic chamber_heater"] is defined %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined and chamber_heater_control_external_heater %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED=0
SET_FAN_SPEED FAN=part_fan_t1 SPEED=0
{% else %}
M106 S0
{% endif %}
_LED_SUCCESS
{% endif %}
[gcode_macro _CHAMBER_HEATER_OFF]
gcode =
RATOS_ECHO MSG="Deactivating chamber heater..."
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=0
SET_GCODE_VARIABLE MACRO=_CHAMBER_HEATER_ON VARIABLE=chamber_temp VALUE=0
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=0
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=0.0
{% endif %}
_CHAMBER_HEATER_EXTRA_FAN_OFF
[delayed_gcode _CHAMBER_HEATER_CONTROL]
initial_duration = 0.
gcode =
{% set chamber_temp = printer["gcode_macro _CHAMBER_HEATER_ON"].chamber_temp|default(0)|int %}
{% set chamber_heater_heating_temp_offset = printer["gcode_macro RatOS"].chamber_heater_heating_temp_offset|default(20)|int %}
{% set current_chamber_temp = printer['temperature_sensor chamber'].temperature|int %}
{% if current_chamber_temp < chamber_temp %}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={(chamber_temp + chamber_heater_heating_temp_offset)}
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=1.0
{% endif %}
{% endif %}
{% if current_chamber_temp >= chamber_temp %}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=0
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=0.0
{% endif %}
{% endif %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
[gcode_macro _CHAMBER_HEATER_EXTRA_FAN_ON]
gcode =
{% set chamber_heater_extra_fan_speed = printer["gcode_macro RatOS"].chamber_heater_extra_fan_speed|default(0.0)|float %}
{% if printer["fan_generic chamber_heater_extra_fan"] is defined %}
{% if chamber_heater_extra_fan_speed > 0 %}
SET_FAN_SPEED FAN=chamber_heater_extra_fan SPEED={chamber_heater_extra_fan_speed}
{% endif %}
{% endif %}
[gcode_macro _CHAMBER_HEATER_EXTRA_FAN_OFF]
gcode =
{% if printer["fan_generic chamber_heater_extra_fan"] is defined %}
SET_FAN_SPEED FAN=chamber_heater_extra_fan SPEED=0
{% endif %}
[gcode_macro _USER_CHAMBER_HEATER_BEFORE_PREHEATING]
description = Will be executed before chamber preheating, only if heating is needed.
gcode =
[gcode_macro _USER_CHAMBER_HEATER_AFTER_PREHEATING]
description = Will be executed after chamber preheating, only if heating was needed.
gcode =
[gcode_macro _LED_START_PRINTING]
gcode =
_LED_ACTION
[gcode_macro _LED_START_PRINTING_ERROR]
gcode =
_LED_ERROR
[gcode_macro _LED_PRINTING]
gcode =
_LED_ON TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_PAUSE]
gcode =
_LED_ACTION
[gcode_macro _LED_CHAMBER_FILTER_ON]
gcode =
_LED_ACTION
[gcode_macro _LED_CHAMBER_FILTER_OFF]
gcode =
_LED_STANDBY
[gcode_macro _LED_LOADING_FILAMENT]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_LOADED]
gcode =
_LED_SUCCESS TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_RUNOUT]
gcode =
_LED_ERROR TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_CLOG]
gcode =
_LED_ERROR TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_UNLOADING_FILAMENT]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_UNLOADED]
gcode =
_LED_SUCCESS TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_DEACTIVATE_TOOLHEAD]
gcode =
_LED_OFF TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_TOOLHEAD_STANDBY]
gcode =
_LED_STANDBY TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_TOOLHEAD_WAKEUP]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_MOTORS_OFF]
gcode =
_LED_STANDBY
_LED_VAOC_OFF
[gcode_macro _LED_INPUT_SHAPER_START]
gcode =
_LED_ACTION
[gcode_macro _LED_INPUT_SHAPER_END]
gcode =
_LED_ON
[gcode_macro _LED_BEACON_CALIBRATION_START]
gcode =
_LED_ACTION
[gcode_macro _LED_BEACON_CALIBRATION_END]
gcode =
_LED_ON
[gcode_macro _LED_BEACON_CALIBRATION_ERROR]
gcode =
_LED_ERROR
[gcode_macro _LED_VAOC_ON]
gcode =
{% if printer['neopixel vaoc_led'] is defined %}
SET_LED LED=vaoc_led RED=1.0 GREEN=1.0 BLUE=1.0
{% endif %}
[gcode_macro _LED_VAOC_OFF]
gcode =
{% if printer['neopixel vaoc_led'] is defined %}
SET_LED LED=vaoc_led RED=0.0 GREEN=0.0 BLUE=0.0
{% endif %}
[gcode_macro _LED_ACTION]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_action %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_SUCCESS]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_success %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_HEATING]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_heating %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_COOLING]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_cooling %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_ERROR]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_error %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_ON]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_on %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_OFF]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_off %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_STANDBY]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_standby %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_SET]
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set r = params.R|default(0)|float %}
{% set g = params.G|default(0)|float %}
{% set b = params.B|default(0)|float %}
{% if toolhead >= 0 %}
{% if printer['neopixel nozzle_led_t%s' % toolhead] is defined %}
SET_LED LED={'nozzle_led_t%s' % toolhead} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% else %}
{% if printer['neopixel nozzle_led_t0'] is defined %}
SET_LED LED={'nozzle_led_t0'} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% if printer['neopixel nozzle_led_t1'] is defined %}
SET_LED LED={'nozzle_led_t1'} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% endif %}
_USER_LED_SET { rawparams }
[gcode_macro _USER_LED_SET]
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set r = params.R|default(0)|float %}
{% set g = params.G|default(0)|float %}
{% set b = params.B|default(0)|float %}
[gcode_macro LOAD_FILAMENT]
description = Loads new filament. Note: be careful with PETG, make sure you inspect the tip of your filament before loading to avoid jams.
variable_ignore_min_extrude_temp = True
gcode =
_LEARN_MORE_FILAMENT
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set filament_name = params._NAME|default('')|string %}
{% set filament_type = params._TYPE|default('')|string %}
{% if filament_name == '' or filament_type == '' %}
{% set filament_name = 'unknown' %}
{% set filament_type = 'unknown' %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
_DEFAULT_LOAD_FILAMENT TEMP={temp} NAME={filament_name} TYPE={filament_type}
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Loading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead==0 or toolhead==1 %}
_IDEX_LOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead} NAME={filament_name} TYPE={filament_type}
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
[gcode_macro _DEFAULT_LOAD_FILAMENT]
description = Load filament macro for non IDEX printers.
gcode =
{% set temp = params.TEMP|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_DEFAULT_LOAD_FILAMENT" MSG="TEMP={temp}"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
_LED_LOADING_FILAMENT TOOLHEAD=0
SAVE_GCODE_STATE NAME=load_state
{% if printer.extruder.temperature|int < temp or printer.extruder.can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating extruder to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={temp}
_LOAD_FILAMENT TOOLHEAD=0
RESTORE_GCODE_STATE NAME=load_state
{% if filament_name != '' and filament_type != '' %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('{filament_type}', '{filament_name}', {temp})"
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={temp}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
_LED_FILAMENT_LOADED TOOLHEAD=0
[gcode_macro _IDEX_LOAD_FILAMENT]
description = Load filament macro for IDEX printer.
gcode =
{% set temp = params.TEMP|int %}
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_IDEX_LOAD_FILAMENT" MSG="TEMP: {temp}, TOOLHEAD: {toolhead}"
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_LOADING_FILAMENT TOOLHEAD={toolhead}
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
{% if not printer.pause_resume.is_paused %}
{% if printer[target_extruder].temperature|int < temp or printer[target_extruder].can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating T{toolhead} to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={temp}
{% endif %}
_LOAD_FILAMENT TOOLHEAD={toolhead} TEMP={temp}
{% if filament_name != '' and filament_type != '' %}
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('{filament_type}', '{filament_name}', {temp})"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='"{filament_name}"'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='"{filament_type}"'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE={temp}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_ok}"'
_LED_FILAMENT_LOADED TOOLHEAD={toolhead}
[gcode_macro _LOAD_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT" MSG="TOOLHEAD: {toolhead}"
_MOVE_TO_LOADING_POSITION TOOLHEAD={toolhead}
_LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE TOOLHEAD={toolhead}
_LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE TOOLHEAD={toolhead}
_CLEANING_MOVE TOOLHEAD={toolhead}
[gcode_macro _LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set extruder_load_speed = printer["gcode_macro T%s" % toolhead].extruder_load_speed|float * 60 %}
{% set extruder_gear_to_cooling_position_distance = printer["gcode_macro T%s" % toolhead].extruder_gear_to_cooling_position_distance|float %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Loading filament into hotend.."
G92 E0
G0 E{extruder_gear_to_cooling_position_distance} F{extruder_load_speed}
G92 E0
M400
RATOS_ECHO MSG="Filament loaded into hotend."
[gcode_macro _LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set load_speed = printer["gcode_macro T%s" % toolhead].filament_load_speed|float * 60 %}
{% set filament_loading_nozzle_offset = printer["gcode_macro T%s" % toolhead].filament_loading_nozzle_offset|float %}
{% set cooling_position_to_nozzle_distance = printer["gcode_macro T%s" % toolhead].cooling_position_to_nozzle_distance|float %}
{% set purge_after_load = printer["gcode_macro T%s" % toolhead].purge_after_load|float %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Loading filament into nozzle... Please wait!"
G92 E0
G0 E{cooling_position_to_nozzle_distance + filament_loading_nozzle_offset} F{load_speed}
G92 E0
G4 P1000
_PURGE_FILAMENT TOOLHEAD={toolhead} E={purge_after_load}
RATOS_ECHO MSG="Filament loaded into nozzle!"
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_INSERT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_INSERT" MSG="TOOLHEAD: {toolhead}"
{% set filament_grabbing_length = printer["gcode_macro T%s" % toolhead].filament_grabbing_length|float %}
{% set filament_grabbing_speed = printer["gcode_macro T%s" % toolhead].filament_grabbing_speed|float %}
{% set resume_after_insert = true if printer["gcode_macro T%s" % toolhead].resume_after_insert|default(true)|lower == 'true' else false %}
{% set enable_insert_detection = true if printer["gcode_macro T%s" % toolhead].enable_insert_detection|default(true)|lower == 'true' else false %}
{% set current_idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% if enable_insert_detection %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_INSERT" MSG="toolhead: {toolhead}, filament_grabbing_length: {filament_grabbing_length}, filament_grabbing_speed: {filament_grabbing_speed}, current_idex_mode: {current_idex_mode}"
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Loading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
FORCE_MOVE STEPPER={'extruder%s' % ('' if toolhead == 0 else toolhead)} DISTANCE={filament_grabbing_length} VELOCITY={filament_grabbing_speed}
M400
{% if printer.pause_resume.is_paused %}
LOAD_FILAMENT TOOLHEAD={toolhead}
{% if resume_after_insert %}
RESUME
{% endif %}
{% else %}
{% if not printer.virtual_sdcard.is_active %}
LOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_INSERT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_INSERT" MSG="TOOLHEAD: {toolhead}"
[gcode_macro _PURGE_BEFORE_UNLOAD]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set purge_before_unload = printer["gcode_macro T%s" % toolhead].purge_before_unload|float %}
DEBUG_ECHO PREFIX="_PURGE_BEFORE_UNLOAD" MSG="TOOLHEAD: {toolhead}"
{% if purge_before_unload > 0 %}
G92 E0
G0 E{purge_before_unload} F300
G92 E0
M400
{% endif %}
[gcode_macro _PURGE_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set e = params.E|int %}
{% set r = params.R|default(0)|int %}
DEBUG_ECHO PREFIX="_PURGE_FILAMENT" MSG="TOOLHEAD: {toolhead}, E: {e}"
{% if e > 0 %}
G92 E0
G0 E{e} F300
G92 E0
M400
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={0.4 if toolhead == 0 else 0}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={0.4 if toolhead == 1 else 0}
{% else %}
M106 S{(255 * 0.4)}
{% endif %}
{% endif %}
G4 P3000
{% if r > 0 %}
G92 E0
G0 E-{r} F300
G92 E0
M400
{% endif %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED=0
SET_FAN_SPEED FAN=part_fan_t1 SPEED=0
{% else %}
M106 S0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _MOVE_TO_PARKING_POSITION]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_MOVE_TO_PARKING_POSITION" MSG="TOOLHEAD: {toolhead}"
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].parking_position is defined %}
{% set parking_position = printer["gcode_macro T%s" % toolhead].parking_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
G1 X{parking_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _MOVE_TO_LOADING_POSITION]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_MOVE_TO_LOADING_POSITION" MSG="TOOLHEAD: {toolhead}"
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].loading_position is defined %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% set act_t = 1 if idex_mode == 'primary' else 0 %}
{% if act_t == toolhead %}
{% set loading_position = printer["gcode_macro T%s" % toolhead].loading_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
G1 X{loading_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _CLEANING_MOVE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].parking_position is defined and printer["gcode_macro T%s" % toolhead].loading_position is defined %}
{% set loading_position = printer["gcode_macro T%s" % toolhead].loading_position|float %}
{% set parking_position = printer["gcode_macro T%s" % toolhead].parking_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
{% set cleaning_position = loading_position %}
{% if loading_position == parking_position %}
{% if loading_position > 0 %}
{% set cleaning_position = loading_position - 30 %}
{% else %}
{% set cleaning_position = loading_position + 30 %}
{% endif %}
{% endif %}
G1 X{parking_position} F{speed}
G1 X{cleaning_position} F{speed}
G1 X{parking_position} F{speed}
G1 X{cleaning_position} F{speed}
G1 X{parking_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _START_PRINT_BED_MESH]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="start_print_bed_mesh"
SET_MACRO_TRAVEL_SETTINGS
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set X=[params.X0|default(-1)|float, params.X1|default(-1)|float] %}
{% set Y=[params.Y0|default(-1)|float, params.Y1|default(-1)|float] %}
DEBUG_ECHO PREFIX="_START_PRINT_BED_MESH" MSG="idex_mode: {idex_mode}, X: {X}, Y: {Y}"
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set X=[0, printable_x_max] %}
{% endif %}
{% set beacon_bed_mesh_scv = printer["gcode_macro RatOS"].beacon_bed_mesh_scv|default(25)|int %}
{% set beacon_contact_bed_mesh_samples = printer["gcode_macro RatOS"].beacon_contact_bed_mesh_samples|default(2)|int %}
{% set beacon_contact_bed_mesh = true if printer["gcode_macro RatOS"].beacon_contact_bed_mesh|default(false)|lower == 'true' else false %}
{% if printer.configfile.settings.beacon is defined and not beacon_contact_bed_mesh %}
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={beacon_bed_mesh_scv}
{% endif %}
{% set default_profile = printer["gcode_macro RatOS"].bed_mesh_profile|default('ratos') %}
{% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %}
BED_MESH_CLEAR
{% if printer["gcode_macro RatOS"].adaptive_mesh|lower == 'true' %}
CALIBRATE_ADAPTIVE_MESH PROFILE={default_profile} X0={X[0]} X1={X[1]} Y0={Y[0]} Y1={Y[1]} T={params.T|int} BOTH_TOOLHEADS={params.BOTH_TOOLHEADS} IDEX_MODE={idex_mode}
{% else %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% endif %}
BED_MESH_PROFILE LOAD={default_profile}
{% elif printer["gcode_macro RatOS"].bed_mesh_profile is defined %}
BED_MESH_CLEAR
BED_MESH_PROFILE LOAD={printer["gcode_macro RatOS"].bed_mesh_profile}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print_bed_mesh"
[gcode_macro CALIBRATE_ADAPTIVE_MESH]
gcode =
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_bed_mesh_samples = printer["gcode_macro RatOS"].beacon_contact_bed_mesh_samples|default(2)|int %}
{% set beacon_contact_bed_mesh = true if printer["gcode_macro RatOS"].beacon_contact_bed_mesh|default(false)|lower == 'true' else false %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set default_profile = params.PROFILE %}
{% set x0 = params.X0|default(-1)|float %}
{% set y0 = params.Y0|default(-1)|float %}
{% set x1 = params.X1|default(-1)|float %}
{% set y1 = params.Y1|default(-1)|float %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Recieved coordinates X0={x0} Y0={y0} X1={x1} Y1={y1}"
{% if x0 >= x1 or y0 >= y1 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Invalid coordinates received. Please check your slicer settings. Falling back to full bed mesh."
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% else %}
{% set mesh_config = printer.configfile.config.bed_mesh %}
{% set min_x = mesh_config.mesh_min.split(",")[0]|float %}
{% set min_y = mesh_config.mesh_min.split(",")[1]|float %}
{% set max_x = mesh_config.mesh_max.split(",")[0]|float %}
{% set max_y = mesh_config.mesh_max.split(",")[1]|float %}
{% set mesh_x0 = [[x0, max_x]|min, min_x]|max %}
{% set mesh_y0 = [[y0, max_y]|min, min_y]|max %}
{% set mesh_x1 = [[x1, max_x]|min, min_x]|max %}
{% set mesh_y1 = [[y1, max_y]|min, min_y]|max %}
{% if mesh_x0 == min_x and mesh_y0 == min_y and mesh_x1 == max_x and mesh_y1 == max_y %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Print is using the full bed, falling back to full bed mesh."
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% else %}
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
DEPLOY_PROBE
{% endif %}
{% set probe_count_x = mesh_config.probe_count.split(",")[0]|int %}
{% if mesh_config.probe_count.split(",")|length == 2 %}
{% set probe_count_y = mesh_config.probe_count.split(",")[1]|int %}
{% else %}
{% set probe_count_y = mesh_config.probe_count.split(",")[0]|int %}
{% endif %}
{% set probe_x_step = (max_x - min_x) / probe_count_x %}
{% set probe_y_step = (max_y - min_y) / probe_count_y %}
{% set mesh_count_x = ([(mesh_x1 - mesh_x0) / probe_x_step, 3]|max)|int %}
{% set mesh_count_y = ([(mesh_y1 - mesh_y0) / probe_y_step, 3]|max)|int %}
{% set min_mesh_count = [mesh_count_x, mesh_count_y]|min %}
{% set max_mesh_count = [mesh_count_x, mesh_count_y]|max %}
{% set algorithm = mesh_config.algorithm %}
{% if algorithm|lower == 'lagrange' and max_mesh_count > 6 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="cannot exceed a probe_count of 6 when using lagrange interpolation. Falling back to bicubic interpolation."
{% set algorithm = 'bicubic' %}
{% endif %}
{% if algorithm|lower == 'bicubic' and min_mesh_count < 4 %}
{% if max_mesh_count > 6 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="invalid probe_count option when using bicubic interpolation. Combination of 3 points on one axis with more than 6 on another is not permitted. Forcing minimum mesh count to be 4."
{% set min_mesh_count = 4 %}
{% else %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="bicubic interpolation with a probe_count of less than 4 points detected. Forcing lagrange interpolation."
{% set algorithm = 'lagrange' %}
{% endif %}
{% endif %}
{% set mesh_count_x = ([min_mesh_count, mesh_count_x]|max)|int %}
{% set mesh_count_x = ([max_mesh_count, mesh_count_x]|min)|int %}
{% set mesh_count_y = ([min_mesh_count, mesh_count_y]|max)|int %}
{% set mesh_count_y = ([max_mesh_count, mesh_count_y]|min)|int %}
{% set should_prime = printer["gcode_macro RatOS"].nozzle_priming == 'primeblob' %}
{% if printer["dual_carriage"] is not defined %}
{% set probe_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printable_y_max) < printable_y_max / 2 %}
{% else %}
{% set probe_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printable_y_max) < printable_y_max / 2 %}
{% endif %}
{% if printer.configfile.settings.beacon is defined and printer.configfile.settings.beacon.mesh_runs % 2 != 0 and probe_first %}
{% set probe_first = false %}
{% elif printer.configfile.settings.beacon is defined and printer.configfile.settings.beacon.mesh_runs % 2 == 0 and not probe_first %}
{% set probe_first = true %}
{% endif %}
{% if should_prime and probe_first %}
{% if printer["dual_carriage"] is not defined %}
PROBE_FOR_PRIMING
{% else %}
{% if both_toolheads %}
PROBE_FOR_PRIMING TOOLHEAD=0 IDEX_MODE={idex_mode}
PROBE_FOR_PRIMING TOOLHEAD=1 IDEX_MODE={idex_mode}
{% else %}
PROBE_FOR_PRIMING TOOLHEAD={params.T|int} IDEX_MODE={idex_mode}
{% endif %}
{% endif %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="mesh coordinates X0={mesh_x0} Y0={mesh_y0} X1={mesh_x1} Y1={mesh_y1}"
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile} ALGORITHM={algorithm} MESH_MIN={mesh_x0},{mesh_y0} MESH_MAX={mesh_x1},{mesh_y1} PROBE_COUNT={mesh_count_x},{mesh_count_y} RELATIVE_REFERENCE_INDEX=-1
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile} ALGORITHM={algorithm} MESH_MIN={mesh_x0},{mesh_y0} MESH_MAX={mesh_x1},{mesh_y1} PROBE_COUNT={mesh_count_x},{mesh_count_y} RELATIVE_REFERENCE_INDEX=-1
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% if should_prime and not probe_first %}
{% if printer["dual_carriage"] is not defined %}
PROBE_FOR_PRIMING
{% else %}
{% if both_toolheads %}
PROBE_FOR_PRIMING TOOLHEAD=0 IDEX_MODE={idex_mode}
PROBE_FOR_PRIMING TOOLHEAD=1 IDEX_MODE={idex_mode}
{% else %}
PROBE_FOR_PRIMING TOOLHEAD={params.T|int} IDEX_MODE={idex_mode}
{% endif %}
{% endif %}
{% endif %}
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
STOW_PROBE
{% endif %}
{% endif %}
{% endif %}
[gcode_macro M84]
rename_existing = M84.1
gcode =
M84.1
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
{% if printer["dual_carriage"] is defined %}
_SET_TOOLHEAD_OFFSET T={printer["gcode_macro RatOS"].default_toolhead|int} MOVE=0
SET_GCODE_VARIABLE MACRO=SET_PRESSURE_ADVANCE VARIABLE=snyc_toolheads VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_REMAP_TOOLHEADS VARIABLE=enabled VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% if printer["gcode_macro _VAOC"] is defined %}
SET_GCODE_VARIABLE MACRO=_VAOC VARIABLE=is_started VALUE=False
SET_GCODE_VARIABLE MACRO=_VAOC VARIABLE=is_started_at_temp VALUE=False
{% endif %}
SET_GCODE_OFFSET X=0 Y=0 Z=0 MOVE=0
_IDEX_SINGLE INIT=1
{% endif %}
SET_SKEW CLEAR=1
_LED_MOTORS_OFF
[gcode_macro M104]
rename_existing = M104.1
gcode =
{% set s = params.S|default(0)|int %}
{% set t = params.T|default(-1)|int %}
{% set t = 0 if t == -1 else t %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
DEBUG_ECHO PREFIX="M104" MSG="s: {s}, t: {t}"
{% if printer["gcode_macro T%s" % t] is defined %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set temperature_offset_t0 = printer["gcode_macro T0"].temperature_offset|default(0)|int %}
{% set temperature_offset_t1 = printer["gcode_macro T1"].temperature_offset|default(0)|int %}
{% set s0 = [s + temperature_offset_t0, 0]|max %}
{% set s1 = [s + temperature_offset_t1, 0]|max %}
{% if temperature_offset_t0 != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset_t0}°C added to toolhead T0."
{% endif %}
{% if temperature_offset_t1 != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset_t1}°C added to toolhead T1."
{% endif %}
{% else %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set s = [s + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
{% set is_in_standby = false %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% if toolchange_standby_temp > -1 %}
{% set is_in_standby = true if printer["gcode_macro T%s" % t].standby|default(false)|lower == 'true' else false %}
{% endif %}
{% endif %}
{% if not is_in_standby %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
M104.1 S{s0} T0
M104.1 S{s1} T1
{% else %}
M104.1 S{s} T{t}
{% endif %}
{% endif %}
[gcode_macro M109]
rename_existing = M109.1
gcode =
{% set s = params.S|default(0)|int %}
{% set t = params.T|default(-1)|int %}
{% set t = 0 if t == -1 else t %}
DEBUG_ECHO PREFIX="M109" MSG="s: {s}, t: {t}"
{% if printer["gcode_macro T%s" % t] is defined %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set s = [s + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="M109" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% set is_in_standby = false %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% if toolchange_standby_temp > -1 %}
{% set is_in_standby = true if printer["gcode_macro T%s" % t].standby|default(false)|lower == 'true' else false %}
{% endif %}
{% endif %}
{% if not is_in_standby %}
M109.1 S{s} T{t}
{% endif %}
[gcode_macro SET_HEATER_TEMPERATURE]
rename_existing = SET_HEATER_TEMPERATURE_BASE
gcode =
{% set heater = params.HEATER|default("") %}
{% set target = params.TARGET|default(0)|int %}
DEBUG_ECHO PREFIX="SET_HEATER_TEMPERATURE" MSG="heater: {heater}, target: {target}"
{% if heater|lower == "extruder" or heater|lower == "extruder1" %}
{% set t = 0 if heater|lower == "extruder" else 1 %}
{% if printer["gcode_macro T%s" % t] is defined and target > 0 %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set target = [target + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="SET_HEATER_TEMPERATURE" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
SET_HEATER_TEMPERATURE_BASE HEATER="{heater}" TARGET={target}
[gcode_macro TEMPERATURE_WAIT]
rename_existing = TEMPERATURE_WAIT_BASE
gcode =
{% set sensor = params.SENSOR|default("") %}
{% set minimum = params.MINIMUM|default(-1)|int %}
{% set maximum = params.MAXIMUM|default(-1)|int %}
DEBUG_ECHO PREFIX="TEMPERATURE_WAIT" MSG="sensor: {sensor}, minimum: {minimum}, maximum: {maximum}"
{% if sensor|lower == "extruder" or sensor|lower == "extruder1" %}
{% set t = 0 if sensor|lower == "extruder" else 1 %}
{% if printer["gcode_macro T%s" % t] is defined and (minimum > 0 or maximum > 0) %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% if minimum > -1 %}
{% set minimum = [minimum + temperature_offset, 0]|max %}
{% endif %}
{% if maximum > -1 %}
{% set maximum = [maximum + temperature_offset, 0]|max %}
{% endif %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
{% if minimum > -1 and maximum > -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MINIMUM: {minimum}, MAXIMUM: {maximum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MINIMUM={minimum} MAXIMUM={maximum}
{% elif minimum > -1 and maximum == -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MINIMUM: {minimum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MINIMUM={minimum}
{% elif minimum == -1 and maximum > -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MAXIMUM: {maximum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MAXIMUM={maximum}
{% endif %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Temperature for toolhead T{t} reached."
[gcode_macro SET_GCODE_OFFSET]
rename_existing = SET_GCODE_OFFSET_ORG
gcode =
SET_GCODE_OFFSET_ORG { rawparams }
{% if printer.configfile.settings.beacon is defined and (params.Z_ADJUST is defined or params.Z is defined) %}
_BEACON_APPLY_RUNTIME_MULTIPLIER
{% endif %}
[gcode_macro SDCARD_PRINT_FILE]
rename_existing = SDCARD_PRINT_FILE_BASE
gcode =
{% if printer["ratos"] is defined %}
PROCESS_GCODE_FILE { rawparams }
{% else %}
SDCARD_PRINT_FILE_BASE { rawparams }
{% endif %}
[gcode_macro SKEW_PROFILE]
rename_existing = SKEW_PROFILE_BASE
variable_loaded_profile = ""
gcode =
{% if params.LOAD is defined %}
{% if printer.configfile.settings["skew_correction %s" % params.LOAD] is defined %}
SET_GCODE_VARIABLE MACRO=SKEW_PROFILE VARIABLE=loaded_profile VALUE='"{params.LOAD}"'
{% endif %}
{% endif %}
SKEW_PROFILE_BASE { rawparams }
[gcode_macro SET_SKEW]
rename_existing = SET_SKEW_BASE
gcode =
{% if params.CLEAR is defined %}
{% if params.CLEAR|default(0)|int == 1 %}
SET_GCODE_VARIABLE MACRO=SKEW_PROFILE VARIABLE=loaded_profile VALUE='""'
{% endif %}
{% endif %}
SET_SKEW_BASE { rawparams }
[gcode_macro SET_VELOCITY_LIMIT]
rename_existing = SET_VELOCITY_LIMIT_BASE
gcode =
{% if params.ACCEL_TO_DECEL is defined %}
{% if params.ACCEL is defined %}
{% set accel = params.ACCEL|float %}
{% else %}
{% set accel = printer.toolhead.max_accel|float %}
{% endif %}
{% if params.VELOCITY is defined %}
{% set velocity = params.VELOCITY|float %}
{% else %}
{% set velocity = printer.toolhead.max_velocity|float %}
{% endif %}
{% if params.SQUARE_CORNER_VELOCITY is defined %}
{% set scv = params.SQUARE_CORNER_VELOCITY|float %}
{% else %}
{% set scv = printer.toolhead.square_corner_velocity|float %}
{% endif %}
{% set mcr = params.ACCEL_TO_DECEL|float / accel %}
DEBUG_ECHO PREFIX="SET_VELOCITY_LIMIT" MSG="ACCEL={accel}, VELOCITY={velocity}, SQUARE_CORNER_VELOCITY={scv}, MINIMUM_CRUISE_RATIO={mcr}"
SET_VELOCITY_LIMIT_BASE ACCEL={accel} VELOCITY={velocity} SQUARE_CORNER_VELOCITY={scv} MINIMUM_CRUISE_RATIO={1-mcr}
{% else %}
SET_VELOCITY_LIMIT_BASE { rawparams }
{% endif %}
[gcode_macro _START_PRINT_PARK]
gcode =
{% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set start_print_park_in = printer["gcode_macro RatOS"].start_print_park_in %}
{% set start_print_park_x = printer["gcode_macro RatOS"].start_print_park_x %}
{% if start_print_park_in == 'primeblob' %}
{% set z = 3 %}
{% endif %}
{% if printer["dual_carriage"] is defined and not (printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
{% if printer["gcode_macro RatOS"].start_print_park_x is defined and printer["gcode_macro RatOS"].start_print_park_x != '' %}
RATOS_ECHO PREFIX="WARNING" MSG="start_print_park_x is ignored for IDEX printers"
{% endif %}
PARK_TOOLHEAD
G90
{% endif %}
_PARK LOCATION={start_print_park_in} X={start_print_park_x}
G0 Z{z} F{z_speed}
[gcode_macro _END_PRINT_PARK]
gcode =
{% if printer["dual_carriage"] is defined %}
{% if printer["gcode_macro RatOS"].end_print_park_x is defined and printer["gcode_macro RatOS"].end_print_park_x != '' %}
RATOS_ECHO PREFIX="WARNING" MSG="end_print_park_x is ignored for IDEX printers"
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
_IDEX_SINGLE X={parking_position}
PARK_TOOLHEAD
G90
{% endif %}
_PARK LOCATION={printer["gcode_macro RatOS"].end_print_park_in} X={printer["gcode_macro RatOS"].end_print_park_x}
[gcode_macro _PARK]
gcode =
{% set x = params.X %}
{% set location = params.LOCATION|default('back')|lower %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% set nozzle_priming = printer["gcode_macro RatOS"].nozzle_priming|lower %}
CACHE_TOOLHEAD_SETTINGS KEY="park"
SET_MACRO_TRAVEL_SETTINGS
{% if x != '' %}
{% if x|float >= printer.toolhead.axis_minimum.x + 5 and x|float <= printable_x_max - 5 %}
{% set park_x = x|float %}
{% else %}
{action_respond_info('The requested X co-ordinate is outside the defined axis bounds - using defaults')}
{% set park_x = printable_x_max / 2 %}
{% endif %}
{% else %}
{% set park_x = printable_x_max / 2 %}
{% endif %}
{% if location == 'back' %}
{% set park_y = printable_y_max - 15 %}
{% elif location == 'front' %}
{% set park_y = printer.toolhead.axis_minimum.y + 5 %}
{% elif location == 'center' %}
{% set park_y = printable_y_max / 2 %}
{% elif location == 'primeblob' and printer["dual_carriage"] is defined %}
{% set park_y = printable_y_max - 15 %}
{% endif %}
{% if location == 'primeblob' and printer["dual_carriage"] is not defined %}
{% if (nozzle_priming == 'primeblob' or nozzle_priming == 'primeline') %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set park_x = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set park_x = printable_x_max - 5 %}
{% else %}
{% set park_x = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set park_y = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set park_y = printable_y_max - 5 %}
{% else %}
{% set park_y = nozzle_prime_start_y|float %}
{% endif %}
{% endif %}
{% endif %}
G90
{% if printer["dual_carriage"] is not defined %}
G0 X{park_x} Y{park_y} F{speed}
{% else %}
G0 Y{park_y} F{speed}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="park"
[gcode_macro SAVE_PROBE_RESULT]
gcode =
{% set beacon_contact_prime_probing = true if printer["gcode_macro RatOS"].beacon_contact_prime_probing|default(false)|lower == 'true' else false %}
{% set last_z_offset = 9999.9 %}
{% if printer.configfile.settings.beacon is defined %}
{% set current_z = printer.toolhead.position.z|float %}
{% if beacon_contact_prime_probing %}
{% set last_z_offset = printer.beacon.last_z_result %}
{% else %}
{% set last_z_offset = printer.beacon.last_sample.dist - current_z %}
{% endif %}
{% elif printer.configfile.settings.bltouch is defined %}
{% set config_offset = printer.configfile.settings.bltouch.z_offset|float %}
{% set last_z_offset = printer.probe.last_z_result - config_offset %}
{% elif printer.configfile.settings.probe is defined %}
{% set config_offset = printer.configfile.settings.probe.z_offset|float %}
{% set last_z_offset = printer.probe.last_z_result - config_offset %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Saving offset adjustment of {last_z_offset} in {params.VARIABLE|default('last_z_offset')}"
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE={params.VARIABLE|default('last_z_offset')} VALUE={last_z_offset}
[gcode_macro PROBE_FOR_PRIMING]
gcode =
{% set probe_for_priming_disable_mesh_constraints = true if printer["gcode_macro RatOS"].probe_for_priming_disable_mesh_constraints|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].nozzle_priming|lower != 'false' %}
SAVE_GCODE_STATE NAME=probe_for_priming_state
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the prime location.."
CACHE_TOOLHEAD_SETTINGS KEY="probe_for_priming"
SET_MACRO_TRAVEL_SETTINGS
{% set t = params.TOOLHEAD|default(-1)|int %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% if idex_mode == '' %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set x_start = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set x_start = printable_x_max - 5 %}
{% else %}
{% set x_start = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% else %}
{% set y_start = nozzle_prime_start_y|float %}
{% endif %}
{% else %}
{% set center_x = printable_x_max / 2 %}
{% if t == 0 %}
{% set x_start = 5 %}
{% else %}
{% set x_start = printable_x_max - 5 %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% endif %}
{% endif %}
{% set z = printer.configfile.settings.bed_mesh.horizontal_move_z|float %}
{% set mesh_config = printer.configfile.config.bed_mesh %}
{% if printer.configfile.settings.bltouch is defined %}
{% set x_offset = printer.configfile.settings.bltouch.x_offset|float %}
{% set y_offset = printer.configfile.settings.bltouch.y_offset|float %}
{% set z_offset = printer.configfile.settings.bltouch.z_offset|float %}
{% elif printer.configfile.settings.probe is defined %}
{% set x_offset = printer.configfile.settings.probe.x_offset|float %}
{% set y_offset = printer.configfile.settings.probe.y_offset|float %}
{% set z_offset = printer.configfile.settings.probe.z_offset|float %}
{% elif printer.configfile.settings.beacon is defined %}
{% set x_offset = printer.configfile.settings.beacon.x_offset|float %}
{% set y_offset = printer.configfile.settings.beacon.y_offset|float %}
{% set z_offset = printer.configfile.settings.beacon.trigger_distance|float %}
{% else %}
{ action_raise_error("No probe, beacon or bltouch section found. Adaptive priming only works with a [probe], [beacon] or [bltouch] section defined.") }
{% endif %}
{% if z < z_offset %}
{ action_raise_error("Horizontal move Z ({z}) is below your probe's Z offset ({z_offset}). Please adjust your horizontal_move_z setting in [bed_mesh] to be above {z}.") }
{% endif %}
{% if not probe_for_priming_disable_mesh_constraints %}
{% set min_x = mesh_config.mesh_min.split(",")[0]|float - x_offset %}
{% set min_y = mesh_config.mesh_min.split(",")[1]|float - y_offset %}
{% set max_x = mesh_config.mesh_max.split(",")[0]|float - x_offset %}
{% set max_y = mesh_config.mesh_max.split(",")[1]|float - y_offset %}
{% set x_start = [[x_start, max_x]|min, min_x]|max %}
{% set y_start = [[y_start, max_y]|min, min_y]|max %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the start of the prime location at {x_start}, {y_start}"
G90
M83
G0 Z{z} F{z_speed}
G1 X{x_start} Y{y_start} F{speed}
PROBE_CURRENT_POSITION
{% if t == 1 %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result_t1
{% else %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result
{% endif %}
{% if idex_mode == '' %}
{% set x_end = x_start %}
{% set y_end = y_start + 45 %}
{% else %}
{% if t==1 %}
{% set x_end = x_start - 45 %}
{% else %}
{% set x_end = x_start + 45 %}
{% endif %}
{% set y_end = y_start %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the end of the prime location at {x_end}, {y_end}"
G1 X{x_end} Y{y_end} F{speed}
PROBE_CURRENT_POSITION
{% if t == 1 %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_end_result_t1
{% else %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_end_result
{% endif %}
RESTORE_GCODE_STATE NAME=probe_for_priming_state
RESTORE_TOOLHEAD_SETTINGS KEY="probe_for_priming"
{% endif %}
[gcode_macro RESET_PRIME_PROBE_STATE]
gcode =
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result VALUE=None
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_end_result VALUE=None
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result_t1 VALUE=None
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_end_result_t1 VALUE=None
{% endif %}
[gcode_macro PROBE_CURRENT_POSITION]
gcode =
{% set beacon_contact_prime_probing = true if printer["gcode_macro RatOS"].beacon_contact_prime_probing|default(false)|lower == 'true' else false %}
SAVE_GCODE_STATE NAME=probe_current_position_state
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
ASSERT_PROBE_DEPLOYED
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_prime_probing %}
PROBE PROBE_METHOD=contact SAMPLES=1
{% else %}
PROBE
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
BEACON_QUERY
{% else %}
RESTORE_GCODE_STATE NAME=probe_current_position_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_z_speed|float}
{% endif %}
[gcode_macro PRIME_BLOB]
description = Prints a primeblob, used internally, if configured, as part of the START_PRINT macro.
variable_x_offset = 5
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="prime_blob"
SET_MACRO_TRAVEL_SETTINGS
RATOS_ECHO PREFIX="Priming" MSG="Priming nozzle with prime blob.."
{% set current_toolhead = 0 %}
{% set target_idex_mode = '' %}
{% set extruder = 'extruder' %}
{% if printer["dual_carriage"] is defined %}
{% if params.IDEX_MODE is defined %}
{% set target_idex_mode = params.IDEX_MODE|default('')|lower %}
{% else %}
{ action_raise_error("IDEX_MODE parameter not found for PRIME_BLOB macro. This is likely a bug.") }
{% endif %}
RATOS_ECHO PREFIX="Priming" MSG="Priming in IDEX {target_idex_mode} mode.."
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set current_toolhead = 1 if current_idex_mode=='primary' else 0 %}
{% set extruder = 'extruder1' if current_toolhead == 1 else 'extruder' %}
{% endif %}
{% if target_idex_mode != "copy" or target_idex_mode != "mirror" %}
SAVE_GCODE_STATE NAME=prime_blob_state
{% endif %}
{% set first_y = printer["gcode_macro START_PRINT"].first_y|default(-1)|float %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set fan_speed = printer["gcode_macro RatOS"].nozzle_prime_bridge_fan|float %}
{% set nozzle_diameter = printer.configfile.settings[extruder].nozzle_diameter|float %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set has_start_offset_t0 = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) != 9999.9 %}
{% if printer["dual_carriage"] is defined %}
{% set has_start_offset_t1 = printer["gcode_macro RatOS"].probe_for_priming_result_t1|float(9999.9) != 9999.9 %}
{% endif %}
{% set start_print_park_in = printer["gcode_macro RatOS"].start_print_park_in %}
{% set start_print_park_z_height = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set nozzle_prime_direction = printer["gcode_macro RatOS"].nozzle_prime_direction|lower %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% set initial_toolhead = params.INITIAL_TOOLHEAD|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% if target_idex_mode == '' %}
{% set x_factor = 0 %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set x_start = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set x_start = printable_x_max - 5 %}
{% else %}
{% set x_start = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% set y_factor = 1 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% set y_factor = -1 %}
{% else %}
{% set y_start = nozzle_prime_start_y|float %}
{% if nozzle_prime_start_y|float < printable_y_max / 2 %}
{% set y_factor = 1 %}
{% else %}
{% set y_factor = -1 %}
{% endif %}
{% endif %}
{% if nozzle_prime_direction == 'forwards' %}
{% set y_factor = 1 %}
{% elif nozzle_prime_direction == 'backwards' %}
{% set y_factor = -1 %}
{% endif %}
{% if start_print_park_in == 'primeblob' %}
{% set z = 3 %}
{% else %}
{% set z = start_print_park_z_height %}
{% endif %}
{% else %}
{% set center_x = printable_x_max / 2 %}
{% set y_factor = 0 %}
{% if target_idex_mode == 'copy' or target_idex_mode == 'mirror' %}
{% set x_start = center_x / 2 + 5 %}
{% set x_factor = 1 %}
{% else %}
{% if both_toolheads and initial_toolhead != current_toolhead %}
{% if current_toolhead == 0 %}
{% set x_start = 55 %}
{% set x_factor = -1 %}
{% elif current_toolhead == 1 %}
{% set x_start = printable_x_max - 55 %}
{% set x_factor = 1 %}
{% endif %}
{% else %}
{% if current_toolhead == 0 %}
{% set x_start = 5 %}
{% set x_factor = 1 %}
{% elif current_toolhead == 1 %}
{% set x_start = printable_x_max - 5 %}
{% set x_factor = -1 %}
{% endif %}
{% endif %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_x_max - 5 %}
{% endif %}
{% set z = 10 %}
{% endif %}
{% set start_z_offset = 0 %}
{% set end_z_offset = 0 %}
{% if has_start_offset_t0 %}
{% set start_z_probe_result_t0 = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %}
{% set end_z_probe_result_t0 = printer["gcode_macro RatOS"].probe_for_priming_end_result|float(9999.9) %}
{% if printer.configfile.settings.bltouch is not defined and printer.configfile.settings.probe is not defined and printer.configfile.settings.beacon is not defined %}
{ action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe], [beacon] or [bltouch].") }
{% endif %}
{% if start_z_probe_result_t0 == 9999.9 %}
{ action_raise_error("No start probe result found for prime area. This is likely a bug.") }
{% endif %}
{% if end_z_probe_result_t0 == 9999.9 %}
{ action_raise_error("No end probe result found for prime area. This is likely a bug.") }
{% endif %}
{% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %}
{% if start_z_probe_result_t0 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (start_z_probe_result_t0) ) }
{% endif %}
{% if end_z_probe_result_t0 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (end_z_probe_result_t0) ) }
{% endif %}
{% set start_z_offset = start_z_probe_result_t0 %}
{% set end_z_offset = end_z_probe_result_t0 %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if current_toolhead == 1 or both_toolheads or target_idex_mode == "copy" or target_idex_mode == "mirror" %}
{% if has_start_offset_t1 %}
{% set start_z_probe_result_t1 = printer["gcode_macro RatOS"].probe_for_priming_result_t1|float(9999.9) %}
{% set end_z_probe_result_t1 = printer["gcode_macro RatOS"].probe_for_priming_end_result_t1|float(9999.9) %}
{% if printer.configfile.settings.bltouch is not defined and printer.configfile.settings.probe is not defined and printer.configfile.settings.beacon is not defined %}
{ action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe], [beacon] or [bltouch].") }
{% endif %}
{% if start_z_probe_result_t1 == 9999.9 %}
{ action_raise_error("No start probe result found for prime area. This is likely a bug.") }
{% endif %}
{% if end_z_probe_result_t1 == 9999.9 %}
{ action_raise_error("No end probe result found for prime area. This is likely a bug.") }
{% endif %}
{% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %}
{% if start_z_probe_result_t1 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (start_z_probe_result_t1) ) }
{% endif %}
{% if end_z_probe_result_t1 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (end_z_probe_result_t1) ) }
{% endif %}
{% set start_z_offset = [start_z_offset, start_z_probe_result_t1]|max %}
{% set end_z_offset = [end_z_offset, start_z_probe_result_t1]|max %}
{% endif %}
{% endif %}
{% if target_idex_mode != 'copy' and target_idex_mode != 'mirror' %}
{% if both_toolheads and initial_toolhead != current_toolhead %}
{% set original_start_z_offset = start_z_offset %}
{% set original_end_z_offset = end_z_offset %}
{% set start_z_offset = original_end_z_offset %}
{% set end_z_offset = original_start_z_offset %}
{% endif %}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SET_NOZZLE_TEMP_OFFSET TOOLHEAD={current_toolhead}
{% endif %}
DEBUG_ECHO PREFIX="PRIME_BLOB" MSG="x_start: {x_start}, y_start: {y_start}, x_factor: {x_factor}, y_factor: {y_factor}, z: {z}, start_z_offset: {start_z_offset}, end_z_offset: {end_z_offset}"
G90
M83
RATOS_ECHO PREFIX="Priming" MSG="Lifting Z to {z}.."
G0 Z{z} F{z_speed}
{% if printer["dual_carriage"] is not defined %}
RATOS_ECHO PREFIX="Priming" MSG="Moving to {x_start}, {y_start} along the edge of the print area.."
{% if start_print_park_in != 'primeblob' %}
G1 X{x_start} F{speed}
G1 Y{y_start + (15 * y_factor)} F{speed}
{% endif %}
{% else %}
G1 Y{y_start + (15 * y_factor)} F{speed}
{% if target_idex_mode=="copy" or target_idex_mode=="mirror" %}
RATOS_ECHO PREFIX="Priming" MSG="Mirroring move to {x_start}, {y_start} along the edge of the print area.."
_IDEX_MIRROR PRIMING=1
{% else %}
RATOS_ECHO PREFIX="Priming" MSG="Moving to {x_start}, {y_start} along the edge of the print area.."
{% endif %}
G1 X{x_start} F{speed}
{% endif %}
RATOS_ECHO PREFIX="Priming" MSG="Starting prime blob.."
G1 Z{0.5 + start_z_offset} F{z_speed}
G1 Y{y_start} F{speed}
G1 F300 E{14 / ((0.4 / nozzle_diameter) ** 2)}
G1 F300 E{14 / ((0.4 / nozzle_diameter) ** 2)}
M106 S{fan_speed}
G1 Z5 F100 E5
G92 E0
RATOS_ECHO PREFIX="Priming" MSG="Bridging with {((fan_speed/255) * 100)|int}% fan speed.."
G1 F3000 X{x_start + (15 * x_factor)} Y{y_start + (15 * y_factor)} E{1 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (20 * x_factor)} Y{y_start + (20 * y_factor)} Z{3.8 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (34 * x_factor)} Y{y_start + (34 * y_factor)} Z{2.6 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (38 * x_factor)} Y{y_start + (38 * y_factor)} Z{1.4 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (42 * x_factor)} Y{y_start + (42 * y_factor)} Z{0.2 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
M106 S0
G1 F3000 X{x_start + (46 * x_factor)} Y{y_start + (46 * y_factor)} Z{0.2 + end_z_offset} E0.6
G1 F{speed} X{x_start + (50 * x_factor)} Y{y_start + (50 * y_factor)}
{% if target_idex_mode == "copy" or target_idex_mode == "mirror" %}
G0 Z3 F{z_speed}
{% endif %}
{% if target_idex_mode == "copy" %}
{% if first_y >= 0 %}
_IDEX_COPY DANCE=0 Y={first_y}
{% else %}
_IDEX_COPY DANCE=0 Y={params.Y1}
{% endif %}
{% endif %}
{% if target_idex_mode != "copy" or target_idex_mode != "mirror" %}
RESTORE_GCODE_STATE NAME=prime_blob_state
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="prime_blob"
G92 E0
[gcode_macro UNLOAD_FILAMENT]
description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams.
variable_ignore_min_extrude_temp = True
gcode =
_LEARN_MORE_FILAMENT
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set filament_name = params._NAME|default('')|string %}
{% set filament_type = params._TYPE|default('')|string %}
{% set temp = params.TEMP|default(220)|int %}
{% if printer["dual_carriage"] is not defined %}
_DEFAULT_UNLOAD_FILAMENT TEMP={temp} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Unloading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead==0 or toolhead==1 %}
_IDEX_UNLOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
[gcode_macro _LEGACY_UNLOAD_FILAMENT]
description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams.
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set unload_speed = 5 * 60 %}
{% set unload_length = printer["gcode_macro RatOS"].filament_unload_length|float %}
M117 Unloading filament...
G0 E10 F300
G0 E-5 F3600
G4 P3000
G0 E5 F6000
G0 E-15 F6000
G0 E-{unload_length} F{unload_speed}
_CLEANING_MOVE TOOLHEAD={toolhead}
M117 Filament unloaded!
RESPOND MSG="Filament unloaded! Please inspect the tip of the filament before reloading."
[gcode_macro _DEFAULT_UNLOAD_FILAMENT]
description = Unload filament macro for non IDEX printers.
gcode =
{% set temp = params.TEMP|default(220)|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set enable_unload_tip_forming = true if printer["gcode_macro RatOS"].enable_unload_tip_forming|default(false)|lower == 'true' else false %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_DEFAULT_UNLOAD_FILAMENT" MSG="TEMP: {temp}"
_LED_UNLOADING_FILAMENT TOOLHEAD=0
SAVE_GCODE_STATE NAME=unload_state
{% if printer.extruder.temperature|int < temp or printer.extruder.can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating extruder to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={temp}
G4 P3000
{% if enable_unload_tip_forming %}
_UNLOAD_FILAMENT TOOLHEAD=0 NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_LEGACY_UNLOAD_FILAMENT TOOLHEAD=0
{% endif %}
RESTORE_GCODE_STATE NAME=unload_state
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD=0
[gcode_macro _IDEX_UNLOAD_FILAMENT]
description = Unload filament macro for IDEX printer.
gcode =
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set enable_unload_tip_forming = true if printer["gcode_macro RatOS"].enable_unload_tip_forming|default(false)|lower == 'true' else false %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_IDEX_UNLOAD_FILAMENT" MSG="TEMP: {temp}, TOOLHEAD: {toolhead}"
_LED_UNLOADING_FILAMENT TOOLHEAD={toolhead}
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
{% if not printer.pause_resume.is_paused %}
{% if printer[target_extruder].temperature|int < temp or printer[target_extruder].can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating T{toolhead} to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={temp}
{% endif %}
G4 P3000
{% if enable_unload_tip_forming %}
_UNLOAD_FILAMENT TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_LEGACY_UNLOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead}
{% endif %}
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD={toolhead}
[gcode_macro _UNLOAD_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT" MSG="TOOLHEAD: {toolhead}"
_MOVE_TO_LOADING_POSITION TOOLHEAD={toolhead}
_UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
_UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER TOOLHEAD={toolhead}
_CLEANING_MOVE TOOLHEAD={toolhead}
[gcode_macro _UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Unloading filament from nozzle to cooling zone... Please wait!"
_PURGE_BEFORE_UNLOAD TOOLHEAD={toolhead}
{% if printer["gcode_macro _UNLOAD_WITHOUT_TIP_FORMING"] is defined %}
_UNLOAD_WITHOUT_TIP_FORMING TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_UNLOAD_WITH_TIP_FORMING NAME='{filament_name}' TYPE='{filament_type}'
{% endif %}
G4 P3000
[gcode_macro _UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set extruder_load_speed = printer["gcode_macro T%s" % toolhead].extruder_load_speed|float * 60 %}
{% set extruder_gear_to_cooling_position_distance = printer["gcode_macro T%s" % toolhead].extruder_gear_to_cooling_position_distance|float %}
{% set tooolhead_sensor_to_extruder_gear_distance = printer["gcode_macro T%s" % toolhead].tooolhead_sensor_to_extruder_gear_distance|float %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER" MSG="TOOLHEAD: {toolhead}"
G0 E-{extruder_gear_to_cooling_position_distance + tooolhead_sensor_to_extruder_gear_distance + 50} F{extruder_load_speed}
RATOS_ECHO MSG="Filament unloaded! Please inspect the tip of the filament before reloading."
[gcode_macro _UNLOAD_WITH_TIP_FORMING]
gcode =
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% if filament_name != '' and filament_type != '' %}
_UNLOAD_KNOWN_FILAMENT NAME={filament_name} TYPE={filament_type}
{% else %}
_UNLOAD_UNKNOWN_FILAMENT TOOLHEAD={toolhead}
{% endif %}
[gcode_macro _UNLOAD_KNOWN_FILAMENT]
description = User overrideable tip forming macro if slicer filament profiles are known
gcode =
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
RATOS_ECHO PREFIX="FILAMENT TYPE" MSG='{filament_type}'
RATOS_ECHO PREFIX="FILAMENT PROFILE" MSG='{filament_name}'
{% if filament_name == "Prusament PETG @V-Minion" %}
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
{% elif filament_name == "Nobufil PETG @V-Minion" %}
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
{% else %}
RATOS_ECHO PREFIX="_UNLOAD_KNOWN_FILAMENT" MSG="Filament profile not found!"
_UNLOAD_UNKNOWN_FILAMENT
{% endif %}
[gcode_macro _UNLOAD_UNKNOWN_FILAMENT]
description = User overrideable standard tip forming macro
gcode =
DEBUG_ECHO PREFIX="_UNLOAD_UNKNOWN_FILAMENT" MSG="Using standard tip forming macro!"
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
[gcode_macro _TIP_FORMING]
gcode =
{% set cooling_moves = params.COOLING_MOVES|default(4)|int %}
{% set cooling_move_length = params.COOLING_MOVE_LENGTH|default(10)|float %}
{% set start_cooling_speed = params.START_COOLING_SPEED|default(10)|float * 60 %}
{% set end_cooling_speed = params.END_COOLING_SPEED|default(50)|float * 60 %}
{% if cooling_moves == 0 %}
{% set cooling_move_length = 0 %}
{% endif %}
{% set dip = true if params.DIP|default(false)|lower == "true" else false %}
{% set dip_length = params.DIP_LENGTH|default(22)|float %}
{% set dip_speed = params.DIP_SPEED|default(30)|float * 60 %}
{% set dip_retract_speed = params.DIP_RETRACT_SPEED|default(70)|float * 60 %}
{% set retract_length = params.RETRACT_LENGTH|default(18)|float %}
{% set start_retract_speed = params.START_RETRACT_SPEED|default(120)|float * 60 %}
{% set end_retract_speed = params.END_RETRACT_SPEED|default(20)|float * 60 %}
DEBUG_ECHO PREFIX="_TIP_FORMING" MSG="cooling_moves: {cooling_moves}, cooling_move_length: {cooling_move_length}, start_cooling_speed: {start_cooling_speed}, end_cooling_speed: {end_cooling_speed}, dip: {dip}, dip_length: {dip_length}, dip_speed: {dip_speed}, dip_retract_speed: {dip_retract_speed}, retract_length: {retract_length}, start_retract_speed: {start_retract_speed}, end_retract_speed: {end_retract_speed}"
M220 S100
G92 E0
{% set retract = retract_length + cooling_move_length / 2 - 15 %}
G1 E-15 F{start_retract_speed}
G1 E-{0.7 * retract} F{1.0 * end_retract_speed}
G1 E-{0.2 * retract} F{0.5 * end_retract_speed}
G1 E-{0.1 * retract} F{0.3 * end_retract_speed}
G92 E0
{% if cooling_moves > 0 %}
{% set i = (end_cooling_speed - start_cooling_speed) / (2 * cooling_moves - 1) %}
{% for m in range(cooling_moves) %}
G1 E{cooling_move_length} F{(start_cooling_speed + i * m * 2)}
G1 E-{cooling_move_length} F{(start_cooling_speed + i * (m * 2 + 1))}
{% endfor %}
{% endif %}
G92 E0
{% if dip %}
G1 E{dip_length} F{dip_speed}
G4 P100
G1 E-{dip_length} F{dip_retract_speed}
{% endif %}
G92 E0
M400
[gcode_macro _ON_FILAMENT_SENSOR_BUTTON_PRESSED]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_FILAMENT_SENSOR_BUTTON_PRESSED" MSG="TOOLHEAD: {toolhead}"
{% if not printer.virtual_sdcard.is_active %}
UNLOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_RUNOUT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_runout_detection = true if printer["gcode_macro T%s" % toolhead].enable_runout_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_RUNOUT" MSG="TOOLHEAD: {toolhead}"
{% if enable_runout_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=false
{% endif %}
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_CLOG]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_clog_detection = true if printer["gcode_macro T%s" % toolhead].enable_clog_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_CLOG" MSG="TOOLHEAD: {toolhead}"
{% if enable_clog_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=true
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_RUNOUT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_runout_detection = true if printer["gcode_macro T%s" % toolhead].enable_runout_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_RUNOUT" MSG="TOOLHEAD: {toolhead}"
{% if enable_runout_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=false
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_CLOG]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_clog_detection = true if printer["gcode_macro T%s" % toolhead].enable_clog_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_CLOG" MSG="TOOLHEAD: {toolhead}"
{% if enable_clog_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=true
{% endif %}
[gcode_macro _ON_FILAMENT_END]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set clogged = true if params.CLOGGED|default(false)|lower == 'true' else false %}
{% set unload_after_runout = printer["gcode_macro T%s" % toolhead].unload_after_runout|float %}
{% if clogged %}
_LED_FILAMENT_CLOG TOOLHEAD={toolhead}
{% else %}
_LED_FILAMENT_RUNOUT TOOLHEAD={toolhead}
{% endif %}
DEBUG_ECHO PREFIX="_ON_FILAMENT_END" MSG="TOOLHEAD: {toolhead}"
{% if printer.virtual_sdcard.is_active %}
{% if not printer.pause_resume.is_paused %}
PAUSE RUNOUT=True
{% endif %}
{% if not clogged and unload_after_runout %}
UNLOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
{% if not clogged and printer["dual_carriage"] is defined %}
{% if printer["gcode_macro _IDEX_JOIN_SPOOLS"].enabled|default(false)|lower == 'true'%}
_JOIN_SPOOL TOOLHEAD={toolhead}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro M600]
description = Executes a color change by pausing the printer an unloading the filament.
gcode =
PAUSE
UNLOAD_FILAMENT
RATOS_ECHO MSG="Please load new filament and resume"
[gcode_macro COLD_PULL]
description = Automated hotend cold pull.
gcode =
{% set extrusion_temp = params.EXTRUSION_TEMP|default(220)|int %}
{% set cold_pull_temp = params.COLD_PULL_TEMP|default(80)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% if printer["dual_carriage"] is not defined %}
{% set toolhead = 0 %}
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Unloading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead != 0 and toolhead != 1 %}
{action_raise_error("Please select toolhead! 0 = left, 1 = right toolhead")}
{% endif %}
{% endif %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
_LED_UNLOADING_FILAMENT TOOLHEAD={toolhead}
SAVE_GCODE_STATE NAME=cold_pull_state
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
RATOS_ECHO MSG="Heating T{toolhead} to {extrusion_temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={extrusion_temp}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={extrusion_temp} MAXIMUM={extrusion_temp + 2}
G4 P3000
RATOS_ECHO MSG="extruding..."
G92 E0
G1 E30 F300
G92 E0
RATOS_ECHO MSG="Heating T{toolhead} to {cold_pull_temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={cold_pull_temp}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={cold_pull_temp} MAXIMUM={cold_pull_temp + 2}
G4 P10000
RATOS_ECHO MSG="cold pull..."
FORCE_MOVE STEPPER={target_extruder} DISTANCE=-40 VELOCITY=5 ACCEL=100
RATOS_ECHO MSG="eject filament..."
FORCE_MOVE STEPPER={target_extruder} DISTANCE=-200 VELOCITY=20 ACCEL=500
RATOS_ECHO MSG="cooling down extruder..."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET=0
RESTORE_GCODE_STATE NAME=cold_pull_state
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD={toolhead}
CONSOLE_ECHO TITLE="Cold pull finished!" MSG="Please remove the filament from the PTFE tube and cut the end off. Do NOT try to load it again." TYPE="warning"
[gcode_macro _USER_START_PRINT_BEFORE_HOMING]
gcode =
[gcode_macro _USER_START_PRINT_AFTER_HEATING_BED]
gcode =
[gcode_macro _USER_START_PRINT_BED_MESH]
gcode =
[gcode_macro _USER_START_PRINT_PARK]
gcode =
[gcode_macro _USER_START_PRINT_AFTER_HEATING_EXTRUDER]
gcode =
[gcode_macro _USER_START_PRINT_HEAT_CHAMBER]
description = Uses the extruder sensor to wait for chamber temp. Override the _START_PRINT_HEAT_CHAMBER macro to implement heated chamber handling.
gcode =
{% set chamber_heater_bed_temp = printer["gcode_macro RatOS"].chamber_heater_bed_temp|default(115)|int %}
[gcode_macro _USER_END_PRINT_BEFORE_HEATERS_OFF]
gcode =
[gcode_macro _USER_END_PRINT_AFTER_HEATERS_OFF]
gcode =
[gcode_macro _USER_END_PRINT_PARK]
gcode =
[gcode_macro _USER_END_PRINT_FINISHED]
description = User hook for when the print is finished after gcode state has been restored.
gcode =
[gcode_macro _USER_START_PRINT]
gcode =
[gcode_macro _USER_END_START_PRINT]
gcode =
[gcode_macro _USER_START_FEATURE]
gcode =
[gcode_macro _USER_END_FEATURE]
gcode =
[gcode_macro ECHO_T_VARS]
description = Echo Toolhead variables to the console.
gcode =
{% set t = params.T|default(0) %}
RATOS_ECHO MSG="T{t} Variables"
{% for var, value in printer["gcode_macro T%s" % t].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro ECHO_RATOS_VARS]
description = Echo RatOS variables to the console.
gcode =
{% for var, value in printer["gcode_macro RatOS"].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[delayed_gcode RATOS_INIT]
initial_duration = 0.1
gcode =
_LED_STANDBY
CALCULATE_PRINTABLE_AREA
INITIAL_FRONTEND_UPDATE
_CHAMBER_FILTER_SANITY_CHECK
[delayed_gcode RATOS_LOGO]
initial_duration = 2
gcode =
HELLO_RATOS
[gcode_macro INITIAL_FRONTEND_UPDATE]
gcode =
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_error = printer["gcode_macro RatOS"].status_color_error|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_unknown}"'
{% endif %}
{% set t0_sensor = "undefined" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].filament_detected|lower == "true" %}
{% set t0_sensor = "detected" %}
{% else %}
{% set t0_sensor = "empty" %}
{% endif %}
{% else %}
{% set t0_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set t1_sensor = "undefined" %}
{% if printer["dual_carriage"] is defined and printer["filament_switch_sensor toolhead_filament_sensor_t1"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].filament_detected|lower == "true" %}
{% set t1_sensor = "detected" %}
{% else %}
{% set t1_sensor = "empty" %}
{% endif %}
{% else %}
{% set t1_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set svv = printer.save_variables.variables %}
{% if svv.t0_filament is defined and printer["gcode_macro T0"] is defined %}
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
{% if t0_sensor != "empty" %}
{% set t0_filament_type = svv.t0_filament[0]|default('')|string %}
{% set t0_filament_name = svv.t0_filament[1]|default('')|string %}
{% set t0_filament_temp = svv.t0_filament[2]|default(0)|float %}
{% if t0_filament_name != '' and t0_filament_type != '' and t0_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{t0_filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{t0_filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={t0_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
{% if svv.t1_filament is defined and printer["gcode_macro T1"] is defined %}
{% if printer["gcode_macro T1"].filament_name is defined and printer["gcode_macro T1"].filament_type is defined and printer["gcode_macro T1"].filament_temp is defined %}
{% if t1_sensor != "empty" %}
{% set t1_filament_type = svv.t1_filament[0]|default('')|string %}
{% set t1_filament_name = svv.t1_filament[1]|default('')|string %}
{% set t1_filament_temp = svv.t1_filament[2]|default(0)|float %}
{% if t1_filament_name != '' and t1_filament_type != '' and t1_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='"{t1_filament_name}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='"{t1_filament_type}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE={t1_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t1_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro CALCULATE_PRINTABLE_AREA]
gcode =
{% set bed_margin_x = printer["gcode_macro RatOS"].bed_margin_x %}
{% set bed_margin_y = printer["gcode_macro RatOS"].bed_margin_y %}
{% set tool = 0 if printer["gcode_macro T0"] is not defined or printer["gcode_macro T0"].active else 1 %}
{% set max_x = printer.toolhead.axis_maximum.x if printer["dual_carriage"] is defined and tool == 0 else printer.toolhead.axis_maximum.x - bed_margin_x[1] %}
{% if printer["dual_carriage"] is defined %}
{% set max_x = printer.toolhead.axis_maximum.x %}
{% endif %}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="printer.toolhead.axis_maximum.x {printer.toolhead.axis_maximum.x}"
{% set max_y = printer.toolhead.axis_maximum.y - bed_margin_y[1]%}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_x_max VALUE={max_x}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_y_max VALUE={max_y}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="Printable area calculated: X: 0,{max_x} Y: 0,{max_y}"
[gcode_macro CACHE_TOOLHEAD_SETTINGS]
variable_cache = {"global": {"accel": 1000, "ratio": 0.5, "speed": 50, "scv": 5}}
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set dummy = cache.__setitem__(key, {"accel": printer.toolhead.max_accel, "ratio": printer.toolhead.minimum_cruise_ratio, "speed": printer.toolhead.max_velocity, "scv": printer.toolhead.square_corner_velocity}) %}
SET_GCODE_VARIABLE MACRO=CACHE_TOOLHEAD_SETTINGS VARIABLE=cache VALUE="{cache | pprint | replace("\n", "") | replace("\"", "\\\"")}"
DEBUG_ECHO PREFIX="CACHE_TOOLHEAD_SETTINGS" MSG="Toolhead settings cached for {key}. {printer.toolhead.max_accel} accel, {printer.toolhead.minimum_cruise_ratio} ratio, {printer.toolhead.max_velocity} velocity, {printer.toolhead.square_corner_velocity} scv."
[gcode_macro RESTORE_TOOLHEAD_SETTINGS]
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set values = printer["gcode_macro CACHE_TOOLHEAD_SETTINGS"].cache.__getitem__(key) %}
{% if values is not defined or values == 'None' %}
{ action_raise_error("RESTORE_TOOLHEAD_SETTINGS: Toolhead settings not cached for key '" ~ key ~ "'.") }
{% endif %}
SET_VELOCITY_LIMIT ACCEL={values.accel} MINIMUM_CRUISE_RATIO={values.ratio} VELOCITY={values.speed} SQUARE_CORNER_VELOCITY={values.scv}
DEBUG_ECHO PREFIX="RESTORE_TOOLHEAD_SETTINGS" MSG="Toolhead settings restored. {values.accel} accel, {values.ratio} ratio, {values.speed} velocity, {values.scv} scv."
[gcode_macro SET_MACRO_TRAVEL_SETTINGS]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set accel = printer["gcode_macro RatOS"].macro_travel_accel %}
SET_VELOCITY_LIMIT ACCEL={accel} MINIMUM_CRUISE_RATIO=0.5 VELOCITY={speed} SQUARE_CORNER_VELOCITY={5}
DEBUG_ECHO PREFIX="SET_MACRO_TRAVEL_SETTINGS" MSG="Macro travel settings set. {accel} accel, {speed} velocity"
[gcode_macro SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% if printer["dual_carriage"] is not defined %}
SET_KINEMATIC_POSITION X={printable_x_max / 2} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
{% else %}
IDEX_SET_CENTER_KINEMATIC_POSITION
{% endif %}
[gcode_macro IDEX_SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set center_x = printable_x_max / 2 %}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x - (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x + (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
[gcode_macro VERIFY_HYBRID_INVERTED]
gcode =
{% set inverted = False %}
{% if printer.configfile.settings.ratos_hybrid_corexy is defined and printer.configfile.settings.ratos_hybrid_corexy.inverted is defined %}
{% if printer.configfile.settings.ratos_hybrid_corexy.inverted|lower == 'true' %}
{% set inverted = True %}
{% endif %}
{% endif %}
{% if inverted == False %}
{ action_emergency_stop("ratos_hybrid_corexy NOT INVERTED! Inverted hybrid core-xy bugfix not detected.") }
{% endif %}
[gcode_macro RATOS_ECHO]
gcode =
{% set prefix = "RatOS" %}
{% set debug = params.DEBUG|default(0)|int %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " | " ~ params.PREFIX %}
{% endif %}
{% set prefix = prefix ~ ":" %}
{% set msg = "" %}
{% if params.MSG is defined %}
{% set msg = params.MSG %}
{% else %}
{% set msg = "No msg parameter provided (this is a bug or unintended use)." %}
{% endif %}
{% if not debug %}
M117 {prefix} {msg}
{% endif %}
RATOS_LOG PREFIX="{prefix}" MSG="{msg}"
{% if not debug %}
RESPOND PREFIX="{prefix}" MSG="{msg}"
{% else %}
CONSOLE_ECHO TITLE="{prefix}" TYPE="debug" MSG="{msg}"
{% endif %}
[gcode_macro ENABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=True
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=prefix_filter VALUE="'{params.FILTER|default('')|lower}'"
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging enabled."
[gcode_macro DISABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=False
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging disabled."
[gcode_macro DEBUG_ECHO]
variable_enabled = False
variable_prefix_filter = ''
gcode =
{% set prefix = "DEBUG" %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " - " ~ params.PREFIX %}
{% endif %}
{% if enabled and (prefix_filter|lower == '' or prefix_filter|lower in params.PREFIX|lower) %}
RATOS_ECHO PREFIX="{prefix}" MSG="{params.MSG}" DEBUG=1
{% endif %}
[gcode_macro START_FEATURE]
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="Start {params.FEATURE} feature gcode"
{% set scv = printer.toolhead.square_corner_velocity|int|default(5) %}
{% set accel = printer.toolhead.max_accel|int|default(10000) %}
{% set ratio = printer.toolhead.minimum_cruise_ratio|float|default(0.5) %}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="scv" VALUE={scv}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="accel" VALUE={accel}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="ratio" VALUE={ratio}
_USER_START_FEATURE FEATURE="{params.FEATURE}"
[gcode_macro END_FEATURE]
variable_scv = 5
variable_accel = 10000
variable_ratio = 0.5
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="End {params.FEATURE} feature gcode"
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={scv} ACCEL={accel} MINIMUM_CRUISE_RATIO={ratio}
_USER_END_FEATURE FEATURE="{params.FEATURE}" SCV={scv} ACCEL={accel} RATIO={ratio}
[gcode_macro _ON_LAYER_CHANGE]
variable_layer_number = 0
description = INTERNAL USE ONLY. Call it from the slicers after layer change custom gcode
gcode =
{% set layer = params.LAYER|int %}
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE={layer}
SET_PRINT_STATS_INFO CURRENT_LAYER={layer}
[gcode_macro _LEARN_MORE_CALIBRATION]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/calibration" %}
{% set link_text = "RatOS Calibration Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_CHAMBER_FILTER]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter Control" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_FILAMENT]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/filaments" %}
{% set link_text = "RatOS Filament Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _CONSOLE_SAVE_CONFIG]
gcode =
M118 Click SAVE_CONFIG to save the settings to your printer.cfg.
[gcode_macro SAVE_Z_OFFSET]
gcode =
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SAVE_MULTIPLIER
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _LOAD_RATOS_SKEW_PROFILE]
gcode =
{% set ratos_skew_profile = printer["gcode_macro RatOS"].skew_profile|default("") %}
{% if ratos_skew_profile != "" %}
{% if printer.configfile.config["skew_correction %s" % ratos_skew_profile] is defined %}
SKEW_PROFILE LOAD={ratos_skew_profile}
GET_CURRENT_SKEW
{% else %}
{% set line_1 = '"Could not find skew profile %s!_N_Clearing skew correction."' % ratos_skew_profile %}
CONSOLE_ECHO TITLE="Missing skew profile!" TYPE="warning" MSG={line_1}
SET_SKEW CLEAR=1
{% endif %}
{% endif %}
[gcode_macro M601]
gcode =
PAUSE
[gcode_macro PAUSE]
description = Pauses the print
rename_existing = PAUSE_BASE
variable_extrude = 1.5
variable_retract = 1.5
variable_fan_speed = 0
variable_idex_mode = ""
variable_idex_toolhead = 0
variable_idex_toolhead_x = 0.0
variable_idex_toolhead_y = 0.0
variable_idex_toolhead_z = 0.0
gcode =
{% set runout_detected = true if params.RUNOUT|default(false)|lower == 'true' else false %}
_LED_PAUSE
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set idex_toolhead = 1 if idex_mode == 'primary' else 0 %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
SAVE_GCODE_STATE NAME=PAUSE_state
{% else %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_mode VALUE='"{idex_mode}"'
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead VALUE={idex_toolhead}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_x VALUE={printer.gcode_move.gcode_position.x|float}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_y VALUE={printer.gcode_move.gcode_position.y|float}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_z VALUE={printer.gcode_move.gcode_position.z|float}
DEBUG_ECHO PREFIX="PAUSE" MSG="idex_mode: {idex_mode}, idex_toolhead: {idex_toolhead}, idex_toolhead_x: {idex_toolhead_x}, idex_toolhead_y: {idex_toolhead_y}, idex_toolhead_z: {idex_toolhead_z}"
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
CACHE_TOOLHEAD_SETTINGS KEY="pause"
SET_MACRO_TRAVEL_SETTINGS
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set current_z = printer.toolhead.position.z|float %}
{% if current_z < (max_z - 20.0) %}
{% set z_safe = 20.0 %}
{% else %}
{% set z_safe = max_z - current_z %}
{% endif %}
PAUSE_BASE
{% if printer["dual_carriage"] is not defined %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan"].speed|float}
{% else %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t0"].speed|float}
{% else %}
{% if idex_toolhead == 0 %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t0"].speed|float}
{% else %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t1"].speed|float}
{% endif %}
{% endif %}
{% endif %}
M106 S0
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' else false %}
{% if idex_mode != '' %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' and printer['extruder1'].can_extrude|lower == 'true' else false %}
{% else %}
{% if printer.toolhead.extruder == 'extruder1' %}
{% set can_extrude = true if printer['extruder1'].can_extrude|lower == 'true' else false %}
{% endif %}
{% endif %}
{% endif %}
{% set R = printer["gcode_macro PAUSE"].retract|float %}
{% if can_extrude %}
G91
G1 E-{R} F2100
G90
{% else %}
{action_respond_info("Extruder not hot enough")}
{% endif %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set pause_print_park_x = printer["gcode_macro RatOS"].pause_print_park_x %}
{% set pause_print_park_in = printer["gcode_macro RatOS"].pause_print_park_in %}
{% if runout_detected %}
{% set pause_print_park_x = printer["gcode_macro RatOS"].runout_park_x %}
{% set pause_print_park_in = printer["gcode_macro RatOS"].runout_park_in %}
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
DEBUG_ECHO PREFIX="PAUSE" MSG="z_speed: {z_speed}, pause_print_park_x: {pause_print_park_x}, pause_print_park_in: {pause_print_park_in}, default_toolhead: {default_toolhead}"
{% if "xyz" in printer.toolhead.homed_axes %}
G91
G1 Z{z_safe} F{z_speed}
G90
{% if printer["dual_carriage"] is not defined %}
_PARK LOCATION={pause_print_park_in} X={pause_print_park_x}
{% else %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
_IDEX_SINGLE X={parking_position}
{% else %}
PARK_TOOLHEAD
{% endif %}
_PARK LOCATION={pause_print_park_in} X={pause_print_park_x}
{% endif %}
{% else %}
{action_respond_info("Printer not homed")}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="pause"
[gcode_macro RESUME]
description = Resumes the print if the printer is paused.
rename_existing = RESUME_BASE
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set target_idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set target_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% endif %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' else false %}
{% if target_idex_mode != '' %}
{% if target_idex_mode == 'copy' or target_idex_mode == 'mirror' %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' and printer['extruder1'].can_extrude|lower == 'true' else false %}
{% else %}
{% if printer.toolhead.extruder == 'extruder1' %}
{% set can_extrude = true if printer['extruder1'].can_extrude|lower == 'true' else false %}
{% endif %}
{% endif %}
{% endif %}
{% set fan_speed = printer["gcode_macro PAUSE"].fan_speed|float %}
{% if printer["dual_carriage"] is not defined %}
M106 S{(fan_speed * 255)}
{% else %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% else %}
{% if params.TOOLHEAD is defined %}
{% if params.TOOLHEAD == 0 %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
{% else %}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% endif %}
{% else %}
{% if printer["gcode_macro PAUSE"].idex_toolhead == 0 %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
{% else %}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% endif %}
{% endif %}
{% endif %}
M106.1 S{fan_speed}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if target_idex_mode == "copy" %}
_IDEX_COPY DANCE=0
{% elif target_idex_mode == "mirror" %}
_IDEX_MIRROR DANCE=0
{% else %}
{% if params.TOOLHEAD is defined %}
_SELECT_TOOL T={params.TOOLHEAD} X=-1 Y=-1 TOOLSHIFT=false
{% else %}
_SELECT_TOOL T={printer["gcode_macro PAUSE"].idex_toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% endif %}
{% set x = printer["gcode_macro PAUSE"].idex_toolhead_x|float %}
{% set y = printer["gcode_macro PAUSE"].idex_toolhead_y|float %}
{% set z = printer["gcode_macro PAUSE"].idex_toolhead_z|float %}
G1 X{x} Y{y} Z{z} F{speed}
{% if params.TOOLHEAD is defined %}
SAVE_GCODE_STATE NAME=PAUSE_STATE
{% endif %}
{% endif %}
{% if params.TOOLHEAD is not defined %}
{% set E = printer["gcode_macro PAUSE"].extrude|float %}
{% if can_extrude %}
G91
G1 E{E} F2100
G90
{% else %}
{action_respond_info("Extruder not hot enough")}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 MOVE_SPEED={speed}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=True
RESUME_BASE
_LED_PRINTING
[gcode_macro CANCEL_PRINT]
description = Cancels the printer
rename_existing = CANCEL_PRINT_BASE
gcode =
END_PRINT
TURN_OFF_HEATERS
CLEAR_PAUSE
CANCEL_PRINT_BASE
[gcode_macro START_PRINT]
description = Start print procedure, use this in your Slicer.
variable_post_processor_version = 2
variable_is_printing_gcode = False
variable_both_toolheads = True
variable_object_xoffset = 0
variable_first_x = -1
variable_first_y = -1
variable_total_toolshifts = 0
variable_initial_tool = 0
variable_extruder_first_layer_temp = ""
variable_extruder_other_layer_temp = ""
gcode =
{% if "xyz" in printer.toolhead.homed_axes and printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% if printer["gcode_macro _VAOC"].is_started|default(true)|lower == 'true' %}
_VAOC_END
{% endif %}
{% endif %}
_LED_START_PRINTING
CACHE_TOOLHEAD_SETTINGS KEY="start_print"
_USER_START_PRINT { rawparams }
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% set hotend_heat_soak_time = printer["gcode_macro RatOS"].hotend_heat_soak_time|default(0)|int %}
{% set z_probe_stowable = printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set X0 = params.X0|default(-1)|float %}
{% set X1 = params.X1|default(-1)|float %}
{% set Y0 = params.Y0|default(-1)|float %}
{% set Y1 = params.Y1|default(-1)|float %}
{% if first_x == -1 or first_y == -1 %}
{% set first_x = params.FIRST_X|default(-1)|float %}
{% set first_y = params.FIRST_Y|default(-1)|float %}
{% endif %}
{% set total_toolshifts = params.TOTAL_TOOLSHIFTS|default(0)|int %}
{% set initial_tool = params.INITIAL_TOOL|default(default_toolhead)|int %}
{% set start_chamber_temp = params.START_CHAMBER_TEMP|default(0)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set bed_temp = params.BED_TEMP|default(printer.heater_bed.target, true)|float %}
{% set total_layer_count = params.TOTAL_LAYER_COUNT|default(0)|int %}
{% set extruder_first_layer_temp = (params.EXTRUDER_TEMP|default("")).split(",") %}
RATOS_ECHO MSG="First print coordinates X:{first_x} Y:{first_y}"
{% if params.TOTAL_LAYER_COUNT is not defined %}
{% set link_url = "https://os.ratrig.com/docs/slicers" %}
{% set link_text = "RatOS Slicer Configuration" %}
{% set line_1 = '"Your slicer gcode settings are not up to date._N_Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="Incomplete Slicer Configuration detected" TYPE="warning" MSG={line_1}
{% endif %}
SET_PRINT_STATS_INFO CURRENT_LAYER=1
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE=1
{% if total_layer_count > 0 %}
SET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set swap_toolheads = true if printer["gcode_macro _IDEX_REMAP_TOOLHEADS"].enabled|default(false)|lower == 'true' else false %}
{% if swap_toolheads %}
{% set initial_tool = 0 if initial_tool == 1 else 1 %}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=active VALUE=True
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=active VALUE=True
{% endif %}
{% set both_toolheads = true %}
{% if total_toolshifts == 0 %}
{% set both_toolheads = false %}
{% endif %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
_IDEX_SINGLE X={parking_position}
{% endif %}
{% if both_toolheads and (idex_mode == "copy" or idex_mode == "mirror") %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Gcode tool changes found. Copy and mirror mode do not support toolchanges.")}
{% endif %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set both_toolheads = true %}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=initial_tool VALUE={initial_tool}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=first_x VALUE={first_x}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=first_y VALUE={first_y}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=total_toolshifts VALUE={total_toolshifts}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=both_toolheads VALUE={both_toolheads}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_first_layer_temp VALUE="'{params.EXTRUDER_TEMP}'"
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_other_layer_temp VALUE="'{params.EXTRUDER_OTHER_LAYER_TEMP}'"
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=_TOOLCHANGE VARIABLE=toolshift_count VALUE=0
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set svv = printer.save_variables.variables %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set parking_position_t0 = printer["gcode_macro T0"].parking_position|float %}
{% set parking_position_t1 = printer["gcode_macro T1"].parking_position|float %}
{% set stepper_x_position_min = printer.configfile.settings.stepper_x.position_min|float %}
{% set stepper_x_position_endstop = printer.configfile.settings.stepper_x.position_endstop|float %}
{% set dual_carriage_position_max = printer.configfile.settings.dual_carriage.position_max|float %}
{% set dual_carriage_position_endstop = printer.configfile.settings.dual_carriage.position_endstop|float %}
{% set x_parking_space = parking_position_t0 - (stepper_x_position_endstop , stepper_x_position_min)|max %}
{% set dc_parking_space = (dual_carriage_position_endstop , dual_carriage_position_max)|min - parking_position_t1 %}
{% if svv.idex_xoffset|abs >= (x_parking_space - 0.5) or svv.idex_xoffset|abs >= (dc_parking_space - 0.5) %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Toolhead x-offset is too high for the available parking space. Calibrate your X and DC endstop positions and make sure you stay below 1mm." % (copy_mode_max_width)) }
{% endif %}
{% endif %}
{% if (idex_mode == "copy" or idex_mode == "mirror") and printer.configfile.settings.ratos.enable_gcode_transform %}
{% if params.MIN_X is not defined or params.MAX_X is not defined %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Something went wrong! Missing important post processor start print parameter!") }
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=object_xoffset VALUE=0
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set boundary_box_min_x = params.MIN_X|default(0)|float %}
{% set boundary_box_max_x = params.MAX_X|default(printable_x_max)|float %}
{% set svv = printer.save_variables.variables %}
{% if default_toolhead == 0 %}
{% set boundary_box_max_x = boundary_box_max_x + svv.idex_xoffset %}
{% else %}
{% set boundary_box_min_x = boundary_box_min_x - svv.idex_xoffset %}
{% endif %}
{% set center_x = printable_x_max / 2.0 %}
{% set safe_distance = printer.configfile.settings.dual_carriage.safe_distance|float %}
{% set object_width = boundary_box_max_x - boundary_box_min_x %}
{% set copy_mode_max_width = center_x %}
{% set mirror_mode_max_width = center_x - safe_distance / 2.0 %}
DEBUG_ECHO PREFIX="START_PRINT" MSG="OBJECT_WIDTH: {object_width} BOUNDARY_BOX_MIN_X: {boundary_box_min_x} BOUNDARY_BOX_MAX_X: {boundary_box_max_x} CENTER_X: {center_x} SAFE_DISTANCE: {safe_distance}"
{% if idex_mode == "copy" and object_width > copy_mode_max_width %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Object is too big for copy mode! Max supported width is %s mm" % (copy_mode_max_width)) }
{% endif %}
{% if idex_mode == "mirror" and object_width > mirror_mode_max_width %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Object is too big for mirror mode! Max supported width is %s mm" % (mirror_mode_max_width)) }
{% endif %}
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
{% set object_xoffset = (printable_x_max - boundary_box_max_x - boundary_box_min_x) / 2 %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=object_xoffset VALUE={object_xoffset}
{% endif %}
{% endif %}
{% set has_initial_toolhead_filament_sensor = true if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool] is defined else false %}
{% if has_initial_toolhead_filament_sensor %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s filament sensor is empty." % (initial_tool)) }
{% endif %}
{% endif %}
{% endif %}
{% set has_initial_bowden_filament_sensor = true if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool] is defined else false %}
{% if has_initial_bowden_filament_sensor %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool].enabled|lower == "true" %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s bowden sensor is empty." % (initial_tool)) }
{% endif %}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined and both_toolheads %}
{% set has_secondary_toolhead_filament_sensor = true if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)] is defined else false %}
{% if has_secondary_toolhead_filament_sensor %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s filament sensor is empty." % (1 if initial_tool == 0 else 0)) }
{% endif %}
{% endif %}
{% endif %}
{% set has_secondary_bowden_filament_sensor = true if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)] is defined else false %}
{% if has_secondary_bowden_filament_sensor %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].enabled|lower == "true" %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s bowden sensor is empty." % (1 if initial_tool == 0 else 0)) }
{% endif %}
{% endif %}
{% endif %}
{% endif %}
_CHAMBER_FILTER_ON AT="before_print_start"
{% if printer["dual_carriage"] is defined %}
{% if printer["gcode_macro _IDEX_JOIN_SPOOLS"].enabled|default(false)|lower == 'true' %}
{% if both_toolheads %}
RATOS_ECHO MSG="Spool join is not possible if both toolheads are in use!"
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% endif %}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if idex_mode == '' %}
_SET_TOOLHEAD_OFFSET T={default_toolhead} MOVE={1 if "xyz" in printer.toolhead.homed_axes else 0}
{% endif %}
{% endif %}
CLEAR_PAUSE
{% if printer["gcode_macro RatOS"].force_absolute_position|lower == 'true' %}
G90
{% endif %}
SAVE_GCODE_STATE NAME=start_print_state
G21
G90
M82
_USER_START_PRINT_BEFORE_HOMING { rawparams }
{% if z_probe_stowable == true %}
STOWABLE_PROBE_BEGIN_BATCH
{% endif %}
MAYBE_HOME
_Z_HOP
{% if idex_mode != '' and not (printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
PARK_TOOLHEAD
{% endif %}
{% if chamber_temp > 0 %}
{% if printer["fan_generic filter"] is defined %}
{% if printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float > 0 %}
SET_FAN_SPEED FAN=filter SPEED={printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float}
{% endif %}
{% endif %}
_CHAMBER_HEATER_ON START_CHAMBER_TEMP={start_chamber_temp} CHAMBER_TEMP={chamber_temp}
_USER_START_PRINT_HEAT_CHAMBER { rawparams } CHAMBER_TEMP={chamber_temp}
{% endif %}
_START_PRINT_BEFORE_HEATING_BED T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
RATOS_ECHO MSG="Heating bed..."
M190 S{bed_temp}
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
_USER_START_PRINT_AFTER_HEATING_BED { rawparams }
_START_PRINT_AFTER_HEATING_BED T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
_USER_START_PRINT_BED_MESH { rawparams } X0={X0} X1={X1} Y0={Y0} Y1={Y1}
_START_PRINT_BED_MESH X0={X0} X1={X1} Y0={Y0} Y1={Y1} T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
{% if z_probe_stowable == true %}
STOWABLE_PROBE_END_BATCH
{% endif %}
{% if idex_mode == '' %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={extruder_first_layer_temp[0]|float}
{% else %}
{% if initial_tool == 0 or both_toolheads or (default_toolhead == 0 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={extruder_first_layer_temp[0]|float}
{% endif %}
{% if initial_tool == 1 or both_toolheads or (default_toolhead == 1 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
SET_HEATER_TEMPERATURE HEATER="extruder1" TARGET={extruder_first_layer_temp[1]|float}
{% endif %}
{% endif %}
_USER_START_PRINT_PARK { rawparams }
_START_PRINT_PARK
RATOS_ECHO MSG="Heating Extruder..."
{% if idex_mode == '' %}
TEMPERATURE_WAIT SENSOR="extruder" MINIMUM={extruder_first_layer_temp[0]|float} MAXIMUM={extruder_first_layer_temp[0]|float + 5}
{% else %}
{% if initial_tool == 0 or both_toolheads or (default_toolhead == 0 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
TEMPERATURE_WAIT SENSOR="extruder" MINIMUM={extruder_first_layer_temp[0]|float} MAXIMUM={extruder_first_layer_temp[0]|float + 5}
{% endif %}
{% if initial_tool == 1 or both_toolheads or (default_toolhead == 1 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
TEMPERATURE_WAIT SENSOR="extruder1" MINIMUM={extruder_first_layer_temp[1]|float} MAXIMUM={extruder_first_layer_temp[1]|float + 5}
{% endif %}
{% endif %}
{% if hotend_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking hotend for {hotend_heat_soak_time} seconds..."
G4 P{(hotend_heat_soak_time * 1000)}
{% endif %}
{% if idex_mode == '' %}
_LED_PRINTING
{% else %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
_LED_PRINTING
{% else %}
{% if both_toolheads %}
_LED_PRINTING TOOLHEAD={initial_tool}
{% if toolchange_standby_temp > -1 %}
_LED_TOOLHEAD_STANDBY TOOLHEAD={0 if initial_tool == 1 else 1}
{% else %}
_LED_PRINTING TOOLHEAD={0 if initial_tool == 1 else 1}
{% endif %}
{% else %}
_LED_PRINTING TOOLHEAD={initial_tool}
_LED_DEACTIVATE_TOOLHEAD TOOLHEAD={0 if initial_tool == 1 else 1}
{% endif %}
{% endif %}
{% endif %}
_USER_START_PRINT_AFTER_HEATING_EXTRUDER { rawparams } X0={X0} X1={X1} Y0={Y0} Y1={Y1}
_START_PRINT_AFTER_HEATING_EXTRUDER X0={X0} X1={X1} Y0={Y0} Y1={Y1} INITIAL_TOOLHEAD={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
{% if idex_mode != '' %}
{% if not both_toolheads %}
{% if initial_tool != default_toolhead %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
{% endif %}
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
{% if toolchange_standby_temp > -1 %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if initial_tool == 1 else 'extruder1'} TARGET={toolchange_standby_temp}
{% endif %}
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% set x_offset = printer.toolhead.position.x|float - printer.gcode_move.gcode_position.x|float %}
{% endif %}
RESTORE_GCODE_STATE NAME=start_print_state
{% if idex_mode != '' %}
{% set act_idex_mode = printer["dual_carriage"].carriage_1|default('')|lower %}
{% if act_idex_mode == "copy" or act_idex_mode == "mirror" %}
SET_GCODE_OFFSET X={x_offset} MOVE=0
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% if idex_mode == "copy" and idex_mode != act_idex_mode %}
_IDEX_COPY DANCE=0
{% elif idex_mode == "mirror" and idex_mode != act_idex_mode %}
_IDEX_MIRROR DANCE=0
{% endif %}
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
RATOS_ECHO MSG="Adjusting object x-offset by {(object_xoffset)} mm"
SET_GCODE_OFFSET X_ADJUST={object_xoffset} MOVE=0
{% endif %}
{% else %}
_SELECT_TOOL T={initial_tool} TOOLSHIFT=false
{% if initial_tool != default_toolhead %}
{% set svv = printer.save_variables.variables %}
SAVE_VARIABLE VARIABLE=idex_applied_offset VALUE={default_toolhead}
_SET_TOOLHEAD_OFFSET T={initial_tool} MOVE=0
{% endif %}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
_BEACON_SET_NOZZLE_TEMP_OFFSET TOOLHEAD={initial_tool}
{% endif %}
_SET_EXTRUSION_MODE
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=True
{% if printer["gcode_macro _SELECT_TOOL"] is defined %}
SET_GCODE_VARIABLE MACRO=_SELECT_TOOL VARIABLE=last_timestamp VALUE={printer["print_stats"].print_duration}
{% endif %}
_USER_END_START_PRINT { rawparams }
G92 E0
_CHAMBER_FILTER_ON AT="after_print_start"
RATOS_ECHO MSG="Printing..."
[gcode_macro _START_PRINT_BEFORE_HEATING_BED]
gcode =
{% set target_idex_mode = params.IDEX_MODE|default("")|lower %}
{% set initial_toolhead = params.T|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %}
{% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% set act_t = 1 if idex_mode == 'primary' else 0 %}
{% set auto_z_offset_calibration = False %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% set is_fixed = true if printer["gcode_macro _VAOC"].is_fixed|default(true)|lower == 'true' else false %}
{% if printer["gcode_macro _VAOC"].auto_z_offset_calibration|default("false")|lower == 'true' and is_fixed %}
{% if target_idex_mode != "copy" and target_idex_mode != "mirror" %}
{% if both_toolheads or initial_toolhead != default_toolhead %}
{% set auto_z_offset_calibration = True %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set is_stowable_probe = true if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' else false %}
{% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %}
RATOS_ECHO MSG="Pre-heating extruder..."
{% if printer["dual_carriage"] is defined %}
{% if auto_z_offset_calibration %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={min_temp}
SET_HEATER_TEMPERATURE HEATER="extruder1" TARGET={min_temp}
{% else %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET={min_temp}
{% endif %}
{% else %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={min_temp}
{% endif %}
{% endif %}
{% if not is_stowable_probe %}
{% if printer["dual_carriage"] is defined and act_t != default_toolhead %}
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=True
{% endif %}
RATOS_ECHO MSG="Heat soaking z probe..."
{% if auto_z_offset_calibration %}
{% set safe_distance = printer.configfile.settings.dual_carriage.safe_distance|float %}
{% if default_toolhead == 0 %}
_SELECT_TOOL T=0 TOOLSHIFT=false
G1 X{safe_home_x - safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
G1 X{safe_home_x + safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
{% elif default_toolhead == 1 %}
_SELECT_TOOL T=1 TOOLSHIFT=false
G1 X{safe_home_x + safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
G1 X{safe_home_x - safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
{% endif %}
{% else %}
_MOVE_TO_SAFE_Z_HOME
{% endif %}
G0 Z2 F{z_speed}
{% endif %}
[gcode_macro _START_PRINT_AFTER_HEATING_BED]
gcode =
{% set target_idex_mode = params.IDEX_MODE|default("")|lower %}
{% set initial_toolhead = params.T|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %}
{% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set auto_z_offset_calibration = False %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% set is_fixed = true if printer["gcode_macro _VAOC"].is_fixed|default(true)|lower == 'true' else false %}
{% if printer["gcode_macro _VAOC"].auto_z_offset_calibration|default("false")|lower == 'true' and is_fixed %}
{% if target_idex_mode != "copy" and target_idex_mode != "mirror" %}
{% if both_toolheads or initial_toolhead != default_toolhead %}
{% set auto_z_offset_calibration = True %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_wipe_before_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_wipe_before_true_zero|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %}
RATOS_ECHO MSG="Waiting for extruder to be preheated..."
{% if printer["dual_carriage"] is defined %}
{% if auto_z_offset_calibration %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
TEMPERATURE_WAIT SENSOR=extruder1 MINIMUM={min_temp} MAXIMUM={max_temp}
{% else %}
{% if default_toolhead == 0 %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
{% else %}
TEMPERATURE_WAIT SENSOR=extruder1 MINIMUM={min_temp} MAXIMUM={max_temp}
{% endif %}
{% endif %}
{% else %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_Z_HOP
{% endif %}
{% if auto_z_offset_calibration %}
{% set parking_position_t0 = printer["gcode_macro T0"].parking_position|float %}
{% set parking_position_t1 = printer["gcode_macro T1"].parking_position|float %}
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=True
PARK_TOOLHEAD
_CLEANING_MOVE TOOLHEAD={default_toolhead}
_SELECT_TOOL T={0 if default_toolhead == 1 else 1} X={parking_position_t0 if default_toolhead == 1 else parking_position_t1} Y=0 TOOLSHIFT=false
_CLEANING_MOVE TOOLHEAD={0 if default_toolhead == 1 else 1}
_VAOC_CALIBRATE_Z_OFFSET AUTO_Z_OFFSET=True
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=false
{% endif %}
{% set needs_rehoming = False %}
{% if printer.z_tilt is defined and not printer.z_tilt.applied %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% set needs_rehoming = True %}
{% endif %}
{% if printer.quad_gantry_level is defined and not printer.quad_gantry_level.applied %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% set needs_rehoming = True %}
{% endif %}
{% if needs_rehoming %}
G28 Z
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero %}
{% if beacon_contact_wipe_before_true_zero %}
_START_PRINT_AFTER_HEATING_BED_PROBE_FOR_WIPE
{% endif %}
_START_PRINT_AFTER_HEATING_CONTACT_WITH_OPTIONAL_WIPE
{% endif %}
[gcode_macro _START_PRINT_AFTER_HEATING_BED_PROBE_FOR_WIPE]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
G0 Z5 F{z_speed}
G0 X50 Y10 F{speed}
PROBE PROBE_METHOD=contact SAMPLES=1
BEACON_QUERY
[gcode_macro _START_PRINT_AFTER_HEATING_CONTACT_WITH_OPTIONAL_WIPE]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_true_zero_location = printer["gcode_macro RatOS"].beacon_contact_true_zero_location|default("front")|lower %}
{% set beacon_contact_true_zero_margin_x = printer["gcode_macro RatOS"].beacon_contact_true_zero_margin_x|default(30)|int %}
{% set beacon_contact_wipe_before_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_wipe_before_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_wipe_before_true_zero %}
{% if printer.beacon.last_probe_result|lower == "ok" %}
{% set last_z_offset = printer.beacon.last_z_result %}
RATOS_ECHO MSG="Auto calibration nozzle wipe with probe result {last_z_offset}..."
G0 Z{(0.2 + last_z_offset)} F{z_speed}
G0 X70 F300
{% else %}
RATOS_ECHO MSG="Skipping auto calibration nozzle wipe because probing failed!"
{% endif %}
{% endif %}
G0 Z5 F{z_speed}
_MOVE_TO_SAFE_Z_HOME
RATOS_ECHO MSG="Heating extruder to probing temperature..."
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET={beacon_contact_true_zero_temp}
TEMPERATURE_WAIT SENSOR={"extruder" if default_toolhead == 0 else "extruder1"} MINIMUM={beacon_contact_true_zero_temp} MAXIMUM={beacon_contact_true_zero_temp + 5}
RATOS_ECHO MSG="Beacon contact auto calibration..."
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
G0 Z5 F{z_speed}
[gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER]
gcode =
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set first_x = printer["gcode_macro START_PRINT"].first_x|default(-1)|float %}
{% set first_y = printer["gcode_macro START_PRINT"].first_y|default(-1)|float %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set center_x = printable_x_max / 2.0 %}
{% set center_y = printable_y_max / 2.0 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% if printer["dual_carriage"] is defined %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
{% endif %}
{% set X0 = params.X0|default(-1)|int %}
{% set X1 = params.X1|default(-1)|int %}
{% set Y0 = params.Y0|default(-1)|int %}
{% set Y1 = params.Y1|default(-1)|int %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set initial_toolhead = params.INITIAL_TOOLHEAD|default(default_toolhead)|int %}
{% if idex_mode == '' %}
_PRIME
{% else %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
RATOS_ECHO PREFIX="IDEX" MSG="using combined prime offset for IDEX {idex_mode} mode"
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% else %}
{% if both_toolheads %}
{% if initial_toolhead == 0 %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T1"
_SELECT_TOOL T=1 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T0"
_SELECT_TOOL T=0 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% else %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T0"
_SELECT_TOOL T=0 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T1"
_SELECT_TOOL T=1 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% endif %}
{% else %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T{initial_toolhead}"
_SELECT_TOOL T={initial_toolhead} TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% endif %}
{% endif %}
{% endif %}
CACHE_TOOLHEAD_SETTINGS KEY="start_print_after_heating_extruder"
SET_MACRO_TRAVEL_SETTINGS
{% if (X0 > -1 and Y1 > -1) or (first_x > 0 and first_y > 0) %}
{% if printer["dual_carriage"] is defined %}
{% set acceleration = printer["gcode_macro RatOS"].toolchange_travel_accel %}
{% set max_accel = printer.toolhead.max_accel|float %}
{% set square_corner_velocity = printer.toolhead.square_corner_velocity|float %}
SET_VELOCITY_LIMIT ACCEL={acceleration} MINIMUM_CRUISE_RATIO=0 SQUARE_CORNER_VELOCITY=20
{% endif %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
G0 Z3 F{z_speed}
{% endif %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro RatOS"].nozzle_priming|lower == 'false' %}
{% set first_z = 1 %}
{% else %}
{% set first_z = 3 %}
{% endif %}
{% if idex_mode == "mirror" %}
{% if first_y >= 0 %}
G0 Y{first_y} F{speed}
{% else %}
G0 Y{Y1} F{speed}
{% endif %}
{% endif %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro RatOS"].nozzle_priming|lower == 'false' %}
_MOVE_TO_LOADING_POSITION TOOLHEAD={initial_toolhead}
_PURGE_FILAMENT TOOLHEAD={initial_toolhead} E={printer["gcode_macro RatOS"].toolchange_first_purge|default(50)|float}
_CLEANING_MOVE TOOLHEAD={initial_toolhead}
{% endif %}
{% if first_x >= 0 and first_y >= 0 %}
G0 X{first_x} Y{first_y} Z{first_z} F{speed}
{% else %}
{% set first_x = X0 %}
{% set first_y = Y0 %}
{% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' or printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %}
{% set first_x = X0 %}
{% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %}
{% set first_x = X1 %}
{% else %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_x|float <= center_x %}
{% set first_x = X0 %}
{% else %}
{% set first_x = X1 %}
{% endif %}
{% endif %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %}
{% set first_y = Y0 %}
{% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %}
{% set first_y = Y1 %}
{% else %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_y|float <= center_y %}
{% set first_y = Y0 %}
{% else %}
{% set first_y = Y1 %}
{% endif %}
{% endif %}
{% endif %}
G0 X{first_x} Y{first_y} Z{first_z} F{speed}
{% endif %}
{% endif %}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print_after_heating_extruder"
_LOAD_RATOS_SKEW_PROFILE
[gcode_macro _PRIME]
gcode =
{% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' or printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %}
PRIME_BLOB INITIAL_TOOLHEAD={params.INITIAL_TOOLHEAD} BOTH_TOOLHEADS={params.BOTH_TOOLHEADS} IDEX_MODE={params.IDEX_MODE} Y1={params.Y1}
{% endif %}
[gcode_macro END_PRINT]
description = End print procedure, use this in your Slicer.
gcode =
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
SAVE_GCODE_STATE NAME=end_print_state
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=_IDEX_REMAP_TOOLHEADS VARIABLE=enabled VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
{% set object_xoffset = printer["gcode_macro START_PRINT"].object_xoffset|default(0)|float %}
RATOS_ECHO MSG="Adjusting object x-offset by {(0-object_xoffset)} mm"
SET_GCODE_OFFSET X_ADJUST={(0-object_xoffset)}
{% endif %}
{% endif %}
_USER_END_PRINT_BEFORE_HEATERS_OFF { rawparams }
_END_PRINT_BEFORE_HEATERS_OFF
TURN_OFF_HEATERS
_USER_END_PRINT_AFTER_HEATERS_OFF { rawparams }
_END_PRINT_AFTER_HEATERS_OFF
_USER_END_PRINT_PARK { rawparams }
_END_PRINT_PARK
{% if printer["gcode_macro RatOS"].skew_profile is defined %}
SET_SKEW CLEAR=1
{% endif %}
{% if printer["dual_carriage"] is not defined and printer["gcode_macro RatOS"].end_print_motors_off|lower != 'false' %}
M84
{% endif %}
M107
BED_MESH_CLEAR
RATOS_ECHO MSG="Done :)"
RESTORE_GCODE_STATE NAME=end_print_state
{% if printer["dual_carriage"] is defined %}
M84
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
{% if printer["dual_carriage"] is not defined %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
SET_GCODE_OFFSET Z=0 MOVE=0
{% endif %}
{% endif %}
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print"
_CHAMBER_FILTER_ON AT="print_end"
_CHAMBER_FILTER_OFF
_CHAMBER_HEATER_OFF
_USER_END_PRINT_FINISHED { rawparams }
[gcode_macro _END_PRINT_BEFORE_HEATERS_OFF]
gcode =
RATOS_ECHO MSG="Cleaning up..."
[gcode_macro _END_PRINT_AFTER_HEATERS_OFF]
gcode =
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set current_z = printer.toolhead.position.z|float %}
{% set z_hop = printer["gcode_macro RatOS"].end_print_park_z_hop|float %}
{% set r = printer["gcode_macro RatOS"].end_print_retract_filament|default(4)|float %}
{% if current_z < (max_z - z_hop) %}
{% set z_safe = z_hop %}
{% else %}
{% set z_safe = max_z - current_z %}
{% endif %}
G91
G1 E-2 F3600
G0 Z{z_safe} F3600
G1 E-{(r-2)} F3600
G90
[gcode_macro _SET_EXTRUSION_MODE]
gcode =
{% if printer["gcode_macro RatOS"].relative_extrusion|lower == 'true' %}
M83
{% else %}
M82
{% endif %}
[gcode_macro GENERATE_SHAPER_GRAPHS]
description = Genarates input shaper resonances graphs for analysis. Uses the AXIS parameter for if you only want to do one axis at a time, (eg. GENERATE_SHAPER_GRAPHS AXIS=X)
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="generate_shaper_graphs"
SET_MACRO_TRAVEL_SETTINGS
CACHE_IS_GRAPH_FILES
_LED_INPUT_SHAPER_START
{% set axis = params.AXIS|default('')|lower %}
{% set freq_start = params.FREQUENCY_START|default(10)|int %}
{% set freq_end = params.FREQUENCY_END|default(133)|int %}
{% set hz_per_sec = params.HZ_PER_SEC|default(1)|float %}
{% if axis != '' %}
{% if axis == 'x' %}
MAYBE_HOME
TEST_RESONANCES AXIS=X FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_x
{% elif axis == 'y' %}
MAYBE_HOME
TEST_RESONANCES AXIS=Y FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_y
{% else %}
{action_raise_error("Unknown axis specified. Expected X or Y.")}
{% endif %}
{% else %}
MAYBE_HOME
TEST_RESONANCES AXIS=X FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
TEST_RESONANCES AXIS=Y FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_x
RUN_SHELL_COMMAND CMD=generate_shaper_graph_y
{% endif %}
_LED_INPUT_SHAPER_END
RESTORE_TOOLHEAD_SETTINGS KEY="generate_shaper_graphs"
_LEARN_MORE_CALIBRATION
SHOW_IS_GRAPH_FILES TITLE="Shaper graph"
[gcode_shell_command generate_shaper_graph_x]
command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-x.sh
timeout = 60.
verbose = True
[gcode_shell_command generate_shaper_graph_y]
command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-y.sh
timeout = 60.
verbose = True
[gcode_macro MEASURE_COREXY_BELT_TENSION]
description = Generates resonance graph used to ensure belts are equally tensioned.
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="measure_corexy_belt_tension"
SET_MACRO_TRAVEL_SETTINGS
CACHE_IS_GRAPH_FILES
_LED_INPUT_SHAPER_START
{% set freq_start = params.FREQUENCY_START|default(10)|int %}
{% set freq_end = params.FREQUENCY_END|default(133)|int %}
{% set hz_per_sec = params.HZ_PER_SEC|default(1)|float %}
MAYBE_HOME
TEST_RESONANCES AXIS=1,1 OUTPUT=raw_data NAME=belt-tension-upper FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
TEST_RESONANCES AXIS=1,-1 OUTPUT=raw_data NAME=belt-tension-lower FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_belt_tension_graph
_LED_INPUT_SHAPER_END
RESTORE_TOOLHEAD_SETTINGS KEY="measure_corexy_belt_tension"
_LEARN_MORE_CALIBRATION
SHOW_IS_GRAPH_FILES TITLE="Belt Tension Graph"
[gcode_shell_command generate_belt_tension_graph]
command = /home/pi/printer_data/config/RatOS/scripts/generate-belt-tension-graph.sh
timeout = 90.
verbose = True
[idle_timeout]
gcode =
{% if printer.webhooks.state|lower == 'ready' %}
{% if printer.pause_resume.is_paused|lower == 'false' %}
RATOS_ECHO PREFIX="IDLE" MSG="2 hours since last activity. Powering off heaters and motors.."
TURN_OFF_HEATERS
M84
{% endif %}
{% endif %}
timeout = 7200
[temperature_sensor raspberry_pi]
sensor_type = temperature_host
[skew_correction]
[input_shaper]
[virtual_sdcard]
path = ~/printer_data/gcodes
[display_status]
[pause_resume]
[force_move]
enable_force_move = True
[respond]
[resonance_generator]
[ratos]
allow_unknown_gcode_generator = True
[exclude_object]
[heater_bed]
heater_pin = heater_bed_heating_pin
sensor_pin = heater_bed_sensor_pin
sensor_type = Generic 3950
min_temp = 0
max_temp = 120
pwm_cycle_time = 0.02
control = pid
pid_kp = 68.203
pid_ki = 2.842
pid_kd = 409.216
[controller_fan controller_fan]
pin = fan_controller_board_pin
[printer]
kinematics = corexy
max_velocity = 300
max_accel = 3000
max_z_velocity = 20
max_z_accel = 350
square_corner_velocity = 5
minimum_cruise_ratio = 0.5
[gcode_macro QUAD_GANTRY_LEVEL]
rename_existing = QUAD_GANTRY_LEVEL_ORIG
gcode =
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
DEPLOY_PROBE
{% endif %}
QUAD_GANTRY_LEVEL_ORIG
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
STOW_PROBE
{% endif %}
[stepper_x]
position_max = 350
position_endstop = 350
step_pin = PC14
dir_pin = !x_dir_pin
enable_pin = !PE6
microsteps = 64
full_steps_per_rotation = 400
rotation_distance = 40
homing_speed = 50
endstop_pin = tmc5160_stepper_x:virtual_endstop
homing_retract_dist = 0
position_min = 0
[stepper_y]
position_max = 350
position_endstop = 350
step_pin = PE5
dir_pin = y_dir_pin
enable_pin = !PE3
microsteps = 64
full_steps_per_rotation = 400
rotation_distance = 40
homing_speed = 50
endstop_pin = tmc5160_stepper_y:virtual_endstop
homing_retract_dist = 0
position_min = 0
[stepper_z]
position_max = 310
step_pin = PG11
dir_pin = !z0_dir_pin
enable_pin = !PG12
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
position_min = -5
homing_speed = 10
endstop_pin = probe:z_virtual_endstop
[bed_mesh]
speed = 300
horizontal_move_z = 10
mesh_min = 20,30
mesh_max = 310,310
fade_start = 0.6
fade_end = 10.0
probe_count = 5,5
algorithm = bicubic
[quad_gantry_level]
gantry_corners =
-60,-10
410,420
points =
50,25
50,275
300,275
300,25
speed = 300
horizontal_move_z = 10
retries = 5
retry_tolerance = 0.0075
max_adjust = 10
[gcode_macro G32]
gcode =
SAVE_GCODE_STATE NAME=STATE_G32
G90
G28
QUAD_GANTRY_LEVEL
G28
G0 X175 Y175 Z30 F3600
RESTORE_GCODE_STATE NAME=STATE_G32
[firmware_retraction]
retract_speed = 60
unretract_extra_length = 0
unretract_speed = 60
retract_length = 0.5
[resonance_tester]
accel_chip_x = beacon
accel_chip_y = beacon
probe_points =
175,175,20
[tmc5160 stepper_x]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD6
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.022
diag1_pin = ^!x_diag_pin
driver_sgt = 0
[tmc5160 stepper_y]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD5
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.022
diag1_pin = ^!y_diag_pin
driver_sgt = 0
[tmc5160 stepper_z]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA15
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[tmc5160 stepper_z1]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA9
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z1]
step_pin = PB4
dir_pin = !z1_dir_pin
enable_pin = !PB5
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc5160 stepper_z2]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA10
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z2]
step_pin = PG15
dir_pin = !z2_dir_pin
enable_pin = !PG14
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc5160 stepper_z3]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD2
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z3]
step_pin = PG9
dir_pin = !z3_dir_pin
enable_pin = !PG13
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc2209 extruder]
stealthchop_threshold = 0
interpolate = False
uart_pin = toolboard_t0:PB5
run_current = 0.707
driver_tbl = 0
driver_toff = 4
driver_hend = 6
driver_hstrt = 7
sense_resistor = 0.11
[beacon]
serial = /dev/beacon
x_offset = 0
y_offset = 22.5
mesh_main_direction = x
mesh_runs = 1
speed = 15.
lift_speed = 80.
contact_max_hotend_temperature = 275
[delayed_gcode _BEACON_INIT]
initial_duration = 1
gcode =
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
{% set svv = printer.save_variables.variables %}
{% set nozzle_expansion_coefficient_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(0)|float %}
{% if nozzle_expansion_coefficient_multiplier == 0 %}
{% if printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier is not defined %}
{% set nozzle_expansion_coefficient_multiplier = 1.0 %}
{% else %}
{% set nozzle_expansion_coefficient_multiplier = printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier|default(1.0)|float %}
{% endif %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_multiplier VALUE={nozzle_expansion_coefficient_multiplier}
{% endif %}
{% if printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier is defined %}
CONSOLE_ECHO TITLE="Deprecated gcode variable" TYPE="warning" MSG={'"Please remove the variable beacon_contact_expansion_multiplier from your config file."'}
{% endif %}
[gcode_macro BEACON_RATOS_CALIBRATION]
gcode =
RATOS_ECHO MSG="Did you mean BEACON_RATOS_CALIBRATE?"
[gcode_macro BEACON_RATOS_CALIBRATE]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
BEACON_INITIAL_CALIBRATION _AUTOMATED=True
{% if beacon_contact_start_print_true_zero %}
BEACON_POKE_TEST _AUTOMATED=True
_BEACON_CHECK_POKE
{% if printer["dual_carriage"] is not defined %}
BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET _AUTOMATED=True
{% endif %}
{% endif %}
{% if chamber_temp > 0 %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
BEACON_FINAL_CALIBRATION _AUTOMATED=True BED_TEMP={bed_temp} CHAMBER_TEMP={chamber_temp}
{% if beacon_contact_start_print_true_zero %}
BEACON_MEASURE_GANTRY_TWIST
_BEACON_MAYBE_SCAN_COMPENSATION
{% endif %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% if chamber_temp > 0 %}
_CHAMBER_HEATER_OFF
{% endif %}
{% if beacon_contact_start_print_true_zero %}
{% if printer["dual_carriage"] is not defined %}
_BEACON_ECHO_NOZZLE_TEMP_OFFSETS
{% endif %}
_BEACON_ECHO_POKE
{% endif %}
RATOS_ECHO MSG="Beacon calibration finished!"
_LED_BEACON_CALIBRATION_END
RATOS_ECHO MSG="Saving config and restarting klipper..."
SAVE_CONFIG
[gcode_macro BEACON_INITIAL_CALIBRATION]
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed * 60 %}
MAYBE_HOME X=True Y=True
_LED_BEACON_CALIBRATION_START
G90
_MOVE_TO_SAFE_Z_HOME
BEACON_AUTO_CALIBRATE
_Z_HOP
RATOS_ECHO MSG="Initial beacon contact calibration finished!"
{% if not automated %}
_CONSOLE_SAVE_CONFIG
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro BEACON_FINAL_CALIBRATION]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
_BEACON_HOME_AND_ABL
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
_LED_BEACON_CALIBRATION_START
G90
G0 Z2 F{z_hop_speed}
RATOS_ECHO MSG="Waiting for calibration temperature..."
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=150
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp}
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} MAXIMUM={(bed_temp + 5)}
TEMPERATURE_WAIT SENSOR={'extruder' if default_toolhead == 0 else 'extruder1'} MINIMUM=150 MAXIMUM=155
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
_Z_HOP
BEACON_AUTO_CALIBRATE
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% endif %}
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_OFF
{% endif %}
_Z_HOP
RATOS_ECHO MSG="Final beacon contact calibration finished!"
{% if not automated %}
_CONSOLE_SAVE_CONFIG
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro BEACON_POKE_TEST]
variable_poke_result_1 = -1
variable_poke_result_2 = -1
variable_poke_result_3 = -1
variable_poke_result_4 = -1
variable_poke_result_5 = -1
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_1 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_2 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_3 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_4 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_5 VALUE=-1
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
G0 Z5 F{z_hop_speed}
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=1
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=2
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=3
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=4
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=5
_Z_HOP
RATOS_ECHO MSG="Beacon poke test finished!"
{% if not automated %}
_BEACON_ECHO_POKE
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro _BEACON_PROBE_POKE]
gcode =
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
BEACON_POKE speed=3 top=5 bottom={poke_bottom}
BEACON_QUERY
[gcode_macro _BEACON_STORE_POKE]
gcode =
{% set i = params.I|default(1)|int %}
{% set last_z = printer.beacon.last_poke_result|default(0)|float %}
{% if printer.beacon.last_poke_result|lower != "none" %}
{% if printer.beacon.last_poke_result.error == 0 %}
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE={"poke_result_%s" % i} VALUE={printer.beacon.last_poke_result.latency}
{% endif %}
{% endif %}
[gcode_macro _BEACON_CHECK_POKE]
gcode =
{% set p1 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_1|int %}
{% set p2 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_2|int %}
{% set p3 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_3|int %}
{% set p4 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_4|int %}
{% set p5 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_5|int %}
{% if p1 == -1 or p2 == -1 or p3 == -1 or p4 == -1 or p5 == -1 %}
_LED_BEACON_CALIBRATION_ERROR
{ action_raise_error("Beacon poke test error!") }
{% endif %}
{% set avg = (p1 + p2 + p3 + p4 + p5) / 5 %}
{% if avg > 6 %}
_LED_BEACON_CALIBRATION_ERROR
{ action_raise_error("Beacon poke test failed!") }
{% endif %}
[gcode_macro _BEACON_ECHO_POKE]
gcode =
{% set p1 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_1|int %}
{% set p2 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_2|int %}
{% set p3 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_3|int %}
{% set p4 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_4|int %}
{% set p5 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_5|int %}
{% set avg = (p1 + p2 + p3 + p4 + p5) / 5 %}
{% if avg <= 1 %}
{% set type = "success" %}
{% set note = "Extremely low noise, rarely achieved" %}
{% elif avg > 1 and avg <= 4 %}
{% set type = "info" %}
{% set note = "Excellent performance for a typical printer" %}
{% elif avg > 4 and avg <= 8 %}
{% set type = "warning" %}
{% set note = "Acceptable performance, machine may have considerable cyclic axis noise" %}
{% elif avg > 8 and avg <= 11 %}
{% set type = "alert" %}
{% set note = "Not ideal, may want to verify proper mounting or use thinner stackups" %}
{% elif avg > 11 %}
{% set type = "alert" %}
{% set note = "Reason for concern, present setup may be risky to continue with" %}
{% endif %}
CONSOLE_ECHO TITLE="Beacon poke test result:" TYPE={type} MSG={'"Average latency: %.2f_N_%s"' % (avg, note)}
[gcode_macro BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET]
variable_reference_z = 0.0
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set test_margin = 30 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero %}
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
RATOS_ECHO PREFIX="BEACON" MSG="Nozzle temperature offset calibration..."
{% for i in range(10) %}
beacon_poke speed=3 top=5 bottom={poke_bottom}
{% endfor %}
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=250
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET=0
{% if not automated %}
_BEACON_ECHO_NOZZLE_TEMP_OFFSETS
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
{% endif %}
[gcode_macro _BEACON_PROBE_NOZZLE_TEMP_OFFSET]
gcode =
{% set temp = params.TEMP|int %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set hotend_heat_soak_time = printer["gcode_macro RatOS"].hotend_heat_soak_time|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% set idex_zcontrolpoint = svv.idex_zcontrolpoint|default(150)|float %}
RATOS_ECHO PREFIX="BEACON" MSG="Waiting for nozzle to reach {temp}°C..."
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET={temp}
TEMPERATURE_WAIT SENSOR={"extruder" if default_toolhead == 0 else "extruder1"} MINIMUM={temp} MAXIMUM={temp + 2}
{% if hotend_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking hotend for {hotend_heat_soak_time} seconds..."
G4 P{(hotend_heat_soak_time * 1000)}
{% endif %}
RATOS_ECHO PREFIX="BEACON" MSG="Probing with nozzle temperature {temp}°C..."
PROBE PROBE_METHOD=contact PROBE_SPEED=3 LIFT_SPEED=15 SAMPLES=5 SAMPLE_RETRACT_DIST=3 SAMPLES_TOLERANCE=0.005 SAMPLES_TOLERANCE_RETRIES=10 SAMPLES_RESULT=median
BEACON_QUERY
G0 Z5 F{z_speed}
[gcode_macro _BEACON_STORE_NOZZLE_TEMP_OFFSET]
gcode =
{% set temp = params.TEMP|int %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% set last_z = printer.beacon.last_z_result|default(0)|float %}
{% if temp == 150 %}
SET_GCODE_VARIABLE MACRO=BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET VARIABLE=reference_z VALUE={last_z}
{% else %}
{% set reference_z = printer["gcode_macro BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET"].reference_z|default(0)|float %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_t{default_toolhead} VALUE={(last_z - reference_z)}
{% endif %}
[gcode_macro _BEACON_ECHO_NOZZLE_TEMP_OFFSETS]
gcode =
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% if default_toolhead == 0 %}
CONSOLE_ECHO TYPE="info" MSG={'"T0 expansion coefficient %.6f"' % svv.nozzle_expansion_coefficient_t0}
{% else %}
CONSOLE_ECHO TYPE="info" MSG={'"T1 expansion coefficient %.6f"' % svv.nozzle_expansion_coefficient_t1}
{% endif %}
[gcode_macro _BEACON_SET_NOZZLE_TEMP_OFFSET]
variable_runtime_temp = 0
gcode =
{% set toolhead = params.TOOLHEAD|default(0)|int %}
{% set reset = true if params.RESET|default(false)|lower == 'true' else false %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set svv = printer.save_variables.variables %}
{% if reset %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_applied_offset VALUE=0
{% else %}
{% if beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
{% set nozzle_expansion_coefficient_t0 = svv.nozzle_expansion_coefficient_t0|default(0)|float %}
{% if printer["dual_carriage"] is defined %}
{% set nozzle_expansion_coefficient_t1 = svv.nozzle_expansion_coefficient_t1|default(0)|float %}
{% endif %}
{% set nozzle_expansion_coefficient_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(1.0)|float %}
{% set applied_offset = svv.nozzle_expansion_applied_offset|default(0)|float %}
{% set temp = printer['extruder' if toolhead == 0 else 'extruder1'].target|float %}
{% set temp_offset = temp - beacon_contact_true_zero_temp %}
{% set expansion_coefficient = nozzle_expansion_coefficient_t0 if toolhead == 0 else nozzle_expansion_coefficient_t1 %}
{% set expansion_offset = nozzle_expansion_coefficient_multiplier * (temp_offset * (expansion_coefficient / 100)) %}
{% set new_offset = ((-applied_offset) + expansion_offset) %}
SET_GCODE_OFFSET Z_ADJUST={new_offset} MOVE=1 SPEED={z_speed}
SAVE_VARIABLE VARIABLE=nozzle_expansion_applied_offset VALUE={expansion_offset}
SET_GCODE_VARIABLE MACRO=_BEACON_SET_NOZZLE_TEMP_OFFSET VARIABLE=runtime_temp VALUE={temp}
RATOS_ECHO PREFIX="BEACON" MSG={'"Nozzle expansion offset of %.6fmm applied to T%s"' % (expansion_offset, toolhead)}
DEBUG_ECHO PREFIX="_BEACON_SET_NOZZLE_TEMP_OFFSET" MSG="multiplier: {nozzle_expansion_coefficient_multiplier}, coefficient: {expansion_coefficient}, temp_offset: {temp_offset}, expansion_offset: {expansion_offset}, applied_offset: {applied_offset}, new_offset: {new_offset}"
{% endif %}
{% endif %}
[gcode_macro BEACON_MEASURE_GANTRY_TWIST]
variable_needs_compensation = False
variable_reference_z = 0.0
variable_front = 0.0
variable_front_left = 0.0
variable_front_right = 0.0
variable_back = 0.0
variable_back_left = 0.0
variable_back_right = 0.0
variable_right = 0.0
variable_left = 0.0
variable_margin_x = 40
variable_margin_y = 40
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=False
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
RATOS_ECHO PREFIX="BEACON" MSG="Measure gantry twist..."
{% for i in range(10) %}
beacon_poke speed=3 top=5 bottom={poke_bottom}
{% endfor %}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="center"
G0 X{margin_x} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front_left"
G0 X{safe_home_x} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front"
G0 X{(printable_x_max - margin_x)} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front_right"
G0 X{(printable_x_max - margin_x)} Y{safe_home_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="right"
G0 X{(printable_x_max - margin_x)} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back_right"
G0 X{safe_home_x} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back"
G0 X{margin_x} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back_left"
G0 X{margin_x} Y{safe_home_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="left"
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
_BEACON_ECHO_GANTRY_TWIST
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro _BEACON_PROBE_GANTRY_TWIST]
gcode =
RATOS_ECHO PREFIX="BEACON" MSG="Probing..."
BEACON_OFFSET_COMPARE
BEACON_QUERY
[gcode_macro _BEACON_STORE_GANTRY_TWIST]
gcode =
{% set location = params.LOCATION|lower %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set last_z = printer.beacon.last_offset_result["delta"]|default(0)|float %}
{% if location == "center" %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=reference_z VALUE={last_z}
{% else %}
{% set reference_z = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].reference_z|default(0)|float %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE={location} VALUE={(last_z - reference_z)}
{% endif %}
[gcode_macro _BEACON_ECHO_GANTRY_TWIST]
gcode =
{% set reference_z = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].reference_z|default(0)|float * 1000 %}
{% set front_left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front_left|default(0)|float * 1000 %}
{% set front = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front|default(0)|float * 1000 %}
{% set front_right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front_right|default(0)|float * 1000 %}
{% set right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].right|default(0)|float * 1000 %}
{% set back_right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back_right|default(0)|float * 1000 %}
{% set back = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back|default(0)|float * 1000 %}
{% set back_left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back_left|default(0)|float * 1000 %}
{% set left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].left|default(0)|float * 1000 %}
{% set line_1 = "Front left: %.6fμm" % (front_left) %}
{% set line_2 = "Front center: %.6fμm" % (front) %}
{% set line_3 = "Front right: %.6fμm" % (front_right) %}
{% set line_4 = "Left center: %.6fμm" % (left) %}
{% set line_5 = "Right center: %.6fμm" % (right) %}
{% set line_6 = "Back left: %.6fμm" % (back_left) %}
{% set line_7 = "Back center: %.6fμm" % (back) %}
{% set line_8 = "Back right: %.6fμm" % (back_right) %}
{% set max_value = [(front_left|abs), (front|abs), (front_right|abs), (left|abs), (right|abs), (back_left|abs), (back|abs), (back_right|abs)]|max %}
{% if max_value <= 50 %}
{% set type = "success" %}
{% set recommendation = "Very low gantry twist: %.6fμm._N_No beacon scan compensation needed." % max_value %}
{% elif max_value > 50 and max_value <= 100 %}
{% set type = "info" %}
{% set recommendation = "Low gantry twist: %.6fμm._N_You may experience first layer inconsistensies, consider beacon scan compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 100 and max_value <= 150 %}
{% set type = "warning" %}
{% set recommendation = "High gantry twist: %.6fμm._N_High chance of first layer problems, beacon scan compensation is highly encouraged." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 150 and max_value <= 200 %}
{% set type = "alert" %}
{% set recommendation = "Very High gantry twist: %.6fμm._N_You will encounter first layer problems on large prints unless you activate beacon scan compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 200 %}
{% set type = "alert" %}
{% set recommendation = "Extremely high gantry twist: %.6fμm._N_You have significant scan/contact inconsistency which is indicative of mechanical problems, please investigate before resorting to software compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% endif %}
CONSOLE_ECHO TITLE="Gantry twist relative to the center" TYPE={type} MSG={'"_N_%s_N__N_%s_N_%s_N_%s_N_%s_N_%s_N_%s_N_%s_N_%s"' % (recommendation, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8)}
[gcode_macro BEACON_CREATE_SCAN_COMPENSATION_MESH]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set profile = params.PROFILE|default("Contact")|string %}
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_scan_compensation_enable = true if printer["gcode_macro RatOS"].beacon_scan_compensation_enable|default(false)|lower == 'true' else false %}
{% set probe_count = printer["gcode_macro RatOS"].beacon_scan_compensation_probe_count %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% if not beacon_scan_compensation_enable %}
RATOS_ECHO MSG="Beacon scan compensation is disabled!"
{% else %}
MAYBE_HOME
_MOVE_TO_SAFE_Z_HOME
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_LED_BEACON_CALIBRATION_START
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=150
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp}
RATOS_ECHO MSG="Please wait..."
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} MAXIMUM={(bed_temp + 5)}
TEMPERATURE_WAIT SENSOR={'extruder' if default_toolhead == 0 else 'extruder1'} MINIMUM=150 MAXIMUM=155
{% endif %}
{% if not automated %}
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
{% endif %}
{% if printer.z_tilt is defined %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% endif %}
{% if printer.quad_gantry_level is defined %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% endif %}
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES=2 SAMPLES_DROP=1 SAMPLES_TOLERANCE_RETRIES=10 PROBE_COUNT={probe_count[0]},{probe_count[1]} PROFILE={profile}
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% endif %}
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_OFF
{% endif %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
RATOS_ECHO MSG="Beacon scan compensation mesh created!"
{% if not automated %}
RATOS_ECHO MSG="Saving config and restarting klipper..."
SAVE_CONFIG
{% endif %}
{% endif %}
[gcode_macro _BEACON_APPLY_SCAN_COMPENSATION]
gcode =
{% set beacon_scan_compensation_profile = printer["gcode_macro RatOS"].beacon_scan_compensation_profile %}
{% set beacon_scan_compensation_enable = true if printer["gcode_macro RatOS"].beacon_scan_compensation_enable|default(false)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_SCAN_COMPENSATION" MSG="beacon_scan_compensation_profile {beacon_scan_compensation_profile}, beacon_scan_compensation_enable {beacon_scan_compensation_enable}"
{% if beacon_scan_compensation_enable %}
BEACON_APPLY_SCAN_COMPENSATION PROFILE={beacon_scan_compensation_profile}
{% endif %}
[gcode_macro _BEACON_MAYBE_SCAN_COMPENSATION]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set needs_scan_compensation = true if printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].needs_compensation|default(false)|lower == 'true' else false %}
{% if needs_scan_compensation %}
BEACON_CREATE_SCAN_COMPENSATION_MESH _AUTOMATED=True BED_TEMP={bed_temp} CHAMBER_TEMP={chamber_temp}
{% endif %}
[gcode_macro _BEACON_HOME_AND_ABL]
gcode =
MAYBE_HOME X=True Y=True
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% set needs_rehoming = False %}
{% if printer.z_tilt is defined and not printer.z_tilt.applied %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% set needs_rehoming = True %}
{% endif %}
{% if printer.quad_gantry_level is defined and not printer.quad_gantry_level.applied %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% set needs_rehoming = True %}
{% endif %}
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% if needs_rehoming %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% endif %}
[gcode_macro _BEACON_SAVE_MULTIPLIER]
gcode =
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set multiplier = printer["gcode_macro _BEACON_APPLY_RUNTIME_MULTIPLIER"].runtime_multiplier|default(-1.0)|float %}
DEBUG_ECHO PREFIX="_BEACON_SAVE_MULTIPLIER" MSG="multiplier: {multiplier}, beacon_contact_start_print_true_zero: {beacon_contact_start_print_true_zero}, beacon_contact_expansion_compensation: {beacon_contact_expansion_compensation}"
{% if multiplier > 0 and beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_multiplier VALUE={multiplier}
SET_GCODE_VARIABLE MACRO=_BEACON_APPLY_RUNTIME_MULTIPLIER VARIABLE=runtime_multiplier VALUE=-1.0
CONSOLE_ECHO TITLE="Hotend thermal expansion compensation" TYPE="success" MSG={'"New value is: %.6f_N_The new multiplier value has been saved to the configuration."' % multiplier}
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _BEACON_APPLY_RUNTIME_MULTIPLIER]
variable_runtime_multiplier = -1.0
gcode =
{% set toolhead = 0 %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set toolhead = 1 if idex_mode == 'primary' else 0 %}
{% endif %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set layer_number = printer["gcode_macro _ON_LAYER_CHANGE"].layer_number|default(0)|int %}
{% set is_printing_gcode = true if printer["gcode_macro START_PRINT"].is_printing_gcode|default(true)|lower == 'true' else false %}
{% if layer_number == 0 and is_printing_gcode %}
{% set link_url = "https://os.ratrig.com/docs/slicers" %}
{% set link_text = "RatOS Slicer Documentation" %}
{% set line_1 = '"Your slicer is not correctly reporting layer information. See the layer change custom g-code in the %s".' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="Missing layer information" TYPE="warning" MSG={line_1}
{% endif %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_RUNTIME_MULTIPLIER" MSG="layer_number: {layer_number}, is_printing_gcode: {is_printing_gcode}, beacon_contact_start_print_true_zero: {beacon_contact_start_print_true_zero}, beacon_contact_expansion_compensation: {beacon_contact_expansion_compensation}"
{% if layer_number == 1 and is_printing_gcode and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
{% set svv = printer.save_variables.variables %}
{% set nozzle_expansion_coefficient = svv.nozzle_expansion_coefficient_t0|default(0)|float %}
{% if toolhead == 1 %}
{% set nozzle_expansion_coefficient = svv.nozzle_expansion_coefficient_t1|default(0)|float %}
{% endif %}
{% set beacon_contact_expansion_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(1.0)|float %}
{% set print_temp = printer["gcode_macro _BEACON_SET_NOZZLE_TEMP_OFFSET"].runtime_temp|default(0)|int %}
{% if print_temp > 0 %}
{% set z_offset = printer.gcode_move.homing_origin.z|float %}
{% set temp_delta = print_temp - beacon_contact_true_zero_temp %}
{% set coefficient_per_degree = nozzle_expansion_coefficient / 100 %}
{% set z_offset_per_degree = z_offset / temp_delta %}
{% set new_multiplier = z_offset_per_degree / coefficient_per_degree %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_RUNTIME_MULTIPLIER" MSG="print_temp: {print_temp}, z_offset: {z_offset}, temp_delta: {temp_delta}, nozzle_expansion_coefficient: {nozzle_expansion_coefficient}, coefficient_per_degree: {coefficient_per_degree}, z_offset_per_degree: {z_offset_per_degree}, old_multiplier: {beacon_contact_expansion_multiplier}, new_multiplier: {new_multiplier}"
SET_GCODE_VARIABLE MACRO=_BEACON_APPLY_RUNTIME_MULTIPLIER VARIABLE=runtime_multiplier VALUE={new_multiplier}
{% endif %}
{% endif %}
[gcode_macro T0]
variable_join = 0
variable_remap = 0
variable_alert = ""
variable_filament_name = ""
variable_filament_type = ""
variable_filament_temp = 0
variable_runout_sensor = ""
variable_active = True
variable_color = "7bff33"
variable_hotend_type = "SF"
variable_has_cht_nozzle = True
variable_cooling_position_to_nozzle_distance = 40
variable_tooolhead_sensor_to_extruder_gear_distance = 15
variable_extruder_gear_to_cooling_position_distance = 30
variable_filament_loading_nozzle_offset = -5
variable_filament_grabbing_length = 5
variable_filament_grabbing_speed = 1
variable_enable_insert_detection = True
variable_enable_runout_detection = True
variable_enable_clog_detection = True
variable_unload_after_runout = True
variable_purge_after_load = 0
variable_purge_before_unload = 0
variable_extruder_load_speed = 60
variable_filament_load_speed = 10
variable_standby = False
variable_temperature_offset = 0
variable_has_oozeguard = False
variable_has_front_arm_nozzle_wiper = False
variable_resume_after_insert = False
gcode =
{% set x = params.X|default(-1.0)|float %}
{% set y = params.Y|default(-1.0)|float %}
{% set z = params.Z|default(0.0)|float %}
{% set s = params.S|default(1)|int %}
{% if printer["gcode_macro _SELECT_TOOL"] is defined %}
_SELECT_TOOL T=0 X={x} Y={y} Z={z} TOOLSHIFT={s}
{% endif %}
[save_variables]
filename = /home/pi/printer_data/config/ratos-variables.cfg
=======================
Extruder max_extrude_ratio=0.415752
mcu 'mcu': Starting serial connect
webhooks client 4106335784: New connection
webhooks client 4106335784: Client info {'program': 'Moonraker', 'version': 'v0.9.3-0-g71f9e67'}
Loaded MCU 'mcu' 118 commands (v0.12.0-396-gb7233d119 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34)
MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 BUS_PINS_i2c3_PA8_PC9=PA8,PC9 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h723xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1
mcu 'rpi': Starting connect
Loaded MCU 'rpi' 119 commands (?-20240727_132503-fv-az659-741 / gcc: (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110 binutils: (GNU Binutils for Raspbian) 2.35.2)
MCU 'rpi' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256
mcu 'toolboard_t0': Starting serial connect
Loaded MCU 'toolboard_t0' 100 commands (v0.12.0-396-gb7233d119 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34)
MCU 'toolboard_t0' config: ADC_MAX=4095 BUS_PINS_i2c1=PB6,PB7 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB7=PB8,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c1_PF1_PF0=PF1,PF0 BUS_PINS_i2c1a=PF1,PF0 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 CLOCK_FREQ=48000000 MCU=stm32f042x6 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PF0,PF1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1
mcu_temperature 'mcu' nominal base=-275.577689 slope=1631.474104
mcu_temperature 'toolboard_t0' nominal base=342.920354 slope=-724.778761
mcu 'beacon': Starting serial connect
Loaded MCU 'beacon' 45 commands (Beacon 2.1.0 / )
MCU 'beacon' config: ADC_MAX=4095 BEACON_ACCEL_BITS=12 BEACON_ACCEL_SCALE_16G=7.81 BEACON_ACCEL_SCALE_2G=0.98 BEACON_ACCEL_SCALE_4G=1.95 BEACON_ACCEL_SCALE_8G=3.91 BEACON_ADC_SMOOTH_COUNT=16 BEACON_HAS_ACCEL=1 BEACON_REV=H CLOCK_FREQ=32000000 MCU=beacon STATS_SUMSQ_BASE=256
Config error
Traceback (most recent call last):
File "/home/pi/klipper/klippy/klippy.py", line 135, in _connect
cb()
File "/home/pi/klipper/klippy/mcu.py", line 748, in _connect
self._send_config(None)
File "/home/pi/klipper/klippy/mcu.py", line 679, in _send_config
cb()
File "/home/pi/klipper/klippy/mcu.py", line 456, in _build_config
raise pins.error("shutdown value must be 0.0 or 1.0 on soft pwm")
pins.error: shutdown value must be 0.0 or 1.0 on soft pwm
webhooks client 4106335784: Disconnected
Restarting printer
Start printer at Sun May 25 00:20:52 2025 (1748128852.0 79.4)
===== Config file =====
[mcu rpi]
serial = /tmp/klipper_host_mcu
[board_pins btt-kraken]
aliases =
x_step_pin=PC14,
x_dir_pin=PC13,
x_enable_pin=PE6,
x_uart_pin=PD6,
x_diag_pin=PC15,
x_endstop_pin=PC15,
y_step_pin=PE5,
y_dir_pin=PE4,
y_enable_pin=PE3,
y_uart_pin=PD6,
y_diag_pin=PF0,
y_endstop_pin=PF0,
z0_step_pin=PG9,
z0_dir_pin=PG10,
z0_enable_pin=PG13,
z0_uart_pin=PA15,
z0_diag_pin=PF3,
z1_step_pin=PG11,
z1_dir_pin=PD7,
z1_enable_pin=PG12,
z1_uart_pin=PA9,
z1_diag_pin=PF4,
z2_step_pin=PB4,
z2_dir_pin=PB3,
z2_enable_pin=PB5,
z2_uart_pin=PA10,
z2_diag_pin=PF10,
z3_step_pin=PG15,
z3_dir_pin=PB6,
z3_enable_pin=PG14,
z3_uart_pin=PD2,
z3_diag_pin=PC0,
e_step_pin=PG9,
e_dir_pin=PG10,
e_enable_pin=PG13,
e_uart_pin=PD2,
e_diag_pin=PF1,
e_heater_pin=PF6,
e_sensor_pin=PB1,
stepper_spi_mosi_pin=PC8,
stepper_spi_miso_pin=PC7,
stepper_spi_sclk_pin=PC6,
adxl345_cs_pin=PE10,
bltouch_sensor_pin=PG1,
bltouch_control_pin=PE9,
probe_pin=PG1,
fan_part_cooling_pin=PA0,
fan_toolhead_cooling_pin=PA1,
fan_controller_board_pin=PA2,
heater_bed_heating_pin=PF5,
heater_bed_sensor_pin=PB0,
4p_fan_part_cooling_pin=PA6,
4p_fan_part_cooling_tach_pin=PC1,
4p_toolhead_cooling_pin=PE8,
4p_toolhead_cooling_tach_pin=PG0,
4p_controller_board_pin=PE8,
4p_controller_board_tach_pin=PG0
[mcu]
serial = /dev/RatOS/btt-kraken
[temperature_sensor Kraken]
sensor_type = temperature_mcu
[adxl345 controlboard]
cs_pin = PE10
spi_software_mosi_pin = PE14
spi_software_miso_pin = PE13
spi_software_sclk_pin = PE12
[board_pins toolboard_t0]
mcu = toolboard_t0
aliases =
e_step_pin=PB7,
e_dir_pin=PB6,
e_enable_pin=PB4,
e_uart_pin=PB5,
e_heater_pin=PA0,
e_sensor_pin=PA3,
stepper_spi_mosi_pin=null,
stepper_spi_miso_pin=null,
stepper_spi_sclk_pin=null,
adxl345_cs_pin=PA4,
bltouch_sensor_pin=PA15,
bltouch_control_pin=PB3,
probe_pin=PA15,
fan_part_cooling_pin=PA10,
fan_toolhead_cooling_pin=PA9,
fan_controller_board_pin=null,
heater_bed_heating_pin=null,
heater_bed_sensor_pin=null,
4p_fan_part_cooling_pin=null,
4p_fan_part_cooling_tach_pin=null,
4p_toolhead_cooling_pin=null,
4p_toolhead_cooling_tach_pin=null,
4p_controller_board_pin=null,
4p_controller_board_tach_pin=null
[mcu toolboard_t0]
serial = /dev/RatOS/ldo-orbitool-o2-t0
[temperature_sensor Orbitool_O2_T0]
sensor_type = temperature_mcu
sensor_mcu = toolboard_t0
[lis2dw toolboard_t0]
axes_map = x, z, y
cs_pin = toolboard_t0:PA4
spi_bus = spi1
[extruder]
max_power = 0.995
rotation_distance = 4.63
full_steps_per_rotation = 200
filament_diameter = 1.750
max_extrude_only_velocity = 60
max_extrude_only_distance = 200
nozzle_diameter = 0.5
heater_pin = toolboard_t0:PA0
sensor_type = PT1000
pullup_resistor = 2200
sensor_pin = toolboard_t0:PA3
min_extrude_temp = 170
min_temp = 0
max_temp = 285
pressure_advance = 0.05
step_pin = toolboard_t0:PB7
dir_pin = !toolboard_t0:e_dir_pin
enable_pin = !toolboard_t0:PB4
microsteps = 64
control = pid
pid_kp = 21.673
pid_ki = 1.338
pid_kd = 87.776
[adc_temperature hotend_power_scale]
temperature1 = 119
voltage1 = 1.91
temperature2 = 239
voltage2 = 3.82
[fan]
max_power = 0.995
shutdown_speed = 1.0
pin = PA6
cycle_time = 0.00004
tachometer_pin = ^PC1
tachometer_poll_interval = 0.0005
[heater_fan toolhead_cooling_fan]
max_power = 0.995
cycle_time = 0.0001
shutdown_speed = 0
pin = PA1
fan_speed = 1
heater = extruder
[output_pin O2_RUN_LED]
pin = toolboard_t0:PB8
shutdown_value = 0
value = 1
[temperature_sensor hotend_power_draw]
sensor_pin = toolboard_t0:PA2
sensor_type = hotend_power_scale
[gcode_macro RatOS]
variable_homing = "endstops"
variable_z_probe = "static"
variable_sensorless_x_current = 0.49699999999999994
variable_sensorless_y_current = 0.7242
variable_safe_home_x = "middle"
variable_safe_home_y = "middle"
variable_driver_type_x = "tmc2209"
variable_driver_type_y = "tmc2209"
variable_stowable_probe_stop_on_error = False
variable_chamber_filter_enable = True
variable_chamber_filter_speed = 0.5
variable_chamber_filter_disable_speed = 1.0
variable_chamber_filter_enable_at = "after_print_start"
variable_chamber_filter_disable_period = 300
variable_chamber_filter_disable_bed_temp = 0
variable_chamber_heater_enable = True
variable_chamber_heater_bed_temp = 115
variable_chamber_heater_preheating_temp = 150
variable_chamber_heater_heating_temp_offset = 25
variable_chamber_heater_control_external_heater = False
variable_chamber_heater_air_circulation_enable = True
variable_chamber_heater_air_circulation_fan_speed = 0.35
variable_chamber_heater_air_circulation_y_pos = 0
variable_chamber_heater_air_circulation_z_pos = 100
variable_chamber_heater_extra_fan_speed = 1.0
variable_chamber_heater_filter_fan_speed = 1.0
variable_led_status_action = 0.0,1.0,1.0
variable_led_status_success = 0.0,1.0,0.0
variable_led_status_error = 1.0,0.0,1.0
variable_led_status_on = 1.0,1.0,1.0
variable_led_status_off = 0.0,0.0,1.0
variable_led_status_standby = 0.1,0.1,0.1
variable_led_status_heating = 1.0,0.0,0.0
variable_led_status_cooling = 0.0,0.0,1.0
variable_calibrate_bed_mesh = True
variable_adaptive_mesh = True
variable_start_print_park_in = "front"
variable_start_print_park_z_height = 50
variable_end_print_park_in = "back"
variable_pause_print_park_in = "front"
variable_end_print_park_z_hop = 20
variable_nozzle_priming = "primeblob"
variable_nozzle_prime_start_x = "max"
variable_nozzle_prime_start_y = "min"
variable_nozzle_prime_direction = "auto"
variable_nozzle_prime_bridge_fan = 102
variable_probe_for_priming_result = None
variable_probe_for_priming_end_result = None
variable_probe_for_priming_result_t1 = None
variable_probe_for_priming_end_result_t1 = None
variable_probe_for_priming_disable_mesh_constraints = False
variable_adaptive_prime_offset_threshold = -1.0
variable_last_z_offset = None
variable_runout_park_in = "front"
variable_enable_unload_tip_forming = False
variable_filament_unload_length = 150
description = RatOS variable storage macro, will echo variables to the console when run.
variable_relative_extrusion = False
variable_force_absolute_position = False
variable_preheat_extruder = True
variable_preheat_extruder_temp = 150
variable_macro_travel_speed = 300
variable_macro_travel_accel = 3000
variable_macro_z_speed = 15
variable_bed_margin_x = [0, 0]
variable_bed_margin_y = [0, 0]
variable_printable_x_min = 0
variable_printable_x_max = 0
variable_printable_y_min = 0
variable_printable_y_max = 0
variable_end_print_motors_off = True
variable_status_color_ok = "00FF00"
variable_status_color_error = "FF0000"
variable_status_color_unknown = "FFFF00"
variable_end_print_retract_filament = 10
gcode =
ECHO_RATOS_VARS
variable_beacon_bed_mesh_scv = 25
variable_beacon_contact_z_homing = False
variable_beacon_contact_start_print_true_zero = True
variable_beacon_contact_wipe_before_true_zero = True
variable_beacon_contact_true_zero_temp = 150
variable_beacon_contact_prime_probing = True
variable_beacon_contact_expansion_compensation = True
variable_beacon_contact_bed_mesh = False
variable_beacon_contact_bed_mesh_samples = 2
variable_beacon_contact_z_tilt_adjust = False
variable_beacon_contact_z_tilt_adjust_samples = 2
variable_beacon_scan_compensation_enable = False
variable_beacon_scan_compensation_profile = "Contact"
variable_beacon_scan_compensation_probe_count = 15,15
variable_beacon_contact_poke_bottom_limit = -1
variable_homing_x = "sensorless"
variable_homing_y = "sensorless"
variable_x_driver_types = ["tmc5160"]
variable_x_axes = ["x"]
variable_y_driver_types = ["tmc5160"]
variable_y_axes = ["y"]
variable_z_driver_types = ["tmc5160", "tmc5160", "tmc5160", "tmc5160"]
variable_z_axes = ["z", "z1", "z2", "z3"]
[ratos_homing]
axes = xyz
z_hop = 15
z_hop_speed = 15
gcode =
_LED_ON
{% set prev_stop_on_error = printer["gcode_macro RatOS"].stowable_probe_stop_on_error %}
{% if printer["dual_carriage"] is defined %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set target_idex_mode = printer["dual_carriage"].carriage_1|lower %}
_IDEX_SINGLE
_SELECT_TOOL T={default_toolhead} TOOLSHIFT=false
{% endif %}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE=True
M400
G90
{% set X = true if params.X is defined else false %}
{% set Y = true if params.Y is defined else false %}
{% set Z = true if params.Z is defined else false %}
{% if printer["gcode_macro RatOS"].home_y_first|default(false)|lower == 'true' %}
HOME_Y X={X} Y={Y} Z={Z}
HOME_X X={X} Y={Y} Z={Z}
{% else %}
HOME_X X={X} Y={Y} Z={Z}
HOME_Y X={X} Y={Y} Z={Z}
{% endif %}
HOME_Z X={X} Y={Y} Z={Z}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE={prev_stop_on_error}
{% if printer["dual_carriage"] is defined %}
{% if target_idex_mode == "copy" %}
_IDEX_COPY
{% elif target_idex_mode == "mirror" %}
_IDEX_MIRROR
{% endif %}
{% endif %}
[gcode_macro HOME_X]
gcode =
{% set x_homed = 'x' in printer.toolhead.homed_axes %}
{% set homing = printer["gcode_macro RatOS"].homing|lower %}
{% set homing_x = printer["gcode_macro RatOS"].homing_x|lower %}
{% set homing_x = homing_x if homing_x else homing %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_X" MSG="printable_x_max: {printable_x_max}, safe_home_x: {safe_home_x}, axis_maximum.x: {printer.toolhead.axis_maximum.x}, bed_margin_x: {printer['gcode_macro RatOS'].bed_margin_x}"
{% if X or not Y and not Z %}
{% if homing_x == 'endstop' %}
G28 X
{% elif homing_x == 'sensorless' %}
{% if printer["dual_carriage"] is defined %}
{ action_emergency_stop("sensorless homing not supported on IDEX!") }
{% endif %}
HOME_X_SENSORLESS
{% else %}
{ action_emergency_stop("expected RatOS variable_homing_x to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_x, homing)) }
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set parking_position = printer["gcode_macro T%s" % (0 if default_toolhead==1 else 1)].parking_position|float %}
SET_DUAL_CARRIAGE CARRIAGE={0 if default_toolhead==1 else 1} MODE=PRIMARY
G1 X{parking_position} F{speed}
SET_DUAL_CARRIAGE CARRIAGE={default_toolhead} MODE=PRIMARY
{% endif %}
{% set x_homed = True %}
G0 X{safe_home_x} F{speed}
M400
{% endif %}
[gcode_macro HOME_Y]
gcode =
{% set y_homed = 'y' in printer.toolhead.homed_axes %}
{% set homing = printer["gcode_macro RatOS"].homing|lower %}
{% set homing_y = printer["gcode_macro RatOS"].homing_y|lower %}
{% set homing_y = homing_y if homing_y else homing %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_Y" MSG="printable_y_max: {printable_y_max}, safe_home_y: {safe_home_y}, axis_maximum.y: {printer.toolhead.axis_maximum.y}, bed_margin_y: {printer['gcode_macro RatOS'].bed_margin_y}"
{% if Y or not X and not Z %}
{% if homing_y == 'endstop' %}
G28 Y
{% elif homing_y == 'sensorless' %}
HOME_Y_SENSORLESS
{% else %}
{ action_emergency_stop("expected RatOS variable_homing_y to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_y, homing)) }
{% endif %}
{% set y_homed = True %}
G0 Y{safe_home_y} F{speed}
{% endif %}
[gcode_macro HOME_Z]
gcode =
{% set x_homed = 'x' in printer.toolhead.homed_axes %}
{% set y_homed = 'y' in printer.toolhead.homed_axes %}
{% set z_probe = printer["gcode_macro RatOS"].z_probe %}
{% set beacon_contact_z_homing = true if printer["gcode_macro RatOS"].beacon_contact_z_homing|default(false)|lower == 'true' else false %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_Z" MSG="x_homed: {x_homed}, y_homed: {y_homed}, z_probe: {z_probe}, beacon_contact_z_homing: {beacon_contact_z_homing}"
{% if Z or not Y and not X %}
RATOS_ECHO MSG="Homing Z"
{% if x_homed == False or y_homed == False %}
{ action_emergency_stop("X and Y must be homed before homing Z") }
{% else %}
{% if z_probe == "stowable" %}
DEPLOY_PROBE
_MOVE_TO_SAFE_Z_HOME
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_homing %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% else %}
G28 Z
{% endif %}
_Z_HOP
STOW_PROBE
{% else %}
_MOVE_TO_SAFE_Z_HOME
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_homing %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% else %}
G28 Z
{% endif %}
_Z_HOP
{% endif %}
{% endif %}
{% endif %}
[gcode_macro HOME_X_SENSORLESS]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="home_x_sensorless"
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
M204 S1000
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endif %}
G4 P300
G28 X
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].x_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].y_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current}
{% endif %}
G4 P300
RESTORE_TOOLHEAD_SETTINGS KEY="home_x_sensorless"
[gcode_macro HOME_Y_SENSORLESS]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="home_y_sensorless"
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
M204 S1000
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endif %}
G4 P300
G28 Y
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].x_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].y_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current}
{% endif %}
G4 P300
RESTORE_TOOLHEAD_SETTINGS KEY="home_y_sensorless"
[gcode_macro _Z_HOP]
description = Move Z axis up by Z_HOP distance at Z_HOP_SPEED. In relative mode it will move Z axis up by Z_HOP distance. In absolute mode it will move Z axis to Z_HOP distance.
gcode =
{% set z_hop = printer.configfile.config.ratos_homing.z_hop|float %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
G0 Z{z_hop} F{z_hop_speed}
[gcode_macro _MOVE_TO_SAFE_Z_HOME]
description = Move to safe home position with optional Z_HOP (pass Z_HOP=True as parameter)
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% if params.Z_HOP is defined %}
_Z_HOP
{% endif %}
DEBUG_ECHO PREFIX="_MOVE_TO_SAFE_Z_HOME" MSG="axis_maximum.x: {printer.toolhead.axis_maximum.x}, axis_maximum.y: {printer.toolhead.axis_maximum.y}, bed_margin_x: {printer['gcode_macro RatOS'].bed_margin_x}, bed_margin_y: {printer['gcode_macro RatOS'].bed_margin_y}, safe_home_x: {safe_home_x}, safe_home_y: {safe_home_y}, printable_x_max: {printable_x_max}, printable_y_max: {printable_y_max}"
G0 X{safe_home_x} Y{safe_home_y} F{speed}
[gcode_macro MAYBE_HOME]
description = Only home unhomed axis
variable_is_kinematic_position_overriden = False
gcode =
{% if printer["gcode_macro MAYBE_HOME"].is_kinematic_position_overriden|lower == 'true' %}
RATOS_ECHO MSG="SET_CENTER_KINEMATIC_POSITION has been abused. Homing all axes. Please refrain from using SET_CENTER_KINEMATIC_POSITION outside of debugging purposes."
G28
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=False
{% else %}
{% set axes = '' %}
{% set isHomed = true %}
{% set axesToHome = '' %}
{% if params.X is defined %}
{% set axes = axes ~ 'X ' %}
{% if 'x' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'X ' %}
{% endif %}
{% endif %}
{% if params.Y is defined %}
{% set axes = axes ~ 'Y ' %}
{% if 'y' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Y ' %}
{% endif %}
{% endif %}
{% if params.Z is defined %}
{% set axes = axes ~ 'Z ' %}
{% if 'z' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Z ' %}
{% endif %}
{% endif %}
{% if params.X is not defined and params.Y is not defined and params.Z is not defined %}
{% set axes = '' %}
{% if 'x' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'X ' %}
{% endif %}
{% if 'y' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Y ' %}
{% endif %}
{% if 'z' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Z ' %}
{% endif %}
{% endif %}
{% if isHomed is false %}
RATOS_ECHO MSG="Homing {axesToHome}"
G28 {axesToHome}
{% else %}
RATOS_ECHO MSG="All requested axes already homed, skipping.."
{% endif %}
{% endif %}
[gcode_macro PID_CALIBRATE_HOTEND]
description = Perform a PID calibration test for a given extruder heater.
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set temp = params.TEMP|default(220)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_HOTEND" MSG="TEMP={temp}"
{% if printer["dual_carriage"] is not defined %}
RATOS_ECHO MSG="PID calibration hotend heater T0 at {temp}°C..."
PID_CALIBRATE HEATER=extruder TARGET={temp}
_CONSOLE_SAVE_CONFIG
{% else %}
{% if toolhead==0 or toolhead==1 %}
RATOS_ECHO MSG="PID calibration hotend heater T{toolhead} at {temp}°C..."
PID_CALIBRATE HEATER=extruder{'' if toolhead==0 else toolhead} TARGET={temp}
_CONSOLE_SAVE_CONFIG
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
_LEARN_MORE_CALIBRATION
[gcode_macro PID_CALIBRATE_BED]
description = Perform a PID calibration test for the bed heater.
gcode =
{% set temp = params.TEMP|default(80)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_BED" MSG="TEMP={temp}"
RATOS_ECHO MSG="PID calibration bed heater at {temp}°C..."
PID_CALIBRATE HEATER=heater_bed TARGET={temp}
_CONSOLE_SAVE_CONFIG
_LEARN_MORE_CALIBRATION
[gcode_macro PID_CALIBRATE_CHAMBER_HEATER]
description = Perform a PID calibration test for the chamber heater.
gcode =
{% set temp = params.TEMP|default(150)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_CHAMBER_HEATER" MSG="TEMP={temp}"
{% if printer["heater_generic chamber_heater"] is defined %}
RATOS_ECHO MSG="PID calibration chamber heater at {temp}°C..."
PID_CALIBRATE HEATER=chamber_heater TARGET={temp}
_CONSOLE_SAVE_CONFIG
_LEARN_MORE_CALIBRATION
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_heater" %}
{% set link_text = "RatOS Chamber Heater" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber heater found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro INITIALIZE_PA_TUNING]
description = Start a pressure advance tuning tower.
gcode =
{% set start = params.START|default(0.0)|float %}
{% set factor = params.FACTOR|default(0.001)|float %}
{% set layer_number = printer["gcode_macro _ON_LAYER_CHANGE"].layer_number|default(0)|int %}
{% set is_printing_gcode = true if printer["gcode_macro START_PRINT"].is_printing_gcode|default(true)|lower == 'true' else false %}
{% if is_printing_gcode and layer_number < 2 %}
DEBUG_ECHO PREFIX="START_PA_TOWER" MSG="START: {start}, FACTOR: {factor}"
RATOS_ECHO MSG="Starting presssure advance tuning tower..."
TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START={start} FACTOR={factor}
{% endif %}
_LEARN_MORE_CALIBRATION
[gcode_macro CHAMBER_FILTER_ON]
gcode =
{% if printer["fan_generic filter"] is defined %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Activating chamber filter..."
_CHAMBER_FILTER_TURN_ON
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber filter found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro CHAMBER_FILTER_OFF]
gcode =
{% if printer["fan_generic filter"] is defined %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Deactivating chamber filter..."
_CHAMBER_FILTER_TURN_OFF
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber filter found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro _CHAMBER_FILTER_ON]
gcode =
{% set at = params.AT|default('')|lower %}
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set chamber_filter_enable_at = printer["gcode_macro RatOS"].chamber_filter_enable_at|default('after_print_start')|lower %}
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_ON" MSG="at: {at}, chamber_filter_enable: {chamber_filter_enable}, chamber_filter_enable_at: {chamber_filter_enable_at}, chamber_filter_speed: {chamber_filter_speed}"
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if chamber_filter_enable_at == at %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Activating chamber filter..."
_CHAMBER_FILTER_TURN_ON AT={at}
{% if chamber_filter_enable_at == "print_end" %}
_LED_CHAMBER_FILTER_ON
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _CHAMBER_FILTER_OFF]
gcode =
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set filter_disable_period = printer["gcode_macro RatOS"].chamber_filter_disable_period|default(0)|int %}
{% set filter_disable_bed_temp = printer["gcode_macro RatOS"].chamber_filter_disable_bed_temp|default(0)|int %}
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_OFF" MSG="chamber_filter_enable: {chamber_filter_enable}, filter_disable_period: {filter_disable_period}, filter_disable_bed_temp: {filter_disable_bed_temp}"
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if filter_disable_period > 0 %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Waiting {filter_disable_period} seconds before turning chamber filter off..."
UPDATE_DELAYED_GCODE ID=_CHAMBER_FILTER_OFF_TIMER DURATION={filter_disable_period}
{% endif %}
{% if filter_disable_bed_temp > 0 %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Waiting for bed temp to cool down to {filter_disable_bed_temp}°C to turn filter off..."
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM=0 MAXIMUM={filter_disable_bed_temp}
_CHAMBER_FILTER_TURN_OFF
_LED_CHAMBER_FILTER_OFF
{% endif %}
{% endif %}
[delayed_gcode _CHAMBER_FILTER_OFF_TIMER]
gcode =
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_OFF_TIMER" MSG="executed"
_CHAMBER_FILTER_TURN_OFF
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Chamber filter turned off!"
_LED_CHAMBER_FILTER_OFF
[gcode_macro _CHAMBER_FILTER_TURN_ON]
gcode =
{% set at = params.AT|default('')|lower %}
{% set chamber_filter_speed = printer["gcode_macro RatOS"].chamber_filter_speed|default(0)|float %}
{% if at == "print_end" %}
{% set chamber_filter_speed = printer["gcode_macro RatOS"].chamber_filter_disable_speed|default(0)|float %}
{% endif %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_FILTER_OFF_TIMER DURATION=0
SET_FAN_SPEED FAN=filter SPEED={chamber_filter_speed}
[gcode_macro _CHAMBER_FILTER_TURN_OFF]
gcode =
SET_FAN_SPEED FAN=filter SPEED=0
[gcode_macro _CHAMBER_FILTER_SANITY_CHECK]
gcode =
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set filter_disable_period = printer["gcode_macro RatOS"].chamber_filter_disable_period|default(0)|int %}
{% set filter_disable_bed_temp = printer["gcode_macro RatOS"].chamber_filter_disable_bed_temp|default(0)|int %}
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if filter_disable_bed_temp > 0 and filter_disable_period > 0 %}
_LEARN_MORE_CHAMBER_FILTER
{action_respond_info("Wrong chamber filter options configured! Set 'filter_disable_bed_temp' or 'filter_disable_period' variable, not both.")}
{% endif %}
{% if filter_disable_bed_temp == 0 and filter_disable_period == 0 %}
_LEARN_MORE_CHAMBER_FILTER
{action_respond_info("Wrong chamber filter options configured! Set 'filter_disable_bed_temp' or 'filter_disable_period' variable.")}
{% endif %}
{% endif %}
[gcode_macro CHAMBER_HEATER_ON]
gcode =
{% set chamber_temp = params.CHAMBER_TEMP|default(45)|int %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp} IS_FROM_START_PRINT=False
[gcode_macro CHAMBER_HEATER_OFF]
gcode =
_CHAMBER_HEATER_OFF
[gcode_macro _CHAMBER_HEATER_ON]
variable_chamber_temp = 0
gcode =
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set start_chamber_temp = params.START_CHAMBER_TEMP|default(0)|int %}
{% set is_from_start_print = true if params.IS_FROM_START_PRINT|default(True)|lower == 'true' else false %}
{% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set chamber_heater_enable = true if printer["gcode_macro RatOS"].chamber_heater_enable|default(true)|lower == 'true' else false %}
{% set chamber_heater_bed_temp = printer["gcode_macro RatOS"].chamber_heater_bed_temp|default(115)|int %}
{% set chamber_heater_preheating_temp = printer["gcode_macro RatOS"].chamber_heater_preheating_temp|default(150)|int %}
{% set chamber_heater_heating_temp_offset = printer["gcode_macro RatOS"].chamber_heater_heating_temp_offset|default(20)|int %}
{% set chamber_heater_control_external_heater = true if printer["gcode_macro RatOS"].chamber_heater_control_external_heater|default(true)|lower == 'true' else false %}
{% set chamber_heater_air_circulation_enable = true if printer["gcode_macro RatOS"].chamber_heater_air_circulation_enable|default(true)|lower == 'true' else false %}
{% set chamber_heater_air_circulation_fan_speed = printer["gcode_macro RatOS"].chamber_heater_air_circulation_fan_speed|default(0.35)|float %}
{% set chamber_heater_air_circulation_y_pos = printer["gcode_macro RatOS"].chamber_heater_air_circulation_y_pos|default(0)|float %}
{% set chamber_heater_air_circulation_z_pos = printer["gcode_macro RatOS"].chamber_heater_air_circulation_z_pos|default(100)|float %}
DEBUG_ECHO PREFIX="_CHAMBER_HEATER_ON" MSG="chamber_heater_enable: {chamber_heater_enable}, chamber_heater_preheating_temp: {chamber_heater_preheating_temp}, chamber_heater_heating_temp_offset: {chamber_heater_heating_temp_offset}, bed_temp: {bed_temp}, chamber_temp: {chamber_temp}, start_chamber_temp: {start_chamber_temp}"
{% if chamber_heater_enable and chamber_temp > 0 and chamber_heater_bed_temp > 0 %}
_LED_HEATING
RATOS_ECHO MSG="Preheating chamber to {(start_chamber_temp if start_chamber_temp > 0 else chamber_temp)}°C..."
{% set chamber_temp_sensor = "extruder" %}
{% if printer["dual_carriage"] is defined and default_toolhead == 1 %}
{% set chamber_temp_sensor = "extruder1" %}
{% endif %}
{% if printer["temperature_sensor chamber"] is defined %}
{% set chamber_temp_sensor = "temperature_sensor chamber" %}
{% endif %}
{% set current_chamber_temp = printer['%s' % chamber_temp_sensor].temperature|int %}
{% set needs_heating = current_chamber_temp < (start_chamber_temp if start_chamber_temp > 0 else chamber_temp) %}
{% if needs_heating %}
_USER_CHAMBER_HEATER_BEFORE_PREHEATING
{% endif %}
{% if needs_heating %}
{% if chamber_heater_air_circulation_enable and chamber_heater_air_circulation_fan_speed > 0 %}
{% if not is_from_start_print %}
MAYBE_HOME
{% endif %}
G0 Z{chamber_heater_air_circulation_z_pos} F{z_speed}
G0 Y{chamber_heater_air_circulation_y_pos} F{speed}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={chamber_heater_air_circulation_fan_speed if default_toolhead == 0 else 0}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={chamber_heater_air_circulation_fan_speed if default_toolhead == 1 else 0}
{% else %}
M106 S{(255 * chamber_heater_air_circulation_fan_speed)}
{% endif %}
{% else %}
{% if is_from_start_print %}
G0 Z{z} F{z_speed}
{% endif %}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=_CHAMBER_HEATER_ON VARIABLE=chamber_temp VALUE={chamber_temp}
{% if needs_heating %}
M140 S{chamber_heater_bed_temp}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={chamber_heater_preheating_temp}
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=1.0
{% endif %}
{% endif %}
{% if needs_heating %}
_CHAMBER_HEATER_EXTRA_FAN_ON
{% endif %}
{% if needs_heating %}
TEMPERATURE_WAIT SENSOR="{chamber_temp_sensor}" MINIMUM={(start_chamber_temp if start_chamber_temp > 0 else chamber_temp)}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={(chamber_temp + chamber_heater_heating_temp_offset)}
{% endif %}
{% endif %}
{% if printer["fan_generic filter"] is defined %}
{% if printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float > 0 %}
SET_FAN_SPEED FAN=filter SPEED=0
_CHAMBER_FILTER_ON AT="before_print_start"
{% endif %}
{% endif %}
{% if needs_heating %}
{% if chamber_heater_air_circulation_enable and chamber_heater_air_circulation_fan_speed > 0 %}
G28 Z
{% endif %}
{% endif %}
{% if needs_heating %}
_USER_CHAMBER_HEATER_AFTER_PREHEATING
{% endif %}
{% if printer["temperature_sensor chamber"] is defined %}
{% if printer["heater_generic chamber_heater"] is defined %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined and chamber_heater_control_external_heater %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED=0
SET_FAN_SPEED FAN=part_fan_t1 SPEED=0
{% else %}
M106 S0
{% endif %}
_LED_SUCCESS
{% endif %}
[gcode_macro _CHAMBER_HEATER_OFF]
gcode =
RATOS_ECHO MSG="Deactivating chamber heater..."
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=0
SET_GCODE_VARIABLE MACRO=_CHAMBER_HEATER_ON VARIABLE=chamber_temp VALUE=0
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=0
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=0.0
{% endif %}
_CHAMBER_HEATER_EXTRA_FAN_OFF
[delayed_gcode _CHAMBER_HEATER_CONTROL]
initial_duration = 0.
gcode =
{% set chamber_temp = printer["gcode_macro _CHAMBER_HEATER_ON"].chamber_temp|default(0)|int %}
{% set chamber_heater_heating_temp_offset = printer["gcode_macro RatOS"].chamber_heater_heating_temp_offset|default(20)|int %}
{% set current_chamber_temp = printer['temperature_sensor chamber'].temperature|int %}
{% if current_chamber_temp < chamber_temp %}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={(chamber_temp + chamber_heater_heating_temp_offset)}
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=1.0
{% endif %}
{% endif %}
{% if current_chamber_temp >= chamber_temp %}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=0
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=0.0
{% endif %}
{% endif %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
[gcode_macro _CHAMBER_HEATER_EXTRA_FAN_ON]
gcode =
{% set chamber_heater_extra_fan_speed = printer["gcode_macro RatOS"].chamber_heater_extra_fan_speed|default(0.0)|float %}
{% if printer["fan_generic chamber_heater_extra_fan"] is defined %}
{% if chamber_heater_extra_fan_speed > 0 %}
SET_FAN_SPEED FAN=chamber_heater_extra_fan SPEED={chamber_heater_extra_fan_speed}
{% endif %}
{% endif %}
[gcode_macro _CHAMBER_HEATER_EXTRA_FAN_OFF]
gcode =
{% if printer["fan_generic chamber_heater_extra_fan"] is defined %}
SET_FAN_SPEED FAN=chamber_heater_extra_fan SPEED=0
{% endif %}
[gcode_macro _USER_CHAMBER_HEATER_BEFORE_PREHEATING]
description = Will be executed before chamber preheating, only if heating is needed.
gcode =
[gcode_macro _USER_CHAMBER_HEATER_AFTER_PREHEATING]
description = Will be executed after chamber preheating, only if heating was needed.
gcode =
[gcode_macro _LED_START_PRINTING]
gcode =
_LED_ACTION
[gcode_macro _LED_START_PRINTING_ERROR]
gcode =
_LED_ERROR
[gcode_macro _LED_PRINTING]
gcode =
_LED_ON TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_PAUSE]
gcode =
_LED_ACTION
[gcode_macro _LED_CHAMBER_FILTER_ON]
gcode =
_LED_ACTION
[gcode_macro _LED_CHAMBER_FILTER_OFF]
gcode =
_LED_STANDBY
[gcode_macro _LED_LOADING_FILAMENT]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_LOADED]
gcode =
_LED_SUCCESS TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_RUNOUT]
gcode =
_LED_ERROR TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_CLOG]
gcode =
_LED_ERROR TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_UNLOADING_FILAMENT]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_UNLOADED]
gcode =
_LED_SUCCESS TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_DEACTIVATE_TOOLHEAD]
gcode =
_LED_OFF TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_TOOLHEAD_STANDBY]
gcode =
_LED_STANDBY TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_TOOLHEAD_WAKEUP]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_MOTORS_OFF]
gcode =
_LED_STANDBY
_LED_VAOC_OFF
[gcode_macro _LED_INPUT_SHAPER_START]
gcode =
_LED_ACTION
[gcode_macro _LED_INPUT_SHAPER_END]
gcode =
_LED_ON
[gcode_macro _LED_BEACON_CALIBRATION_START]
gcode =
_LED_ACTION
[gcode_macro _LED_BEACON_CALIBRATION_END]
gcode =
_LED_ON
[gcode_macro _LED_BEACON_CALIBRATION_ERROR]
gcode =
_LED_ERROR
[gcode_macro _LED_VAOC_ON]
gcode =
{% if printer['neopixel vaoc_led'] is defined %}
SET_LED LED=vaoc_led RED=1.0 GREEN=1.0 BLUE=1.0
{% endif %}
[gcode_macro _LED_VAOC_OFF]
gcode =
{% if printer['neopixel vaoc_led'] is defined %}
SET_LED LED=vaoc_led RED=0.0 GREEN=0.0 BLUE=0.0
{% endif %}
[gcode_macro _LED_ACTION]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_action %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_SUCCESS]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_success %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_HEATING]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_heating %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_COOLING]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_cooling %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_ERROR]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_error %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_ON]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_on %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_OFF]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_off %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_STANDBY]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_standby %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_SET]
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set r = params.R|default(0)|float %}
{% set g = params.G|default(0)|float %}
{% set b = params.B|default(0)|float %}
{% if toolhead >= 0 %}
{% if printer['neopixel nozzle_led_t%s' % toolhead] is defined %}
SET_LED LED={'nozzle_led_t%s' % toolhead} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% else %}
{% if printer['neopixel nozzle_led_t0'] is defined %}
SET_LED LED={'nozzle_led_t0'} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% if printer['neopixel nozzle_led_t1'] is defined %}
SET_LED LED={'nozzle_led_t1'} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% endif %}
_USER_LED_SET { rawparams }
[gcode_macro _USER_LED_SET]
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set r = params.R|default(0)|float %}
{% set g = params.G|default(0)|float %}
{% set b = params.B|default(0)|float %}
[gcode_macro LOAD_FILAMENT]
description = Loads new filament. Note: be careful with PETG, make sure you inspect the tip of your filament before loading to avoid jams.
variable_ignore_min_extrude_temp = True
gcode =
_LEARN_MORE_FILAMENT
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set filament_name = params._NAME|default('')|string %}
{% set filament_type = params._TYPE|default('')|string %}
{% if filament_name == '' or filament_type == '' %}
{% set filament_name = 'unknown' %}
{% set filament_type = 'unknown' %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
_DEFAULT_LOAD_FILAMENT TEMP={temp} NAME={filament_name} TYPE={filament_type}
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Loading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead==0 or toolhead==1 %}
_IDEX_LOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead} NAME={filament_name} TYPE={filament_type}
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
[gcode_macro _DEFAULT_LOAD_FILAMENT]
description = Load filament macro for non IDEX printers.
gcode =
{% set temp = params.TEMP|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_DEFAULT_LOAD_FILAMENT" MSG="TEMP={temp}"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
_LED_LOADING_FILAMENT TOOLHEAD=0
SAVE_GCODE_STATE NAME=load_state
{% if printer.extruder.temperature|int < temp or printer.extruder.can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating extruder to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={temp}
_LOAD_FILAMENT TOOLHEAD=0
RESTORE_GCODE_STATE NAME=load_state
{% if filament_name != '' and filament_type != '' %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('{filament_type}', '{filament_name}', {temp})"
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={temp}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
_LED_FILAMENT_LOADED TOOLHEAD=0
[gcode_macro _IDEX_LOAD_FILAMENT]
description = Load filament macro for IDEX printer.
gcode =
{% set temp = params.TEMP|int %}
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_IDEX_LOAD_FILAMENT" MSG="TEMP: {temp}, TOOLHEAD: {toolhead}"
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_LOADING_FILAMENT TOOLHEAD={toolhead}
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
{% if not printer.pause_resume.is_paused %}
{% if printer[target_extruder].temperature|int < temp or printer[target_extruder].can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating T{toolhead} to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={temp}
{% endif %}
_LOAD_FILAMENT TOOLHEAD={toolhead} TEMP={temp}
{% if filament_name != '' and filament_type != '' %}
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('{filament_type}', '{filament_name}', {temp})"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='"{filament_name}"'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='"{filament_type}"'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE={temp}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_ok}"'
_LED_FILAMENT_LOADED TOOLHEAD={toolhead}
[gcode_macro _LOAD_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT" MSG="TOOLHEAD: {toolhead}"
_MOVE_TO_LOADING_POSITION TOOLHEAD={toolhead}
_LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE TOOLHEAD={toolhead}
_LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE TOOLHEAD={toolhead}
_CLEANING_MOVE TOOLHEAD={toolhead}
[gcode_macro _LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set extruder_load_speed = printer["gcode_macro T%s" % toolhead].extruder_load_speed|float * 60 %}
{% set extruder_gear_to_cooling_position_distance = printer["gcode_macro T%s" % toolhead].extruder_gear_to_cooling_position_distance|float %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Loading filament into hotend.."
G92 E0
G0 E{extruder_gear_to_cooling_position_distance} F{extruder_load_speed}
G92 E0
M400
RATOS_ECHO MSG="Filament loaded into hotend."
[gcode_macro _LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set load_speed = printer["gcode_macro T%s" % toolhead].filament_load_speed|float * 60 %}
{% set filament_loading_nozzle_offset = printer["gcode_macro T%s" % toolhead].filament_loading_nozzle_offset|float %}
{% set cooling_position_to_nozzle_distance = printer["gcode_macro T%s" % toolhead].cooling_position_to_nozzle_distance|float %}
{% set purge_after_load = printer["gcode_macro T%s" % toolhead].purge_after_load|float %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Loading filament into nozzle... Please wait!"
G92 E0
G0 E{cooling_position_to_nozzle_distance + filament_loading_nozzle_offset} F{load_speed}
G92 E0
G4 P1000
_PURGE_FILAMENT TOOLHEAD={toolhead} E={purge_after_load}
RATOS_ECHO MSG="Filament loaded into nozzle!"
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_INSERT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_INSERT" MSG="TOOLHEAD: {toolhead}"
{% set filament_grabbing_length = printer["gcode_macro T%s" % toolhead].filament_grabbing_length|float %}
{% set filament_grabbing_speed = printer["gcode_macro T%s" % toolhead].filament_grabbing_speed|float %}
{% set resume_after_insert = true if printer["gcode_macro T%s" % toolhead].resume_after_insert|default(true)|lower == 'true' else false %}
{% set enable_insert_detection = true if printer["gcode_macro T%s" % toolhead].enable_insert_detection|default(true)|lower == 'true' else false %}
{% set current_idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% if enable_insert_detection %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_INSERT" MSG="toolhead: {toolhead}, filament_grabbing_length: {filament_grabbing_length}, filament_grabbing_speed: {filament_grabbing_speed}, current_idex_mode: {current_idex_mode}"
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Loading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
FORCE_MOVE STEPPER={'extruder%s' % ('' if toolhead == 0 else toolhead)} DISTANCE={filament_grabbing_length} VELOCITY={filament_grabbing_speed}
M400
{% if printer.pause_resume.is_paused %}
LOAD_FILAMENT TOOLHEAD={toolhead}
{% if resume_after_insert %}
RESUME
{% endif %}
{% else %}
{% if not printer.virtual_sdcard.is_active %}
LOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_INSERT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_INSERT" MSG="TOOLHEAD: {toolhead}"
[gcode_macro _PURGE_BEFORE_UNLOAD]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set purge_before_unload = printer["gcode_macro T%s" % toolhead].purge_before_unload|float %}
DEBUG_ECHO PREFIX="_PURGE_BEFORE_UNLOAD" MSG="TOOLHEAD: {toolhead}"
{% if purge_before_unload > 0 %}
G92 E0
G0 E{purge_before_unload} F300
G92 E0
M400
{% endif %}
[gcode_macro _PURGE_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set e = params.E|int %}
{% set r = params.R|default(0)|int %}
DEBUG_ECHO PREFIX="_PURGE_FILAMENT" MSG="TOOLHEAD: {toolhead}, E: {e}"
{% if e > 0 %}
G92 E0
G0 E{e} F300
G92 E0
M400
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={0.4 if toolhead == 0 else 0}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={0.4 if toolhead == 1 else 0}
{% else %}
M106 S{(255 * 0.4)}
{% endif %}
{% endif %}
G4 P3000
{% if r > 0 %}
G92 E0
G0 E-{r} F300
G92 E0
M400
{% endif %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED=0
SET_FAN_SPEED FAN=part_fan_t1 SPEED=0
{% else %}
M106 S0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _MOVE_TO_PARKING_POSITION]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_MOVE_TO_PARKING_POSITION" MSG="TOOLHEAD: {toolhead}"
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].parking_position is defined %}
{% set parking_position = printer["gcode_macro T%s" % toolhead].parking_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
G1 X{parking_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _MOVE_TO_LOADING_POSITION]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_MOVE_TO_LOADING_POSITION" MSG="TOOLHEAD: {toolhead}"
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].loading_position is defined %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% set act_t = 1 if idex_mode == 'primary' else 0 %}
{% if act_t == toolhead %}
{% set loading_position = printer["gcode_macro T%s" % toolhead].loading_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
G1 X{loading_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _CLEANING_MOVE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].parking_position is defined and printer["gcode_macro T%s" % toolhead].loading_position is defined %}
{% set loading_position = printer["gcode_macro T%s" % toolhead].loading_position|float %}
{% set parking_position = printer["gcode_macro T%s" % toolhead].parking_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
{% set cleaning_position = loading_position %}
{% if loading_position == parking_position %}
{% if loading_position > 0 %}
{% set cleaning_position = loading_position - 30 %}
{% else %}
{% set cleaning_position = loading_position + 30 %}
{% endif %}
{% endif %}
G1 X{parking_position} F{speed}
G1 X{cleaning_position} F{speed}
G1 X{parking_position} F{speed}
G1 X{cleaning_position} F{speed}
G1 X{parking_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _START_PRINT_BED_MESH]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="start_print_bed_mesh"
SET_MACRO_TRAVEL_SETTINGS
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set X=[params.X0|default(-1)|float, params.X1|default(-1)|float] %}
{% set Y=[params.Y0|default(-1)|float, params.Y1|default(-1)|float] %}
DEBUG_ECHO PREFIX="_START_PRINT_BED_MESH" MSG="idex_mode: {idex_mode}, X: {X}, Y: {Y}"
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set X=[0, printable_x_max] %}
{% endif %}
{% set beacon_bed_mesh_scv = printer["gcode_macro RatOS"].beacon_bed_mesh_scv|default(25)|int %}
{% set beacon_contact_bed_mesh_samples = printer["gcode_macro RatOS"].beacon_contact_bed_mesh_samples|default(2)|int %}
{% set beacon_contact_bed_mesh = true if printer["gcode_macro RatOS"].beacon_contact_bed_mesh|default(false)|lower == 'true' else false %}
{% if printer.configfile.settings.beacon is defined and not beacon_contact_bed_mesh %}
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={beacon_bed_mesh_scv}
{% endif %}
{% set default_profile = printer["gcode_macro RatOS"].bed_mesh_profile|default('ratos') %}
{% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %}
BED_MESH_CLEAR
{% if printer["gcode_macro RatOS"].adaptive_mesh|lower == 'true' %}
CALIBRATE_ADAPTIVE_MESH PROFILE={default_profile} X0={X[0]} X1={X[1]} Y0={Y[0]} Y1={Y[1]} T={params.T|int} BOTH_TOOLHEADS={params.BOTH_TOOLHEADS} IDEX_MODE={idex_mode}
{% else %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% endif %}
BED_MESH_PROFILE LOAD={default_profile}
{% elif printer["gcode_macro RatOS"].bed_mesh_profile is defined %}
BED_MESH_CLEAR
BED_MESH_PROFILE LOAD={printer["gcode_macro RatOS"].bed_mesh_profile}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print_bed_mesh"
[gcode_macro CALIBRATE_ADAPTIVE_MESH]
gcode =
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_bed_mesh_samples = printer["gcode_macro RatOS"].beacon_contact_bed_mesh_samples|default(2)|int %}
{% set beacon_contact_bed_mesh = true if printer["gcode_macro RatOS"].beacon_contact_bed_mesh|default(false)|lower == 'true' else false %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set default_profile = params.PROFILE %}
{% set x0 = params.X0|default(-1)|float %}
{% set y0 = params.Y0|default(-1)|float %}
{% set x1 = params.X1|default(-1)|float %}
{% set y1 = params.Y1|default(-1)|float %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Recieved coordinates X0={x0} Y0={y0} X1={x1} Y1={y1}"
{% if x0 >= x1 or y0 >= y1 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Invalid coordinates received. Please check your slicer settings. Falling back to full bed mesh."
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% else %}
{% set mesh_config = printer.configfile.config.bed_mesh %}
{% set min_x = mesh_config.mesh_min.split(",")[0]|float %}
{% set min_y = mesh_config.mesh_min.split(",")[1]|float %}
{% set max_x = mesh_config.mesh_max.split(",")[0]|float %}
{% set max_y = mesh_config.mesh_max.split(",")[1]|float %}
{% set mesh_x0 = [[x0, max_x]|min, min_x]|max %}
{% set mesh_y0 = [[y0, max_y]|min, min_y]|max %}
{% set mesh_x1 = [[x1, max_x]|min, min_x]|max %}
{% set mesh_y1 = [[y1, max_y]|min, min_y]|max %}
{% if mesh_x0 == min_x and mesh_y0 == min_y and mesh_x1 == max_x and mesh_y1 == max_y %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Print is using the full bed, falling back to full bed mesh."
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% else %}
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
DEPLOY_PROBE
{% endif %}
{% set probe_count_x = mesh_config.probe_count.split(",")[0]|int %}
{% if mesh_config.probe_count.split(",")|length == 2 %}
{% set probe_count_y = mesh_config.probe_count.split(",")[1]|int %}
{% else %}
{% set probe_count_y = mesh_config.probe_count.split(",")[0]|int %}
{% endif %}
{% set probe_x_step = (max_x - min_x) / probe_count_x %}
{% set probe_y_step = (max_y - min_y) / probe_count_y %}
{% set mesh_count_x = ([(mesh_x1 - mesh_x0) / probe_x_step, 3]|max)|int %}
{% set mesh_count_y = ([(mesh_y1 - mesh_y0) / probe_y_step, 3]|max)|int %}
{% set min_mesh_count = [mesh_count_x, mesh_count_y]|min %}
{% set max_mesh_count = [mesh_count_x, mesh_count_y]|max %}
{% set algorithm = mesh_config.algorithm %}
{% if algorithm|lower == 'lagrange' and max_mesh_count > 6 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="cannot exceed a probe_count of 6 when using lagrange interpolation. Falling back to bicubic interpolation."
{% set algorithm = 'bicubic' %}
{% endif %}
{% if algorithm|lower == 'bicubic' and min_mesh_count < 4 %}
{% if max_mesh_count > 6 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="invalid probe_count option when using bicubic interpolation. Combination of 3 points on one axis with more than 6 on another is not permitted. Forcing minimum mesh count to be 4."
{% set min_mesh_count = 4 %}
{% else %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="bicubic interpolation with a probe_count of less than 4 points detected. Forcing lagrange interpolation."
{% set algorithm = 'lagrange' %}
{% endif %}
{% endif %}
{% set mesh_count_x = ([min_mesh_count, mesh_count_x]|max)|int %}
{% set mesh_count_x = ([max_mesh_count, mesh_count_x]|min)|int %}
{% set mesh_count_y = ([min_mesh_count, mesh_count_y]|max)|int %}
{% set mesh_count_y = ([max_mesh_count, mesh_count_y]|min)|int %}
{% set should_prime = printer["gcode_macro RatOS"].nozzle_priming == 'primeblob' %}
{% if printer["dual_carriage"] is not defined %}
{% set probe_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printable_y_max) < printable_y_max / 2 %}
{% else %}
{% set probe_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printable_y_max) < printable_y_max / 2 %}
{% endif %}
{% if printer.configfile.settings.beacon is defined and printer.configfile.settings.beacon.mesh_runs % 2 != 0 and probe_first %}
{% set probe_first = false %}
{% elif printer.configfile.settings.beacon is defined and printer.configfile.settings.beacon.mesh_runs % 2 == 0 and not probe_first %}
{% set probe_first = true %}
{% endif %}
{% if should_prime and probe_first %}
{% if printer["dual_carriage"] is not defined %}
PROBE_FOR_PRIMING
{% else %}
{% if both_toolheads %}
PROBE_FOR_PRIMING TOOLHEAD=0 IDEX_MODE={idex_mode}
PROBE_FOR_PRIMING TOOLHEAD=1 IDEX_MODE={idex_mode}
{% else %}
PROBE_FOR_PRIMING TOOLHEAD={params.T|int} IDEX_MODE={idex_mode}
{% endif %}
{% endif %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="mesh coordinates X0={mesh_x0} Y0={mesh_y0} X1={mesh_x1} Y1={mesh_y1}"
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile} ALGORITHM={algorithm} MESH_MIN={mesh_x0},{mesh_y0} MESH_MAX={mesh_x1},{mesh_y1} PROBE_COUNT={mesh_count_x},{mesh_count_y} RELATIVE_REFERENCE_INDEX=-1
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile} ALGORITHM={algorithm} MESH_MIN={mesh_x0},{mesh_y0} MESH_MAX={mesh_x1},{mesh_y1} PROBE_COUNT={mesh_count_x},{mesh_count_y} RELATIVE_REFERENCE_INDEX=-1
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% if should_prime and not probe_first %}
{% if printer["dual_carriage"] is not defined %}
PROBE_FOR_PRIMING
{% else %}
{% if both_toolheads %}
PROBE_FOR_PRIMING TOOLHEAD=0 IDEX_MODE={idex_mode}
PROBE_FOR_PRIMING TOOLHEAD=1 IDEX_MODE={idex_mode}
{% else %}
PROBE_FOR_PRIMING TOOLHEAD={params.T|int} IDEX_MODE={idex_mode}
{% endif %}
{% endif %}
{% endif %}
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
STOW_PROBE
{% endif %}
{% endif %}
{% endif %}
[gcode_macro M84]
rename_existing = M84.1
gcode =
M84.1
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
{% if printer["dual_carriage"] is defined %}
_SET_TOOLHEAD_OFFSET T={printer["gcode_macro RatOS"].default_toolhead|int} MOVE=0
SET_GCODE_VARIABLE MACRO=SET_PRESSURE_ADVANCE VARIABLE=snyc_toolheads VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_REMAP_TOOLHEADS VARIABLE=enabled VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% if printer["gcode_macro _VAOC"] is defined %}
SET_GCODE_VARIABLE MACRO=_VAOC VARIABLE=is_started VALUE=False
SET_GCODE_VARIABLE MACRO=_VAOC VARIABLE=is_started_at_temp VALUE=False
{% endif %}
SET_GCODE_OFFSET X=0 Y=0 Z=0 MOVE=0
_IDEX_SINGLE INIT=1
{% endif %}
SET_SKEW CLEAR=1
_LED_MOTORS_OFF
[gcode_macro M104]
rename_existing = M104.1
gcode =
{% set s = params.S|default(0)|int %}
{% set t = params.T|default(-1)|int %}
{% set t = 0 if t == -1 else t %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
DEBUG_ECHO PREFIX="M104" MSG="s: {s}, t: {t}"
{% if printer["gcode_macro T%s" % t] is defined %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set temperature_offset_t0 = printer["gcode_macro T0"].temperature_offset|default(0)|int %}
{% set temperature_offset_t1 = printer["gcode_macro T1"].temperature_offset|default(0)|int %}
{% set s0 = [s + temperature_offset_t0, 0]|max %}
{% set s1 = [s + temperature_offset_t1, 0]|max %}
{% if temperature_offset_t0 != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset_t0}°C added to toolhead T0."
{% endif %}
{% if temperature_offset_t1 != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset_t1}°C added to toolhead T1."
{% endif %}
{% else %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set s = [s + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
{% set is_in_standby = false %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% if toolchange_standby_temp > -1 %}
{% set is_in_standby = true if printer["gcode_macro T%s" % t].standby|default(false)|lower == 'true' else false %}
{% endif %}
{% endif %}
{% if not is_in_standby %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
M104.1 S{s0} T0
M104.1 S{s1} T1
{% else %}
M104.1 S{s} T{t}
{% endif %}
{% endif %}
[gcode_macro M109]
rename_existing = M109.1
gcode =
{% set s = params.S|default(0)|int %}
{% set t = params.T|default(-1)|int %}
{% set t = 0 if t == -1 else t %}
DEBUG_ECHO PREFIX="M109" MSG="s: {s}, t: {t}"
{% if printer["gcode_macro T%s" % t] is defined %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set s = [s + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="M109" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% set is_in_standby = false %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% if toolchange_standby_temp > -1 %}
{% set is_in_standby = true if printer["gcode_macro T%s" % t].standby|default(false)|lower == 'true' else false %}
{% endif %}
{% endif %}
{% if not is_in_standby %}
M109.1 S{s} T{t}
{% endif %}
[gcode_macro SET_HEATER_TEMPERATURE]
rename_existing = SET_HEATER_TEMPERATURE_BASE
gcode =
{% set heater = params.HEATER|default("") %}
{% set target = params.TARGET|default(0)|int %}
DEBUG_ECHO PREFIX="SET_HEATER_TEMPERATURE" MSG="heater: {heater}, target: {target}"
{% if heater|lower == "extruder" or heater|lower == "extruder1" %}
{% set t = 0 if heater|lower == "extruder" else 1 %}
{% if printer["gcode_macro T%s" % t] is defined and target > 0 %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set target = [target + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="SET_HEATER_TEMPERATURE" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
SET_HEATER_TEMPERATURE_BASE HEATER="{heater}" TARGET={target}
[gcode_macro TEMPERATURE_WAIT]
rename_existing = TEMPERATURE_WAIT_BASE
gcode =
{% set sensor = params.SENSOR|default("") %}
{% set minimum = params.MINIMUM|default(-1)|int %}
{% set maximum = params.MAXIMUM|default(-1)|int %}
DEBUG_ECHO PREFIX="TEMPERATURE_WAIT" MSG="sensor: {sensor}, minimum: {minimum}, maximum: {maximum}"
{% if sensor|lower == "extruder" or sensor|lower == "extruder1" %}
{% set t = 0 if sensor|lower == "extruder" else 1 %}
{% if printer["gcode_macro T%s" % t] is defined and (minimum > 0 or maximum > 0) %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% if minimum > -1 %}
{% set minimum = [minimum + temperature_offset, 0]|max %}
{% endif %}
{% if maximum > -1 %}
{% set maximum = [maximum + temperature_offset, 0]|max %}
{% endif %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
{% if minimum > -1 and maximum > -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MINIMUM: {minimum}, MAXIMUM: {maximum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MINIMUM={minimum} MAXIMUM={maximum}
{% elif minimum > -1 and maximum == -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MINIMUM: {minimum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MINIMUM={minimum}
{% elif minimum == -1 and maximum > -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MAXIMUM: {maximum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MAXIMUM={maximum}
{% endif %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Temperature for toolhead T{t} reached."
[gcode_macro SET_GCODE_OFFSET]
rename_existing = SET_GCODE_OFFSET_ORG
gcode =
SET_GCODE_OFFSET_ORG { rawparams }
{% if printer.configfile.settings.beacon is defined and (params.Z_ADJUST is defined or params.Z is defined) %}
_BEACON_APPLY_RUNTIME_MULTIPLIER
{% endif %}
[gcode_macro SDCARD_PRINT_FILE]
rename_existing = SDCARD_PRINT_FILE_BASE
gcode =
{% if printer["ratos"] is defined %}
PROCESS_GCODE_FILE { rawparams }
{% else %}
SDCARD_PRINT_FILE_BASE { rawparams }
{% endif %}
[gcode_macro SKEW_PROFILE]
rename_existing = SKEW_PROFILE_BASE
variable_loaded_profile = ""
gcode =
{% if params.LOAD is defined %}
{% if printer.configfile.settings["skew_correction %s" % params.LOAD] is defined %}
SET_GCODE_VARIABLE MACRO=SKEW_PROFILE VARIABLE=loaded_profile VALUE='"{params.LOAD}"'
{% endif %}
{% endif %}
SKEW_PROFILE_BASE { rawparams }
[gcode_macro SET_SKEW]
rename_existing = SET_SKEW_BASE
gcode =
{% if params.CLEAR is defined %}
{% if params.CLEAR|default(0)|int == 1 %}
SET_GCODE_VARIABLE MACRO=SKEW_PROFILE VARIABLE=loaded_profile VALUE='""'
{% endif %}
{% endif %}
SET_SKEW_BASE { rawparams }
[gcode_macro SET_VELOCITY_LIMIT]
rename_existing = SET_VELOCITY_LIMIT_BASE
gcode =
{% if params.ACCEL_TO_DECEL is defined %}
{% if params.ACCEL is defined %}
{% set accel = params.ACCEL|float %}
{% else %}
{% set accel = printer.toolhead.max_accel|float %}
{% endif %}
{% if params.VELOCITY is defined %}
{% set velocity = params.VELOCITY|float %}
{% else %}
{% set velocity = printer.toolhead.max_velocity|float %}
{% endif %}
{% if params.SQUARE_CORNER_VELOCITY is defined %}
{% set scv = params.SQUARE_CORNER_VELOCITY|float %}
{% else %}
{% set scv = printer.toolhead.square_corner_velocity|float %}
{% endif %}
{% set mcr = params.ACCEL_TO_DECEL|float / accel %}
DEBUG_ECHO PREFIX="SET_VELOCITY_LIMIT" MSG="ACCEL={accel}, VELOCITY={velocity}, SQUARE_CORNER_VELOCITY={scv}, MINIMUM_CRUISE_RATIO={mcr}"
SET_VELOCITY_LIMIT_BASE ACCEL={accel} VELOCITY={velocity} SQUARE_CORNER_VELOCITY={scv} MINIMUM_CRUISE_RATIO={1-mcr}
{% else %}
SET_VELOCITY_LIMIT_BASE { rawparams }
{% endif %}
[gcode_macro _START_PRINT_PARK]
gcode =
{% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set start_print_park_in = printer["gcode_macro RatOS"].start_print_park_in %}
{% set start_print_park_x = printer["gcode_macro RatOS"].start_print_park_x %}
{% if start_print_park_in == 'primeblob' %}
{% set z = 3 %}
{% endif %}
{% if printer["dual_carriage"] is defined and not (printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
{% if printer["gcode_macro RatOS"].start_print_park_x is defined and printer["gcode_macro RatOS"].start_print_park_x != '' %}
RATOS_ECHO PREFIX="WARNING" MSG="start_print_park_x is ignored for IDEX printers"
{% endif %}
PARK_TOOLHEAD
G90
{% endif %}
_PARK LOCATION={start_print_park_in} X={start_print_park_x}
G0 Z{z} F{z_speed}
[gcode_macro _END_PRINT_PARK]
gcode =
{% if printer["dual_carriage"] is defined %}
{% if printer["gcode_macro RatOS"].end_print_park_x is defined and printer["gcode_macro RatOS"].end_print_park_x != '' %}
RATOS_ECHO PREFIX="WARNING" MSG="end_print_park_x is ignored for IDEX printers"
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
_IDEX_SINGLE X={parking_position}
PARK_TOOLHEAD
G90
{% endif %}
_PARK LOCATION={printer["gcode_macro RatOS"].end_print_park_in} X={printer["gcode_macro RatOS"].end_print_park_x}
[gcode_macro _PARK]
gcode =
{% set x = params.X %}
{% set location = params.LOCATION|default('back')|lower %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% set nozzle_priming = printer["gcode_macro RatOS"].nozzle_priming|lower %}
CACHE_TOOLHEAD_SETTINGS KEY="park"
SET_MACRO_TRAVEL_SETTINGS
{% if x != '' %}
{% if x|float >= printer.toolhead.axis_minimum.x + 5 and x|float <= printable_x_max - 5 %}
{% set park_x = x|float %}
{% else %}
{action_respond_info('The requested X co-ordinate is outside the defined axis bounds - using defaults')}
{% set park_x = printable_x_max / 2 %}
{% endif %}
{% else %}
{% set park_x = printable_x_max / 2 %}
{% endif %}
{% if location == 'back' %}
{% set park_y = printable_y_max - 15 %}
{% elif location == 'front' %}
{% set park_y = printer.toolhead.axis_minimum.y + 5 %}
{% elif location == 'center' %}
{% set park_y = printable_y_max / 2 %}
{% elif location == 'primeblob' and printer["dual_carriage"] is defined %}
{% set park_y = printable_y_max - 15 %}
{% endif %}
{% if location == 'primeblob' and printer["dual_carriage"] is not defined %}
{% if (nozzle_priming == 'primeblob' or nozzle_priming == 'primeline') %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set park_x = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set park_x = printable_x_max - 5 %}
{% else %}
{% set park_x = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set park_y = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set park_y = printable_y_max - 5 %}
{% else %}
{% set park_y = nozzle_prime_start_y|float %}
{% endif %}
{% endif %}
{% endif %}
G90
{% if printer["dual_carriage"] is not defined %}
G0 X{park_x} Y{park_y} F{speed}
{% else %}
G0 Y{park_y} F{speed}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="park"
[gcode_macro SAVE_PROBE_RESULT]
gcode =
{% set beacon_contact_prime_probing = true if printer["gcode_macro RatOS"].beacon_contact_prime_probing|default(false)|lower == 'true' else false %}
{% set last_z_offset = 9999.9 %}
{% if printer.configfile.settings.beacon is defined %}
{% set current_z = printer.toolhead.position.z|float %}
{% if beacon_contact_prime_probing %}
{% set last_z_offset = printer.beacon.last_z_result %}
{% else %}
{% set last_z_offset = printer.beacon.last_sample.dist - current_z %}
{% endif %}
{% elif printer.configfile.settings.bltouch is defined %}
{% set config_offset = printer.configfile.settings.bltouch.z_offset|float %}
{% set last_z_offset = printer.probe.last_z_result - config_offset %}
{% elif printer.configfile.settings.probe is defined %}
{% set config_offset = printer.configfile.settings.probe.z_offset|float %}
{% set last_z_offset = printer.probe.last_z_result - config_offset %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Saving offset adjustment of {last_z_offset} in {params.VARIABLE|default('last_z_offset')}"
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE={params.VARIABLE|default('last_z_offset')} VALUE={last_z_offset}
[gcode_macro PROBE_FOR_PRIMING]
gcode =
{% set probe_for_priming_disable_mesh_constraints = true if printer["gcode_macro RatOS"].probe_for_priming_disable_mesh_constraints|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].nozzle_priming|lower != 'false' %}
SAVE_GCODE_STATE NAME=probe_for_priming_state
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the prime location.."
CACHE_TOOLHEAD_SETTINGS KEY="probe_for_priming"
SET_MACRO_TRAVEL_SETTINGS
{% set t = params.TOOLHEAD|default(-1)|int %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% if idex_mode == '' %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set x_start = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set x_start = printable_x_max - 5 %}
{% else %}
{% set x_start = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% else %}
{% set y_start = nozzle_prime_start_y|float %}
{% endif %}
{% else %}
{% set center_x = printable_x_max / 2 %}
{% if t == 0 %}
{% set x_start = 5 %}
{% else %}
{% set x_start = printable_x_max - 5 %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% endif %}
{% endif %}
{% set z = printer.configfile.settings.bed_mesh.horizontal_move_z|float %}
{% set mesh_config = printer.configfile.config.bed_mesh %}
{% if printer.configfile.settings.bltouch is defined %}
{% set x_offset = printer.configfile.settings.bltouch.x_offset|float %}
{% set y_offset = printer.configfile.settings.bltouch.y_offset|float %}
{% set z_offset = printer.configfile.settings.bltouch.z_offset|float %}
{% elif printer.configfile.settings.probe is defined %}
{% set x_offset = printer.configfile.settings.probe.x_offset|float %}
{% set y_offset = printer.configfile.settings.probe.y_offset|float %}
{% set z_offset = printer.configfile.settings.probe.z_offset|float %}
{% elif printer.configfile.settings.beacon is defined %}
{% set x_offset = printer.configfile.settings.beacon.x_offset|float %}
{% set y_offset = printer.configfile.settings.beacon.y_offset|float %}
{% set z_offset = printer.configfile.settings.beacon.trigger_distance|float %}
{% else %}
{ action_raise_error("No probe, beacon or bltouch section found. Adaptive priming only works with a [probe], [beacon] or [bltouch] section defined.") }
{% endif %}
{% if z < z_offset %}
{ action_raise_error("Horizontal move Z ({z}) is below your probe's Z offset ({z_offset}). Please adjust your horizontal_move_z setting in [bed_mesh] to be above {z}.") }
{% endif %}
{% if not probe_for_priming_disable_mesh_constraints %}
{% set min_x = mesh_config.mesh_min.split(",")[0]|float - x_offset %}
{% set min_y = mesh_config.mesh_min.split(",")[1]|float - y_offset %}
{% set max_x = mesh_config.mesh_max.split(",")[0]|float - x_offset %}
{% set max_y = mesh_config.mesh_max.split(",")[1]|float - y_offset %}
{% set x_start = [[x_start, max_x]|min, min_x]|max %}
{% set y_start = [[y_start, max_y]|min, min_y]|max %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the start of the prime location at {x_start}, {y_start}"
G90
M83
G0 Z{z} F{z_speed}
G1 X{x_start} Y{y_start} F{speed}
PROBE_CURRENT_POSITION
{% if t == 1 %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result_t1
{% else %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result
{% endif %}
{% if idex_mode == '' %}
{% set x_end = x_start %}
{% set y_end = y_start + 45 %}
{% else %}
{% if t==1 %}
{% set x_end = x_start - 45 %}
{% else %}
{% set x_end = x_start + 45 %}
{% endif %}
{% set y_end = y_start %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the end of the prime location at {x_end}, {y_end}"
G1 X{x_end} Y{y_end} F{speed}
PROBE_CURRENT_POSITION
{% if t == 1 %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_end_result_t1
{% else %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_end_result
{% endif %}
RESTORE_GCODE_STATE NAME=probe_for_priming_state
RESTORE_TOOLHEAD_SETTINGS KEY="probe_for_priming"
{% endif %}
[gcode_macro RESET_PRIME_PROBE_STATE]
gcode =
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result VALUE=None
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_end_result VALUE=None
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result_t1 VALUE=None
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_end_result_t1 VALUE=None
{% endif %}
[gcode_macro PROBE_CURRENT_POSITION]
gcode =
{% set beacon_contact_prime_probing = true if printer["gcode_macro RatOS"].beacon_contact_prime_probing|default(false)|lower == 'true' else false %}
SAVE_GCODE_STATE NAME=probe_current_position_state
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
ASSERT_PROBE_DEPLOYED
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_prime_probing %}
PROBE PROBE_METHOD=contact SAMPLES=1
{% else %}
PROBE
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
BEACON_QUERY
{% else %}
RESTORE_GCODE_STATE NAME=probe_current_position_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_z_speed|float}
{% endif %}
[gcode_macro PRIME_BLOB]
description = Prints a primeblob, used internally, if configured, as part of the START_PRINT macro.
variable_x_offset = 5
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="prime_blob"
SET_MACRO_TRAVEL_SETTINGS
RATOS_ECHO PREFIX="Priming" MSG="Priming nozzle with prime blob.."
{% set current_toolhead = 0 %}
{% set target_idex_mode = '' %}
{% set extruder = 'extruder' %}
{% if printer["dual_carriage"] is defined %}
{% if params.IDEX_MODE is defined %}
{% set target_idex_mode = params.IDEX_MODE|default('')|lower %}
{% else %}
{ action_raise_error("IDEX_MODE parameter not found for PRIME_BLOB macro. This is likely a bug.") }
{% endif %}
RATOS_ECHO PREFIX="Priming" MSG="Priming in IDEX {target_idex_mode} mode.."
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set current_toolhead = 1 if current_idex_mode=='primary' else 0 %}
{% set extruder = 'extruder1' if current_toolhead == 1 else 'extruder' %}
{% endif %}
{% if target_idex_mode != "copy" or target_idex_mode != "mirror" %}
SAVE_GCODE_STATE NAME=prime_blob_state
{% endif %}
{% set first_y = printer["gcode_macro START_PRINT"].first_y|default(-1)|float %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set fan_speed = printer["gcode_macro RatOS"].nozzle_prime_bridge_fan|float %}
{% set nozzle_diameter = printer.configfile.settings[extruder].nozzle_diameter|float %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set has_start_offset_t0 = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) != 9999.9 %}
{% if printer["dual_carriage"] is defined %}
{% set has_start_offset_t1 = printer["gcode_macro RatOS"].probe_for_priming_result_t1|float(9999.9) != 9999.9 %}
{% endif %}
{% set start_print_park_in = printer["gcode_macro RatOS"].start_print_park_in %}
{% set start_print_park_z_height = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set nozzle_prime_direction = printer["gcode_macro RatOS"].nozzle_prime_direction|lower %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% set initial_toolhead = params.INITIAL_TOOLHEAD|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% if target_idex_mode == '' %}
{% set x_factor = 0 %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set x_start = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set x_start = printable_x_max - 5 %}
{% else %}
{% set x_start = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% set y_factor = 1 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% set y_factor = -1 %}
{% else %}
{% set y_start = nozzle_prime_start_y|float %}
{% if nozzle_prime_start_y|float < printable_y_max / 2 %}
{% set y_factor = 1 %}
{% else %}
{% set y_factor = -1 %}
{% endif %}
{% endif %}
{% if nozzle_prime_direction == 'forwards' %}
{% set y_factor = 1 %}
{% elif nozzle_prime_direction == 'backwards' %}
{% set y_factor = -1 %}
{% endif %}
{% if start_print_park_in == 'primeblob' %}
{% set z = 3 %}
{% else %}
{% set z = start_print_park_z_height %}
{% endif %}
{% else %}
{% set center_x = printable_x_max / 2 %}
{% set y_factor = 0 %}
{% if target_idex_mode == 'copy' or target_idex_mode == 'mirror' %}
{% set x_start = center_x / 2 + 5 %}
{% set x_factor = 1 %}
{% else %}
{% if both_toolheads and initial_toolhead != current_toolhead %}
{% if current_toolhead == 0 %}
{% set x_start = 55 %}
{% set x_factor = -1 %}
{% elif current_toolhead == 1 %}
{% set x_start = printable_x_max - 55 %}
{% set x_factor = 1 %}
{% endif %}
{% else %}
{% if current_toolhead == 0 %}
{% set x_start = 5 %}
{% set x_factor = 1 %}
{% elif current_toolhead == 1 %}
{% set x_start = printable_x_max - 5 %}
{% set x_factor = -1 %}
{% endif %}
{% endif %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_x_max - 5 %}
{% endif %}
{% set z = 10 %}
{% endif %}
{% set start_z_offset = 0 %}
{% set end_z_offset = 0 %}
{% if has_start_offset_t0 %}
{% set start_z_probe_result_t0 = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %}
{% set end_z_probe_result_t0 = printer["gcode_macro RatOS"].probe_for_priming_end_result|float(9999.9) %}
{% if printer.configfile.settings.bltouch is not defined and printer.configfile.settings.probe is not defined and printer.configfile.settings.beacon is not defined %}
{ action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe], [beacon] or [bltouch].") }
{% endif %}
{% if start_z_probe_result_t0 == 9999.9 %}
{ action_raise_error("No start probe result found for prime area. This is likely a bug.") }
{% endif %}
{% if end_z_probe_result_t0 == 9999.9 %}
{ action_raise_error("No end probe result found for prime area. This is likely a bug.") }
{% endif %}
{% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %}
{% if start_z_probe_result_t0 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (start_z_probe_result_t0) ) }
{% endif %}
{% if end_z_probe_result_t0 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (end_z_probe_result_t0) ) }
{% endif %}
{% set start_z_offset = start_z_probe_result_t0 %}
{% set end_z_offset = end_z_probe_result_t0 %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if current_toolhead == 1 or both_toolheads or target_idex_mode == "copy" or target_idex_mode == "mirror" %}
{% if has_start_offset_t1 %}
{% set start_z_probe_result_t1 = printer["gcode_macro RatOS"].probe_for_priming_result_t1|float(9999.9) %}
{% set end_z_probe_result_t1 = printer["gcode_macro RatOS"].probe_for_priming_end_result_t1|float(9999.9) %}
{% if printer.configfile.settings.bltouch is not defined and printer.configfile.settings.probe is not defined and printer.configfile.settings.beacon is not defined %}
{ action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe], [beacon] or [bltouch].") }
{% endif %}
{% if start_z_probe_result_t1 == 9999.9 %}
{ action_raise_error("No start probe result found for prime area. This is likely a bug.") }
{% endif %}
{% if end_z_probe_result_t1 == 9999.9 %}
{ action_raise_error("No end probe result found for prime area. This is likely a bug.") }
{% endif %}
{% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %}
{% if start_z_probe_result_t1 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (start_z_probe_result_t1) ) }
{% endif %}
{% if end_z_probe_result_t1 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (end_z_probe_result_t1) ) }
{% endif %}
{% set start_z_offset = [start_z_offset, start_z_probe_result_t1]|max %}
{% set end_z_offset = [end_z_offset, start_z_probe_result_t1]|max %}
{% endif %}
{% endif %}
{% if target_idex_mode != 'copy' and target_idex_mode != 'mirror' %}
{% if both_toolheads and initial_toolhead != current_toolhead %}
{% set original_start_z_offset = start_z_offset %}
{% set original_end_z_offset = end_z_offset %}
{% set start_z_offset = original_end_z_offset %}
{% set end_z_offset = original_start_z_offset %}
{% endif %}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SET_NOZZLE_TEMP_OFFSET TOOLHEAD={current_toolhead}
{% endif %}
DEBUG_ECHO PREFIX="PRIME_BLOB" MSG="x_start: {x_start}, y_start: {y_start}, x_factor: {x_factor}, y_factor: {y_factor}, z: {z}, start_z_offset: {start_z_offset}, end_z_offset: {end_z_offset}"
G90
M83
RATOS_ECHO PREFIX="Priming" MSG="Lifting Z to {z}.."
G0 Z{z} F{z_speed}
{% if printer["dual_carriage"] is not defined %}
RATOS_ECHO PREFIX="Priming" MSG="Moving to {x_start}, {y_start} along the edge of the print area.."
{% if start_print_park_in != 'primeblob' %}
G1 X{x_start} F{speed}
G1 Y{y_start + (15 * y_factor)} F{speed}
{% endif %}
{% else %}
G1 Y{y_start + (15 * y_factor)} F{speed}
{% if target_idex_mode=="copy" or target_idex_mode=="mirror" %}
RATOS_ECHO PREFIX="Priming" MSG="Mirroring move to {x_start}, {y_start} along the edge of the print area.."
_IDEX_MIRROR PRIMING=1
{% else %}
RATOS_ECHO PREFIX="Priming" MSG="Moving to {x_start}, {y_start} along the edge of the print area.."
{% endif %}
G1 X{x_start} F{speed}
{% endif %}
RATOS_ECHO PREFIX="Priming" MSG="Starting prime blob.."
G1 Z{0.5 + start_z_offset} F{z_speed}
G1 Y{y_start} F{speed}
G1 F300 E{14 / ((0.4 / nozzle_diameter) ** 2)}
G1 F300 E{14 / ((0.4 / nozzle_diameter) ** 2)}
M106 S{fan_speed}
G1 Z5 F100 E5
G92 E0
RATOS_ECHO PREFIX="Priming" MSG="Bridging with {((fan_speed/255) * 100)|int}% fan speed.."
G1 F3000 X{x_start + (15 * x_factor)} Y{y_start + (15 * y_factor)} E{1 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (20 * x_factor)} Y{y_start + (20 * y_factor)} Z{3.8 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (34 * x_factor)} Y{y_start + (34 * y_factor)} Z{2.6 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (38 * x_factor)} Y{y_start + (38 * y_factor)} Z{1.4 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (42 * x_factor)} Y{y_start + (42 * y_factor)} Z{0.2 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
M106 S0
G1 F3000 X{x_start + (46 * x_factor)} Y{y_start + (46 * y_factor)} Z{0.2 + end_z_offset} E0.6
G1 F{speed} X{x_start + (50 * x_factor)} Y{y_start + (50 * y_factor)}
{% if target_idex_mode == "copy" or target_idex_mode == "mirror" %}
G0 Z3 F{z_speed}
{% endif %}
{% if target_idex_mode == "copy" %}
{% if first_y >= 0 %}
_IDEX_COPY DANCE=0 Y={first_y}
{% else %}
_IDEX_COPY DANCE=0 Y={params.Y1}
{% endif %}
{% endif %}
{% if target_idex_mode != "copy" or target_idex_mode != "mirror" %}
RESTORE_GCODE_STATE NAME=prime_blob_state
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="prime_blob"
G92 E0
[gcode_macro UNLOAD_FILAMENT]
description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams.
variable_ignore_min_extrude_temp = True
gcode =
_LEARN_MORE_FILAMENT
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set filament_name = params._NAME|default('')|string %}
{% set filament_type = params._TYPE|default('')|string %}
{% set temp = params.TEMP|default(220)|int %}
{% if printer["dual_carriage"] is not defined %}
_DEFAULT_UNLOAD_FILAMENT TEMP={temp} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Unloading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead==0 or toolhead==1 %}
_IDEX_UNLOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
[gcode_macro _LEGACY_UNLOAD_FILAMENT]
description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams.
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set unload_speed = 5 * 60 %}
{% set unload_length = printer["gcode_macro RatOS"].filament_unload_length|float %}
M117 Unloading filament...
G0 E10 F300
G0 E-5 F3600
G4 P3000
G0 E5 F6000
G0 E-15 F6000
G0 E-{unload_length} F{unload_speed}
_CLEANING_MOVE TOOLHEAD={toolhead}
M117 Filament unloaded!
RESPOND MSG="Filament unloaded! Please inspect the tip of the filament before reloading."
[gcode_macro _DEFAULT_UNLOAD_FILAMENT]
description = Unload filament macro for non IDEX printers.
gcode =
{% set temp = params.TEMP|default(220)|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set enable_unload_tip_forming = true if printer["gcode_macro RatOS"].enable_unload_tip_forming|default(false)|lower == 'true' else false %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_DEFAULT_UNLOAD_FILAMENT" MSG="TEMP: {temp}"
_LED_UNLOADING_FILAMENT TOOLHEAD=0
SAVE_GCODE_STATE NAME=unload_state
{% if printer.extruder.temperature|int < temp or printer.extruder.can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating extruder to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={temp}
G4 P3000
{% if enable_unload_tip_forming %}
_UNLOAD_FILAMENT TOOLHEAD=0 NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_LEGACY_UNLOAD_FILAMENT TOOLHEAD=0
{% endif %}
RESTORE_GCODE_STATE NAME=unload_state
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD=0
[gcode_macro _IDEX_UNLOAD_FILAMENT]
description = Unload filament macro for IDEX printer.
gcode =
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set enable_unload_tip_forming = true if printer["gcode_macro RatOS"].enable_unload_tip_forming|default(false)|lower == 'true' else false %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_IDEX_UNLOAD_FILAMENT" MSG="TEMP: {temp}, TOOLHEAD: {toolhead}"
_LED_UNLOADING_FILAMENT TOOLHEAD={toolhead}
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
{% if not printer.pause_resume.is_paused %}
{% if printer[target_extruder].temperature|int < temp or printer[target_extruder].can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating T{toolhead} to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={temp}
{% endif %}
G4 P3000
{% if enable_unload_tip_forming %}
_UNLOAD_FILAMENT TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_LEGACY_UNLOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead}
{% endif %}
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD={toolhead}
[gcode_macro _UNLOAD_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT" MSG="TOOLHEAD: {toolhead}"
_MOVE_TO_LOADING_POSITION TOOLHEAD={toolhead}
_UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
_UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER TOOLHEAD={toolhead}
_CLEANING_MOVE TOOLHEAD={toolhead}
[gcode_macro _UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Unloading filament from nozzle to cooling zone... Please wait!"
_PURGE_BEFORE_UNLOAD TOOLHEAD={toolhead}
{% if printer["gcode_macro _UNLOAD_WITHOUT_TIP_FORMING"] is defined %}
_UNLOAD_WITHOUT_TIP_FORMING TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_UNLOAD_WITH_TIP_FORMING NAME='{filament_name}' TYPE='{filament_type}'
{% endif %}
G4 P3000
[gcode_macro _UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set extruder_load_speed = printer["gcode_macro T%s" % toolhead].extruder_load_speed|float * 60 %}
{% set extruder_gear_to_cooling_position_distance = printer["gcode_macro T%s" % toolhead].extruder_gear_to_cooling_position_distance|float %}
{% set tooolhead_sensor_to_extruder_gear_distance = printer["gcode_macro T%s" % toolhead].tooolhead_sensor_to_extruder_gear_distance|float %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER" MSG="TOOLHEAD: {toolhead}"
G0 E-{extruder_gear_to_cooling_position_distance + tooolhead_sensor_to_extruder_gear_distance + 50} F{extruder_load_speed}
RATOS_ECHO MSG="Filament unloaded! Please inspect the tip of the filament before reloading."
[gcode_macro _UNLOAD_WITH_TIP_FORMING]
gcode =
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% if filament_name != '' and filament_type != '' %}
_UNLOAD_KNOWN_FILAMENT NAME={filament_name} TYPE={filament_type}
{% else %}
_UNLOAD_UNKNOWN_FILAMENT TOOLHEAD={toolhead}
{% endif %}
[gcode_macro _UNLOAD_KNOWN_FILAMENT]
description = User overrideable tip forming macro if slicer filament profiles are known
gcode =
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
RATOS_ECHO PREFIX="FILAMENT TYPE" MSG='{filament_type}'
RATOS_ECHO PREFIX="FILAMENT PROFILE" MSG='{filament_name}'
{% if filament_name == "Prusament PETG @V-Minion" %}
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
{% elif filament_name == "Nobufil PETG @V-Minion" %}
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
{% else %}
RATOS_ECHO PREFIX="_UNLOAD_KNOWN_FILAMENT" MSG="Filament profile not found!"
_UNLOAD_UNKNOWN_FILAMENT
{% endif %}
[gcode_macro _UNLOAD_UNKNOWN_FILAMENT]
description = User overrideable standard tip forming macro
gcode =
DEBUG_ECHO PREFIX="_UNLOAD_UNKNOWN_FILAMENT" MSG="Using standard tip forming macro!"
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
[gcode_macro _TIP_FORMING]
gcode =
{% set cooling_moves = params.COOLING_MOVES|default(4)|int %}
{% set cooling_move_length = params.COOLING_MOVE_LENGTH|default(10)|float %}
{% set start_cooling_speed = params.START_COOLING_SPEED|default(10)|float * 60 %}
{% set end_cooling_speed = params.END_COOLING_SPEED|default(50)|float * 60 %}
{% if cooling_moves == 0 %}
{% set cooling_move_length = 0 %}
{% endif %}
{% set dip = true if params.DIP|default(false)|lower == "true" else false %}
{% set dip_length = params.DIP_LENGTH|default(22)|float %}
{% set dip_speed = params.DIP_SPEED|default(30)|float * 60 %}
{% set dip_retract_speed = params.DIP_RETRACT_SPEED|default(70)|float * 60 %}
{% set retract_length = params.RETRACT_LENGTH|default(18)|float %}
{% set start_retract_speed = params.START_RETRACT_SPEED|default(120)|float * 60 %}
{% set end_retract_speed = params.END_RETRACT_SPEED|default(20)|float * 60 %}
DEBUG_ECHO PREFIX="_TIP_FORMING" MSG="cooling_moves: {cooling_moves}, cooling_move_length: {cooling_move_length}, start_cooling_speed: {start_cooling_speed}, end_cooling_speed: {end_cooling_speed}, dip: {dip}, dip_length: {dip_length}, dip_speed: {dip_speed}, dip_retract_speed: {dip_retract_speed}, retract_length: {retract_length}, start_retract_speed: {start_retract_speed}, end_retract_speed: {end_retract_speed}"
M220 S100
G92 E0
{% set retract = retract_length + cooling_move_length / 2 - 15 %}
G1 E-15 F{start_retract_speed}
G1 E-{0.7 * retract} F{1.0 * end_retract_speed}
G1 E-{0.2 * retract} F{0.5 * end_retract_speed}
G1 E-{0.1 * retract} F{0.3 * end_retract_speed}
G92 E0
{% if cooling_moves > 0 %}
{% set i = (end_cooling_speed - start_cooling_speed) / (2 * cooling_moves - 1) %}
{% for m in range(cooling_moves) %}
G1 E{cooling_move_length} F{(start_cooling_speed + i * m * 2)}
G1 E-{cooling_move_length} F{(start_cooling_speed + i * (m * 2 + 1))}
{% endfor %}
{% endif %}
G92 E0
{% if dip %}
G1 E{dip_length} F{dip_speed}
G4 P100
G1 E-{dip_length} F{dip_retract_speed}
{% endif %}
G92 E0
M400
[gcode_macro _ON_FILAMENT_SENSOR_BUTTON_PRESSED]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_FILAMENT_SENSOR_BUTTON_PRESSED" MSG="TOOLHEAD: {toolhead}"
{% if not printer.virtual_sdcard.is_active %}
UNLOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_RUNOUT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_runout_detection = true if printer["gcode_macro T%s" % toolhead].enable_runout_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_RUNOUT" MSG="TOOLHEAD: {toolhead}"
{% if enable_runout_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=false
{% endif %}
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_CLOG]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_clog_detection = true if printer["gcode_macro T%s" % toolhead].enable_clog_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_CLOG" MSG="TOOLHEAD: {toolhead}"
{% if enable_clog_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=true
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_RUNOUT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_runout_detection = true if printer["gcode_macro T%s" % toolhead].enable_runout_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_RUNOUT" MSG="TOOLHEAD: {toolhead}"
{% if enable_runout_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=false
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_CLOG]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_clog_detection = true if printer["gcode_macro T%s" % toolhead].enable_clog_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_CLOG" MSG="TOOLHEAD: {toolhead}"
{% if enable_clog_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=true
{% endif %}
[gcode_macro _ON_FILAMENT_END]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set clogged = true if params.CLOGGED|default(false)|lower == 'true' else false %}
{% set unload_after_runout = printer["gcode_macro T%s" % toolhead].unload_after_runout|float %}
{% if clogged %}
_LED_FILAMENT_CLOG TOOLHEAD={toolhead}
{% else %}
_LED_FILAMENT_RUNOUT TOOLHEAD={toolhead}
{% endif %}
DEBUG_ECHO PREFIX="_ON_FILAMENT_END" MSG="TOOLHEAD: {toolhead}"
{% if printer.virtual_sdcard.is_active %}
{% if not printer.pause_resume.is_paused %}
PAUSE RUNOUT=True
{% endif %}
{% if not clogged and unload_after_runout %}
UNLOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
{% if not clogged and printer["dual_carriage"] is defined %}
{% if printer["gcode_macro _IDEX_JOIN_SPOOLS"].enabled|default(false)|lower == 'true'%}
_JOIN_SPOOL TOOLHEAD={toolhead}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro M600]
description = Executes a color change by pausing the printer an unloading the filament.
gcode =
PAUSE
UNLOAD_FILAMENT
RATOS_ECHO MSG="Please load new filament and resume"
[gcode_macro COLD_PULL]
description = Automated hotend cold pull.
gcode =
{% set extrusion_temp = params.EXTRUSION_TEMP|default(220)|int %}
{% set cold_pull_temp = params.COLD_PULL_TEMP|default(80)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% if printer["dual_carriage"] is not defined %}
{% set toolhead = 0 %}
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Unloading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead != 0 and toolhead != 1 %}
{action_raise_error("Please select toolhead! 0 = left, 1 = right toolhead")}
{% endif %}
{% endif %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
_LED_UNLOADING_FILAMENT TOOLHEAD={toolhead}
SAVE_GCODE_STATE NAME=cold_pull_state
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
RATOS_ECHO MSG="Heating T{toolhead} to {extrusion_temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={extrusion_temp}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={extrusion_temp} MAXIMUM={extrusion_temp + 2}
G4 P3000
RATOS_ECHO MSG="extruding..."
G92 E0
G1 E30 F300
G92 E0
RATOS_ECHO MSG="Heating T{toolhead} to {cold_pull_temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={cold_pull_temp}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={cold_pull_temp} MAXIMUM={cold_pull_temp + 2}
G4 P10000
RATOS_ECHO MSG="cold pull..."
FORCE_MOVE STEPPER={target_extruder} DISTANCE=-40 VELOCITY=5 ACCEL=100
RATOS_ECHO MSG="eject filament..."
FORCE_MOVE STEPPER={target_extruder} DISTANCE=-200 VELOCITY=20 ACCEL=500
RATOS_ECHO MSG="cooling down extruder..."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET=0
RESTORE_GCODE_STATE NAME=cold_pull_state
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD={toolhead}
CONSOLE_ECHO TITLE="Cold pull finished!" MSG="Please remove the filament from the PTFE tube and cut the end off. Do NOT try to load it again." TYPE="warning"
[gcode_macro _USER_START_PRINT_BEFORE_HOMING]
gcode =
[gcode_macro _USER_START_PRINT_AFTER_HEATING_BED]
gcode =
[gcode_macro _USER_START_PRINT_BED_MESH]
gcode =
[gcode_macro _USER_START_PRINT_PARK]
gcode =
[gcode_macro _USER_START_PRINT_AFTER_HEATING_EXTRUDER]
gcode =
[gcode_macro _USER_START_PRINT_HEAT_CHAMBER]
description = Uses the extruder sensor to wait for chamber temp. Override the _START_PRINT_HEAT_CHAMBER macro to implement heated chamber handling.
gcode =
{% set chamber_heater_bed_temp = printer["gcode_macro RatOS"].chamber_heater_bed_temp|default(115)|int %}
[gcode_macro _USER_END_PRINT_BEFORE_HEATERS_OFF]
gcode =
[gcode_macro _USER_END_PRINT_AFTER_HEATERS_OFF]
gcode =
[gcode_macro _USER_END_PRINT_PARK]
gcode =
[gcode_macro _USER_END_PRINT_FINISHED]
description = User hook for when the print is finished after gcode state has been restored.
gcode =
[gcode_macro _USER_START_PRINT]
gcode =
[gcode_macro _USER_END_START_PRINT]
gcode =
[gcode_macro _USER_START_FEATURE]
gcode =
[gcode_macro _USER_END_FEATURE]
gcode =
[gcode_macro ECHO_T_VARS]
description = Echo Toolhead variables to the console.
gcode =
{% set t = params.T|default(0) %}
RATOS_ECHO MSG="T{t} Variables"
{% for var, value in printer["gcode_macro T%s" % t].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro ECHO_RATOS_VARS]
description = Echo RatOS variables to the console.
gcode =
{% for var, value in printer["gcode_macro RatOS"].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[delayed_gcode RATOS_INIT]
initial_duration = 0.1
gcode =
_LED_STANDBY
CALCULATE_PRINTABLE_AREA
INITIAL_FRONTEND_UPDATE
_CHAMBER_FILTER_SANITY_CHECK
[delayed_gcode RATOS_LOGO]
initial_duration = 2
gcode =
HELLO_RATOS
[gcode_macro INITIAL_FRONTEND_UPDATE]
gcode =
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_error = printer["gcode_macro RatOS"].status_color_error|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_unknown}"'
{% endif %}
{% set t0_sensor = "undefined" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].filament_detected|lower == "true" %}
{% set t0_sensor = "detected" %}
{% else %}
{% set t0_sensor = "empty" %}
{% endif %}
{% else %}
{% set t0_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set t1_sensor = "undefined" %}
{% if printer["dual_carriage"] is defined and printer["filament_switch_sensor toolhead_filament_sensor_t1"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].filament_detected|lower == "true" %}
{% set t1_sensor = "detected" %}
{% else %}
{% set t1_sensor = "empty" %}
{% endif %}
{% else %}
{% set t1_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set svv = printer.save_variables.variables %}
{% if svv.t0_filament is defined and printer["gcode_macro T0"] is defined %}
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
{% if t0_sensor != "empty" %}
{% set t0_filament_type = svv.t0_filament[0]|default('')|string %}
{% set t0_filament_name = svv.t0_filament[1]|default('')|string %}
{% set t0_filament_temp = svv.t0_filament[2]|default(0)|float %}
{% if t0_filament_name != '' and t0_filament_type != '' and t0_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{t0_filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{t0_filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={t0_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
{% if svv.t1_filament is defined and printer["gcode_macro T1"] is defined %}
{% if printer["gcode_macro T1"].filament_name is defined and printer["gcode_macro T1"].filament_type is defined and printer["gcode_macro T1"].filament_temp is defined %}
{% if t1_sensor != "empty" %}
{% set t1_filament_type = svv.t1_filament[0]|default('')|string %}
{% set t1_filament_name = svv.t1_filament[1]|default('')|string %}
{% set t1_filament_temp = svv.t1_filament[2]|default(0)|float %}
{% if t1_filament_name != '' and t1_filament_type != '' and t1_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='"{t1_filament_name}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='"{t1_filament_type}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE={t1_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t1_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro CALCULATE_PRINTABLE_AREA]
gcode =
{% set bed_margin_x = printer["gcode_macro RatOS"].bed_margin_x %}
{% set bed_margin_y = printer["gcode_macro RatOS"].bed_margin_y %}
{% set tool = 0 if printer["gcode_macro T0"] is not defined or printer["gcode_macro T0"].active else 1 %}
{% set max_x = printer.toolhead.axis_maximum.x if printer["dual_carriage"] is defined and tool == 0 else printer.toolhead.axis_maximum.x - bed_margin_x[1] %}
{% if printer["dual_carriage"] is defined %}
{% set max_x = printer.toolhead.axis_maximum.x %}
{% endif %}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="printer.toolhead.axis_maximum.x {printer.toolhead.axis_maximum.x}"
{% set max_y = printer.toolhead.axis_maximum.y - bed_margin_y[1]%}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_x_max VALUE={max_x}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_y_max VALUE={max_y}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="Printable area calculated: X: 0,{max_x} Y: 0,{max_y}"
[gcode_macro CACHE_TOOLHEAD_SETTINGS]
variable_cache = {"global": {"accel": 1000, "ratio": 0.5, "speed": 50, "scv": 5}}
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set dummy = cache.__setitem__(key, {"accel": printer.toolhead.max_accel, "ratio": printer.toolhead.minimum_cruise_ratio, "speed": printer.toolhead.max_velocity, "scv": printer.toolhead.square_corner_velocity}) %}
SET_GCODE_VARIABLE MACRO=CACHE_TOOLHEAD_SETTINGS VARIABLE=cache VALUE="{cache | pprint | replace("\n", "") | replace("\"", "\\\"")}"
DEBUG_ECHO PREFIX="CACHE_TOOLHEAD_SETTINGS" MSG="Toolhead settings cached for {key}. {printer.toolhead.max_accel} accel, {printer.toolhead.minimum_cruise_ratio} ratio, {printer.toolhead.max_velocity} velocity, {printer.toolhead.square_corner_velocity} scv."
[gcode_macro RESTORE_TOOLHEAD_SETTINGS]
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set values = printer["gcode_macro CACHE_TOOLHEAD_SETTINGS"].cache.__getitem__(key) %}
{% if values is not defined or values == 'None' %}
{ action_raise_error("RESTORE_TOOLHEAD_SETTINGS: Toolhead settings not cached for key '" ~ key ~ "'.") }
{% endif %}
SET_VELOCITY_LIMIT ACCEL={values.accel} MINIMUM_CRUISE_RATIO={values.ratio} VELOCITY={values.speed} SQUARE_CORNER_VELOCITY={values.scv}
DEBUG_ECHO PREFIX="RESTORE_TOOLHEAD_SETTINGS" MSG="Toolhead settings restored. {values.accel} accel, {values.ratio} ratio, {values.speed} velocity, {values.scv} scv."
[gcode_macro SET_MACRO_TRAVEL_SETTINGS]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set accel = printer["gcode_macro RatOS"].macro_travel_accel %}
SET_VELOCITY_LIMIT ACCEL={accel} MINIMUM_CRUISE_RATIO=0.5 VELOCITY={speed} SQUARE_CORNER_VELOCITY={5}
DEBUG_ECHO PREFIX="SET_MACRO_TRAVEL_SETTINGS" MSG="Macro travel settings set. {accel} accel, {speed} velocity"
[gcode_macro SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% if printer["dual_carriage"] is not defined %}
SET_KINEMATIC_POSITION X={printable_x_max / 2} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
{% else %}
IDEX_SET_CENTER_KINEMATIC_POSITION
{% endif %}
[gcode_macro IDEX_SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set center_x = printable_x_max / 2 %}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x - (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x + (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
[gcode_macro VERIFY_HYBRID_INVERTED]
gcode =
{% set inverted = False %}
{% if printer.configfile.settings.ratos_hybrid_corexy is defined and printer.configfile.settings.ratos_hybrid_corexy.inverted is defined %}
{% if printer.configfile.settings.ratos_hybrid_corexy.inverted|lower == 'true' %}
{% set inverted = True %}
{% endif %}
{% endif %}
{% if inverted == False %}
{ action_emergency_stop("ratos_hybrid_corexy NOT INVERTED! Inverted hybrid core-xy bugfix not detected.") }
{% endif %}
[gcode_macro RATOS_ECHO]
gcode =
{% set prefix = "RatOS" %}
{% set debug = params.DEBUG|default(0)|int %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " | " ~ params.PREFIX %}
{% endif %}
{% set prefix = prefix ~ ":" %}
{% set msg = "" %}
{% if params.MSG is defined %}
{% set msg = params.MSG %}
{% else %}
{% set msg = "No msg parameter provided (this is a bug or unintended use)." %}
{% endif %}
{% if not debug %}
M117 {prefix} {msg}
{% endif %}
RATOS_LOG PREFIX="{prefix}" MSG="{msg}"
{% if not debug %}
RESPOND PREFIX="{prefix}" MSG="{msg}"
{% else %}
CONSOLE_ECHO TITLE="{prefix}" TYPE="debug" MSG="{msg}"
{% endif %}
[gcode_macro ENABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=True
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=prefix_filter VALUE="'{params.FILTER|default('')|lower}'"
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging enabled."
[gcode_macro DISABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=False
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging disabled."
[gcode_macro DEBUG_ECHO]
variable_enabled = False
variable_prefix_filter = ''
gcode =
{% set prefix = "DEBUG" %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " - " ~ params.PREFIX %}
{% endif %}
{% if enabled and (prefix_filter|lower == '' or prefix_filter|lower in params.PREFIX|lower) %}
RATOS_ECHO PREFIX="{prefix}" MSG="{params.MSG}" DEBUG=1
{% endif %}
[gcode_macro START_FEATURE]
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="Start {params.FEATURE} feature gcode"
{% set scv = printer.toolhead.square_corner_velocity|int|default(5) %}
{% set accel = printer.toolhead.max_accel|int|default(10000) %}
{% set ratio = printer.toolhead.minimum_cruise_ratio|float|default(0.5) %}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="scv" VALUE={scv}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="accel" VALUE={accel}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="ratio" VALUE={ratio}
_USER_START_FEATURE FEATURE="{params.FEATURE}"
[gcode_macro END_FEATURE]
variable_scv = 5
variable_accel = 10000
variable_ratio = 0.5
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="End {params.FEATURE} feature gcode"
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={scv} ACCEL={accel} MINIMUM_CRUISE_RATIO={ratio}
_USER_END_FEATURE FEATURE="{params.FEATURE}" SCV={scv} ACCEL={accel} RATIO={ratio}
[gcode_macro _ON_LAYER_CHANGE]
variable_layer_number = 0
description = INTERNAL USE ONLY. Call it from the slicers after layer change custom gcode
gcode =
{% set layer = params.LAYER|int %}
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE={layer}
SET_PRINT_STATS_INFO CURRENT_LAYER={layer}
[gcode_macro _LEARN_MORE_CALIBRATION]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/calibration" %}
{% set link_text = "RatOS Calibration Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_CHAMBER_FILTER]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter Control" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_FILAMENT]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/filaments" %}
{% set link_text = "RatOS Filament Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _CONSOLE_SAVE_CONFIG]
gcode =
M118 Click SAVE_CONFIG to save the settings to your printer.cfg.
[gcode_macro SAVE_Z_OFFSET]
gcode =
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SAVE_MULTIPLIER
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _LOAD_RATOS_SKEW_PROFILE]
gcode =
{% set ratos_skew_profile = printer["gcode_macro RatOS"].skew_profile|default("") %}
{% if ratos_skew_profile != "" %}
{% if printer.configfile.config["skew_correction %s" % ratos_skew_profile] is defined %}
SKEW_PROFILE LOAD={ratos_skew_profile}
GET_CURRENT_SKEW
{% else %}
{% set line_1 = '"Could not find skew profile %s!_N_Clearing skew correction."' % ratos_skew_profile %}
CONSOLE_ECHO TITLE="Missing skew profile!" TYPE="warning" MSG={line_1}
SET_SKEW CLEAR=1
{% endif %}
{% endif %}
[gcode_macro M601]
gcode =
PAUSE
[gcode_macro PAUSE]
description = Pauses the print
rename_existing = PAUSE_BASE
variable_extrude = 1.5
variable_retract = 1.5
variable_fan_speed = 0
variable_idex_mode = ""
variable_idex_toolhead = 0
variable_idex_toolhead_x = 0.0
variable_idex_toolhead_y = 0.0
variable_idex_toolhead_z = 0.0
gcode =
{% set runout_detected = true if params.RUNOUT|default(false)|lower == 'true' else false %}
_LED_PAUSE
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set idex_toolhead = 1 if idex_mode == 'primary' else 0 %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
SAVE_GCODE_STATE NAME=PAUSE_state
{% else %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_mode VALUE='"{idex_mode}"'
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead VALUE={idex_toolhead}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_x VALUE={printer.gcode_move.gcode_position.x|float}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_y VALUE={printer.gcode_move.gcode_position.y|float}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_z VALUE={printer.gcode_move.gcode_position.z|float}
DEBUG_ECHO PREFIX="PAUSE" MSG="idex_mode: {idex_mode}, idex_toolhead: {idex_toolhead}, idex_toolhead_x: {idex_toolhead_x}, idex_toolhead_y: {idex_toolhead_y}, idex_toolhead_z: {idex_toolhead_z}"
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
CACHE_TOOLHEAD_SETTINGS KEY="pause"
SET_MACRO_TRAVEL_SETTINGS
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set current_z = printer.toolhead.position.z|float %}
{% if current_z < (max_z - 20.0) %}
{% set z_safe = 20.0 %}
{% else %}
{% set z_safe = max_z - current_z %}
{% endif %}
PAUSE_BASE
{% if printer["dual_carriage"] is not defined %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan"].speed|float}
{% else %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t0"].speed|float}
{% else %}
{% if idex_toolhead == 0 %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t0"].speed|float}
{% else %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t1"].speed|float}
{% endif %}
{% endif %}
{% endif %}
M106 S0
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' else false %}
{% if idex_mode != '' %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' and printer['extruder1'].can_extrude|lower == 'true' else false %}
{% else %}
{% if printer.toolhead.extruder == 'extruder1' %}
{% set can_extrude = true if printer['extruder1'].can_extrude|lower == 'true' else false %}
{% endif %}
{% endif %}
{% endif %}
{% set R = printer["gcode_macro PAUSE"].retract|float %}
{% if can_extrude %}
G91
G1 E-{R} F2100
G90
{% else %}
{action_respond_info("Extruder not hot enough")}
{% endif %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set pause_print_park_x = printer["gcode_macro RatOS"].pause_print_park_x %}
{% set pause_print_park_in = printer["gcode_macro RatOS"].pause_print_park_in %}
{% if runout_detected %}
{% set pause_print_park_x = printer["gcode_macro RatOS"].runout_park_x %}
{% set pause_print_park_in = printer["gcode_macro RatOS"].runout_park_in %}
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
DEBUG_ECHO PREFIX="PAUSE" MSG="z_speed: {z_speed}, pause_print_park_x: {pause_print_park_x}, pause_print_park_in: {pause_print_park_in}, default_toolhead: {default_toolhead}"
{% if "xyz" in printer.toolhead.homed_axes %}
G91
G1 Z{z_safe} F{z_speed}
G90
{% if printer["dual_carriage"] is not defined %}
_PARK LOCATION={pause_print_park_in} X={pause_print_park_x}
{% else %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
_IDEX_SINGLE X={parking_position}
{% else %}
PARK_TOOLHEAD
{% endif %}
_PARK LOCATION={pause_print_park_in} X={pause_print_park_x}
{% endif %}
{% else %}
{action_respond_info("Printer not homed")}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="pause"
[gcode_macro RESUME]
description = Resumes the print if the printer is paused.
rename_existing = RESUME_BASE
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set target_idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set target_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% endif %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' else false %}
{% if target_idex_mode != '' %}
{% if target_idex_mode == 'copy' or target_idex_mode == 'mirror' %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' and printer['extruder1'].can_extrude|lower == 'true' else false %}
{% else %}
{% if printer.toolhead.extruder == 'extruder1' %}
{% set can_extrude = true if printer['extruder1'].can_extrude|lower == 'true' else false %}
{% endif %}
{% endif %}
{% endif %}
{% set fan_speed = printer["gcode_macro PAUSE"].fan_speed|float %}
{% if printer["dual_carriage"] is not defined %}
M106 S{(fan_speed * 255)}
{% else %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% else %}
{% if params.TOOLHEAD is defined %}
{% if params.TOOLHEAD == 0 %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
{% else %}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% endif %}
{% else %}
{% if printer["gcode_macro PAUSE"].idex_toolhead == 0 %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
{% else %}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% endif %}
{% endif %}
{% endif %}
M106.1 S{fan_speed}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if target_idex_mode == "copy" %}
_IDEX_COPY DANCE=0
{% elif target_idex_mode == "mirror" %}
_IDEX_MIRROR DANCE=0
{% else %}
{% if params.TOOLHEAD is defined %}
_SELECT_TOOL T={params.TOOLHEAD} X=-1 Y=-1 TOOLSHIFT=false
{% else %}
_SELECT_TOOL T={printer["gcode_macro PAUSE"].idex_toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% endif %}
{% set x = printer["gcode_macro PAUSE"].idex_toolhead_x|float %}
{% set y = printer["gcode_macro PAUSE"].idex_toolhead_y|float %}
{% set z = printer["gcode_macro PAUSE"].idex_toolhead_z|float %}
G1 X{x} Y{y} Z{z} F{speed}
{% if params.TOOLHEAD is defined %}
SAVE_GCODE_STATE NAME=PAUSE_STATE
{% endif %}
{% endif %}
{% if params.TOOLHEAD is not defined %}
{% set E = printer["gcode_macro PAUSE"].extrude|float %}
{% if can_extrude %}
G91
G1 E{E} F2100
G90
{% else %}
{action_respond_info("Extruder not hot enough")}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 MOVE_SPEED={speed}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=True
RESUME_BASE
_LED_PRINTING
[gcode_macro CANCEL_PRINT]
description = Cancels the printer
rename_existing = CANCEL_PRINT_BASE
gcode =
END_PRINT
TURN_OFF_HEATERS
CLEAR_PAUSE
CANCEL_PRINT_BASE
[gcode_macro START_PRINT]
description = Start print procedure, use this in your Slicer.
variable_post_processor_version = 2
variable_is_printing_gcode = False
variable_both_toolheads = True
variable_object_xoffset = 0
variable_first_x = -1
variable_first_y = -1
variable_total_toolshifts = 0
variable_initial_tool = 0
variable_extruder_first_layer_temp = ""
variable_extruder_other_layer_temp = ""
gcode =
{% if "xyz" in printer.toolhead.homed_axes and printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% if printer["gcode_macro _VAOC"].is_started|default(true)|lower == 'true' %}
_VAOC_END
{% endif %}
{% endif %}
_LED_START_PRINTING
CACHE_TOOLHEAD_SETTINGS KEY="start_print"
_USER_START_PRINT { rawparams }
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% set hotend_heat_soak_time = printer["gcode_macro RatOS"].hotend_heat_soak_time|default(0)|int %}
{% set z_probe_stowable = printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set X0 = params.X0|default(-1)|float %}
{% set X1 = params.X1|default(-1)|float %}
{% set Y0 = params.Y0|default(-1)|float %}
{% set Y1 = params.Y1|default(-1)|float %}
{% if first_x == -1 or first_y == -1 %}
{% set first_x = params.FIRST_X|default(-1)|float %}
{% set first_y = params.FIRST_Y|default(-1)|float %}
{% endif %}
{% set total_toolshifts = params.TOTAL_TOOLSHIFTS|default(0)|int %}
{% set initial_tool = params.INITIAL_TOOL|default(default_toolhead)|int %}
{% set start_chamber_temp = params.START_CHAMBER_TEMP|default(0)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set bed_temp = params.BED_TEMP|default(printer.heater_bed.target, true)|float %}
{% set total_layer_count = params.TOTAL_LAYER_COUNT|default(0)|int %}
{% set extruder_first_layer_temp = (params.EXTRUDER_TEMP|default("")).split(",") %}
RATOS_ECHO MSG="First print coordinates X:{first_x} Y:{first_y}"
{% if params.TOTAL_LAYER_COUNT is not defined %}
{% set link_url = "https://os.ratrig.com/docs/slicers" %}
{% set link_text = "RatOS Slicer Configuration" %}
{% set line_1 = '"Your slicer gcode settings are not up to date._N_Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="Incomplete Slicer Configuration detected" TYPE="warning" MSG={line_1}
{% endif %}
SET_PRINT_STATS_INFO CURRENT_LAYER=1
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE=1
{% if total_layer_count > 0 %}
SET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set swap_toolheads = true if printer["gcode_macro _IDEX_REMAP_TOOLHEADS"].enabled|default(false)|lower == 'true' else false %}
{% if swap_toolheads %}
{% set initial_tool = 0 if initial_tool == 1 else 1 %}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=active VALUE=True
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=active VALUE=True
{% endif %}
{% set both_toolheads = true %}
{% if total_toolshifts == 0 %}
{% set both_toolheads = false %}
{% endif %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
_IDEX_SINGLE X={parking_position}
{% endif %}
{% if both_toolheads and (idex_mode == "copy" or idex_mode == "mirror") %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Gcode tool changes found. Copy and mirror mode do not support toolchanges.")}
{% endif %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set both_toolheads = true %}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=initial_tool VALUE={initial_tool}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=first_x VALUE={first_x}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=first_y VALUE={first_y}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=total_toolshifts VALUE={total_toolshifts}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=both_toolheads VALUE={both_toolheads}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_first_layer_temp VALUE="'{params.EXTRUDER_TEMP}'"
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_other_layer_temp VALUE="'{params.EXTRUDER_OTHER_LAYER_TEMP}'"
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=_TOOLCHANGE VARIABLE=toolshift_count VALUE=0
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set svv = printer.save_variables.variables %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set parking_position_t0 = printer["gcode_macro T0"].parking_position|float %}
{% set parking_position_t1 = printer["gcode_macro T1"].parking_position|float %}
{% set stepper_x_position_min = printer.configfile.settings.stepper_x.position_min|float %}
{% set stepper_x_position_endstop = printer.configfile.settings.stepper_x.position_endstop|float %}
{% set dual_carriage_position_max = printer.configfile.settings.dual_carriage.position_max|float %}
{% set dual_carriage_position_endstop = printer.configfile.settings.dual_carriage.position_endstop|float %}
{% set x_parking_space = parking_position_t0 - (stepper_x_position_endstop , stepper_x_position_min)|max %}
{% set dc_parking_space = (dual_carriage_position_endstop , dual_carriage_position_max)|min - parking_position_t1 %}
{% if svv.idex_xoffset|abs >= (x_parking_space - 0.5) or svv.idex_xoffset|abs >= (dc_parking_space - 0.5) %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Toolhead x-offset is too high for the available parking space. Calibrate your X and DC endstop positions and make sure you stay below 1mm." % (copy_mode_max_width)) }
{% endif %}
{% endif %}
{% if (idex_mode == "copy" or idex_mode == "mirror") and printer.configfile.settings.ratos.enable_gcode_transform %}
{% if params.MIN_X is not defined or params.MAX_X is not defined %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Something went wrong! Missing important post processor start print parameter!") }
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=object_xoffset VALUE=0
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set boundary_box_min_x = params.MIN_X|default(0)|float %}
{% set boundary_box_max_x = params.MAX_X|default(printable_x_max)|float %}
{% set svv = printer.save_variables.variables %}
{% if default_toolhead == 0 %}
{% set boundary_box_max_x = boundary_box_max_x + svv.idex_xoffset %}
{% else %}
{% set boundary_box_min_x = boundary_box_min_x - svv.idex_xoffset %}
{% endif %}
{% set center_x = printable_x_max / 2.0 %}
{% set safe_distance = printer.configfile.settings.dual_carriage.safe_distance|float %}
{% set object_width = boundary_box_max_x - boundary_box_min_x %}
{% set copy_mode_max_width = center_x %}
{% set mirror_mode_max_width = center_x - safe_distance / 2.0 %}
DEBUG_ECHO PREFIX="START_PRINT" MSG="OBJECT_WIDTH: {object_width} BOUNDARY_BOX_MIN_X: {boundary_box_min_x} BOUNDARY_BOX_MAX_X: {boundary_box_max_x} CENTER_X: {center_x} SAFE_DISTANCE: {safe_distance}"
{% if idex_mode == "copy" and object_width > copy_mode_max_width %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Object is too big for copy mode! Max supported width is %s mm" % (copy_mode_max_width)) }
{% endif %}
{% if idex_mode == "mirror" and object_width > mirror_mode_max_width %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Object is too big for mirror mode! Max supported width is %s mm" % (mirror_mode_max_width)) }
{% endif %}
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
{% set object_xoffset = (printable_x_max - boundary_box_max_x - boundary_box_min_x) / 2 %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=object_xoffset VALUE={object_xoffset}
{% endif %}
{% endif %}
{% set has_initial_toolhead_filament_sensor = true if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool] is defined else false %}
{% if has_initial_toolhead_filament_sensor %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s filament sensor is empty." % (initial_tool)) }
{% endif %}
{% endif %}
{% endif %}
{% set has_initial_bowden_filament_sensor = true if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool] is defined else false %}
{% if has_initial_bowden_filament_sensor %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool].enabled|lower == "true" %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s bowden sensor is empty." % (initial_tool)) }
{% endif %}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined and both_toolheads %}
{% set has_secondary_toolhead_filament_sensor = true if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)] is defined else false %}
{% if has_secondary_toolhead_filament_sensor %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s filament sensor is empty." % (1 if initial_tool == 0 else 0)) }
{% endif %}
{% endif %}
{% endif %}
{% set has_secondary_bowden_filament_sensor = true if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)] is defined else false %}
{% if has_secondary_bowden_filament_sensor %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].enabled|lower == "true" %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s bowden sensor is empty." % (1 if initial_tool == 0 else 0)) }
{% endif %}
{% endif %}
{% endif %}
{% endif %}
_CHAMBER_FILTER_ON AT="before_print_start"
{% if printer["dual_carriage"] is defined %}
{% if printer["gcode_macro _IDEX_JOIN_SPOOLS"].enabled|default(false)|lower == 'true' %}
{% if both_toolheads %}
RATOS_ECHO MSG="Spool join is not possible if both toolheads are in use!"
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% endif %}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if idex_mode == '' %}
_SET_TOOLHEAD_OFFSET T={default_toolhead} MOVE={1 if "xyz" in printer.toolhead.homed_axes else 0}
{% endif %}
{% endif %}
CLEAR_PAUSE
{% if printer["gcode_macro RatOS"].force_absolute_position|lower == 'true' %}
G90
{% endif %}
SAVE_GCODE_STATE NAME=start_print_state
G21
G90
M82
_USER_START_PRINT_BEFORE_HOMING { rawparams }
{% if z_probe_stowable == true %}
STOWABLE_PROBE_BEGIN_BATCH
{% endif %}
MAYBE_HOME
_Z_HOP
{% if idex_mode != '' and not (printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
PARK_TOOLHEAD
{% endif %}
{% if chamber_temp > 0 %}
{% if printer["fan_generic filter"] is defined %}
{% if printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float > 0 %}
SET_FAN_SPEED FAN=filter SPEED={printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float}
{% endif %}
{% endif %}
_CHAMBER_HEATER_ON START_CHAMBER_TEMP={start_chamber_temp} CHAMBER_TEMP={chamber_temp}
_USER_START_PRINT_HEAT_CHAMBER { rawparams } CHAMBER_TEMP={chamber_temp}
{% endif %}
_START_PRINT_BEFORE_HEATING_BED T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
RATOS_ECHO MSG="Heating bed..."
M190 S{bed_temp}
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
_USER_START_PRINT_AFTER_HEATING_BED { rawparams }
_START_PRINT_AFTER_HEATING_BED T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
_USER_START_PRINT_BED_MESH { rawparams } X0={X0} X1={X1} Y0={Y0} Y1={Y1}
_START_PRINT_BED_MESH X0={X0} X1={X1} Y0={Y0} Y1={Y1} T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
{% if z_probe_stowable == true %}
STOWABLE_PROBE_END_BATCH
{% endif %}
{% if idex_mode == '' %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={extruder_first_layer_temp[0]|float}
{% else %}
{% if initial_tool == 0 or both_toolheads or (default_toolhead == 0 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={extruder_first_layer_temp[0]|float}
{% endif %}
{% if initial_tool == 1 or both_toolheads or (default_toolhead == 1 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
SET_HEATER_TEMPERATURE HEATER="extruder1" TARGET={extruder_first_layer_temp[1]|float}
{% endif %}
{% endif %}
_USER_START_PRINT_PARK { rawparams }
_START_PRINT_PARK
RATOS_ECHO MSG="Heating Extruder..."
{% if idex_mode == '' %}
TEMPERATURE_WAIT SENSOR="extruder" MINIMUM={extruder_first_layer_temp[0]|float} MAXIMUM={extruder_first_layer_temp[0]|float + 5}
{% else %}
{% if initial_tool == 0 or both_toolheads or (default_toolhead == 0 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
TEMPERATURE_WAIT SENSOR="extruder" MINIMUM={extruder_first_layer_temp[0]|float} MAXIMUM={extruder_first_layer_temp[0]|float + 5}
{% endif %}
{% if initial_tool == 1 or both_toolheads or (default_toolhead == 1 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
TEMPERATURE_WAIT SENSOR="extruder1" MINIMUM={extruder_first_layer_temp[1]|float} MAXIMUM={extruder_first_layer_temp[1]|float + 5}
{% endif %}
{% endif %}
{% if hotend_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking hotend for {hotend_heat_soak_time} seconds..."
G4 P{(hotend_heat_soak_time * 1000)}
{% endif %}
{% if idex_mode == '' %}
_LED_PRINTING
{% else %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
_LED_PRINTING
{% else %}
{% if both_toolheads %}
_LED_PRINTING TOOLHEAD={initial_tool}
{% if toolchange_standby_temp > -1 %}
_LED_TOOLHEAD_STANDBY TOOLHEAD={0 if initial_tool == 1 else 1}
{% else %}
_LED_PRINTING TOOLHEAD={0 if initial_tool == 1 else 1}
{% endif %}
{% else %}
_LED_PRINTING TOOLHEAD={initial_tool}
_LED_DEACTIVATE_TOOLHEAD TOOLHEAD={0 if initial_tool == 1 else 1}
{% endif %}
{% endif %}
{% endif %}
_USER_START_PRINT_AFTER_HEATING_EXTRUDER { rawparams } X0={X0} X1={X1} Y0={Y0} Y1={Y1}
_START_PRINT_AFTER_HEATING_EXTRUDER X0={X0} X1={X1} Y0={Y0} Y1={Y1} INITIAL_TOOLHEAD={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
{% if idex_mode != '' %}
{% if not both_toolheads %}
{% if initial_tool != default_toolhead %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
{% endif %}
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
{% if toolchange_standby_temp > -1 %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if initial_tool == 1 else 'extruder1'} TARGET={toolchange_standby_temp}
{% endif %}
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% set x_offset = printer.toolhead.position.x|float - printer.gcode_move.gcode_position.x|float %}
{% endif %}
RESTORE_GCODE_STATE NAME=start_print_state
{% if idex_mode != '' %}
{% set act_idex_mode = printer["dual_carriage"].carriage_1|default('')|lower %}
{% if act_idex_mode == "copy" or act_idex_mode == "mirror" %}
SET_GCODE_OFFSET X={x_offset} MOVE=0
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% if idex_mode == "copy" and idex_mode != act_idex_mode %}
_IDEX_COPY DANCE=0
{% elif idex_mode == "mirror" and idex_mode != act_idex_mode %}
_IDEX_MIRROR DANCE=0
{% endif %}
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
RATOS_ECHO MSG="Adjusting object x-offset by {(object_xoffset)} mm"
SET_GCODE_OFFSET X_ADJUST={object_xoffset} MOVE=0
{% endif %}
{% else %}
_SELECT_TOOL T={initial_tool} TOOLSHIFT=false
{% if initial_tool != default_toolhead %}
{% set svv = printer.save_variables.variables %}
SAVE_VARIABLE VARIABLE=idex_applied_offset VALUE={default_toolhead}
_SET_TOOLHEAD_OFFSET T={initial_tool} MOVE=0
{% endif %}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
_BEACON_SET_NOZZLE_TEMP_OFFSET TOOLHEAD={initial_tool}
{% endif %}
_SET_EXTRUSION_MODE
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=True
{% if printer["gcode_macro _SELECT_TOOL"] is defined %}
SET_GCODE_VARIABLE MACRO=_SELECT_TOOL VARIABLE=last_timestamp VALUE={printer["print_stats"].print_duration}
{% endif %}
_USER_END_START_PRINT { rawparams }
G92 E0
_CHAMBER_FILTER_ON AT="after_print_start"
RATOS_ECHO MSG="Printing..."
[gcode_macro _START_PRINT_BEFORE_HEATING_BED]
gcode =
{% set target_idex_mode = params.IDEX_MODE|default("")|lower %}
{% set initial_toolhead = params.T|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %}
{% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% set act_t = 1 if idex_mode == 'primary' else 0 %}
{% set auto_z_offset_calibration = False %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% set is_fixed = true if printer["gcode_macro _VAOC"].is_fixed|default(true)|lower == 'true' else false %}
{% if printer["gcode_macro _VAOC"].auto_z_offset_calibration|default("false")|lower == 'true' and is_fixed %}
{% if target_idex_mode != "copy" and target_idex_mode != "mirror" %}
{% if both_toolheads or initial_toolhead != default_toolhead %}
{% set auto_z_offset_calibration = True %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set is_stowable_probe = true if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' else false %}
{% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %}
RATOS_ECHO MSG="Pre-heating extruder..."
{% if printer["dual_carriage"] is defined %}
{% if auto_z_offset_calibration %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={min_temp}
SET_HEATER_TEMPERATURE HEATER="extruder1" TARGET={min_temp}
{% else %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET={min_temp}
{% endif %}
{% else %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={min_temp}
{% endif %}
{% endif %}
{% if not is_stowable_probe %}
{% if printer["dual_carriage"] is defined and act_t != default_toolhead %}
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=True
{% endif %}
RATOS_ECHO MSG="Heat soaking z probe..."
{% if auto_z_offset_calibration %}
{% set safe_distance = printer.configfile.settings.dual_carriage.safe_distance|float %}
{% if default_toolhead == 0 %}
_SELECT_TOOL T=0 TOOLSHIFT=false
G1 X{safe_home_x - safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
G1 X{safe_home_x + safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
{% elif default_toolhead == 1 %}
_SELECT_TOOL T=1 TOOLSHIFT=false
G1 X{safe_home_x + safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
G1 X{safe_home_x - safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
{% endif %}
{% else %}
_MOVE_TO_SAFE_Z_HOME
{% endif %}
G0 Z2 F{z_speed}
{% endif %}
[gcode_macro _START_PRINT_AFTER_HEATING_BED]
gcode =
{% set target_idex_mode = params.IDEX_MODE|default("")|lower %}
{% set initial_toolhead = params.T|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %}
{% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set auto_z_offset_calibration = False %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% set is_fixed = true if printer["gcode_macro _VAOC"].is_fixed|default(true)|lower == 'true' else false %}
{% if printer["gcode_macro _VAOC"].auto_z_offset_calibration|default("false")|lower == 'true' and is_fixed %}
{% if target_idex_mode != "copy" and target_idex_mode != "mirror" %}
{% if both_toolheads or initial_toolhead != default_toolhead %}
{% set auto_z_offset_calibration = True %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_wipe_before_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_wipe_before_true_zero|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %}
RATOS_ECHO MSG="Waiting for extruder to be preheated..."
{% if printer["dual_carriage"] is defined %}
{% if auto_z_offset_calibration %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
TEMPERATURE_WAIT SENSOR=extruder1 MINIMUM={min_temp} MAXIMUM={max_temp}
{% else %}
{% if default_toolhead == 0 %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
{% else %}
TEMPERATURE_WAIT SENSOR=extruder1 MINIMUM={min_temp} MAXIMUM={max_temp}
{% endif %}
{% endif %}
{% else %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_Z_HOP
{% endif %}
{% if auto_z_offset_calibration %}
{% set parking_position_t0 = printer["gcode_macro T0"].parking_position|float %}
{% set parking_position_t1 = printer["gcode_macro T1"].parking_position|float %}
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=True
PARK_TOOLHEAD
_CLEANING_MOVE TOOLHEAD={default_toolhead}
_SELECT_TOOL T={0 if default_toolhead == 1 else 1} X={parking_position_t0 if default_toolhead == 1 else parking_position_t1} Y=0 TOOLSHIFT=false
_CLEANING_MOVE TOOLHEAD={0 if default_toolhead == 1 else 1}
_VAOC_CALIBRATE_Z_OFFSET AUTO_Z_OFFSET=True
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=false
{% endif %}
{% set needs_rehoming = False %}
{% if printer.z_tilt is defined and not printer.z_tilt.applied %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% set needs_rehoming = True %}
{% endif %}
{% if printer.quad_gantry_level is defined and not printer.quad_gantry_level.applied %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% set needs_rehoming = True %}
{% endif %}
{% if needs_rehoming %}
G28 Z
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero %}
{% if beacon_contact_wipe_before_true_zero %}
_START_PRINT_AFTER_HEATING_BED_PROBE_FOR_WIPE
{% endif %}
_START_PRINT_AFTER_HEATING_CONTACT_WITH_OPTIONAL_WIPE
{% endif %}
[gcode_macro _START_PRINT_AFTER_HEATING_BED_PROBE_FOR_WIPE]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
G0 Z5 F{z_speed}
G0 X50 Y10 F{speed}
PROBE PROBE_METHOD=contact SAMPLES=1
BEACON_QUERY
[gcode_macro _START_PRINT_AFTER_HEATING_CONTACT_WITH_OPTIONAL_WIPE]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_true_zero_location = printer["gcode_macro RatOS"].beacon_contact_true_zero_location|default("front")|lower %}
{% set beacon_contact_true_zero_margin_x = printer["gcode_macro RatOS"].beacon_contact_true_zero_margin_x|default(30)|int %}
{% set beacon_contact_wipe_before_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_wipe_before_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_wipe_before_true_zero %}
{% if printer.beacon.last_probe_result|lower == "ok" %}
{% set last_z_offset = printer.beacon.last_z_result %}
RATOS_ECHO MSG="Auto calibration nozzle wipe with probe result {last_z_offset}..."
G0 Z{(0.2 + last_z_offset)} F{z_speed}
G0 X70 F300
{% else %}
RATOS_ECHO MSG="Skipping auto calibration nozzle wipe because probing failed!"
{% endif %}
{% endif %}
G0 Z5 F{z_speed}
_MOVE_TO_SAFE_Z_HOME
RATOS_ECHO MSG="Heating extruder to probing temperature..."
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET={beacon_contact_true_zero_temp}
TEMPERATURE_WAIT SENSOR={"extruder" if default_toolhead == 0 else "extruder1"} MINIMUM={beacon_contact_true_zero_temp} MAXIMUM={beacon_contact_true_zero_temp + 5}
RATOS_ECHO MSG="Beacon contact auto calibration..."
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
G0 Z5 F{z_speed}
[gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER]
gcode =
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set first_x = printer["gcode_macro START_PRINT"].first_x|default(-1)|float %}
{% set first_y = printer["gcode_macro START_PRINT"].first_y|default(-1)|float %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set center_x = printable_x_max / 2.0 %}
{% set center_y = printable_y_max / 2.0 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% if printer["dual_carriage"] is defined %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
{% endif %}
{% set X0 = params.X0|default(-1)|int %}
{% set X1 = params.X1|default(-1)|int %}
{% set Y0 = params.Y0|default(-1)|int %}
{% set Y1 = params.Y1|default(-1)|int %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set initial_toolhead = params.INITIAL_TOOLHEAD|default(default_toolhead)|int %}
{% if idex_mode == '' %}
_PRIME
{% else %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
RATOS_ECHO PREFIX="IDEX" MSG="using combined prime offset for IDEX {idex_mode} mode"
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% else %}
{% if both_toolheads %}
{% if initial_toolhead == 0 %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T1"
_SELECT_TOOL T=1 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T0"
_SELECT_TOOL T=0 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% else %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T0"
_SELECT_TOOL T=0 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T1"
_SELECT_TOOL T=1 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% endif %}
{% else %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T{initial_toolhead}"
_SELECT_TOOL T={initial_toolhead} TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% endif %}
{% endif %}
{% endif %}
CACHE_TOOLHEAD_SETTINGS KEY="start_print_after_heating_extruder"
SET_MACRO_TRAVEL_SETTINGS
{% if (X0 > -1 and Y1 > -1) or (first_x > 0 and first_y > 0) %}
{% if printer["dual_carriage"] is defined %}
{% set acceleration = printer["gcode_macro RatOS"].toolchange_travel_accel %}
{% set max_accel = printer.toolhead.max_accel|float %}
{% set square_corner_velocity = printer.toolhead.square_corner_velocity|float %}
SET_VELOCITY_LIMIT ACCEL={acceleration} MINIMUM_CRUISE_RATIO=0 SQUARE_CORNER_VELOCITY=20
{% endif %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
G0 Z3 F{z_speed}
{% endif %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro RatOS"].nozzle_priming|lower == 'false' %}
{% set first_z = 1 %}
{% else %}
{% set first_z = 3 %}
{% endif %}
{% if idex_mode == "mirror" %}
{% if first_y >= 0 %}
G0 Y{first_y} F{speed}
{% else %}
G0 Y{Y1} F{speed}
{% endif %}
{% endif %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro RatOS"].nozzle_priming|lower == 'false' %}
_MOVE_TO_LOADING_POSITION TOOLHEAD={initial_toolhead}
_PURGE_FILAMENT TOOLHEAD={initial_toolhead} E={printer["gcode_macro RatOS"].toolchange_first_purge|default(50)|float}
_CLEANING_MOVE TOOLHEAD={initial_toolhead}
{% endif %}
{% if first_x >= 0 and first_y >= 0 %}
G0 X{first_x} Y{first_y} Z{first_z} F{speed}
{% else %}
{% set first_x = X0 %}
{% set first_y = Y0 %}
{% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' or printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %}
{% set first_x = X0 %}
{% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %}
{% set first_x = X1 %}
{% else %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_x|float <= center_x %}
{% set first_x = X0 %}
{% else %}
{% set first_x = X1 %}
{% endif %}
{% endif %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %}
{% set first_y = Y0 %}
{% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %}
{% set first_y = Y1 %}
{% else %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_y|float <= center_y %}
{% set first_y = Y0 %}
{% else %}
{% set first_y = Y1 %}
{% endif %}
{% endif %}
{% endif %}
G0 X{first_x} Y{first_y} Z{first_z} F{speed}
{% endif %}
{% endif %}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print_after_heating_extruder"
_LOAD_RATOS_SKEW_PROFILE
[gcode_macro _PRIME]
gcode =
{% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' or printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %}
PRIME_BLOB INITIAL_TOOLHEAD={params.INITIAL_TOOLHEAD} BOTH_TOOLHEADS={params.BOTH_TOOLHEADS} IDEX_MODE={params.IDEX_MODE} Y1={params.Y1}
{% endif %}
[gcode_macro END_PRINT]
description = End print procedure, use this in your Slicer.
gcode =
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
SAVE_GCODE_STATE NAME=end_print_state
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=_IDEX_REMAP_TOOLHEADS VARIABLE=enabled VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
{% set object_xoffset = printer["gcode_macro START_PRINT"].object_xoffset|default(0)|float %}
RATOS_ECHO MSG="Adjusting object x-offset by {(0-object_xoffset)} mm"
SET_GCODE_OFFSET X_ADJUST={(0-object_xoffset)}
{% endif %}
{% endif %}
_USER_END_PRINT_BEFORE_HEATERS_OFF { rawparams }
_END_PRINT_BEFORE_HEATERS_OFF
TURN_OFF_HEATERS
_USER_END_PRINT_AFTER_HEATERS_OFF { rawparams }
_END_PRINT_AFTER_HEATERS_OFF
_USER_END_PRINT_PARK { rawparams }
_END_PRINT_PARK
{% if printer["gcode_macro RatOS"].skew_profile is defined %}
SET_SKEW CLEAR=1
{% endif %}
{% if printer["dual_carriage"] is not defined and printer["gcode_macro RatOS"].end_print_motors_off|lower != 'false' %}
M84
{% endif %}
M107
BED_MESH_CLEAR
RATOS_ECHO MSG="Done :)"
RESTORE_GCODE_STATE NAME=end_print_state
{% if printer["dual_carriage"] is defined %}
M84
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
{% if printer["dual_carriage"] is not defined %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
SET_GCODE_OFFSET Z=0 MOVE=0
{% endif %}
{% endif %}
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print"
_CHAMBER_FILTER_ON AT="print_end"
_CHAMBER_FILTER_OFF
_CHAMBER_HEATER_OFF
_USER_END_PRINT_FINISHED { rawparams }
[gcode_macro _END_PRINT_BEFORE_HEATERS_OFF]
gcode =
RATOS_ECHO MSG="Cleaning up..."
[gcode_macro _END_PRINT_AFTER_HEATERS_OFF]
gcode =
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set current_z = printer.toolhead.position.z|float %}
{% set z_hop = printer["gcode_macro RatOS"].end_print_park_z_hop|float %}
{% set r = printer["gcode_macro RatOS"].end_print_retract_filament|default(4)|float %}
{% if current_z < (max_z - z_hop) %}
{% set z_safe = z_hop %}
{% else %}
{% set z_safe = max_z - current_z %}
{% endif %}
G91
G1 E-2 F3600
G0 Z{z_safe} F3600
G1 E-{(r-2)} F3600
G90
[gcode_macro _SET_EXTRUSION_MODE]
gcode =
{% if printer["gcode_macro RatOS"].relative_extrusion|lower == 'true' %}
M83
{% else %}
M82
{% endif %}
[gcode_macro GENERATE_SHAPER_GRAPHS]
description = Genarates input shaper resonances graphs for analysis. Uses the AXIS parameter for if you only want to do one axis at a time, (eg. GENERATE_SHAPER_GRAPHS AXIS=X)
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="generate_shaper_graphs"
SET_MACRO_TRAVEL_SETTINGS
CACHE_IS_GRAPH_FILES
_LED_INPUT_SHAPER_START
{% set axis = params.AXIS|default('')|lower %}
{% set freq_start = params.FREQUENCY_START|default(10)|int %}
{% set freq_end = params.FREQUENCY_END|default(133)|int %}
{% set hz_per_sec = params.HZ_PER_SEC|default(1)|float %}
{% if axis != '' %}
{% if axis == 'x' %}
MAYBE_HOME
TEST_RESONANCES AXIS=X FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_x
{% elif axis == 'y' %}
MAYBE_HOME
TEST_RESONANCES AXIS=Y FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_y
{% else %}
{action_raise_error("Unknown axis specified. Expected X or Y.")}
{% endif %}
{% else %}
MAYBE_HOME
TEST_RESONANCES AXIS=X FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
TEST_RESONANCES AXIS=Y FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_x
RUN_SHELL_COMMAND CMD=generate_shaper_graph_y
{% endif %}
_LED_INPUT_SHAPER_END
RESTORE_TOOLHEAD_SETTINGS KEY="generate_shaper_graphs"
_LEARN_MORE_CALIBRATION
SHOW_IS_GRAPH_FILES TITLE="Shaper graph"
[gcode_shell_command generate_shaper_graph_x]
command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-x.sh
timeout = 60.
verbose = True
[gcode_shell_command generate_shaper_graph_y]
command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-y.sh
timeout = 60.
verbose = True
[gcode_macro MEASURE_COREXY_BELT_TENSION]
description = Generates resonance graph used to ensure belts are equally tensioned.
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="measure_corexy_belt_tension"
SET_MACRO_TRAVEL_SETTINGS
CACHE_IS_GRAPH_FILES
_LED_INPUT_SHAPER_START
{% set freq_start = params.FREQUENCY_START|default(10)|int %}
{% set freq_end = params.FREQUENCY_END|default(133)|int %}
{% set hz_per_sec = params.HZ_PER_SEC|default(1)|float %}
MAYBE_HOME
TEST_RESONANCES AXIS=1,1 OUTPUT=raw_data NAME=belt-tension-upper FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
TEST_RESONANCES AXIS=1,-1 OUTPUT=raw_data NAME=belt-tension-lower FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_belt_tension_graph
_LED_INPUT_SHAPER_END
RESTORE_TOOLHEAD_SETTINGS KEY="measure_corexy_belt_tension"
_LEARN_MORE_CALIBRATION
SHOW_IS_GRAPH_FILES TITLE="Belt Tension Graph"
[gcode_shell_command generate_belt_tension_graph]
command = /home/pi/printer_data/config/RatOS/scripts/generate-belt-tension-graph.sh
timeout = 90.
verbose = True
[idle_timeout]
gcode =
{% if printer.webhooks.state|lower == 'ready' %}
{% if printer.pause_resume.is_paused|lower == 'false' %}
RATOS_ECHO PREFIX="IDLE" MSG="2 hours since last activity. Powering off heaters and motors.."
TURN_OFF_HEATERS
M84
{% endif %}
{% endif %}
timeout = 7200
[temperature_sensor raspberry_pi]
sensor_type = temperature_host
[skew_correction]
[input_shaper]
[virtual_sdcard]
path = ~/printer_data/gcodes
[display_status]
[pause_resume]
[force_move]
enable_force_move = True
[respond]
[resonance_generator]
[ratos]
allow_unknown_gcode_generator = True
[exclude_object]
[heater_bed]
heater_pin = heater_bed_heating_pin
sensor_pin = heater_bed_sensor_pin
sensor_type = Generic 3950
min_temp = 0
max_temp = 120
pwm_cycle_time = 0.02
control = pid
pid_kp = 68.203
pid_ki = 2.842
pid_kd = 409.216
[controller_fan controller_fan]
pin = fan_controller_board_pin
[printer]
kinematics = corexy
max_velocity = 300
max_accel = 3000
max_z_velocity = 20
max_z_accel = 350
square_corner_velocity = 5
minimum_cruise_ratio = 0.5
[gcode_macro QUAD_GANTRY_LEVEL]
rename_existing = QUAD_GANTRY_LEVEL_ORIG
gcode =
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
DEPLOY_PROBE
{% endif %}
QUAD_GANTRY_LEVEL_ORIG
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
STOW_PROBE
{% endif %}
[stepper_x]
position_max = 350
position_endstop = 350
step_pin = PC14
dir_pin = !x_dir_pin
enable_pin = !PE6
microsteps = 64
full_steps_per_rotation = 400
rotation_distance = 40
homing_speed = 50
endstop_pin = tmc5160_stepper_x:virtual_endstop
homing_retract_dist = 0
position_min = 0
[stepper_y]
position_max = 350
position_endstop = 350
step_pin = PE5
dir_pin = y_dir_pin
enable_pin = !PE3
microsteps = 64
full_steps_per_rotation = 400
rotation_distance = 40
homing_speed = 50
endstop_pin = tmc5160_stepper_y:virtual_endstop
homing_retract_dist = 0
position_min = 0
[stepper_z]
position_max = 310
step_pin = PG9
dir_pin = !z0_dir_pin
enable_pin = !PG13
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
position_min = -5
homing_speed = 10
endstop_pin = probe:z_virtual_endstop
[bed_mesh]
speed = 300
horizontal_move_z = 10
mesh_min = 20,30
mesh_max = 310,310
fade_start = 0.6
fade_end = 10.0
probe_count = 5,5
algorithm = bicubic
[quad_gantry_level]
gantry_corners =
-60,-10
410,420
points =
50,25
50,275
300,275
300,25
speed = 300
horizontal_move_z = 10
retries = 5
retry_tolerance = 0.0075
max_adjust = 10
[gcode_macro G32]
gcode =
SAVE_GCODE_STATE NAME=STATE_G32
G90
G28
QUAD_GANTRY_LEVEL
G28
G0 X175 Y175 Z30 F3600
RESTORE_GCODE_STATE NAME=STATE_G32
[firmware_retraction]
retract_speed = 60
unretract_extra_length = 0
unretract_speed = 60
retract_length = 0.5
[resonance_tester]
accel_chip_x = beacon
accel_chip_y = beacon
probe_points =
175,175,20
[tmc5160 stepper_x]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD6
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.022
diag1_pin = ^!x_diag_pin
driver_sgt = 0
[tmc5160 stepper_y]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD5
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.022
diag1_pin = ^!y_diag_pin
driver_sgt = 0
[tmc5160 stepper_z]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD2
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[tmc5160 stepper_z1]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA15
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z1]
step_pin = PG11
dir_pin = !z1_dir_pin
enable_pin = !PG12
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc5160 stepper_z2]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA9
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z2]
step_pin = PB4
dir_pin = !z2_dir_pin
enable_pin = !PB5
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc5160 stepper_z3]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA10
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z3]
step_pin = PG15
dir_pin = !z3_dir_pin
enable_pin = !PG14
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc2209 extruder]
stealthchop_threshold = 0
interpolate = False
uart_pin = toolboard_t0:PB5
run_current = 0.707
driver_tbl = 0
driver_toff = 4
driver_hend = 6
driver_hstrt = 7
sense_resistor = 0.11
[beacon]
serial = /dev/beacon
x_offset = 0
y_offset = 22.5
mesh_main_direction = x
mesh_runs = 1
speed = 15.
lift_speed = 80.
contact_max_hotend_temperature = 275
[delayed_gcode _BEACON_INIT]
initial_duration = 1
gcode =
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
{% set svv = printer.save_variables.variables %}
{% set nozzle_expansion_coefficient_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(0)|float %}
{% if nozzle_expansion_coefficient_multiplier == 0 %}
{% if printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier is not defined %}
{% set nozzle_expansion_coefficient_multiplier = 1.0 %}
{% else %}
{% set nozzle_expansion_coefficient_multiplier = printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier|default(1.0)|float %}
{% endif %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_multiplier VALUE={nozzle_expansion_coefficient_multiplier}
{% endif %}
{% if printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier is defined %}
CONSOLE_ECHO TITLE="Deprecated gcode variable" TYPE="warning" MSG={'"Please remove the variable beacon_contact_expansion_multiplier from your config file."'}
{% endif %}
[gcode_macro BEACON_RATOS_CALIBRATION]
gcode =
RATOS_ECHO MSG="Did you mean BEACON_RATOS_CALIBRATE?"
[gcode_macro BEACON_RATOS_CALIBRATE]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
BEACON_INITIAL_CALIBRATION _AUTOMATED=True
{% if beacon_contact_start_print_true_zero %}
BEACON_POKE_TEST _AUTOMATED=True
_BEACON_CHECK_POKE
{% if printer["dual_carriage"] is not defined %}
BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET _AUTOMATED=True
{% endif %}
{% endif %}
{% if chamber_temp > 0 %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
BEACON_FINAL_CALIBRATION _AUTOMATED=True BED_TEMP={bed_temp} CHAMBER_TEMP={chamber_temp}
{% if beacon_contact_start_print_true_zero %}
BEACON_MEASURE_GANTRY_TWIST
_BEACON_MAYBE_SCAN_COMPENSATION
{% endif %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% if chamber_temp > 0 %}
_CHAMBER_HEATER_OFF
{% endif %}
{% if beacon_contact_start_print_true_zero %}
{% if printer["dual_carriage"] is not defined %}
_BEACON_ECHO_NOZZLE_TEMP_OFFSETS
{% endif %}
_BEACON_ECHO_POKE
{% endif %}
RATOS_ECHO MSG="Beacon calibration finished!"
_LED_BEACON_CALIBRATION_END
RATOS_ECHO MSG="Saving config and restarting klipper..."
SAVE_CONFIG
[gcode_macro BEACON_INITIAL_CALIBRATION]
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed * 60 %}
MAYBE_HOME X=True Y=True
_LED_BEACON_CALIBRATION_START
G90
_MOVE_TO_SAFE_Z_HOME
BEACON_AUTO_CALIBRATE
_Z_HOP
RATOS_ECHO MSG="Initial beacon contact calibration finished!"
{% if not automated %}
_CONSOLE_SAVE_CONFIG
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro BEACON_FINAL_CALIBRATION]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
_BEACON_HOME_AND_ABL
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
_LED_BEACON_CALIBRATION_START
G90
G0 Z2 F{z_hop_speed}
RATOS_ECHO MSG="Waiting for calibration temperature..."
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=150
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp}
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} MAXIMUM={(bed_temp + 5)}
TEMPERATURE_WAIT SENSOR={'extruder' if default_toolhead == 0 else 'extruder1'} MINIMUM=150 MAXIMUM=155
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
_Z_HOP
BEACON_AUTO_CALIBRATE
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% endif %}
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_OFF
{% endif %}
_Z_HOP
RATOS_ECHO MSG="Final beacon contact calibration finished!"
{% if not automated %}
_CONSOLE_SAVE_CONFIG
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro BEACON_POKE_TEST]
variable_poke_result_1 = -1
variable_poke_result_2 = -1
variable_poke_result_3 = -1
variable_poke_result_4 = -1
variable_poke_result_5 = -1
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_1 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_2 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_3 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_4 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_5 VALUE=-1
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
G0 Z5 F{z_hop_speed}
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=1
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=2
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=3
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=4
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=5
_Z_HOP
RATOS_ECHO MSG="Beacon poke test finished!"
{% if not automated %}
_BEACON_ECHO_POKE
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro _BEACON_PROBE_POKE]
gcode =
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
BEACON_POKE speed=3 top=5 bottom={poke_bottom}
BEACON_QUERY
[gcode_macro _BEACON_STORE_POKE]
gcode =
{% set i = params.I|default(1)|int %}
{% set last_z = printer.beacon.last_poke_result|default(0)|float %}
{% if printer.beacon.last_poke_result|lower != "none" %}
{% if printer.beacon.last_poke_result.error == 0 %}
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE={"poke_result_%s" % i} VALUE={printer.beacon.last_poke_result.latency}
{% endif %}
{% endif %}
[gcode_macro _BEACON_CHECK_POKE]
gcode =
{% set p1 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_1|int %}
{% set p2 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_2|int %}
{% set p3 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_3|int %}
{% set p4 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_4|int %}
{% set p5 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_5|int %}
{% if p1 == -1 or p2 == -1 or p3 == -1 or p4 == -1 or p5 == -1 %}
_LED_BEACON_CALIBRATION_ERROR
{ action_raise_error("Beacon poke test error!") }
{% endif %}
{% set avg = (p1 + p2 + p3 + p4 + p5) / 5 %}
{% if avg > 6 %}
_LED_BEACON_CALIBRATION_ERROR
{ action_raise_error("Beacon poke test failed!") }
{% endif %}
[gcode_macro _BEACON_ECHO_POKE]
gcode =
{% set p1 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_1|int %}
{% set p2 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_2|int %}
{% set p3 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_3|int %}
{% set p4 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_4|int %}
{% set p5 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_5|int %}
{% set avg = (p1 + p2 + p3 + p4 + p5) / 5 %}
{% if avg <= 1 %}
{% set type = "success" %}
{% set note = "Extremely low noise, rarely achieved" %}
{% elif avg > 1 and avg <= 4 %}
{% set type = "info" %}
{% set note = "Excellent performance for a typical printer" %}
{% elif avg > 4 and avg <= 8 %}
{% set type = "warning" %}
{% set note = "Acceptable performance, machine may have considerable cyclic axis noise" %}
{% elif avg > 8 and avg <= 11 %}
{% set type = "alert" %}
{% set note = "Not ideal, may want to verify proper mounting or use thinner stackups" %}
{% elif avg > 11 %}
{% set type = "alert" %}
{% set note = "Reason for concern, present setup may be risky to continue with" %}
{% endif %}
CONSOLE_ECHO TITLE="Beacon poke test result:" TYPE={type} MSG={'"Average latency: %.2f_N_%s"' % (avg, note)}
[gcode_macro BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET]
variable_reference_z = 0.0
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set test_margin = 30 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero %}
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
RATOS_ECHO PREFIX="BEACON" MSG="Nozzle temperature offset calibration..."
{% for i in range(10) %}
beacon_poke speed=3 top=5 bottom={poke_bottom}
{% endfor %}
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=250
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET=0
{% if not automated %}
_BEACON_ECHO_NOZZLE_TEMP_OFFSETS
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
{% endif %}
[gcode_macro _BEACON_PROBE_NOZZLE_TEMP_OFFSET]
gcode =
{% set temp = params.TEMP|int %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set hotend_heat_soak_time = printer["gcode_macro RatOS"].hotend_heat_soak_time|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% set idex_zcontrolpoint = svv.idex_zcontrolpoint|default(150)|float %}
RATOS_ECHO PREFIX="BEACON" MSG="Waiting for nozzle to reach {temp}°C..."
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET={temp}
TEMPERATURE_WAIT SENSOR={"extruder" if default_toolhead == 0 else "extruder1"} MINIMUM={temp} MAXIMUM={temp + 2}
{% if hotend_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking hotend for {hotend_heat_soak_time} seconds..."
G4 P{(hotend_heat_soak_time * 1000)}
{% endif %}
RATOS_ECHO PREFIX="BEACON" MSG="Probing with nozzle temperature {temp}°C..."
PROBE PROBE_METHOD=contact PROBE_SPEED=3 LIFT_SPEED=15 SAMPLES=5 SAMPLE_RETRACT_DIST=3 SAMPLES_TOLERANCE=0.005 SAMPLES_TOLERANCE_RETRIES=10 SAMPLES_RESULT=median
BEACON_QUERY
G0 Z5 F{z_speed}
[gcode_macro _BEACON_STORE_NOZZLE_TEMP_OFFSET]
gcode =
{% set temp = params.TEMP|int %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% set last_z = printer.beacon.last_z_result|default(0)|float %}
{% if temp == 150 %}
SET_GCODE_VARIABLE MACRO=BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET VARIABLE=reference_z VALUE={last_z}
{% else %}
{% set reference_z = printer["gcode_macro BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET"].reference_z|default(0)|float %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_t{default_toolhead} VALUE={(last_z - reference_z)}
{% endif %}
[gcode_macro _BEACON_ECHO_NOZZLE_TEMP_OFFSETS]
gcode =
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% if default_toolhead == 0 %}
CONSOLE_ECHO TYPE="info" MSG={'"T0 expansion coefficient %.6f"' % svv.nozzle_expansion_coefficient_t0}
{% else %}
CONSOLE_ECHO TYPE="info" MSG={'"T1 expansion coefficient %.6f"' % svv.nozzle_expansion_coefficient_t1}
{% endif %}
[gcode_macro _BEACON_SET_NOZZLE_TEMP_OFFSET]
variable_runtime_temp = 0
gcode =
{% set toolhead = params.TOOLHEAD|default(0)|int %}
{% set reset = true if params.RESET|default(false)|lower == 'true' else false %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set svv = printer.save_variables.variables %}
{% if reset %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_applied_offset VALUE=0
{% else %}
{% if beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
{% set nozzle_expansion_coefficient_t0 = svv.nozzle_expansion_coefficient_t0|default(0)|float %}
{% if printer["dual_carriage"] is defined %}
{% set nozzle_expansion_coefficient_t1 = svv.nozzle_expansion_coefficient_t1|default(0)|float %}
{% endif %}
{% set nozzle_expansion_coefficient_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(1.0)|float %}
{% set applied_offset = svv.nozzle_expansion_applied_offset|default(0)|float %}
{% set temp = printer['extruder' if toolhead == 0 else 'extruder1'].target|float %}
{% set temp_offset = temp - beacon_contact_true_zero_temp %}
{% set expansion_coefficient = nozzle_expansion_coefficient_t0 if toolhead == 0 else nozzle_expansion_coefficient_t1 %}
{% set expansion_offset = nozzle_expansion_coefficient_multiplier * (temp_offset * (expansion_coefficient / 100)) %}
{% set new_offset = ((-applied_offset) + expansion_offset) %}
SET_GCODE_OFFSET Z_ADJUST={new_offset} MOVE=1 SPEED={z_speed}
SAVE_VARIABLE VARIABLE=nozzle_expansion_applied_offset VALUE={expansion_offset}
SET_GCODE_VARIABLE MACRO=_BEACON_SET_NOZZLE_TEMP_OFFSET VARIABLE=runtime_temp VALUE={temp}
RATOS_ECHO PREFIX="BEACON" MSG={'"Nozzle expansion offset of %.6fmm applied to T%s"' % (expansion_offset, toolhead)}
DEBUG_ECHO PREFIX="_BEACON_SET_NOZZLE_TEMP_OFFSET" MSG="multiplier: {nozzle_expansion_coefficient_multiplier}, coefficient: {expansion_coefficient}, temp_offset: {temp_offset}, expansion_offset: {expansion_offset}, applied_offset: {applied_offset}, new_offset: {new_offset}"
{% endif %}
{% endif %}
[gcode_macro BEACON_MEASURE_GANTRY_TWIST]
variable_needs_compensation = False
variable_reference_z = 0.0
variable_front = 0.0
variable_front_left = 0.0
variable_front_right = 0.0
variable_back = 0.0
variable_back_left = 0.0
variable_back_right = 0.0
variable_right = 0.0
variable_left = 0.0
variable_margin_x = 40
variable_margin_y = 40
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=False
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
RATOS_ECHO PREFIX="BEACON" MSG="Measure gantry twist..."
{% for i in range(10) %}
beacon_poke speed=3 top=5 bottom={poke_bottom}
{% endfor %}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="center"
G0 X{margin_x} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front_left"
G0 X{safe_home_x} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front"
G0 X{(printable_x_max - margin_x)} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front_right"
G0 X{(printable_x_max - margin_x)} Y{safe_home_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="right"
G0 X{(printable_x_max - margin_x)} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back_right"
G0 X{safe_home_x} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back"
G0 X{margin_x} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back_left"
G0 X{margin_x} Y{safe_home_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="left"
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
_BEACON_ECHO_GANTRY_TWIST
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro _BEACON_PROBE_GANTRY_TWIST]
gcode =
RATOS_ECHO PREFIX="BEACON" MSG="Probing..."
BEACON_OFFSET_COMPARE
BEACON_QUERY
[gcode_macro _BEACON_STORE_GANTRY_TWIST]
gcode =
{% set location = params.LOCATION|lower %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set last_z = printer.beacon.last_offset_result["delta"]|default(0)|float %}
{% if location == "center" %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=reference_z VALUE={last_z}
{% else %}
{% set reference_z = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].reference_z|default(0)|float %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE={location} VALUE={(last_z - reference_z)}
{% endif %}
[gcode_macro _BEACON_ECHO_GANTRY_TWIST]
gcode =
{% set reference_z = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].reference_z|default(0)|float * 1000 %}
{% set front_left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front_left|default(0)|float * 1000 %}
{% set front = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front|default(0)|float * 1000 %}
{% set front_right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front_right|default(0)|float * 1000 %}
{% set right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].right|default(0)|float * 1000 %}
{% set back_right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back_right|default(0)|float * 1000 %}
{% set back = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back|default(0)|float * 1000 %}
{% set back_left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back_left|default(0)|float * 1000 %}
{% set left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].left|default(0)|float * 1000 %}
{% set line_1 = "Front left: %.6fμm" % (front_left) %}
{% set line_2 = "Front center: %.6fμm" % (front) %}
{% set line_3 = "Front right: %.6fμm" % (front_right) %}
{% set line_4 = "Left center: %.6fμm" % (left) %}
{% set line_5 = "Right center: %.6fμm" % (right) %}
{% set line_6 = "Back left: %.6fμm" % (back_left) %}
{% set line_7 = "Back center: %.6fμm" % (back) %}
{% set line_8 = "Back right: %.6fμm" % (back_right) %}
{% set max_value = [(front_left|abs), (front|abs), (front_right|abs), (left|abs), (right|abs), (back_left|abs), (back|abs), (back_right|abs)]|max %}
{% if max_value <= 50 %}
{% set type = "success" %}
{% set recommendation = "Very low gantry twist: %.6fμm._N_No beacon scan compensation needed." % max_value %}
{% elif max_value > 50 and max_value <= 100 %}
{% set type = "info" %}
{% set recommendation = "Low gantry twist: %.6fμm._N_You may experience first layer inconsistensies, consider beacon scan compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 100 and max_value <= 150 %}
{% set type = "warning" %}
{% set recommendation = "High gantry twist: %.6fμm._N_High chance of first layer problems, beacon scan compensation is highly encouraged." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 150 and max_value <= 200 %}
{% set type = "alert" %}
{% set recommendation = "Very High gantry twist: %.6fμm._N_You will encounter first layer problems on large prints unless you activate beacon scan compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 200 %}
{% set type = "alert" %}
{% set recommendation = "Extremely high gantry twist: %.6fμm._N_You have significant scan/contact inconsistency which is indicative of mechanical problems, please investigate before resorting to software compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% endif %}
CONSOLE_ECHO TITLE="Gantry twist relative to the center" TYPE={type} MSG={'"_N_%s_N__N_%s_N_%s_N_%s_N_%s_N_%s_N_%s_N_%s_N_%s"' % (recommendation, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8)}
[gcode_macro BEACON_CREATE_SCAN_COMPENSATION_MESH]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set profile = params.PROFILE|default("Contact")|string %}
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_scan_compensation_enable = true if printer["gcode_macro RatOS"].beacon_scan_compensation_enable|default(false)|lower == 'true' else false %}
{% set probe_count = printer["gcode_macro RatOS"].beacon_scan_compensation_probe_count %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% if not beacon_scan_compensation_enable %}
RATOS_ECHO MSG="Beacon scan compensation is disabled!"
{% else %}
MAYBE_HOME
_MOVE_TO_SAFE_Z_HOME
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_LED_BEACON_CALIBRATION_START
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=150
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp}
RATOS_ECHO MSG="Please wait..."
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} MAXIMUM={(bed_temp + 5)}
TEMPERATURE_WAIT SENSOR={'extruder' if default_toolhead == 0 else 'extruder1'} MINIMUM=150 MAXIMUM=155
{% endif %}
{% if not automated %}
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
{% endif %}
{% if printer.z_tilt is defined %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% endif %}
{% if printer.quad_gantry_level is defined %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% endif %}
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES=2 SAMPLES_DROP=1 SAMPLES_TOLERANCE_RETRIES=10 PROBE_COUNT={probe_count[0]},{probe_count[1]} PROFILE={profile}
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% endif %}
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_OFF
{% endif %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
RATOS_ECHO MSG="Beacon scan compensation mesh created!"
{% if not automated %}
RATOS_ECHO MSG="Saving config and restarting klipper..."
SAVE_CONFIG
{% endif %}
{% endif %}
[gcode_macro _BEACON_APPLY_SCAN_COMPENSATION]
gcode =
{% set beacon_scan_compensation_profile = printer["gcode_macro RatOS"].beacon_scan_compensation_profile %}
{% set beacon_scan_compensation_enable = true if printer["gcode_macro RatOS"].beacon_scan_compensation_enable|default(false)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_SCAN_COMPENSATION" MSG="beacon_scan_compensation_profile {beacon_scan_compensation_profile}, beacon_scan_compensation_enable {beacon_scan_compensation_enable}"
{% if beacon_scan_compensation_enable %}
BEACON_APPLY_SCAN_COMPENSATION PROFILE={beacon_scan_compensation_profile}
{% endif %}
[gcode_macro _BEACON_MAYBE_SCAN_COMPENSATION]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set needs_scan_compensation = true if printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].needs_compensation|default(false)|lower == 'true' else false %}
{% if needs_scan_compensation %}
BEACON_CREATE_SCAN_COMPENSATION_MESH _AUTOMATED=True BED_TEMP={bed_temp} CHAMBER_TEMP={chamber_temp}
{% endif %}
[gcode_macro _BEACON_HOME_AND_ABL]
gcode =
MAYBE_HOME X=True Y=True
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% set needs_rehoming = False %}
{% if printer.z_tilt is defined and not printer.z_tilt.applied %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% set needs_rehoming = True %}
{% endif %}
{% if printer.quad_gantry_level is defined and not printer.quad_gantry_level.applied %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% set needs_rehoming = True %}
{% endif %}
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% if needs_rehoming %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% endif %}
[gcode_macro _BEACON_SAVE_MULTIPLIER]
gcode =
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set multiplier = printer["gcode_macro _BEACON_APPLY_RUNTIME_MULTIPLIER"].runtime_multiplier|default(-1.0)|float %}
DEBUG_ECHO PREFIX="_BEACON_SAVE_MULTIPLIER" MSG="multiplier: {multiplier}, beacon_contact_start_print_true_zero: {beacon_contact_start_print_true_zero}, beacon_contact_expansion_compensation: {beacon_contact_expansion_compensation}"
{% if multiplier > 0 and beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_multiplier VALUE={multiplier}
SET_GCODE_VARIABLE MACRO=_BEACON_APPLY_RUNTIME_MULTIPLIER VARIABLE=runtime_multiplier VALUE=-1.0
CONSOLE_ECHO TITLE="Hotend thermal expansion compensation" TYPE="success" MSG={'"New value is: %.6f_N_The new multiplier value has been saved to the configuration."' % multiplier}
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _BEACON_APPLY_RUNTIME_MULTIPLIER]
variable_runtime_multiplier = -1.0
gcode =
{% set toolhead = 0 %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set toolhead = 1 if idex_mode == 'primary' else 0 %}
{% endif %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set layer_number = printer["gcode_macro _ON_LAYER_CHANGE"].layer_number|default(0)|int %}
{% set is_printing_gcode = true if printer["gcode_macro START_PRINT"].is_printing_gcode|default(true)|lower == 'true' else false %}
{% if layer_number == 0 and is_printing_gcode %}
{% set link_url = "https://os.ratrig.com/docs/slicers" %}
{% set link_text = "RatOS Slicer Documentation" %}
{% set line_1 = '"Your slicer is not correctly reporting layer information. See the layer change custom g-code in the %s".' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="Missing layer information" TYPE="warning" MSG={line_1}
{% endif %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_RUNTIME_MULTIPLIER" MSG="layer_number: {layer_number}, is_printing_gcode: {is_printing_gcode}, beacon_contact_start_print_true_zero: {beacon_contact_start_print_true_zero}, beacon_contact_expansion_compensation: {beacon_contact_expansion_compensation}"
{% if layer_number == 1 and is_printing_gcode and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
{% set svv = printer.save_variables.variables %}
{% set nozzle_expansion_coefficient = svv.nozzle_expansion_coefficient_t0|default(0)|float %}
{% if toolhead == 1 %}
{% set nozzle_expansion_coefficient = svv.nozzle_expansion_coefficient_t1|default(0)|float %}
{% endif %}
{% set beacon_contact_expansion_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(1.0)|float %}
{% set print_temp = printer["gcode_macro _BEACON_SET_NOZZLE_TEMP_OFFSET"].runtime_temp|default(0)|int %}
{% if print_temp > 0 %}
{% set z_offset = printer.gcode_move.homing_origin.z|float %}
{% set temp_delta = print_temp - beacon_contact_true_zero_temp %}
{% set coefficient_per_degree = nozzle_expansion_coefficient / 100 %}
{% set z_offset_per_degree = z_offset / temp_delta %}
{% set new_multiplier = z_offset_per_degree / coefficient_per_degree %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_RUNTIME_MULTIPLIER" MSG="print_temp: {print_temp}, z_offset: {z_offset}, temp_delta: {temp_delta}, nozzle_expansion_coefficient: {nozzle_expansion_coefficient}, coefficient_per_degree: {coefficient_per_degree}, z_offset_per_degree: {z_offset_per_degree}, old_multiplier: {beacon_contact_expansion_multiplier}, new_multiplier: {new_multiplier}"
SET_GCODE_VARIABLE MACRO=_BEACON_APPLY_RUNTIME_MULTIPLIER VARIABLE=runtime_multiplier VALUE={new_multiplier}
{% endif %}
{% endif %}
[gcode_macro T0]
variable_join = 0
variable_remap = 0
variable_alert = ""
variable_filament_name = ""
variable_filament_type = ""
variable_filament_temp = 0
variable_runout_sensor = ""
variable_active = True
variable_color = "7bff33"
variable_hotend_type = "SF"
variable_has_cht_nozzle = True
variable_cooling_position_to_nozzle_distance = 40
variable_tooolhead_sensor_to_extruder_gear_distance = 15
variable_extruder_gear_to_cooling_position_distance = 30
variable_filament_loading_nozzle_offset = -5
variable_filament_grabbing_length = 5
variable_filament_grabbing_speed = 1
variable_enable_insert_detection = True
variable_enable_runout_detection = True
variable_enable_clog_detection = True
variable_unload_after_runout = True
variable_purge_after_load = 0
variable_purge_before_unload = 0
variable_extruder_load_speed = 60
variable_filament_load_speed = 10
variable_standby = False
variable_temperature_offset = 0
variable_has_oozeguard = False
variable_has_front_arm_nozzle_wiper = False
variable_resume_after_insert = False
gcode =
{% set x = params.X|default(-1.0)|float %}
{% set y = params.Y|default(-1.0)|float %}
{% set z = params.Z|default(0.0)|float %}
{% set s = params.S|default(1)|int %}
{% if printer["gcode_macro _SELECT_TOOL"] is defined %}
_SELECT_TOOL T=0 X={x} Y={y} Z={z} TOOLSHIFT={s}
{% endif %}
[save_variables]
filename = /home/pi/printer_data/config/ratos-variables.cfg
=======================
Extruder max_extrude_ratio=0.415752
mcu 'mcu': Starting serial connect
webhooks client 4127585832: New connection
webhooks client 4127585832: Client info {'program': 'Moonraker', 'version': 'v0.9.3-0-g71f9e67'}
Loaded MCU 'mcu' 118 commands (v0.12.0-396-gb7233d119 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34)
MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 BUS_PINS_i2c3_PA8_PC9=PA8,PC9 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h723xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1
mcu 'rpi': Starting connect
Loaded MCU 'rpi' 119 commands (?-20240727_132503-fv-az659-741 / gcc: (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110 binutils: (GNU Binutils for Raspbian) 2.35.2)
MCU 'rpi' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256
mcu 'toolboard_t0': Starting serial connect
Loaded MCU 'toolboard_t0' 100 commands (v0.12.0-396-gb7233d119 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34)
MCU 'toolboard_t0' config: ADC_MAX=4095 BUS_PINS_i2c1=PB6,PB7 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB7=PB8,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c1_PF1_PF0=PF1,PF0 BUS_PINS_i2c1a=PF1,PF0 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 CLOCK_FREQ=48000000 MCU=stm32f042x6 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PF0,PF1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1
mcu_temperature 'mcu' nominal base=-275.577689 slope=1631.474104
mcu_temperature 'toolboard_t0' nominal base=342.920354 slope=-724.778761
mcu 'beacon': Starting serial connect
Loaded MCU 'beacon' 45 commands (Beacon 2.1.0 / )
MCU 'beacon' config: ADC_MAX=4095 BEACON_ACCEL_BITS=12 BEACON_ACCEL_SCALE_16G=7.81 BEACON_ACCEL_SCALE_2G=0.98 BEACON_ACCEL_SCALE_4G=1.95 BEACON_ACCEL_SCALE_8G=3.91 BEACON_ADC_SMOOTH_COUNT=16 BEACON_HAS_ACCEL=1 BEACON_REV=H CLOCK_FREQ=32000000 MCU=beacon STATS_SUMSQ_BASE=256
Config error
Traceback (most recent call last):
File "/home/pi/klipper/klippy/klippy.py", line 135, in _connect
cb()
File "/home/pi/klipper/klippy/mcu.py", line 748, in _connect
self._send_config(None)
File "/home/pi/klipper/klippy/mcu.py", line 679, in _send_config
cb()
File "/home/pi/klipper/klippy/mcu.py", line 456, in _build_config
raise pins.error("shutdown value must be 0.0 or 1.0 on soft pwm")
pins.error: shutdown value must be 0.0 or 1.0 on soft pwm
webhooks client 4127585832: Disconnected
Restarting printer
Start printer at Sun May 25 00:26:15 2025 (1748129175.9 403.3)
===== Config file =====
[mcu rpi]
serial = /tmp/klipper_host_mcu
[board_pins btt-kraken]
aliases =
x_step_pin=PC14,
x_dir_pin=PC13,
x_enable_pin=PE6,
x_uart_pin=PD6,
x_diag_pin=PC15,
x_endstop_pin=PC15,
y_step_pin=PE5,
y_dir_pin=PE4,
y_enable_pin=PE3,
y_uart_pin=PD6,
y_diag_pin=PF0,
y_endstop_pin=PF0,
z0_step_pin=PG9,
z0_dir_pin=PG10,
z0_enable_pin=PG13,
z0_uart_pin=PA15,
z0_diag_pin=PF3,
z1_step_pin=PG11,
z1_dir_pin=PD7,
z1_enable_pin=PG12,
z1_uart_pin=PA9,
z1_diag_pin=PF4,
z2_step_pin=PB4,
z2_dir_pin=PB3,
z2_enable_pin=PB5,
z2_uart_pin=PA10,
z2_diag_pin=PF10,
z3_step_pin=PG15,
z3_dir_pin=PB6,
z3_enable_pin=PG14,
z3_uart_pin=PD2,
z3_diag_pin=PC0,
e_step_pin=PG9,
e_dir_pin=PG10,
e_enable_pin=PG13,
e_uart_pin=PD2,
e_diag_pin=PF1,
e_heater_pin=PF6,
e_sensor_pin=PB1,
stepper_spi_mosi_pin=PC8,
stepper_spi_miso_pin=PC7,
stepper_spi_sclk_pin=PC6,
adxl345_cs_pin=PE10,
bltouch_sensor_pin=PG1,
bltouch_control_pin=PE9,
probe_pin=PG1,
fan_part_cooling_pin=PA0,
fan_toolhead_cooling_pin=PA1,
fan_controller_board_pin=PA2,
heater_bed_heating_pin=PF5,
heater_bed_sensor_pin=PB0,
4p_fan_part_cooling_pin=PA6,
4p_fan_part_cooling_tach_pin=PC1,
4p_toolhead_cooling_pin=PE8,
4p_toolhead_cooling_tach_pin=PG0,
4p_controller_board_pin=PE8,
4p_controller_board_tach_pin=PG0
[mcu]
serial = /dev/RatOS/btt-kraken
[temperature_sensor Kraken]
sensor_type = temperature_mcu
[adxl345 controlboard]
cs_pin = PE10
spi_software_mosi_pin = PE14
spi_software_miso_pin = PE13
spi_software_sclk_pin = PE12
[board_pins toolboard_t0]
mcu = toolboard_t0
aliases =
e_step_pin=PB7,
e_dir_pin=PB6,
e_enable_pin=PB4,
e_uart_pin=PB5,
e_heater_pin=PA0,
e_sensor_pin=PA3,
stepper_spi_mosi_pin=null,
stepper_spi_miso_pin=null,
stepper_spi_sclk_pin=null,
adxl345_cs_pin=PA4,
bltouch_sensor_pin=PA15,
bltouch_control_pin=PB3,
probe_pin=PA15,
fan_part_cooling_pin=PA10,
fan_toolhead_cooling_pin=PA9,
fan_controller_board_pin=null,
heater_bed_heating_pin=null,
heater_bed_sensor_pin=null,
4p_fan_part_cooling_pin=null,
4p_fan_part_cooling_tach_pin=null,
4p_toolhead_cooling_pin=null,
4p_toolhead_cooling_tach_pin=null,
4p_controller_board_pin=null,
4p_controller_board_tach_pin=null
[mcu toolboard_t0]
serial = /dev/RatOS/ldo-orbitool-o2-t0
[temperature_sensor Orbitool_O2_T0]
sensor_type = temperature_mcu
sensor_mcu = toolboard_t0
[lis2dw toolboard_t0]
axes_map = x, z, y
cs_pin = toolboard_t0:PA4
spi_bus = spi1
[extruder]
max_power = 0.995
rotation_distance = 4.63
full_steps_per_rotation = 200
filament_diameter = 1.750
max_extrude_only_velocity = 60
max_extrude_only_distance = 200
nozzle_diameter = 0.5
heater_pin = toolboard_t0:PA0
sensor_type = PT1000
pullup_resistor = 2200
sensor_pin = toolboard_t0:PA3
min_extrude_temp = 170
min_temp = 0
max_temp = 285
pressure_advance = 0.05
step_pin = toolboard_t0:PB7
dir_pin = !toolboard_t0:e_dir_pin
enable_pin = !toolboard_t0:PB4
microsteps = 64
control = pid
pid_kp = 21.673
pid_ki = 1.338
pid_kd = 87.776
[adc_temperature hotend_power_scale]
temperature1 = 119
voltage1 = 1.91
temperature2 = 239
voltage2 = 3.82
[fan]
max_power = 0.995
shutdown_speed = 1.0
pin = PA6
cycle_time = 0.00004
tachometer_pin = ^PC1
tachometer_poll_interval = 0.0005
[heater_fan toolhead_cooling_fan]
max_power = 0.995
cycle_time = 0.0001
shutdown_speed = 0
pin = PA1
fan_speed = 1
heater = extruder
[output_pin O2_RUN_LED]
pin = toolboard_t0:PB8
shutdown_value = 0
value = 1
[temperature_sensor hotend_power_draw]
sensor_pin = toolboard_t0:PA2
sensor_type = hotend_power_scale
[gcode_macro RatOS]
variable_homing = "endstops"
variable_z_probe = "static"
variable_sensorless_x_current = 0.49699999999999994
variable_sensorless_y_current = 0.7242
variable_safe_home_x = "middle"
variable_safe_home_y = "middle"
variable_driver_type_x = "tmc2209"
variable_driver_type_y = "tmc2209"
variable_stowable_probe_stop_on_error = False
variable_chamber_filter_enable = True
variable_chamber_filter_speed = 0.5
variable_chamber_filter_disable_speed = 1.0
variable_chamber_filter_enable_at = "after_print_start"
variable_chamber_filter_disable_period = 300
variable_chamber_filter_disable_bed_temp = 0
variable_chamber_heater_enable = True
variable_chamber_heater_bed_temp = 115
variable_chamber_heater_preheating_temp = 150
variable_chamber_heater_heating_temp_offset = 25
variable_chamber_heater_control_external_heater = False
variable_chamber_heater_air_circulation_enable = True
variable_chamber_heater_air_circulation_fan_speed = 0.35
variable_chamber_heater_air_circulation_y_pos = 0
variable_chamber_heater_air_circulation_z_pos = 100
variable_chamber_heater_extra_fan_speed = 1.0
variable_chamber_heater_filter_fan_speed = 1.0
variable_led_status_action = 0.0,1.0,1.0
variable_led_status_success = 0.0,1.0,0.0
variable_led_status_error = 1.0,0.0,1.0
variable_led_status_on = 1.0,1.0,1.0
variable_led_status_off = 0.0,0.0,1.0
variable_led_status_standby = 0.1,0.1,0.1
variable_led_status_heating = 1.0,0.0,0.0
variable_led_status_cooling = 0.0,0.0,1.0
variable_calibrate_bed_mesh = True
variable_adaptive_mesh = True
variable_start_print_park_in = "front"
variable_start_print_park_z_height = 50
variable_end_print_park_in = "back"
variable_pause_print_park_in = "front"
variable_end_print_park_z_hop = 20
variable_nozzle_priming = "primeblob"
variable_nozzle_prime_start_x = "max"
variable_nozzle_prime_start_y = "min"
variable_nozzle_prime_direction = "auto"
variable_nozzle_prime_bridge_fan = 102
variable_probe_for_priming_result = None
variable_probe_for_priming_end_result = None
variable_probe_for_priming_result_t1 = None
variable_probe_for_priming_end_result_t1 = None
variable_probe_for_priming_disable_mesh_constraints = False
variable_adaptive_prime_offset_threshold = -1.0
variable_last_z_offset = None
variable_runout_park_in = "front"
variable_enable_unload_tip_forming = False
variable_filament_unload_length = 150
description = RatOS variable storage macro, will echo variables to the console when run.
variable_relative_extrusion = False
variable_force_absolute_position = False
variable_preheat_extruder = True
variable_preheat_extruder_temp = 150
variable_macro_travel_speed = 300
variable_macro_travel_accel = 3000
variable_macro_z_speed = 15
variable_bed_margin_x = [0, 0]
variable_bed_margin_y = [0, 0]
variable_printable_x_min = 0
variable_printable_x_max = 0
variable_printable_y_min = 0
variable_printable_y_max = 0
variable_end_print_motors_off = True
variable_status_color_ok = "00FF00"
variable_status_color_error = "FF0000"
variable_status_color_unknown = "FFFF00"
variable_end_print_retract_filament = 10
gcode =
ECHO_RATOS_VARS
variable_beacon_bed_mesh_scv = 25
variable_beacon_contact_z_homing = False
variable_beacon_contact_start_print_true_zero = True
variable_beacon_contact_wipe_before_true_zero = True
variable_beacon_contact_true_zero_temp = 150
variable_beacon_contact_prime_probing = True
variable_beacon_contact_expansion_compensation = True
variable_beacon_contact_bed_mesh = False
variable_beacon_contact_bed_mesh_samples = 2
variable_beacon_contact_z_tilt_adjust = False
variable_beacon_contact_z_tilt_adjust_samples = 2
variable_beacon_scan_compensation_enable = False
variable_beacon_scan_compensation_profile = "Contact"
variable_beacon_scan_compensation_probe_count = 15,15
variable_beacon_contact_poke_bottom_limit = -1
variable_homing_x = "sensorless"
variable_homing_y = "sensorless"
variable_x_driver_types = ["tmc5160"]
variable_x_axes = ["x"]
variable_y_driver_types = ["tmc5160"]
variable_y_axes = ["y"]
variable_z_driver_types = ["tmc5160", "tmc5160", "tmc5160", "tmc5160"]
variable_z_axes = ["z", "z1", "z2", "z3"]
[ratos_homing]
axes = xyz
z_hop = 15
z_hop_speed = 15
gcode =
_LED_ON
{% set prev_stop_on_error = printer["gcode_macro RatOS"].stowable_probe_stop_on_error %}
{% if printer["dual_carriage"] is defined %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set target_idex_mode = printer["dual_carriage"].carriage_1|lower %}
_IDEX_SINGLE
_SELECT_TOOL T={default_toolhead} TOOLSHIFT=false
{% endif %}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE=True
M400
G90
{% set X = true if params.X is defined else false %}
{% set Y = true if params.Y is defined else false %}
{% set Z = true if params.Z is defined else false %}
{% if printer["gcode_macro RatOS"].home_y_first|default(false)|lower == 'true' %}
HOME_Y X={X} Y={Y} Z={Z}
HOME_X X={X} Y={Y} Z={Z}
{% else %}
HOME_X X={X} Y={Y} Z={Z}
HOME_Y X={X} Y={Y} Z={Z}
{% endif %}
HOME_Z X={X} Y={Y} Z={Z}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE={prev_stop_on_error}
{% if printer["dual_carriage"] is defined %}
{% if target_idex_mode == "copy" %}
_IDEX_COPY
{% elif target_idex_mode == "mirror" %}
_IDEX_MIRROR
{% endif %}
{% endif %}
[gcode_macro HOME_X]
gcode =
{% set x_homed = 'x' in printer.toolhead.homed_axes %}
{% set homing = printer["gcode_macro RatOS"].homing|lower %}
{% set homing_x = printer["gcode_macro RatOS"].homing_x|lower %}
{% set homing_x = homing_x if homing_x else homing %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_X" MSG="printable_x_max: {printable_x_max}, safe_home_x: {safe_home_x}, axis_maximum.x: {printer.toolhead.axis_maximum.x}, bed_margin_x: {printer['gcode_macro RatOS'].bed_margin_x}"
{% if X or not Y and not Z %}
{% if homing_x == 'endstop' %}
G28 X
{% elif homing_x == 'sensorless' %}
{% if printer["dual_carriage"] is defined %}
{ action_emergency_stop("sensorless homing not supported on IDEX!") }
{% endif %}
HOME_X_SENSORLESS
{% else %}
{ action_emergency_stop("expected RatOS variable_homing_x to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_x, homing)) }
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set parking_position = printer["gcode_macro T%s" % (0 if default_toolhead==1 else 1)].parking_position|float %}
SET_DUAL_CARRIAGE CARRIAGE={0 if default_toolhead==1 else 1} MODE=PRIMARY
G1 X{parking_position} F{speed}
SET_DUAL_CARRIAGE CARRIAGE={default_toolhead} MODE=PRIMARY
{% endif %}
{% set x_homed = True %}
G0 X{safe_home_x} F{speed}
M400
{% endif %}
[gcode_macro HOME_Y]
gcode =
{% set y_homed = 'y' in printer.toolhead.homed_axes %}
{% set homing = printer["gcode_macro RatOS"].homing|lower %}
{% set homing_y = printer["gcode_macro RatOS"].homing_y|lower %}
{% set homing_y = homing_y if homing_y else homing %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_Y" MSG="printable_y_max: {printable_y_max}, safe_home_y: {safe_home_y}, axis_maximum.y: {printer.toolhead.axis_maximum.y}, bed_margin_y: {printer['gcode_macro RatOS'].bed_margin_y}"
{% if Y or not X and not Z %}
{% if homing_y == 'endstop' %}
G28 Y
{% elif homing_y == 'sensorless' %}
HOME_Y_SENSORLESS
{% else %}
{ action_emergency_stop("expected RatOS variable_homing_y to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_y, homing)) }
{% endif %}
{% set y_homed = True %}
G0 Y{safe_home_y} F{speed}
{% endif %}
[gcode_macro HOME_Z]
gcode =
{% set x_homed = 'x' in printer.toolhead.homed_axes %}
{% set y_homed = 'y' in printer.toolhead.homed_axes %}
{% set z_probe = printer["gcode_macro RatOS"].z_probe %}
{% set beacon_contact_z_homing = true if printer["gcode_macro RatOS"].beacon_contact_z_homing|default(false)|lower == 'true' else false %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_Z" MSG="x_homed: {x_homed}, y_homed: {y_homed}, z_probe: {z_probe}, beacon_contact_z_homing: {beacon_contact_z_homing}"
{% if Z or not Y and not X %}
RATOS_ECHO MSG="Homing Z"
{% if x_homed == False or y_homed == False %}
{ action_emergency_stop("X and Y must be homed before homing Z") }
{% else %}
{% if z_probe == "stowable" %}
DEPLOY_PROBE
_MOVE_TO_SAFE_Z_HOME
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_homing %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% else %}
G28 Z
{% endif %}
_Z_HOP
STOW_PROBE
{% else %}
_MOVE_TO_SAFE_Z_HOME
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_homing %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% else %}
G28 Z
{% endif %}
_Z_HOP
{% endif %}
{% endif %}
{% endif %}
[gcode_macro HOME_X_SENSORLESS]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="home_x_sensorless"
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
M204 S1000
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endif %}
G4 P300
G28 X
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].x_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].y_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current}
{% endif %}
G4 P300
RESTORE_TOOLHEAD_SETTINGS KEY="home_x_sensorless"
[gcode_macro HOME_Y_SENSORLESS]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="home_y_sensorless"
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
M204 S1000
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endif %}
G4 P300
G28 Y
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].x_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].y_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current}
{% endif %}
G4 P300
RESTORE_TOOLHEAD_SETTINGS KEY="home_y_sensorless"
[gcode_macro _Z_HOP]
description = Move Z axis up by Z_HOP distance at Z_HOP_SPEED. In relative mode it will move Z axis up by Z_HOP distance. In absolute mode it will move Z axis to Z_HOP distance.
gcode =
{% set z_hop = printer.configfile.config.ratos_homing.z_hop|float %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
G0 Z{z_hop} F{z_hop_speed}
[gcode_macro _MOVE_TO_SAFE_Z_HOME]
description = Move to safe home position with optional Z_HOP (pass Z_HOP=True as parameter)
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% if params.Z_HOP is defined %}
_Z_HOP
{% endif %}
DEBUG_ECHO PREFIX="_MOVE_TO_SAFE_Z_HOME" MSG="axis_maximum.x: {printer.toolhead.axis_maximum.x}, axis_maximum.y: {printer.toolhead.axis_maximum.y}, bed_margin_x: {printer['gcode_macro RatOS'].bed_margin_x}, bed_margin_y: {printer['gcode_macro RatOS'].bed_margin_y}, safe_home_x: {safe_home_x}, safe_home_y: {safe_home_y}, printable_x_max: {printable_x_max}, printable_y_max: {printable_y_max}"
G0 X{safe_home_x} Y{safe_home_y} F{speed}
[gcode_macro MAYBE_HOME]
description = Only home unhomed axis
variable_is_kinematic_position_overriden = False
gcode =
{% if printer["gcode_macro MAYBE_HOME"].is_kinematic_position_overriden|lower == 'true' %}
RATOS_ECHO MSG="SET_CENTER_KINEMATIC_POSITION has been abused. Homing all axes. Please refrain from using SET_CENTER_KINEMATIC_POSITION outside of debugging purposes."
G28
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=False
{% else %}
{% set axes = '' %}
{% set isHomed = true %}
{% set axesToHome = '' %}
{% if params.X is defined %}
{% set axes = axes ~ 'X ' %}
{% if 'x' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'X ' %}
{% endif %}
{% endif %}
{% if params.Y is defined %}
{% set axes = axes ~ 'Y ' %}
{% if 'y' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Y ' %}
{% endif %}
{% endif %}
{% if params.Z is defined %}
{% set axes = axes ~ 'Z ' %}
{% if 'z' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Z ' %}
{% endif %}
{% endif %}
{% if params.X is not defined and params.Y is not defined and params.Z is not defined %}
{% set axes = '' %}
{% if 'x' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'X ' %}
{% endif %}
{% if 'y' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Y ' %}
{% endif %}
{% if 'z' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Z ' %}
{% endif %}
{% endif %}
{% if isHomed is false %}
RATOS_ECHO MSG="Homing {axesToHome}"
G28 {axesToHome}
{% else %}
RATOS_ECHO MSG="All requested axes already homed, skipping.."
{% endif %}
{% endif %}
[gcode_macro PID_CALIBRATE_HOTEND]
description = Perform a PID calibration test for a given extruder heater.
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set temp = params.TEMP|default(220)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_HOTEND" MSG="TEMP={temp}"
{% if printer["dual_carriage"] is not defined %}
RATOS_ECHO MSG="PID calibration hotend heater T0 at {temp}°C..."
PID_CALIBRATE HEATER=extruder TARGET={temp}
_CONSOLE_SAVE_CONFIG
{% else %}
{% if toolhead==0 or toolhead==1 %}
RATOS_ECHO MSG="PID calibration hotend heater T{toolhead} at {temp}°C..."
PID_CALIBRATE HEATER=extruder{'' if toolhead==0 else toolhead} TARGET={temp}
_CONSOLE_SAVE_CONFIG
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
_LEARN_MORE_CALIBRATION
[gcode_macro PID_CALIBRATE_BED]
description = Perform a PID calibration test for the bed heater.
gcode =
{% set temp = params.TEMP|default(80)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_BED" MSG="TEMP={temp}"
RATOS_ECHO MSG="PID calibration bed heater at {temp}°C..."
PID_CALIBRATE HEATER=heater_bed TARGET={temp}
_CONSOLE_SAVE_CONFIG
_LEARN_MORE_CALIBRATION
[gcode_macro PID_CALIBRATE_CHAMBER_HEATER]
description = Perform a PID calibration test for the chamber heater.
gcode =
{% set temp = params.TEMP|default(150)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_CHAMBER_HEATER" MSG="TEMP={temp}"
{% if printer["heater_generic chamber_heater"] is defined %}
RATOS_ECHO MSG="PID calibration chamber heater at {temp}°C..."
PID_CALIBRATE HEATER=chamber_heater TARGET={temp}
_CONSOLE_SAVE_CONFIG
_LEARN_MORE_CALIBRATION
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_heater" %}
{% set link_text = "RatOS Chamber Heater" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber heater found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro INITIALIZE_PA_TUNING]
description = Start a pressure advance tuning tower.
gcode =
{% set start = params.START|default(0.0)|float %}
{% set factor = params.FACTOR|default(0.001)|float %}
{% set layer_number = printer["gcode_macro _ON_LAYER_CHANGE"].layer_number|default(0)|int %}
{% set is_printing_gcode = true if printer["gcode_macro START_PRINT"].is_printing_gcode|default(true)|lower == 'true' else false %}
{% if is_printing_gcode and layer_number < 2 %}
DEBUG_ECHO PREFIX="START_PA_TOWER" MSG="START: {start}, FACTOR: {factor}"
RATOS_ECHO MSG="Starting presssure advance tuning tower..."
TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START={start} FACTOR={factor}
{% endif %}
_LEARN_MORE_CALIBRATION
[gcode_macro CHAMBER_FILTER_ON]
gcode =
{% if printer["fan_generic filter"] is defined %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Activating chamber filter..."
_CHAMBER_FILTER_TURN_ON
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber filter found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro CHAMBER_FILTER_OFF]
gcode =
{% if printer["fan_generic filter"] is defined %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Deactivating chamber filter..."
_CHAMBER_FILTER_TURN_OFF
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber filter found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro _CHAMBER_FILTER_ON]
gcode =
{% set at = params.AT|default('')|lower %}
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set chamber_filter_enable_at = printer["gcode_macro RatOS"].chamber_filter_enable_at|default('after_print_start')|lower %}
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_ON" MSG="at: {at}, chamber_filter_enable: {chamber_filter_enable}, chamber_filter_enable_at: {chamber_filter_enable_at}, chamber_filter_speed: {chamber_filter_speed}"
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if chamber_filter_enable_at == at %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Activating chamber filter..."
_CHAMBER_FILTER_TURN_ON AT={at}
{% if chamber_filter_enable_at == "print_end" %}
_LED_CHAMBER_FILTER_ON
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _CHAMBER_FILTER_OFF]
gcode =
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set filter_disable_period = printer["gcode_macro RatOS"].chamber_filter_disable_period|default(0)|int %}
{% set filter_disable_bed_temp = printer["gcode_macro RatOS"].chamber_filter_disable_bed_temp|default(0)|int %}
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_OFF" MSG="chamber_filter_enable: {chamber_filter_enable}, filter_disable_period: {filter_disable_period}, filter_disable_bed_temp: {filter_disable_bed_temp}"
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if filter_disable_period > 0 %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Waiting {filter_disable_period} seconds before turning chamber filter off..."
UPDATE_DELAYED_GCODE ID=_CHAMBER_FILTER_OFF_TIMER DURATION={filter_disable_period}
{% endif %}
{% if filter_disable_bed_temp > 0 %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Waiting for bed temp to cool down to {filter_disable_bed_temp}°C to turn filter off..."
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM=0 MAXIMUM={filter_disable_bed_temp}
_CHAMBER_FILTER_TURN_OFF
_LED_CHAMBER_FILTER_OFF
{% endif %}
{% endif %}
[delayed_gcode _CHAMBER_FILTER_OFF_TIMER]
gcode =
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_OFF_TIMER" MSG="executed"
_CHAMBER_FILTER_TURN_OFF
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Chamber filter turned off!"
_LED_CHAMBER_FILTER_OFF
[gcode_macro _CHAMBER_FILTER_TURN_ON]
gcode =
{% set at = params.AT|default('')|lower %}
{% set chamber_filter_speed = printer["gcode_macro RatOS"].chamber_filter_speed|default(0)|float %}
{% if at == "print_end" %}
{% set chamber_filter_speed = printer["gcode_macro RatOS"].chamber_filter_disable_speed|default(0)|float %}
{% endif %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_FILTER_OFF_TIMER DURATION=0
SET_FAN_SPEED FAN=filter SPEED={chamber_filter_speed}
[gcode_macro _CHAMBER_FILTER_TURN_OFF]
gcode =
SET_FAN_SPEED FAN=filter SPEED=0
[gcode_macro _CHAMBER_FILTER_SANITY_CHECK]
gcode =
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set filter_disable_period = printer["gcode_macro RatOS"].chamber_filter_disable_period|default(0)|int %}
{% set filter_disable_bed_temp = printer["gcode_macro RatOS"].chamber_filter_disable_bed_temp|default(0)|int %}
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if filter_disable_bed_temp > 0 and filter_disable_period > 0 %}
_LEARN_MORE_CHAMBER_FILTER
{action_respond_info("Wrong chamber filter options configured! Set 'filter_disable_bed_temp' or 'filter_disable_period' variable, not both.")}
{% endif %}
{% if filter_disable_bed_temp == 0 and filter_disable_period == 0 %}
_LEARN_MORE_CHAMBER_FILTER
{action_respond_info("Wrong chamber filter options configured! Set 'filter_disable_bed_temp' or 'filter_disable_period' variable.")}
{% endif %}
{% endif %}
[gcode_macro CHAMBER_HEATER_ON]
gcode =
{% set chamber_temp = params.CHAMBER_TEMP|default(45)|int %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp} IS_FROM_START_PRINT=False
[gcode_macro CHAMBER_HEATER_OFF]
gcode =
_CHAMBER_HEATER_OFF
[gcode_macro _CHAMBER_HEATER_ON]
variable_chamber_temp = 0
gcode =
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set start_chamber_temp = params.START_CHAMBER_TEMP|default(0)|int %}
{% set is_from_start_print = true if params.IS_FROM_START_PRINT|default(True)|lower == 'true' else false %}
{% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set chamber_heater_enable = true if printer["gcode_macro RatOS"].chamber_heater_enable|default(true)|lower == 'true' else false %}
{% set chamber_heater_bed_temp = printer["gcode_macro RatOS"].chamber_heater_bed_temp|default(115)|int %}
{% set chamber_heater_preheating_temp = printer["gcode_macro RatOS"].chamber_heater_preheating_temp|default(150)|int %}
{% set chamber_heater_heating_temp_offset = printer["gcode_macro RatOS"].chamber_heater_heating_temp_offset|default(20)|int %}
{% set chamber_heater_control_external_heater = true if printer["gcode_macro RatOS"].chamber_heater_control_external_heater|default(true)|lower == 'true' else false %}
{% set chamber_heater_air_circulation_enable = true if printer["gcode_macro RatOS"].chamber_heater_air_circulation_enable|default(true)|lower == 'true' else false %}
{% set chamber_heater_air_circulation_fan_speed = printer["gcode_macro RatOS"].chamber_heater_air_circulation_fan_speed|default(0.35)|float %}
{% set chamber_heater_air_circulation_y_pos = printer["gcode_macro RatOS"].chamber_heater_air_circulation_y_pos|default(0)|float %}
{% set chamber_heater_air_circulation_z_pos = printer["gcode_macro RatOS"].chamber_heater_air_circulation_z_pos|default(100)|float %}
DEBUG_ECHO PREFIX="_CHAMBER_HEATER_ON" MSG="chamber_heater_enable: {chamber_heater_enable}, chamber_heater_preheating_temp: {chamber_heater_preheating_temp}, chamber_heater_heating_temp_offset: {chamber_heater_heating_temp_offset}, bed_temp: {bed_temp}, chamber_temp: {chamber_temp}, start_chamber_temp: {start_chamber_temp}"
{% if chamber_heater_enable and chamber_temp > 0 and chamber_heater_bed_temp > 0 %}
_LED_HEATING
RATOS_ECHO MSG="Preheating chamber to {(start_chamber_temp if start_chamber_temp > 0 else chamber_temp)}°C..."
{% set chamber_temp_sensor = "extruder" %}
{% if printer["dual_carriage"] is defined and default_toolhead == 1 %}
{% set chamber_temp_sensor = "extruder1" %}
{% endif %}
{% if printer["temperature_sensor chamber"] is defined %}
{% set chamber_temp_sensor = "temperature_sensor chamber" %}
{% endif %}
{% set current_chamber_temp = printer['%s' % chamber_temp_sensor].temperature|int %}
{% set needs_heating = current_chamber_temp < (start_chamber_temp if start_chamber_temp > 0 else chamber_temp) %}
{% if needs_heating %}
_USER_CHAMBER_HEATER_BEFORE_PREHEATING
{% endif %}
{% if needs_heating %}
{% if chamber_heater_air_circulation_enable and chamber_heater_air_circulation_fan_speed > 0 %}
{% if not is_from_start_print %}
MAYBE_HOME
{% endif %}
G0 Z{chamber_heater_air_circulation_z_pos} F{z_speed}
G0 Y{chamber_heater_air_circulation_y_pos} F{speed}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={chamber_heater_air_circulation_fan_speed if default_toolhead == 0 else 0}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={chamber_heater_air_circulation_fan_speed if default_toolhead == 1 else 0}
{% else %}
M106 S{(255 * chamber_heater_air_circulation_fan_speed)}
{% endif %}
{% else %}
{% if is_from_start_print %}
G0 Z{z} F{z_speed}
{% endif %}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=_CHAMBER_HEATER_ON VARIABLE=chamber_temp VALUE={chamber_temp}
{% if needs_heating %}
M140 S{chamber_heater_bed_temp}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={chamber_heater_preheating_temp}
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=1.0
{% endif %}
{% endif %}
{% if needs_heating %}
_CHAMBER_HEATER_EXTRA_FAN_ON
{% endif %}
{% if needs_heating %}
TEMPERATURE_WAIT SENSOR="{chamber_temp_sensor}" MINIMUM={(start_chamber_temp if start_chamber_temp > 0 else chamber_temp)}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={(chamber_temp + chamber_heater_heating_temp_offset)}
{% endif %}
{% endif %}
{% if printer["fan_generic filter"] is defined %}
{% if printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float > 0 %}
SET_FAN_SPEED FAN=filter SPEED=0
_CHAMBER_FILTER_ON AT="before_print_start"
{% endif %}
{% endif %}
{% if needs_heating %}
{% if chamber_heater_air_circulation_enable and chamber_heater_air_circulation_fan_speed > 0 %}
G28 Z
{% endif %}
{% endif %}
{% if needs_heating %}
_USER_CHAMBER_HEATER_AFTER_PREHEATING
{% endif %}
{% if printer["temperature_sensor chamber"] is defined %}
{% if printer["heater_generic chamber_heater"] is defined %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined and chamber_heater_control_external_heater %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED=0
SET_FAN_SPEED FAN=part_fan_t1 SPEED=0
{% else %}
M106 S0
{% endif %}
_LED_SUCCESS
{% endif %}
[gcode_macro _CHAMBER_HEATER_OFF]
gcode =
RATOS_ECHO MSG="Deactivating chamber heater..."
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=0
SET_GCODE_VARIABLE MACRO=_CHAMBER_HEATER_ON VARIABLE=chamber_temp VALUE=0
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=0
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=0.0
{% endif %}
_CHAMBER_HEATER_EXTRA_FAN_OFF
[delayed_gcode _CHAMBER_HEATER_CONTROL]
initial_duration = 0.
gcode =
{% set chamber_temp = printer["gcode_macro _CHAMBER_HEATER_ON"].chamber_temp|default(0)|int %}
{% set chamber_heater_heating_temp_offset = printer["gcode_macro RatOS"].chamber_heater_heating_temp_offset|default(20)|int %}
{% set current_chamber_temp = printer['temperature_sensor chamber'].temperature|int %}
{% if current_chamber_temp < chamber_temp %}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={(chamber_temp + chamber_heater_heating_temp_offset)}
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=1.0
{% endif %}
{% endif %}
{% if current_chamber_temp >= chamber_temp %}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=0
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=0.0
{% endif %}
{% endif %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
[gcode_macro _CHAMBER_HEATER_EXTRA_FAN_ON]
gcode =
{% set chamber_heater_extra_fan_speed = printer["gcode_macro RatOS"].chamber_heater_extra_fan_speed|default(0.0)|float %}
{% if printer["fan_generic chamber_heater_extra_fan"] is defined %}
{% if chamber_heater_extra_fan_speed > 0 %}
SET_FAN_SPEED FAN=chamber_heater_extra_fan SPEED={chamber_heater_extra_fan_speed}
{% endif %}
{% endif %}
[gcode_macro _CHAMBER_HEATER_EXTRA_FAN_OFF]
gcode =
{% if printer["fan_generic chamber_heater_extra_fan"] is defined %}
SET_FAN_SPEED FAN=chamber_heater_extra_fan SPEED=0
{% endif %}
[gcode_macro _USER_CHAMBER_HEATER_BEFORE_PREHEATING]
description = Will be executed before chamber preheating, only if heating is needed.
gcode =
[gcode_macro _USER_CHAMBER_HEATER_AFTER_PREHEATING]
description = Will be executed after chamber preheating, only if heating was needed.
gcode =
[gcode_macro _LED_START_PRINTING]
gcode =
_LED_ACTION
[gcode_macro _LED_START_PRINTING_ERROR]
gcode =
_LED_ERROR
[gcode_macro _LED_PRINTING]
gcode =
_LED_ON TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_PAUSE]
gcode =
_LED_ACTION
[gcode_macro _LED_CHAMBER_FILTER_ON]
gcode =
_LED_ACTION
[gcode_macro _LED_CHAMBER_FILTER_OFF]
gcode =
_LED_STANDBY
[gcode_macro _LED_LOADING_FILAMENT]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_LOADED]
gcode =
_LED_SUCCESS TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_RUNOUT]
gcode =
_LED_ERROR TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_CLOG]
gcode =
_LED_ERROR TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_UNLOADING_FILAMENT]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_UNLOADED]
gcode =
_LED_SUCCESS TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_DEACTIVATE_TOOLHEAD]
gcode =
_LED_OFF TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_TOOLHEAD_STANDBY]
gcode =
_LED_STANDBY TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_TOOLHEAD_WAKEUP]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_MOTORS_OFF]
gcode =
_LED_STANDBY
_LED_VAOC_OFF
[gcode_macro _LED_INPUT_SHAPER_START]
gcode =
_LED_ACTION
[gcode_macro _LED_INPUT_SHAPER_END]
gcode =
_LED_ON
[gcode_macro _LED_BEACON_CALIBRATION_START]
gcode =
_LED_ACTION
[gcode_macro _LED_BEACON_CALIBRATION_END]
gcode =
_LED_ON
[gcode_macro _LED_BEACON_CALIBRATION_ERROR]
gcode =
_LED_ERROR
[gcode_macro _LED_VAOC_ON]
gcode =
{% if printer['neopixel vaoc_led'] is defined %}
SET_LED LED=vaoc_led RED=1.0 GREEN=1.0 BLUE=1.0
{% endif %}
[gcode_macro _LED_VAOC_OFF]
gcode =
{% if printer['neopixel vaoc_led'] is defined %}
SET_LED LED=vaoc_led RED=0.0 GREEN=0.0 BLUE=0.0
{% endif %}
[gcode_macro _LED_ACTION]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_action %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_SUCCESS]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_success %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_HEATING]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_heating %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_COOLING]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_cooling %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_ERROR]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_error %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_ON]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_on %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_OFF]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_off %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_STANDBY]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_standby %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_SET]
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set r = params.R|default(0)|float %}
{% set g = params.G|default(0)|float %}
{% set b = params.B|default(0)|float %}
{% if toolhead >= 0 %}
{% if printer['neopixel nozzle_led_t%s' % toolhead] is defined %}
SET_LED LED={'nozzle_led_t%s' % toolhead} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% else %}
{% if printer['neopixel nozzle_led_t0'] is defined %}
SET_LED LED={'nozzle_led_t0'} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% if printer['neopixel nozzle_led_t1'] is defined %}
SET_LED LED={'nozzle_led_t1'} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% endif %}
_USER_LED_SET { rawparams }
[gcode_macro _USER_LED_SET]
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set r = params.R|default(0)|float %}
{% set g = params.G|default(0)|float %}
{% set b = params.B|default(0)|float %}
[gcode_macro LOAD_FILAMENT]
description = Loads new filament. Note: be careful with PETG, make sure you inspect the tip of your filament before loading to avoid jams.
variable_ignore_min_extrude_temp = True
gcode =
_LEARN_MORE_FILAMENT
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set filament_name = params._NAME|default('')|string %}
{% set filament_type = params._TYPE|default('')|string %}
{% if filament_name == '' or filament_type == '' %}
{% set filament_name = 'unknown' %}
{% set filament_type = 'unknown' %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
_DEFAULT_LOAD_FILAMENT TEMP={temp} NAME={filament_name} TYPE={filament_type}
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Loading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead==0 or toolhead==1 %}
_IDEX_LOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead} NAME={filament_name} TYPE={filament_type}
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
[gcode_macro _DEFAULT_LOAD_FILAMENT]
description = Load filament macro for non IDEX printers.
gcode =
{% set temp = params.TEMP|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_DEFAULT_LOAD_FILAMENT" MSG="TEMP={temp}"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
_LED_LOADING_FILAMENT TOOLHEAD=0
SAVE_GCODE_STATE NAME=load_state
{% if printer.extruder.temperature|int < temp or printer.extruder.can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating extruder to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={temp}
_LOAD_FILAMENT TOOLHEAD=0
RESTORE_GCODE_STATE NAME=load_state
{% if filament_name != '' and filament_type != '' %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('{filament_type}', '{filament_name}', {temp})"
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={temp}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
_LED_FILAMENT_LOADED TOOLHEAD=0
[gcode_macro _IDEX_LOAD_FILAMENT]
description = Load filament macro for IDEX printer.
gcode =
{% set temp = params.TEMP|int %}
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_IDEX_LOAD_FILAMENT" MSG="TEMP: {temp}, TOOLHEAD: {toolhead}"
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_LOADING_FILAMENT TOOLHEAD={toolhead}
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
{% if not printer.pause_resume.is_paused %}
{% if printer[target_extruder].temperature|int < temp or printer[target_extruder].can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating T{toolhead} to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={temp}
{% endif %}
_LOAD_FILAMENT TOOLHEAD={toolhead} TEMP={temp}
{% if filament_name != '' and filament_type != '' %}
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('{filament_type}', '{filament_name}', {temp})"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='"{filament_name}"'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='"{filament_type}"'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE={temp}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_ok}"'
_LED_FILAMENT_LOADED TOOLHEAD={toolhead}
[gcode_macro _LOAD_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT" MSG="TOOLHEAD: {toolhead}"
_MOVE_TO_LOADING_POSITION TOOLHEAD={toolhead}
_LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE TOOLHEAD={toolhead}
_LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE TOOLHEAD={toolhead}
_CLEANING_MOVE TOOLHEAD={toolhead}
[gcode_macro _LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set extruder_load_speed = printer["gcode_macro T%s" % toolhead].extruder_load_speed|float * 60 %}
{% set extruder_gear_to_cooling_position_distance = printer["gcode_macro T%s" % toolhead].extruder_gear_to_cooling_position_distance|float %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Loading filament into hotend.."
G92 E0
G0 E{extruder_gear_to_cooling_position_distance} F{extruder_load_speed}
G92 E0
M400
RATOS_ECHO MSG="Filament loaded into hotend."
[gcode_macro _LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set load_speed = printer["gcode_macro T%s" % toolhead].filament_load_speed|float * 60 %}
{% set filament_loading_nozzle_offset = printer["gcode_macro T%s" % toolhead].filament_loading_nozzle_offset|float %}
{% set cooling_position_to_nozzle_distance = printer["gcode_macro T%s" % toolhead].cooling_position_to_nozzle_distance|float %}
{% set purge_after_load = printer["gcode_macro T%s" % toolhead].purge_after_load|float %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Loading filament into nozzle... Please wait!"
G92 E0
G0 E{cooling_position_to_nozzle_distance + filament_loading_nozzle_offset} F{load_speed}
G92 E0
G4 P1000
_PURGE_FILAMENT TOOLHEAD={toolhead} E={purge_after_load}
RATOS_ECHO MSG="Filament loaded into nozzle!"
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_INSERT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_INSERT" MSG="TOOLHEAD: {toolhead}"
{% set filament_grabbing_length = printer["gcode_macro T%s" % toolhead].filament_grabbing_length|float %}
{% set filament_grabbing_speed = printer["gcode_macro T%s" % toolhead].filament_grabbing_speed|float %}
{% set resume_after_insert = true if printer["gcode_macro T%s" % toolhead].resume_after_insert|default(true)|lower == 'true' else false %}
{% set enable_insert_detection = true if printer["gcode_macro T%s" % toolhead].enable_insert_detection|default(true)|lower == 'true' else false %}
{% set current_idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% if enable_insert_detection %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_INSERT" MSG="toolhead: {toolhead}, filament_grabbing_length: {filament_grabbing_length}, filament_grabbing_speed: {filament_grabbing_speed}, current_idex_mode: {current_idex_mode}"
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Loading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
FORCE_MOVE STEPPER={'extruder%s' % ('' if toolhead == 0 else toolhead)} DISTANCE={filament_grabbing_length} VELOCITY={filament_grabbing_speed}
M400
{% if printer.pause_resume.is_paused %}
LOAD_FILAMENT TOOLHEAD={toolhead}
{% if resume_after_insert %}
RESUME
{% endif %}
{% else %}
{% if not printer.virtual_sdcard.is_active %}
LOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_INSERT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_INSERT" MSG="TOOLHEAD: {toolhead}"
[gcode_macro _PURGE_BEFORE_UNLOAD]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set purge_before_unload = printer["gcode_macro T%s" % toolhead].purge_before_unload|float %}
DEBUG_ECHO PREFIX="_PURGE_BEFORE_UNLOAD" MSG="TOOLHEAD: {toolhead}"
{% if purge_before_unload > 0 %}
G92 E0
G0 E{purge_before_unload} F300
G92 E0
M400
{% endif %}
[gcode_macro _PURGE_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set e = params.E|int %}
{% set r = params.R|default(0)|int %}
DEBUG_ECHO PREFIX="_PURGE_FILAMENT" MSG="TOOLHEAD: {toolhead}, E: {e}"
{% if e > 0 %}
G92 E0
G0 E{e} F300
G92 E0
M400
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={0.4 if toolhead == 0 else 0}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={0.4 if toolhead == 1 else 0}
{% else %}
M106 S{(255 * 0.4)}
{% endif %}
{% endif %}
G4 P3000
{% if r > 0 %}
G92 E0
G0 E-{r} F300
G92 E0
M400
{% endif %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED=0
SET_FAN_SPEED FAN=part_fan_t1 SPEED=0
{% else %}
M106 S0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _MOVE_TO_PARKING_POSITION]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_MOVE_TO_PARKING_POSITION" MSG="TOOLHEAD: {toolhead}"
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].parking_position is defined %}
{% set parking_position = printer["gcode_macro T%s" % toolhead].parking_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
G1 X{parking_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _MOVE_TO_LOADING_POSITION]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_MOVE_TO_LOADING_POSITION" MSG="TOOLHEAD: {toolhead}"
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].loading_position is defined %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% set act_t = 1 if idex_mode == 'primary' else 0 %}
{% if act_t == toolhead %}
{% set loading_position = printer["gcode_macro T%s" % toolhead].loading_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
G1 X{loading_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _CLEANING_MOVE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].parking_position is defined and printer["gcode_macro T%s" % toolhead].loading_position is defined %}
{% set loading_position = printer["gcode_macro T%s" % toolhead].loading_position|float %}
{% set parking_position = printer["gcode_macro T%s" % toolhead].parking_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
{% set cleaning_position = loading_position %}
{% if loading_position == parking_position %}
{% if loading_position > 0 %}
{% set cleaning_position = loading_position - 30 %}
{% else %}
{% set cleaning_position = loading_position + 30 %}
{% endif %}
{% endif %}
G1 X{parking_position} F{speed}
G1 X{cleaning_position} F{speed}
G1 X{parking_position} F{speed}
G1 X{cleaning_position} F{speed}
G1 X{parking_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _START_PRINT_BED_MESH]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="start_print_bed_mesh"
SET_MACRO_TRAVEL_SETTINGS
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set X=[params.X0|default(-1)|float, params.X1|default(-1)|float] %}
{% set Y=[params.Y0|default(-1)|float, params.Y1|default(-1)|float] %}
DEBUG_ECHO PREFIX="_START_PRINT_BED_MESH" MSG="idex_mode: {idex_mode}, X: {X}, Y: {Y}"
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set X=[0, printable_x_max] %}
{% endif %}
{% set beacon_bed_mesh_scv = printer["gcode_macro RatOS"].beacon_bed_mesh_scv|default(25)|int %}
{% set beacon_contact_bed_mesh_samples = printer["gcode_macro RatOS"].beacon_contact_bed_mesh_samples|default(2)|int %}
{% set beacon_contact_bed_mesh = true if printer["gcode_macro RatOS"].beacon_contact_bed_mesh|default(false)|lower == 'true' else false %}
{% if printer.configfile.settings.beacon is defined and not beacon_contact_bed_mesh %}
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={beacon_bed_mesh_scv}
{% endif %}
{% set default_profile = printer["gcode_macro RatOS"].bed_mesh_profile|default('ratos') %}
{% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %}
BED_MESH_CLEAR
{% if printer["gcode_macro RatOS"].adaptive_mesh|lower == 'true' %}
CALIBRATE_ADAPTIVE_MESH PROFILE={default_profile} X0={X[0]} X1={X[1]} Y0={Y[0]} Y1={Y[1]} T={params.T|int} BOTH_TOOLHEADS={params.BOTH_TOOLHEADS} IDEX_MODE={idex_mode}
{% else %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% endif %}
BED_MESH_PROFILE LOAD={default_profile}
{% elif printer["gcode_macro RatOS"].bed_mesh_profile is defined %}
BED_MESH_CLEAR
BED_MESH_PROFILE LOAD={printer["gcode_macro RatOS"].bed_mesh_profile}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print_bed_mesh"
[gcode_macro CALIBRATE_ADAPTIVE_MESH]
gcode =
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_bed_mesh_samples = printer["gcode_macro RatOS"].beacon_contact_bed_mesh_samples|default(2)|int %}
{% set beacon_contact_bed_mesh = true if printer["gcode_macro RatOS"].beacon_contact_bed_mesh|default(false)|lower == 'true' else false %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set default_profile = params.PROFILE %}
{% set x0 = params.X0|default(-1)|float %}
{% set y0 = params.Y0|default(-1)|float %}
{% set x1 = params.X1|default(-1)|float %}
{% set y1 = params.Y1|default(-1)|float %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Recieved coordinates X0={x0} Y0={y0} X1={x1} Y1={y1}"
{% if x0 >= x1 or y0 >= y1 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Invalid coordinates received. Please check your slicer settings. Falling back to full bed mesh."
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% else %}
{% set mesh_config = printer.configfile.config.bed_mesh %}
{% set min_x = mesh_config.mesh_min.split(",")[0]|float %}
{% set min_y = mesh_config.mesh_min.split(",")[1]|float %}
{% set max_x = mesh_config.mesh_max.split(",")[0]|float %}
{% set max_y = mesh_config.mesh_max.split(",")[1]|float %}
{% set mesh_x0 = [[x0, max_x]|min, min_x]|max %}
{% set mesh_y0 = [[y0, max_y]|min, min_y]|max %}
{% set mesh_x1 = [[x1, max_x]|min, min_x]|max %}
{% set mesh_y1 = [[y1, max_y]|min, min_y]|max %}
{% if mesh_x0 == min_x and mesh_y0 == min_y and mesh_x1 == max_x and mesh_y1 == max_y %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Print is using the full bed, falling back to full bed mesh."
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% else %}
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
DEPLOY_PROBE
{% endif %}
{% set probe_count_x = mesh_config.probe_count.split(",")[0]|int %}
{% if mesh_config.probe_count.split(",")|length == 2 %}
{% set probe_count_y = mesh_config.probe_count.split(",")[1]|int %}
{% else %}
{% set probe_count_y = mesh_config.probe_count.split(",")[0]|int %}
{% endif %}
{% set probe_x_step = (max_x - min_x) / probe_count_x %}
{% set probe_y_step = (max_y - min_y) / probe_count_y %}
{% set mesh_count_x = ([(mesh_x1 - mesh_x0) / probe_x_step, 3]|max)|int %}
{% set mesh_count_y = ([(mesh_y1 - mesh_y0) / probe_y_step, 3]|max)|int %}
{% set min_mesh_count = [mesh_count_x, mesh_count_y]|min %}
{% set max_mesh_count = [mesh_count_x, mesh_count_y]|max %}
{% set algorithm = mesh_config.algorithm %}
{% if algorithm|lower == 'lagrange' and max_mesh_count > 6 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="cannot exceed a probe_count of 6 when using lagrange interpolation. Falling back to bicubic interpolation."
{% set algorithm = 'bicubic' %}
{% endif %}
{% if algorithm|lower == 'bicubic' and min_mesh_count < 4 %}
{% if max_mesh_count > 6 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="invalid probe_count option when using bicubic interpolation. Combination of 3 points on one axis with more than 6 on another is not permitted. Forcing minimum mesh count to be 4."
{% set min_mesh_count = 4 %}
{% else %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="bicubic interpolation with a probe_count of less than 4 points detected. Forcing lagrange interpolation."
{% set algorithm = 'lagrange' %}
{% endif %}
{% endif %}
{% set mesh_count_x = ([min_mesh_count, mesh_count_x]|max)|int %}
{% set mesh_count_x = ([max_mesh_count, mesh_count_x]|min)|int %}
{% set mesh_count_y = ([min_mesh_count, mesh_count_y]|max)|int %}
{% set mesh_count_y = ([max_mesh_count, mesh_count_y]|min)|int %}
{% set should_prime = printer["gcode_macro RatOS"].nozzle_priming == 'primeblob' %}
{% if printer["dual_carriage"] is not defined %}
{% set probe_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printable_y_max) < printable_y_max / 2 %}
{% else %}
{% set probe_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printable_y_max) < printable_y_max / 2 %}
{% endif %}
{% if printer.configfile.settings.beacon is defined and printer.configfile.settings.beacon.mesh_runs % 2 != 0 and probe_first %}
{% set probe_first = false %}
{% elif printer.configfile.settings.beacon is defined and printer.configfile.settings.beacon.mesh_runs % 2 == 0 and not probe_first %}
{% set probe_first = true %}
{% endif %}
{% if should_prime and probe_first %}
{% if printer["dual_carriage"] is not defined %}
PROBE_FOR_PRIMING
{% else %}
{% if both_toolheads %}
PROBE_FOR_PRIMING TOOLHEAD=0 IDEX_MODE={idex_mode}
PROBE_FOR_PRIMING TOOLHEAD=1 IDEX_MODE={idex_mode}
{% else %}
PROBE_FOR_PRIMING TOOLHEAD={params.T|int} IDEX_MODE={idex_mode}
{% endif %}
{% endif %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="mesh coordinates X0={mesh_x0} Y0={mesh_y0} X1={mesh_x1} Y1={mesh_y1}"
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile} ALGORITHM={algorithm} MESH_MIN={mesh_x0},{mesh_y0} MESH_MAX={mesh_x1},{mesh_y1} PROBE_COUNT={mesh_count_x},{mesh_count_y} RELATIVE_REFERENCE_INDEX=-1
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile} ALGORITHM={algorithm} MESH_MIN={mesh_x0},{mesh_y0} MESH_MAX={mesh_x1},{mesh_y1} PROBE_COUNT={mesh_count_x},{mesh_count_y} RELATIVE_REFERENCE_INDEX=-1
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% if should_prime and not probe_first %}
{% if printer["dual_carriage"] is not defined %}
PROBE_FOR_PRIMING
{% else %}
{% if both_toolheads %}
PROBE_FOR_PRIMING TOOLHEAD=0 IDEX_MODE={idex_mode}
PROBE_FOR_PRIMING TOOLHEAD=1 IDEX_MODE={idex_mode}
{% else %}
PROBE_FOR_PRIMING TOOLHEAD={params.T|int} IDEX_MODE={idex_mode}
{% endif %}
{% endif %}
{% endif %}
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
STOW_PROBE
{% endif %}
{% endif %}
{% endif %}
[gcode_macro M84]
rename_existing = M84.1
gcode =
M84.1
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
{% if printer["dual_carriage"] is defined %}
_SET_TOOLHEAD_OFFSET T={printer["gcode_macro RatOS"].default_toolhead|int} MOVE=0
SET_GCODE_VARIABLE MACRO=SET_PRESSURE_ADVANCE VARIABLE=snyc_toolheads VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_REMAP_TOOLHEADS VARIABLE=enabled VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% if printer["gcode_macro _VAOC"] is defined %}
SET_GCODE_VARIABLE MACRO=_VAOC VARIABLE=is_started VALUE=False
SET_GCODE_VARIABLE MACRO=_VAOC VARIABLE=is_started_at_temp VALUE=False
{% endif %}
SET_GCODE_OFFSET X=0 Y=0 Z=0 MOVE=0
_IDEX_SINGLE INIT=1
{% endif %}
SET_SKEW CLEAR=1
_LED_MOTORS_OFF
[gcode_macro M104]
rename_existing = M104.1
gcode =
{% set s = params.S|default(0)|int %}
{% set t = params.T|default(-1)|int %}
{% set t = 0 if t == -1 else t %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
DEBUG_ECHO PREFIX="M104" MSG="s: {s}, t: {t}"
{% if printer["gcode_macro T%s" % t] is defined %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set temperature_offset_t0 = printer["gcode_macro T0"].temperature_offset|default(0)|int %}
{% set temperature_offset_t1 = printer["gcode_macro T1"].temperature_offset|default(0)|int %}
{% set s0 = [s + temperature_offset_t0, 0]|max %}
{% set s1 = [s + temperature_offset_t1, 0]|max %}
{% if temperature_offset_t0 != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset_t0}°C added to toolhead T0."
{% endif %}
{% if temperature_offset_t1 != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset_t1}°C added to toolhead T1."
{% endif %}
{% else %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set s = [s + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
{% set is_in_standby = false %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% if toolchange_standby_temp > -1 %}
{% set is_in_standby = true if printer["gcode_macro T%s" % t].standby|default(false)|lower == 'true' else false %}
{% endif %}
{% endif %}
{% if not is_in_standby %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
M104.1 S{s0} T0
M104.1 S{s1} T1
{% else %}
M104.1 S{s} T{t}
{% endif %}
{% endif %}
[gcode_macro M109]
rename_existing = M109.1
gcode =
{% set s = params.S|default(0)|int %}
{% set t = params.T|default(-1)|int %}
{% set t = 0 if t == -1 else t %}
DEBUG_ECHO PREFIX="M109" MSG="s: {s}, t: {t}"
{% if printer["gcode_macro T%s" % t] is defined %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set s = [s + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="M109" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% set is_in_standby = false %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% if toolchange_standby_temp > -1 %}
{% set is_in_standby = true if printer["gcode_macro T%s" % t].standby|default(false)|lower == 'true' else false %}
{% endif %}
{% endif %}
{% if not is_in_standby %}
M109.1 S{s} T{t}
{% endif %}
[gcode_macro SET_HEATER_TEMPERATURE]
rename_existing = SET_HEATER_TEMPERATURE_BASE
gcode =
{% set heater = params.HEATER|default("") %}
{% set target = params.TARGET|default(0)|int %}
DEBUG_ECHO PREFIX="SET_HEATER_TEMPERATURE" MSG="heater: {heater}, target: {target}"
{% if heater|lower == "extruder" or heater|lower == "extruder1" %}
{% set t = 0 if heater|lower == "extruder" else 1 %}
{% if printer["gcode_macro T%s" % t] is defined and target > 0 %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set target = [target + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="SET_HEATER_TEMPERATURE" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
SET_HEATER_TEMPERATURE_BASE HEATER="{heater}" TARGET={target}
[gcode_macro TEMPERATURE_WAIT]
rename_existing = TEMPERATURE_WAIT_BASE
gcode =
{% set sensor = params.SENSOR|default("") %}
{% set minimum = params.MINIMUM|default(-1)|int %}
{% set maximum = params.MAXIMUM|default(-1)|int %}
DEBUG_ECHO PREFIX="TEMPERATURE_WAIT" MSG="sensor: {sensor}, minimum: {minimum}, maximum: {maximum}"
{% if sensor|lower == "extruder" or sensor|lower == "extruder1" %}
{% set t = 0 if sensor|lower == "extruder" else 1 %}
{% if printer["gcode_macro T%s" % t] is defined and (minimum > 0 or maximum > 0) %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% if minimum > -1 %}
{% set minimum = [minimum + temperature_offset, 0]|max %}
{% endif %}
{% if maximum > -1 %}
{% set maximum = [maximum + temperature_offset, 0]|max %}
{% endif %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
{% if minimum > -1 and maximum > -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MINIMUM: {minimum}, MAXIMUM: {maximum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MINIMUM={minimum} MAXIMUM={maximum}
{% elif minimum > -1 and maximum == -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MINIMUM: {minimum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MINIMUM={minimum}
{% elif minimum == -1 and maximum > -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MAXIMUM: {maximum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MAXIMUM={maximum}
{% endif %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Temperature for toolhead T{t} reached."
[gcode_macro SET_GCODE_OFFSET]
rename_existing = SET_GCODE_OFFSET_ORG
gcode =
SET_GCODE_OFFSET_ORG { rawparams }
{% if printer.configfile.settings.beacon is defined and (params.Z_ADJUST is defined or params.Z is defined) %}
_BEACON_APPLY_RUNTIME_MULTIPLIER
{% endif %}
[gcode_macro SDCARD_PRINT_FILE]
rename_existing = SDCARD_PRINT_FILE_BASE
gcode =
{% if printer["ratos"] is defined %}
PROCESS_GCODE_FILE { rawparams }
{% else %}
SDCARD_PRINT_FILE_BASE { rawparams }
{% endif %}
[gcode_macro SKEW_PROFILE]
rename_existing = SKEW_PROFILE_BASE
variable_loaded_profile = ""
gcode =
{% if params.LOAD is defined %}
{% if printer.configfile.settings["skew_correction %s" % params.LOAD] is defined %}
SET_GCODE_VARIABLE MACRO=SKEW_PROFILE VARIABLE=loaded_profile VALUE='"{params.LOAD}"'
{% endif %}
{% endif %}
SKEW_PROFILE_BASE { rawparams }
[gcode_macro SET_SKEW]
rename_existing = SET_SKEW_BASE
gcode =
{% if params.CLEAR is defined %}
{% if params.CLEAR|default(0)|int == 1 %}
SET_GCODE_VARIABLE MACRO=SKEW_PROFILE VARIABLE=loaded_profile VALUE='""'
{% endif %}
{% endif %}
SET_SKEW_BASE { rawparams }
[gcode_macro SET_VELOCITY_LIMIT]
rename_existing = SET_VELOCITY_LIMIT_BASE
gcode =
{% if params.ACCEL_TO_DECEL is defined %}
{% if params.ACCEL is defined %}
{% set accel = params.ACCEL|float %}
{% else %}
{% set accel = printer.toolhead.max_accel|float %}
{% endif %}
{% if params.VELOCITY is defined %}
{% set velocity = params.VELOCITY|float %}
{% else %}
{% set velocity = printer.toolhead.max_velocity|float %}
{% endif %}
{% if params.SQUARE_CORNER_VELOCITY is defined %}
{% set scv = params.SQUARE_CORNER_VELOCITY|float %}
{% else %}
{% set scv = printer.toolhead.square_corner_velocity|float %}
{% endif %}
{% set mcr = params.ACCEL_TO_DECEL|float / accel %}
DEBUG_ECHO PREFIX="SET_VELOCITY_LIMIT" MSG="ACCEL={accel}, VELOCITY={velocity}, SQUARE_CORNER_VELOCITY={scv}, MINIMUM_CRUISE_RATIO={mcr}"
SET_VELOCITY_LIMIT_BASE ACCEL={accel} VELOCITY={velocity} SQUARE_CORNER_VELOCITY={scv} MINIMUM_CRUISE_RATIO={1-mcr}
{% else %}
SET_VELOCITY_LIMIT_BASE { rawparams }
{% endif %}
[gcode_macro _START_PRINT_PARK]
gcode =
{% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set start_print_park_in = printer["gcode_macro RatOS"].start_print_park_in %}
{% set start_print_park_x = printer["gcode_macro RatOS"].start_print_park_x %}
{% if start_print_park_in == 'primeblob' %}
{% set z = 3 %}
{% endif %}
{% if printer["dual_carriage"] is defined and not (printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
{% if printer["gcode_macro RatOS"].start_print_park_x is defined and printer["gcode_macro RatOS"].start_print_park_x != '' %}
RATOS_ECHO PREFIX="WARNING" MSG="start_print_park_x is ignored for IDEX printers"
{% endif %}
PARK_TOOLHEAD
G90
{% endif %}
_PARK LOCATION={start_print_park_in} X={start_print_park_x}
G0 Z{z} F{z_speed}
[gcode_macro _END_PRINT_PARK]
gcode =
{% if printer["dual_carriage"] is defined %}
{% if printer["gcode_macro RatOS"].end_print_park_x is defined and printer["gcode_macro RatOS"].end_print_park_x != '' %}
RATOS_ECHO PREFIX="WARNING" MSG="end_print_park_x is ignored for IDEX printers"
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
_IDEX_SINGLE X={parking_position}
PARK_TOOLHEAD
G90
{% endif %}
_PARK LOCATION={printer["gcode_macro RatOS"].end_print_park_in} X={printer["gcode_macro RatOS"].end_print_park_x}
[gcode_macro _PARK]
gcode =
{% set x = params.X %}
{% set location = params.LOCATION|default('back')|lower %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% set nozzle_priming = printer["gcode_macro RatOS"].nozzle_priming|lower %}
CACHE_TOOLHEAD_SETTINGS KEY="park"
SET_MACRO_TRAVEL_SETTINGS
{% if x != '' %}
{% if x|float >= printer.toolhead.axis_minimum.x + 5 and x|float <= printable_x_max - 5 %}
{% set park_x = x|float %}
{% else %}
{action_respond_info('The requested X co-ordinate is outside the defined axis bounds - using defaults')}
{% set park_x = printable_x_max / 2 %}
{% endif %}
{% else %}
{% set park_x = printable_x_max / 2 %}
{% endif %}
{% if location == 'back' %}
{% set park_y = printable_y_max - 15 %}
{% elif location == 'front' %}
{% set park_y = printer.toolhead.axis_minimum.y + 5 %}
{% elif location == 'center' %}
{% set park_y = printable_y_max / 2 %}
{% elif location == 'primeblob' and printer["dual_carriage"] is defined %}
{% set park_y = printable_y_max - 15 %}
{% endif %}
{% if location == 'primeblob' and printer["dual_carriage"] is not defined %}
{% if (nozzle_priming == 'primeblob' or nozzle_priming == 'primeline') %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set park_x = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set park_x = printable_x_max - 5 %}
{% else %}
{% set park_x = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set park_y = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set park_y = printable_y_max - 5 %}
{% else %}
{% set park_y = nozzle_prime_start_y|float %}
{% endif %}
{% endif %}
{% endif %}
G90
{% if printer["dual_carriage"] is not defined %}
G0 X{park_x} Y{park_y} F{speed}
{% else %}
G0 Y{park_y} F{speed}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="park"
[gcode_macro SAVE_PROBE_RESULT]
gcode =
{% set beacon_contact_prime_probing = true if printer["gcode_macro RatOS"].beacon_contact_prime_probing|default(false)|lower == 'true' else false %}
{% set last_z_offset = 9999.9 %}
{% if printer.configfile.settings.beacon is defined %}
{% set current_z = printer.toolhead.position.z|float %}
{% if beacon_contact_prime_probing %}
{% set last_z_offset = printer.beacon.last_z_result %}
{% else %}
{% set last_z_offset = printer.beacon.last_sample.dist - current_z %}
{% endif %}
{% elif printer.configfile.settings.bltouch is defined %}
{% set config_offset = printer.configfile.settings.bltouch.z_offset|float %}
{% set last_z_offset = printer.probe.last_z_result - config_offset %}
{% elif printer.configfile.settings.probe is defined %}
{% set config_offset = printer.configfile.settings.probe.z_offset|float %}
{% set last_z_offset = printer.probe.last_z_result - config_offset %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Saving offset adjustment of {last_z_offset} in {params.VARIABLE|default('last_z_offset')}"
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE={params.VARIABLE|default('last_z_offset')} VALUE={last_z_offset}
[gcode_macro PROBE_FOR_PRIMING]
gcode =
{% set probe_for_priming_disable_mesh_constraints = true if printer["gcode_macro RatOS"].probe_for_priming_disable_mesh_constraints|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].nozzle_priming|lower != 'false' %}
SAVE_GCODE_STATE NAME=probe_for_priming_state
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the prime location.."
CACHE_TOOLHEAD_SETTINGS KEY="probe_for_priming"
SET_MACRO_TRAVEL_SETTINGS
{% set t = params.TOOLHEAD|default(-1)|int %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% if idex_mode == '' %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set x_start = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set x_start = printable_x_max - 5 %}
{% else %}
{% set x_start = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% else %}
{% set y_start = nozzle_prime_start_y|float %}
{% endif %}
{% else %}
{% set center_x = printable_x_max / 2 %}
{% if t == 0 %}
{% set x_start = 5 %}
{% else %}
{% set x_start = printable_x_max - 5 %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% endif %}
{% endif %}
{% set z = printer.configfile.settings.bed_mesh.horizontal_move_z|float %}
{% set mesh_config = printer.configfile.config.bed_mesh %}
{% if printer.configfile.settings.bltouch is defined %}
{% set x_offset = printer.configfile.settings.bltouch.x_offset|float %}
{% set y_offset = printer.configfile.settings.bltouch.y_offset|float %}
{% set z_offset = printer.configfile.settings.bltouch.z_offset|float %}
{% elif printer.configfile.settings.probe is defined %}
{% set x_offset = printer.configfile.settings.probe.x_offset|float %}
{% set y_offset = printer.configfile.settings.probe.y_offset|float %}
{% set z_offset = printer.configfile.settings.probe.z_offset|float %}
{% elif printer.configfile.settings.beacon is defined %}
{% set x_offset = printer.configfile.settings.beacon.x_offset|float %}
{% set y_offset = printer.configfile.settings.beacon.y_offset|float %}
{% set z_offset = printer.configfile.settings.beacon.trigger_distance|float %}
{% else %}
{ action_raise_error("No probe, beacon or bltouch section found. Adaptive priming only works with a [probe], [beacon] or [bltouch] section defined.") }
{% endif %}
{% if z < z_offset %}
{ action_raise_error("Horizontal move Z ({z}) is below your probe's Z offset ({z_offset}). Please adjust your horizontal_move_z setting in [bed_mesh] to be above {z}.") }
{% endif %}
{% if not probe_for_priming_disable_mesh_constraints %}
{% set min_x = mesh_config.mesh_min.split(",")[0]|float - x_offset %}
{% set min_y = mesh_config.mesh_min.split(",")[1]|float - y_offset %}
{% set max_x = mesh_config.mesh_max.split(",")[0]|float - x_offset %}
{% set max_y = mesh_config.mesh_max.split(",")[1]|float - y_offset %}
{% set x_start = [[x_start, max_x]|min, min_x]|max %}
{% set y_start = [[y_start, max_y]|min, min_y]|max %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the start of the prime location at {x_start}, {y_start}"
G90
M83
G0 Z{z} F{z_speed}
G1 X{x_start} Y{y_start} F{speed}
PROBE_CURRENT_POSITION
{% if t == 1 %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result_t1
{% else %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result
{% endif %}
{% if idex_mode == '' %}
{% set x_end = x_start %}
{% set y_end = y_start + 45 %}
{% else %}
{% if t==1 %}
{% set x_end = x_start - 45 %}
{% else %}
{% set x_end = x_start + 45 %}
{% endif %}
{% set y_end = y_start %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the end of the prime location at {x_end}, {y_end}"
G1 X{x_end} Y{y_end} F{speed}
PROBE_CURRENT_POSITION
{% if t == 1 %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_end_result_t1
{% else %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_end_result
{% endif %}
RESTORE_GCODE_STATE NAME=probe_for_priming_state
RESTORE_TOOLHEAD_SETTINGS KEY="probe_for_priming"
{% endif %}
[gcode_macro RESET_PRIME_PROBE_STATE]
gcode =
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result VALUE=None
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_end_result VALUE=None
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result_t1 VALUE=None
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_end_result_t1 VALUE=None
{% endif %}
[gcode_macro PROBE_CURRENT_POSITION]
gcode =
{% set beacon_contact_prime_probing = true if printer["gcode_macro RatOS"].beacon_contact_prime_probing|default(false)|lower == 'true' else false %}
SAVE_GCODE_STATE NAME=probe_current_position_state
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
ASSERT_PROBE_DEPLOYED
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_prime_probing %}
PROBE PROBE_METHOD=contact SAMPLES=1
{% else %}
PROBE
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
BEACON_QUERY
{% else %}
RESTORE_GCODE_STATE NAME=probe_current_position_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_z_speed|float}
{% endif %}
[gcode_macro PRIME_BLOB]
description = Prints a primeblob, used internally, if configured, as part of the START_PRINT macro.
variable_x_offset = 5
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="prime_blob"
SET_MACRO_TRAVEL_SETTINGS
RATOS_ECHO PREFIX="Priming" MSG="Priming nozzle with prime blob.."
{% set current_toolhead = 0 %}
{% set target_idex_mode = '' %}
{% set extruder = 'extruder' %}
{% if printer["dual_carriage"] is defined %}
{% if params.IDEX_MODE is defined %}
{% set target_idex_mode = params.IDEX_MODE|default('')|lower %}
{% else %}
{ action_raise_error("IDEX_MODE parameter not found for PRIME_BLOB macro. This is likely a bug.") }
{% endif %}
RATOS_ECHO PREFIX="Priming" MSG="Priming in IDEX {target_idex_mode} mode.."
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set current_toolhead = 1 if current_idex_mode=='primary' else 0 %}
{% set extruder = 'extruder1' if current_toolhead == 1 else 'extruder' %}
{% endif %}
{% if target_idex_mode != "copy" or target_idex_mode != "mirror" %}
SAVE_GCODE_STATE NAME=prime_blob_state
{% endif %}
{% set first_y = printer["gcode_macro START_PRINT"].first_y|default(-1)|float %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set fan_speed = printer["gcode_macro RatOS"].nozzle_prime_bridge_fan|float %}
{% set nozzle_diameter = printer.configfile.settings[extruder].nozzle_diameter|float %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set has_start_offset_t0 = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) != 9999.9 %}
{% if printer["dual_carriage"] is defined %}
{% set has_start_offset_t1 = printer["gcode_macro RatOS"].probe_for_priming_result_t1|float(9999.9) != 9999.9 %}
{% endif %}
{% set start_print_park_in = printer["gcode_macro RatOS"].start_print_park_in %}
{% set start_print_park_z_height = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set nozzle_prime_direction = printer["gcode_macro RatOS"].nozzle_prime_direction|lower %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% set initial_toolhead = params.INITIAL_TOOLHEAD|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% if target_idex_mode == '' %}
{% set x_factor = 0 %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set x_start = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set x_start = printable_x_max - 5 %}
{% else %}
{% set x_start = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% set y_factor = 1 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% set y_factor = -1 %}
{% else %}
{% set y_start = nozzle_prime_start_y|float %}
{% if nozzle_prime_start_y|float < printable_y_max / 2 %}
{% set y_factor = 1 %}
{% else %}
{% set y_factor = -1 %}
{% endif %}
{% endif %}
{% if nozzle_prime_direction == 'forwards' %}
{% set y_factor = 1 %}
{% elif nozzle_prime_direction == 'backwards' %}
{% set y_factor = -1 %}
{% endif %}
{% if start_print_park_in == 'primeblob' %}
{% set z = 3 %}
{% else %}
{% set z = start_print_park_z_height %}
{% endif %}
{% else %}
{% set center_x = printable_x_max / 2 %}
{% set y_factor = 0 %}
{% if target_idex_mode == 'copy' or target_idex_mode == 'mirror' %}
{% set x_start = center_x / 2 + 5 %}
{% set x_factor = 1 %}
{% else %}
{% if both_toolheads and initial_toolhead != current_toolhead %}
{% if current_toolhead == 0 %}
{% set x_start = 55 %}
{% set x_factor = -1 %}
{% elif current_toolhead == 1 %}
{% set x_start = printable_x_max - 55 %}
{% set x_factor = 1 %}
{% endif %}
{% else %}
{% if current_toolhead == 0 %}
{% set x_start = 5 %}
{% set x_factor = 1 %}
{% elif current_toolhead == 1 %}
{% set x_start = printable_x_max - 5 %}
{% set x_factor = -1 %}
{% endif %}
{% endif %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_x_max - 5 %}
{% endif %}
{% set z = 10 %}
{% endif %}
{% set start_z_offset = 0 %}
{% set end_z_offset = 0 %}
{% if has_start_offset_t0 %}
{% set start_z_probe_result_t0 = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %}
{% set end_z_probe_result_t0 = printer["gcode_macro RatOS"].probe_for_priming_end_result|float(9999.9) %}
{% if printer.configfile.settings.bltouch is not defined and printer.configfile.settings.probe is not defined and printer.configfile.settings.beacon is not defined %}
{ action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe], [beacon] or [bltouch].") }
{% endif %}
{% if start_z_probe_result_t0 == 9999.9 %}
{ action_raise_error("No start probe result found for prime area. This is likely a bug.") }
{% endif %}
{% if end_z_probe_result_t0 == 9999.9 %}
{ action_raise_error("No end probe result found for prime area. This is likely a bug.") }
{% endif %}
{% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %}
{% if start_z_probe_result_t0 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (start_z_probe_result_t0) ) }
{% endif %}
{% if end_z_probe_result_t0 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (end_z_probe_result_t0) ) }
{% endif %}
{% set start_z_offset = start_z_probe_result_t0 %}
{% set end_z_offset = end_z_probe_result_t0 %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if current_toolhead == 1 or both_toolheads or target_idex_mode == "copy" or target_idex_mode == "mirror" %}
{% if has_start_offset_t1 %}
{% set start_z_probe_result_t1 = printer["gcode_macro RatOS"].probe_for_priming_result_t1|float(9999.9) %}
{% set end_z_probe_result_t1 = printer["gcode_macro RatOS"].probe_for_priming_end_result_t1|float(9999.9) %}
{% if printer.configfile.settings.bltouch is not defined and printer.configfile.settings.probe is not defined and printer.configfile.settings.beacon is not defined %}
{ action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe], [beacon] or [bltouch].") }
{% endif %}
{% if start_z_probe_result_t1 == 9999.9 %}
{ action_raise_error("No start probe result found for prime area. This is likely a bug.") }
{% endif %}
{% if end_z_probe_result_t1 == 9999.9 %}
{ action_raise_error("No end probe result found for prime area. This is likely a bug.") }
{% endif %}
{% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %}
{% if start_z_probe_result_t1 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (start_z_probe_result_t1) ) }
{% endif %}
{% if end_z_probe_result_t1 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (end_z_probe_result_t1) ) }
{% endif %}
{% set start_z_offset = [start_z_offset, start_z_probe_result_t1]|max %}
{% set end_z_offset = [end_z_offset, start_z_probe_result_t1]|max %}
{% endif %}
{% endif %}
{% if target_idex_mode != 'copy' and target_idex_mode != 'mirror' %}
{% if both_toolheads and initial_toolhead != current_toolhead %}
{% set original_start_z_offset = start_z_offset %}
{% set original_end_z_offset = end_z_offset %}
{% set start_z_offset = original_end_z_offset %}
{% set end_z_offset = original_start_z_offset %}
{% endif %}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SET_NOZZLE_TEMP_OFFSET TOOLHEAD={current_toolhead}
{% endif %}
DEBUG_ECHO PREFIX="PRIME_BLOB" MSG="x_start: {x_start}, y_start: {y_start}, x_factor: {x_factor}, y_factor: {y_factor}, z: {z}, start_z_offset: {start_z_offset}, end_z_offset: {end_z_offset}"
G90
M83
RATOS_ECHO PREFIX="Priming" MSG="Lifting Z to {z}.."
G0 Z{z} F{z_speed}
{% if printer["dual_carriage"] is not defined %}
RATOS_ECHO PREFIX="Priming" MSG="Moving to {x_start}, {y_start} along the edge of the print area.."
{% if start_print_park_in != 'primeblob' %}
G1 X{x_start} F{speed}
G1 Y{y_start + (15 * y_factor)} F{speed}
{% endif %}
{% else %}
G1 Y{y_start + (15 * y_factor)} F{speed}
{% if target_idex_mode=="copy" or target_idex_mode=="mirror" %}
RATOS_ECHO PREFIX="Priming" MSG="Mirroring move to {x_start}, {y_start} along the edge of the print area.."
_IDEX_MIRROR PRIMING=1
{% else %}
RATOS_ECHO PREFIX="Priming" MSG="Moving to {x_start}, {y_start} along the edge of the print area.."
{% endif %}
G1 X{x_start} F{speed}
{% endif %}
RATOS_ECHO PREFIX="Priming" MSG="Starting prime blob.."
G1 Z{0.5 + start_z_offset} F{z_speed}
G1 Y{y_start} F{speed}
G1 F300 E{14 / ((0.4 / nozzle_diameter) ** 2)}
G1 F300 E{14 / ((0.4 / nozzle_diameter) ** 2)}
M106 S{fan_speed}
G1 Z5 F100 E5
G92 E0
RATOS_ECHO PREFIX="Priming" MSG="Bridging with {((fan_speed/255) * 100)|int}% fan speed.."
G1 F3000 X{x_start + (15 * x_factor)} Y{y_start + (15 * y_factor)} E{1 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (20 * x_factor)} Y{y_start + (20 * y_factor)} Z{3.8 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (34 * x_factor)} Y{y_start + (34 * y_factor)} Z{2.6 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (38 * x_factor)} Y{y_start + (38 * y_factor)} Z{1.4 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (42 * x_factor)} Y{y_start + (42 * y_factor)} Z{0.2 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
M106 S0
G1 F3000 X{x_start + (46 * x_factor)} Y{y_start + (46 * y_factor)} Z{0.2 + end_z_offset} E0.6
G1 F{speed} X{x_start + (50 * x_factor)} Y{y_start + (50 * y_factor)}
{% if target_idex_mode == "copy" or target_idex_mode == "mirror" %}
G0 Z3 F{z_speed}
{% endif %}
{% if target_idex_mode == "copy" %}
{% if first_y >= 0 %}
_IDEX_COPY DANCE=0 Y={first_y}
{% else %}
_IDEX_COPY DANCE=0 Y={params.Y1}
{% endif %}
{% endif %}
{% if target_idex_mode != "copy" or target_idex_mode != "mirror" %}
RESTORE_GCODE_STATE NAME=prime_blob_state
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="prime_blob"
G92 E0
[gcode_macro UNLOAD_FILAMENT]
description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams.
variable_ignore_min_extrude_temp = True
gcode =
_LEARN_MORE_FILAMENT
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set filament_name = params._NAME|default('')|string %}
{% set filament_type = params._TYPE|default('')|string %}
{% set temp = params.TEMP|default(220)|int %}
{% if printer["dual_carriage"] is not defined %}
_DEFAULT_UNLOAD_FILAMENT TEMP={temp} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Unloading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead==0 or toolhead==1 %}
_IDEX_UNLOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
[gcode_macro _LEGACY_UNLOAD_FILAMENT]
description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams.
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set unload_speed = 5 * 60 %}
{% set unload_length = printer["gcode_macro RatOS"].filament_unload_length|float %}
M117 Unloading filament...
G0 E10 F300
G0 E-5 F3600
G4 P3000
G0 E5 F6000
G0 E-15 F6000
G0 E-{unload_length} F{unload_speed}
_CLEANING_MOVE TOOLHEAD={toolhead}
M117 Filament unloaded!
RESPOND MSG="Filament unloaded! Please inspect the tip of the filament before reloading."
[gcode_macro _DEFAULT_UNLOAD_FILAMENT]
description = Unload filament macro for non IDEX printers.
gcode =
{% set temp = params.TEMP|default(220)|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set enable_unload_tip_forming = true if printer["gcode_macro RatOS"].enable_unload_tip_forming|default(false)|lower == 'true' else false %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_DEFAULT_UNLOAD_FILAMENT" MSG="TEMP: {temp}"
_LED_UNLOADING_FILAMENT TOOLHEAD=0
SAVE_GCODE_STATE NAME=unload_state
{% if printer.extruder.temperature|int < temp or printer.extruder.can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating extruder to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={temp}
G4 P3000
{% if enable_unload_tip_forming %}
_UNLOAD_FILAMENT TOOLHEAD=0 NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_LEGACY_UNLOAD_FILAMENT TOOLHEAD=0
{% endif %}
RESTORE_GCODE_STATE NAME=unload_state
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD=0
[gcode_macro _IDEX_UNLOAD_FILAMENT]
description = Unload filament macro for IDEX printer.
gcode =
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set enable_unload_tip_forming = true if printer["gcode_macro RatOS"].enable_unload_tip_forming|default(false)|lower == 'true' else false %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_IDEX_UNLOAD_FILAMENT" MSG="TEMP: {temp}, TOOLHEAD: {toolhead}"
_LED_UNLOADING_FILAMENT TOOLHEAD={toolhead}
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
{% if not printer.pause_resume.is_paused %}
{% if printer[target_extruder].temperature|int < temp or printer[target_extruder].can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating T{toolhead} to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={temp}
{% endif %}
G4 P3000
{% if enable_unload_tip_forming %}
_UNLOAD_FILAMENT TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_LEGACY_UNLOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead}
{% endif %}
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD={toolhead}
[gcode_macro _UNLOAD_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT" MSG="TOOLHEAD: {toolhead}"
_MOVE_TO_LOADING_POSITION TOOLHEAD={toolhead}
_UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
_UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER TOOLHEAD={toolhead}
_CLEANING_MOVE TOOLHEAD={toolhead}
[gcode_macro _UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Unloading filament from nozzle to cooling zone... Please wait!"
_PURGE_BEFORE_UNLOAD TOOLHEAD={toolhead}
{% if printer["gcode_macro _UNLOAD_WITHOUT_TIP_FORMING"] is defined %}
_UNLOAD_WITHOUT_TIP_FORMING TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_UNLOAD_WITH_TIP_FORMING NAME='{filament_name}' TYPE='{filament_type}'
{% endif %}
G4 P3000
[gcode_macro _UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set extruder_load_speed = printer["gcode_macro T%s" % toolhead].extruder_load_speed|float * 60 %}
{% set extruder_gear_to_cooling_position_distance = printer["gcode_macro T%s" % toolhead].extruder_gear_to_cooling_position_distance|float %}
{% set tooolhead_sensor_to_extruder_gear_distance = printer["gcode_macro T%s" % toolhead].tooolhead_sensor_to_extruder_gear_distance|float %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER" MSG="TOOLHEAD: {toolhead}"
G0 E-{extruder_gear_to_cooling_position_distance + tooolhead_sensor_to_extruder_gear_distance + 50} F{extruder_load_speed}
RATOS_ECHO MSG="Filament unloaded! Please inspect the tip of the filament before reloading."
[gcode_macro _UNLOAD_WITH_TIP_FORMING]
gcode =
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% if filament_name != '' and filament_type != '' %}
_UNLOAD_KNOWN_FILAMENT NAME={filament_name} TYPE={filament_type}
{% else %}
_UNLOAD_UNKNOWN_FILAMENT TOOLHEAD={toolhead}
{% endif %}
[gcode_macro _UNLOAD_KNOWN_FILAMENT]
description = User overrideable tip forming macro if slicer filament profiles are known
gcode =
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
RATOS_ECHO PREFIX="FILAMENT TYPE" MSG='{filament_type}'
RATOS_ECHO PREFIX="FILAMENT PROFILE" MSG='{filament_name}'
{% if filament_name == "Prusament PETG @V-Minion" %}
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
{% elif filament_name == "Nobufil PETG @V-Minion" %}
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
{% else %}
RATOS_ECHO PREFIX="_UNLOAD_KNOWN_FILAMENT" MSG="Filament profile not found!"
_UNLOAD_UNKNOWN_FILAMENT
{% endif %}
[gcode_macro _UNLOAD_UNKNOWN_FILAMENT]
description = User overrideable standard tip forming macro
gcode =
DEBUG_ECHO PREFIX="_UNLOAD_UNKNOWN_FILAMENT" MSG="Using standard tip forming macro!"
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
[gcode_macro _TIP_FORMING]
gcode =
{% set cooling_moves = params.COOLING_MOVES|default(4)|int %}
{% set cooling_move_length = params.COOLING_MOVE_LENGTH|default(10)|float %}
{% set start_cooling_speed = params.START_COOLING_SPEED|default(10)|float * 60 %}
{% set end_cooling_speed = params.END_COOLING_SPEED|default(50)|float * 60 %}
{% if cooling_moves == 0 %}
{% set cooling_move_length = 0 %}
{% endif %}
{% set dip = true if params.DIP|default(false)|lower == "true" else false %}
{% set dip_length = params.DIP_LENGTH|default(22)|float %}
{% set dip_speed = params.DIP_SPEED|default(30)|float * 60 %}
{% set dip_retract_speed = params.DIP_RETRACT_SPEED|default(70)|float * 60 %}
{% set retract_length = params.RETRACT_LENGTH|default(18)|float %}
{% set start_retract_speed = params.START_RETRACT_SPEED|default(120)|float * 60 %}
{% set end_retract_speed = params.END_RETRACT_SPEED|default(20)|float * 60 %}
DEBUG_ECHO PREFIX="_TIP_FORMING" MSG="cooling_moves: {cooling_moves}, cooling_move_length: {cooling_move_length}, start_cooling_speed: {start_cooling_speed}, end_cooling_speed: {end_cooling_speed}, dip: {dip}, dip_length: {dip_length}, dip_speed: {dip_speed}, dip_retract_speed: {dip_retract_speed}, retract_length: {retract_length}, start_retract_speed: {start_retract_speed}, end_retract_speed: {end_retract_speed}"
M220 S100
G92 E0
{% set retract = retract_length + cooling_move_length / 2 - 15 %}
G1 E-15 F{start_retract_speed}
G1 E-{0.7 * retract} F{1.0 * end_retract_speed}
G1 E-{0.2 * retract} F{0.5 * end_retract_speed}
G1 E-{0.1 * retract} F{0.3 * end_retract_speed}
G92 E0
{% if cooling_moves > 0 %}
{% set i = (end_cooling_speed - start_cooling_speed) / (2 * cooling_moves - 1) %}
{% for m in range(cooling_moves) %}
G1 E{cooling_move_length} F{(start_cooling_speed + i * m * 2)}
G1 E-{cooling_move_length} F{(start_cooling_speed + i * (m * 2 + 1))}
{% endfor %}
{% endif %}
G92 E0
{% if dip %}
G1 E{dip_length} F{dip_speed}
G4 P100
G1 E-{dip_length} F{dip_retract_speed}
{% endif %}
G92 E0
M400
[gcode_macro _ON_FILAMENT_SENSOR_BUTTON_PRESSED]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_FILAMENT_SENSOR_BUTTON_PRESSED" MSG="TOOLHEAD: {toolhead}"
{% if not printer.virtual_sdcard.is_active %}
UNLOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_RUNOUT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_runout_detection = true if printer["gcode_macro T%s" % toolhead].enable_runout_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_RUNOUT" MSG="TOOLHEAD: {toolhead}"
{% if enable_runout_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=false
{% endif %}
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_CLOG]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_clog_detection = true if printer["gcode_macro T%s" % toolhead].enable_clog_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_CLOG" MSG="TOOLHEAD: {toolhead}"
{% if enable_clog_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=true
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_RUNOUT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_runout_detection = true if printer["gcode_macro T%s" % toolhead].enable_runout_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_RUNOUT" MSG="TOOLHEAD: {toolhead}"
{% if enable_runout_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=false
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_CLOG]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_clog_detection = true if printer["gcode_macro T%s" % toolhead].enable_clog_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_CLOG" MSG="TOOLHEAD: {toolhead}"
{% if enable_clog_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=true
{% endif %}
[gcode_macro _ON_FILAMENT_END]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set clogged = true if params.CLOGGED|default(false)|lower == 'true' else false %}
{% set unload_after_runout = printer["gcode_macro T%s" % toolhead].unload_after_runout|float %}
{% if clogged %}
_LED_FILAMENT_CLOG TOOLHEAD={toolhead}
{% else %}
_LED_FILAMENT_RUNOUT TOOLHEAD={toolhead}
{% endif %}
DEBUG_ECHO PREFIX="_ON_FILAMENT_END" MSG="TOOLHEAD: {toolhead}"
{% if printer.virtual_sdcard.is_active %}
{% if not printer.pause_resume.is_paused %}
PAUSE RUNOUT=True
{% endif %}
{% if not clogged and unload_after_runout %}
UNLOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
{% if not clogged and printer["dual_carriage"] is defined %}
{% if printer["gcode_macro _IDEX_JOIN_SPOOLS"].enabled|default(false)|lower == 'true'%}
_JOIN_SPOOL TOOLHEAD={toolhead}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro M600]
description = Executes a color change by pausing the printer an unloading the filament.
gcode =
PAUSE
UNLOAD_FILAMENT
RATOS_ECHO MSG="Please load new filament and resume"
[gcode_macro COLD_PULL]
description = Automated hotend cold pull.
gcode =
{% set extrusion_temp = params.EXTRUSION_TEMP|default(220)|int %}
{% set cold_pull_temp = params.COLD_PULL_TEMP|default(80)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% if printer["dual_carriage"] is not defined %}
{% set toolhead = 0 %}
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Unloading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead != 0 and toolhead != 1 %}
{action_raise_error("Please select toolhead! 0 = left, 1 = right toolhead")}
{% endif %}
{% endif %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
_LED_UNLOADING_FILAMENT TOOLHEAD={toolhead}
SAVE_GCODE_STATE NAME=cold_pull_state
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
RATOS_ECHO MSG="Heating T{toolhead} to {extrusion_temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={extrusion_temp}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={extrusion_temp} MAXIMUM={extrusion_temp + 2}
G4 P3000
RATOS_ECHO MSG="extruding..."
G92 E0
G1 E30 F300
G92 E0
RATOS_ECHO MSG="Heating T{toolhead} to {cold_pull_temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={cold_pull_temp}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={cold_pull_temp} MAXIMUM={cold_pull_temp + 2}
G4 P10000
RATOS_ECHO MSG="cold pull..."
FORCE_MOVE STEPPER={target_extruder} DISTANCE=-40 VELOCITY=5 ACCEL=100
RATOS_ECHO MSG="eject filament..."
FORCE_MOVE STEPPER={target_extruder} DISTANCE=-200 VELOCITY=20 ACCEL=500
RATOS_ECHO MSG="cooling down extruder..."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET=0
RESTORE_GCODE_STATE NAME=cold_pull_state
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD={toolhead}
CONSOLE_ECHO TITLE="Cold pull finished!" MSG="Please remove the filament from the PTFE tube and cut the end off. Do NOT try to load it again." TYPE="warning"
[gcode_macro _USER_START_PRINT_BEFORE_HOMING]
gcode =
[gcode_macro _USER_START_PRINT_AFTER_HEATING_BED]
gcode =
[gcode_macro _USER_START_PRINT_BED_MESH]
gcode =
[gcode_macro _USER_START_PRINT_PARK]
gcode =
[gcode_macro _USER_START_PRINT_AFTER_HEATING_EXTRUDER]
gcode =
[gcode_macro _USER_START_PRINT_HEAT_CHAMBER]
description = Uses the extruder sensor to wait for chamber temp. Override the _START_PRINT_HEAT_CHAMBER macro to implement heated chamber handling.
gcode =
{% set chamber_heater_bed_temp = printer["gcode_macro RatOS"].chamber_heater_bed_temp|default(115)|int %}
[gcode_macro _USER_END_PRINT_BEFORE_HEATERS_OFF]
gcode =
[gcode_macro _USER_END_PRINT_AFTER_HEATERS_OFF]
gcode =
[gcode_macro _USER_END_PRINT_PARK]
gcode =
[gcode_macro _USER_END_PRINT_FINISHED]
description = User hook for when the print is finished after gcode state has been restored.
gcode =
[gcode_macro _USER_START_PRINT]
gcode =
[gcode_macro _USER_END_START_PRINT]
gcode =
[gcode_macro _USER_START_FEATURE]
gcode =
[gcode_macro _USER_END_FEATURE]
gcode =
[gcode_macro ECHO_T_VARS]
description = Echo Toolhead variables to the console.
gcode =
{% set t = params.T|default(0) %}
RATOS_ECHO MSG="T{t} Variables"
{% for var, value in printer["gcode_macro T%s" % t].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro ECHO_RATOS_VARS]
description = Echo RatOS variables to the console.
gcode =
{% for var, value in printer["gcode_macro RatOS"].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[delayed_gcode RATOS_INIT]
initial_duration = 0.1
gcode =
_LED_STANDBY
CALCULATE_PRINTABLE_AREA
INITIAL_FRONTEND_UPDATE
_CHAMBER_FILTER_SANITY_CHECK
[delayed_gcode RATOS_LOGO]
initial_duration = 2
gcode =
HELLO_RATOS
[gcode_macro INITIAL_FRONTEND_UPDATE]
gcode =
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_error = printer["gcode_macro RatOS"].status_color_error|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_unknown}"'
{% endif %}
{% set t0_sensor = "undefined" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].filament_detected|lower == "true" %}
{% set t0_sensor = "detected" %}
{% else %}
{% set t0_sensor = "empty" %}
{% endif %}
{% else %}
{% set t0_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set t1_sensor = "undefined" %}
{% if printer["dual_carriage"] is defined and printer["filament_switch_sensor toolhead_filament_sensor_t1"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].filament_detected|lower == "true" %}
{% set t1_sensor = "detected" %}
{% else %}
{% set t1_sensor = "empty" %}
{% endif %}
{% else %}
{% set t1_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set svv = printer.save_variables.variables %}
{% if svv.t0_filament is defined and printer["gcode_macro T0"] is defined %}
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
{% if t0_sensor != "empty" %}
{% set t0_filament_type = svv.t0_filament[0]|default('')|string %}
{% set t0_filament_name = svv.t0_filament[1]|default('')|string %}
{% set t0_filament_temp = svv.t0_filament[2]|default(0)|float %}
{% if t0_filament_name != '' and t0_filament_type != '' and t0_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{t0_filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{t0_filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={t0_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
{% if svv.t1_filament is defined and printer["gcode_macro T1"] is defined %}
{% if printer["gcode_macro T1"].filament_name is defined and printer["gcode_macro T1"].filament_type is defined and printer["gcode_macro T1"].filament_temp is defined %}
{% if t1_sensor != "empty" %}
{% set t1_filament_type = svv.t1_filament[0]|default('')|string %}
{% set t1_filament_name = svv.t1_filament[1]|default('')|string %}
{% set t1_filament_temp = svv.t1_filament[2]|default(0)|float %}
{% if t1_filament_name != '' and t1_filament_type != '' and t1_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='"{t1_filament_name}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='"{t1_filament_type}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE={t1_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t1_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro CALCULATE_PRINTABLE_AREA]
gcode =
{% set bed_margin_x = printer["gcode_macro RatOS"].bed_margin_x %}
{% set bed_margin_y = printer["gcode_macro RatOS"].bed_margin_y %}
{% set tool = 0 if printer["gcode_macro T0"] is not defined or printer["gcode_macro T0"].active else 1 %}
{% set max_x = printer.toolhead.axis_maximum.x if printer["dual_carriage"] is defined and tool == 0 else printer.toolhead.axis_maximum.x - bed_margin_x[1] %}
{% if printer["dual_carriage"] is defined %}
{% set max_x = printer.toolhead.axis_maximum.x %}
{% endif %}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="printer.toolhead.axis_maximum.x {printer.toolhead.axis_maximum.x}"
{% set max_y = printer.toolhead.axis_maximum.y - bed_margin_y[1]%}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_x_max VALUE={max_x}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_y_max VALUE={max_y}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="Printable area calculated: X: 0,{max_x} Y: 0,{max_y}"
[gcode_macro CACHE_TOOLHEAD_SETTINGS]
variable_cache = {"global": {"accel": 1000, "ratio": 0.5, "speed": 50, "scv": 5}}
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set dummy = cache.__setitem__(key, {"accel": printer.toolhead.max_accel, "ratio": printer.toolhead.minimum_cruise_ratio, "speed": printer.toolhead.max_velocity, "scv": printer.toolhead.square_corner_velocity}) %}
SET_GCODE_VARIABLE MACRO=CACHE_TOOLHEAD_SETTINGS VARIABLE=cache VALUE="{cache | pprint | replace("\n", "") | replace("\"", "\\\"")}"
DEBUG_ECHO PREFIX="CACHE_TOOLHEAD_SETTINGS" MSG="Toolhead settings cached for {key}. {printer.toolhead.max_accel} accel, {printer.toolhead.minimum_cruise_ratio} ratio, {printer.toolhead.max_velocity} velocity, {printer.toolhead.square_corner_velocity} scv."
[gcode_macro RESTORE_TOOLHEAD_SETTINGS]
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set values = printer["gcode_macro CACHE_TOOLHEAD_SETTINGS"].cache.__getitem__(key) %}
{% if values is not defined or values == 'None' %}
{ action_raise_error("RESTORE_TOOLHEAD_SETTINGS: Toolhead settings not cached for key '" ~ key ~ "'.") }
{% endif %}
SET_VELOCITY_LIMIT ACCEL={values.accel} MINIMUM_CRUISE_RATIO={values.ratio} VELOCITY={values.speed} SQUARE_CORNER_VELOCITY={values.scv}
DEBUG_ECHO PREFIX="RESTORE_TOOLHEAD_SETTINGS" MSG="Toolhead settings restored. {values.accel} accel, {values.ratio} ratio, {values.speed} velocity, {values.scv} scv."
[gcode_macro SET_MACRO_TRAVEL_SETTINGS]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set accel = printer["gcode_macro RatOS"].macro_travel_accel %}
SET_VELOCITY_LIMIT ACCEL={accel} MINIMUM_CRUISE_RATIO=0.5 VELOCITY={speed} SQUARE_CORNER_VELOCITY={5}
DEBUG_ECHO PREFIX="SET_MACRO_TRAVEL_SETTINGS" MSG="Macro travel settings set. {accel} accel, {speed} velocity"
[gcode_macro SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% if printer["dual_carriage"] is not defined %}
SET_KINEMATIC_POSITION X={printable_x_max / 2} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
{% else %}
IDEX_SET_CENTER_KINEMATIC_POSITION
{% endif %}
[gcode_macro IDEX_SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set center_x = printable_x_max / 2 %}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x - (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x + (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
[gcode_macro VERIFY_HYBRID_INVERTED]
gcode =
{% set inverted = False %}
{% if printer.configfile.settings.ratos_hybrid_corexy is defined and printer.configfile.settings.ratos_hybrid_corexy.inverted is defined %}
{% if printer.configfile.settings.ratos_hybrid_corexy.inverted|lower == 'true' %}
{% set inverted = True %}
{% endif %}
{% endif %}
{% if inverted == False %}
{ action_emergency_stop("ratos_hybrid_corexy NOT INVERTED! Inverted hybrid core-xy bugfix not detected.") }
{% endif %}
[gcode_macro RATOS_ECHO]
gcode =
{% set prefix = "RatOS" %}
{% set debug = params.DEBUG|default(0)|int %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " | " ~ params.PREFIX %}
{% endif %}
{% set prefix = prefix ~ ":" %}
{% set msg = "" %}
{% if params.MSG is defined %}
{% set msg = params.MSG %}
{% else %}
{% set msg = "No msg parameter provided (this is a bug or unintended use)." %}
{% endif %}
{% if not debug %}
M117 {prefix} {msg}
{% endif %}
RATOS_LOG PREFIX="{prefix}" MSG="{msg}"
{% if not debug %}
RESPOND PREFIX="{prefix}" MSG="{msg}"
{% else %}
CONSOLE_ECHO TITLE="{prefix}" TYPE="debug" MSG="{msg}"
{% endif %}
[gcode_macro ENABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=True
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=prefix_filter VALUE="'{params.FILTER|default('')|lower}'"
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging enabled."
[gcode_macro DISABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=False
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging disabled."
[gcode_macro DEBUG_ECHO]
variable_enabled = False
variable_prefix_filter = ''
gcode =
{% set prefix = "DEBUG" %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " - " ~ params.PREFIX %}
{% endif %}
{% if enabled and (prefix_filter|lower == '' or prefix_filter|lower in params.PREFIX|lower) %}
RATOS_ECHO PREFIX="{prefix}" MSG="{params.MSG}" DEBUG=1
{% endif %}
[gcode_macro START_FEATURE]
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="Start {params.FEATURE} feature gcode"
{% set scv = printer.toolhead.square_corner_velocity|int|default(5) %}
{% set accel = printer.toolhead.max_accel|int|default(10000) %}
{% set ratio = printer.toolhead.minimum_cruise_ratio|float|default(0.5) %}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="scv" VALUE={scv}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="accel" VALUE={accel}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="ratio" VALUE={ratio}
_USER_START_FEATURE FEATURE="{params.FEATURE}"
[gcode_macro END_FEATURE]
variable_scv = 5
variable_accel = 10000
variable_ratio = 0.5
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="End {params.FEATURE} feature gcode"
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={scv} ACCEL={accel} MINIMUM_CRUISE_RATIO={ratio}
_USER_END_FEATURE FEATURE="{params.FEATURE}" SCV={scv} ACCEL={accel} RATIO={ratio}
[gcode_macro _ON_LAYER_CHANGE]
variable_layer_number = 0
description = INTERNAL USE ONLY. Call it from the slicers after layer change custom gcode
gcode =
{% set layer = params.LAYER|int %}
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE={layer}
SET_PRINT_STATS_INFO CURRENT_LAYER={layer}
[gcode_macro _LEARN_MORE_CALIBRATION]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/calibration" %}
{% set link_text = "RatOS Calibration Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_CHAMBER_FILTER]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter Control" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_FILAMENT]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/filaments" %}
{% set link_text = "RatOS Filament Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _CONSOLE_SAVE_CONFIG]
gcode =
M118 Click SAVE_CONFIG to save the settings to your printer.cfg.
[gcode_macro SAVE_Z_OFFSET]
gcode =
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SAVE_MULTIPLIER
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _LOAD_RATOS_SKEW_PROFILE]
gcode =
{% set ratos_skew_profile = printer["gcode_macro RatOS"].skew_profile|default("") %}
{% if ratos_skew_profile != "" %}
{% if printer.configfile.config["skew_correction %s" % ratos_skew_profile] is defined %}
SKEW_PROFILE LOAD={ratos_skew_profile}
GET_CURRENT_SKEW
{% else %}
{% set line_1 = '"Could not find skew profile %s!_N_Clearing skew correction."' % ratos_skew_profile %}
CONSOLE_ECHO TITLE="Missing skew profile!" TYPE="warning" MSG={line_1}
SET_SKEW CLEAR=1
{% endif %}
{% endif %}
[gcode_macro M601]
gcode =
PAUSE
[gcode_macro PAUSE]
description = Pauses the print
rename_existing = PAUSE_BASE
variable_extrude = 1.5
variable_retract = 1.5
variable_fan_speed = 0
variable_idex_mode = ""
variable_idex_toolhead = 0
variable_idex_toolhead_x = 0.0
variable_idex_toolhead_y = 0.0
variable_idex_toolhead_z = 0.0
gcode =
{% set runout_detected = true if params.RUNOUT|default(false)|lower == 'true' else false %}
_LED_PAUSE
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set idex_toolhead = 1 if idex_mode == 'primary' else 0 %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
SAVE_GCODE_STATE NAME=PAUSE_state
{% else %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_mode VALUE='"{idex_mode}"'
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead VALUE={idex_toolhead}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_x VALUE={printer.gcode_move.gcode_position.x|float}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_y VALUE={printer.gcode_move.gcode_position.y|float}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_z VALUE={printer.gcode_move.gcode_position.z|float}
DEBUG_ECHO PREFIX="PAUSE" MSG="idex_mode: {idex_mode}, idex_toolhead: {idex_toolhead}, idex_toolhead_x: {idex_toolhead_x}, idex_toolhead_y: {idex_toolhead_y}, idex_toolhead_z: {idex_toolhead_z}"
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
CACHE_TOOLHEAD_SETTINGS KEY="pause"
SET_MACRO_TRAVEL_SETTINGS
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set current_z = printer.toolhead.position.z|float %}
{% if current_z < (max_z - 20.0) %}
{% set z_safe = 20.0 %}
{% else %}
{% set z_safe = max_z - current_z %}
{% endif %}
PAUSE_BASE
{% if printer["dual_carriage"] is not defined %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan"].speed|float}
{% else %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t0"].speed|float}
{% else %}
{% if idex_toolhead == 0 %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t0"].speed|float}
{% else %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t1"].speed|float}
{% endif %}
{% endif %}
{% endif %}
M106 S0
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' else false %}
{% if idex_mode != '' %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' and printer['extruder1'].can_extrude|lower == 'true' else false %}
{% else %}
{% if printer.toolhead.extruder == 'extruder1' %}
{% set can_extrude = true if printer['extruder1'].can_extrude|lower == 'true' else false %}
{% endif %}
{% endif %}
{% endif %}
{% set R = printer["gcode_macro PAUSE"].retract|float %}
{% if can_extrude %}
G91
G1 E-{R} F2100
G90
{% else %}
{action_respond_info("Extruder not hot enough")}
{% endif %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set pause_print_park_x = printer["gcode_macro RatOS"].pause_print_park_x %}
{% set pause_print_park_in = printer["gcode_macro RatOS"].pause_print_park_in %}
{% if runout_detected %}
{% set pause_print_park_x = printer["gcode_macro RatOS"].runout_park_x %}
{% set pause_print_park_in = printer["gcode_macro RatOS"].runout_park_in %}
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
DEBUG_ECHO PREFIX="PAUSE" MSG="z_speed: {z_speed}, pause_print_park_x: {pause_print_park_x}, pause_print_park_in: {pause_print_park_in}, default_toolhead: {default_toolhead}"
{% if "xyz" in printer.toolhead.homed_axes %}
G91
G1 Z{z_safe} F{z_speed}
G90
{% if printer["dual_carriage"] is not defined %}
_PARK LOCATION={pause_print_park_in} X={pause_print_park_x}
{% else %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
_IDEX_SINGLE X={parking_position}
{% else %}
PARK_TOOLHEAD
{% endif %}
_PARK LOCATION={pause_print_park_in} X={pause_print_park_x}
{% endif %}
{% else %}
{action_respond_info("Printer not homed")}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="pause"
[gcode_macro RESUME]
description = Resumes the print if the printer is paused.
rename_existing = RESUME_BASE
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set target_idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set target_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% endif %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' else false %}
{% if target_idex_mode != '' %}
{% if target_idex_mode == 'copy' or target_idex_mode == 'mirror' %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' and printer['extruder1'].can_extrude|lower == 'true' else false %}
{% else %}
{% if printer.toolhead.extruder == 'extruder1' %}
{% set can_extrude = true if printer['extruder1'].can_extrude|lower == 'true' else false %}
{% endif %}
{% endif %}
{% endif %}
{% set fan_speed = printer["gcode_macro PAUSE"].fan_speed|float %}
{% if printer["dual_carriage"] is not defined %}
M106 S{(fan_speed * 255)}
{% else %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% else %}
{% if params.TOOLHEAD is defined %}
{% if params.TOOLHEAD == 0 %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
{% else %}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% endif %}
{% else %}
{% if printer["gcode_macro PAUSE"].idex_toolhead == 0 %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
{% else %}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% endif %}
{% endif %}
{% endif %}
M106.1 S{fan_speed}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if target_idex_mode == "copy" %}
_IDEX_COPY DANCE=0
{% elif target_idex_mode == "mirror" %}
_IDEX_MIRROR DANCE=0
{% else %}
{% if params.TOOLHEAD is defined %}
_SELECT_TOOL T={params.TOOLHEAD} X=-1 Y=-1 TOOLSHIFT=false
{% else %}
_SELECT_TOOL T={printer["gcode_macro PAUSE"].idex_toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% endif %}
{% set x = printer["gcode_macro PAUSE"].idex_toolhead_x|float %}
{% set y = printer["gcode_macro PAUSE"].idex_toolhead_y|float %}
{% set z = printer["gcode_macro PAUSE"].idex_toolhead_z|float %}
G1 X{x} Y{y} Z{z} F{speed}
{% if params.TOOLHEAD is defined %}
SAVE_GCODE_STATE NAME=PAUSE_STATE
{% endif %}
{% endif %}
{% if params.TOOLHEAD is not defined %}
{% set E = printer["gcode_macro PAUSE"].extrude|float %}
{% if can_extrude %}
G91
G1 E{E} F2100
G90
{% else %}
{action_respond_info("Extruder not hot enough")}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 MOVE_SPEED={speed}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=True
RESUME_BASE
_LED_PRINTING
[gcode_macro CANCEL_PRINT]
description = Cancels the printer
rename_existing = CANCEL_PRINT_BASE
gcode =
END_PRINT
TURN_OFF_HEATERS
CLEAR_PAUSE
CANCEL_PRINT_BASE
[gcode_macro START_PRINT]
description = Start print procedure, use this in your Slicer.
variable_post_processor_version = 2
variable_is_printing_gcode = False
variable_both_toolheads = True
variable_object_xoffset = 0
variable_first_x = -1
variable_first_y = -1
variable_total_toolshifts = 0
variable_initial_tool = 0
variable_extruder_first_layer_temp = ""
variable_extruder_other_layer_temp = ""
gcode =
{% if "xyz" in printer.toolhead.homed_axes and printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% if printer["gcode_macro _VAOC"].is_started|default(true)|lower == 'true' %}
_VAOC_END
{% endif %}
{% endif %}
_LED_START_PRINTING
CACHE_TOOLHEAD_SETTINGS KEY="start_print"
_USER_START_PRINT { rawparams }
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% set hotend_heat_soak_time = printer["gcode_macro RatOS"].hotend_heat_soak_time|default(0)|int %}
{% set z_probe_stowable = printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set X0 = params.X0|default(-1)|float %}
{% set X1 = params.X1|default(-1)|float %}
{% set Y0 = params.Y0|default(-1)|float %}
{% set Y1 = params.Y1|default(-1)|float %}
{% if first_x == -1 or first_y == -1 %}
{% set first_x = params.FIRST_X|default(-1)|float %}
{% set first_y = params.FIRST_Y|default(-1)|float %}
{% endif %}
{% set total_toolshifts = params.TOTAL_TOOLSHIFTS|default(0)|int %}
{% set initial_tool = params.INITIAL_TOOL|default(default_toolhead)|int %}
{% set start_chamber_temp = params.START_CHAMBER_TEMP|default(0)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set bed_temp = params.BED_TEMP|default(printer.heater_bed.target, true)|float %}
{% set total_layer_count = params.TOTAL_LAYER_COUNT|default(0)|int %}
{% set extruder_first_layer_temp = (params.EXTRUDER_TEMP|default("")).split(",") %}
RATOS_ECHO MSG="First print coordinates X:{first_x} Y:{first_y}"
{% if params.TOTAL_LAYER_COUNT is not defined %}
{% set link_url = "https://os.ratrig.com/docs/slicers" %}
{% set link_text = "RatOS Slicer Configuration" %}
{% set line_1 = '"Your slicer gcode settings are not up to date._N_Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="Incomplete Slicer Configuration detected" TYPE="warning" MSG={line_1}
{% endif %}
SET_PRINT_STATS_INFO CURRENT_LAYER=1
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE=1
{% if total_layer_count > 0 %}
SET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set swap_toolheads = true if printer["gcode_macro _IDEX_REMAP_TOOLHEADS"].enabled|default(false)|lower == 'true' else false %}
{% if swap_toolheads %}
{% set initial_tool = 0 if initial_tool == 1 else 1 %}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=active VALUE=True
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=active VALUE=True
{% endif %}
{% set both_toolheads = true %}
{% if total_toolshifts == 0 %}
{% set both_toolheads = false %}
{% endif %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
_IDEX_SINGLE X={parking_position}
{% endif %}
{% if both_toolheads and (idex_mode == "copy" or idex_mode == "mirror") %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Gcode tool changes found. Copy and mirror mode do not support toolchanges.")}
{% endif %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set both_toolheads = true %}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=initial_tool VALUE={initial_tool}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=first_x VALUE={first_x}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=first_y VALUE={first_y}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=total_toolshifts VALUE={total_toolshifts}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=both_toolheads VALUE={both_toolheads}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_first_layer_temp VALUE="'{params.EXTRUDER_TEMP}'"
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_other_layer_temp VALUE="'{params.EXTRUDER_OTHER_LAYER_TEMP}'"
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=_TOOLCHANGE VARIABLE=toolshift_count VALUE=0
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set svv = printer.save_variables.variables %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set parking_position_t0 = printer["gcode_macro T0"].parking_position|float %}
{% set parking_position_t1 = printer["gcode_macro T1"].parking_position|float %}
{% set stepper_x_position_min = printer.configfile.settings.stepper_x.position_min|float %}
{% set stepper_x_position_endstop = printer.configfile.settings.stepper_x.position_endstop|float %}
{% set dual_carriage_position_max = printer.configfile.settings.dual_carriage.position_max|float %}
{% set dual_carriage_position_endstop = printer.configfile.settings.dual_carriage.position_endstop|float %}
{% set x_parking_space = parking_position_t0 - (stepper_x_position_endstop , stepper_x_position_min)|max %}
{% set dc_parking_space = (dual_carriage_position_endstop , dual_carriage_position_max)|min - parking_position_t1 %}
{% if svv.idex_xoffset|abs >= (x_parking_space - 0.5) or svv.idex_xoffset|abs >= (dc_parking_space - 0.5) %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Toolhead x-offset is too high for the available parking space. Calibrate your X and DC endstop positions and make sure you stay below 1mm." % (copy_mode_max_width)) }
{% endif %}
{% endif %}
{% if (idex_mode == "copy" or idex_mode == "mirror") and printer.configfile.settings.ratos.enable_gcode_transform %}
{% if params.MIN_X is not defined or params.MAX_X is not defined %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Something went wrong! Missing important post processor start print parameter!") }
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=object_xoffset VALUE=0
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set boundary_box_min_x = params.MIN_X|default(0)|float %}
{% set boundary_box_max_x = params.MAX_X|default(printable_x_max)|float %}
{% set svv = printer.save_variables.variables %}
{% if default_toolhead == 0 %}
{% set boundary_box_max_x = boundary_box_max_x + svv.idex_xoffset %}
{% else %}
{% set boundary_box_min_x = boundary_box_min_x - svv.idex_xoffset %}
{% endif %}
{% set center_x = printable_x_max / 2.0 %}
{% set safe_distance = printer.configfile.settings.dual_carriage.safe_distance|float %}
{% set object_width = boundary_box_max_x - boundary_box_min_x %}
{% set copy_mode_max_width = center_x %}
{% set mirror_mode_max_width = center_x - safe_distance / 2.0 %}
DEBUG_ECHO PREFIX="START_PRINT" MSG="OBJECT_WIDTH: {object_width} BOUNDARY_BOX_MIN_X: {boundary_box_min_x} BOUNDARY_BOX_MAX_X: {boundary_box_max_x} CENTER_X: {center_x} SAFE_DISTANCE: {safe_distance}"
{% if idex_mode == "copy" and object_width > copy_mode_max_width %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Object is too big for copy mode! Max supported width is %s mm" % (copy_mode_max_width)) }
{% endif %}
{% if idex_mode == "mirror" and object_width > mirror_mode_max_width %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Object is too big for mirror mode! Max supported width is %s mm" % (mirror_mode_max_width)) }
{% endif %}
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
{% set object_xoffset = (printable_x_max - boundary_box_max_x - boundary_box_min_x) / 2 %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=object_xoffset VALUE={object_xoffset}
{% endif %}
{% endif %}
{% set has_initial_toolhead_filament_sensor = true if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool] is defined else false %}
{% if has_initial_toolhead_filament_sensor %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s filament sensor is empty." % (initial_tool)) }
{% endif %}
{% endif %}
{% endif %}
{% set has_initial_bowden_filament_sensor = true if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool] is defined else false %}
{% if has_initial_bowden_filament_sensor %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool].enabled|lower == "true" %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s bowden sensor is empty." % (initial_tool)) }
{% endif %}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined and both_toolheads %}
{% set has_secondary_toolhead_filament_sensor = true if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)] is defined else false %}
{% if has_secondary_toolhead_filament_sensor %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s filament sensor is empty." % (1 if initial_tool == 0 else 0)) }
{% endif %}
{% endif %}
{% endif %}
{% set has_secondary_bowden_filament_sensor = true if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)] is defined else false %}
{% if has_secondary_bowden_filament_sensor %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].enabled|lower == "true" %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s bowden sensor is empty." % (1 if initial_tool == 0 else 0)) }
{% endif %}
{% endif %}
{% endif %}
{% endif %}
_CHAMBER_FILTER_ON AT="before_print_start"
{% if printer["dual_carriage"] is defined %}
{% if printer["gcode_macro _IDEX_JOIN_SPOOLS"].enabled|default(false)|lower == 'true' %}
{% if both_toolheads %}
RATOS_ECHO MSG="Spool join is not possible if both toolheads are in use!"
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% endif %}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if idex_mode == '' %}
_SET_TOOLHEAD_OFFSET T={default_toolhead} MOVE={1 if "xyz" in printer.toolhead.homed_axes else 0}
{% endif %}
{% endif %}
CLEAR_PAUSE
{% if printer["gcode_macro RatOS"].force_absolute_position|lower == 'true' %}
G90
{% endif %}
SAVE_GCODE_STATE NAME=start_print_state
G21
G90
M82
_USER_START_PRINT_BEFORE_HOMING { rawparams }
{% if z_probe_stowable == true %}
STOWABLE_PROBE_BEGIN_BATCH
{% endif %}
MAYBE_HOME
_Z_HOP
{% if idex_mode != '' and not (printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
PARK_TOOLHEAD
{% endif %}
{% if chamber_temp > 0 %}
{% if printer["fan_generic filter"] is defined %}
{% if printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float > 0 %}
SET_FAN_SPEED FAN=filter SPEED={printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float}
{% endif %}
{% endif %}
_CHAMBER_HEATER_ON START_CHAMBER_TEMP={start_chamber_temp} CHAMBER_TEMP={chamber_temp}
_USER_START_PRINT_HEAT_CHAMBER { rawparams } CHAMBER_TEMP={chamber_temp}
{% endif %}
_START_PRINT_BEFORE_HEATING_BED T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
RATOS_ECHO MSG="Heating bed..."
M190 S{bed_temp}
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
_USER_START_PRINT_AFTER_HEATING_BED { rawparams }
_START_PRINT_AFTER_HEATING_BED T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
_USER_START_PRINT_BED_MESH { rawparams } X0={X0} X1={X1} Y0={Y0} Y1={Y1}
_START_PRINT_BED_MESH X0={X0} X1={X1} Y0={Y0} Y1={Y1} T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
{% if z_probe_stowable == true %}
STOWABLE_PROBE_END_BATCH
{% endif %}
{% if idex_mode == '' %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={extruder_first_layer_temp[0]|float}
{% else %}
{% if initial_tool == 0 or both_toolheads or (default_toolhead == 0 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={extruder_first_layer_temp[0]|float}
{% endif %}
{% if initial_tool == 1 or both_toolheads or (default_toolhead == 1 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
SET_HEATER_TEMPERATURE HEATER="extruder1" TARGET={extruder_first_layer_temp[1]|float}
{% endif %}
{% endif %}
_USER_START_PRINT_PARK { rawparams }
_START_PRINT_PARK
RATOS_ECHO MSG="Heating Extruder..."
{% if idex_mode == '' %}
TEMPERATURE_WAIT SENSOR="extruder" MINIMUM={extruder_first_layer_temp[0]|float} MAXIMUM={extruder_first_layer_temp[0]|float + 5}
{% else %}
{% if initial_tool == 0 or both_toolheads or (default_toolhead == 0 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
TEMPERATURE_WAIT SENSOR="extruder" MINIMUM={extruder_first_layer_temp[0]|float} MAXIMUM={extruder_first_layer_temp[0]|float + 5}
{% endif %}
{% if initial_tool == 1 or both_toolheads or (default_toolhead == 1 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
TEMPERATURE_WAIT SENSOR="extruder1" MINIMUM={extruder_first_layer_temp[1]|float} MAXIMUM={extruder_first_layer_temp[1]|float + 5}
{% endif %}
{% endif %}
{% if hotend_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking hotend for {hotend_heat_soak_time} seconds..."
G4 P{(hotend_heat_soak_time * 1000)}
{% endif %}
{% if idex_mode == '' %}
_LED_PRINTING
{% else %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
_LED_PRINTING
{% else %}
{% if both_toolheads %}
_LED_PRINTING TOOLHEAD={initial_tool}
{% if toolchange_standby_temp > -1 %}
_LED_TOOLHEAD_STANDBY TOOLHEAD={0 if initial_tool == 1 else 1}
{% else %}
_LED_PRINTING TOOLHEAD={0 if initial_tool == 1 else 1}
{% endif %}
{% else %}
_LED_PRINTING TOOLHEAD={initial_tool}
_LED_DEACTIVATE_TOOLHEAD TOOLHEAD={0 if initial_tool == 1 else 1}
{% endif %}
{% endif %}
{% endif %}
_USER_START_PRINT_AFTER_HEATING_EXTRUDER { rawparams } X0={X0} X1={X1} Y0={Y0} Y1={Y1}
_START_PRINT_AFTER_HEATING_EXTRUDER X0={X0} X1={X1} Y0={Y0} Y1={Y1} INITIAL_TOOLHEAD={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
{% if idex_mode != '' %}
{% if not both_toolheads %}
{% if initial_tool != default_toolhead %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
{% endif %}
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
{% if toolchange_standby_temp > -1 %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if initial_tool == 1 else 'extruder1'} TARGET={toolchange_standby_temp}
{% endif %}
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% set x_offset = printer.toolhead.position.x|float - printer.gcode_move.gcode_position.x|float %}
{% endif %}
RESTORE_GCODE_STATE NAME=start_print_state
{% if idex_mode != '' %}
{% set act_idex_mode = printer["dual_carriage"].carriage_1|default('')|lower %}
{% if act_idex_mode == "copy" or act_idex_mode == "mirror" %}
SET_GCODE_OFFSET X={x_offset} MOVE=0
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% if idex_mode == "copy" and idex_mode != act_idex_mode %}
_IDEX_COPY DANCE=0
{% elif idex_mode == "mirror" and idex_mode != act_idex_mode %}
_IDEX_MIRROR DANCE=0
{% endif %}
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
RATOS_ECHO MSG="Adjusting object x-offset by {(object_xoffset)} mm"
SET_GCODE_OFFSET X_ADJUST={object_xoffset} MOVE=0
{% endif %}
{% else %}
_SELECT_TOOL T={initial_tool} TOOLSHIFT=false
{% if initial_tool != default_toolhead %}
{% set svv = printer.save_variables.variables %}
SAVE_VARIABLE VARIABLE=idex_applied_offset VALUE={default_toolhead}
_SET_TOOLHEAD_OFFSET T={initial_tool} MOVE=0
{% endif %}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
_BEACON_SET_NOZZLE_TEMP_OFFSET TOOLHEAD={initial_tool}
{% endif %}
_SET_EXTRUSION_MODE
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=True
{% if printer["gcode_macro _SELECT_TOOL"] is defined %}
SET_GCODE_VARIABLE MACRO=_SELECT_TOOL VARIABLE=last_timestamp VALUE={printer["print_stats"].print_duration}
{% endif %}
_USER_END_START_PRINT { rawparams }
G92 E0
_CHAMBER_FILTER_ON AT="after_print_start"
RATOS_ECHO MSG="Printing..."
[gcode_macro _START_PRINT_BEFORE_HEATING_BED]
gcode =
{% set target_idex_mode = params.IDEX_MODE|default("")|lower %}
{% set initial_toolhead = params.T|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %}
{% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% set act_t = 1 if idex_mode == 'primary' else 0 %}
{% set auto_z_offset_calibration = False %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% set is_fixed = true if printer["gcode_macro _VAOC"].is_fixed|default(true)|lower == 'true' else false %}
{% if printer["gcode_macro _VAOC"].auto_z_offset_calibration|default("false")|lower == 'true' and is_fixed %}
{% if target_idex_mode != "copy" and target_idex_mode != "mirror" %}
{% if both_toolheads or initial_toolhead != default_toolhead %}
{% set auto_z_offset_calibration = True %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set is_stowable_probe = true if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' else false %}
{% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %}
RATOS_ECHO MSG="Pre-heating extruder..."
{% if printer["dual_carriage"] is defined %}
{% if auto_z_offset_calibration %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={min_temp}
SET_HEATER_TEMPERATURE HEATER="extruder1" TARGET={min_temp}
{% else %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET={min_temp}
{% endif %}
{% else %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={min_temp}
{% endif %}
{% endif %}
{% if not is_stowable_probe %}
{% if printer["dual_carriage"] is defined and act_t != default_toolhead %}
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=True
{% endif %}
RATOS_ECHO MSG="Heat soaking z probe..."
{% if auto_z_offset_calibration %}
{% set safe_distance = printer.configfile.settings.dual_carriage.safe_distance|float %}
{% if default_toolhead == 0 %}
_SELECT_TOOL T=0 TOOLSHIFT=false
G1 X{safe_home_x - safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
G1 X{safe_home_x + safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
{% elif default_toolhead == 1 %}
_SELECT_TOOL T=1 TOOLSHIFT=false
G1 X{safe_home_x + safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
G1 X{safe_home_x - safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
{% endif %}
{% else %}
_MOVE_TO_SAFE_Z_HOME
{% endif %}
G0 Z2 F{z_speed}
{% endif %}
[gcode_macro _START_PRINT_AFTER_HEATING_BED]
gcode =
{% set target_idex_mode = params.IDEX_MODE|default("")|lower %}
{% set initial_toolhead = params.T|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %}
{% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set auto_z_offset_calibration = False %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% set is_fixed = true if printer["gcode_macro _VAOC"].is_fixed|default(true)|lower == 'true' else false %}
{% if printer["gcode_macro _VAOC"].auto_z_offset_calibration|default("false")|lower == 'true' and is_fixed %}
{% if target_idex_mode != "copy" and target_idex_mode != "mirror" %}
{% if both_toolheads or initial_toolhead != default_toolhead %}
{% set auto_z_offset_calibration = True %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_wipe_before_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_wipe_before_true_zero|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %}
RATOS_ECHO MSG="Waiting for extruder to be preheated..."
{% if printer["dual_carriage"] is defined %}
{% if auto_z_offset_calibration %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
TEMPERATURE_WAIT SENSOR=extruder1 MINIMUM={min_temp} MAXIMUM={max_temp}
{% else %}
{% if default_toolhead == 0 %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
{% else %}
TEMPERATURE_WAIT SENSOR=extruder1 MINIMUM={min_temp} MAXIMUM={max_temp}
{% endif %}
{% endif %}
{% else %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_Z_HOP
{% endif %}
{% if auto_z_offset_calibration %}
{% set parking_position_t0 = printer["gcode_macro T0"].parking_position|float %}
{% set parking_position_t1 = printer["gcode_macro T1"].parking_position|float %}
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=True
PARK_TOOLHEAD
_CLEANING_MOVE TOOLHEAD={default_toolhead}
_SELECT_TOOL T={0 if default_toolhead == 1 else 1} X={parking_position_t0 if default_toolhead == 1 else parking_position_t1} Y=0 TOOLSHIFT=false
_CLEANING_MOVE TOOLHEAD={0 if default_toolhead == 1 else 1}
_VAOC_CALIBRATE_Z_OFFSET AUTO_Z_OFFSET=True
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=false
{% endif %}
{% set needs_rehoming = False %}
{% if printer.z_tilt is defined and not printer.z_tilt.applied %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% set needs_rehoming = True %}
{% endif %}
{% if printer.quad_gantry_level is defined and not printer.quad_gantry_level.applied %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% set needs_rehoming = True %}
{% endif %}
{% if needs_rehoming %}
G28 Z
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero %}
{% if beacon_contact_wipe_before_true_zero %}
_START_PRINT_AFTER_HEATING_BED_PROBE_FOR_WIPE
{% endif %}
_START_PRINT_AFTER_HEATING_CONTACT_WITH_OPTIONAL_WIPE
{% endif %}
[gcode_macro _START_PRINT_AFTER_HEATING_BED_PROBE_FOR_WIPE]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
G0 Z5 F{z_speed}
G0 X50 Y10 F{speed}
PROBE PROBE_METHOD=contact SAMPLES=1
BEACON_QUERY
[gcode_macro _START_PRINT_AFTER_HEATING_CONTACT_WITH_OPTIONAL_WIPE]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_true_zero_location = printer["gcode_macro RatOS"].beacon_contact_true_zero_location|default("front")|lower %}
{% set beacon_contact_true_zero_margin_x = printer["gcode_macro RatOS"].beacon_contact_true_zero_margin_x|default(30)|int %}
{% set beacon_contact_wipe_before_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_wipe_before_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_wipe_before_true_zero %}
{% if printer.beacon.last_probe_result|lower == "ok" %}
{% set last_z_offset = printer.beacon.last_z_result %}
RATOS_ECHO MSG="Auto calibration nozzle wipe with probe result {last_z_offset}..."
G0 Z{(0.2 + last_z_offset)} F{z_speed}
G0 X70 F300
{% else %}
RATOS_ECHO MSG="Skipping auto calibration nozzle wipe because probing failed!"
{% endif %}
{% endif %}
G0 Z5 F{z_speed}
_MOVE_TO_SAFE_Z_HOME
RATOS_ECHO MSG="Heating extruder to probing temperature..."
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET={beacon_contact_true_zero_temp}
TEMPERATURE_WAIT SENSOR={"extruder" if default_toolhead == 0 else "extruder1"} MINIMUM={beacon_contact_true_zero_temp} MAXIMUM={beacon_contact_true_zero_temp + 5}
RATOS_ECHO MSG="Beacon contact auto calibration..."
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
G0 Z5 F{z_speed}
[gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER]
gcode =
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set first_x = printer["gcode_macro START_PRINT"].first_x|default(-1)|float %}
{% set first_y = printer["gcode_macro START_PRINT"].first_y|default(-1)|float %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set center_x = printable_x_max / 2.0 %}
{% set center_y = printable_y_max / 2.0 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% if printer["dual_carriage"] is defined %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
{% endif %}
{% set X0 = params.X0|default(-1)|int %}
{% set X1 = params.X1|default(-1)|int %}
{% set Y0 = params.Y0|default(-1)|int %}
{% set Y1 = params.Y1|default(-1)|int %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set initial_toolhead = params.INITIAL_TOOLHEAD|default(default_toolhead)|int %}
{% if idex_mode == '' %}
_PRIME
{% else %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
RATOS_ECHO PREFIX="IDEX" MSG="using combined prime offset for IDEX {idex_mode} mode"
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% else %}
{% if both_toolheads %}
{% if initial_toolhead == 0 %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T1"
_SELECT_TOOL T=1 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T0"
_SELECT_TOOL T=0 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% else %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T0"
_SELECT_TOOL T=0 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T1"
_SELECT_TOOL T=1 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% endif %}
{% else %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T{initial_toolhead}"
_SELECT_TOOL T={initial_toolhead} TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% endif %}
{% endif %}
{% endif %}
CACHE_TOOLHEAD_SETTINGS KEY="start_print_after_heating_extruder"
SET_MACRO_TRAVEL_SETTINGS
{% if (X0 > -1 and Y1 > -1) or (first_x > 0 and first_y > 0) %}
{% if printer["dual_carriage"] is defined %}
{% set acceleration = printer["gcode_macro RatOS"].toolchange_travel_accel %}
{% set max_accel = printer.toolhead.max_accel|float %}
{% set square_corner_velocity = printer.toolhead.square_corner_velocity|float %}
SET_VELOCITY_LIMIT ACCEL={acceleration} MINIMUM_CRUISE_RATIO=0 SQUARE_CORNER_VELOCITY=20
{% endif %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
G0 Z3 F{z_speed}
{% endif %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro RatOS"].nozzle_priming|lower == 'false' %}
{% set first_z = 1 %}
{% else %}
{% set first_z = 3 %}
{% endif %}
{% if idex_mode == "mirror" %}
{% if first_y >= 0 %}
G0 Y{first_y} F{speed}
{% else %}
G0 Y{Y1} F{speed}
{% endif %}
{% endif %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro RatOS"].nozzle_priming|lower == 'false' %}
_MOVE_TO_LOADING_POSITION TOOLHEAD={initial_toolhead}
_PURGE_FILAMENT TOOLHEAD={initial_toolhead} E={printer["gcode_macro RatOS"].toolchange_first_purge|default(50)|float}
_CLEANING_MOVE TOOLHEAD={initial_toolhead}
{% endif %}
{% if first_x >= 0 and first_y >= 0 %}
G0 X{first_x} Y{first_y} Z{first_z} F{speed}
{% else %}
{% set first_x = X0 %}
{% set first_y = Y0 %}
{% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' or printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %}
{% set first_x = X0 %}
{% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %}
{% set first_x = X1 %}
{% else %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_x|float <= center_x %}
{% set first_x = X0 %}
{% else %}
{% set first_x = X1 %}
{% endif %}
{% endif %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %}
{% set first_y = Y0 %}
{% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %}
{% set first_y = Y1 %}
{% else %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_y|float <= center_y %}
{% set first_y = Y0 %}
{% else %}
{% set first_y = Y1 %}
{% endif %}
{% endif %}
{% endif %}
G0 X{first_x} Y{first_y} Z{first_z} F{speed}
{% endif %}
{% endif %}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print_after_heating_extruder"
_LOAD_RATOS_SKEW_PROFILE
[gcode_macro _PRIME]
gcode =
{% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' or printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %}
PRIME_BLOB INITIAL_TOOLHEAD={params.INITIAL_TOOLHEAD} BOTH_TOOLHEADS={params.BOTH_TOOLHEADS} IDEX_MODE={params.IDEX_MODE} Y1={params.Y1}
{% endif %}
[gcode_macro END_PRINT]
description = End print procedure, use this in your Slicer.
gcode =
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
SAVE_GCODE_STATE NAME=end_print_state
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=_IDEX_REMAP_TOOLHEADS VARIABLE=enabled VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
{% set object_xoffset = printer["gcode_macro START_PRINT"].object_xoffset|default(0)|float %}
RATOS_ECHO MSG="Adjusting object x-offset by {(0-object_xoffset)} mm"
SET_GCODE_OFFSET X_ADJUST={(0-object_xoffset)}
{% endif %}
{% endif %}
_USER_END_PRINT_BEFORE_HEATERS_OFF { rawparams }
_END_PRINT_BEFORE_HEATERS_OFF
TURN_OFF_HEATERS
_USER_END_PRINT_AFTER_HEATERS_OFF { rawparams }
_END_PRINT_AFTER_HEATERS_OFF
_USER_END_PRINT_PARK { rawparams }
_END_PRINT_PARK
{% if printer["gcode_macro RatOS"].skew_profile is defined %}
SET_SKEW CLEAR=1
{% endif %}
{% if printer["dual_carriage"] is not defined and printer["gcode_macro RatOS"].end_print_motors_off|lower != 'false' %}
M84
{% endif %}
M107
BED_MESH_CLEAR
RATOS_ECHO MSG="Done :)"
RESTORE_GCODE_STATE NAME=end_print_state
{% if printer["dual_carriage"] is defined %}
M84
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
{% if printer["dual_carriage"] is not defined %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
SET_GCODE_OFFSET Z=0 MOVE=0
{% endif %}
{% endif %}
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print"
_CHAMBER_FILTER_ON AT="print_end"
_CHAMBER_FILTER_OFF
_CHAMBER_HEATER_OFF
_USER_END_PRINT_FINISHED { rawparams }
[gcode_macro _END_PRINT_BEFORE_HEATERS_OFF]
gcode =
RATOS_ECHO MSG="Cleaning up..."
[gcode_macro _END_PRINT_AFTER_HEATERS_OFF]
gcode =
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set current_z = printer.toolhead.position.z|float %}
{% set z_hop = printer["gcode_macro RatOS"].end_print_park_z_hop|float %}
{% set r = printer["gcode_macro RatOS"].end_print_retract_filament|default(4)|float %}
{% if current_z < (max_z - z_hop) %}
{% set z_safe = z_hop %}
{% else %}
{% set z_safe = max_z - current_z %}
{% endif %}
G91
G1 E-2 F3600
G0 Z{z_safe} F3600
G1 E-{(r-2)} F3600
G90
[gcode_macro _SET_EXTRUSION_MODE]
gcode =
{% if printer["gcode_macro RatOS"].relative_extrusion|lower == 'true' %}
M83
{% else %}
M82
{% endif %}
[gcode_macro GENERATE_SHAPER_GRAPHS]
description = Genarates input shaper resonances graphs for analysis. Uses the AXIS parameter for if you only want to do one axis at a time, (eg. GENERATE_SHAPER_GRAPHS AXIS=X)
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="generate_shaper_graphs"
SET_MACRO_TRAVEL_SETTINGS
CACHE_IS_GRAPH_FILES
_LED_INPUT_SHAPER_START
{% set axis = params.AXIS|default('')|lower %}
{% set freq_start = params.FREQUENCY_START|default(10)|int %}
{% set freq_end = params.FREQUENCY_END|default(133)|int %}
{% set hz_per_sec = params.HZ_PER_SEC|default(1)|float %}
{% if axis != '' %}
{% if axis == 'x' %}
MAYBE_HOME
TEST_RESONANCES AXIS=X FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_x
{% elif axis == 'y' %}
MAYBE_HOME
TEST_RESONANCES AXIS=Y FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_y
{% else %}
{action_raise_error("Unknown axis specified. Expected X or Y.")}
{% endif %}
{% else %}
MAYBE_HOME
TEST_RESONANCES AXIS=X FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
TEST_RESONANCES AXIS=Y FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_x
RUN_SHELL_COMMAND CMD=generate_shaper_graph_y
{% endif %}
_LED_INPUT_SHAPER_END
RESTORE_TOOLHEAD_SETTINGS KEY="generate_shaper_graphs"
_LEARN_MORE_CALIBRATION
SHOW_IS_GRAPH_FILES TITLE="Shaper graph"
[gcode_shell_command generate_shaper_graph_x]
command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-x.sh
timeout = 60.
verbose = True
[gcode_shell_command generate_shaper_graph_y]
command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-y.sh
timeout = 60.
verbose = True
[gcode_macro MEASURE_COREXY_BELT_TENSION]
description = Generates resonance graph used to ensure belts are equally tensioned.
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="measure_corexy_belt_tension"
SET_MACRO_TRAVEL_SETTINGS
CACHE_IS_GRAPH_FILES
_LED_INPUT_SHAPER_START
{% set freq_start = params.FREQUENCY_START|default(10)|int %}
{% set freq_end = params.FREQUENCY_END|default(133)|int %}
{% set hz_per_sec = params.HZ_PER_SEC|default(1)|float %}
MAYBE_HOME
TEST_RESONANCES AXIS=1,1 OUTPUT=raw_data NAME=belt-tension-upper FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
TEST_RESONANCES AXIS=1,-1 OUTPUT=raw_data NAME=belt-tension-lower FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_belt_tension_graph
_LED_INPUT_SHAPER_END
RESTORE_TOOLHEAD_SETTINGS KEY="measure_corexy_belt_tension"
_LEARN_MORE_CALIBRATION
SHOW_IS_GRAPH_FILES TITLE="Belt Tension Graph"
[gcode_shell_command generate_belt_tension_graph]
command = /home/pi/printer_data/config/RatOS/scripts/generate-belt-tension-graph.sh
timeout = 90.
verbose = True
[idle_timeout]
gcode =
{% if printer.webhooks.state|lower == 'ready' %}
{% if printer.pause_resume.is_paused|lower == 'false' %}
RATOS_ECHO PREFIX="IDLE" MSG="2 hours since last activity. Powering off heaters and motors.."
TURN_OFF_HEATERS
M84
{% endif %}
{% endif %}
timeout = 7200
[temperature_sensor raspberry_pi]
sensor_type = temperature_host
[skew_correction]
[input_shaper]
[virtual_sdcard]
path = ~/printer_data/gcodes
[display_status]
[pause_resume]
[force_move]
enable_force_move = True
[respond]
[resonance_generator]
[ratos]
allow_unknown_gcode_generator = True
[exclude_object]
[heater_bed]
heater_pin = heater_bed_heating_pin
sensor_pin = heater_bed_sensor_pin
sensor_type = Generic 3950
min_temp = 0
max_temp = 120
pwm_cycle_time = 0.02
control = pid
pid_kp = 68.203
pid_ki = 2.842
pid_kd = 409.216
[controller_fan controller_fan]
pin = fan_controller_board_pin
[printer]
kinematics = corexy
max_velocity = 300
max_accel = 3000
max_z_velocity = 20
max_z_accel = 350
square_corner_velocity = 5
minimum_cruise_ratio = 0.5
[gcode_macro QUAD_GANTRY_LEVEL]
rename_existing = QUAD_GANTRY_LEVEL_ORIG
gcode =
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
DEPLOY_PROBE
{% endif %}
QUAD_GANTRY_LEVEL_ORIG
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
STOW_PROBE
{% endif %}
[stepper_x]
position_max = 350
position_endstop = 350
step_pin = PC14
dir_pin = !x_dir_pin
enable_pin = !PE6
microsteps = 64
full_steps_per_rotation = 400
rotation_distance = 40
homing_speed = 50
endstop_pin = tmc5160_stepper_x:virtual_endstop
homing_retract_dist = 0
position_min = 0
[stepper_y]
position_max = 350
position_endstop = 350
step_pin = PE5
dir_pin = y_dir_pin
enable_pin = !PE3
microsteps = 64
full_steps_per_rotation = 400
rotation_distance = 40
homing_speed = 50
endstop_pin = tmc5160_stepper_y:virtual_endstop
homing_retract_dist = 0
position_min = 0
[stepper_z]
position_max = 310
step_pin = PG9
dir_pin = !z0_dir_pin
enable_pin = !PG13
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
position_min = -5
homing_speed = 10
endstop_pin = probe:z_virtual_endstop
[bed_mesh]
speed = 300
horizontal_move_z = 10
mesh_min = 20,30
mesh_max = 310,310
fade_start = 0.6
fade_end = 10.0
probe_count = 5,5
algorithm = bicubic
[quad_gantry_level]
gantry_corners =
-60,-10
410,420
points =
50,25
50,275
300,275
300,25
speed = 300
horizontal_move_z = 10
retries = 5
retry_tolerance = 0.0075
max_adjust = 10
[gcode_macro G32]
gcode =
SAVE_GCODE_STATE NAME=STATE_G32
G90
G28
QUAD_GANTRY_LEVEL
G28
G0 X175 Y175 Z30 F3600
RESTORE_GCODE_STATE NAME=STATE_G32
[firmware_retraction]
retract_speed = 60
unretract_extra_length = 0
unretract_speed = 60
retract_length = 0.5
[resonance_tester]
accel_chip_x = beacon
accel_chip_y = beacon
probe_points =
175,175,20
[tmc5160 stepper_x]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD6
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.022
diag1_pin = ^!x_diag_pin
driver_sgt = 0
[tmc5160 stepper_y]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD5
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.022
diag1_pin = ^!y_diag_pin
driver_sgt = 0
[tmc5160 stepper_z]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD2
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[tmc5160 stepper_z1]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA15
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z1]
step_pin = PG11
dir_pin = !z1_dir_pin
enable_pin = !PG12
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc5160 stepper_z2]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA9
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z2]
step_pin = PB4
dir_pin = !z2_dir_pin
enable_pin = !PB5
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc5160 stepper_z3]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA10
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z3]
step_pin = PG15
dir_pin = !z3_dir_pin
enable_pin = !PG14
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc2209 extruder]
stealthchop_threshold = 0
interpolate = False
uart_pin = toolboard_t0:PB5
run_current = 0.707
driver_tbl = 0
driver_toff = 4
driver_hend = 6
driver_hstrt = 7
sense_resistor = 0.11
[beacon]
serial = /dev/beacon
x_offset = 0
y_offset = 22.5
mesh_main_direction = x
mesh_runs = 1
speed = 15.
lift_speed = 80.
contact_max_hotend_temperature = 275
[delayed_gcode _BEACON_INIT]
initial_duration = 1
gcode =
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
{% set svv = printer.save_variables.variables %}
{% set nozzle_expansion_coefficient_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(0)|float %}
{% if nozzle_expansion_coefficient_multiplier == 0 %}
{% if printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier is not defined %}
{% set nozzle_expansion_coefficient_multiplier = 1.0 %}
{% else %}
{% set nozzle_expansion_coefficient_multiplier = printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier|default(1.0)|float %}
{% endif %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_multiplier VALUE={nozzle_expansion_coefficient_multiplier}
{% endif %}
{% if printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier is defined %}
CONSOLE_ECHO TITLE="Deprecated gcode variable" TYPE="warning" MSG={'"Please remove the variable beacon_contact_expansion_multiplier from your config file."'}
{% endif %}
[gcode_macro BEACON_RATOS_CALIBRATION]
gcode =
RATOS_ECHO MSG="Did you mean BEACON_RATOS_CALIBRATE?"
[gcode_macro BEACON_RATOS_CALIBRATE]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
BEACON_INITIAL_CALIBRATION _AUTOMATED=True
{% if beacon_contact_start_print_true_zero %}
BEACON_POKE_TEST _AUTOMATED=True
_BEACON_CHECK_POKE
{% if printer["dual_carriage"] is not defined %}
BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET _AUTOMATED=True
{% endif %}
{% endif %}
{% if chamber_temp > 0 %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
BEACON_FINAL_CALIBRATION _AUTOMATED=True BED_TEMP={bed_temp} CHAMBER_TEMP={chamber_temp}
{% if beacon_contact_start_print_true_zero %}
BEACON_MEASURE_GANTRY_TWIST
_BEACON_MAYBE_SCAN_COMPENSATION
{% endif %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% if chamber_temp > 0 %}
_CHAMBER_HEATER_OFF
{% endif %}
{% if beacon_contact_start_print_true_zero %}
{% if printer["dual_carriage"] is not defined %}
_BEACON_ECHO_NOZZLE_TEMP_OFFSETS
{% endif %}
_BEACON_ECHO_POKE
{% endif %}
RATOS_ECHO MSG="Beacon calibration finished!"
_LED_BEACON_CALIBRATION_END
RATOS_ECHO MSG="Saving config and restarting klipper..."
SAVE_CONFIG
[gcode_macro BEACON_INITIAL_CALIBRATION]
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed * 60 %}
MAYBE_HOME X=True Y=True
_LED_BEACON_CALIBRATION_START
G90
_MOVE_TO_SAFE_Z_HOME
BEACON_AUTO_CALIBRATE
_Z_HOP
RATOS_ECHO MSG="Initial beacon contact calibration finished!"
{% if not automated %}
_CONSOLE_SAVE_CONFIG
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro BEACON_FINAL_CALIBRATION]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
_BEACON_HOME_AND_ABL
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
_LED_BEACON_CALIBRATION_START
G90
G0 Z2 F{z_hop_speed}
RATOS_ECHO MSG="Waiting for calibration temperature..."
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=150
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp}
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} MAXIMUM={(bed_temp + 5)}
TEMPERATURE_WAIT SENSOR={'extruder' if default_toolhead == 0 else 'extruder1'} MINIMUM=150 MAXIMUM=155
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
_Z_HOP
BEACON_AUTO_CALIBRATE
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% endif %}
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_OFF
{% endif %}
_Z_HOP
RATOS_ECHO MSG="Final beacon contact calibration finished!"
{% if not automated %}
_CONSOLE_SAVE_CONFIG
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro BEACON_POKE_TEST]
variable_poke_result_1 = -1
variable_poke_result_2 = -1
variable_poke_result_3 = -1
variable_poke_result_4 = -1
variable_poke_result_5 = -1
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_1 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_2 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_3 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_4 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_5 VALUE=-1
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
G0 Z5 F{z_hop_speed}
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=1
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=2
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=3
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=4
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=5
_Z_HOP
RATOS_ECHO MSG="Beacon poke test finished!"
{% if not automated %}
_BEACON_ECHO_POKE
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro _BEACON_PROBE_POKE]
gcode =
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
BEACON_POKE speed=3 top=5 bottom={poke_bottom}
BEACON_QUERY
[gcode_macro _BEACON_STORE_POKE]
gcode =
{% set i = params.I|default(1)|int %}
{% set last_z = printer.beacon.last_poke_result|default(0)|float %}
{% if printer.beacon.last_poke_result|lower != "none" %}
{% if printer.beacon.last_poke_result.error == 0 %}
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE={"poke_result_%s" % i} VALUE={printer.beacon.last_poke_result.latency}
{% endif %}
{% endif %}
[gcode_macro _BEACON_CHECK_POKE]
gcode =
{% set p1 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_1|int %}
{% set p2 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_2|int %}
{% set p3 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_3|int %}
{% set p4 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_4|int %}
{% set p5 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_5|int %}
{% if p1 == -1 or p2 == -1 or p3 == -1 or p4 == -1 or p5 == -1 %}
_LED_BEACON_CALIBRATION_ERROR
{ action_raise_error("Beacon poke test error!") }
{% endif %}
{% set avg = (p1 + p2 + p3 + p4 + p5) / 5 %}
{% if avg > 6 %}
_LED_BEACON_CALIBRATION_ERROR
{ action_raise_error("Beacon poke test failed!") }
{% endif %}
[gcode_macro _BEACON_ECHO_POKE]
gcode =
{% set p1 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_1|int %}
{% set p2 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_2|int %}
{% set p3 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_3|int %}
{% set p4 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_4|int %}
{% set p5 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_5|int %}
{% set avg = (p1 + p2 + p3 + p4 + p5) / 5 %}
{% if avg <= 1 %}
{% set type = "success" %}
{% set note = "Extremely low noise, rarely achieved" %}
{% elif avg > 1 and avg <= 4 %}
{% set type = "info" %}
{% set note = "Excellent performance for a typical printer" %}
{% elif avg > 4 and avg <= 8 %}
{% set type = "warning" %}
{% set note = "Acceptable performance, machine may have considerable cyclic axis noise" %}
{% elif avg > 8 and avg <= 11 %}
{% set type = "alert" %}
{% set note = "Not ideal, may want to verify proper mounting or use thinner stackups" %}
{% elif avg > 11 %}
{% set type = "alert" %}
{% set note = "Reason for concern, present setup may be risky to continue with" %}
{% endif %}
CONSOLE_ECHO TITLE="Beacon poke test result:" TYPE={type} MSG={'"Average latency: %.2f_N_%s"' % (avg, note)}
[gcode_macro BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET]
variable_reference_z = 0.0
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set test_margin = 30 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero %}
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
RATOS_ECHO PREFIX="BEACON" MSG="Nozzle temperature offset calibration..."
{% for i in range(10) %}
beacon_poke speed=3 top=5 bottom={poke_bottom}
{% endfor %}
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=250
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET=0
{% if not automated %}
_BEACON_ECHO_NOZZLE_TEMP_OFFSETS
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
{% endif %}
[gcode_macro _BEACON_PROBE_NOZZLE_TEMP_OFFSET]
gcode =
{% set temp = params.TEMP|int %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set hotend_heat_soak_time = printer["gcode_macro RatOS"].hotend_heat_soak_time|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% set idex_zcontrolpoint = svv.idex_zcontrolpoint|default(150)|float %}
RATOS_ECHO PREFIX="BEACON" MSG="Waiting for nozzle to reach {temp}°C..."
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET={temp}
TEMPERATURE_WAIT SENSOR={"extruder" if default_toolhead == 0 else "extruder1"} MINIMUM={temp} MAXIMUM={temp + 2}
{% if hotend_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking hotend for {hotend_heat_soak_time} seconds..."
G4 P{(hotend_heat_soak_time * 1000)}
{% endif %}
RATOS_ECHO PREFIX="BEACON" MSG="Probing with nozzle temperature {temp}°C..."
PROBE PROBE_METHOD=contact PROBE_SPEED=3 LIFT_SPEED=15 SAMPLES=5 SAMPLE_RETRACT_DIST=3 SAMPLES_TOLERANCE=0.005 SAMPLES_TOLERANCE_RETRIES=10 SAMPLES_RESULT=median
BEACON_QUERY
G0 Z5 F{z_speed}
[gcode_macro _BEACON_STORE_NOZZLE_TEMP_OFFSET]
gcode =
{% set temp = params.TEMP|int %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% set last_z = printer.beacon.last_z_result|default(0)|float %}
{% if temp == 150 %}
SET_GCODE_VARIABLE MACRO=BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET VARIABLE=reference_z VALUE={last_z}
{% else %}
{% set reference_z = printer["gcode_macro BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET"].reference_z|default(0)|float %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_t{default_toolhead} VALUE={(last_z - reference_z)}
{% endif %}
[gcode_macro _BEACON_ECHO_NOZZLE_TEMP_OFFSETS]
gcode =
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% if default_toolhead == 0 %}
CONSOLE_ECHO TYPE="info" MSG={'"T0 expansion coefficient %.6f"' % svv.nozzle_expansion_coefficient_t0}
{% else %}
CONSOLE_ECHO TYPE="info" MSG={'"T1 expansion coefficient %.6f"' % svv.nozzle_expansion_coefficient_t1}
{% endif %}
[gcode_macro _BEACON_SET_NOZZLE_TEMP_OFFSET]
variable_runtime_temp = 0
gcode =
{% set toolhead = params.TOOLHEAD|default(0)|int %}
{% set reset = true if params.RESET|default(false)|lower == 'true' else false %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set svv = printer.save_variables.variables %}
{% if reset %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_applied_offset VALUE=0
{% else %}
{% if beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
{% set nozzle_expansion_coefficient_t0 = svv.nozzle_expansion_coefficient_t0|default(0)|float %}
{% if printer["dual_carriage"] is defined %}
{% set nozzle_expansion_coefficient_t1 = svv.nozzle_expansion_coefficient_t1|default(0)|float %}
{% endif %}
{% set nozzle_expansion_coefficient_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(1.0)|float %}
{% set applied_offset = svv.nozzle_expansion_applied_offset|default(0)|float %}
{% set temp = printer['extruder' if toolhead == 0 else 'extruder1'].target|float %}
{% set temp_offset = temp - beacon_contact_true_zero_temp %}
{% set expansion_coefficient = nozzle_expansion_coefficient_t0 if toolhead == 0 else nozzle_expansion_coefficient_t1 %}
{% set expansion_offset = nozzle_expansion_coefficient_multiplier * (temp_offset * (expansion_coefficient / 100)) %}
{% set new_offset = ((-applied_offset) + expansion_offset) %}
SET_GCODE_OFFSET Z_ADJUST={new_offset} MOVE=1 SPEED={z_speed}
SAVE_VARIABLE VARIABLE=nozzle_expansion_applied_offset VALUE={expansion_offset}
SET_GCODE_VARIABLE MACRO=_BEACON_SET_NOZZLE_TEMP_OFFSET VARIABLE=runtime_temp VALUE={temp}
RATOS_ECHO PREFIX="BEACON" MSG={'"Nozzle expansion offset of %.6fmm applied to T%s"' % (expansion_offset, toolhead)}
DEBUG_ECHO PREFIX="_BEACON_SET_NOZZLE_TEMP_OFFSET" MSG="multiplier: {nozzle_expansion_coefficient_multiplier}, coefficient: {expansion_coefficient}, temp_offset: {temp_offset}, expansion_offset: {expansion_offset}, applied_offset: {applied_offset}, new_offset: {new_offset}"
{% endif %}
{% endif %}
[gcode_macro BEACON_MEASURE_GANTRY_TWIST]
variable_needs_compensation = False
variable_reference_z = 0.0
variable_front = 0.0
variable_front_left = 0.0
variable_front_right = 0.0
variable_back = 0.0
variable_back_left = 0.0
variable_back_right = 0.0
variable_right = 0.0
variable_left = 0.0
variable_margin_x = 40
variable_margin_y = 40
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=False
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
RATOS_ECHO PREFIX="BEACON" MSG="Measure gantry twist..."
{% for i in range(10) %}
beacon_poke speed=3 top=5 bottom={poke_bottom}
{% endfor %}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="center"
G0 X{margin_x} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front_left"
G0 X{safe_home_x} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front"
G0 X{(printable_x_max - margin_x)} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front_right"
G0 X{(printable_x_max - margin_x)} Y{safe_home_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="right"
G0 X{(printable_x_max - margin_x)} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back_right"
G0 X{safe_home_x} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back"
G0 X{margin_x} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back_left"
G0 X{margin_x} Y{safe_home_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="left"
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
_BEACON_ECHO_GANTRY_TWIST
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro _BEACON_PROBE_GANTRY_TWIST]
gcode =
RATOS_ECHO PREFIX="BEACON" MSG="Probing..."
BEACON_OFFSET_COMPARE
BEACON_QUERY
[gcode_macro _BEACON_STORE_GANTRY_TWIST]
gcode =
{% set location = params.LOCATION|lower %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set last_z = printer.beacon.last_offset_result["delta"]|default(0)|float %}
{% if location == "center" %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=reference_z VALUE={last_z}
{% else %}
{% set reference_z = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].reference_z|default(0)|float %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE={location} VALUE={(last_z - reference_z)}
{% endif %}
[gcode_macro _BEACON_ECHO_GANTRY_TWIST]
gcode =
{% set reference_z = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].reference_z|default(0)|float * 1000 %}
{% set front_left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front_left|default(0)|float * 1000 %}
{% set front = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front|default(0)|float * 1000 %}
{% set front_right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front_right|default(0)|float * 1000 %}
{% set right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].right|default(0)|float * 1000 %}
{% set back_right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back_right|default(0)|float * 1000 %}
{% set back = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back|default(0)|float * 1000 %}
{% set back_left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back_left|default(0)|float * 1000 %}
{% set left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].left|default(0)|float * 1000 %}
{% set line_1 = "Front left: %.6fμm" % (front_left) %}
{% set line_2 = "Front center: %.6fμm" % (front) %}
{% set line_3 = "Front right: %.6fμm" % (front_right) %}
{% set line_4 = "Left center: %.6fμm" % (left) %}
{% set line_5 = "Right center: %.6fμm" % (right) %}
{% set line_6 = "Back left: %.6fμm" % (back_left) %}
{% set line_7 = "Back center: %.6fμm" % (back) %}
{% set line_8 = "Back right: %.6fμm" % (back_right) %}
{% set max_value = [(front_left|abs), (front|abs), (front_right|abs), (left|abs), (right|abs), (back_left|abs), (back|abs), (back_right|abs)]|max %}
{% if max_value <= 50 %}
{% set type = "success" %}
{% set recommendation = "Very low gantry twist: %.6fμm._N_No beacon scan compensation needed." % max_value %}
{% elif max_value > 50 and max_value <= 100 %}
{% set type = "info" %}
{% set recommendation = "Low gantry twist: %.6fμm._N_You may experience first layer inconsistensies, consider beacon scan compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 100 and max_value <= 150 %}
{% set type = "warning" %}
{% set recommendation = "High gantry twist: %.6fμm._N_High chance of first layer problems, beacon scan compensation is highly encouraged." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 150 and max_value <= 200 %}
{% set type = "alert" %}
{% set recommendation = "Very High gantry twist: %.6fμm._N_You will encounter first layer problems on large prints unless you activate beacon scan compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 200 %}
{% set type = "alert" %}
{% set recommendation = "Extremely high gantry twist: %.6fμm._N_You have significant scan/contact inconsistency which is indicative of mechanical problems, please investigate before resorting to software compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% endif %}
CONSOLE_ECHO TITLE="Gantry twist relative to the center" TYPE={type} MSG={'"_N_%s_N__N_%s_N_%s_N_%s_N_%s_N_%s_N_%s_N_%s_N_%s"' % (recommendation, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8)}
[gcode_macro BEACON_CREATE_SCAN_COMPENSATION_MESH]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set profile = params.PROFILE|default("Contact")|string %}
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_scan_compensation_enable = true if printer["gcode_macro RatOS"].beacon_scan_compensation_enable|default(false)|lower == 'true' else false %}
{% set probe_count = printer["gcode_macro RatOS"].beacon_scan_compensation_probe_count %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% if not beacon_scan_compensation_enable %}
RATOS_ECHO MSG="Beacon scan compensation is disabled!"
{% else %}
MAYBE_HOME
_MOVE_TO_SAFE_Z_HOME
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_LED_BEACON_CALIBRATION_START
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=150
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp}
RATOS_ECHO MSG="Please wait..."
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} MAXIMUM={(bed_temp + 5)}
TEMPERATURE_WAIT SENSOR={'extruder' if default_toolhead == 0 else 'extruder1'} MINIMUM=150 MAXIMUM=155
{% endif %}
{% if not automated %}
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
{% endif %}
{% if printer.z_tilt is defined %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% endif %}
{% if printer.quad_gantry_level is defined %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% endif %}
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES=2 SAMPLES_DROP=1 SAMPLES_TOLERANCE_RETRIES=10 PROBE_COUNT={probe_count[0]},{probe_count[1]} PROFILE={profile}
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% endif %}
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_OFF
{% endif %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
RATOS_ECHO MSG="Beacon scan compensation mesh created!"
{% if not automated %}
RATOS_ECHO MSG="Saving config and restarting klipper..."
SAVE_CONFIG
{% endif %}
{% endif %}
[gcode_macro _BEACON_APPLY_SCAN_COMPENSATION]
gcode =
{% set beacon_scan_compensation_profile = printer["gcode_macro RatOS"].beacon_scan_compensation_profile %}
{% set beacon_scan_compensation_enable = true if printer["gcode_macro RatOS"].beacon_scan_compensation_enable|default(false)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_SCAN_COMPENSATION" MSG="beacon_scan_compensation_profile {beacon_scan_compensation_profile}, beacon_scan_compensation_enable {beacon_scan_compensation_enable}"
{% if beacon_scan_compensation_enable %}
BEACON_APPLY_SCAN_COMPENSATION PROFILE={beacon_scan_compensation_profile}
{% endif %}
[gcode_macro _BEACON_MAYBE_SCAN_COMPENSATION]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set needs_scan_compensation = true if printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].needs_compensation|default(false)|lower == 'true' else false %}
{% if needs_scan_compensation %}
BEACON_CREATE_SCAN_COMPENSATION_MESH _AUTOMATED=True BED_TEMP={bed_temp} CHAMBER_TEMP={chamber_temp}
{% endif %}
[gcode_macro _BEACON_HOME_AND_ABL]
gcode =
MAYBE_HOME X=True Y=True
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% set needs_rehoming = False %}
{% if printer.z_tilt is defined and not printer.z_tilt.applied %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% set needs_rehoming = True %}
{% endif %}
{% if printer.quad_gantry_level is defined and not printer.quad_gantry_level.applied %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% set needs_rehoming = True %}
{% endif %}
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% if needs_rehoming %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% endif %}
[gcode_macro _BEACON_SAVE_MULTIPLIER]
gcode =
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set multiplier = printer["gcode_macro _BEACON_APPLY_RUNTIME_MULTIPLIER"].runtime_multiplier|default(-1.0)|float %}
DEBUG_ECHO PREFIX="_BEACON_SAVE_MULTIPLIER" MSG="multiplier: {multiplier}, beacon_contact_start_print_true_zero: {beacon_contact_start_print_true_zero}, beacon_contact_expansion_compensation: {beacon_contact_expansion_compensation}"
{% if multiplier > 0 and beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_multiplier VALUE={multiplier}
SET_GCODE_VARIABLE MACRO=_BEACON_APPLY_RUNTIME_MULTIPLIER VARIABLE=runtime_multiplier VALUE=-1.0
CONSOLE_ECHO TITLE="Hotend thermal expansion compensation" TYPE="success" MSG={'"New value is: %.6f_N_The new multiplier value has been saved to the configuration."' % multiplier}
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _BEACON_APPLY_RUNTIME_MULTIPLIER]
variable_runtime_multiplier = -1.0
gcode =
{% set toolhead = 0 %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set toolhead = 1 if idex_mode == 'primary' else 0 %}
{% endif %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set layer_number = printer["gcode_macro _ON_LAYER_CHANGE"].layer_number|default(0)|int %}
{% set is_printing_gcode = true if printer["gcode_macro START_PRINT"].is_printing_gcode|default(true)|lower == 'true' else false %}
{% if layer_number == 0 and is_printing_gcode %}
{% set link_url = "https://os.ratrig.com/docs/slicers" %}
{% set link_text = "RatOS Slicer Documentation" %}
{% set line_1 = '"Your slicer is not correctly reporting layer information. See the layer change custom g-code in the %s".' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="Missing layer information" TYPE="warning" MSG={line_1}
{% endif %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_RUNTIME_MULTIPLIER" MSG="layer_number: {layer_number}, is_printing_gcode: {is_printing_gcode}, beacon_contact_start_print_true_zero: {beacon_contact_start_print_true_zero}, beacon_contact_expansion_compensation: {beacon_contact_expansion_compensation}"
{% if layer_number == 1 and is_printing_gcode and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
{% set svv = printer.save_variables.variables %}
{% set nozzle_expansion_coefficient = svv.nozzle_expansion_coefficient_t0|default(0)|float %}
{% if toolhead == 1 %}
{% set nozzle_expansion_coefficient = svv.nozzle_expansion_coefficient_t1|default(0)|float %}
{% endif %}
{% set beacon_contact_expansion_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(1.0)|float %}
{% set print_temp = printer["gcode_macro _BEACON_SET_NOZZLE_TEMP_OFFSET"].runtime_temp|default(0)|int %}
{% if print_temp > 0 %}
{% set z_offset = printer.gcode_move.homing_origin.z|float %}
{% set temp_delta = print_temp - beacon_contact_true_zero_temp %}
{% set coefficient_per_degree = nozzle_expansion_coefficient / 100 %}
{% set z_offset_per_degree = z_offset / temp_delta %}
{% set new_multiplier = z_offset_per_degree / coefficient_per_degree %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_RUNTIME_MULTIPLIER" MSG="print_temp: {print_temp}, z_offset: {z_offset}, temp_delta: {temp_delta}, nozzle_expansion_coefficient: {nozzle_expansion_coefficient}, coefficient_per_degree: {coefficient_per_degree}, z_offset_per_degree: {z_offset_per_degree}, old_multiplier: {beacon_contact_expansion_multiplier}, new_multiplier: {new_multiplier}"
SET_GCODE_VARIABLE MACRO=_BEACON_APPLY_RUNTIME_MULTIPLIER VARIABLE=runtime_multiplier VALUE={new_multiplier}
{% endif %}
{% endif %}
[gcode_macro T0]
variable_join = 0
variable_remap = 0
variable_alert = ""
variable_filament_name = ""
variable_filament_type = ""
variable_filament_temp = 0
variable_runout_sensor = ""
variable_active = True
variable_color = "7bff33"
variable_hotend_type = "SF"
variable_has_cht_nozzle = True
variable_cooling_position_to_nozzle_distance = 40
variable_tooolhead_sensor_to_extruder_gear_distance = 15
variable_extruder_gear_to_cooling_position_distance = 30
variable_filament_loading_nozzle_offset = -5
variable_filament_grabbing_length = 5
variable_filament_grabbing_speed = 1
variable_enable_insert_detection = True
variable_enable_runout_detection = True
variable_enable_clog_detection = True
variable_unload_after_runout = True
variable_purge_after_load = 0
variable_purge_before_unload = 0
variable_extruder_load_speed = 60
variable_filament_load_speed = 10
variable_standby = False
variable_temperature_offset = 0
variable_has_oozeguard = False
variable_has_front_arm_nozzle_wiper = False
variable_resume_after_insert = False
gcode =
{% set x = params.X|default(-1.0)|float %}
{% set y = params.Y|default(-1.0)|float %}
{% set z = params.Z|default(0.0)|float %}
{% set s = params.S|default(1)|int %}
{% if printer["gcode_macro _SELECT_TOOL"] is defined %}
_SELECT_TOOL T=0 X={x} Y={y} Z={z} TOOLSHIFT={s}
{% endif %}
[save_variables]
filename = /home/pi/printer_data/config/ratos-variables.cfg
=======================
Extruder max_extrude_ratio=0.415752
mcu 'mcu': Starting serial connect
webhooks client 4133601232: New connection
webhooks client 4133601232: Client info {'program': 'Moonraker', 'version': 'v0.9.3-0-g71f9e67'}
Loaded MCU 'mcu' 118 commands (v0.12.0-396-gb7233d119 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34)
MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 BUS_PINS_i2c3_PA8_PC9=PA8,PC9 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h723xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1
mcu 'rpi': Starting connect
Loaded MCU 'rpi' 119 commands (?-20240727_132503-fv-az659-741 / gcc: (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110 binutils: (GNU Binutils for Raspbian) 2.35.2)
MCU 'rpi' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256
mcu 'toolboard_t0': Starting serial connect
Loaded MCU 'toolboard_t0' 100 commands (v0.12.0-396-gb7233d119 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34)
MCU 'toolboard_t0' config: ADC_MAX=4095 BUS_PINS_i2c1=PB6,PB7 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB7=PB8,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c1_PF1_PF0=PF1,PF0 BUS_PINS_i2c1a=PF1,PF0 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 CLOCK_FREQ=48000000 MCU=stm32f042x6 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PF0,PF1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1
mcu_temperature 'mcu' nominal base=-275.577689 slope=1631.474104
mcu_temperature 'toolboard_t0' nominal base=342.920354 slope=-724.778761
mcu 'beacon': Starting serial connect
Loaded MCU 'beacon' 45 commands (Beacon 2.1.0 / )
MCU 'beacon' config: ADC_MAX=4095 BEACON_ACCEL_BITS=12 BEACON_ACCEL_SCALE_16G=7.81 BEACON_ACCEL_SCALE_2G=0.98 BEACON_ACCEL_SCALE_4G=1.95 BEACON_ACCEL_SCALE_8G=3.91 BEACON_ADC_SMOOTH_COUNT=16 BEACON_HAS_ACCEL=1 BEACON_REV=H CLOCK_FREQ=32000000 MCU=beacon STATS_SUMSQ_BASE=256
Config error
Traceback (most recent call last):
File "/home/pi/klipper/klippy/klippy.py", line 135, in _connect
cb()
File "/home/pi/klipper/klippy/mcu.py", line 748, in _connect
self._send_config(None)
File "/home/pi/klipper/klippy/mcu.py", line 679, in _send_config
cb()
File "/home/pi/klipper/klippy/mcu.py", line 456, in _build_config
raise pins.error("shutdown value must be 0.0 or 1.0 on soft pwm")
pins.error: shutdown value must be 0.0 or 1.0 on soft pwm
webhooks client 4133601232: Disconnected
Starting Klippy...
Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock']
Git version: 'v0.12.0-396-gb7233d119-dirty'
Untracked files: klippy/extras/beacon.py, klippy/extras/gcode_shell_command.py, klippy/extras/linear_movement_vibrations.py, klippy/extras/ratos.py, klippy/extras/ratos_homing.py, klippy/extras/resonance_generator.py, klippy/extras/z_offset_probe.py, klippy/kinematics/ratos_hybrid_corexy.py
Branch: master
Remote: origin
Tracked URL: https://github.com/Klipper3d/klipper.git
CPU: 4 core ?
Python: '3.9.2 (default, Mar 20 2025, 22:21:41) \n[GCC 10.2.1 20210110]'
Start printer at Sun May 25 00:40:43 2025 (1748130043.8 21.9)
===== Config file =====
[mcu rpi]
serial = /tmp/klipper_host_mcu
[board_pins btt-kraken]
aliases =
x_step_pin=PC14,
x_dir_pin=PC13,
x_enable_pin=PE6,
x_uart_pin=PD6,
x_diag_pin=PC15,
x_endstop_pin=PC15,
y_step_pin=PE5,
y_dir_pin=PE4,
y_enable_pin=PE3,
y_uart_pin=PD6,
y_diag_pin=PF0,
y_endstop_pin=PF0,
z0_step_pin=PG9,
z0_dir_pin=PG10,
z0_enable_pin=PG13,
z0_uart_pin=PA15,
z0_diag_pin=PF3,
z1_step_pin=PG11,
z1_dir_pin=PD7,
z1_enable_pin=PG12,
z1_uart_pin=PA9,
z1_diag_pin=PF4,
z2_step_pin=PB4,
z2_dir_pin=PB3,
z2_enable_pin=PB5,
z2_uart_pin=PA10,
z2_diag_pin=PF10,
z3_step_pin=PG15,
z3_dir_pin=PB6,
z3_enable_pin=PG14,
z3_uart_pin=PD2,
z3_diag_pin=PC0,
e_step_pin=PG9,
e_dir_pin=PG10,
e_enable_pin=PG13,
e_uart_pin=PD2,
e_diag_pin=PF1,
e_heater_pin=PF6,
e_sensor_pin=PB1,
stepper_spi_mosi_pin=PC8,
stepper_spi_miso_pin=PC7,
stepper_spi_sclk_pin=PC6,
adxl345_cs_pin=PE10,
bltouch_sensor_pin=PG1,
bltouch_control_pin=PE9,
probe_pin=PG1,
fan_part_cooling_pin=PA0,
fan_toolhead_cooling_pin=PA1,
fan_controller_board_pin=PA2,
heater_bed_heating_pin=PF5,
heater_bed_sensor_pin=PB0,
4p_fan_part_cooling_pin=PA6,
4p_fan_part_cooling_tach_pin=PC1,
4p_toolhead_cooling_pin=PE8,
4p_toolhead_cooling_tach_pin=PG0,
4p_controller_board_pin=PE8,
4p_controller_board_tach_pin=PG0
[mcu]
serial = /dev/RatOS/btt-kraken
[temperature_sensor Kraken]
sensor_type = temperature_mcu
[adxl345 controlboard]
cs_pin = PE10
spi_software_mosi_pin = PE14
spi_software_miso_pin = PE13
spi_software_sclk_pin = PE12
[board_pins toolboard_t0]
mcu = toolboard_t0
aliases =
e_step_pin=PB7,
e_dir_pin=PB6,
e_enable_pin=PB4,
e_uart_pin=PB5,
e_heater_pin=PA0,
e_sensor_pin=PA3,
stepper_spi_mosi_pin=null,
stepper_spi_miso_pin=null,
stepper_spi_sclk_pin=null,
adxl345_cs_pin=PA4,
bltouch_sensor_pin=PA15,
bltouch_control_pin=PB3,
probe_pin=PA15,
fan_part_cooling_pin=PA10,
fan_toolhead_cooling_pin=PA9,
fan_controller_board_pin=null,
heater_bed_heating_pin=null,
heater_bed_sensor_pin=null,
4p_fan_part_cooling_pin=null,
4p_fan_part_cooling_tach_pin=null,
4p_toolhead_cooling_pin=null,
4p_toolhead_cooling_tach_pin=null,
4p_controller_board_pin=null,
4p_controller_board_tach_pin=null
[mcu toolboard_t0]
serial = /dev/RatOS/ldo-orbitool-o2-t0
[temperature_sensor Orbitool_O2_T0]
sensor_type = temperature_mcu
sensor_mcu = toolboard_t0
[lis2dw toolboard_t0]
axes_map = x, z, y
cs_pin = toolboard_t0:PA4
spi_bus = spi1
[extruder]
max_power = 0.995
rotation_distance = 4.63
full_steps_per_rotation = 200
filament_diameter = 1.750
max_extrude_only_velocity = 60
max_extrude_only_distance = 200
nozzle_diameter = 0.5
heater_pin = toolboard_t0:PA0
sensor_type = PT1000
pullup_resistor = 2200
sensor_pin = toolboard_t0:PA3
min_extrude_temp = 170
min_temp = 0
max_temp = 285
pressure_advance = 0.05
step_pin = toolboard_t0:PB7
dir_pin = !toolboard_t0:e_dir_pin
enable_pin = !toolboard_t0:PB4
microsteps = 64
control = pid
pid_kp = 21.673
pid_ki = 1.338
pid_kd = 87.776
[adc_temperature hotend_power_scale]
temperature1 = 119
voltage1 = 1.91
temperature2 = 239
voltage2 = 3.82
[fan]
max_power = 0.995
shutdown_speed = 1.0
pin = PA6
cycle_time = 0.00004
tachometer_pin = ^PC1
tachometer_poll_interval = 0.0005
[heater_fan toolhead_cooling_fan]
max_power = 0.995
cycle_time = 0.0001
shutdown_speed = 0
pin = PA1
fan_speed = 1
heater = extruder
[output_pin O2_RUN_LED]
pin = toolboard_t0:PB8
shutdown_value = 0
value = 1
[temperature_sensor hotend_power_draw]
sensor_pin = toolboard_t0:PA2
sensor_type = hotend_power_scale
[gcode_macro RatOS]
variable_homing = "endstops"
variable_z_probe = "static"
variable_sensorless_x_current = 0.49699999999999994
variable_sensorless_y_current = 0.7242
variable_safe_home_x = "middle"
variable_safe_home_y = "middle"
variable_driver_type_x = "tmc2209"
variable_driver_type_y = "tmc2209"
variable_stowable_probe_stop_on_error = False
variable_chamber_filter_enable = True
variable_chamber_filter_speed = 0.5
variable_chamber_filter_disable_speed = 1.0
variable_chamber_filter_enable_at = "after_print_start"
variable_chamber_filter_disable_period = 300
variable_chamber_filter_disable_bed_temp = 0
variable_chamber_heater_enable = True
variable_chamber_heater_bed_temp = 115
variable_chamber_heater_preheating_temp = 150
variable_chamber_heater_heating_temp_offset = 25
variable_chamber_heater_control_external_heater = False
variable_chamber_heater_air_circulation_enable = True
variable_chamber_heater_air_circulation_fan_speed = 0.35
variable_chamber_heater_air_circulation_y_pos = 0
variable_chamber_heater_air_circulation_z_pos = 100
variable_chamber_heater_extra_fan_speed = 1.0
variable_chamber_heater_filter_fan_speed = 1.0
variable_led_status_action = 0.0,1.0,1.0
variable_led_status_success = 0.0,1.0,0.0
variable_led_status_error = 1.0,0.0,1.0
variable_led_status_on = 1.0,1.0,1.0
variable_led_status_off = 0.0,0.0,1.0
variable_led_status_standby = 0.1,0.1,0.1
variable_led_status_heating = 1.0,0.0,0.0
variable_led_status_cooling = 0.0,0.0,1.0
variable_calibrate_bed_mesh = True
variable_adaptive_mesh = True
variable_start_print_park_in = "front"
variable_start_print_park_z_height = 50
variable_end_print_park_in = "back"
variable_pause_print_park_in = "front"
variable_end_print_park_z_hop = 20
variable_nozzle_priming = "primeblob"
variable_nozzle_prime_start_x = "max"
variable_nozzle_prime_start_y = "min"
variable_nozzle_prime_direction = "auto"
variable_nozzle_prime_bridge_fan = 102
variable_probe_for_priming_result = None
variable_probe_for_priming_end_result = None
variable_probe_for_priming_result_t1 = None
variable_probe_for_priming_end_result_t1 = None
variable_probe_for_priming_disable_mesh_constraints = False
variable_adaptive_prime_offset_threshold = -1.0
variable_last_z_offset = None
variable_runout_park_in = "front"
variable_enable_unload_tip_forming = False
variable_filament_unload_length = 150
description = RatOS variable storage macro, will echo variables to the console when run.
variable_relative_extrusion = False
variable_force_absolute_position = False
variable_preheat_extruder = True
variable_preheat_extruder_temp = 150
variable_macro_travel_speed = 300
variable_macro_travel_accel = 3000
variable_macro_z_speed = 15
variable_bed_margin_x = [0, 0]
variable_bed_margin_y = [0, 0]
variable_printable_x_min = 0
variable_printable_x_max = 0
variable_printable_y_min = 0
variable_printable_y_max = 0
variable_end_print_motors_off = True
variable_status_color_ok = "00FF00"
variable_status_color_error = "FF0000"
variable_status_color_unknown = "FFFF00"
variable_end_print_retract_filament = 10
gcode =
ECHO_RATOS_VARS
variable_beacon_bed_mesh_scv = 25
variable_beacon_contact_z_homing = False
variable_beacon_contact_start_print_true_zero = True
variable_beacon_contact_wipe_before_true_zero = True
variable_beacon_contact_true_zero_temp = 150
variable_beacon_contact_prime_probing = True
variable_beacon_contact_expansion_compensation = True
variable_beacon_contact_bed_mesh = False
variable_beacon_contact_bed_mesh_samples = 2
variable_beacon_contact_z_tilt_adjust = False
variable_beacon_contact_z_tilt_adjust_samples = 2
variable_beacon_scan_compensation_enable = False
variable_beacon_scan_compensation_profile = "Contact"
variable_beacon_scan_compensation_probe_count = 15,15
variable_beacon_contact_poke_bottom_limit = -1
variable_homing_x = "sensorless"
variable_homing_y = "sensorless"
variable_x_driver_types = ["tmc5160"]
variable_x_axes = ["x"]
variable_y_driver_types = ["tmc5160"]
variable_y_axes = ["y"]
variable_z_driver_types = ["tmc5160", "tmc5160", "tmc5160", "tmc5160"]
variable_z_axes = ["z", "z1", "z2", "z3"]
[ratos_homing]
axes = xyz
z_hop = 15
z_hop_speed = 15
gcode =
_LED_ON
{% set prev_stop_on_error = printer["gcode_macro RatOS"].stowable_probe_stop_on_error %}
{% if printer["dual_carriage"] is defined %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set target_idex_mode = printer["dual_carriage"].carriage_1|lower %}
_IDEX_SINGLE
_SELECT_TOOL T={default_toolhead} TOOLSHIFT=false
{% endif %}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE=True
M400
G90
{% set X = true if params.X is defined else false %}
{% set Y = true if params.Y is defined else false %}
{% set Z = true if params.Z is defined else false %}
{% if printer["gcode_macro RatOS"].home_y_first|default(false)|lower == 'true' %}
HOME_Y X={X} Y={Y} Z={Z}
HOME_X X={X} Y={Y} Z={Z}
{% else %}
HOME_X X={X} Y={Y} Z={Z}
HOME_Y X={X} Y={Y} Z={Z}
{% endif %}
HOME_Z X={X} Y={Y} Z={Z}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE={prev_stop_on_error}
{% if printer["dual_carriage"] is defined %}
{% if target_idex_mode == "copy" %}
_IDEX_COPY
{% elif target_idex_mode == "mirror" %}
_IDEX_MIRROR
{% endif %}
{% endif %}
[gcode_macro HOME_X]
gcode =
{% set x_homed = 'x' in printer.toolhead.homed_axes %}
{% set homing = printer["gcode_macro RatOS"].homing|lower %}
{% set homing_x = printer["gcode_macro RatOS"].homing_x|lower %}
{% set homing_x = homing_x if homing_x else homing %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_X" MSG="printable_x_max: {printable_x_max}, safe_home_x: {safe_home_x}, axis_maximum.x: {printer.toolhead.axis_maximum.x}, bed_margin_x: {printer['gcode_macro RatOS'].bed_margin_x}"
{% if X or not Y and not Z %}
{% if homing_x == 'endstop' %}
G28 X
{% elif homing_x == 'sensorless' %}
{% if printer["dual_carriage"] is defined %}
{ action_emergency_stop("sensorless homing not supported on IDEX!") }
{% endif %}
HOME_X_SENSORLESS
{% else %}
{ action_emergency_stop("expected RatOS variable_homing_x to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_x, homing)) }
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set parking_position = printer["gcode_macro T%s" % (0 if default_toolhead==1 else 1)].parking_position|float %}
SET_DUAL_CARRIAGE CARRIAGE={0 if default_toolhead==1 else 1} MODE=PRIMARY
G1 X{parking_position} F{speed}
SET_DUAL_CARRIAGE CARRIAGE={default_toolhead} MODE=PRIMARY
{% endif %}
{% set x_homed = True %}
G0 X{safe_home_x} F{speed}
M400
{% endif %}
[gcode_macro HOME_Y]
gcode =
{% set y_homed = 'y' in printer.toolhead.homed_axes %}
{% set homing = printer["gcode_macro RatOS"].homing|lower %}
{% set homing_y = printer["gcode_macro RatOS"].homing_y|lower %}
{% set homing_y = homing_y if homing_y else homing %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_Y" MSG="printable_y_max: {printable_y_max}, safe_home_y: {safe_home_y}, axis_maximum.y: {printer.toolhead.axis_maximum.y}, bed_margin_y: {printer['gcode_macro RatOS'].bed_margin_y}"
{% if Y or not X and not Z %}
{% if homing_y == 'endstop' %}
G28 Y
{% elif homing_y == 'sensorless' %}
HOME_Y_SENSORLESS
{% else %}
{ action_emergency_stop("expected RatOS variable_homing_y to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_y, homing)) }
{% endif %}
{% set y_homed = True %}
G0 Y{safe_home_y} F{speed}
{% endif %}
[gcode_macro HOME_Z]
gcode =
{% set x_homed = 'x' in printer.toolhead.homed_axes %}
{% set y_homed = 'y' in printer.toolhead.homed_axes %}
{% set z_probe = printer["gcode_macro RatOS"].z_probe %}
{% set beacon_contact_z_homing = true if printer["gcode_macro RatOS"].beacon_contact_z_homing|default(false)|lower == 'true' else false %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_Z" MSG="x_homed: {x_homed}, y_homed: {y_homed}, z_probe: {z_probe}, beacon_contact_z_homing: {beacon_contact_z_homing}"
{% if Z or not Y and not X %}
RATOS_ECHO MSG="Homing Z"
{% if x_homed == False or y_homed == False %}
{ action_emergency_stop("X and Y must be homed before homing Z") }
{% else %}
{% if z_probe == "stowable" %}
DEPLOY_PROBE
_MOVE_TO_SAFE_Z_HOME
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_homing %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% else %}
G28 Z
{% endif %}
_Z_HOP
STOW_PROBE
{% else %}
_MOVE_TO_SAFE_Z_HOME
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_homing %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% else %}
G28 Z
{% endif %}
_Z_HOP
{% endif %}
{% endif %}
{% endif %}
[gcode_macro HOME_X_SENSORLESS]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="home_x_sensorless"
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
M204 S1000
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endif %}
G4 P300
G28 X
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].x_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].y_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current}
{% endif %}
G4 P300
RESTORE_TOOLHEAD_SETTINGS KEY="home_x_sensorless"
[gcode_macro HOME_Y_SENSORLESS]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="home_y_sensorless"
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
M204 S1000
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endif %}
G4 P300
G28 Y
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].x_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].y_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current}
{% endif %}
G4 P300
RESTORE_TOOLHEAD_SETTINGS KEY="home_y_sensorless"
[gcode_macro _Z_HOP]
description = Move Z axis up by Z_HOP distance at Z_HOP_SPEED. In relative mode it will move Z axis up by Z_HOP distance. In absolute mode it will move Z axis to Z_HOP distance.
gcode =
{% set z_hop = printer.configfile.config.ratos_homing.z_hop|float %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
G0 Z{z_hop} F{z_hop_speed}
[gcode_macro _MOVE_TO_SAFE_Z_HOME]
description = Move to safe home position with optional Z_HOP (pass Z_HOP=True as parameter)
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% if params.Z_HOP is defined %}
_Z_HOP
{% endif %}
DEBUG_ECHO PREFIX="_MOVE_TO_SAFE_Z_HOME" MSG="axis_maximum.x: {printer.toolhead.axis_maximum.x}, axis_maximum.y: {printer.toolhead.axis_maximum.y}, bed_margin_x: {printer['gcode_macro RatOS'].bed_margin_x}, bed_margin_y: {printer['gcode_macro RatOS'].bed_margin_y}, safe_home_x: {safe_home_x}, safe_home_y: {safe_home_y}, printable_x_max: {printable_x_max}, printable_y_max: {printable_y_max}"
G0 X{safe_home_x} Y{safe_home_y} F{speed}
[gcode_macro MAYBE_HOME]
description = Only home unhomed axis
variable_is_kinematic_position_overriden = False
gcode =
{% if printer["gcode_macro MAYBE_HOME"].is_kinematic_position_overriden|lower == 'true' %}
RATOS_ECHO MSG="SET_CENTER_KINEMATIC_POSITION has been abused. Homing all axes. Please refrain from using SET_CENTER_KINEMATIC_POSITION outside of debugging purposes."
G28
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=False
{% else %}
{% set axes = '' %}
{% set isHomed = true %}
{% set axesToHome = '' %}
{% if params.X is defined %}
{% set axes = axes ~ 'X ' %}
{% if 'x' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'X ' %}
{% endif %}
{% endif %}
{% if params.Y is defined %}
{% set axes = axes ~ 'Y ' %}
{% if 'y' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Y ' %}
{% endif %}
{% endif %}
{% if params.Z is defined %}
{% set axes = axes ~ 'Z ' %}
{% if 'z' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Z ' %}
{% endif %}
{% endif %}
{% if params.X is not defined and params.Y is not defined and params.Z is not defined %}
{% set axes = '' %}
{% if 'x' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'X ' %}
{% endif %}
{% if 'y' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Y ' %}
{% endif %}
{% if 'z' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Z ' %}
{% endif %}
{% endif %}
{% if isHomed is false %}
RATOS_ECHO MSG="Homing {axesToHome}"
G28 {axesToHome}
{% else %}
RATOS_ECHO MSG="All requested axes already homed, skipping.."
{% endif %}
{% endif %}
[gcode_macro PID_CALIBRATE_HOTEND]
description = Perform a PID calibration test for a given extruder heater.
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set temp = params.TEMP|default(220)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_HOTEND" MSG="TEMP={temp}"
{% if printer["dual_carriage"] is not defined %}
RATOS_ECHO MSG="PID calibration hotend heater T0 at {temp}°C..."
PID_CALIBRATE HEATER=extruder TARGET={temp}
_CONSOLE_SAVE_CONFIG
{% else %}
{% if toolhead==0 or toolhead==1 %}
RATOS_ECHO MSG="PID calibration hotend heater T{toolhead} at {temp}°C..."
PID_CALIBRATE HEATER=extruder{'' if toolhead==0 else toolhead} TARGET={temp}
_CONSOLE_SAVE_CONFIG
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
_LEARN_MORE_CALIBRATION
[gcode_macro PID_CALIBRATE_BED]
description = Perform a PID calibration test for the bed heater.
gcode =
{% set temp = params.TEMP|default(80)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_BED" MSG="TEMP={temp}"
RATOS_ECHO MSG="PID calibration bed heater at {temp}°C..."
PID_CALIBRATE HEATER=heater_bed TARGET={temp}
_CONSOLE_SAVE_CONFIG
_LEARN_MORE_CALIBRATION
[gcode_macro PID_CALIBRATE_CHAMBER_HEATER]
description = Perform a PID calibration test for the chamber heater.
gcode =
{% set temp = params.TEMP|default(150)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_CHAMBER_HEATER" MSG="TEMP={temp}"
{% if printer["heater_generic chamber_heater"] is defined %}
RATOS_ECHO MSG="PID calibration chamber heater at {temp}°C..."
PID_CALIBRATE HEATER=chamber_heater TARGET={temp}
_CONSOLE_SAVE_CONFIG
_LEARN_MORE_CALIBRATION
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_heater" %}
{% set link_text = "RatOS Chamber Heater" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber heater found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro INITIALIZE_PA_TUNING]
description = Start a pressure advance tuning tower.
gcode =
{% set start = params.START|default(0.0)|float %}
{% set factor = params.FACTOR|default(0.001)|float %}
{% set layer_number = printer["gcode_macro _ON_LAYER_CHANGE"].layer_number|default(0)|int %}
{% set is_printing_gcode = true if printer["gcode_macro START_PRINT"].is_printing_gcode|default(true)|lower == 'true' else false %}
{% if is_printing_gcode and layer_number < 2 %}
DEBUG_ECHO PREFIX="START_PA_TOWER" MSG="START: {start}, FACTOR: {factor}"
RATOS_ECHO MSG="Starting presssure advance tuning tower..."
TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START={start} FACTOR={factor}
{% endif %}
_LEARN_MORE_CALIBRATION
[gcode_macro CHAMBER_FILTER_ON]
gcode =
{% if printer["fan_generic filter"] is defined %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Activating chamber filter..."
_CHAMBER_FILTER_TURN_ON
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber filter found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro CHAMBER_FILTER_OFF]
gcode =
{% if printer["fan_generic filter"] is defined %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Deactivating chamber filter..."
_CHAMBER_FILTER_TURN_OFF
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber filter found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro _CHAMBER_FILTER_ON]
gcode =
{% set at = params.AT|default('')|lower %}
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set chamber_filter_enable_at = printer["gcode_macro RatOS"].chamber_filter_enable_at|default('after_print_start')|lower %}
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_ON" MSG="at: {at}, chamber_filter_enable: {chamber_filter_enable}, chamber_filter_enable_at: {chamber_filter_enable_at}, chamber_filter_speed: {chamber_filter_speed}"
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if chamber_filter_enable_at == at %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Activating chamber filter..."
_CHAMBER_FILTER_TURN_ON AT={at}
{% if chamber_filter_enable_at == "print_end" %}
_LED_CHAMBER_FILTER_ON
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _CHAMBER_FILTER_OFF]
gcode =
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set filter_disable_period = printer["gcode_macro RatOS"].chamber_filter_disable_period|default(0)|int %}
{% set filter_disable_bed_temp = printer["gcode_macro RatOS"].chamber_filter_disable_bed_temp|default(0)|int %}
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_OFF" MSG="chamber_filter_enable: {chamber_filter_enable}, filter_disable_period: {filter_disable_period}, filter_disable_bed_temp: {filter_disable_bed_temp}"
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if filter_disable_period > 0 %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Waiting {filter_disable_period} seconds before turning chamber filter off..."
UPDATE_DELAYED_GCODE ID=_CHAMBER_FILTER_OFF_TIMER DURATION={filter_disable_period}
{% endif %}
{% if filter_disable_bed_temp > 0 %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Waiting for bed temp to cool down to {filter_disable_bed_temp}°C to turn filter off..."
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM=0 MAXIMUM={filter_disable_bed_temp}
_CHAMBER_FILTER_TURN_OFF
_LED_CHAMBER_FILTER_OFF
{% endif %}
{% endif %}
[delayed_gcode _CHAMBER_FILTER_OFF_TIMER]
gcode =
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_OFF_TIMER" MSG="executed"
_CHAMBER_FILTER_TURN_OFF
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Chamber filter turned off!"
_LED_CHAMBER_FILTER_OFF
[gcode_macro _CHAMBER_FILTER_TURN_ON]
gcode =
{% set at = params.AT|default('')|lower %}
{% set chamber_filter_speed = printer["gcode_macro RatOS"].chamber_filter_speed|default(0)|float %}
{% if at == "print_end" %}
{% set chamber_filter_speed = printer["gcode_macro RatOS"].chamber_filter_disable_speed|default(0)|float %}
{% endif %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_FILTER_OFF_TIMER DURATION=0
SET_FAN_SPEED FAN=filter SPEED={chamber_filter_speed}
[gcode_macro _CHAMBER_FILTER_TURN_OFF]
gcode =
SET_FAN_SPEED FAN=filter SPEED=0
[gcode_macro _CHAMBER_FILTER_SANITY_CHECK]
gcode =
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set filter_disable_period = printer["gcode_macro RatOS"].chamber_filter_disable_period|default(0)|int %}
{% set filter_disable_bed_temp = printer["gcode_macro RatOS"].chamber_filter_disable_bed_temp|default(0)|int %}
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if filter_disable_bed_temp > 0 and filter_disable_period > 0 %}
_LEARN_MORE_CHAMBER_FILTER
{action_respond_info("Wrong chamber filter options configured! Set 'filter_disable_bed_temp' or 'filter_disable_period' variable, not both.")}
{% endif %}
{% if filter_disable_bed_temp == 0 and filter_disable_period == 0 %}
_LEARN_MORE_CHAMBER_FILTER
{action_respond_info("Wrong chamber filter options configured! Set 'filter_disable_bed_temp' or 'filter_disable_period' variable.")}
{% endif %}
{% endif %}
[gcode_macro CHAMBER_HEATER_ON]
gcode =
{% set chamber_temp = params.CHAMBER_TEMP|default(45)|int %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp} IS_FROM_START_PRINT=False
[gcode_macro CHAMBER_HEATER_OFF]
gcode =
_CHAMBER_HEATER_OFF
[gcode_macro _CHAMBER_HEATER_ON]
variable_chamber_temp = 0
gcode =
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set start_chamber_temp = params.START_CHAMBER_TEMP|default(0)|int %}
{% set is_from_start_print = true if params.IS_FROM_START_PRINT|default(True)|lower == 'true' else false %}
{% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set chamber_heater_enable = true if printer["gcode_macro RatOS"].chamber_heater_enable|default(true)|lower == 'true' else false %}
{% set chamber_heater_bed_temp = printer["gcode_macro RatOS"].chamber_heater_bed_temp|default(115)|int %}
{% set chamber_heater_preheating_temp = printer["gcode_macro RatOS"].chamber_heater_preheating_temp|default(150)|int %}
{% set chamber_heater_heating_temp_offset = printer["gcode_macro RatOS"].chamber_heater_heating_temp_offset|default(20)|int %}
{% set chamber_heater_control_external_heater = true if printer["gcode_macro RatOS"].chamber_heater_control_external_heater|default(true)|lower == 'true' else false %}
{% set chamber_heater_air_circulation_enable = true if printer["gcode_macro RatOS"].chamber_heater_air_circulation_enable|default(true)|lower == 'true' else false %}
{% set chamber_heater_air_circulation_fan_speed = printer["gcode_macro RatOS"].chamber_heater_air_circulation_fan_speed|default(0.35)|float %}
{% set chamber_heater_air_circulation_y_pos = printer["gcode_macro RatOS"].chamber_heater_air_circulation_y_pos|default(0)|float %}
{% set chamber_heater_air_circulation_z_pos = printer["gcode_macro RatOS"].chamber_heater_air_circulation_z_pos|default(100)|float %}
DEBUG_ECHO PREFIX="_CHAMBER_HEATER_ON" MSG="chamber_heater_enable: {chamber_heater_enable}, chamber_heater_preheating_temp: {chamber_heater_preheating_temp}, chamber_heater_heating_temp_offset: {chamber_heater_heating_temp_offset}, bed_temp: {bed_temp}, chamber_temp: {chamber_temp}, start_chamber_temp: {start_chamber_temp}"
{% if chamber_heater_enable and chamber_temp > 0 and chamber_heater_bed_temp > 0 %}
_LED_HEATING
RATOS_ECHO MSG="Preheating chamber to {(start_chamber_temp if start_chamber_temp > 0 else chamber_temp)}°C..."
{% set chamber_temp_sensor = "extruder" %}
{% if printer["dual_carriage"] is defined and default_toolhead == 1 %}
{% set chamber_temp_sensor = "extruder1" %}
{% endif %}
{% if printer["temperature_sensor chamber"] is defined %}
{% set chamber_temp_sensor = "temperature_sensor chamber" %}
{% endif %}
{% set current_chamber_temp = printer['%s' % chamber_temp_sensor].temperature|int %}
{% set needs_heating = current_chamber_temp < (start_chamber_temp if start_chamber_temp > 0 else chamber_temp) %}
{% if needs_heating %}
_USER_CHAMBER_HEATER_BEFORE_PREHEATING
{% endif %}
{% if needs_heating %}
{% if chamber_heater_air_circulation_enable and chamber_heater_air_circulation_fan_speed > 0 %}
{% if not is_from_start_print %}
MAYBE_HOME
{% endif %}
G0 Z{chamber_heater_air_circulation_z_pos} F{z_speed}
G0 Y{chamber_heater_air_circulation_y_pos} F{speed}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={chamber_heater_air_circulation_fan_speed if default_toolhead == 0 else 0}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={chamber_heater_air_circulation_fan_speed if default_toolhead == 1 else 0}
{% else %}
M106 S{(255 * chamber_heater_air_circulation_fan_speed)}
{% endif %}
{% else %}
{% if is_from_start_print %}
G0 Z{z} F{z_speed}
{% endif %}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=_CHAMBER_HEATER_ON VARIABLE=chamber_temp VALUE={chamber_temp}
{% if needs_heating %}
M140 S{chamber_heater_bed_temp}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={chamber_heater_preheating_temp}
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=1.0
{% endif %}
{% endif %}
{% if needs_heating %}
_CHAMBER_HEATER_EXTRA_FAN_ON
{% endif %}
{% if needs_heating %}
TEMPERATURE_WAIT SENSOR="{chamber_temp_sensor}" MINIMUM={(start_chamber_temp if start_chamber_temp > 0 else chamber_temp)}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={(chamber_temp + chamber_heater_heating_temp_offset)}
{% endif %}
{% endif %}
{% if printer["fan_generic filter"] is defined %}
{% if printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float > 0 %}
SET_FAN_SPEED FAN=filter SPEED=0
_CHAMBER_FILTER_ON AT="before_print_start"
{% endif %}
{% endif %}
{% if needs_heating %}
{% if chamber_heater_air_circulation_enable and chamber_heater_air_circulation_fan_speed > 0 %}
G28 Z
{% endif %}
{% endif %}
{% if needs_heating %}
_USER_CHAMBER_HEATER_AFTER_PREHEATING
{% endif %}
{% if printer["temperature_sensor chamber"] is defined %}
{% if printer["heater_generic chamber_heater"] is defined %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined and chamber_heater_control_external_heater %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED=0
SET_FAN_SPEED FAN=part_fan_t1 SPEED=0
{% else %}
M106 S0
{% endif %}
_LED_SUCCESS
{% endif %}
[gcode_macro _CHAMBER_HEATER_OFF]
gcode =
RATOS_ECHO MSG="Deactivating chamber heater..."
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=0
SET_GCODE_VARIABLE MACRO=_CHAMBER_HEATER_ON VARIABLE=chamber_temp VALUE=0
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=0
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=0.0
{% endif %}
_CHAMBER_HEATER_EXTRA_FAN_OFF
[delayed_gcode _CHAMBER_HEATER_CONTROL]
initial_duration = 0.
gcode =
{% set chamber_temp = printer["gcode_macro _CHAMBER_HEATER_ON"].chamber_temp|default(0)|int %}
{% set chamber_heater_heating_temp_offset = printer["gcode_macro RatOS"].chamber_heater_heating_temp_offset|default(20)|int %}
{% set current_chamber_temp = printer['temperature_sensor chamber'].temperature|int %}
{% if current_chamber_temp < chamber_temp %}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={(chamber_temp + chamber_heater_heating_temp_offset)}
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=1.0
{% endif %}
{% endif %}
{% if current_chamber_temp >= chamber_temp %}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=0
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=0.0
{% endif %}
{% endif %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
[gcode_macro _CHAMBER_HEATER_EXTRA_FAN_ON]
gcode =
{% set chamber_heater_extra_fan_speed = printer["gcode_macro RatOS"].chamber_heater_extra_fan_speed|default(0.0)|float %}
{% if printer["fan_generic chamber_heater_extra_fan"] is defined %}
{% if chamber_heater_extra_fan_speed > 0 %}
SET_FAN_SPEED FAN=chamber_heater_extra_fan SPEED={chamber_heater_extra_fan_speed}
{% endif %}
{% endif %}
[gcode_macro _CHAMBER_HEATER_EXTRA_FAN_OFF]
gcode =
{% if printer["fan_generic chamber_heater_extra_fan"] is defined %}
SET_FAN_SPEED FAN=chamber_heater_extra_fan SPEED=0
{% endif %}
[gcode_macro _USER_CHAMBER_HEATER_BEFORE_PREHEATING]
description = Will be executed before chamber preheating, only if heating is needed.
gcode =
[gcode_macro _USER_CHAMBER_HEATER_AFTER_PREHEATING]
description = Will be executed after chamber preheating, only if heating was needed.
gcode =
[gcode_macro _LED_START_PRINTING]
gcode =
_LED_ACTION
[gcode_macro _LED_START_PRINTING_ERROR]
gcode =
_LED_ERROR
[gcode_macro _LED_PRINTING]
gcode =
_LED_ON TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_PAUSE]
gcode =
_LED_ACTION
[gcode_macro _LED_CHAMBER_FILTER_ON]
gcode =
_LED_ACTION
[gcode_macro _LED_CHAMBER_FILTER_OFF]
gcode =
_LED_STANDBY
[gcode_macro _LED_LOADING_FILAMENT]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_LOADED]
gcode =
_LED_SUCCESS TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_RUNOUT]
gcode =
_LED_ERROR TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_CLOG]
gcode =
_LED_ERROR TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_UNLOADING_FILAMENT]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_UNLOADED]
gcode =
_LED_SUCCESS TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_DEACTIVATE_TOOLHEAD]
gcode =
_LED_OFF TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_TOOLHEAD_STANDBY]
gcode =
_LED_STANDBY TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_TOOLHEAD_WAKEUP]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_MOTORS_OFF]
gcode =
_LED_STANDBY
_LED_VAOC_OFF
[gcode_macro _LED_INPUT_SHAPER_START]
gcode =
_LED_ACTION
[gcode_macro _LED_INPUT_SHAPER_END]
gcode =
_LED_ON
[gcode_macro _LED_BEACON_CALIBRATION_START]
gcode =
_LED_ACTION
[gcode_macro _LED_BEACON_CALIBRATION_END]
gcode =
_LED_ON
[gcode_macro _LED_BEACON_CALIBRATION_ERROR]
gcode =
_LED_ERROR
[gcode_macro _LED_VAOC_ON]
gcode =
{% if printer['neopixel vaoc_led'] is defined %}
SET_LED LED=vaoc_led RED=1.0 GREEN=1.0 BLUE=1.0
{% endif %}
[gcode_macro _LED_VAOC_OFF]
gcode =
{% if printer['neopixel vaoc_led'] is defined %}
SET_LED LED=vaoc_led RED=0.0 GREEN=0.0 BLUE=0.0
{% endif %}
[gcode_macro _LED_ACTION]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_action %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_SUCCESS]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_success %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_HEATING]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_heating %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_COOLING]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_cooling %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_ERROR]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_error %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_ON]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_on %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_OFF]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_off %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_STANDBY]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_standby %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_SET]
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set r = params.R|default(0)|float %}
{% set g = params.G|default(0)|float %}
{% set b = params.B|default(0)|float %}
{% if toolhead >= 0 %}
{% if printer['neopixel nozzle_led_t%s' % toolhead] is defined %}
SET_LED LED={'nozzle_led_t%s' % toolhead} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% else %}
{% if printer['neopixel nozzle_led_t0'] is defined %}
SET_LED LED={'nozzle_led_t0'} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% if printer['neopixel nozzle_led_t1'] is defined %}
SET_LED LED={'nozzle_led_t1'} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% endif %}
_USER_LED_SET { rawparams }
[gcode_macro _USER_LED_SET]
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set r = params.R|default(0)|float %}
{% set g = params.G|default(0)|float %}
{% set b = params.B|default(0)|float %}
[gcode_macro LOAD_FILAMENT]
description = Loads new filament. Note: be careful with PETG, make sure you inspect the tip of your filament before loading to avoid jams.
variable_ignore_min_extrude_temp = True
gcode =
_LEARN_MORE_FILAMENT
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set filament_name = params._NAME|default('')|string %}
{% set filament_type = params._TYPE|default('')|string %}
{% if filament_name == '' or filament_type == '' %}
{% set filament_name = 'unknown' %}
{% set filament_type = 'unknown' %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
_DEFAULT_LOAD_FILAMENT TEMP={temp} NAME={filament_name} TYPE={filament_type}
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Loading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead==0 or toolhead==1 %}
_IDEX_LOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead} NAME={filament_name} TYPE={filament_type}
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
[gcode_macro _DEFAULT_LOAD_FILAMENT]
description = Load filament macro for non IDEX printers.
gcode =
{% set temp = params.TEMP|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_DEFAULT_LOAD_FILAMENT" MSG="TEMP={temp}"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
_LED_LOADING_FILAMENT TOOLHEAD=0
SAVE_GCODE_STATE NAME=load_state
{% if printer.extruder.temperature|int < temp or printer.extruder.can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating extruder to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={temp}
_LOAD_FILAMENT TOOLHEAD=0
RESTORE_GCODE_STATE NAME=load_state
{% if filament_name != '' and filament_type != '' %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('{filament_type}', '{filament_name}', {temp})"
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={temp}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
_LED_FILAMENT_LOADED TOOLHEAD=0
[gcode_macro _IDEX_LOAD_FILAMENT]
description = Load filament macro for IDEX printer.
gcode =
{% set temp = params.TEMP|int %}
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_IDEX_LOAD_FILAMENT" MSG="TEMP: {temp}, TOOLHEAD: {toolhead}"
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_LOADING_FILAMENT TOOLHEAD={toolhead}
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
{% if not printer.pause_resume.is_paused %}
{% if printer[target_extruder].temperature|int < temp or printer[target_extruder].can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating T{toolhead} to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={temp}
{% endif %}
_LOAD_FILAMENT TOOLHEAD={toolhead} TEMP={temp}
{% if filament_name != '' and filament_type != '' %}
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('{filament_type}', '{filament_name}', {temp})"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='"{filament_name}"'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='"{filament_type}"'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE={temp}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_ok}"'
_LED_FILAMENT_LOADED TOOLHEAD={toolhead}
[gcode_macro _LOAD_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT" MSG="TOOLHEAD: {toolhead}"
_MOVE_TO_LOADING_POSITION TOOLHEAD={toolhead}
_LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE TOOLHEAD={toolhead}
_LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE TOOLHEAD={toolhead}
_CLEANING_MOVE TOOLHEAD={toolhead}
[gcode_macro _LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set extruder_load_speed = printer["gcode_macro T%s" % toolhead].extruder_load_speed|float * 60 %}
{% set extruder_gear_to_cooling_position_distance = printer["gcode_macro T%s" % toolhead].extruder_gear_to_cooling_position_distance|float %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Loading filament into hotend.."
G92 E0
G0 E{extruder_gear_to_cooling_position_distance} F{extruder_load_speed}
G92 E0
M400
RATOS_ECHO MSG="Filament loaded into hotend."
[gcode_macro _LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set load_speed = printer["gcode_macro T%s" % toolhead].filament_load_speed|float * 60 %}
{% set filament_loading_nozzle_offset = printer["gcode_macro T%s" % toolhead].filament_loading_nozzle_offset|float %}
{% set cooling_position_to_nozzle_distance = printer["gcode_macro T%s" % toolhead].cooling_position_to_nozzle_distance|float %}
{% set purge_after_load = printer["gcode_macro T%s" % toolhead].purge_after_load|float %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Loading filament into nozzle... Please wait!"
G92 E0
G0 E{cooling_position_to_nozzle_distance + filament_loading_nozzle_offset} F{load_speed}
G92 E0
G4 P1000
_PURGE_FILAMENT TOOLHEAD={toolhead} E={purge_after_load}
RATOS_ECHO MSG="Filament loaded into nozzle!"
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_INSERT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_INSERT" MSG="TOOLHEAD: {toolhead}"
{% set filament_grabbing_length = printer["gcode_macro T%s" % toolhead].filament_grabbing_length|float %}
{% set filament_grabbing_speed = printer["gcode_macro T%s" % toolhead].filament_grabbing_speed|float %}
{% set resume_after_insert = true if printer["gcode_macro T%s" % toolhead].resume_after_insert|default(true)|lower == 'true' else false %}
{% set enable_insert_detection = true if printer["gcode_macro T%s" % toolhead].enable_insert_detection|default(true)|lower == 'true' else false %}
{% set current_idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% if enable_insert_detection %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_INSERT" MSG="toolhead: {toolhead}, filament_grabbing_length: {filament_grabbing_length}, filament_grabbing_speed: {filament_grabbing_speed}, current_idex_mode: {current_idex_mode}"
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Loading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
FORCE_MOVE STEPPER={'extruder%s' % ('' if toolhead == 0 else toolhead)} DISTANCE={filament_grabbing_length} VELOCITY={filament_grabbing_speed}
M400
{% if printer.pause_resume.is_paused %}
LOAD_FILAMENT TOOLHEAD={toolhead}
{% if resume_after_insert %}
RESUME
{% endif %}
{% else %}
{% if not printer.virtual_sdcard.is_active %}
LOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_INSERT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_INSERT" MSG="TOOLHEAD: {toolhead}"
[gcode_macro _PURGE_BEFORE_UNLOAD]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set purge_before_unload = printer["gcode_macro T%s" % toolhead].purge_before_unload|float %}
DEBUG_ECHO PREFIX="_PURGE_BEFORE_UNLOAD" MSG="TOOLHEAD: {toolhead}"
{% if purge_before_unload > 0 %}
G92 E0
G0 E{purge_before_unload} F300
G92 E0
M400
{% endif %}
[gcode_macro _PURGE_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set e = params.E|int %}
{% set r = params.R|default(0)|int %}
DEBUG_ECHO PREFIX="_PURGE_FILAMENT" MSG="TOOLHEAD: {toolhead}, E: {e}"
{% if e > 0 %}
G92 E0
G0 E{e} F300
G92 E0
M400
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={0.4 if toolhead == 0 else 0}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={0.4 if toolhead == 1 else 0}
{% else %}
M106 S{(255 * 0.4)}
{% endif %}
{% endif %}
G4 P3000
{% if r > 0 %}
G92 E0
G0 E-{r} F300
G92 E0
M400
{% endif %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED=0
SET_FAN_SPEED FAN=part_fan_t1 SPEED=0
{% else %}
M106 S0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _MOVE_TO_PARKING_POSITION]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_MOVE_TO_PARKING_POSITION" MSG="TOOLHEAD: {toolhead}"
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].parking_position is defined %}
{% set parking_position = printer["gcode_macro T%s" % toolhead].parking_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
G1 X{parking_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _MOVE_TO_LOADING_POSITION]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_MOVE_TO_LOADING_POSITION" MSG="TOOLHEAD: {toolhead}"
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].loading_position is defined %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% set act_t = 1 if idex_mode == 'primary' else 0 %}
{% if act_t == toolhead %}
{% set loading_position = printer["gcode_macro T%s" % toolhead].loading_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
G1 X{loading_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _CLEANING_MOVE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].parking_position is defined and printer["gcode_macro T%s" % toolhead].loading_position is defined %}
{% set loading_position = printer["gcode_macro T%s" % toolhead].loading_position|float %}
{% set parking_position = printer["gcode_macro T%s" % toolhead].parking_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
{% set cleaning_position = loading_position %}
{% if loading_position == parking_position %}
{% if loading_position > 0 %}
{% set cleaning_position = loading_position - 30 %}
{% else %}
{% set cleaning_position = loading_position + 30 %}
{% endif %}
{% endif %}
G1 X{parking_position} F{speed}
G1 X{cleaning_position} F{speed}
G1 X{parking_position} F{speed}
G1 X{cleaning_position} F{speed}
G1 X{parking_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _START_PRINT_BED_MESH]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="start_print_bed_mesh"
SET_MACRO_TRAVEL_SETTINGS
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set X=[params.X0|default(-1)|float, params.X1|default(-1)|float] %}
{% set Y=[params.Y0|default(-1)|float, params.Y1|default(-1)|float] %}
DEBUG_ECHO PREFIX="_START_PRINT_BED_MESH" MSG="idex_mode: {idex_mode}, X: {X}, Y: {Y}"
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set X=[0, printable_x_max] %}
{% endif %}
{% set beacon_bed_mesh_scv = printer["gcode_macro RatOS"].beacon_bed_mesh_scv|default(25)|int %}
{% set beacon_contact_bed_mesh_samples = printer["gcode_macro RatOS"].beacon_contact_bed_mesh_samples|default(2)|int %}
{% set beacon_contact_bed_mesh = true if printer["gcode_macro RatOS"].beacon_contact_bed_mesh|default(false)|lower == 'true' else false %}
{% if printer.configfile.settings.beacon is defined and not beacon_contact_bed_mesh %}
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={beacon_bed_mesh_scv}
{% endif %}
{% set default_profile = printer["gcode_macro RatOS"].bed_mesh_profile|default('ratos') %}
{% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %}
BED_MESH_CLEAR
{% if printer["gcode_macro RatOS"].adaptive_mesh|lower == 'true' %}
CALIBRATE_ADAPTIVE_MESH PROFILE={default_profile} X0={X[0]} X1={X[1]} Y0={Y[0]} Y1={Y[1]} T={params.T|int} BOTH_TOOLHEADS={params.BOTH_TOOLHEADS} IDEX_MODE={idex_mode}
{% else %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% endif %}
BED_MESH_PROFILE LOAD={default_profile}
{% elif printer["gcode_macro RatOS"].bed_mesh_profile is defined %}
BED_MESH_CLEAR
BED_MESH_PROFILE LOAD={printer["gcode_macro RatOS"].bed_mesh_profile}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print_bed_mesh"
[gcode_macro CALIBRATE_ADAPTIVE_MESH]
gcode =
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_bed_mesh_samples = printer["gcode_macro RatOS"].beacon_contact_bed_mesh_samples|default(2)|int %}
{% set beacon_contact_bed_mesh = true if printer["gcode_macro RatOS"].beacon_contact_bed_mesh|default(false)|lower == 'true' else false %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set default_profile = params.PROFILE %}
{% set x0 = params.X0|default(-1)|float %}
{% set y0 = params.Y0|default(-1)|float %}
{% set x1 = params.X1|default(-1)|float %}
{% set y1 = params.Y1|default(-1)|float %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Recieved coordinates X0={x0} Y0={y0} X1={x1} Y1={y1}"
{% if x0 >= x1 or y0 >= y1 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Invalid coordinates received. Please check your slicer settings. Falling back to full bed mesh."
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% else %}
{% set mesh_config = printer.configfile.config.bed_mesh %}
{% set min_x = mesh_config.mesh_min.split(",")[0]|float %}
{% set min_y = mesh_config.mesh_min.split(",")[1]|float %}
{% set max_x = mesh_config.mesh_max.split(",")[0]|float %}
{% set max_y = mesh_config.mesh_max.split(",")[1]|float %}
{% set mesh_x0 = [[x0, max_x]|min, min_x]|max %}
{% set mesh_y0 = [[y0, max_y]|min, min_y]|max %}
{% set mesh_x1 = [[x1, max_x]|min, min_x]|max %}
{% set mesh_y1 = [[y1, max_y]|min, min_y]|max %}
{% if mesh_x0 == min_x and mesh_y0 == min_y and mesh_x1 == max_x and mesh_y1 == max_y %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Print is using the full bed, falling back to full bed mesh."
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% else %}
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
DEPLOY_PROBE
{% endif %}
{% set probe_count_x = mesh_config.probe_count.split(",")[0]|int %}
{% if mesh_config.probe_count.split(",")|length == 2 %}
{% set probe_count_y = mesh_config.probe_count.split(",")[1]|int %}
{% else %}
{% set probe_count_y = mesh_config.probe_count.split(",")[0]|int %}
{% endif %}
{% set probe_x_step = (max_x - min_x) / probe_count_x %}
{% set probe_y_step = (max_y - min_y) / probe_count_y %}
{% set mesh_count_x = ([(mesh_x1 - mesh_x0) / probe_x_step, 3]|max)|int %}
{% set mesh_count_y = ([(mesh_y1 - mesh_y0) / probe_y_step, 3]|max)|int %}
{% set min_mesh_count = [mesh_count_x, mesh_count_y]|min %}
{% set max_mesh_count = [mesh_count_x, mesh_count_y]|max %}
{% set algorithm = mesh_config.algorithm %}
{% if algorithm|lower == 'lagrange' and max_mesh_count > 6 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="cannot exceed a probe_count of 6 when using lagrange interpolation. Falling back to bicubic interpolation."
{% set algorithm = 'bicubic' %}
{% endif %}
{% if algorithm|lower == 'bicubic' and min_mesh_count < 4 %}
{% if max_mesh_count > 6 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="invalid probe_count option when using bicubic interpolation. Combination of 3 points on one axis with more than 6 on another is not permitted. Forcing minimum mesh count to be 4."
{% set min_mesh_count = 4 %}
{% else %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="bicubic interpolation with a probe_count of less than 4 points detected. Forcing lagrange interpolation."
{% set algorithm = 'lagrange' %}
{% endif %}
{% endif %}
{% set mesh_count_x = ([min_mesh_count, mesh_count_x]|max)|int %}
{% set mesh_count_x = ([max_mesh_count, mesh_count_x]|min)|int %}
{% set mesh_count_y = ([min_mesh_count, mesh_count_y]|max)|int %}
{% set mesh_count_y = ([max_mesh_count, mesh_count_y]|min)|int %}
{% set should_prime = printer["gcode_macro RatOS"].nozzle_priming == 'primeblob' %}
{% if printer["dual_carriage"] is not defined %}
{% set probe_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printable_y_max) < printable_y_max / 2 %}
{% else %}
{% set probe_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printable_y_max) < printable_y_max / 2 %}
{% endif %}
{% if printer.configfile.settings.beacon is defined and printer.configfile.settings.beacon.mesh_runs % 2 != 0 and probe_first %}
{% set probe_first = false %}
{% elif printer.configfile.settings.beacon is defined and printer.configfile.settings.beacon.mesh_runs % 2 == 0 and not probe_first %}
{% set probe_first = true %}
{% endif %}
{% if should_prime and probe_first %}
{% if printer["dual_carriage"] is not defined %}
PROBE_FOR_PRIMING
{% else %}
{% if both_toolheads %}
PROBE_FOR_PRIMING TOOLHEAD=0 IDEX_MODE={idex_mode}
PROBE_FOR_PRIMING TOOLHEAD=1 IDEX_MODE={idex_mode}
{% else %}
PROBE_FOR_PRIMING TOOLHEAD={params.T|int} IDEX_MODE={idex_mode}
{% endif %}
{% endif %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="mesh coordinates X0={mesh_x0} Y0={mesh_y0} X1={mesh_x1} Y1={mesh_y1}"
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile} ALGORITHM={algorithm} MESH_MIN={mesh_x0},{mesh_y0} MESH_MAX={mesh_x1},{mesh_y1} PROBE_COUNT={mesh_count_x},{mesh_count_y} RELATIVE_REFERENCE_INDEX=-1
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile} ALGORITHM={algorithm} MESH_MIN={mesh_x0},{mesh_y0} MESH_MAX={mesh_x1},{mesh_y1} PROBE_COUNT={mesh_count_x},{mesh_count_y} RELATIVE_REFERENCE_INDEX=-1
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% if should_prime and not probe_first %}
{% if printer["dual_carriage"] is not defined %}
PROBE_FOR_PRIMING
{% else %}
{% if both_toolheads %}
PROBE_FOR_PRIMING TOOLHEAD=0 IDEX_MODE={idex_mode}
PROBE_FOR_PRIMING TOOLHEAD=1 IDEX_MODE={idex_mode}
{% else %}
PROBE_FOR_PRIMING TOOLHEAD={params.T|int} IDEX_MODE={idex_mode}
{% endif %}
{% endif %}
{% endif %}
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
STOW_PROBE
{% endif %}
{% endif %}
{% endif %}
[gcode_macro M84]
rename_existing = M84.1
gcode =
M84.1
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
{% if printer["dual_carriage"] is defined %}
_SET_TOOLHEAD_OFFSET T={printer["gcode_macro RatOS"].default_toolhead|int} MOVE=0
SET_GCODE_VARIABLE MACRO=SET_PRESSURE_ADVANCE VARIABLE=snyc_toolheads VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_REMAP_TOOLHEADS VARIABLE=enabled VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% if printer["gcode_macro _VAOC"] is defined %}
SET_GCODE_VARIABLE MACRO=_VAOC VARIABLE=is_started VALUE=False
SET_GCODE_VARIABLE MACRO=_VAOC VARIABLE=is_started_at_temp VALUE=False
{% endif %}
SET_GCODE_OFFSET X=0 Y=0 Z=0 MOVE=0
_IDEX_SINGLE INIT=1
{% endif %}
SET_SKEW CLEAR=1
_LED_MOTORS_OFF
[gcode_macro M104]
rename_existing = M104.1
gcode =
{% set s = params.S|default(0)|int %}
{% set t = params.T|default(-1)|int %}
{% set t = 0 if t == -1 else t %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
DEBUG_ECHO PREFIX="M104" MSG="s: {s}, t: {t}"
{% if printer["gcode_macro T%s" % t] is defined %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set temperature_offset_t0 = printer["gcode_macro T0"].temperature_offset|default(0)|int %}
{% set temperature_offset_t1 = printer["gcode_macro T1"].temperature_offset|default(0)|int %}
{% set s0 = [s + temperature_offset_t0, 0]|max %}
{% set s1 = [s + temperature_offset_t1, 0]|max %}
{% if temperature_offset_t0 != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset_t0}°C added to toolhead T0."
{% endif %}
{% if temperature_offset_t1 != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset_t1}°C added to toolhead T1."
{% endif %}
{% else %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set s = [s + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
{% set is_in_standby = false %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% if toolchange_standby_temp > -1 %}
{% set is_in_standby = true if printer["gcode_macro T%s" % t].standby|default(false)|lower == 'true' else false %}
{% endif %}
{% endif %}
{% if not is_in_standby %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
M104.1 S{s0} T0
M104.1 S{s1} T1
{% else %}
M104.1 S{s} T{t}
{% endif %}
{% endif %}
[gcode_macro M109]
rename_existing = M109.1
gcode =
{% set s = params.S|default(0)|int %}
{% set t = params.T|default(-1)|int %}
{% set t = 0 if t == -1 else t %}
DEBUG_ECHO PREFIX="M109" MSG="s: {s}, t: {t}"
{% if printer["gcode_macro T%s" % t] is defined %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set s = [s + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="M109" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% set is_in_standby = false %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% if toolchange_standby_temp > -1 %}
{% set is_in_standby = true if printer["gcode_macro T%s" % t].standby|default(false)|lower == 'true' else false %}
{% endif %}
{% endif %}
{% if not is_in_standby %}
M109.1 S{s} T{t}
{% endif %}
[gcode_macro SET_HEATER_TEMPERATURE]
rename_existing = SET_HEATER_TEMPERATURE_BASE
gcode =
{% set heater = params.HEATER|default("") %}
{% set target = params.TARGET|default(0)|int %}
DEBUG_ECHO PREFIX="SET_HEATER_TEMPERATURE" MSG="heater: {heater}, target: {target}"
{% if heater|lower == "extruder" or heater|lower == "extruder1" %}
{% set t = 0 if heater|lower == "extruder" else 1 %}
{% if printer["gcode_macro T%s" % t] is defined and target > 0 %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set target = [target + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="SET_HEATER_TEMPERATURE" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
SET_HEATER_TEMPERATURE_BASE HEATER="{heater}" TARGET={target}
[gcode_macro TEMPERATURE_WAIT]
rename_existing = TEMPERATURE_WAIT_BASE
gcode =
{% set sensor = params.SENSOR|default("") %}
{% set minimum = params.MINIMUM|default(-1)|int %}
{% set maximum = params.MAXIMUM|default(-1)|int %}
DEBUG_ECHO PREFIX="TEMPERATURE_WAIT" MSG="sensor: {sensor}, minimum: {minimum}, maximum: {maximum}"
{% if sensor|lower == "extruder" or sensor|lower == "extruder1" %}
{% set t = 0 if sensor|lower == "extruder" else 1 %}
{% if printer["gcode_macro T%s" % t] is defined and (minimum > 0 or maximum > 0) %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% if minimum > -1 %}
{% set minimum = [minimum + temperature_offset, 0]|max %}
{% endif %}
{% if maximum > -1 %}
{% set maximum = [maximum + temperature_offset, 0]|max %}
{% endif %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
{% if minimum > -1 and maximum > -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MINIMUM: {minimum}, MAXIMUM: {maximum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MINIMUM={minimum} MAXIMUM={maximum}
{% elif minimum > -1 and maximum == -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MINIMUM: {minimum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MINIMUM={minimum}
{% elif minimum == -1 and maximum > -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MAXIMUM: {maximum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MAXIMUM={maximum}
{% endif %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Temperature for toolhead T{t} reached."
[gcode_macro SET_GCODE_OFFSET]
rename_existing = SET_GCODE_OFFSET_ORG
gcode =
SET_GCODE_OFFSET_ORG { rawparams }
{% if printer.configfile.settings.beacon is defined and (params.Z_ADJUST is defined or params.Z is defined) %}
_BEACON_APPLY_RUNTIME_MULTIPLIER
{% endif %}
[gcode_macro SDCARD_PRINT_FILE]
rename_existing = SDCARD_PRINT_FILE_BASE
gcode =
{% if printer["ratos"] is defined %}
PROCESS_GCODE_FILE { rawparams }
{% else %}
SDCARD_PRINT_FILE_BASE { rawparams }
{% endif %}
[gcode_macro SKEW_PROFILE]
rename_existing = SKEW_PROFILE_BASE
variable_loaded_profile = ""
gcode =
{% if params.LOAD is defined %}
{% if printer.configfile.settings["skew_correction %s" % params.LOAD] is defined %}
SET_GCODE_VARIABLE MACRO=SKEW_PROFILE VARIABLE=loaded_profile VALUE='"{params.LOAD}"'
{% endif %}
{% endif %}
SKEW_PROFILE_BASE { rawparams }
[gcode_macro SET_SKEW]
rename_existing = SET_SKEW_BASE
gcode =
{% if params.CLEAR is defined %}
{% if params.CLEAR|default(0)|int == 1 %}
SET_GCODE_VARIABLE MACRO=SKEW_PROFILE VARIABLE=loaded_profile VALUE='""'
{% endif %}
{% endif %}
SET_SKEW_BASE { rawparams }
[gcode_macro SET_VELOCITY_LIMIT]
rename_existing = SET_VELOCITY_LIMIT_BASE
gcode =
{% if params.ACCEL_TO_DECEL is defined %}
{% if params.ACCEL is defined %}
{% set accel = params.ACCEL|float %}
{% else %}
{% set accel = printer.toolhead.max_accel|float %}
{% endif %}
{% if params.VELOCITY is defined %}
{% set velocity = params.VELOCITY|float %}
{% else %}
{% set velocity = printer.toolhead.max_velocity|float %}
{% endif %}
{% if params.SQUARE_CORNER_VELOCITY is defined %}
{% set scv = params.SQUARE_CORNER_VELOCITY|float %}
{% else %}
{% set scv = printer.toolhead.square_corner_velocity|float %}
{% endif %}
{% set mcr = params.ACCEL_TO_DECEL|float / accel %}
DEBUG_ECHO PREFIX="SET_VELOCITY_LIMIT" MSG="ACCEL={accel}, VELOCITY={velocity}, SQUARE_CORNER_VELOCITY={scv}, MINIMUM_CRUISE_RATIO={mcr}"
SET_VELOCITY_LIMIT_BASE ACCEL={accel} VELOCITY={velocity} SQUARE_CORNER_VELOCITY={scv} MINIMUM_CRUISE_RATIO={1-mcr}
{% else %}
SET_VELOCITY_LIMIT_BASE { rawparams }
{% endif %}
[gcode_macro _START_PRINT_PARK]
gcode =
{% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set start_print_park_in = printer["gcode_macro RatOS"].start_print_park_in %}
{% set start_print_park_x = printer["gcode_macro RatOS"].start_print_park_x %}
{% if start_print_park_in == 'primeblob' %}
{% set z = 3 %}
{% endif %}
{% if printer["dual_carriage"] is defined and not (printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
{% if printer["gcode_macro RatOS"].start_print_park_x is defined and printer["gcode_macro RatOS"].start_print_park_x != '' %}
RATOS_ECHO PREFIX="WARNING" MSG="start_print_park_x is ignored for IDEX printers"
{% endif %}
PARK_TOOLHEAD
G90
{% endif %}
_PARK LOCATION={start_print_park_in} X={start_print_park_x}
G0 Z{z} F{z_speed}
[gcode_macro _END_PRINT_PARK]
gcode =
{% if printer["dual_carriage"] is defined %}
{% if printer["gcode_macro RatOS"].end_print_park_x is defined and printer["gcode_macro RatOS"].end_print_park_x != '' %}
RATOS_ECHO PREFIX="WARNING" MSG="end_print_park_x is ignored for IDEX printers"
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
_IDEX_SINGLE X={parking_position}
PARK_TOOLHEAD
G90
{% endif %}
_PARK LOCATION={printer["gcode_macro RatOS"].end_print_park_in} X={printer["gcode_macro RatOS"].end_print_park_x}
[gcode_macro _PARK]
gcode =
{% set x = params.X %}
{% set location = params.LOCATION|default('back')|lower %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% set nozzle_priming = printer["gcode_macro RatOS"].nozzle_priming|lower %}
CACHE_TOOLHEAD_SETTINGS KEY="park"
SET_MACRO_TRAVEL_SETTINGS
{% if x != '' %}
{% if x|float >= printer.toolhead.axis_minimum.x + 5 and x|float <= printable_x_max - 5 %}
{% set park_x = x|float %}
{% else %}
{action_respond_info('The requested X co-ordinate is outside the defined axis bounds - using defaults')}
{% set park_x = printable_x_max / 2 %}
{% endif %}
{% else %}
{% set park_x = printable_x_max / 2 %}
{% endif %}
{% if location == 'back' %}
{% set park_y = printable_y_max - 15 %}
{% elif location == 'front' %}
{% set park_y = printer.toolhead.axis_minimum.y + 5 %}
{% elif location == 'center' %}
{% set park_y = printable_y_max / 2 %}
{% elif location == 'primeblob' and printer["dual_carriage"] is defined %}
{% set park_y = printable_y_max - 15 %}
{% endif %}
{% if location == 'primeblob' and printer["dual_carriage"] is not defined %}
{% if (nozzle_priming == 'primeblob' or nozzle_priming == 'primeline') %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set park_x = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set park_x = printable_x_max - 5 %}
{% else %}
{% set park_x = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set park_y = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set park_y = printable_y_max - 5 %}
{% else %}
{% set park_y = nozzle_prime_start_y|float %}
{% endif %}
{% endif %}
{% endif %}
G90
{% if printer["dual_carriage"] is not defined %}
G0 X{park_x} Y{park_y} F{speed}
{% else %}
G0 Y{park_y} F{speed}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="park"
[gcode_macro SAVE_PROBE_RESULT]
gcode =
{% set beacon_contact_prime_probing = true if printer["gcode_macro RatOS"].beacon_contact_prime_probing|default(false)|lower == 'true' else false %}
{% set last_z_offset = 9999.9 %}
{% if printer.configfile.settings.beacon is defined %}
{% set current_z = printer.toolhead.position.z|float %}
{% if beacon_contact_prime_probing %}
{% set last_z_offset = printer.beacon.last_z_result %}
{% else %}
{% set last_z_offset = printer.beacon.last_sample.dist - current_z %}
{% endif %}
{% elif printer.configfile.settings.bltouch is defined %}
{% set config_offset = printer.configfile.settings.bltouch.z_offset|float %}
{% set last_z_offset = printer.probe.last_z_result - config_offset %}
{% elif printer.configfile.settings.probe is defined %}
{% set config_offset = printer.configfile.settings.probe.z_offset|float %}
{% set last_z_offset = printer.probe.last_z_result - config_offset %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Saving offset adjustment of {last_z_offset} in {params.VARIABLE|default('last_z_offset')}"
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE={params.VARIABLE|default('last_z_offset')} VALUE={last_z_offset}
[gcode_macro PROBE_FOR_PRIMING]
gcode =
{% set probe_for_priming_disable_mesh_constraints = true if printer["gcode_macro RatOS"].probe_for_priming_disable_mesh_constraints|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].nozzle_priming|lower != 'false' %}
SAVE_GCODE_STATE NAME=probe_for_priming_state
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the prime location.."
CACHE_TOOLHEAD_SETTINGS KEY="probe_for_priming"
SET_MACRO_TRAVEL_SETTINGS
{% set t = params.TOOLHEAD|default(-1)|int %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% if idex_mode == '' %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set x_start = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set x_start = printable_x_max - 5 %}
{% else %}
{% set x_start = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% else %}
{% set y_start = nozzle_prime_start_y|float %}
{% endif %}
{% else %}
{% set center_x = printable_x_max / 2 %}
{% if t == 0 %}
{% set x_start = 5 %}
{% else %}
{% set x_start = printable_x_max - 5 %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% endif %}
{% endif %}
{% set z = printer.configfile.settings.bed_mesh.horizontal_move_z|float %}
{% set mesh_config = printer.configfile.config.bed_mesh %}
{% if printer.configfile.settings.bltouch is defined %}
{% set x_offset = printer.configfile.settings.bltouch.x_offset|float %}
{% set y_offset = printer.configfile.settings.bltouch.y_offset|float %}
{% set z_offset = printer.configfile.settings.bltouch.z_offset|float %}
{% elif printer.configfile.settings.probe is defined %}
{% set x_offset = printer.configfile.settings.probe.x_offset|float %}
{% set y_offset = printer.configfile.settings.probe.y_offset|float %}
{% set z_offset = printer.configfile.settings.probe.z_offset|float %}
{% elif printer.configfile.settings.beacon is defined %}
{% set x_offset = printer.configfile.settings.beacon.x_offset|float %}
{% set y_offset = printer.configfile.settings.beacon.y_offset|float %}
{% set z_offset = printer.configfile.settings.beacon.trigger_distance|float %}
{% else %}
{ action_raise_error("No probe, beacon or bltouch section found. Adaptive priming only works with a [probe], [beacon] or [bltouch] section defined.") }
{% endif %}
{% if z < z_offset %}
{ action_raise_error("Horizontal move Z ({z}) is below your probe's Z offset ({z_offset}). Please adjust your horizontal_move_z setting in [bed_mesh] to be above {z}.") }
{% endif %}
{% if not probe_for_priming_disable_mesh_constraints %}
{% set min_x = mesh_config.mesh_min.split(",")[0]|float - x_offset %}
{% set min_y = mesh_config.mesh_min.split(",")[1]|float - y_offset %}
{% set max_x = mesh_config.mesh_max.split(",")[0]|float - x_offset %}
{% set max_y = mesh_config.mesh_max.split(",")[1]|float - y_offset %}
{% set x_start = [[x_start, max_x]|min, min_x]|max %}
{% set y_start = [[y_start, max_y]|min, min_y]|max %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the start of the prime location at {x_start}, {y_start}"
G90
M83
G0 Z{z} F{z_speed}
G1 X{x_start} Y{y_start} F{speed}
PROBE_CURRENT_POSITION
{% if t == 1 %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result_t1
{% else %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result
{% endif %}
{% if idex_mode == '' %}
{% set x_end = x_start %}
{% set y_end = y_start + 45 %}
{% else %}
{% if t==1 %}
{% set x_end = x_start - 45 %}
{% else %}
{% set x_end = x_start + 45 %}
{% endif %}
{% set y_end = y_start %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the end of the prime location at {x_end}, {y_end}"
G1 X{x_end} Y{y_end} F{speed}
PROBE_CURRENT_POSITION
{% if t == 1 %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_end_result_t1
{% else %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_end_result
{% endif %}
RESTORE_GCODE_STATE NAME=probe_for_priming_state
RESTORE_TOOLHEAD_SETTINGS KEY="probe_for_priming"
{% endif %}
[gcode_macro RESET_PRIME_PROBE_STATE]
gcode =
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result VALUE=None
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_end_result VALUE=None
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result_t1 VALUE=None
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_end_result_t1 VALUE=None
{% endif %}
[gcode_macro PROBE_CURRENT_POSITION]
gcode =
{% set beacon_contact_prime_probing = true if printer["gcode_macro RatOS"].beacon_contact_prime_probing|default(false)|lower == 'true' else false %}
SAVE_GCODE_STATE NAME=probe_current_position_state
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
ASSERT_PROBE_DEPLOYED
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_prime_probing %}
PROBE PROBE_METHOD=contact SAMPLES=1
{% else %}
PROBE
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
BEACON_QUERY
{% else %}
RESTORE_GCODE_STATE NAME=probe_current_position_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_z_speed|float}
{% endif %}
[gcode_macro PRIME_BLOB]
description = Prints a primeblob, used internally, if configured, as part of the START_PRINT macro.
variable_x_offset = 5
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="prime_blob"
SET_MACRO_TRAVEL_SETTINGS
RATOS_ECHO PREFIX="Priming" MSG="Priming nozzle with prime blob.."
{% set current_toolhead = 0 %}
{% set target_idex_mode = '' %}
{% set extruder = 'extruder' %}
{% if printer["dual_carriage"] is defined %}
{% if params.IDEX_MODE is defined %}
{% set target_idex_mode = params.IDEX_MODE|default('')|lower %}
{% else %}
{ action_raise_error("IDEX_MODE parameter not found for PRIME_BLOB macro. This is likely a bug.") }
{% endif %}
RATOS_ECHO PREFIX="Priming" MSG="Priming in IDEX {target_idex_mode} mode.."
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set current_toolhead = 1 if current_idex_mode=='primary' else 0 %}
{% set extruder = 'extruder1' if current_toolhead == 1 else 'extruder' %}
{% endif %}
{% if target_idex_mode != "copy" or target_idex_mode != "mirror" %}
SAVE_GCODE_STATE NAME=prime_blob_state
{% endif %}
{% set first_y = printer["gcode_macro START_PRINT"].first_y|default(-1)|float %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set fan_speed = printer["gcode_macro RatOS"].nozzle_prime_bridge_fan|float %}
{% set nozzle_diameter = printer.configfile.settings[extruder].nozzle_diameter|float %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set has_start_offset_t0 = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) != 9999.9 %}
{% if printer["dual_carriage"] is defined %}
{% set has_start_offset_t1 = printer["gcode_macro RatOS"].probe_for_priming_result_t1|float(9999.9) != 9999.9 %}
{% endif %}
{% set start_print_park_in = printer["gcode_macro RatOS"].start_print_park_in %}
{% set start_print_park_z_height = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set nozzle_prime_direction = printer["gcode_macro RatOS"].nozzle_prime_direction|lower %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% set initial_toolhead = params.INITIAL_TOOLHEAD|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% if target_idex_mode == '' %}
{% set x_factor = 0 %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set x_start = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set x_start = printable_x_max - 5 %}
{% else %}
{% set x_start = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% set y_factor = 1 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% set y_factor = -1 %}
{% else %}
{% set y_start = nozzle_prime_start_y|float %}
{% if nozzle_prime_start_y|float < printable_y_max / 2 %}
{% set y_factor = 1 %}
{% else %}
{% set y_factor = -1 %}
{% endif %}
{% endif %}
{% if nozzle_prime_direction == 'forwards' %}
{% set y_factor = 1 %}
{% elif nozzle_prime_direction == 'backwards' %}
{% set y_factor = -1 %}
{% endif %}
{% if start_print_park_in == 'primeblob' %}
{% set z = 3 %}
{% else %}
{% set z = start_print_park_z_height %}
{% endif %}
{% else %}
{% set center_x = printable_x_max / 2 %}
{% set y_factor = 0 %}
{% if target_idex_mode == 'copy' or target_idex_mode == 'mirror' %}
{% set x_start = center_x / 2 + 5 %}
{% set x_factor = 1 %}
{% else %}
{% if both_toolheads and initial_toolhead != current_toolhead %}
{% if current_toolhead == 0 %}
{% set x_start = 55 %}
{% set x_factor = -1 %}
{% elif current_toolhead == 1 %}
{% set x_start = printable_x_max - 55 %}
{% set x_factor = 1 %}
{% endif %}
{% else %}
{% if current_toolhead == 0 %}
{% set x_start = 5 %}
{% set x_factor = 1 %}
{% elif current_toolhead == 1 %}
{% set x_start = printable_x_max - 5 %}
{% set x_factor = -1 %}
{% endif %}
{% endif %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_x_max - 5 %}
{% endif %}
{% set z = 10 %}
{% endif %}
{% set start_z_offset = 0 %}
{% set end_z_offset = 0 %}
{% if has_start_offset_t0 %}
{% set start_z_probe_result_t0 = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %}
{% set end_z_probe_result_t0 = printer["gcode_macro RatOS"].probe_for_priming_end_result|float(9999.9) %}
{% if printer.configfile.settings.bltouch is not defined and printer.configfile.settings.probe is not defined and printer.configfile.settings.beacon is not defined %}
{ action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe], [beacon] or [bltouch].") }
{% endif %}
{% if start_z_probe_result_t0 == 9999.9 %}
{ action_raise_error("No start probe result found for prime area. This is likely a bug.") }
{% endif %}
{% if end_z_probe_result_t0 == 9999.9 %}
{ action_raise_error("No end probe result found for prime area. This is likely a bug.") }
{% endif %}
{% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %}
{% if start_z_probe_result_t0 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (start_z_probe_result_t0) ) }
{% endif %}
{% if end_z_probe_result_t0 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (end_z_probe_result_t0) ) }
{% endif %}
{% set start_z_offset = start_z_probe_result_t0 %}
{% set end_z_offset = end_z_probe_result_t0 %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if current_toolhead == 1 or both_toolheads or target_idex_mode == "copy" or target_idex_mode == "mirror" %}
{% if has_start_offset_t1 %}
{% set start_z_probe_result_t1 = printer["gcode_macro RatOS"].probe_for_priming_result_t1|float(9999.9) %}
{% set end_z_probe_result_t1 = printer["gcode_macro RatOS"].probe_for_priming_end_result_t1|float(9999.9) %}
{% if printer.configfile.settings.bltouch is not defined and printer.configfile.settings.probe is not defined and printer.configfile.settings.beacon is not defined %}
{ action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe], [beacon] or [bltouch].") }
{% endif %}
{% if start_z_probe_result_t1 == 9999.9 %}
{ action_raise_error("No start probe result found for prime area. This is likely a bug.") }
{% endif %}
{% if end_z_probe_result_t1 == 9999.9 %}
{ action_raise_error("No end probe result found for prime area. This is likely a bug.") }
{% endif %}
{% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %}
{% if start_z_probe_result_t1 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (start_z_probe_result_t1) ) }
{% endif %}
{% if end_z_probe_result_t1 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (end_z_probe_result_t1) ) }
{% endif %}
{% set start_z_offset = [start_z_offset, start_z_probe_result_t1]|max %}
{% set end_z_offset = [end_z_offset, start_z_probe_result_t1]|max %}
{% endif %}
{% endif %}
{% if target_idex_mode != 'copy' and target_idex_mode != 'mirror' %}
{% if both_toolheads and initial_toolhead != current_toolhead %}
{% set original_start_z_offset = start_z_offset %}
{% set original_end_z_offset = end_z_offset %}
{% set start_z_offset = original_end_z_offset %}
{% set end_z_offset = original_start_z_offset %}
{% endif %}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SET_NOZZLE_TEMP_OFFSET TOOLHEAD={current_toolhead}
{% endif %}
DEBUG_ECHO PREFIX="PRIME_BLOB" MSG="x_start: {x_start}, y_start: {y_start}, x_factor: {x_factor}, y_factor: {y_factor}, z: {z}, start_z_offset: {start_z_offset}, end_z_offset: {end_z_offset}"
G90
M83
RATOS_ECHO PREFIX="Priming" MSG="Lifting Z to {z}.."
G0 Z{z} F{z_speed}
{% if printer["dual_carriage"] is not defined %}
RATOS_ECHO PREFIX="Priming" MSG="Moving to {x_start}, {y_start} along the edge of the print area.."
{% if start_print_park_in != 'primeblob' %}
G1 X{x_start} F{speed}
G1 Y{y_start + (15 * y_factor)} F{speed}
{% endif %}
{% else %}
G1 Y{y_start + (15 * y_factor)} F{speed}
{% if target_idex_mode=="copy" or target_idex_mode=="mirror" %}
RATOS_ECHO PREFIX="Priming" MSG="Mirroring move to {x_start}, {y_start} along the edge of the print area.."
_IDEX_MIRROR PRIMING=1
{% else %}
RATOS_ECHO PREFIX="Priming" MSG="Moving to {x_start}, {y_start} along the edge of the print area.."
{% endif %}
G1 X{x_start} F{speed}
{% endif %}
RATOS_ECHO PREFIX="Priming" MSG="Starting prime blob.."
G1 Z{0.5 + start_z_offset} F{z_speed}
G1 Y{y_start} F{speed}
G1 F300 E{14 / ((0.4 / nozzle_diameter) ** 2)}
G1 F300 E{14 / ((0.4 / nozzle_diameter) ** 2)}
M106 S{fan_speed}
G1 Z5 F100 E5
G92 E0
RATOS_ECHO PREFIX="Priming" MSG="Bridging with {((fan_speed/255) * 100)|int}% fan speed.."
G1 F3000 X{x_start + (15 * x_factor)} Y{y_start + (15 * y_factor)} E{1 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (20 * x_factor)} Y{y_start + (20 * y_factor)} Z{3.8 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (34 * x_factor)} Y{y_start + (34 * y_factor)} Z{2.6 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (38 * x_factor)} Y{y_start + (38 * y_factor)} Z{1.4 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (42 * x_factor)} Y{y_start + (42 * y_factor)} Z{0.2 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
M106 S0
G1 F3000 X{x_start + (46 * x_factor)} Y{y_start + (46 * y_factor)} Z{0.2 + end_z_offset} E0.6
G1 F{speed} X{x_start + (50 * x_factor)} Y{y_start + (50 * y_factor)}
{% if target_idex_mode == "copy" or target_idex_mode == "mirror" %}
G0 Z3 F{z_speed}
{% endif %}
{% if target_idex_mode == "copy" %}
{% if first_y >= 0 %}
_IDEX_COPY DANCE=0 Y={first_y}
{% else %}
_IDEX_COPY DANCE=0 Y={params.Y1}
{% endif %}
{% endif %}
{% if target_idex_mode != "copy" or target_idex_mode != "mirror" %}
RESTORE_GCODE_STATE NAME=prime_blob_state
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="prime_blob"
G92 E0
[gcode_macro UNLOAD_FILAMENT]
description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams.
variable_ignore_min_extrude_temp = True
gcode =
_LEARN_MORE_FILAMENT
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set filament_name = params._NAME|default('')|string %}
{% set filament_type = params._TYPE|default('')|string %}
{% set temp = params.TEMP|default(220)|int %}
{% if printer["dual_carriage"] is not defined %}
_DEFAULT_UNLOAD_FILAMENT TEMP={temp} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Unloading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead==0 or toolhead==1 %}
_IDEX_UNLOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
[gcode_macro _LEGACY_UNLOAD_FILAMENT]
description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams.
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set unload_speed = 5 * 60 %}
{% set unload_length = printer["gcode_macro RatOS"].filament_unload_length|float %}
M117 Unloading filament...
G0 E10 F300
G0 E-5 F3600
G4 P3000
G0 E5 F6000
G0 E-15 F6000
G0 E-{unload_length} F{unload_speed}
_CLEANING_MOVE TOOLHEAD={toolhead}
M117 Filament unloaded!
RESPOND MSG="Filament unloaded! Please inspect the tip of the filament before reloading."
[gcode_macro _DEFAULT_UNLOAD_FILAMENT]
description = Unload filament macro for non IDEX printers.
gcode =
{% set temp = params.TEMP|default(220)|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set enable_unload_tip_forming = true if printer["gcode_macro RatOS"].enable_unload_tip_forming|default(false)|lower == 'true' else false %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_DEFAULT_UNLOAD_FILAMENT" MSG="TEMP: {temp}"
_LED_UNLOADING_FILAMENT TOOLHEAD=0
SAVE_GCODE_STATE NAME=unload_state
{% if printer.extruder.temperature|int < temp or printer.extruder.can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating extruder to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={temp}
G4 P3000
{% if enable_unload_tip_forming %}
_UNLOAD_FILAMENT TOOLHEAD=0 NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_LEGACY_UNLOAD_FILAMENT TOOLHEAD=0
{% endif %}
RESTORE_GCODE_STATE NAME=unload_state
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD=0
[gcode_macro _IDEX_UNLOAD_FILAMENT]
description = Unload filament macro for IDEX printer.
gcode =
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set enable_unload_tip_forming = true if printer["gcode_macro RatOS"].enable_unload_tip_forming|default(false)|lower == 'true' else false %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_IDEX_UNLOAD_FILAMENT" MSG="TEMP: {temp}, TOOLHEAD: {toolhead}"
_LED_UNLOADING_FILAMENT TOOLHEAD={toolhead}
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
{% if not printer.pause_resume.is_paused %}
{% if printer[target_extruder].temperature|int < temp or printer[target_extruder].can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating T{toolhead} to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={temp}
{% endif %}
G4 P3000
{% if enable_unload_tip_forming %}
_UNLOAD_FILAMENT TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_LEGACY_UNLOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead}
{% endif %}
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD={toolhead}
[gcode_macro _UNLOAD_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT" MSG="TOOLHEAD: {toolhead}"
_MOVE_TO_LOADING_POSITION TOOLHEAD={toolhead}
_UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
_UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER TOOLHEAD={toolhead}
_CLEANING_MOVE TOOLHEAD={toolhead}
[gcode_macro _UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Unloading filament from nozzle to cooling zone... Please wait!"
_PURGE_BEFORE_UNLOAD TOOLHEAD={toolhead}
{% if printer["gcode_macro _UNLOAD_WITHOUT_TIP_FORMING"] is defined %}
_UNLOAD_WITHOUT_TIP_FORMING TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_UNLOAD_WITH_TIP_FORMING NAME='{filament_name}' TYPE='{filament_type}'
{% endif %}
G4 P3000
[gcode_macro _UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set extruder_load_speed = printer["gcode_macro T%s" % toolhead].extruder_load_speed|float * 60 %}
{% set extruder_gear_to_cooling_position_distance = printer["gcode_macro T%s" % toolhead].extruder_gear_to_cooling_position_distance|float %}
{% set tooolhead_sensor_to_extruder_gear_distance = printer["gcode_macro T%s" % toolhead].tooolhead_sensor_to_extruder_gear_distance|float %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER" MSG="TOOLHEAD: {toolhead}"
G0 E-{extruder_gear_to_cooling_position_distance + tooolhead_sensor_to_extruder_gear_distance + 50} F{extruder_load_speed}
RATOS_ECHO MSG="Filament unloaded! Please inspect the tip of the filament before reloading."
[gcode_macro _UNLOAD_WITH_TIP_FORMING]
gcode =
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% if filament_name != '' and filament_type != '' %}
_UNLOAD_KNOWN_FILAMENT NAME={filament_name} TYPE={filament_type}
{% else %}
_UNLOAD_UNKNOWN_FILAMENT TOOLHEAD={toolhead}
{% endif %}
[gcode_macro _UNLOAD_KNOWN_FILAMENT]
description = User overrideable tip forming macro if slicer filament profiles are known
gcode =
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
RATOS_ECHO PREFIX="FILAMENT TYPE" MSG='{filament_type}'
RATOS_ECHO PREFIX="FILAMENT PROFILE" MSG='{filament_name}'
{% if filament_name == "Prusament PETG @V-Minion" %}
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
{% elif filament_name == "Nobufil PETG @V-Minion" %}
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
{% else %}
RATOS_ECHO PREFIX="_UNLOAD_KNOWN_FILAMENT" MSG="Filament profile not found!"
_UNLOAD_UNKNOWN_FILAMENT
{% endif %}
[gcode_macro _UNLOAD_UNKNOWN_FILAMENT]
description = User overrideable standard tip forming macro
gcode =
DEBUG_ECHO PREFIX="_UNLOAD_UNKNOWN_FILAMENT" MSG="Using standard tip forming macro!"
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
[gcode_macro _TIP_FORMING]
gcode =
{% set cooling_moves = params.COOLING_MOVES|default(4)|int %}
{% set cooling_move_length = params.COOLING_MOVE_LENGTH|default(10)|float %}
{% set start_cooling_speed = params.START_COOLING_SPEED|default(10)|float * 60 %}
{% set end_cooling_speed = params.END_COOLING_SPEED|default(50)|float * 60 %}
{% if cooling_moves == 0 %}
{% set cooling_move_length = 0 %}
{% endif %}
{% set dip = true if params.DIP|default(false)|lower == "true" else false %}
{% set dip_length = params.DIP_LENGTH|default(22)|float %}
{% set dip_speed = params.DIP_SPEED|default(30)|float * 60 %}
{% set dip_retract_speed = params.DIP_RETRACT_SPEED|default(70)|float * 60 %}
{% set retract_length = params.RETRACT_LENGTH|default(18)|float %}
{% set start_retract_speed = params.START_RETRACT_SPEED|default(120)|float * 60 %}
{% set end_retract_speed = params.END_RETRACT_SPEED|default(20)|float * 60 %}
DEBUG_ECHO PREFIX="_TIP_FORMING" MSG="cooling_moves: {cooling_moves}, cooling_move_length: {cooling_move_length}, start_cooling_speed: {start_cooling_speed}, end_cooling_speed: {end_cooling_speed}, dip: {dip}, dip_length: {dip_length}, dip_speed: {dip_speed}, dip_retract_speed: {dip_retract_speed}, retract_length: {retract_length}, start_retract_speed: {start_retract_speed}, end_retract_speed: {end_retract_speed}"
M220 S100
G92 E0
{% set retract = retract_length + cooling_move_length / 2 - 15 %}
G1 E-15 F{start_retract_speed}
G1 E-{0.7 * retract} F{1.0 * end_retract_speed}
G1 E-{0.2 * retract} F{0.5 * end_retract_speed}
G1 E-{0.1 * retract} F{0.3 * end_retract_speed}
G92 E0
{% if cooling_moves > 0 %}
{% set i = (end_cooling_speed - start_cooling_speed) / (2 * cooling_moves - 1) %}
{% for m in range(cooling_moves) %}
G1 E{cooling_move_length} F{(start_cooling_speed + i * m * 2)}
G1 E-{cooling_move_length} F{(start_cooling_speed + i * (m * 2 + 1))}
{% endfor %}
{% endif %}
G92 E0
{% if dip %}
G1 E{dip_length} F{dip_speed}
G4 P100
G1 E-{dip_length} F{dip_retract_speed}
{% endif %}
G92 E0
M400
[gcode_macro _ON_FILAMENT_SENSOR_BUTTON_PRESSED]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_FILAMENT_SENSOR_BUTTON_PRESSED" MSG="TOOLHEAD: {toolhead}"
{% if not printer.virtual_sdcard.is_active %}
UNLOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_RUNOUT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_runout_detection = true if printer["gcode_macro T%s" % toolhead].enable_runout_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_RUNOUT" MSG="TOOLHEAD: {toolhead}"
{% if enable_runout_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=false
{% endif %}
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_CLOG]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_clog_detection = true if printer["gcode_macro T%s" % toolhead].enable_clog_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_CLOG" MSG="TOOLHEAD: {toolhead}"
{% if enable_clog_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=true
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_RUNOUT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_runout_detection = true if printer["gcode_macro T%s" % toolhead].enable_runout_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_RUNOUT" MSG="TOOLHEAD: {toolhead}"
{% if enable_runout_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=false
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_CLOG]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_clog_detection = true if printer["gcode_macro T%s" % toolhead].enable_clog_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_CLOG" MSG="TOOLHEAD: {toolhead}"
{% if enable_clog_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=true
{% endif %}
[gcode_macro _ON_FILAMENT_END]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set clogged = true if params.CLOGGED|default(false)|lower == 'true' else false %}
{% set unload_after_runout = printer["gcode_macro T%s" % toolhead].unload_after_runout|float %}
{% if clogged %}
_LED_FILAMENT_CLOG TOOLHEAD={toolhead}
{% else %}
_LED_FILAMENT_RUNOUT TOOLHEAD={toolhead}
{% endif %}
DEBUG_ECHO PREFIX="_ON_FILAMENT_END" MSG="TOOLHEAD: {toolhead}"
{% if printer.virtual_sdcard.is_active %}
{% if not printer.pause_resume.is_paused %}
PAUSE RUNOUT=True
{% endif %}
{% if not clogged and unload_after_runout %}
UNLOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
{% if not clogged and printer["dual_carriage"] is defined %}
{% if printer["gcode_macro _IDEX_JOIN_SPOOLS"].enabled|default(false)|lower == 'true'%}
_JOIN_SPOOL TOOLHEAD={toolhead}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro M600]
description = Executes a color change by pausing the printer an unloading the filament.
gcode =
PAUSE
UNLOAD_FILAMENT
RATOS_ECHO MSG="Please load new filament and resume"
[gcode_macro COLD_PULL]
description = Automated hotend cold pull.
gcode =
{% set extrusion_temp = params.EXTRUSION_TEMP|default(220)|int %}
{% set cold_pull_temp = params.COLD_PULL_TEMP|default(80)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% if printer["dual_carriage"] is not defined %}
{% set toolhead = 0 %}
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Unloading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead != 0 and toolhead != 1 %}
{action_raise_error("Please select toolhead! 0 = left, 1 = right toolhead")}
{% endif %}
{% endif %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
_LED_UNLOADING_FILAMENT TOOLHEAD={toolhead}
SAVE_GCODE_STATE NAME=cold_pull_state
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
RATOS_ECHO MSG="Heating T{toolhead} to {extrusion_temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={extrusion_temp}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={extrusion_temp} MAXIMUM={extrusion_temp + 2}
G4 P3000
RATOS_ECHO MSG="extruding..."
G92 E0
G1 E30 F300
G92 E0
RATOS_ECHO MSG="Heating T{toolhead} to {cold_pull_temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={cold_pull_temp}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={cold_pull_temp} MAXIMUM={cold_pull_temp + 2}
G4 P10000
RATOS_ECHO MSG="cold pull..."
FORCE_MOVE STEPPER={target_extruder} DISTANCE=-40 VELOCITY=5 ACCEL=100
RATOS_ECHO MSG="eject filament..."
FORCE_MOVE STEPPER={target_extruder} DISTANCE=-200 VELOCITY=20 ACCEL=500
RATOS_ECHO MSG="cooling down extruder..."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET=0
RESTORE_GCODE_STATE NAME=cold_pull_state
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD={toolhead}
CONSOLE_ECHO TITLE="Cold pull finished!" MSG="Please remove the filament from the PTFE tube and cut the end off. Do NOT try to load it again." TYPE="warning"
[gcode_macro _USER_START_PRINT_BEFORE_HOMING]
gcode =
[gcode_macro _USER_START_PRINT_AFTER_HEATING_BED]
gcode =
[gcode_macro _USER_START_PRINT_BED_MESH]
gcode =
[gcode_macro _USER_START_PRINT_PARK]
gcode =
[gcode_macro _USER_START_PRINT_AFTER_HEATING_EXTRUDER]
gcode =
[gcode_macro _USER_START_PRINT_HEAT_CHAMBER]
description = Uses the extruder sensor to wait for chamber temp. Override the _START_PRINT_HEAT_CHAMBER macro to implement heated chamber handling.
gcode =
{% set chamber_heater_bed_temp = printer["gcode_macro RatOS"].chamber_heater_bed_temp|default(115)|int %}
[gcode_macro _USER_END_PRINT_BEFORE_HEATERS_OFF]
gcode =
[gcode_macro _USER_END_PRINT_AFTER_HEATERS_OFF]
gcode =
[gcode_macro _USER_END_PRINT_PARK]
gcode =
[gcode_macro _USER_END_PRINT_FINISHED]
description = User hook for when the print is finished after gcode state has been restored.
gcode =
[gcode_macro _USER_START_PRINT]
gcode =
[gcode_macro _USER_END_START_PRINT]
gcode =
[gcode_macro _USER_START_FEATURE]
gcode =
[gcode_macro _USER_END_FEATURE]
gcode =
[gcode_macro ECHO_T_VARS]
description = Echo Toolhead variables to the console.
gcode =
{% set t = params.T|default(0) %}
RATOS_ECHO MSG="T{t} Variables"
{% for var, value in printer["gcode_macro T%s" % t].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro ECHO_RATOS_VARS]
description = Echo RatOS variables to the console.
gcode =
{% for var, value in printer["gcode_macro RatOS"].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[delayed_gcode RATOS_INIT]
initial_duration = 0.1
gcode =
_LED_STANDBY
CALCULATE_PRINTABLE_AREA
INITIAL_FRONTEND_UPDATE
_CHAMBER_FILTER_SANITY_CHECK
[delayed_gcode RATOS_LOGO]
initial_duration = 2
gcode =
HELLO_RATOS
[gcode_macro INITIAL_FRONTEND_UPDATE]
gcode =
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_error = printer["gcode_macro RatOS"].status_color_error|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_unknown}"'
{% endif %}
{% set t0_sensor = "undefined" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].filament_detected|lower == "true" %}
{% set t0_sensor = "detected" %}
{% else %}
{% set t0_sensor = "empty" %}
{% endif %}
{% else %}
{% set t0_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set t1_sensor = "undefined" %}
{% if printer["dual_carriage"] is defined and printer["filament_switch_sensor toolhead_filament_sensor_t1"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].filament_detected|lower == "true" %}
{% set t1_sensor = "detected" %}
{% else %}
{% set t1_sensor = "empty" %}
{% endif %}
{% else %}
{% set t1_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set svv = printer.save_variables.variables %}
{% if svv.t0_filament is defined and printer["gcode_macro T0"] is defined %}
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
{% if t0_sensor != "empty" %}
{% set t0_filament_type = svv.t0_filament[0]|default('')|string %}
{% set t0_filament_name = svv.t0_filament[1]|default('')|string %}
{% set t0_filament_temp = svv.t0_filament[2]|default(0)|float %}
{% if t0_filament_name != '' and t0_filament_type != '' and t0_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{t0_filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{t0_filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={t0_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
{% if svv.t1_filament is defined and printer["gcode_macro T1"] is defined %}
{% if printer["gcode_macro T1"].filament_name is defined and printer["gcode_macro T1"].filament_type is defined and printer["gcode_macro T1"].filament_temp is defined %}
{% if t1_sensor != "empty" %}
{% set t1_filament_type = svv.t1_filament[0]|default('')|string %}
{% set t1_filament_name = svv.t1_filament[1]|default('')|string %}
{% set t1_filament_temp = svv.t1_filament[2]|default(0)|float %}
{% if t1_filament_name != '' and t1_filament_type != '' and t1_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='"{t1_filament_name}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='"{t1_filament_type}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE={t1_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t1_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro CALCULATE_PRINTABLE_AREA]
gcode =
{% set bed_margin_x = printer["gcode_macro RatOS"].bed_margin_x %}
{% set bed_margin_y = printer["gcode_macro RatOS"].bed_margin_y %}
{% set tool = 0 if printer["gcode_macro T0"] is not defined or printer["gcode_macro T0"].active else 1 %}
{% set max_x = printer.toolhead.axis_maximum.x if printer["dual_carriage"] is defined and tool == 0 else printer.toolhead.axis_maximum.x - bed_margin_x[1] %}
{% if printer["dual_carriage"] is defined %}
{% set max_x = printer.toolhead.axis_maximum.x %}
{% endif %}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="printer.toolhead.axis_maximum.x {printer.toolhead.axis_maximum.x}"
{% set max_y = printer.toolhead.axis_maximum.y - bed_margin_y[1]%}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_x_max VALUE={max_x}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_y_max VALUE={max_y}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="Printable area calculated: X: 0,{max_x} Y: 0,{max_y}"
[gcode_macro CACHE_TOOLHEAD_SETTINGS]
variable_cache = {"global": {"accel": 1000, "ratio": 0.5, "speed": 50, "scv": 5}}
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set dummy = cache.__setitem__(key, {"accel": printer.toolhead.max_accel, "ratio": printer.toolhead.minimum_cruise_ratio, "speed": printer.toolhead.max_velocity, "scv": printer.toolhead.square_corner_velocity}) %}
SET_GCODE_VARIABLE MACRO=CACHE_TOOLHEAD_SETTINGS VARIABLE=cache VALUE="{cache | pprint | replace("\n", "") | replace("\"", "\\\"")}"
DEBUG_ECHO PREFIX="CACHE_TOOLHEAD_SETTINGS" MSG="Toolhead settings cached for {key}. {printer.toolhead.max_accel} accel, {printer.toolhead.minimum_cruise_ratio} ratio, {printer.toolhead.max_velocity} velocity, {printer.toolhead.square_corner_velocity} scv."
[gcode_macro RESTORE_TOOLHEAD_SETTINGS]
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set values = printer["gcode_macro CACHE_TOOLHEAD_SETTINGS"].cache.__getitem__(key) %}
{% if values is not defined or values == 'None' %}
{ action_raise_error("RESTORE_TOOLHEAD_SETTINGS: Toolhead settings not cached for key '" ~ key ~ "'.") }
{% endif %}
SET_VELOCITY_LIMIT ACCEL={values.accel} MINIMUM_CRUISE_RATIO={values.ratio} VELOCITY={values.speed} SQUARE_CORNER_VELOCITY={values.scv}
DEBUG_ECHO PREFIX="RESTORE_TOOLHEAD_SETTINGS" MSG="Toolhead settings restored. {values.accel} accel, {values.ratio} ratio, {values.speed} velocity, {values.scv} scv."
[gcode_macro SET_MACRO_TRAVEL_SETTINGS]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set accel = printer["gcode_macro RatOS"].macro_travel_accel %}
SET_VELOCITY_LIMIT ACCEL={accel} MINIMUM_CRUISE_RATIO=0.5 VELOCITY={speed} SQUARE_CORNER_VELOCITY={5}
DEBUG_ECHO PREFIX="SET_MACRO_TRAVEL_SETTINGS" MSG="Macro travel settings set. {accel} accel, {speed} velocity"
[gcode_macro SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% if printer["dual_carriage"] is not defined %}
SET_KINEMATIC_POSITION X={printable_x_max / 2} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
{% else %}
IDEX_SET_CENTER_KINEMATIC_POSITION
{% endif %}
[gcode_macro IDEX_SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set center_x = printable_x_max / 2 %}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x - (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x + (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
[gcode_macro VERIFY_HYBRID_INVERTED]
gcode =
{% set inverted = False %}
{% if printer.configfile.settings.ratos_hybrid_corexy is defined and printer.configfile.settings.ratos_hybrid_corexy.inverted is defined %}
{% if printer.configfile.settings.ratos_hybrid_corexy.inverted|lower == 'true' %}
{% set inverted = True %}
{% endif %}
{% endif %}
{% if inverted == False %}
{ action_emergency_stop("ratos_hybrid_corexy NOT INVERTED! Inverted hybrid core-xy bugfix not detected.") }
{% endif %}
[gcode_macro RATOS_ECHO]
gcode =
{% set prefix = "RatOS" %}
{% set debug = params.DEBUG|default(0)|int %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " | " ~ params.PREFIX %}
{% endif %}
{% set prefix = prefix ~ ":" %}
{% set msg = "" %}
{% if params.MSG is defined %}
{% set msg = params.MSG %}
{% else %}
{% set msg = "No msg parameter provided (this is a bug or unintended use)." %}
{% endif %}
{% if not debug %}
M117 {prefix} {msg}
{% endif %}
RATOS_LOG PREFIX="{prefix}" MSG="{msg}"
{% if not debug %}
RESPOND PREFIX="{prefix}" MSG="{msg}"
{% else %}
CONSOLE_ECHO TITLE="{prefix}" TYPE="debug" MSG="{msg}"
{% endif %}
[gcode_macro ENABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=True
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=prefix_filter VALUE="'{params.FILTER|default('')|lower}'"
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging enabled."
[gcode_macro DISABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=False
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging disabled."
[gcode_macro DEBUG_ECHO]
variable_enabled = False
variable_prefix_filter = ''
gcode =
{% set prefix = "DEBUG" %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " - " ~ params.PREFIX %}
{% endif %}
{% if enabled and (prefix_filter|lower == '' or prefix_filter|lower in params.PREFIX|lower) %}
RATOS_ECHO PREFIX="{prefix}" MSG="{params.MSG}" DEBUG=1
{% endif %}
[gcode_macro START_FEATURE]
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="Start {params.FEATURE} feature gcode"
{% set scv = printer.toolhead.square_corner_velocity|int|default(5) %}
{% set accel = printer.toolhead.max_accel|int|default(10000) %}
{% set ratio = printer.toolhead.minimum_cruise_ratio|float|default(0.5) %}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="scv" VALUE={scv}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="accel" VALUE={accel}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="ratio" VALUE={ratio}
_USER_START_FEATURE FEATURE="{params.FEATURE}"
[gcode_macro END_FEATURE]
variable_scv = 5
variable_accel = 10000
variable_ratio = 0.5
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="End {params.FEATURE} feature gcode"
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={scv} ACCEL={accel} MINIMUM_CRUISE_RATIO={ratio}
_USER_END_FEATURE FEATURE="{params.FEATURE}" SCV={scv} ACCEL={accel} RATIO={ratio}
[gcode_macro _ON_LAYER_CHANGE]
variable_layer_number = 0
description = INTERNAL USE ONLY. Call it from the slicers after layer change custom gcode
gcode =
{% set layer = params.LAYER|int %}
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE={layer}
SET_PRINT_STATS_INFO CURRENT_LAYER={layer}
[gcode_macro _LEARN_MORE_CALIBRATION]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/calibration" %}
{% set link_text = "RatOS Calibration Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_CHAMBER_FILTER]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter Control" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_FILAMENT]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/filaments" %}
{% set link_text = "RatOS Filament Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _CONSOLE_SAVE_CONFIG]
gcode =
M118 Click SAVE_CONFIG to save the settings to your printer.cfg.
[gcode_macro SAVE_Z_OFFSET]
gcode =
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SAVE_MULTIPLIER
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _LOAD_RATOS_SKEW_PROFILE]
gcode =
{% set ratos_skew_profile = printer["gcode_macro RatOS"].skew_profile|default("") %}
{% if ratos_skew_profile != "" %}
{% if printer.configfile.config["skew_correction %s" % ratos_skew_profile] is defined %}
SKEW_PROFILE LOAD={ratos_skew_profile}
GET_CURRENT_SKEW
{% else %}
{% set line_1 = '"Could not find skew profile %s!_N_Clearing skew correction."' % ratos_skew_profile %}
CONSOLE_ECHO TITLE="Missing skew profile!" TYPE="warning" MSG={line_1}
SET_SKEW CLEAR=1
{% endif %}
{% endif %}
[gcode_macro M601]
gcode =
PAUSE
[gcode_macro PAUSE]
description = Pauses the print
rename_existing = PAUSE_BASE
variable_extrude = 1.5
variable_retract = 1.5
variable_fan_speed = 0
variable_idex_mode = ""
variable_idex_toolhead = 0
variable_idex_toolhead_x = 0.0
variable_idex_toolhead_y = 0.0
variable_idex_toolhead_z = 0.0
gcode =
{% set runout_detected = true if params.RUNOUT|default(false)|lower == 'true' else false %}
_LED_PAUSE
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set idex_toolhead = 1 if idex_mode == 'primary' else 0 %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
SAVE_GCODE_STATE NAME=PAUSE_state
{% else %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_mode VALUE='"{idex_mode}"'
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead VALUE={idex_toolhead}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_x VALUE={printer.gcode_move.gcode_position.x|float}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_y VALUE={printer.gcode_move.gcode_position.y|float}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_z VALUE={printer.gcode_move.gcode_position.z|float}
DEBUG_ECHO PREFIX="PAUSE" MSG="idex_mode: {idex_mode}, idex_toolhead: {idex_toolhead}, idex_toolhead_x: {idex_toolhead_x}, idex_toolhead_y: {idex_toolhead_y}, idex_toolhead_z: {idex_toolhead_z}"
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
CACHE_TOOLHEAD_SETTINGS KEY="pause"
SET_MACRO_TRAVEL_SETTINGS
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set current_z = printer.toolhead.position.z|float %}
{% if current_z < (max_z - 20.0) %}
{% set z_safe = 20.0 %}
{% else %}
{% set z_safe = max_z - current_z %}
{% endif %}
PAUSE_BASE
{% if printer["dual_carriage"] is not defined %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan"].speed|float}
{% else %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t0"].speed|float}
{% else %}
{% if idex_toolhead == 0 %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t0"].speed|float}
{% else %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t1"].speed|float}
{% endif %}
{% endif %}
{% endif %}
M106 S0
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' else false %}
{% if idex_mode != '' %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' and printer['extruder1'].can_extrude|lower == 'true' else false %}
{% else %}
{% if printer.toolhead.extruder == 'extruder1' %}
{% set can_extrude = true if printer['extruder1'].can_extrude|lower == 'true' else false %}
{% endif %}
{% endif %}
{% endif %}
{% set R = printer["gcode_macro PAUSE"].retract|float %}
{% if can_extrude %}
G91
G1 E-{R} F2100
G90
{% else %}
{action_respond_info("Extruder not hot enough")}
{% endif %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set pause_print_park_x = printer["gcode_macro RatOS"].pause_print_park_x %}
{% set pause_print_park_in = printer["gcode_macro RatOS"].pause_print_park_in %}
{% if runout_detected %}
{% set pause_print_park_x = printer["gcode_macro RatOS"].runout_park_x %}
{% set pause_print_park_in = printer["gcode_macro RatOS"].runout_park_in %}
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
DEBUG_ECHO PREFIX="PAUSE" MSG="z_speed: {z_speed}, pause_print_park_x: {pause_print_park_x}, pause_print_park_in: {pause_print_park_in}, default_toolhead: {default_toolhead}"
{% if "xyz" in printer.toolhead.homed_axes %}
G91
G1 Z{z_safe} F{z_speed}
G90
{% if printer["dual_carriage"] is not defined %}
_PARK LOCATION={pause_print_park_in} X={pause_print_park_x}
{% else %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
_IDEX_SINGLE X={parking_position}
{% else %}
PARK_TOOLHEAD
{% endif %}
_PARK LOCATION={pause_print_park_in} X={pause_print_park_x}
{% endif %}
{% else %}
{action_respond_info("Printer not homed")}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="pause"
[gcode_macro RESUME]
description = Resumes the print if the printer is paused.
rename_existing = RESUME_BASE
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set target_idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set target_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% endif %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' else false %}
{% if target_idex_mode != '' %}
{% if target_idex_mode == 'copy' or target_idex_mode == 'mirror' %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' and printer['extruder1'].can_extrude|lower == 'true' else false %}
{% else %}
{% if printer.toolhead.extruder == 'extruder1' %}
{% set can_extrude = true if printer['extruder1'].can_extrude|lower == 'true' else false %}
{% endif %}
{% endif %}
{% endif %}
{% set fan_speed = printer["gcode_macro PAUSE"].fan_speed|float %}
{% if printer["dual_carriage"] is not defined %}
M106 S{(fan_speed * 255)}
{% else %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% else %}
{% if params.TOOLHEAD is defined %}
{% if params.TOOLHEAD == 0 %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
{% else %}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% endif %}
{% else %}
{% if printer["gcode_macro PAUSE"].idex_toolhead == 0 %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
{% else %}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% endif %}
{% endif %}
{% endif %}
M106.1 S{fan_speed}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if target_idex_mode == "copy" %}
_IDEX_COPY DANCE=0
{% elif target_idex_mode == "mirror" %}
_IDEX_MIRROR DANCE=0
{% else %}
{% if params.TOOLHEAD is defined %}
_SELECT_TOOL T={params.TOOLHEAD} X=-1 Y=-1 TOOLSHIFT=false
{% else %}
_SELECT_TOOL T={printer["gcode_macro PAUSE"].idex_toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% endif %}
{% set x = printer["gcode_macro PAUSE"].idex_toolhead_x|float %}
{% set y = printer["gcode_macro PAUSE"].idex_toolhead_y|float %}
{% set z = printer["gcode_macro PAUSE"].idex_toolhead_z|float %}
G1 X{x} Y{y} Z{z} F{speed}
{% if params.TOOLHEAD is defined %}
SAVE_GCODE_STATE NAME=PAUSE_STATE
{% endif %}
{% endif %}
{% if params.TOOLHEAD is not defined %}
{% set E = printer["gcode_macro PAUSE"].extrude|float %}
{% if can_extrude %}
G91
G1 E{E} F2100
G90
{% else %}
{action_respond_info("Extruder not hot enough")}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 MOVE_SPEED={speed}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=True
RESUME_BASE
_LED_PRINTING
[gcode_macro CANCEL_PRINT]
description = Cancels the printer
rename_existing = CANCEL_PRINT_BASE
gcode =
END_PRINT
TURN_OFF_HEATERS
CLEAR_PAUSE
CANCEL_PRINT_BASE
[gcode_macro START_PRINT]
description = Start print procedure, use this in your Slicer.
variable_post_processor_version = 2
variable_is_printing_gcode = False
variable_both_toolheads = True
variable_object_xoffset = 0
variable_first_x = -1
variable_first_y = -1
variable_total_toolshifts = 0
variable_initial_tool = 0
variable_extruder_first_layer_temp = ""
variable_extruder_other_layer_temp = ""
gcode =
{% if "xyz" in printer.toolhead.homed_axes and printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% if printer["gcode_macro _VAOC"].is_started|default(true)|lower == 'true' %}
_VAOC_END
{% endif %}
{% endif %}
_LED_START_PRINTING
CACHE_TOOLHEAD_SETTINGS KEY="start_print"
_USER_START_PRINT { rawparams }
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% set hotend_heat_soak_time = printer["gcode_macro RatOS"].hotend_heat_soak_time|default(0)|int %}
{% set z_probe_stowable = printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set X0 = params.X0|default(-1)|float %}
{% set X1 = params.X1|default(-1)|float %}
{% set Y0 = params.Y0|default(-1)|float %}
{% set Y1 = params.Y1|default(-1)|float %}
{% if first_x == -1 or first_y == -1 %}
{% set first_x = params.FIRST_X|default(-1)|float %}
{% set first_y = params.FIRST_Y|default(-1)|float %}
{% endif %}
{% set total_toolshifts = params.TOTAL_TOOLSHIFTS|default(0)|int %}
{% set initial_tool = params.INITIAL_TOOL|default(default_toolhead)|int %}
{% set start_chamber_temp = params.START_CHAMBER_TEMP|default(0)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set bed_temp = params.BED_TEMP|default(printer.heater_bed.target, true)|float %}
{% set total_layer_count = params.TOTAL_LAYER_COUNT|default(0)|int %}
{% set extruder_first_layer_temp = (params.EXTRUDER_TEMP|default("")).split(",") %}
RATOS_ECHO MSG="First print coordinates X:{first_x} Y:{first_y}"
{% if params.TOTAL_LAYER_COUNT is not defined %}
{% set link_url = "https://os.ratrig.com/docs/slicers" %}
{% set link_text = "RatOS Slicer Configuration" %}
{% set line_1 = '"Your slicer gcode settings are not up to date._N_Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="Incomplete Slicer Configuration detected" TYPE="warning" MSG={line_1}
{% endif %}
SET_PRINT_STATS_INFO CURRENT_LAYER=1
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE=1
{% if total_layer_count > 0 %}
SET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set swap_toolheads = true if printer["gcode_macro _IDEX_REMAP_TOOLHEADS"].enabled|default(false)|lower == 'true' else false %}
{% if swap_toolheads %}
{% set initial_tool = 0 if initial_tool == 1 else 1 %}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=active VALUE=True
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=active VALUE=True
{% endif %}
{% set both_toolheads = true %}
{% if total_toolshifts == 0 %}
{% set both_toolheads = false %}
{% endif %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
_IDEX_SINGLE X={parking_position}
{% endif %}
{% if both_toolheads and (idex_mode == "copy" or idex_mode == "mirror") %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Gcode tool changes found. Copy and mirror mode do not support toolchanges.")}
{% endif %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set both_toolheads = true %}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=initial_tool VALUE={initial_tool}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=first_x VALUE={first_x}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=first_y VALUE={first_y}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=total_toolshifts VALUE={total_toolshifts}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=both_toolheads VALUE={both_toolheads}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_first_layer_temp VALUE="'{params.EXTRUDER_TEMP}'"
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_other_layer_temp VALUE="'{params.EXTRUDER_OTHER_LAYER_TEMP}'"
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=_TOOLCHANGE VARIABLE=toolshift_count VALUE=0
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set svv = printer.save_variables.variables %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set parking_position_t0 = printer["gcode_macro T0"].parking_position|float %}
{% set parking_position_t1 = printer["gcode_macro T1"].parking_position|float %}
{% set stepper_x_position_min = printer.configfile.settings.stepper_x.position_min|float %}
{% set stepper_x_position_endstop = printer.configfile.settings.stepper_x.position_endstop|float %}
{% set dual_carriage_position_max = printer.configfile.settings.dual_carriage.position_max|float %}
{% set dual_carriage_position_endstop = printer.configfile.settings.dual_carriage.position_endstop|float %}
{% set x_parking_space = parking_position_t0 - (stepper_x_position_endstop , stepper_x_position_min)|max %}
{% set dc_parking_space = (dual_carriage_position_endstop , dual_carriage_position_max)|min - parking_position_t1 %}
{% if svv.idex_xoffset|abs >= (x_parking_space - 0.5) or svv.idex_xoffset|abs >= (dc_parking_space - 0.5) %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Toolhead x-offset is too high for the available parking space. Calibrate your X and DC endstop positions and make sure you stay below 1mm." % (copy_mode_max_width)) }
{% endif %}
{% endif %}
{% if (idex_mode == "copy" or idex_mode == "mirror") and printer.configfile.settings.ratos.enable_gcode_transform %}
{% if params.MIN_X is not defined or params.MAX_X is not defined %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Something went wrong! Missing important post processor start print parameter!") }
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=object_xoffset VALUE=0
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set boundary_box_min_x = params.MIN_X|default(0)|float %}
{% set boundary_box_max_x = params.MAX_X|default(printable_x_max)|float %}
{% set svv = printer.save_variables.variables %}
{% if default_toolhead == 0 %}
{% set boundary_box_max_x = boundary_box_max_x + svv.idex_xoffset %}
{% else %}
{% set boundary_box_min_x = boundary_box_min_x - svv.idex_xoffset %}
{% endif %}
{% set center_x = printable_x_max / 2.0 %}
{% set safe_distance = printer.configfile.settings.dual_carriage.safe_distance|float %}
{% set object_width = boundary_box_max_x - boundary_box_min_x %}
{% set copy_mode_max_width = center_x %}
{% set mirror_mode_max_width = center_x - safe_distance / 2.0 %}
DEBUG_ECHO PREFIX="START_PRINT" MSG="OBJECT_WIDTH: {object_width} BOUNDARY_BOX_MIN_X: {boundary_box_min_x} BOUNDARY_BOX_MAX_X: {boundary_box_max_x} CENTER_X: {center_x} SAFE_DISTANCE: {safe_distance}"
{% if idex_mode == "copy" and object_width > copy_mode_max_width %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Object is too big for copy mode! Max supported width is %s mm" % (copy_mode_max_width)) }
{% endif %}
{% if idex_mode == "mirror" and object_width > mirror_mode_max_width %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Object is too big for mirror mode! Max supported width is %s mm" % (mirror_mode_max_width)) }
{% endif %}
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
{% set object_xoffset = (printable_x_max - boundary_box_max_x - boundary_box_min_x) / 2 %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=object_xoffset VALUE={object_xoffset}
{% endif %}
{% endif %}
{% set has_initial_toolhead_filament_sensor = true if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool] is defined else false %}
{% if has_initial_toolhead_filament_sensor %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s filament sensor is empty." % (initial_tool)) }
{% endif %}
{% endif %}
{% endif %}
{% set has_initial_bowden_filament_sensor = true if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool] is defined else false %}
{% if has_initial_bowden_filament_sensor %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool].enabled|lower == "true" %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s bowden sensor is empty." % (initial_tool)) }
{% endif %}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined and both_toolheads %}
{% set has_secondary_toolhead_filament_sensor = true if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)] is defined else false %}
{% if has_secondary_toolhead_filament_sensor %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s filament sensor is empty." % (1 if initial_tool == 0 else 0)) }
{% endif %}
{% endif %}
{% endif %}
{% set has_secondary_bowden_filament_sensor = true if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)] is defined else false %}
{% if has_secondary_bowden_filament_sensor %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].enabled|lower == "true" %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s bowden sensor is empty." % (1 if initial_tool == 0 else 0)) }
{% endif %}
{% endif %}
{% endif %}
{% endif %}
_CHAMBER_FILTER_ON AT="before_print_start"
{% if printer["dual_carriage"] is defined %}
{% if printer["gcode_macro _IDEX_JOIN_SPOOLS"].enabled|default(false)|lower == 'true' %}
{% if both_toolheads %}
RATOS_ECHO MSG="Spool join is not possible if both toolheads are in use!"
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% endif %}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if idex_mode == '' %}
_SET_TOOLHEAD_OFFSET T={default_toolhead} MOVE={1 if "xyz" in printer.toolhead.homed_axes else 0}
{% endif %}
{% endif %}
CLEAR_PAUSE
{% if printer["gcode_macro RatOS"].force_absolute_position|lower == 'true' %}
G90
{% endif %}
SAVE_GCODE_STATE NAME=start_print_state
G21
G90
M82
_USER_START_PRINT_BEFORE_HOMING { rawparams }
{% if z_probe_stowable == true %}
STOWABLE_PROBE_BEGIN_BATCH
{% endif %}
MAYBE_HOME
_Z_HOP
{% if idex_mode != '' and not (printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
PARK_TOOLHEAD
{% endif %}
{% if chamber_temp > 0 %}
{% if printer["fan_generic filter"] is defined %}
{% if printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float > 0 %}
SET_FAN_SPEED FAN=filter SPEED={printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float}
{% endif %}
{% endif %}
_CHAMBER_HEATER_ON START_CHAMBER_TEMP={start_chamber_temp} CHAMBER_TEMP={chamber_temp}
_USER_START_PRINT_HEAT_CHAMBER { rawparams } CHAMBER_TEMP={chamber_temp}
{% endif %}
_START_PRINT_BEFORE_HEATING_BED T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
RATOS_ECHO MSG="Heating bed..."
M190 S{bed_temp}
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
_USER_START_PRINT_AFTER_HEATING_BED { rawparams }
_START_PRINT_AFTER_HEATING_BED T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
_USER_START_PRINT_BED_MESH { rawparams } X0={X0} X1={X1} Y0={Y0} Y1={Y1}
_START_PRINT_BED_MESH X0={X0} X1={X1} Y0={Y0} Y1={Y1} T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
{% if z_probe_stowable == true %}
STOWABLE_PROBE_END_BATCH
{% endif %}
{% if idex_mode == '' %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={extruder_first_layer_temp[0]|float}
{% else %}
{% if initial_tool == 0 or both_toolheads or (default_toolhead == 0 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={extruder_first_layer_temp[0]|float}
{% endif %}
{% if initial_tool == 1 or both_toolheads or (default_toolhead == 1 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
SET_HEATER_TEMPERATURE HEATER="extruder1" TARGET={extruder_first_layer_temp[1]|float}
{% endif %}
{% endif %}
_USER_START_PRINT_PARK { rawparams }
_START_PRINT_PARK
RATOS_ECHO MSG="Heating Extruder..."
{% if idex_mode == '' %}
TEMPERATURE_WAIT SENSOR="extruder" MINIMUM={extruder_first_layer_temp[0]|float} MAXIMUM={extruder_first_layer_temp[0]|float + 5}
{% else %}
{% if initial_tool == 0 or both_toolheads or (default_toolhead == 0 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
TEMPERATURE_WAIT SENSOR="extruder" MINIMUM={extruder_first_layer_temp[0]|float} MAXIMUM={extruder_first_layer_temp[0]|float + 5}
{% endif %}
{% if initial_tool == 1 or both_toolheads or (default_toolhead == 1 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
TEMPERATURE_WAIT SENSOR="extruder1" MINIMUM={extruder_first_layer_temp[1]|float} MAXIMUM={extruder_first_layer_temp[1]|float + 5}
{% endif %}
{% endif %}
{% if hotend_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking hotend for {hotend_heat_soak_time} seconds..."
G4 P{(hotend_heat_soak_time * 1000)}
{% endif %}
{% if idex_mode == '' %}
_LED_PRINTING
{% else %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
_LED_PRINTING
{% else %}
{% if both_toolheads %}
_LED_PRINTING TOOLHEAD={initial_tool}
{% if toolchange_standby_temp > -1 %}
_LED_TOOLHEAD_STANDBY TOOLHEAD={0 if initial_tool == 1 else 1}
{% else %}
_LED_PRINTING TOOLHEAD={0 if initial_tool == 1 else 1}
{% endif %}
{% else %}
_LED_PRINTING TOOLHEAD={initial_tool}
_LED_DEACTIVATE_TOOLHEAD TOOLHEAD={0 if initial_tool == 1 else 1}
{% endif %}
{% endif %}
{% endif %}
_USER_START_PRINT_AFTER_HEATING_EXTRUDER { rawparams } X0={X0} X1={X1} Y0={Y0} Y1={Y1}
_START_PRINT_AFTER_HEATING_EXTRUDER X0={X0} X1={X1} Y0={Y0} Y1={Y1} INITIAL_TOOLHEAD={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
{% if idex_mode != '' %}
{% if not both_toolheads %}
{% if initial_tool != default_toolhead %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
{% endif %}
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
{% if toolchange_standby_temp > -1 %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if initial_tool == 1 else 'extruder1'} TARGET={toolchange_standby_temp}
{% endif %}
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% set x_offset = printer.toolhead.position.x|float - printer.gcode_move.gcode_position.x|float %}
{% endif %}
RESTORE_GCODE_STATE NAME=start_print_state
{% if idex_mode != '' %}
{% set act_idex_mode = printer["dual_carriage"].carriage_1|default('')|lower %}
{% if act_idex_mode == "copy" or act_idex_mode == "mirror" %}
SET_GCODE_OFFSET X={x_offset} MOVE=0
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% if idex_mode == "copy" and idex_mode != act_idex_mode %}
_IDEX_COPY DANCE=0
{% elif idex_mode == "mirror" and idex_mode != act_idex_mode %}
_IDEX_MIRROR DANCE=0
{% endif %}
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
RATOS_ECHO MSG="Adjusting object x-offset by {(object_xoffset)} mm"
SET_GCODE_OFFSET X_ADJUST={object_xoffset} MOVE=0
{% endif %}
{% else %}
_SELECT_TOOL T={initial_tool} TOOLSHIFT=false
{% if initial_tool != default_toolhead %}
{% set svv = printer.save_variables.variables %}
SAVE_VARIABLE VARIABLE=idex_applied_offset VALUE={default_toolhead}
_SET_TOOLHEAD_OFFSET T={initial_tool} MOVE=0
{% endif %}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
_BEACON_SET_NOZZLE_TEMP_OFFSET TOOLHEAD={initial_tool}
{% endif %}
_SET_EXTRUSION_MODE
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=True
{% if printer["gcode_macro _SELECT_TOOL"] is defined %}
SET_GCODE_VARIABLE MACRO=_SELECT_TOOL VARIABLE=last_timestamp VALUE={printer["print_stats"].print_duration}
{% endif %}
_USER_END_START_PRINT { rawparams }
G92 E0
_CHAMBER_FILTER_ON AT="after_print_start"
RATOS_ECHO MSG="Printing..."
[gcode_macro _START_PRINT_BEFORE_HEATING_BED]
gcode =
{% set target_idex_mode = params.IDEX_MODE|default("")|lower %}
{% set initial_toolhead = params.T|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %}
{% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% set act_t = 1 if idex_mode == 'primary' else 0 %}
{% set auto_z_offset_calibration = False %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% set is_fixed = true if printer["gcode_macro _VAOC"].is_fixed|default(true)|lower == 'true' else false %}
{% if printer["gcode_macro _VAOC"].auto_z_offset_calibration|default("false")|lower == 'true' and is_fixed %}
{% if target_idex_mode != "copy" and target_idex_mode != "mirror" %}
{% if both_toolheads or initial_toolhead != default_toolhead %}
{% set auto_z_offset_calibration = True %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set is_stowable_probe = true if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' else false %}
{% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %}
RATOS_ECHO MSG="Pre-heating extruder..."
{% if printer["dual_carriage"] is defined %}
{% if auto_z_offset_calibration %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={min_temp}
SET_HEATER_TEMPERATURE HEATER="extruder1" TARGET={min_temp}
{% else %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET={min_temp}
{% endif %}
{% else %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={min_temp}
{% endif %}
{% endif %}
{% if not is_stowable_probe %}
{% if printer["dual_carriage"] is defined and act_t != default_toolhead %}
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=True
{% endif %}
RATOS_ECHO MSG="Heat soaking z probe..."
{% if auto_z_offset_calibration %}
{% set safe_distance = printer.configfile.settings.dual_carriage.safe_distance|float %}
{% if default_toolhead == 0 %}
_SELECT_TOOL T=0 TOOLSHIFT=false
G1 X{safe_home_x - safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
G1 X{safe_home_x + safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
{% elif default_toolhead == 1 %}
_SELECT_TOOL T=1 TOOLSHIFT=false
G1 X{safe_home_x + safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
G1 X{safe_home_x - safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
{% endif %}
{% else %}
_MOVE_TO_SAFE_Z_HOME
{% endif %}
G0 Z2 F{z_speed}
{% endif %}
[gcode_macro _START_PRINT_AFTER_HEATING_BED]
gcode =
{% set target_idex_mode = params.IDEX_MODE|default("")|lower %}
{% set initial_toolhead = params.T|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %}
{% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set auto_z_offset_calibration = False %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% set is_fixed = true if printer["gcode_macro _VAOC"].is_fixed|default(true)|lower == 'true' else false %}
{% if printer["gcode_macro _VAOC"].auto_z_offset_calibration|default("false")|lower == 'true' and is_fixed %}
{% if target_idex_mode != "copy" and target_idex_mode != "mirror" %}
{% if both_toolheads or initial_toolhead != default_toolhead %}
{% set auto_z_offset_calibration = True %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_wipe_before_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_wipe_before_true_zero|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %}
RATOS_ECHO MSG="Waiting for extruder to be preheated..."
{% if printer["dual_carriage"] is defined %}
{% if auto_z_offset_calibration %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
TEMPERATURE_WAIT SENSOR=extruder1 MINIMUM={min_temp} MAXIMUM={max_temp}
{% else %}
{% if default_toolhead == 0 %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
{% else %}
TEMPERATURE_WAIT SENSOR=extruder1 MINIMUM={min_temp} MAXIMUM={max_temp}
{% endif %}
{% endif %}
{% else %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_Z_HOP
{% endif %}
{% if auto_z_offset_calibration %}
{% set parking_position_t0 = printer["gcode_macro T0"].parking_position|float %}
{% set parking_position_t1 = printer["gcode_macro T1"].parking_position|float %}
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=True
PARK_TOOLHEAD
_CLEANING_MOVE TOOLHEAD={default_toolhead}
_SELECT_TOOL T={0 if default_toolhead == 1 else 1} X={parking_position_t0 if default_toolhead == 1 else parking_position_t1} Y=0 TOOLSHIFT=false
_CLEANING_MOVE TOOLHEAD={0 if default_toolhead == 1 else 1}
_VAOC_CALIBRATE_Z_OFFSET AUTO_Z_OFFSET=True
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=false
{% endif %}
{% set needs_rehoming = False %}
{% if printer.z_tilt is defined and not printer.z_tilt.applied %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% set needs_rehoming = True %}
{% endif %}
{% if printer.quad_gantry_level is defined and not printer.quad_gantry_level.applied %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% set needs_rehoming = True %}
{% endif %}
{% if needs_rehoming %}
G28 Z
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero %}
{% if beacon_contact_wipe_before_true_zero %}
_START_PRINT_AFTER_HEATING_BED_PROBE_FOR_WIPE
{% endif %}
_START_PRINT_AFTER_HEATING_CONTACT_WITH_OPTIONAL_WIPE
{% endif %}
[gcode_macro _START_PRINT_AFTER_HEATING_BED_PROBE_FOR_WIPE]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
G0 Z5 F{z_speed}
G0 X50 Y10 F{speed}
PROBE PROBE_METHOD=contact SAMPLES=1
BEACON_QUERY
[gcode_macro _START_PRINT_AFTER_HEATING_CONTACT_WITH_OPTIONAL_WIPE]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_true_zero_location = printer["gcode_macro RatOS"].beacon_contact_true_zero_location|default("front")|lower %}
{% set beacon_contact_true_zero_margin_x = printer["gcode_macro RatOS"].beacon_contact_true_zero_margin_x|default(30)|int %}
{% set beacon_contact_wipe_before_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_wipe_before_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_wipe_before_true_zero %}
{% if printer.beacon.last_probe_result|lower == "ok" %}
{% set last_z_offset = printer.beacon.last_z_result %}
RATOS_ECHO MSG="Auto calibration nozzle wipe with probe result {last_z_offset}..."
G0 Z{(0.2 + last_z_offset)} F{z_speed}
G0 X70 F300
{% else %}
RATOS_ECHO MSG="Skipping auto calibration nozzle wipe because probing failed!"
{% endif %}
{% endif %}
G0 Z5 F{z_speed}
_MOVE_TO_SAFE_Z_HOME
RATOS_ECHO MSG="Heating extruder to probing temperature..."
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET={beacon_contact_true_zero_temp}
TEMPERATURE_WAIT SENSOR={"extruder" if default_toolhead == 0 else "extruder1"} MINIMUM={beacon_contact_true_zero_temp} MAXIMUM={beacon_contact_true_zero_temp + 5}
RATOS_ECHO MSG="Beacon contact auto calibration..."
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
G0 Z5 F{z_speed}
[gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER]
gcode =
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set first_x = printer["gcode_macro START_PRINT"].first_x|default(-1)|float %}
{% set first_y = printer["gcode_macro START_PRINT"].first_y|default(-1)|float %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set center_x = printable_x_max / 2.0 %}
{% set center_y = printable_y_max / 2.0 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% if printer["dual_carriage"] is defined %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
{% endif %}
{% set X0 = params.X0|default(-1)|int %}
{% set X1 = params.X1|default(-1)|int %}
{% set Y0 = params.Y0|default(-1)|int %}
{% set Y1 = params.Y1|default(-1)|int %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set initial_toolhead = params.INITIAL_TOOLHEAD|default(default_toolhead)|int %}
{% if idex_mode == '' %}
_PRIME
{% else %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
RATOS_ECHO PREFIX="IDEX" MSG="using combined prime offset for IDEX {idex_mode} mode"
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% else %}
{% if both_toolheads %}
{% if initial_toolhead == 0 %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T1"
_SELECT_TOOL T=1 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T0"
_SELECT_TOOL T=0 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% else %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T0"
_SELECT_TOOL T=0 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T1"
_SELECT_TOOL T=1 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% endif %}
{% else %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T{initial_toolhead}"
_SELECT_TOOL T={initial_toolhead} TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% endif %}
{% endif %}
{% endif %}
CACHE_TOOLHEAD_SETTINGS KEY="start_print_after_heating_extruder"
SET_MACRO_TRAVEL_SETTINGS
{% if (X0 > -1 and Y1 > -1) or (first_x > 0 and first_y > 0) %}
{% if printer["dual_carriage"] is defined %}
{% set acceleration = printer["gcode_macro RatOS"].toolchange_travel_accel %}
{% set max_accel = printer.toolhead.max_accel|float %}
{% set square_corner_velocity = printer.toolhead.square_corner_velocity|float %}
SET_VELOCITY_LIMIT ACCEL={acceleration} MINIMUM_CRUISE_RATIO=0 SQUARE_CORNER_VELOCITY=20
{% endif %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
G0 Z3 F{z_speed}
{% endif %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro RatOS"].nozzle_priming|lower == 'false' %}
{% set first_z = 1 %}
{% else %}
{% set first_z = 3 %}
{% endif %}
{% if idex_mode == "mirror" %}
{% if first_y >= 0 %}
G0 Y{first_y} F{speed}
{% else %}
G0 Y{Y1} F{speed}
{% endif %}
{% endif %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro RatOS"].nozzle_priming|lower == 'false' %}
_MOVE_TO_LOADING_POSITION TOOLHEAD={initial_toolhead}
_PURGE_FILAMENT TOOLHEAD={initial_toolhead} E={printer["gcode_macro RatOS"].toolchange_first_purge|default(50)|float}
_CLEANING_MOVE TOOLHEAD={initial_toolhead}
{% endif %}
{% if first_x >= 0 and first_y >= 0 %}
G0 X{first_x} Y{first_y} Z{first_z} F{speed}
{% else %}
{% set first_x = X0 %}
{% set first_y = Y0 %}
{% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' or printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %}
{% set first_x = X0 %}
{% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %}
{% set first_x = X1 %}
{% else %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_x|float <= center_x %}
{% set first_x = X0 %}
{% else %}
{% set first_x = X1 %}
{% endif %}
{% endif %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %}
{% set first_y = Y0 %}
{% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %}
{% set first_y = Y1 %}
{% else %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_y|float <= center_y %}
{% set first_y = Y0 %}
{% else %}
{% set first_y = Y1 %}
{% endif %}
{% endif %}
{% endif %}
G0 X{first_x} Y{first_y} Z{first_z} F{speed}
{% endif %}
{% endif %}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print_after_heating_extruder"
_LOAD_RATOS_SKEW_PROFILE
[gcode_macro _PRIME]
gcode =
{% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' or printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %}
PRIME_BLOB INITIAL_TOOLHEAD={params.INITIAL_TOOLHEAD} BOTH_TOOLHEADS={params.BOTH_TOOLHEADS} IDEX_MODE={params.IDEX_MODE} Y1={params.Y1}
{% endif %}
[gcode_macro END_PRINT]
description = End print procedure, use this in your Slicer.
gcode =
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
SAVE_GCODE_STATE NAME=end_print_state
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=_IDEX_REMAP_TOOLHEADS VARIABLE=enabled VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
{% set object_xoffset = printer["gcode_macro START_PRINT"].object_xoffset|default(0)|float %}
RATOS_ECHO MSG="Adjusting object x-offset by {(0-object_xoffset)} mm"
SET_GCODE_OFFSET X_ADJUST={(0-object_xoffset)}
{% endif %}
{% endif %}
_USER_END_PRINT_BEFORE_HEATERS_OFF { rawparams }
_END_PRINT_BEFORE_HEATERS_OFF
TURN_OFF_HEATERS
_USER_END_PRINT_AFTER_HEATERS_OFF { rawparams }
_END_PRINT_AFTER_HEATERS_OFF
_USER_END_PRINT_PARK { rawparams }
_END_PRINT_PARK
{% if printer["gcode_macro RatOS"].skew_profile is defined %}
SET_SKEW CLEAR=1
{% endif %}
{% if printer["dual_carriage"] is not defined and printer["gcode_macro RatOS"].end_print_motors_off|lower != 'false' %}
M84
{% endif %}
M107
BED_MESH_CLEAR
RATOS_ECHO MSG="Done :)"
RESTORE_GCODE_STATE NAME=end_print_state
{% if printer["dual_carriage"] is defined %}
M84
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
{% if printer["dual_carriage"] is not defined %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
SET_GCODE_OFFSET Z=0 MOVE=0
{% endif %}
{% endif %}
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print"
_CHAMBER_FILTER_ON AT="print_end"
_CHAMBER_FILTER_OFF
_CHAMBER_HEATER_OFF
_USER_END_PRINT_FINISHED { rawparams }
[gcode_macro _END_PRINT_BEFORE_HEATERS_OFF]
gcode =
RATOS_ECHO MSG="Cleaning up..."
[gcode_macro _END_PRINT_AFTER_HEATERS_OFF]
gcode =
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set current_z = printer.toolhead.position.z|float %}
{% set z_hop = printer["gcode_macro RatOS"].end_print_park_z_hop|float %}
{% set r = printer["gcode_macro RatOS"].end_print_retract_filament|default(4)|float %}
{% if current_z < (max_z - z_hop) %}
{% set z_safe = z_hop %}
{% else %}
{% set z_safe = max_z - current_z %}
{% endif %}
G91
G1 E-2 F3600
G0 Z{z_safe} F3600
G1 E-{(r-2)} F3600
G90
[gcode_macro _SET_EXTRUSION_MODE]
gcode =
{% if printer["gcode_macro RatOS"].relative_extrusion|lower == 'true' %}
M83
{% else %}
M82
{% endif %}
[gcode_macro GENERATE_SHAPER_GRAPHS]
description = Genarates input shaper resonances graphs for analysis. Uses the AXIS parameter for if you only want to do one axis at a time, (eg. GENERATE_SHAPER_GRAPHS AXIS=X)
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="generate_shaper_graphs"
SET_MACRO_TRAVEL_SETTINGS
CACHE_IS_GRAPH_FILES
_LED_INPUT_SHAPER_START
{% set axis = params.AXIS|default('')|lower %}
{% set freq_start = params.FREQUENCY_START|default(10)|int %}
{% set freq_end = params.FREQUENCY_END|default(133)|int %}
{% set hz_per_sec = params.HZ_PER_SEC|default(1)|float %}
{% if axis != '' %}
{% if axis == 'x' %}
MAYBE_HOME
TEST_RESONANCES AXIS=X FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_x
{% elif axis == 'y' %}
MAYBE_HOME
TEST_RESONANCES AXIS=Y FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_y
{% else %}
{action_raise_error("Unknown axis specified. Expected X or Y.")}
{% endif %}
{% else %}
MAYBE_HOME
TEST_RESONANCES AXIS=X FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
TEST_RESONANCES AXIS=Y FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_x
RUN_SHELL_COMMAND CMD=generate_shaper_graph_y
{% endif %}
_LED_INPUT_SHAPER_END
RESTORE_TOOLHEAD_SETTINGS KEY="generate_shaper_graphs"
_LEARN_MORE_CALIBRATION
SHOW_IS_GRAPH_FILES TITLE="Shaper graph"
[gcode_shell_command generate_shaper_graph_x]
command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-x.sh
timeout = 60.
verbose = True
[gcode_shell_command generate_shaper_graph_y]
command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-y.sh
timeout = 60.
verbose = True
[gcode_macro MEASURE_COREXY_BELT_TENSION]
description = Generates resonance graph used to ensure belts are equally tensioned.
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="measure_corexy_belt_tension"
SET_MACRO_TRAVEL_SETTINGS
CACHE_IS_GRAPH_FILES
_LED_INPUT_SHAPER_START
{% set freq_start = params.FREQUENCY_START|default(10)|int %}
{% set freq_end = params.FREQUENCY_END|default(133)|int %}
{% set hz_per_sec = params.HZ_PER_SEC|default(1)|float %}
MAYBE_HOME
TEST_RESONANCES AXIS=1,1 OUTPUT=raw_data NAME=belt-tension-upper FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
TEST_RESONANCES AXIS=1,-1 OUTPUT=raw_data NAME=belt-tension-lower FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_belt_tension_graph
_LED_INPUT_SHAPER_END
RESTORE_TOOLHEAD_SETTINGS KEY="measure_corexy_belt_tension"
_LEARN_MORE_CALIBRATION
SHOW_IS_GRAPH_FILES TITLE="Belt Tension Graph"
[gcode_shell_command generate_belt_tension_graph]
command = /home/pi/printer_data/config/RatOS/scripts/generate-belt-tension-graph.sh
timeout = 90.
verbose = True
[idle_timeout]
gcode =
{% if printer.webhooks.state|lower == 'ready' %}
{% if printer.pause_resume.is_paused|lower == 'false' %}
RATOS_ECHO PREFIX="IDLE" MSG="2 hours since last activity. Powering off heaters and motors.."
TURN_OFF_HEATERS
M84
{% endif %}
{% endif %}
timeout = 7200
[temperature_sensor raspberry_pi]
sensor_type = temperature_host
[skew_correction]
[input_shaper]
[virtual_sdcard]
path = ~/printer_data/gcodes
[display_status]
[pause_resume]
[force_move]
enable_force_move = True
[respond]
[resonance_generator]
[ratos]
allow_unknown_gcode_generator = True
[exclude_object]
[heater_bed]
heater_pin = heater_bed_heating_pin
sensor_pin = heater_bed_sensor_pin
sensor_type = Generic 3950
min_temp = 0
max_temp = 120
pwm_cycle_time = 0.02
control = pid
pid_kp = 68.203
pid_ki = 2.842
pid_kd = 409.216
[controller_fan controller_fan]
pin = fan_controller_board_pin
[printer]
kinematics = corexy
max_velocity = 300
max_accel = 3000
max_z_velocity = 20
max_z_accel = 350
square_corner_velocity = 5
minimum_cruise_ratio = 0.5
[gcode_macro QUAD_GANTRY_LEVEL]
rename_existing = QUAD_GANTRY_LEVEL_ORIG
gcode =
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
DEPLOY_PROBE
{% endif %}
QUAD_GANTRY_LEVEL_ORIG
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
STOW_PROBE
{% endif %}
[stepper_x]
position_max = 350
position_endstop = 350
step_pin = PC14
dir_pin = !x_dir_pin
enable_pin = !PE6
microsteps = 64
full_steps_per_rotation = 400
rotation_distance = 40
homing_speed = 50
endstop_pin = tmc5160_stepper_x:virtual_endstop
homing_retract_dist = 0
position_min = 0
[stepper_y]
position_max = 350
position_endstop = 350
step_pin = PE5
dir_pin = y_dir_pin
enable_pin = !PE3
microsteps = 64
full_steps_per_rotation = 400
rotation_distance = 40
homing_speed = 50
endstop_pin = tmc5160_stepper_y:virtual_endstop
homing_retract_dist = 0
position_min = 0
[stepper_z]
position_max = 310
step_pin = PG9
dir_pin = !z0_dir_pin
enable_pin = !PG13
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
position_min = -5
homing_speed = 10
endstop_pin = probe:z_virtual_endstop
[bed_mesh]
speed = 300
horizontal_move_z = 10
mesh_min = 20,30
mesh_max = 310,310
fade_start = 0.6
fade_end = 10.0
probe_count = 5,5
algorithm = bicubic
[quad_gantry_level]
gantry_corners =
-60,-10
410,420
points =
50,25
50,275
300,275
300,25
speed = 300
horizontal_move_z = 10
retries = 5
retry_tolerance = 0.0075
max_adjust = 10
[gcode_macro G32]
gcode =
SAVE_GCODE_STATE NAME=STATE_G32
G90
G28
QUAD_GANTRY_LEVEL
G28
G0 X175 Y175 Z30 F3600
RESTORE_GCODE_STATE NAME=STATE_G32
[firmware_retraction]
retract_speed = 60
unretract_extra_length = 0
unretract_speed = 60
retract_length = 0.5
[resonance_tester]
accel_chip_x = beacon
accel_chip_y = beacon
probe_points =
175,175,20
[tmc5160 stepper_x]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD6
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.022
diag1_pin = ^!x_diag_pin
driver_sgt = 0
[tmc5160 stepper_y]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD5
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.022
diag1_pin = ^!y_diag_pin
driver_sgt = 0
[tmc5160 stepper_z]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD2
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[tmc5160 stepper_z1]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA15
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z1]
step_pin = PG11
dir_pin = !z1_dir_pin
enable_pin = !PG12
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc5160 stepper_z2]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA9
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z2]
step_pin = PB4
dir_pin = !z2_dir_pin
enable_pin = !PB5
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc5160 stepper_z3]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA10
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z3]
step_pin = PG15
dir_pin = !z3_dir_pin
enable_pin = !PG14
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
[tmc2209 extruder]
stealthchop_threshold = 0
interpolate = False
uart_pin = toolboard_t0:PB5
run_current = 0.707
driver_tbl = 0
driver_toff = 4
driver_hend = 6
driver_hstrt = 7
sense_resistor = 0.11
[beacon]
serial = /dev/beacon
x_offset = 0
y_offset = 22.5
mesh_main_direction = x
mesh_runs = 1
speed = 15.
lift_speed = 80.
contact_max_hotend_temperature = 275
[delayed_gcode _BEACON_INIT]
initial_duration = 1
gcode =
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
{% set svv = printer.save_variables.variables %}
{% set nozzle_expansion_coefficient_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(0)|float %}
{% if nozzle_expansion_coefficient_multiplier == 0 %}
{% if printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier is not defined %}
{% set nozzle_expansion_coefficient_multiplier = 1.0 %}
{% else %}
{% set nozzle_expansion_coefficient_multiplier = printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier|default(1.0)|float %}
{% endif %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_multiplier VALUE={nozzle_expansion_coefficient_multiplier}
{% endif %}
{% if printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier is defined %}
CONSOLE_ECHO TITLE="Deprecated gcode variable" TYPE="warning" MSG={'"Please remove the variable beacon_contact_expansion_multiplier from your config file."'}
{% endif %}
[gcode_macro BEACON_RATOS_CALIBRATION]
gcode =
RATOS_ECHO MSG="Did you mean BEACON_RATOS_CALIBRATE?"
[gcode_macro BEACON_RATOS_CALIBRATE]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
BEACON_INITIAL_CALIBRATION _AUTOMATED=True
{% if beacon_contact_start_print_true_zero %}
BEACON_POKE_TEST _AUTOMATED=True
_BEACON_CHECK_POKE
{% if printer["dual_carriage"] is not defined %}
BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET _AUTOMATED=True
{% endif %}
{% endif %}
{% if chamber_temp > 0 %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
BEACON_FINAL_CALIBRATION _AUTOMATED=True BED_TEMP={bed_temp} CHAMBER_TEMP={chamber_temp}
{% if beacon_contact_start_print_true_zero %}
BEACON_MEASURE_GANTRY_TWIST
_BEACON_MAYBE_SCAN_COMPENSATION
{% endif %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% if chamber_temp > 0 %}
_CHAMBER_HEATER_OFF
{% endif %}
{% if beacon_contact_start_print_true_zero %}
{% if printer["dual_carriage"] is not defined %}
_BEACON_ECHO_NOZZLE_TEMP_OFFSETS
{% endif %}
_BEACON_ECHO_POKE
{% endif %}
RATOS_ECHO MSG="Beacon calibration finished!"
_LED_BEACON_CALIBRATION_END
RATOS_ECHO MSG="Saving config and restarting klipper..."
SAVE_CONFIG
[gcode_macro BEACON_INITIAL_CALIBRATION]
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed * 60 %}
MAYBE_HOME X=True Y=True
_LED_BEACON_CALIBRATION_START
G90
_MOVE_TO_SAFE_Z_HOME
BEACON_AUTO_CALIBRATE
_Z_HOP
RATOS_ECHO MSG="Initial beacon contact calibration finished!"
{% if not automated %}
_CONSOLE_SAVE_CONFIG
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro BEACON_FINAL_CALIBRATION]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
_BEACON_HOME_AND_ABL
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
_LED_BEACON_CALIBRATION_START
G90
G0 Z2 F{z_hop_speed}
RATOS_ECHO MSG="Waiting for calibration temperature..."
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=150
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp}
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} MAXIMUM={(bed_temp + 5)}
TEMPERATURE_WAIT SENSOR={'extruder' if default_toolhead == 0 else 'extruder1'} MINIMUM=150 MAXIMUM=155
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
_Z_HOP
BEACON_AUTO_CALIBRATE
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% endif %}
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_OFF
{% endif %}
_Z_HOP
RATOS_ECHO MSG="Final beacon contact calibration finished!"
{% if not automated %}
_CONSOLE_SAVE_CONFIG
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro BEACON_POKE_TEST]
variable_poke_result_1 = -1
variable_poke_result_2 = -1
variable_poke_result_3 = -1
variable_poke_result_4 = -1
variable_poke_result_5 = -1
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_1 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_2 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_3 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_4 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_5 VALUE=-1
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
G0 Z5 F{z_hop_speed}
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=1
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=2
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=3
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=4
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=5
_Z_HOP
RATOS_ECHO MSG="Beacon poke test finished!"
{% if not automated %}
_BEACON_ECHO_POKE
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro _BEACON_PROBE_POKE]
gcode =
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
BEACON_POKE speed=3 top=5 bottom={poke_bottom}
BEACON_QUERY
[gcode_macro _BEACON_STORE_POKE]
gcode =
{% set i = params.I|default(1)|int %}
{% set last_z = printer.beacon.last_poke_result|default(0)|float %}
{% if printer.beacon.last_poke_result|lower != "none" %}
{% if printer.beacon.last_poke_result.error == 0 %}
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE={"poke_result_%s" % i} VALUE={printer.beacon.last_poke_result.latency}
{% endif %}
{% endif %}
[gcode_macro _BEACON_CHECK_POKE]
gcode =
{% set p1 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_1|int %}
{% set p2 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_2|int %}
{% set p3 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_3|int %}
{% set p4 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_4|int %}
{% set p5 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_5|int %}
{% if p1 == -1 or p2 == -1 or p3 == -1 or p4 == -1 or p5 == -1 %}
_LED_BEACON_CALIBRATION_ERROR
{ action_raise_error("Beacon poke test error!") }
{% endif %}
{% set avg = (p1 + p2 + p3 + p4 + p5) / 5 %}
{% if avg > 6 %}
_LED_BEACON_CALIBRATION_ERROR
{ action_raise_error("Beacon poke test failed!") }
{% endif %}
[gcode_macro _BEACON_ECHO_POKE]
gcode =
{% set p1 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_1|int %}
{% set p2 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_2|int %}
{% set p3 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_3|int %}
{% set p4 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_4|int %}
{% set p5 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_5|int %}
{% set avg = (p1 + p2 + p3 + p4 + p5) / 5 %}
{% if avg <= 1 %}
{% set type = "success" %}
{% set note = "Extremely low noise, rarely achieved" %}
{% elif avg > 1 and avg <= 4 %}
{% set type = "info" %}
{% set note = "Excellent performance for a typical printer" %}
{% elif avg > 4 and avg <= 8 %}
{% set type = "warning" %}
{% set note = "Acceptable performance, machine may have considerable cyclic axis noise" %}
{% elif avg > 8 and avg <= 11 %}
{% set type = "alert" %}
{% set note = "Not ideal, may want to verify proper mounting or use thinner stackups" %}
{% elif avg > 11 %}
{% set type = "alert" %}
{% set note = "Reason for concern, present setup may be risky to continue with" %}
{% endif %}
CONSOLE_ECHO TITLE="Beacon poke test result:" TYPE={type} MSG={'"Average latency: %.2f_N_%s"' % (avg, note)}
[gcode_macro BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET]
variable_reference_z = 0.0
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set test_margin = 30 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero %}
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
RATOS_ECHO PREFIX="BEACON" MSG="Nozzle temperature offset calibration..."
{% for i in range(10) %}
beacon_poke speed=3 top=5 bottom={poke_bottom}
{% endfor %}
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=250
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET=0
{% if not automated %}
_BEACON_ECHO_NOZZLE_TEMP_OFFSETS
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
{% endif %}
[gcode_macro _BEACON_PROBE_NOZZLE_TEMP_OFFSET]
gcode =
{% set temp = params.TEMP|int %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set hotend_heat_soak_time = printer["gcode_macro RatOS"].hotend_heat_soak_time|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% set idex_zcontrolpoint = svv.idex_zcontrolpoint|default(150)|float %}
RATOS_ECHO PREFIX="BEACON" MSG="Waiting for nozzle to reach {temp}°C..."
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET={temp}
TEMPERATURE_WAIT SENSOR={"extruder" if default_toolhead == 0 else "extruder1"} MINIMUM={temp} MAXIMUM={temp + 2}
{% if hotend_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking hotend for {hotend_heat_soak_time} seconds..."
G4 P{(hotend_heat_soak_time * 1000)}
{% endif %}
RATOS_ECHO PREFIX="BEACON" MSG="Probing with nozzle temperature {temp}°C..."
PROBE PROBE_METHOD=contact PROBE_SPEED=3 LIFT_SPEED=15 SAMPLES=5 SAMPLE_RETRACT_DIST=3 SAMPLES_TOLERANCE=0.005 SAMPLES_TOLERANCE_RETRIES=10 SAMPLES_RESULT=median
BEACON_QUERY
G0 Z5 F{z_speed}
[gcode_macro _BEACON_STORE_NOZZLE_TEMP_OFFSET]
gcode =
{% set temp = params.TEMP|int %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% set last_z = printer.beacon.last_z_result|default(0)|float %}
{% if temp == 150 %}
SET_GCODE_VARIABLE MACRO=BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET VARIABLE=reference_z VALUE={last_z}
{% else %}
{% set reference_z = printer["gcode_macro BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET"].reference_z|default(0)|float %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_t{default_toolhead} VALUE={(last_z - reference_z)}
{% endif %}
[gcode_macro _BEACON_ECHO_NOZZLE_TEMP_OFFSETS]
gcode =
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% if default_toolhead == 0 %}
CONSOLE_ECHO TYPE="info" MSG={'"T0 expansion coefficient %.6f"' % svv.nozzle_expansion_coefficient_t0}
{% else %}
CONSOLE_ECHO TYPE="info" MSG={'"T1 expansion coefficient %.6f"' % svv.nozzle_expansion_coefficient_t1}
{% endif %}
[gcode_macro _BEACON_SET_NOZZLE_TEMP_OFFSET]
variable_runtime_temp = 0
gcode =
{% set toolhead = params.TOOLHEAD|default(0)|int %}
{% set reset = true if params.RESET|default(false)|lower == 'true' else false %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set svv = printer.save_variables.variables %}
{% if reset %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_applied_offset VALUE=0
{% else %}
{% if beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
{% set nozzle_expansion_coefficient_t0 = svv.nozzle_expansion_coefficient_t0|default(0)|float %}
{% if printer["dual_carriage"] is defined %}
{% set nozzle_expansion_coefficient_t1 = svv.nozzle_expansion_coefficient_t1|default(0)|float %}
{% endif %}
{% set nozzle_expansion_coefficient_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(1.0)|float %}
{% set applied_offset = svv.nozzle_expansion_applied_offset|default(0)|float %}
{% set temp = printer['extruder' if toolhead == 0 else 'extruder1'].target|float %}
{% set temp_offset = temp - beacon_contact_true_zero_temp %}
{% set expansion_coefficient = nozzle_expansion_coefficient_t0 if toolhead == 0 else nozzle_expansion_coefficient_t1 %}
{% set expansion_offset = nozzle_expansion_coefficient_multiplier * (temp_offset * (expansion_coefficient / 100)) %}
{% set new_offset = ((-applied_offset) + expansion_offset) %}
SET_GCODE_OFFSET Z_ADJUST={new_offset} MOVE=1 SPEED={z_speed}
SAVE_VARIABLE VARIABLE=nozzle_expansion_applied_offset VALUE={expansion_offset}
SET_GCODE_VARIABLE MACRO=_BEACON_SET_NOZZLE_TEMP_OFFSET VARIABLE=runtime_temp VALUE={temp}
RATOS_ECHO PREFIX="BEACON" MSG={'"Nozzle expansion offset of %.6fmm applied to T%s"' % (expansion_offset, toolhead)}
DEBUG_ECHO PREFIX="_BEACON_SET_NOZZLE_TEMP_OFFSET" MSG="multiplier: {nozzle_expansion_coefficient_multiplier}, coefficient: {expansion_coefficient}, temp_offset: {temp_offset}, expansion_offset: {expansion_offset}, applied_offset: {applied_offset}, new_offset: {new_offset}"
{% endif %}
{% endif %}
[gcode_macro BEACON_MEASURE_GANTRY_TWIST]
variable_needs_compensation = False
variable_reference_z = 0.0
variable_front = 0.0
variable_front_left = 0.0
variable_front_right = 0.0
variable_back = 0.0
variable_back_left = 0.0
variable_back_right = 0.0
variable_right = 0.0
variable_left = 0.0
variable_margin_x = 40
variable_margin_y = 40
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=False
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
RATOS_ECHO PREFIX="BEACON" MSG="Measure gantry twist..."
{% for i in range(10) %}
beacon_poke speed=3 top=5 bottom={poke_bottom}
{% endfor %}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="center"
G0 X{margin_x} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front_left"
G0 X{safe_home_x} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front"
G0 X{(printable_x_max - margin_x)} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front_right"
G0 X{(printable_x_max - margin_x)} Y{safe_home_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="right"
G0 X{(printable_x_max - margin_x)} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back_right"
G0 X{safe_home_x} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back"
G0 X{margin_x} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back_left"
G0 X{margin_x} Y{safe_home_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="left"
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
_BEACON_ECHO_GANTRY_TWIST
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro _BEACON_PROBE_GANTRY_TWIST]
gcode =
RATOS_ECHO PREFIX="BEACON" MSG="Probing..."
BEACON_OFFSET_COMPARE
BEACON_QUERY
[gcode_macro _BEACON_STORE_GANTRY_TWIST]
gcode =
{% set location = params.LOCATION|lower %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set last_z = printer.beacon.last_offset_result["delta"]|default(0)|float %}
{% if location == "center" %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=reference_z VALUE={last_z}
{% else %}
{% set reference_z = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].reference_z|default(0)|float %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE={location} VALUE={(last_z - reference_z)}
{% endif %}
[gcode_macro _BEACON_ECHO_GANTRY_TWIST]
gcode =
{% set reference_z = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].reference_z|default(0)|float * 1000 %}
{% set front_left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front_left|default(0)|float * 1000 %}
{% set front = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front|default(0)|float * 1000 %}
{% set front_right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front_right|default(0)|float * 1000 %}
{% set right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].right|default(0)|float * 1000 %}
{% set back_right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back_right|default(0)|float * 1000 %}
{% set back = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back|default(0)|float * 1000 %}
{% set back_left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back_left|default(0)|float * 1000 %}
{% set left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].left|default(0)|float * 1000 %}
{% set line_1 = "Front left: %.6fμm" % (front_left) %}
{% set line_2 = "Front center: %.6fμm" % (front) %}
{% set line_3 = "Front right: %.6fμm" % (front_right) %}
{% set line_4 = "Left center: %.6fμm" % (left) %}
{% set line_5 = "Right center: %.6fμm" % (right) %}
{% set line_6 = "Back left: %.6fμm" % (back_left) %}
{% set line_7 = "Back center: %.6fμm" % (back) %}
{% set line_8 = "Back right: %.6fμm" % (back_right) %}
{% set max_value = [(front_left|abs), (front|abs), (front_right|abs), (left|abs), (right|abs), (back_left|abs), (back|abs), (back_right|abs)]|max %}
{% if max_value <= 50 %}
{% set type = "success" %}
{% set recommendation = "Very low gantry twist: %.6fμm._N_No beacon scan compensation needed." % max_value %}
{% elif max_value > 50 and max_value <= 100 %}
{% set type = "info" %}
{% set recommendation = "Low gantry twist: %.6fμm._N_You may experience first layer inconsistensies, consider beacon scan compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 100 and max_value <= 150 %}
{% set type = "warning" %}
{% set recommendation = "High gantry twist: %.6fμm._N_High chance of first layer problems, beacon scan compensation is highly encouraged." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 150 and max_value <= 200 %}
{% set type = "alert" %}
{% set recommendation = "Very High gantry twist: %.6fμm._N_You will encounter first layer problems on large prints unless you activate beacon scan compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 200 %}
{% set type = "alert" %}
{% set recommendation = "Extremely high gantry twist: %.6fμm._N_You have significant scan/contact inconsistency which is indicative of mechanical problems, please investigate before resorting to software compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% endif %}
CONSOLE_ECHO TITLE="Gantry twist relative to the center" TYPE={type} MSG={'"_N_%s_N__N_%s_N_%s_N_%s_N_%s_N_%s_N_%s_N_%s_N_%s"' % (recommendation, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8)}
[gcode_macro BEACON_CREATE_SCAN_COMPENSATION_MESH]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set profile = params.PROFILE|default("Contact")|string %}
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_scan_compensation_enable = true if printer["gcode_macro RatOS"].beacon_scan_compensation_enable|default(false)|lower == 'true' else false %}
{% set probe_count = printer["gcode_macro RatOS"].beacon_scan_compensation_probe_count %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% if not beacon_scan_compensation_enable %}
RATOS_ECHO MSG="Beacon scan compensation is disabled!"
{% else %}
MAYBE_HOME
_MOVE_TO_SAFE_Z_HOME
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_LED_BEACON_CALIBRATION_START
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=150
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp}
RATOS_ECHO MSG="Please wait..."
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} MAXIMUM={(bed_temp + 5)}
TEMPERATURE_WAIT SENSOR={'extruder' if default_toolhead == 0 else 'extruder1'} MINIMUM=150 MAXIMUM=155
{% endif %}
{% if not automated %}
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
{% endif %}
{% if printer.z_tilt is defined %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% endif %}
{% if printer.quad_gantry_level is defined %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% endif %}
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES=2 SAMPLES_DROP=1 SAMPLES_TOLERANCE_RETRIES=10 PROBE_COUNT={probe_count[0]},{probe_count[1]} PROFILE={profile}
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% endif %}
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_OFF
{% endif %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
RATOS_ECHO MSG="Beacon scan compensation mesh created!"
{% if not automated %}
RATOS_ECHO MSG="Saving config and restarting klipper..."
SAVE_CONFIG
{% endif %}
{% endif %}
[gcode_macro _BEACON_APPLY_SCAN_COMPENSATION]
gcode =
{% set beacon_scan_compensation_profile = printer["gcode_macro RatOS"].beacon_scan_compensation_profile %}
{% set beacon_scan_compensation_enable = true if printer["gcode_macro RatOS"].beacon_scan_compensation_enable|default(false)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_SCAN_COMPENSATION" MSG="beacon_scan_compensation_profile {beacon_scan_compensation_profile}, beacon_scan_compensation_enable {beacon_scan_compensation_enable}"
{% if beacon_scan_compensation_enable %}
BEACON_APPLY_SCAN_COMPENSATION PROFILE={beacon_scan_compensation_profile}
{% endif %}
[gcode_macro _BEACON_MAYBE_SCAN_COMPENSATION]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set needs_scan_compensation = true if printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].needs_compensation|default(false)|lower == 'true' else false %}
{% if needs_scan_compensation %}
BEACON_CREATE_SCAN_COMPENSATION_MESH _AUTOMATED=True BED_TEMP={bed_temp} CHAMBER_TEMP={chamber_temp}
{% endif %}
[gcode_macro _BEACON_HOME_AND_ABL]
gcode =
MAYBE_HOME X=True Y=True
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% set needs_rehoming = False %}
{% if printer.z_tilt is defined and not printer.z_tilt.applied %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% set needs_rehoming = True %}
{% endif %}
{% if printer.quad_gantry_level is defined and not printer.quad_gantry_level.applied %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% set needs_rehoming = True %}
{% endif %}
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% if needs_rehoming %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% endif %}
[gcode_macro _BEACON_SAVE_MULTIPLIER]
gcode =
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set multiplier = printer["gcode_macro _BEACON_APPLY_RUNTIME_MULTIPLIER"].runtime_multiplier|default(-1.0)|float %}
DEBUG_ECHO PREFIX="_BEACON_SAVE_MULTIPLIER" MSG="multiplier: {multiplier}, beacon_contact_start_print_true_zero: {beacon_contact_start_print_true_zero}, beacon_contact_expansion_compensation: {beacon_contact_expansion_compensation}"
{% if multiplier > 0 and beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_multiplier VALUE={multiplier}
SET_GCODE_VARIABLE MACRO=_BEACON_APPLY_RUNTIME_MULTIPLIER VARIABLE=runtime_multiplier VALUE=-1.0
CONSOLE_ECHO TITLE="Hotend thermal expansion compensation" TYPE="success" MSG={'"New value is: %.6f_N_The new multiplier value has been saved to the configuration."' % multiplier}
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _BEACON_APPLY_RUNTIME_MULTIPLIER]
variable_runtime_multiplier = -1.0
gcode =
{% set toolhead = 0 %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set toolhead = 1 if idex_mode == 'primary' else 0 %}
{% endif %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set layer_number = printer["gcode_macro _ON_LAYER_CHANGE"].layer_number|default(0)|int %}
{% set is_printing_gcode = true if printer["gcode_macro START_PRINT"].is_printing_gcode|default(true)|lower == 'true' else false %}
{% if layer_number == 0 and is_printing_gcode %}
{% set link_url = "https://os.ratrig.com/docs/slicers" %}
{% set link_text = "RatOS Slicer Documentation" %}
{% set line_1 = '"Your slicer is not correctly reporting layer information. See the layer change custom g-code in the %s".' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="Missing layer information" TYPE="warning" MSG={line_1}
{% endif %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_RUNTIME_MULTIPLIER" MSG="layer_number: {layer_number}, is_printing_gcode: {is_printing_gcode}, beacon_contact_start_print_true_zero: {beacon_contact_start_print_true_zero}, beacon_contact_expansion_compensation: {beacon_contact_expansion_compensation}"
{% if layer_number == 1 and is_printing_gcode and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
{% set svv = printer.save_variables.variables %}
{% set nozzle_expansion_coefficient = svv.nozzle_expansion_coefficient_t0|default(0)|float %}
{% if toolhead == 1 %}
{% set nozzle_expansion_coefficient = svv.nozzle_expansion_coefficient_t1|default(0)|float %}
{% endif %}
{% set beacon_contact_expansion_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(1.0)|float %}
{% set print_temp = printer["gcode_macro _BEACON_SET_NOZZLE_TEMP_OFFSET"].runtime_temp|default(0)|int %}
{% if print_temp > 0 %}
{% set z_offset = printer.gcode_move.homing_origin.z|float %}
{% set temp_delta = print_temp - beacon_contact_true_zero_temp %}
{% set coefficient_per_degree = nozzle_expansion_coefficient / 100 %}
{% set z_offset_per_degree = z_offset / temp_delta %}
{% set new_multiplier = z_offset_per_degree / coefficient_per_degree %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_RUNTIME_MULTIPLIER" MSG="print_temp: {print_temp}, z_offset: {z_offset}, temp_delta: {temp_delta}, nozzle_expansion_coefficient: {nozzle_expansion_coefficient}, coefficient_per_degree: {coefficient_per_degree}, z_offset_per_degree: {z_offset_per_degree}, old_multiplier: {beacon_contact_expansion_multiplier}, new_multiplier: {new_multiplier}"
SET_GCODE_VARIABLE MACRO=_BEACON_APPLY_RUNTIME_MULTIPLIER VARIABLE=runtime_multiplier VALUE={new_multiplier}
{% endif %}
{% endif %}
[gcode_macro T0]
variable_join = 0
variable_remap = 0
variable_alert = ""
variable_filament_name = ""
variable_filament_type = ""
variable_filament_temp = 0
variable_runout_sensor = ""
variable_active = True
variable_color = "7bff33"
variable_hotend_type = "SF"
variable_has_cht_nozzle = True
variable_cooling_position_to_nozzle_distance = 40
variable_tooolhead_sensor_to_extruder_gear_distance = 15
variable_extruder_gear_to_cooling_position_distance = 30
variable_filament_loading_nozzle_offset = -5
variable_filament_grabbing_length = 5
variable_filament_grabbing_speed = 1
variable_enable_insert_detection = True
variable_enable_runout_detection = True
variable_enable_clog_detection = True
variable_unload_after_runout = True
variable_purge_after_load = 0
variable_purge_before_unload = 0
variable_extruder_load_speed = 60
variable_filament_load_speed = 10
variable_standby = False
variable_temperature_offset = 0
variable_has_oozeguard = False
variable_has_front_arm_nozzle_wiper = False
variable_resume_after_insert = False
gcode =
{% set x = params.X|default(-1.0)|float %}
{% set y = params.Y|default(-1.0)|float %}
{% set z = params.Z|default(0.0)|float %}
{% set s = params.S|default(1)|int %}
{% if printer["gcode_macro _SELECT_TOOL"] is defined %}
_SELECT_TOOL T=0 X={x} Y={y} Z={z} TOOLSHIFT={s}
{% endif %}
[save_variables]
filename = /home/pi/printer_data/config/ratos-variables.cfg
=======================
Extruder max_extrude_ratio=0.415752
mcu 'mcu': Starting serial connect
webhooks client 4104500776: New connection
webhooks client 4104500776: Client info {'program': 'Moonraker', 'version': 'v0.9.3-0-g71f9e67'}
Loaded MCU 'mcu' 118 commands (v0.12.0-396-gb7233d119 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34)
MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 BUS_PINS_i2c3_PA8_PC9=PA8,PC9 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h723xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1
mcu 'rpi': Starting connect
Loaded MCU 'rpi' 119 commands (?-20240727_132503-fv-az659-741 / gcc: (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110 binutils: (GNU Binutils for Raspbian) 2.35.2)
MCU 'rpi' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256
mcu 'toolboard_t0': Starting serial connect
Loaded MCU 'toolboard_t0' 100 commands (v0.12.0-396-gb7233d119 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34)
MCU 'toolboard_t0' config: ADC_MAX=4095 BUS_PINS_i2c1=PB6,PB7 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB7=PB8,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c1_PF1_PF0=PF1,PF0 BUS_PINS_i2c1a=PF1,PF0 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 CLOCK_FREQ=48000000 MCU=stm32f042x6 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PF0,PF1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1
mcu_temperature 'mcu' nominal base=-275.577689 slope=1631.474104
mcu_temperature 'toolboard_t0' nominal base=342.920354 slope=-724.778761
mcu 'beacon': Starting serial connect
Loaded MCU 'beacon' 45 commands (Beacon 2.1.0 / )
MCU 'beacon' config: ADC_MAX=4095 BEACON_ACCEL_BITS=12 BEACON_ACCEL_SCALE_16G=7.81 BEACON_ACCEL_SCALE_2G=0.98 BEACON_ACCEL_SCALE_4G=1.95 BEACON_ACCEL_SCALE_8G=3.91 BEACON_ADC_SMOOTH_COUNT=16 BEACON_HAS_ACCEL=1 BEACON_REV=H CLOCK_FREQ=32000000 MCU=beacon STATS_SUMSQ_BASE=256
Config error
Traceback (most recent call last):
File "/home/pi/klipper/klippy/klippy.py", line 135, in _connect
cb()
File "/home/pi/klipper/klippy/mcu.py", line 748, in _connect
self._send_config(None)
File "/home/pi/klipper/klippy/mcu.py", line 679, in _send_config
cb()
File "/home/pi/klipper/klippy/mcu.py", line 456, in _build_config
raise pins.error("shutdown value must be 0.0 or 1.0 on soft pwm")
pins.error: shutdown value must be 0.0 or 1.0 on soft pwm
Attempting MCU 'mcu' reset command
Attempting MCU 'rpi' config_reset command
b'Got EOF when reading from device'
Attempting MCU 'toolboard_t0' reset command
Attempting MCU 'beacon' reset command
webhooks client 4104500776: Disconnected
Restarting printer
Start printer at Sun May 25 00:44:48 2025 (1748130288.2 266.2)
===== Config file =====
[mcu rpi]
serial = /tmp/klipper_host_mcu
[board_pins btt-kraken]
aliases =
x_step_pin=PC14,
x_dir_pin=PC13,
x_enable_pin=PE6,
x_uart_pin=PD6,
x_diag_pin=PC15,
x_endstop_pin=PC15,
y_step_pin=PE5,
y_dir_pin=PE4,
y_enable_pin=PE3,
y_uart_pin=PD6,
y_diag_pin=PF0,
y_endstop_pin=PF0,
z0_step_pin=PG9,
z0_dir_pin=PG10,
z0_enable_pin=PG13,
z0_uart_pin=PA15,
z0_diag_pin=PF3,
z1_step_pin=PG11,
z1_dir_pin=PD7,
z1_enable_pin=PG12,
z1_uart_pin=PA9,
z1_diag_pin=PF4,
z2_step_pin=PB4,
z2_dir_pin=PB3,
z2_enable_pin=PB5,
z2_uart_pin=PA10,
z2_diag_pin=PF10,
z3_step_pin=PG15,
z3_dir_pin=PB6,
z3_enable_pin=PG14,
z3_uart_pin=PD2,
z3_diag_pin=PC0,
e_step_pin=PG9,
e_dir_pin=PG10,
e_enable_pin=PG13,
e_uart_pin=PD2,
e_diag_pin=PF1,
e_heater_pin=PF6,
e_sensor_pin=PB1,
stepper_spi_mosi_pin=PC8,
stepper_spi_miso_pin=PC7,
stepper_spi_sclk_pin=PC6,
adxl345_cs_pin=PE10,
bltouch_sensor_pin=PG1,
bltouch_control_pin=PE9,
probe_pin=PG1,
fan_part_cooling_pin=PA0,
fan_toolhead_cooling_pin=PA1,
fan_controller_board_pin=PA2,
heater_bed_heating_pin=PF5,
heater_bed_sensor_pin=PB0,
4p_fan_part_cooling_pin=PA6,
4p_fan_part_cooling_tach_pin=PC1,
4p_toolhead_cooling_pin=PE8,
4p_toolhead_cooling_tach_pin=PG0,
4p_controller_board_pin=PE8,
4p_controller_board_tach_pin=PG0
[mcu]
serial = /dev/RatOS/btt-kraken
[temperature_sensor Kraken]
sensor_type = temperature_mcu
[adxl345 controlboard]
cs_pin = PE10
spi_software_mosi_pin = PE14
spi_software_miso_pin = PE13
spi_software_sclk_pin = PE12
[board_pins toolboard_t0]
mcu = toolboard_t0
aliases =
e_step_pin=PB7,
e_dir_pin=PB6,
e_enable_pin=PB4,
e_uart_pin=PB5,
e_heater_pin=PA0,
e_sensor_pin=PA3,
stepper_spi_mosi_pin=null,
stepper_spi_miso_pin=null,
stepper_spi_sclk_pin=null,
adxl345_cs_pin=PA4,
bltouch_sensor_pin=PA15,
bltouch_control_pin=PB3,
probe_pin=PA15,
fan_part_cooling_pin=PA10,
fan_toolhead_cooling_pin=PA9,
fan_controller_board_pin=null,
heater_bed_heating_pin=null,
heater_bed_sensor_pin=null,
4p_fan_part_cooling_pin=null,
4p_fan_part_cooling_tach_pin=null,
4p_toolhead_cooling_pin=null,
4p_toolhead_cooling_tach_pin=null,
4p_controller_board_pin=null,
4p_controller_board_tach_pin=null
[mcu toolboard_t0]
serial = /dev/RatOS/ldo-orbitool-o2-t0
[temperature_sensor Orbitool_O2_T0]
sensor_type = temperature_mcu
sensor_mcu = toolboard_t0
[lis2dw toolboard_t0]
axes_map = x, z, y
cs_pin = toolboard_t0:PA4
spi_bus = spi1
[extruder]
max_power = 0.995
rotation_distance = 4.63
full_steps_per_rotation = 200
filament_diameter = 1.750
max_extrude_only_velocity = 60
max_extrude_only_distance = 200
nozzle_diameter = 0.5
heater_pin = toolboard_t0:PA0
sensor_type = PT1000
pullup_resistor = 2200
sensor_pin = toolboard_t0:PA3
min_extrude_temp = 170
min_temp = 0
max_temp = 285
pressure_advance = 0.05
step_pin = toolboard_t0:PB7
dir_pin = !toolboard_t0:e_dir_pin
enable_pin = !toolboard_t0:PB4
microsteps = 64
control = pid
pid_kp = 21.673
pid_ki = 1.338
pid_kd = 87.776
[adc_temperature hotend_power_scale]
temperature1 = 119
voltage1 = 1.91
temperature2 = 239
voltage2 = 3.82
[fan]
max_power = 0.995
shutdown_speed = 1.0
pin = PA6
cycle_time = 0.00004
tachometer_pin = ^PC1
tachometer_poll_interval = 0.0005
[heater_fan toolhead_cooling_fan]
max_power = 0.995
cycle_time = 0.0001
shutdown_speed = 0
pin = PA1
fan_speed = 1
heater = extruder
[output_pin O2_RUN_LED]
pin = toolboard_t0:PB8
shutdown_value = 0
value = 1
[temperature_sensor hotend_power_draw]
sensor_pin = toolboard_t0:PA2
sensor_type = hotend_power_scale
[gcode_macro RatOS]
variable_homing = "endstops"
variable_z_probe = "static"
variable_sensorless_x_current = 0.49699999999999994
variable_sensorless_y_current = 0.7242
variable_safe_home_x = "middle"
variable_safe_home_y = "middle"
variable_driver_type_x = "tmc2209"
variable_driver_type_y = "tmc2209"
variable_stowable_probe_stop_on_error = False
variable_chamber_filter_enable = True
variable_chamber_filter_speed = 0.5
variable_chamber_filter_disable_speed = 1.0
variable_chamber_filter_enable_at = "after_print_start"
variable_chamber_filter_disable_period = 300
variable_chamber_filter_disable_bed_temp = 0
variable_chamber_heater_enable = True
variable_chamber_heater_bed_temp = 115
variable_chamber_heater_preheating_temp = 150
variable_chamber_heater_heating_temp_offset = 25
variable_chamber_heater_control_external_heater = False
variable_chamber_heater_air_circulation_enable = True
variable_chamber_heater_air_circulation_fan_speed = 0.35
variable_chamber_heater_air_circulation_y_pos = 0
variable_chamber_heater_air_circulation_z_pos = 100
variable_chamber_heater_extra_fan_speed = 1.0
variable_chamber_heater_filter_fan_speed = 1.0
variable_led_status_action = 0.0,1.0,1.0
variable_led_status_success = 0.0,1.0,0.0
variable_led_status_error = 1.0,0.0,1.0
variable_led_status_on = 1.0,1.0,1.0
variable_led_status_off = 0.0,0.0,1.0
variable_led_status_standby = 0.1,0.1,0.1
variable_led_status_heating = 1.0,0.0,0.0
variable_led_status_cooling = 0.0,0.0,1.0
variable_calibrate_bed_mesh = True
variable_adaptive_mesh = True
variable_start_print_park_in = "front"
variable_start_print_park_z_height = 50
variable_end_print_park_in = "back"
variable_pause_print_park_in = "front"
variable_end_print_park_z_hop = 20
variable_nozzle_priming = "primeblob"
variable_nozzle_prime_start_x = "max"
variable_nozzle_prime_start_y = "min"
variable_nozzle_prime_direction = "auto"
variable_nozzle_prime_bridge_fan = 102
variable_probe_for_priming_result = None
variable_probe_for_priming_end_result = None
variable_probe_for_priming_result_t1 = None
variable_probe_for_priming_end_result_t1 = None
variable_probe_for_priming_disable_mesh_constraints = False
variable_adaptive_prime_offset_threshold = -1.0
variable_last_z_offset = None
variable_runout_park_in = "front"
variable_enable_unload_tip_forming = False
variable_filament_unload_length = 150
description = RatOS variable storage macro, will echo variables to the console when run.
variable_relative_extrusion = False
variable_force_absolute_position = False
variable_preheat_extruder = True
variable_preheat_extruder_temp = 150
variable_macro_travel_speed = 300
variable_macro_travel_accel = 3000
variable_macro_z_speed = 15
variable_bed_margin_x = [0, 0]
variable_bed_margin_y = [0, 0]
variable_printable_x_min = 0
variable_printable_x_max = 0
variable_printable_y_min = 0
variable_printable_y_max = 0
variable_end_print_motors_off = True
variable_status_color_ok = "00FF00"
variable_status_color_error = "FF0000"
variable_status_color_unknown = "FFFF00"
variable_end_print_retract_filament = 10
gcode =
ECHO_RATOS_VARS
variable_beacon_bed_mesh_scv = 25
variable_beacon_contact_z_homing = False
variable_beacon_contact_start_print_true_zero = True
variable_beacon_contact_wipe_before_true_zero = True
variable_beacon_contact_true_zero_temp = 150
variable_beacon_contact_prime_probing = True
variable_beacon_contact_expansion_compensation = True
variable_beacon_contact_bed_mesh = False
variable_beacon_contact_bed_mesh_samples = 2
variable_beacon_contact_z_tilt_adjust = False
variable_beacon_contact_z_tilt_adjust_samples = 2
variable_beacon_scan_compensation_enable = False
variable_beacon_scan_compensation_profile = "Contact"
variable_beacon_scan_compensation_probe_count = 15,15
variable_beacon_contact_poke_bottom_limit = -1
variable_homing_x = "sensorless"
variable_homing_y = "sensorless"
variable_x_driver_types = ["tmc5160"]
variable_x_axes = ["x"]
variable_y_driver_types = ["tmc5160"]
variable_y_axes = ["y"]
variable_z_driver_types = ["tmc5160", "tmc5160", "tmc5160", "tmc5160"]
variable_z_axes = ["z", "z1", "z2", "z3"]
[ratos_homing]
axes = xyz
z_hop = 15
z_hop_speed = 15
gcode =
_LED_ON
{% set prev_stop_on_error = printer["gcode_macro RatOS"].stowable_probe_stop_on_error %}
{% if printer["dual_carriage"] is defined %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set target_idex_mode = printer["dual_carriage"].carriage_1|lower %}
_IDEX_SINGLE
_SELECT_TOOL T={default_toolhead} TOOLSHIFT=false
{% endif %}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE=True
M400
G90
{% set X = true if params.X is defined else false %}
{% set Y = true if params.Y is defined else false %}
{% set Z = true if params.Z is defined else false %}
{% if printer["gcode_macro RatOS"].home_y_first|default(false)|lower == 'true' %}
HOME_Y X={X} Y={Y} Z={Z}
HOME_X X={X} Y={Y} Z={Z}
{% else %}
HOME_X X={X} Y={Y} Z={Z}
HOME_Y X={X} Y={Y} Z={Z}
{% endif %}
HOME_Z X={X} Y={Y} Z={Z}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE={prev_stop_on_error}
{% if printer["dual_carriage"] is defined %}
{% if target_idex_mode == "copy" %}
_IDEX_COPY
{% elif target_idex_mode == "mirror" %}
_IDEX_MIRROR
{% endif %}
{% endif %}
[gcode_macro HOME_X]
gcode =
{% set x_homed = 'x' in printer.toolhead.homed_axes %}
{% set homing = printer["gcode_macro RatOS"].homing|lower %}
{% set homing_x = printer["gcode_macro RatOS"].homing_x|lower %}
{% set homing_x = homing_x if homing_x else homing %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_X" MSG="printable_x_max: {printable_x_max}, safe_home_x: {safe_home_x}, axis_maximum.x: {printer.toolhead.axis_maximum.x}, bed_margin_x: {printer['gcode_macro RatOS'].bed_margin_x}"
{% if X or not Y and not Z %}
{% if homing_x == 'endstop' %}
G28 X
{% elif homing_x == 'sensorless' %}
{% if printer["dual_carriage"] is defined %}
{ action_emergency_stop("sensorless homing not supported on IDEX!") }
{% endif %}
HOME_X_SENSORLESS
{% else %}
{ action_emergency_stop("expected RatOS variable_homing_x to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_x, homing)) }
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set parking_position = printer["gcode_macro T%s" % (0 if default_toolhead==1 else 1)].parking_position|float %}
SET_DUAL_CARRIAGE CARRIAGE={0 if default_toolhead==1 else 1} MODE=PRIMARY
G1 X{parking_position} F{speed}
SET_DUAL_CARRIAGE CARRIAGE={default_toolhead} MODE=PRIMARY
{% endif %}
{% set x_homed = True %}
G0 X{safe_home_x} F{speed}
M400
{% endif %}
[gcode_macro HOME_Y]
gcode =
{% set y_homed = 'y' in printer.toolhead.homed_axes %}
{% set homing = printer["gcode_macro RatOS"].homing|lower %}
{% set homing_y = printer["gcode_macro RatOS"].homing_y|lower %}
{% set homing_y = homing_y if homing_y else homing %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_Y" MSG="printable_y_max: {printable_y_max}, safe_home_y: {safe_home_y}, axis_maximum.y: {printer.toolhead.axis_maximum.y}, bed_margin_y: {printer['gcode_macro RatOS'].bed_margin_y}"
{% if Y or not X and not Z %}
{% if homing_y == 'endstop' %}
G28 Y
{% elif homing_y == 'sensorless' %}
HOME_Y_SENSORLESS
{% else %}
{ action_emergency_stop("expected RatOS variable_homing_y to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_y, homing)) }
{% endif %}
{% set y_homed = True %}
G0 Y{safe_home_y} F{speed}
{% endif %}
[gcode_macro HOME_Z]
gcode =
{% set x_homed = 'x' in printer.toolhead.homed_axes %}
{% set y_homed = 'y' in printer.toolhead.homed_axes %}
{% set z_probe = printer["gcode_macro RatOS"].z_probe %}
{% set beacon_contact_z_homing = true if printer["gcode_macro RatOS"].beacon_contact_z_homing|default(false)|lower == 'true' else false %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_Z" MSG="x_homed: {x_homed}, y_homed: {y_homed}, z_probe: {z_probe}, beacon_contact_z_homing: {beacon_contact_z_homing}"
{% if Z or not Y and not X %}
RATOS_ECHO MSG="Homing Z"
{% if x_homed == False or y_homed == False %}
{ action_emergency_stop("X and Y must be homed before homing Z") }
{% else %}
{% if z_probe == "stowable" %}
DEPLOY_PROBE
_MOVE_TO_SAFE_Z_HOME
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_homing %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% else %}
G28 Z
{% endif %}
_Z_HOP
STOW_PROBE
{% else %}
_MOVE_TO_SAFE_Z_HOME
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_homing %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% else %}
G28 Z
{% endif %}
_Z_HOP
{% endif %}
{% endif %}
{% endif %}
[gcode_macro HOME_X_SENSORLESS]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="home_x_sensorless"
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
M204 S1000
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endif %}
G4 P300
G28 X
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].x_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].y_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current}
{% endif %}
G4 P300
RESTORE_TOOLHEAD_SETTINGS KEY="home_x_sensorless"
[gcode_macro HOME_Y_SENSORLESS]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="home_y_sensorless"
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
M204 S1000
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endif %}
G4 P300
G28 Y
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].x_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].y_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current}
{% endif %}
G4 P300
RESTORE_TOOLHEAD_SETTINGS KEY="home_y_sensorless"
[gcode_macro _Z_HOP]
description = Move Z axis up by Z_HOP distance at Z_HOP_SPEED. In relative mode it will move Z axis up by Z_HOP distance. In absolute mode it will move Z axis to Z_HOP distance.
gcode =
{% set z_hop = printer.configfile.config.ratos_homing.z_hop|float %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
G0 Z{z_hop} F{z_hop_speed}
[gcode_macro _MOVE_TO_SAFE_Z_HOME]
description = Move to safe home position with optional Z_HOP (pass Z_HOP=True as parameter)
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% if params.Z_HOP is defined %}
_Z_HOP
{% endif %}
DEBUG_ECHO PREFIX="_MOVE_TO_SAFE_Z_HOME" MSG="axis_maximum.x: {printer.toolhead.axis_maximum.x}, axis_maximum.y: {printer.toolhead.axis_maximum.y}, bed_margin_x: {printer['gcode_macro RatOS'].bed_margin_x}, bed_margin_y: {printer['gcode_macro RatOS'].bed_margin_y}, safe_home_x: {safe_home_x}, safe_home_y: {safe_home_y}, printable_x_max: {printable_x_max}, printable_y_max: {printable_y_max}"
G0 X{safe_home_x} Y{safe_home_y} F{speed}
[gcode_macro MAYBE_HOME]
description = Only home unhomed axis
variable_is_kinematic_position_overriden = False
gcode =
{% if printer["gcode_macro MAYBE_HOME"].is_kinematic_position_overriden|lower == 'true' %}
RATOS_ECHO MSG="SET_CENTER_KINEMATIC_POSITION has been abused. Homing all axes. Please refrain from using SET_CENTER_KINEMATIC_POSITION outside of debugging purposes."
G28
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=False
{% else %}
{% set axes = '' %}
{% set isHomed = true %}
{% set axesToHome = '' %}
{% if params.X is defined %}
{% set axes = axes ~ 'X ' %}
{% if 'x' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'X ' %}
{% endif %}
{% endif %}
{% if params.Y is defined %}
{% set axes = axes ~ 'Y ' %}
{% if 'y' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Y ' %}
{% endif %}
{% endif %}
{% if params.Z is defined %}
{% set axes = axes ~ 'Z ' %}
{% if 'z' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Z ' %}
{% endif %}
{% endif %}
{% if params.X is not defined and params.Y is not defined and params.Z is not defined %}
{% set axes = '' %}
{% if 'x' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'X ' %}
{% endif %}
{% if 'y' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Y ' %}
{% endif %}
{% if 'z' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Z ' %}
{% endif %}
{% endif %}
{% if isHomed is false %}
RATOS_ECHO MSG="Homing {axesToHome}"
G28 {axesToHome}
{% else %}
RATOS_ECHO MSG="All requested axes already homed, skipping.."
{% endif %}
{% endif %}
[gcode_macro PID_CALIBRATE_HOTEND]
description = Perform a PID calibration test for a given extruder heater.
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set temp = params.TEMP|default(220)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_HOTEND" MSG="TEMP={temp}"
{% if printer["dual_carriage"] is not defined %}
RATOS_ECHO MSG="PID calibration hotend heater T0 at {temp}°C..."
PID_CALIBRATE HEATER=extruder TARGET={temp}
_CONSOLE_SAVE_CONFIG
{% else %}
{% if toolhead==0 or toolhead==1 %}
RATOS_ECHO MSG="PID calibration hotend heater T{toolhead} at {temp}°C..."
PID_CALIBRATE HEATER=extruder{'' if toolhead==0 else toolhead} TARGET={temp}
_CONSOLE_SAVE_CONFIG
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
_LEARN_MORE_CALIBRATION
[gcode_macro PID_CALIBRATE_BED]
description = Perform a PID calibration test for the bed heater.
gcode =
{% set temp = params.TEMP|default(80)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_BED" MSG="TEMP={temp}"
RATOS_ECHO MSG="PID calibration bed heater at {temp}°C..."
PID_CALIBRATE HEATER=heater_bed TARGET={temp}
_CONSOLE_SAVE_CONFIG
_LEARN_MORE_CALIBRATION
[gcode_macro PID_CALIBRATE_CHAMBER_HEATER]
description = Perform a PID calibration test for the chamber heater.
gcode =
{% set temp = params.TEMP|default(150)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_CHAMBER_HEATER" MSG="TEMP={temp}"
{% if printer["heater_generic chamber_heater"] is defined %}
RATOS_ECHO MSG="PID calibration chamber heater at {temp}°C..."
PID_CALIBRATE HEATER=chamber_heater TARGET={temp}
_CONSOLE_SAVE_CONFIG
_LEARN_MORE_CALIBRATION
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_heater" %}
{% set link_text = "RatOS Chamber Heater" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber heater found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro INITIALIZE_PA_TUNING]
description = Start a pressure advance tuning tower.
gcode =
{% set start = params.START|default(0.0)|float %}
{% set factor = params.FACTOR|default(0.001)|float %}
{% set layer_number = printer["gcode_macro _ON_LAYER_CHANGE"].layer_number|default(0)|int %}
{% set is_printing_gcode = true if printer["gcode_macro START_PRINT"].is_printing_gcode|default(true)|lower == 'true' else false %}
{% if is_printing_gcode and layer_number < 2 %}
DEBUG_ECHO PREFIX="START_PA_TOWER" MSG="START: {start}, FACTOR: {factor}"
RATOS_ECHO MSG="Starting presssure advance tuning tower..."
TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START={start} FACTOR={factor}
{% endif %}
_LEARN_MORE_CALIBRATION
[gcode_macro CHAMBER_FILTER_ON]
gcode =
{% if printer["fan_generic filter"] is defined %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Activating chamber filter..."
_CHAMBER_FILTER_TURN_ON
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber filter found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro CHAMBER_FILTER_OFF]
gcode =
{% if printer["fan_generic filter"] is defined %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Deactivating chamber filter..."
_CHAMBER_FILTER_TURN_OFF
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber filter found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro _CHAMBER_FILTER_ON]
gcode =
{% set at = params.AT|default('')|lower %}
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set chamber_filter_enable_at = printer["gcode_macro RatOS"].chamber_filter_enable_at|default('after_print_start')|lower %}
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_ON" MSG="at: {at}, chamber_filter_enable: {chamber_filter_enable}, chamber_filter_enable_at: {chamber_filter_enable_at}, chamber_filter_speed: {chamber_filter_speed}"
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if chamber_filter_enable_at == at %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Activating chamber filter..."
_CHAMBER_FILTER_TURN_ON AT={at}
{% if chamber_filter_enable_at == "print_end" %}
_LED_CHAMBER_FILTER_ON
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _CHAMBER_FILTER_OFF]
gcode =
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set filter_disable_period = printer["gcode_macro RatOS"].chamber_filter_disable_period|default(0)|int %}
{% set filter_disable_bed_temp = printer["gcode_macro RatOS"].chamber_filter_disable_bed_temp|default(0)|int %}
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_OFF" MSG="chamber_filter_enable: {chamber_filter_enable}, filter_disable_period: {filter_disable_period}, filter_disable_bed_temp: {filter_disable_bed_temp}"
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if filter_disable_period > 0 %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Waiting {filter_disable_period} seconds before turning chamber filter off..."
UPDATE_DELAYED_GCODE ID=_CHAMBER_FILTER_OFF_TIMER DURATION={filter_disable_period}
{% endif %}
{% if filter_disable_bed_temp > 0 %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Waiting for bed temp to cool down to {filter_disable_bed_temp}°C to turn filter off..."
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM=0 MAXIMUM={filter_disable_bed_temp}
_CHAMBER_FILTER_TURN_OFF
_LED_CHAMBER_FILTER_OFF
{% endif %}
{% endif %}
[delayed_gcode _CHAMBER_FILTER_OFF_TIMER]
gcode =
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_OFF_TIMER" MSG="executed"
_CHAMBER_FILTER_TURN_OFF
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Chamber filter turned off!"
_LED_CHAMBER_FILTER_OFF
[gcode_macro _CHAMBER_FILTER_TURN_ON]
gcode =
{% set at = params.AT|default('')|lower %}
{% set chamber_filter_speed = printer["gcode_macro RatOS"].chamber_filter_speed|default(0)|float %}
{% if at == "print_end" %}
{% set chamber_filter_speed = printer["gcode_macro RatOS"].chamber_filter_disable_speed|default(0)|float %}
{% endif %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_FILTER_OFF_TIMER DURATION=0
SET_FAN_SPEED FAN=filter SPEED={chamber_filter_speed}
[gcode_macro _CHAMBER_FILTER_TURN_OFF]
gcode =
SET_FAN_SPEED FAN=filter SPEED=0
[gcode_macro _CHAMBER_FILTER_SANITY_CHECK]
gcode =
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set filter_disable_period = printer["gcode_macro RatOS"].chamber_filter_disable_period|default(0)|int %}
{% set filter_disable_bed_temp = printer["gcode_macro RatOS"].chamber_filter_disable_bed_temp|default(0)|int %}
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if filter_disable_bed_temp > 0 and filter_disable_period > 0 %}
_LEARN_MORE_CHAMBER_FILTER
{action_respond_info("Wrong chamber filter options configured! Set 'filter_disable_bed_temp' or 'filter_disable_period' variable, not both.")}
{% endif %}
{% if filter_disable_bed_temp == 0 and filter_disable_period == 0 %}
_LEARN_MORE_CHAMBER_FILTER
{action_respond_info("Wrong chamber filter options configured! Set 'filter_disable_bed_temp' or 'filter_disable_period' variable.")}
{% endif %}
{% endif %}
[gcode_macro CHAMBER_HEATER_ON]
gcode =
{% set chamber_temp = params.CHAMBER_TEMP|default(45)|int %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp} IS_FROM_START_PRINT=False
[gcode_macro CHAMBER_HEATER_OFF]
gcode =
_CHAMBER_HEATER_OFF
[gcode_macro _CHAMBER_HEATER_ON]
variable_chamber_temp = 0
gcode =
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set start_chamber_temp = params.START_CHAMBER_TEMP|default(0)|int %}
{% set is_from_start_print = true if params.IS_FROM_START_PRINT|default(True)|lower == 'true' else false %}
{% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set chamber_heater_enable = true if printer["gcode_macro RatOS"].chamber_heater_enable|default(true)|lower == 'true' else false %}
{% set chamber_heater_bed_temp = printer["gcode_macro RatOS"].chamber_heater_bed_temp|default(115)|int %}
{% set chamber_heater_preheating_temp = printer["gcode_macro RatOS"].chamber_heater_preheating_temp|default(150)|int %}
{% set chamber_heater_heating_temp_offset = printer["gcode_macro RatOS"].chamber_heater_heating_temp_offset|default(20)|int %}
{% set chamber_heater_control_external_heater = true if printer["gcode_macro RatOS"].chamber_heater_control_external_heater|default(true)|lower == 'true' else false %}
{% set chamber_heater_air_circulation_enable = true if printer["gcode_macro RatOS"].chamber_heater_air_circulation_enable|default(true)|lower == 'true' else false %}
{% set chamber_heater_air_circulation_fan_speed = printer["gcode_macro RatOS"].chamber_heater_air_circulation_fan_speed|default(0.35)|float %}
{% set chamber_heater_air_circulation_y_pos = printer["gcode_macro RatOS"].chamber_heater_air_circulation_y_pos|default(0)|float %}
{% set chamber_heater_air_circulation_z_pos = printer["gcode_macro RatOS"].chamber_heater_air_circulation_z_pos|default(100)|float %}
DEBUG_ECHO PREFIX="_CHAMBER_HEATER_ON" MSG="chamber_heater_enable: {chamber_heater_enable}, chamber_heater_preheating_temp: {chamber_heater_preheating_temp}, chamber_heater_heating_temp_offset: {chamber_heater_heating_temp_offset}, bed_temp: {bed_temp}, chamber_temp: {chamber_temp}, start_chamber_temp: {start_chamber_temp}"
{% if chamber_heater_enable and chamber_temp > 0 and chamber_heater_bed_temp > 0 %}
_LED_HEATING
RATOS_ECHO MSG="Preheating chamber to {(start_chamber_temp if start_chamber_temp > 0 else chamber_temp)}°C..."
{% set chamber_temp_sensor = "extruder" %}
{% if printer["dual_carriage"] is defined and default_toolhead == 1 %}
{% set chamber_temp_sensor = "extruder1" %}
{% endif %}
{% if printer["temperature_sensor chamber"] is defined %}
{% set chamber_temp_sensor = "temperature_sensor chamber" %}
{% endif %}
{% set current_chamber_temp = printer['%s' % chamber_temp_sensor].temperature|int %}
{% set needs_heating = current_chamber_temp < (start_chamber_temp if start_chamber_temp > 0 else chamber_temp) %}
{% if needs_heating %}
_USER_CHAMBER_HEATER_BEFORE_PREHEATING
{% endif %}
{% if needs_heating %}
{% if chamber_heater_air_circulation_enable and chamber_heater_air_circulation_fan_speed > 0 %}
{% if not is_from_start_print %}
MAYBE_HOME
{% endif %}
G0 Z{chamber_heater_air_circulation_z_pos} F{z_speed}
G0 Y{chamber_heater_air_circulation_y_pos} F{speed}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={chamber_heater_air_circulation_fan_speed if default_toolhead == 0 else 0}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={chamber_heater_air_circulation_fan_speed if default_toolhead == 1 else 0}
{% else %}
M106 S{(255 * chamber_heater_air_circulation_fan_speed)}
{% endif %}
{% else %}
{% if is_from_start_print %}
G0 Z{z} F{z_speed}
{% endif %}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=_CHAMBER_HEATER_ON VARIABLE=chamber_temp VALUE={chamber_temp}
{% if needs_heating %}
M140 S{chamber_heater_bed_temp}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={chamber_heater_preheating_temp}
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=1.0
{% endif %}
{% endif %}
{% if needs_heating %}
_CHAMBER_HEATER_EXTRA_FAN_ON
{% endif %}
{% if needs_heating %}
TEMPERATURE_WAIT SENSOR="{chamber_temp_sensor}" MINIMUM={(start_chamber_temp if start_chamber_temp > 0 else chamber_temp)}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={(chamber_temp + chamber_heater_heating_temp_offset)}
{% endif %}
{% endif %}
{% if printer["fan_generic filter"] is defined %}
{% if printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float > 0 %}
SET_FAN_SPEED FAN=filter SPEED=0
_CHAMBER_FILTER_ON AT="before_print_start"
{% endif %}
{% endif %}
{% if needs_heating %}
{% if chamber_heater_air_circulation_enable and chamber_heater_air_circulation_fan_speed > 0 %}
G28 Z
{% endif %}
{% endif %}
{% if needs_heating %}
_USER_CHAMBER_HEATER_AFTER_PREHEATING
{% endif %}
{% if printer["temperature_sensor chamber"] is defined %}
{% if printer["heater_generic chamber_heater"] is defined %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined and chamber_heater_control_external_heater %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED=0
SET_FAN_SPEED FAN=part_fan_t1 SPEED=0
{% else %}
M106 S0
{% endif %}
_LED_SUCCESS
{% endif %}
[gcode_macro _CHAMBER_HEATER_OFF]
gcode =
RATOS_ECHO MSG="Deactivating chamber heater..."
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=0
SET_GCODE_VARIABLE MACRO=_CHAMBER_HEATER_ON VARIABLE=chamber_temp VALUE=0
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=0
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=0.0
{% endif %}
_CHAMBER_HEATER_EXTRA_FAN_OFF
[delayed_gcode _CHAMBER_HEATER_CONTROL]
initial_duration = 0.
gcode =
{% set chamber_temp = printer["gcode_macro _CHAMBER_HEATER_ON"].chamber_temp|default(0)|int %}
{% set chamber_heater_heating_temp_offset = printer["gcode_macro RatOS"].chamber_heater_heating_temp_offset|default(20)|int %}
{% set current_chamber_temp = printer['temperature_sensor chamber'].temperature|int %}
{% if current_chamber_temp < chamber_temp %}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={(chamber_temp + chamber_heater_heating_temp_offset)}
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=1.0
{% endif %}
{% endif %}
{% if current_chamber_temp >= chamber_temp %}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=0
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=0.0
{% endif %}
{% endif %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
[gcode_macro _CHAMBER_HEATER_EXTRA_FAN_ON]
gcode =
{% set chamber_heater_extra_fan_speed = printer["gcode_macro RatOS"].chamber_heater_extra_fan_speed|default(0.0)|float %}
{% if printer["fan_generic chamber_heater_extra_fan"] is defined %}
{% if chamber_heater_extra_fan_speed > 0 %}
SET_FAN_SPEED FAN=chamber_heater_extra_fan SPEED={chamber_heater_extra_fan_speed}
{% endif %}
{% endif %}
[gcode_macro _CHAMBER_HEATER_EXTRA_FAN_OFF]
gcode =
{% if printer["fan_generic chamber_heater_extra_fan"] is defined %}
SET_FAN_SPEED FAN=chamber_heater_extra_fan SPEED=0
{% endif %}
[gcode_macro _USER_CHAMBER_HEATER_BEFORE_PREHEATING]
description = Will be executed before chamber preheating, only if heating is needed.
gcode =
[gcode_macro _USER_CHAMBER_HEATER_AFTER_PREHEATING]
description = Will be executed after chamber preheating, only if heating was needed.
gcode =
[gcode_macro _LED_START_PRINTING]
gcode =
_LED_ACTION
[gcode_macro _LED_START_PRINTING_ERROR]
gcode =
_LED_ERROR
[gcode_macro _LED_PRINTING]
gcode =
_LED_ON TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_PAUSE]
gcode =
_LED_ACTION
[gcode_macro _LED_CHAMBER_FILTER_ON]
gcode =
_LED_ACTION
[gcode_macro _LED_CHAMBER_FILTER_OFF]
gcode =
_LED_STANDBY
[gcode_macro _LED_LOADING_FILAMENT]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_LOADED]
gcode =
_LED_SUCCESS TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_RUNOUT]
gcode =
_LED_ERROR TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_CLOG]
gcode =
_LED_ERROR TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_UNLOADING_FILAMENT]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_UNLOADED]
gcode =
_LED_SUCCESS TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_DEACTIVATE_TOOLHEAD]
gcode =
_LED_OFF TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_TOOLHEAD_STANDBY]
gcode =
_LED_STANDBY TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_TOOLHEAD_WAKEUP]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_MOTORS_OFF]
gcode =
_LED_STANDBY
_LED_VAOC_OFF
[gcode_macro _LED_INPUT_SHAPER_START]
gcode =
_LED_ACTION
[gcode_macro _LED_INPUT_SHAPER_END]
gcode =
_LED_ON
[gcode_macro _LED_BEACON_CALIBRATION_START]
gcode =
_LED_ACTION
[gcode_macro _LED_BEACON_CALIBRATION_END]
gcode =
_LED_ON
[gcode_macro _LED_BEACON_CALIBRATION_ERROR]
gcode =
_LED_ERROR
[gcode_macro _LED_VAOC_ON]
gcode =
{% if printer['neopixel vaoc_led'] is defined %}
SET_LED LED=vaoc_led RED=1.0 GREEN=1.0 BLUE=1.0
{% endif %}
[gcode_macro _LED_VAOC_OFF]
gcode =
{% if printer['neopixel vaoc_led'] is defined %}
SET_LED LED=vaoc_led RED=0.0 GREEN=0.0 BLUE=0.0
{% endif %}
[gcode_macro _LED_ACTION]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_action %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_SUCCESS]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_success %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_HEATING]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_heating %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_COOLING]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_cooling %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_ERROR]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_error %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_ON]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_on %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_OFF]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_off %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_STANDBY]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_standby %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_SET]
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set r = params.R|default(0)|float %}
{% set g = params.G|default(0)|float %}
{% set b = params.B|default(0)|float %}
{% if toolhead >= 0 %}
{% if printer['neopixel nozzle_led_t%s' % toolhead] is defined %}
SET_LED LED={'nozzle_led_t%s' % toolhead} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% else %}
{% if printer['neopixel nozzle_led_t0'] is defined %}
SET_LED LED={'nozzle_led_t0'} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% if printer['neopixel nozzle_led_t1'] is defined %}
SET_LED LED={'nozzle_led_t1'} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% endif %}
_USER_LED_SET { rawparams }
[gcode_macro _USER_LED_SET]
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set r = params.R|default(0)|float %}
{% set g = params.G|default(0)|float %}
{% set b = params.B|default(0)|float %}
[gcode_macro LOAD_FILAMENT]
description = Loads new filament. Note: be careful with PETG, make sure you inspect the tip of your filament before loading to avoid jams.
variable_ignore_min_extrude_temp = True
gcode =
_LEARN_MORE_FILAMENT
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set filament_name = params._NAME|default('')|string %}
{% set filament_type = params._TYPE|default('')|string %}
{% if filament_name == '' or filament_type == '' %}
{% set filament_name = 'unknown' %}
{% set filament_type = 'unknown' %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
_DEFAULT_LOAD_FILAMENT TEMP={temp} NAME={filament_name} TYPE={filament_type}
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Loading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead==0 or toolhead==1 %}
_IDEX_LOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead} NAME={filament_name} TYPE={filament_type}
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
[gcode_macro _DEFAULT_LOAD_FILAMENT]
description = Load filament macro for non IDEX printers.
gcode =
{% set temp = params.TEMP|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_DEFAULT_LOAD_FILAMENT" MSG="TEMP={temp}"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
_LED_LOADING_FILAMENT TOOLHEAD=0
SAVE_GCODE_STATE NAME=load_state
{% if printer.extruder.temperature|int < temp or printer.extruder.can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating extruder to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={temp}
_LOAD_FILAMENT TOOLHEAD=0
RESTORE_GCODE_STATE NAME=load_state
{% if filament_name != '' and filament_type != '' %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('{filament_type}', '{filament_name}', {temp})"
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={temp}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
_LED_FILAMENT_LOADED TOOLHEAD=0
[gcode_macro _IDEX_LOAD_FILAMENT]
description = Load filament macro for IDEX printer.
gcode =
{% set temp = params.TEMP|int %}
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_IDEX_LOAD_FILAMENT" MSG="TEMP: {temp}, TOOLHEAD: {toolhead}"
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_LOADING_FILAMENT TOOLHEAD={toolhead}
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
{% if not printer.pause_resume.is_paused %}
{% if printer[target_extruder].temperature|int < temp or printer[target_extruder].can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating T{toolhead} to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={temp}
{% endif %}
_LOAD_FILAMENT TOOLHEAD={toolhead} TEMP={temp}
{% if filament_name != '' and filament_type != '' %}
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('{filament_type}', '{filament_name}', {temp})"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='"{filament_name}"'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='"{filament_type}"'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE={temp}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_ok}"'
_LED_FILAMENT_LOADED TOOLHEAD={toolhead}
[gcode_macro _LOAD_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT" MSG="TOOLHEAD: {toolhead}"
_MOVE_TO_LOADING_POSITION TOOLHEAD={toolhead}
_LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE TOOLHEAD={toolhead}
_LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE TOOLHEAD={toolhead}
_CLEANING_MOVE TOOLHEAD={toolhead}
[gcode_macro _LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set extruder_load_speed = printer["gcode_macro T%s" % toolhead].extruder_load_speed|float * 60 %}
{% set extruder_gear_to_cooling_position_distance = printer["gcode_macro T%s" % toolhead].extruder_gear_to_cooling_position_distance|float %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Loading filament into hotend.."
G92 E0
G0 E{extruder_gear_to_cooling_position_distance} F{extruder_load_speed}
G92 E0
M400
RATOS_ECHO MSG="Filament loaded into hotend."
[gcode_macro _LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set load_speed = printer["gcode_macro T%s" % toolhead].filament_load_speed|float * 60 %}
{% set filament_loading_nozzle_offset = printer["gcode_macro T%s" % toolhead].filament_loading_nozzle_offset|float %}
{% set cooling_position_to_nozzle_distance = printer["gcode_macro T%s" % toolhead].cooling_position_to_nozzle_distance|float %}
{% set purge_after_load = printer["gcode_macro T%s" % toolhead].purge_after_load|float %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Loading filament into nozzle... Please wait!"
G92 E0
G0 E{cooling_position_to_nozzle_distance + filament_loading_nozzle_offset} F{load_speed}
G92 E0
G4 P1000
_PURGE_FILAMENT TOOLHEAD={toolhead} E={purge_after_load}
RATOS_ECHO MSG="Filament loaded into nozzle!"
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_INSERT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_INSERT" MSG="TOOLHEAD: {toolhead}"
{% set filament_grabbing_length = printer["gcode_macro T%s" % toolhead].filament_grabbing_length|float %}
{% set filament_grabbing_speed = printer["gcode_macro T%s" % toolhead].filament_grabbing_speed|float %}
{% set resume_after_insert = true if printer["gcode_macro T%s" % toolhead].resume_after_insert|default(true)|lower == 'true' else false %}
{% set enable_insert_detection = true if printer["gcode_macro T%s" % toolhead].enable_insert_detection|default(true)|lower == 'true' else false %}
{% set current_idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% if enable_insert_detection %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_INSERT" MSG="toolhead: {toolhead}, filament_grabbing_length: {filament_grabbing_length}, filament_grabbing_speed: {filament_grabbing_speed}, current_idex_mode: {current_idex_mode}"
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Loading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
FORCE_MOVE STEPPER={'extruder%s' % ('' if toolhead == 0 else toolhead)} DISTANCE={filament_grabbing_length} VELOCITY={filament_grabbing_speed}
M400
{% if printer.pause_resume.is_paused %}
LOAD_FILAMENT TOOLHEAD={toolhead}
{% if resume_after_insert %}
RESUME
{% endif %}
{% else %}
{% if not printer.virtual_sdcard.is_active %}
LOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_INSERT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_INSERT" MSG="TOOLHEAD: {toolhead}"
[gcode_macro _PURGE_BEFORE_UNLOAD]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set purge_before_unload = printer["gcode_macro T%s" % toolhead].purge_before_unload|float %}
DEBUG_ECHO PREFIX="_PURGE_BEFORE_UNLOAD" MSG="TOOLHEAD: {toolhead}"
{% if purge_before_unload > 0 %}
G92 E0
G0 E{purge_before_unload} F300
G92 E0
M400
{% endif %}
[gcode_macro _PURGE_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set e = params.E|int %}
{% set r = params.R|default(0)|int %}
DEBUG_ECHO PREFIX="_PURGE_FILAMENT" MSG="TOOLHEAD: {toolhead}, E: {e}"
{% if e > 0 %}
G92 E0
G0 E{e} F300
G92 E0
M400
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={0.4 if toolhead == 0 else 0}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={0.4 if toolhead == 1 else 0}
{% else %}
M106 S{(255 * 0.4)}
{% endif %}
{% endif %}
G4 P3000
{% if r > 0 %}
G92 E0
G0 E-{r} F300
G92 E0
M400
{% endif %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED=0
SET_FAN_SPEED FAN=part_fan_t1 SPEED=0
{% else %}
M106 S0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _MOVE_TO_PARKING_POSITION]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_MOVE_TO_PARKING_POSITION" MSG="TOOLHEAD: {toolhead}"
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].parking_position is defined %}
{% set parking_position = printer["gcode_macro T%s" % toolhead].parking_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
G1 X{parking_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _MOVE_TO_LOADING_POSITION]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_MOVE_TO_LOADING_POSITION" MSG="TOOLHEAD: {toolhead}"
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].loading_position is defined %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% set act_t = 1 if idex_mode == 'primary' else 0 %}
{% if act_t == toolhead %}
{% set loading_position = printer["gcode_macro T%s" % toolhead].loading_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
G1 X{loading_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _CLEANING_MOVE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].parking_position is defined and printer["gcode_macro T%s" % toolhead].loading_position is defined %}
{% set loading_position = printer["gcode_macro T%s" % toolhead].loading_position|float %}
{% set parking_position = printer["gcode_macro T%s" % toolhead].parking_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
{% set cleaning_position = loading_position %}
{% if loading_position == parking_position %}
{% if loading_position > 0 %}
{% set cleaning_position = loading_position - 30 %}
{% else %}
{% set cleaning_position = loading_position + 30 %}
{% endif %}
{% endif %}
G1 X{parking_position} F{speed}
G1 X{cleaning_position} F{speed}
G1 X{parking_position} F{speed}
G1 X{cleaning_position} F{speed}
G1 X{parking_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _START_PRINT_BED_MESH]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="start_print_bed_mesh"
SET_MACRO_TRAVEL_SETTINGS
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set X=[params.X0|default(-1)|float, params.X1|default(-1)|float] %}
{% set Y=[params.Y0|default(-1)|float, params.Y1|default(-1)|float] %}
DEBUG_ECHO PREFIX="_START_PRINT_BED_MESH" MSG="idex_mode: {idex_mode}, X: {X}, Y: {Y}"
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set X=[0, printable_x_max] %}
{% endif %}
{% set beacon_bed_mesh_scv = printer["gcode_macro RatOS"].beacon_bed_mesh_scv|default(25)|int %}
{% set beacon_contact_bed_mesh_samples = printer["gcode_macro RatOS"].beacon_contact_bed_mesh_samples|default(2)|int %}
{% set beacon_contact_bed_mesh = true if printer["gcode_macro RatOS"].beacon_contact_bed_mesh|default(false)|lower == 'true' else false %}
{% if printer.configfile.settings.beacon is defined and not beacon_contact_bed_mesh %}
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={beacon_bed_mesh_scv}
{% endif %}
{% set default_profile = printer["gcode_macro RatOS"].bed_mesh_profile|default('ratos') %}
{% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %}
BED_MESH_CLEAR
{% if printer["gcode_macro RatOS"].adaptive_mesh|lower == 'true' %}
CALIBRATE_ADAPTIVE_MESH PROFILE={default_profile} X0={X[0]} X1={X[1]} Y0={Y[0]} Y1={Y[1]} T={params.T|int} BOTH_TOOLHEADS={params.BOTH_TOOLHEADS} IDEX_MODE={idex_mode}
{% else %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% endif %}
BED_MESH_PROFILE LOAD={default_profile}
{% elif printer["gcode_macro RatOS"].bed_mesh_profile is defined %}
BED_MESH_CLEAR
BED_MESH_PROFILE LOAD={printer["gcode_macro RatOS"].bed_mesh_profile}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print_bed_mesh"
[gcode_macro CALIBRATE_ADAPTIVE_MESH]
gcode =
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_bed_mesh_samples = printer["gcode_macro RatOS"].beacon_contact_bed_mesh_samples|default(2)|int %}
{% set beacon_contact_bed_mesh = true if printer["gcode_macro RatOS"].beacon_contact_bed_mesh|default(false)|lower == 'true' else false %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set default_profile = params.PROFILE %}
{% set x0 = params.X0|default(-1)|float %}
{% set y0 = params.Y0|default(-1)|float %}
{% set x1 = params.X1|default(-1)|float %}
{% set y1 = params.Y1|default(-1)|float %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Recieved coordinates X0={x0} Y0={y0} X1={x1} Y1={y1}"
{% if x0 >= x1 or y0 >= y1 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Invalid coordinates received. Please check your slicer settings. Falling back to full bed mesh."
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% else %}
{% set mesh_config = printer.configfile.config.bed_mesh %}
{% set min_x = mesh_config.mesh_min.split(",")[0]|float %}
{% set min_y = mesh_config.mesh_min.split(",")[1]|float %}
{% set max_x = mesh_config.mesh_max.split(",")[0]|float %}
{% set max_y = mesh_config.mesh_max.split(",")[1]|float %}
{% set mesh_x0 = [[x0, max_x]|min, min_x]|max %}
{% set mesh_y0 = [[y0, max_y]|min, min_y]|max %}
{% set mesh_x1 = [[x1, max_x]|min, min_x]|max %}
{% set mesh_y1 = [[y1, max_y]|min, min_y]|max %}
{% if mesh_x0 == min_x and mesh_y0 == min_y and mesh_x1 == max_x and mesh_y1 == max_y %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Print is using the full bed, falling back to full bed mesh."
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% else %}
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
DEPLOY_PROBE
{% endif %}
{% set probe_count_x = mesh_config.probe_count.split(",")[0]|int %}
{% if mesh_config.probe_count.split(",")|length == 2 %}
{% set probe_count_y = mesh_config.probe_count.split(",")[1]|int %}
{% else %}
{% set probe_count_y = mesh_config.probe_count.split(",")[0]|int %}
{% endif %}
{% set probe_x_step = (max_x - min_x) / probe_count_x %}
{% set probe_y_step = (max_y - min_y) / probe_count_y %}
{% set mesh_count_x = ([(mesh_x1 - mesh_x0) / probe_x_step, 3]|max)|int %}
{% set mesh_count_y = ([(mesh_y1 - mesh_y0) / probe_y_step, 3]|max)|int %}
{% set min_mesh_count = [mesh_count_x, mesh_count_y]|min %}
{% set max_mesh_count = [mesh_count_x, mesh_count_y]|max %}
{% set algorithm = mesh_config.algorithm %}
{% if algorithm|lower == 'lagrange' and max_mesh_count > 6 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="cannot exceed a probe_count of 6 when using lagrange interpolation. Falling back to bicubic interpolation."
{% set algorithm = 'bicubic' %}
{% endif %}
{% if algorithm|lower == 'bicubic' and min_mesh_count < 4 %}
{% if max_mesh_count > 6 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="invalid probe_count option when using bicubic interpolation. Combination of 3 points on one axis with more than 6 on another is not permitted. Forcing minimum mesh count to be 4."
{% set min_mesh_count = 4 %}
{% else %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="bicubic interpolation with a probe_count of less than 4 points detected. Forcing lagrange interpolation."
{% set algorithm = 'lagrange' %}
{% endif %}
{% endif %}
{% set mesh_count_x = ([min_mesh_count, mesh_count_x]|max)|int %}
{% set mesh_count_x = ([max_mesh_count, mesh_count_x]|min)|int %}
{% set mesh_count_y = ([min_mesh_count, mesh_count_y]|max)|int %}
{% set mesh_count_y = ([max_mesh_count, mesh_count_y]|min)|int %}
{% set should_prime = printer["gcode_macro RatOS"].nozzle_priming == 'primeblob' %}
{% if printer["dual_carriage"] is not defined %}
{% set probe_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printable_y_max) < printable_y_max / 2 %}
{% else %}
{% set probe_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printable_y_max) < printable_y_max / 2 %}
{% endif %}
{% if printer.configfile.settings.beacon is defined and printer.configfile.settings.beacon.mesh_runs % 2 != 0 and probe_first %}
{% set probe_first = false %}
{% elif printer.configfile.settings.beacon is defined and printer.configfile.settings.beacon.mesh_runs % 2 == 0 and not probe_first %}
{% set probe_first = true %}
{% endif %}
{% if should_prime and probe_first %}
{% if printer["dual_carriage"] is not defined %}
PROBE_FOR_PRIMING
{% else %}
{% if both_toolheads %}
PROBE_FOR_PRIMING TOOLHEAD=0 IDEX_MODE={idex_mode}
PROBE_FOR_PRIMING TOOLHEAD=1 IDEX_MODE={idex_mode}
{% else %}
PROBE_FOR_PRIMING TOOLHEAD={params.T|int} IDEX_MODE={idex_mode}
{% endif %}
{% endif %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="mesh coordinates X0={mesh_x0} Y0={mesh_y0} X1={mesh_x1} Y1={mesh_y1}"
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile} ALGORITHM={algorithm} MESH_MIN={mesh_x0},{mesh_y0} MESH_MAX={mesh_x1},{mesh_y1} PROBE_COUNT={mesh_count_x},{mesh_count_y} RELATIVE_REFERENCE_INDEX=-1
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile} ALGORITHM={algorithm} MESH_MIN={mesh_x0},{mesh_y0} MESH_MAX={mesh_x1},{mesh_y1} PROBE_COUNT={mesh_count_x},{mesh_count_y} RELATIVE_REFERENCE_INDEX=-1
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% if should_prime and not probe_first %}
{% if printer["dual_carriage"] is not defined %}
PROBE_FOR_PRIMING
{% else %}
{% if both_toolheads %}
PROBE_FOR_PRIMING TOOLHEAD=0 IDEX_MODE={idex_mode}
PROBE_FOR_PRIMING TOOLHEAD=1 IDEX_MODE={idex_mode}
{% else %}
PROBE_FOR_PRIMING TOOLHEAD={params.T|int} IDEX_MODE={idex_mode}
{% endif %}
{% endif %}
{% endif %}
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
STOW_PROBE
{% endif %}
{% endif %}
{% endif %}
[gcode_macro M84]
rename_existing = M84.1
gcode =
M84.1
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
{% if printer["dual_carriage"] is defined %}
_SET_TOOLHEAD_OFFSET T={printer["gcode_macro RatOS"].default_toolhead|int} MOVE=0
SET_GCODE_VARIABLE MACRO=SET_PRESSURE_ADVANCE VARIABLE=snyc_toolheads VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_REMAP_TOOLHEADS VARIABLE=enabled VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% if printer["gcode_macro _VAOC"] is defined %}
SET_GCODE_VARIABLE MACRO=_VAOC VARIABLE=is_started VALUE=False
SET_GCODE_VARIABLE MACRO=_VAOC VARIABLE=is_started_at_temp VALUE=False
{% endif %}
SET_GCODE_OFFSET X=0 Y=0 Z=0 MOVE=0
_IDEX_SINGLE INIT=1
{% endif %}
SET_SKEW CLEAR=1
_LED_MOTORS_OFF
[gcode_macro M104]
rename_existing = M104.1
gcode =
{% set s = params.S|default(0)|int %}
{% set t = params.T|default(-1)|int %}
{% set t = 0 if t == -1 else t %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
DEBUG_ECHO PREFIX="M104" MSG="s: {s}, t: {t}"
{% if printer["gcode_macro T%s" % t] is defined %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set temperature_offset_t0 = printer["gcode_macro T0"].temperature_offset|default(0)|int %}
{% set temperature_offset_t1 = printer["gcode_macro T1"].temperature_offset|default(0)|int %}
{% set s0 = [s + temperature_offset_t0, 0]|max %}
{% set s1 = [s + temperature_offset_t1, 0]|max %}
{% if temperature_offset_t0 != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset_t0}°C added to toolhead T0."
{% endif %}
{% if temperature_offset_t1 != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset_t1}°C added to toolhead T1."
{% endif %}
{% else %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set s = [s + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
{% set is_in_standby = false %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% if toolchange_standby_temp > -1 %}
{% set is_in_standby = true if printer["gcode_macro T%s" % t].standby|default(false)|lower == 'true' else false %}
{% endif %}
{% endif %}
{% if not is_in_standby %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
M104.1 S{s0} T0
M104.1 S{s1} T1
{% else %}
M104.1 S{s} T{t}
{% endif %}
{% endif %}
[gcode_macro M109]
rename_existing = M109.1
gcode =
{% set s = params.S|default(0)|int %}
{% set t = params.T|default(-1)|int %}
{% set t = 0 if t == -1 else t %}
DEBUG_ECHO PREFIX="M109" MSG="s: {s}, t: {t}"
{% if printer["gcode_macro T%s" % t] is defined %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set s = [s + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="M109" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% set is_in_standby = false %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% if toolchange_standby_temp > -1 %}
{% set is_in_standby = true if printer["gcode_macro T%s" % t].standby|default(false)|lower == 'true' else false %}
{% endif %}
{% endif %}
{% if not is_in_standby %}
M109.1 S{s} T{t}
{% endif %}
[gcode_macro SET_HEATER_TEMPERATURE]
rename_existing = SET_HEATER_TEMPERATURE_BASE
gcode =
{% set heater = params.HEATER|default("") %}
{% set target = params.TARGET|default(0)|int %}
DEBUG_ECHO PREFIX="SET_HEATER_TEMPERATURE" MSG="heater: {heater}, target: {target}"
{% if heater|lower == "extruder" or heater|lower == "extruder1" %}
{% set t = 0 if heater|lower == "extruder" else 1 %}
{% if printer["gcode_macro T%s" % t] is defined and target > 0 %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set target = [target + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="SET_HEATER_TEMPERATURE" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
SET_HEATER_TEMPERATURE_BASE HEATER="{heater}" TARGET={target}
[gcode_macro TEMPERATURE_WAIT]
rename_existing = TEMPERATURE_WAIT_BASE
gcode =
{% set sensor = params.SENSOR|default("") %}
{% set minimum = params.MINIMUM|default(-1)|int %}
{% set maximum = params.MAXIMUM|default(-1)|int %}
DEBUG_ECHO PREFIX="TEMPERATURE_WAIT" MSG="sensor: {sensor}, minimum: {minimum}, maximum: {maximum}"
{% if sensor|lower == "extruder" or sensor|lower == "extruder1" %}
{% set t = 0 if sensor|lower == "extruder" else 1 %}
{% if printer["gcode_macro T%s" % t] is defined and (minimum > 0 or maximum > 0) %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% if minimum > -1 %}
{% set minimum = [minimum + temperature_offset, 0]|max %}
{% endif %}
{% if maximum > -1 %}
{% set maximum = [maximum + temperature_offset, 0]|max %}
{% endif %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
{% if minimum > -1 and maximum > -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MINIMUM: {minimum}, MAXIMUM: {maximum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MINIMUM={minimum} MAXIMUM={maximum}
{% elif minimum > -1 and maximum == -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MINIMUM: {minimum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MINIMUM={minimum}
{% elif minimum == -1 and maximum > -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MAXIMUM: {maximum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MAXIMUM={maximum}
{% endif %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Temperature for toolhead T{t} reached."
[gcode_macro SET_GCODE_OFFSET]
rename_existing = SET_GCODE_OFFSET_ORG
gcode =
SET_GCODE_OFFSET_ORG { rawparams }
{% if printer.configfile.settings.beacon is defined and (params.Z_ADJUST is defined or params.Z is defined) %}
_BEACON_APPLY_RUNTIME_MULTIPLIER
{% endif %}
[gcode_macro SDCARD_PRINT_FILE]
rename_existing = SDCARD_PRINT_FILE_BASE
gcode =
{% if printer["ratos"] is defined %}
PROCESS_GCODE_FILE { rawparams }
{% else %}
SDCARD_PRINT_FILE_BASE { rawparams }
{% endif %}
[gcode_macro SKEW_PROFILE]
rename_existing = SKEW_PROFILE_BASE
variable_loaded_profile = ""
gcode =
{% if params.LOAD is defined %}
{% if printer.configfile.settings["skew_correction %s" % params.LOAD] is defined %}
SET_GCODE_VARIABLE MACRO=SKEW_PROFILE VARIABLE=loaded_profile VALUE='"{params.LOAD}"'
{% endif %}
{% endif %}
SKEW_PROFILE_BASE { rawparams }
[gcode_macro SET_SKEW]
rename_existing = SET_SKEW_BASE
gcode =
{% if params.CLEAR is defined %}
{% if params.CLEAR|default(0)|int == 1 %}
SET_GCODE_VARIABLE MACRO=SKEW_PROFILE VARIABLE=loaded_profile VALUE='""'
{% endif %}
{% endif %}
SET_SKEW_BASE { rawparams }
[gcode_macro SET_VELOCITY_LIMIT]
rename_existing = SET_VELOCITY_LIMIT_BASE
gcode =
{% if params.ACCEL_TO_DECEL is defined %}
{% if params.ACCEL is defined %}
{% set accel = params.ACCEL|float %}
{% else %}
{% set accel = printer.toolhead.max_accel|float %}
{% endif %}
{% if params.VELOCITY is defined %}
{% set velocity = params.VELOCITY|float %}
{% else %}
{% set velocity = printer.toolhead.max_velocity|float %}
{% endif %}
{% if params.SQUARE_CORNER_VELOCITY is defined %}
{% set scv = params.SQUARE_CORNER_VELOCITY|float %}
{% else %}
{% set scv = printer.toolhead.square_corner_velocity|float %}
{% endif %}
{% set mcr = params.ACCEL_TO_DECEL|float / accel %}
DEBUG_ECHO PREFIX="SET_VELOCITY_LIMIT" MSG="ACCEL={accel}, VELOCITY={velocity}, SQUARE_CORNER_VELOCITY={scv}, MINIMUM_CRUISE_RATIO={mcr}"
SET_VELOCITY_LIMIT_BASE ACCEL={accel} VELOCITY={velocity} SQUARE_CORNER_VELOCITY={scv} MINIMUM_CRUISE_RATIO={1-mcr}
{% else %}
SET_VELOCITY_LIMIT_BASE { rawparams }
{% endif %}
[gcode_macro _START_PRINT_PARK]
gcode =
{% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set start_print_park_in = printer["gcode_macro RatOS"].start_print_park_in %}
{% set start_print_park_x = printer["gcode_macro RatOS"].start_print_park_x %}
{% if start_print_park_in == 'primeblob' %}
{% set z = 3 %}
{% endif %}
{% if printer["dual_carriage"] is defined and not (printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
{% if printer["gcode_macro RatOS"].start_print_park_x is defined and printer["gcode_macro RatOS"].start_print_park_x != '' %}
RATOS_ECHO PREFIX="WARNING" MSG="start_print_park_x is ignored for IDEX printers"
{% endif %}
PARK_TOOLHEAD
G90
{% endif %}
_PARK LOCATION={start_print_park_in} X={start_print_park_x}
G0 Z{z} F{z_speed}
[gcode_macro _END_PRINT_PARK]
gcode =
{% if printer["dual_carriage"] is defined %}
{% if printer["gcode_macro RatOS"].end_print_park_x is defined and printer["gcode_macro RatOS"].end_print_park_x != '' %}
RATOS_ECHO PREFIX="WARNING" MSG="end_print_park_x is ignored for IDEX printers"
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
_IDEX_SINGLE X={parking_position}
PARK_TOOLHEAD
G90
{% endif %}
_PARK LOCATION={printer["gcode_macro RatOS"].end_print_park_in} X={printer["gcode_macro RatOS"].end_print_park_x}
[gcode_macro _PARK]
gcode =
{% set x = params.X %}
{% set location = params.LOCATION|default('back')|lower %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% set nozzle_priming = printer["gcode_macro RatOS"].nozzle_priming|lower %}
CACHE_TOOLHEAD_SETTINGS KEY="park"
SET_MACRO_TRAVEL_SETTINGS
{% if x != '' %}
{% if x|float >= printer.toolhead.axis_minimum.x + 5 and x|float <= printable_x_max - 5 %}
{% set park_x = x|float %}
{% else %}
{action_respond_info('The requested X co-ordinate is outside the defined axis bounds - using defaults')}
{% set park_x = printable_x_max / 2 %}
{% endif %}
{% else %}
{% set park_x = printable_x_max / 2 %}
{% endif %}
{% if location == 'back' %}
{% set park_y = printable_y_max - 15 %}
{% elif location == 'front' %}
{% set park_y = printer.toolhead.axis_minimum.y + 5 %}
{% elif location == 'center' %}
{% set park_y = printable_y_max / 2 %}
{% elif location == 'primeblob' and printer["dual_carriage"] is defined %}
{% set park_y = printable_y_max - 15 %}
{% endif %}
{% if location == 'primeblob' and printer["dual_carriage"] is not defined %}
{% if (nozzle_priming == 'primeblob' or nozzle_priming == 'primeline') %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set park_x = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set park_x = printable_x_max - 5 %}
{% else %}
{% set park_x = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set park_y = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set park_y = printable_y_max - 5 %}
{% else %}
{% set park_y = nozzle_prime_start_y|float %}
{% endif %}
{% endif %}
{% endif %}
G90
{% if printer["dual_carriage"] is not defined %}
G0 X{park_x} Y{park_y} F{speed}
{% else %}
G0 Y{park_y} F{speed}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="park"
[gcode_macro SAVE_PROBE_RESULT]
gcode =
{% set beacon_contact_prime_probing = true if printer["gcode_macro RatOS"].beacon_contact_prime_probing|default(false)|lower == 'true' else false %}
{% set last_z_offset = 9999.9 %}
{% if printer.configfile.settings.beacon is defined %}
{% set current_z = printer.toolhead.position.z|float %}
{% if beacon_contact_prime_probing %}
{% set last_z_offset = printer.beacon.last_z_result %}
{% else %}
{% set last_z_offset = printer.beacon.last_sample.dist - current_z %}
{% endif %}
{% elif printer.configfile.settings.bltouch is defined %}
{% set config_offset = printer.configfile.settings.bltouch.z_offset|float %}
{% set last_z_offset = printer.probe.last_z_result - config_offset %}
{% elif printer.configfile.settings.probe is defined %}
{% set config_offset = printer.configfile.settings.probe.z_offset|float %}
{% set last_z_offset = printer.probe.last_z_result - config_offset %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Saving offset adjustment of {last_z_offset} in {params.VARIABLE|default('last_z_offset')}"
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE={params.VARIABLE|default('last_z_offset')} VALUE={last_z_offset}
[gcode_macro PROBE_FOR_PRIMING]
gcode =
{% set probe_for_priming_disable_mesh_constraints = true if printer["gcode_macro RatOS"].probe_for_priming_disable_mesh_constraints|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].nozzle_priming|lower != 'false' %}
SAVE_GCODE_STATE NAME=probe_for_priming_state
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the prime location.."
CACHE_TOOLHEAD_SETTINGS KEY="probe_for_priming"
SET_MACRO_TRAVEL_SETTINGS
{% set t = params.TOOLHEAD|default(-1)|int %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% if idex_mode == '' %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set x_start = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set x_start = printable_x_max - 5 %}
{% else %}
{% set x_start = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% else %}
{% set y_start = nozzle_prime_start_y|float %}
{% endif %}
{% else %}
{% set center_x = printable_x_max / 2 %}
{% if t == 0 %}
{% set x_start = 5 %}
{% else %}
{% set x_start = printable_x_max - 5 %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% endif %}
{% endif %}
{% set z = printer.configfile.settings.bed_mesh.horizontal_move_z|float %}
{% set mesh_config = printer.configfile.config.bed_mesh %}
{% if printer.configfile.settings.bltouch is defined %}
{% set x_offset = printer.configfile.settings.bltouch.x_offset|float %}
{% set y_offset = printer.configfile.settings.bltouch.y_offset|float %}
{% set z_offset = printer.configfile.settings.bltouch.z_offset|float %}
{% elif printer.configfile.settings.probe is defined %}
{% set x_offset = printer.configfile.settings.probe.x_offset|float %}
{% set y_offset = printer.configfile.settings.probe.y_offset|float %}
{% set z_offset = printer.configfile.settings.probe.z_offset|float %}
{% elif printer.configfile.settings.beacon is defined %}
{% set x_offset = printer.configfile.settings.beacon.x_offset|float %}
{% set y_offset = printer.configfile.settings.beacon.y_offset|float %}
{% set z_offset = printer.configfile.settings.beacon.trigger_distance|float %}
{% else %}
{ action_raise_error("No probe, beacon or bltouch section found. Adaptive priming only works with a [probe], [beacon] or [bltouch] section defined.") }
{% endif %}
{% if z < z_offset %}
{ action_raise_error("Horizontal move Z ({z}) is below your probe's Z offset ({z_offset}). Please adjust your horizontal_move_z setting in [bed_mesh] to be above {z}.") }
{% endif %}
{% if not probe_for_priming_disable_mesh_constraints %}
{% set min_x = mesh_config.mesh_min.split(",")[0]|float - x_offset %}
{% set min_y = mesh_config.mesh_min.split(",")[1]|float - y_offset %}
{% set max_x = mesh_config.mesh_max.split(",")[0]|float - x_offset %}
{% set max_y = mesh_config.mesh_max.split(",")[1]|float - y_offset %}
{% set x_start = [[x_start, max_x]|min, min_x]|max %}
{% set y_start = [[y_start, max_y]|min, min_y]|max %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the start of the prime location at {x_start}, {y_start}"
G90
M83
G0 Z{z} F{z_speed}
G1 X{x_start} Y{y_start} F{speed}
PROBE_CURRENT_POSITION
{% if t == 1 %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result_t1
{% else %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result
{% endif %}
{% if idex_mode == '' %}
{% set x_end = x_start %}
{% set y_end = y_start + 45 %}
{% else %}
{% if t==1 %}
{% set x_end = x_start - 45 %}
{% else %}
{% set x_end = x_start + 45 %}
{% endif %}
{% set y_end = y_start %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the end of the prime location at {x_end}, {y_end}"
G1 X{x_end} Y{y_end} F{speed}
PROBE_CURRENT_POSITION
{% if t == 1 %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_end_result_t1
{% else %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_end_result
{% endif %}
RESTORE_GCODE_STATE NAME=probe_for_priming_state
RESTORE_TOOLHEAD_SETTINGS KEY="probe_for_priming"
{% endif %}
[gcode_macro RESET_PRIME_PROBE_STATE]
gcode =
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result VALUE=None
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_end_result VALUE=None
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result_t1 VALUE=None
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_end_result_t1 VALUE=None
{% endif %}
[gcode_macro PROBE_CURRENT_POSITION]
gcode =
{% set beacon_contact_prime_probing = true if printer["gcode_macro RatOS"].beacon_contact_prime_probing|default(false)|lower == 'true' else false %}
SAVE_GCODE_STATE NAME=probe_current_position_state
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
ASSERT_PROBE_DEPLOYED
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_prime_probing %}
PROBE PROBE_METHOD=contact SAMPLES=1
{% else %}
PROBE
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
BEACON_QUERY
{% else %}
RESTORE_GCODE_STATE NAME=probe_current_position_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_z_speed|float}
{% endif %}
[gcode_macro PRIME_BLOB]
description = Prints a primeblob, used internally, if configured, as part of the START_PRINT macro.
variable_x_offset = 5
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="prime_blob"
SET_MACRO_TRAVEL_SETTINGS
RATOS_ECHO PREFIX="Priming" MSG="Priming nozzle with prime blob.."
{% set current_toolhead = 0 %}
{% set target_idex_mode = '' %}
{% set extruder = 'extruder' %}
{% if printer["dual_carriage"] is defined %}
{% if params.IDEX_MODE is defined %}
{% set target_idex_mode = params.IDEX_MODE|default('')|lower %}
{% else %}
{ action_raise_error("IDEX_MODE parameter not found for PRIME_BLOB macro. This is likely a bug.") }
{% endif %}
RATOS_ECHO PREFIX="Priming" MSG="Priming in IDEX {target_idex_mode} mode.."
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set current_toolhead = 1 if current_idex_mode=='primary' else 0 %}
{% set extruder = 'extruder1' if current_toolhead == 1 else 'extruder' %}
{% endif %}
{% if target_idex_mode != "copy" or target_idex_mode != "mirror" %}
SAVE_GCODE_STATE NAME=prime_blob_state
{% endif %}
{% set first_y = printer["gcode_macro START_PRINT"].first_y|default(-1)|float %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set fan_speed = printer["gcode_macro RatOS"].nozzle_prime_bridge_fan|float %}
{% set nozzle_diameter = printer.configfile.settings[extruder].nozzle_diameter|float %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set has_start_offset_t0 = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) != 9999.9 %}
{% if printer["dual_carriage"] is defined %}
{% set has_start_offset_t1 = printer["gcode_macro RatOS"].probe_for_priming_result_t1|float(9999.9) != 9999.9 %}
{% endif %}
{% set start_print_park_in = printer["gcode_macro RatOS"].start_print_park_in %}
{% set start_print_park_z_height = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set nozzle_prime_direction = printer["gcode_macro RatOS"].nozzle_prime_direction|lower %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% set initial_toolhead = params.INITIAL_TOOLHEAD|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% if target_idex_mode == '' %}
{% set x_factor = 0 %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set x_start = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set x_start = printable_x_max - 5 %}
{% else %}
{% set x_start = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% set y_factor = 1 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% set y_factor = -1 %}
{% else %}
{% set y_start = nozzle_prime_start_y|float %}
{% if nozzle_prime_start_y|float < printable_y_max / 2 %}
{% set y_factor = 1 %}
{% else %}
{% set y_factor = -1 %}
{% endif %}
{% endif %}
{% if nozzle_prime_direction == 'forwards' %}
{% set y_factor = 1 %}
{% elif nozzle_prime_direction == 'backwards' %}
{% set y_factor = -1 %}
{% endif %}
{% if start_print_park_in == 'primeblob' %}
{% set z = 3 %}
{% else %}
{% set z = start_print_park_z_height %}
{% endif %}
{% else %}
{% set center_x = printable_x_max / 2 %}
{% set y_factor = 0 %}
{% if target_idex_mode == 'copy' or target_idex_mode == 'mirror' %}
{% set x_start = center_x / 2 + 5 %}
{% set x_factor = 1 %}
{% else %}
{% if both_toolheads and initial_toolhead != current_toolhead %}
{% if current_toolhead == 0 %}
{% set x_start = 55 %}
{% set x_factor = -1 %}
{% elif current_toolhead == 1 %}
{% set x_start = printable_x_max - 55 %}
{% set x_factor = 1 %}
{% endif %}
{% else %}
{% if current_toolhead == 0 %}
{% set x_start = 5 %}
{% set x_factor = 1 %}
{% elif current_toolhead == 1 %}
{% set x_start = printable_x_max - 5 %}
{% set x_factor = -1 %}
{% endif %}
{% endif %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_x_max - 5 %}
{% endif %}
{% set z = 10 %}
{% endif %}
{% set start_z_offset = 0 %}
{% set end_z_offset = 0 %}
{% if has_start_offset_t0 %}
{% set start_z_probe_result_t0 = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %}
{% set end_z_probe_result_t0 = printer["gcode_macro RatOS"].probe_for_priming_end_result|float(9999.9) %}
{% if printer.configfile.settings.bltouch is not defined and printer.configfile.settings.probe is not defined and printer.configfile.settings.beacon is not defined %}
{ action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe], [beacon] or [bltouch].") }
{% endif %}
{% if start_z_probe_result_t0 == 9999.9 %}
{ action_raise_error("No start probe result found for prime area. This is likely a bug.") }
{% endif %}
{% if end_z_probe_result_t0 == 9999.9 %}
{ action_raise_error("No end probe result found for prime area. This is likely a bug.") }
{% endif %}
{% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %}
{% if start_z_probe_result_t0 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (start_z_probe_result_t0) ) }
{% endif %}
{% if end_z_probe_result_t0 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (end_z_probe_result_t0) ) }
{% endif %}
{% set start_z_offset = start_z_probe_result_t0 %}
{% set end_z_offset = end_z_probe_result_t0 %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if current_toolhead == 1 or both_toolheads or target_idex_mode == "copy" or target_idex_mode == "mirror" %}
{% if has_start_offset_t1 %}
{% set start_z_probe_result_t1 = printer["gcode_macro RatOS"].probe_for_priming_result_t1|float(9999.9) %}
{% set end_z_probe_result_t1 = printer["gcode_macro RatOS"].probe_for_priming_end_result_t1|float(9999.9) %}
{% if printer.configfile.settings.bltouch is not defined and printer.configfile.settings.probe is not defined and printer.configfile.settings.beacon is not defined %}
{ action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe], [beacon] or [bltouch].") }
{% endif %}
{% if start_z_probe_result_t1 == 9999.9 %}
{ action_raise_error("No start probe result found for prime area. This is likely a bug.") }
{% endif %}
{% if end_z_probe_result_t1 == 9999.9 %}
{ action_raise_error("No end probe result found for prime area. This is likely a bug.") }
{% endif %}
{% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %}
{% if start_z_probe_result_t1 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (start_z_probe_result_t1) ) }
{% endif %}
{% if end_z_probe_result_t1 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (end_z_probe_result_t1) ) }
{% endif %}
{% set start_z_offset = [start_z_offset, start_z_probe_result_t1]|max %}
{% set end_z_offset = [end_z_offset, start_z_probe_result_t1]|max %}
{% endif %}
{% endif %}
{% if target_idex_mode != 'copy' and target_idex_mode != 'mirror' %}
{% if both_toolheads and initial_toolhead != current_toolhead %}
{% set original_start_z_offset = start_z_offset %}
{% set original_end_z_offset = end_z_offset %}
{% set start_z_offset = original_end_z_offset %}
{% set end_z_offset = original_start_z_offset %}
{% endif %}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SET_NOZZLE_TEMP_OFFSET TOOLHEAD={current_toolhead}
{% endif %}
DEBUG_ECHO PREFIX="PRIME_BLOB" MSG="x_start: {x_start}, y_start: {y_start}, x_factor: {x_factor}, y_factor: {y_factor}, z: {z}, start_z_offset: {start_z_offset}, end_z_offset: {end_z_offset}"
G90
M83
RATOS_ECHO PREFIX="Priming" MSG="Lifting Z to {z}.."
G0 Z{z} F{z_speed}
{% if printer["dual_carriage"] is not defined %}
RATOS_ECHO PREFIX="Priming" MSG="Moving to {x_start}, {y_start} along the edge of the print area.."
{% if start_print_park_in != 'primeblob' %}
G1 X{x_start} F{speed}
G1 Y{y_start + (15 * y_factor)} F{speed}
{% endif %}
{% else %}
G1 Y{y_start + (15 * y_factor)} F{speed}
{% if target_idex_mode=="copy" or target_idex_mode=="mirror" %}
RATOS_ECHO PREFIX="Priming" MSG="Mirroring move to {x_start}, {y_start} along the edge of the print area.."
_IDEX_MIRROR PRIMING=1
{% else %}
RATOS_ECHO PREFIX="Priming" MSG="Moving to {x_start}, {y_start} along the edge of the print area.."
{% endif %}
G1 X{x_start} F{speed}
{% endif %}
RATOS_ECHO PREFIX="Priming" MSG="Starting prime blob.."
G1 Z{0.5 + start_z_offset} F{z_speed}
G1 Y{y_start} F{speed}
G1 F300 E{14 / ((0.4 / nozzle_diameter) ** 2)}
G1 F300 E{14 / ((0.4 / nozzle_diameter) ** 2)}
M106 S{fan_speed}
G1 Z5 F100 E5
G92 E0
RATOS_ECHO PREFIX="Priming" MSG="Bridging with {((fan_speed/255) * 100)|int}% fan speed.."
G1 F3000 X{x_start + (15 * x_factor)} Y{y_start + (15 * y_factor)} E{1 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (20 * x_factor)} Y{y_start + (20 * y_factor)} Z{3.8 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (34 * x_factor)} Y{y_start + (34 * y_factor)} Z{2.6 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (38 * x_factor)} Y{y_start + (38 * y_factor)} Z{1.4 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (42 * x_factor)} Y{y_start + (42 * y_factor)} Z{0.2 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
M106 S0
G1 F3000 X{x_start + (46 * x_factor)} Y{y_start + (46 * y_factor)} Z{0.2 + end_z_offset} E0.6
G1 F{speed} X{x_start + (50 * x_factor)} Y{y_start + (50 * y_factor)}
{% if target_idex_mode == "copy" or target_idex_mode == "mirror" %}
G0 Z3 F{z_speed}
{% endif %}
{% if target_idex_mode == "copy" %}
{% if first_y >= 0 %}
_IDEX_COPY DANCE=0 Y={first_y}
{% else %}
_IDEX_COPY DANCE=0 Y={params.Y1}
{% endif %}
{% endif %}
{% if target_idex_mode != "copy" or target_idex_mode != "mirror" %}
RESTORE_GCODE_STATE NAME=prime_blob_state
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="prime_blob"
G92 E0
[gcode_macro UNLOAD_FILAMENT]
description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams.
variable_ignore_min_extrude_temp = True
gcode =
_LEARN_MORE_FILAMENT
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set filament_name = params._NAME|default('')|string %}
{% set filament_type = params._TYPE|default('')|string %}
{% set temp = params.TEMP|default(220)|int %}
{% if printer["dual_carriage"] is not defined %}
_DEFAULT_UNLOAD_FILAMENT TEMP={temp} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Unloading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead==0 or toolhead==1 %}
_IDEX_UNLOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
[gcode_macro _LEGACY_UNLOAD_FILAMENT]
description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams.
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set unload_speed = 5 * 60 %}
{% set unload_length = printer["gcode_macro RatOS"].filament_unload_length|float %}
M117 Unloading filament...
G0 E10 F300
G0 E-5 F3600
G4 P3000
G0 E5 F6000
G0 E-15 F6000
G0 E-{unload_length} F{unload_speed}
_CLEANING_MOVE TOOLHEAD={toolhead}
M117 Filament unloaded!
RESPOND MSG="Filament unloaded! Please inspect the tip of the filament before reloading."
[gcode_macro _DEFAULT_UNLOAD_FILAMENT]
description = Unload filament macro for non IDEX printers.
gcode =
{% set temp = params.TEMP|default(220)|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set enable_unload_tip_forming = true if printer["gcode_macro RatOS"].enable_unload_tip_forming|default(false)|lower == 'true' else false %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_DEFAULT_UNLOAD_FILAMENT" MSG="TEMP: {temp}"
_LED_UNLOADING_FILAMENT TOOLHEAD=0
SAVE_GCODE_STATE NAME=unload_state
{% if printer.extruder.temperature|int < temp or printer.extruder.can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating extruder to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={temp}
G4 P3000
{% if enable_unload_tip_forming %}
_UNLOAD_FILAMENT TOOLHEAD=0 NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_LEGACY_UNLOAD_FILAMENT TOOLHEAD=0
{% endif %}
RESTORE_GCODE_STATE NAME=unload_state
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD=0
[gcode_macro _IDEX_UNLOAD_FILAMENT]
description = Unload filament macro for IDEX printer.
gcode =
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set enable_unload_tip_forming = true if printer["gcode_macro RatOS"].enable_unload_tip_forming|default(false)|lower == 'true' else false %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_IDEX_UNLOAD_FILAMENT" MSG="TEMP: {temp}, TOOLHEAD: {toolhead}"
_LED_UNLOADING_FILAMENT TOOLHEAD={toolhead}
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
{% if not printer.pause_resume.is_paused %}
{% if printer[target_extruder].temperature|int < temp or printer[target_extruder].can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating T{toolhead} to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={temp}
{% endif %}
G4 P3000
{% if enable_unload_tip_forming %}
_UNLOAD_FILAMENT TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_LEGACY_UNLOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead}
{% endif %}
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD={toolhead}
[gcode_macro _UNLOAD_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT" MSG="TOOLHEAD: {toolhead}"
_MOVE_TO_LOADING_POSITION TOOLHEAD={toolhead}
_UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
_UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER TOOLHEAD={toolhead}
_CLEANING_MOVE TOOLHEAD={toolhead}
[gcode_macro _UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Unloading filament from nozzle to cooling zone... Please wait!"
_PURGE_BEFORE_UNLOAD TOOLHEAD={toolhead}
{% if printer["gcode_macro _UNLOAD_WITHOUT_TIP_FORMING"] is defined %}
_UNLOAD_WITHOUT_TIP_FORMING TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_UNLOAD_WITH_TIP_FORMING NAME='{filament_name}' TYPE='{filament_type}'
{% endif %}
G4 P3000
[gcode_macro _UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set extruder_load_speed = printer["gcode_macro T%s" % toolhead].extruder_load_speed|float * 60 %}
{% set extruder_gear_to_cooling_position_distance = printer["gcode_macro T%s" % toolhead].extruder_gear_to_cooling_position_distance|float %}
{% set tooolhead_sensor_to_extruder_gear_distance = printer["gcode_macro T%s" % toolhead].tooolhead_sensor_to_extruder_gear_distance|float %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER" MSG="TOOLHEAD: {toolhead}"
G0 E-{extruder_gear_to_cooling_position_distance + tooolhead_sensor_to_extruder_gear_distance + 50} F{extruder_load_speed}
RATOS_ECHO MSG="Filament unloaded! Please inspect the tip of the filament before reloading."
[gcode_macro _UNLOAD_WITH_TIP_FORMING]
gcode =
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% if filament_name != '' and filament_type != '' %}
_UNLOAD_KNOWN_FILAMENT NAME={filament_name} TYPE={filament_type}
{% else %}
_UNLOAD_UNKNOWN_FILAMENT TOOLHEAD={toolhead}
{% endif %}
[gcode_macro _UNLOAD_KNOWN_FILAMENT]
description = User overrideable tip forming macro if slicer filament profiles are known
gcode =
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
RATOS_ECHO PREFIX="FILAMENT TYPE" MSG='{filament_type}'
RATOS_ECHO PREFIX="FILAMENT PROFILE" MSG='{filament_name}'
{% if filament_name == "Prusament PETG @V-Minion" %}
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
{% elif filament_name == "Nobufil PETG @V-Minion" %}
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
{% else %}
RATOS_ECHO PREFIX="_UNLOAD_KNOWN_FILAMENT" MSG="Filament profile not found!"
_UNLOAD_UNKNOWN_FILAMENT
{% endif %}
[gcode_macro _UNLOAD_UNKNOWN_FILAMENT]
description = User overrideable standard tip forming macro
gcode =
DEBUG_ECHO PREFIX="_UNLOAD_UNKNOWN_FILAMENT" MSG="Using standard tip forming macro!"
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
[gcode_macro _TIP_FORMING]
gcode =
{% set cooling_moves = params.COOLING_MOVES|default(4)|int %}
{% set cooling_move_length = params.COOLING_MOVE_LENGTH|default(10)|float %}
{% set start_cooling_speed = params.START_COOLING_SPEED|default(10)|float * 60 %}
{% set end_cooling_speed = params.END_COOLING_SPEED|default(50)|float * 60 %}
{% if cooling_moves == 0 %}
{% set cooling_move_length = 0 %}
{% endif %}
{% set dip = true if params.DIP|default(false)|lower == "true" else false %}
{% set dip_length = params.DIP_LENGTH|default(22)|float %}
{% set dip_speed = params.DIP_SPEED|default(30)|float * 60 %}
{% set dip_retract_speed = params.DIP_RETRACT_SPEED|default(70)|float * 60 %}
{% set retract_length = params.RETRACT_LENGTH|default(18)|float %}
{% set start_retract_speed = params.START_RETRACT_SPEED|default(120)|float * 60 %}
{% set end_retract_speed = params.END_RETRACT_SPEED|default(20)|float * 60 %}
DEBUG_ECHO PREFIX="_TIP_FORMING" MSG="cooling_moves: {cooling_moves}, cooling_move_length: {cooling_move_length}, start_cooling_speed: {start_cooling_speed}, end_cooling_speed: {end_cooling_speed}, dip: {dip}, dip_length: {dip_length}, dip_speed: {dip_speed}, dip_retract_speed: {dip_retract_speed}, retract_length: {retract_length}, start_retract_speed: {start_retract_speed}, end_retract_speed: {end_retract_speed}"
M220 S100
G92 E0
{% set retract = retract_length + cooling_move_length / 2 - 15 %}
G1 E-15 F{start_retract_speed}
G1 E-{0.7 * retract} F{1.0 * end_retract_speed}
G1 E-{0.2 * retract} F{0.5 * end_retract_speed}
G1 E-{0.1 * retract} F{0.3 * end_retract_speed}
G92 E0
{% if cooling_moves > 0 %}
{% set i = (end_cooling_speed - start_cooling_speed) / (2 * cooling_moves - 1) %}
{% for m in range(cooling_moves) %}
G1 E{cooling_move_length} F{(start_cooling_speed + i * m * 2)}
G1 E-{cooling_move_length} F{(start_cooling_speed + i * (m * 2 + 1))}
{% endfor %}
{% endif %}
G92 E0
{% if dip %}
G1 E{dip_length} F{dip_speed}
G4 P100
G1 E-{dip_length} F{dip_retract_speed}
{% endif %}
G92 E0
M400
[gcode_macro _ON_FILAMENT_SENSOR_BUTTON_PRESSED]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_FILAMENT_SENSOR_BUTTON_PRESSED" MSG="TOOLHEAD: {toolhead}"
{% if not printer.virtual_sdcard.is_active %}
UNLOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_RUNOUT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_runout_detection = true if printer["gcode_macro T%s" % toolhead].enable_runout_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_RUNOUT" MSG="TOOLHEAD: {toolhead}"
{% if enable_runout_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=false
{% endif %}
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_CLOG]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_clog_detection = true if printer["gcode_macro T%s" % toolhead].enable_clog_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_CLOG" MSG="TOOLHEAD: {toolhead}"
{% if enable_clog_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=true
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_RUNOUT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_runout_detection = true if printer["gcode_macro T%s" % toolhead].enable_runout_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_RUNOUT" MSG="TOOLHEAD: {toolhead}"
{% if enable_runout_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=false
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_CLOG]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_clog_detection = true if printer["gcode_macro T%s" % toolhead].enable_clog_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_CLOG" MSG="TOOLHEAD: {toolhead}"
{% if enable_clog_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=true
{% endif %}
[gcode_macro _ON_FILAMENT_END]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set clogged = true if params.CLOGGED|default(false)|lower == 'true' else false %}
{% set unload_after_runout = printer["gcode_macro T%s" % toolhead].unload_after_runout|float %}
{% if clogged %}
_LED_FILAMENT_CLOG TOOLHEAD={toolhead}
{% else %}
_LED_FILAMENT_RUNOUT TOOLHEAD={toolhead}
{% endif %}
DEBUG_ECHO PREFIX="_ON_FILAMENT_END" MSG="TOOLHEAD: {toolhead}"
{% if printer.virtual_sdcard.is_active %}
{% if not printer.pause_resume.is_paused %}
PAUSE RUNOUT=True
{% endif %}
{% if not clogged and unload_after_runout %}
UNLOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
{% if not clogged and printer["dual_carriage"] is defined %}
{% if printer["gcode_macro _IDEX_JOIN_SPOOLS"].enabled|default(false)|lower == 'true'%}
_JOIN_SPOOL TOOLHEAD={toolhead}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro M600]
description = Executes a color change by pausing the printer an unloading the filament.
gcode =
PAUSE
UNLOAD_FILAMENT
RATOS_ECHO MSG="Please load new filament and resume"
[gcode_macro COLD_PULL]
description = Automated hotend cold pull.
gcode =
{% set extrusion_temp = params.EXTRUSION_TEMP|default(220)|int %}
{% set cold_pull_temp = params.COLD_PULL_TEMP|default(80)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% if printer["dual_carriage"] is not defined %}
{% set toolhead = 0 %}
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Unloading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead != 0 and toolhead != 1 %}
{action_raise_error("Please select toolhead! 0 = left, 1 = right toolhead")}
{% endif %}
{% endif %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
_LED_UNLOADING_FILAMENT TOOLHEAD={toolhead}
SAVE_GCODE_STATE NAME=cold_pull_state
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
RATOS_ECHO MSG="Heating T{toolhead} to {extrusion_temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={extrusion_temp}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={extrusion_temp} MAXIMUM={extrusion_temp + 2}
G4 P3000
RATOS_ECHO MSG="extruding..."
G92 E0
G1 E30 F300
G92 E0
RATOS_ECHO MSG="Heating T{toolhead} to {cold_pull_temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={cold_pull_temp}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={cold_pull_temp} MAXIMUM={cold_pull_temp + 2}
G4 P10000
RATOS_ECHO MSG="cold pull..."
FORCE_MOVE STEPPER={target_extruder} DISTANCE=-40 VELOCITY=5 ACCEL=100
RATOS_ECHO MSG="eject filament..."
FORCE_MOVE STEPPER={target_extruder} DISTANCE=-200 VELOCITY=20 ACCEL=500
RATOS_ECHO MSG="cooling down extruder..."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET=0
RESTORE_GCODE_STATE NAME=cold_pull_state
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD={toolhead}
CONSOLE_ECHO TITLE="Cold pull finished!" MSG="Please remove the filament from the PTFE tube and cut the end off. Do NOT try to load it again." TYPE="warning"
[gcode_macro _USER_START_PRINT_BEFORE_HOMING]
gcode =
[gcode_macro _USER_START_PRINT_AFTER_HEATING_BED]
gcode =
[gcode_macro _USER_START_PRINT_BED_MESH]
gcode =
[gcode_macro _USER_START_PRINT_PARK]
gcode =
[gcode_macro _USER_START_PRINT_AFTER_HEATING_EXTRUDER]
gcode =
[gcode_macro _USER_START_PRINT_HEAT_CHAMBER]
description = Uses the extruder sensor to wait for chamber temp. Override the _START_PRINT_HEAT_CHAMBER macro to implement heated chamber handling.
gcode =
{% set chamber_heater_bed_temp = printer["gcode_macro RatOS"].chamber_heater_bed_temp|default(115)|int %}
[gcode_macro _USER_END_PRINT_BEFORE_HEATERS_OFF]
gcode =
[gcode_macro _USER_END_PRINT_AFTER_HEATERS_OFF]
gcode =
[gcode_macro _USER_END_PRINT_PARK]
gcode =
[gcode_macro _USER_END_PRINT_FINISHED]
description = User hook for when the print is finished after gcode state has been restored.
gcode =
[gcode_macro _USER_START_PRINT]
gcode =
[gcode_macro _USER_END_START_PRINT]
gcode =
[gcode_macro _USER_START_FEATURE]
gcode =
[gcode_macro _USER_END_FEATURE]
gcode =
[gcode_macro ECHO_T_VARS]
description = Echo Toolhead variables to the console.
gcode =
{% set t = params.T|default(0) %}
RATOS_ECHO MSG="T{t} Variables"
{% for var, value in printer["gcode_macro T%s" % t].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro ECHO_RATOS_VARS]
description = Echo RatOS variables to the console.
gcode =
{% for var, value in printer["gcode_macro RatOS"].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[delayed_gcode RATOS_INIT]
initial_duration = 0.1
gcode =
_LED_STANDBY
CALCULATE_PRINTABLE_AREA
INITIAL_FRONTEND_UPDATE
_CHAMBER_FILTER_SANITY_CHECK
[delayed_gcode RATOS_LOGO]
initial_duration = 2
gcode =
HELLO_RATOS
[gcode_macro INITIAL_FRONTEND_UPDATE]
gcode =
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_error = printer["gcode_macro RatOS"].status_color_error|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_unknown}"'
{% endif %}
{% set t0_sensor = "undefined" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].filament_detected|lower == "true" %}
{% set t0_sensor = "detected" %}
{% else %}
{% set t0_sensor = "empty" %}
{% endif %}
{% else %}
{% set t0_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set t1_sensor = "undefined" %}
{% if printer["dual_carriage"] is defined and printer["filament_switch_sensor toolhead_filament_sensor_t1"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].filament_detected|lower == "true" %}
{% set t1_sensor = "detected" %}
{% else %}
{% set t1_sensor = "empty" %}
{% endif %}
{% else %}
{% set t1_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set svv = printer.save_variables.variables %}
{% if svv.t0_filament is defined and printer["gcode_macro T0"] is defined %}
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
{% if t0_sensor != "empty" %}
{% set t0_filament_type = svv.t0_filament[0]|default('')|string %}
{% set t0_filament_name = svv.t0_filament[1]|default('')|string %}
{% set t0_filament_temp = svv.t0_filament[2]|default(0)|float %}
{% if t0_filament_name != '' and t0_filament_type != '' and t0_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{t0_filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{t0_filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={t0_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
{% if svv.t1_filament is defined and printer["gcode_macro T1"] is defined %}
{% if printer["gcode_macro T1"].filament_name is defined and printer["gcode_macro T1"].filament_type is defined and printer["gcode_macro T1"].filament_temp is defined %}
{% if t1_sensor != "empty" %}
{% set t1_filament_type = svv.t1_filament[0]|default('')|string %}
{% set t1_filament_name = svv.t1_filament[1]|default('')|string %}
{% set t1_filament_temp = svv.t1_filament[2]|default(0)|float %}
{% if t1_filament_name != '' and t1_filament_type != '' and t1_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='"{t1_filament_name}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='"{t1_filament_type}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE={t1_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t1_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro CALCULATE_PRINTABLE_AREA]
gcode =
{% set bed_margin_x = printer["gcode_macro RatOS"].bed_margin_x %}
{% set bed_margin_y = printer["gcode_macro RatOS"].bed_margin_y %}
{% set tool = 0 if printer["gcode_macro T0"] is not defined or printer["gcode_macro T0"].active else 1 %}
{% set max_x = printer.toolhead.axis_maximum.x if printer["dual_carriage"] is defined and tool == 0 else printer.toolhead.axis_maximum.x - bed_margin_x[1] %}
{% if printer["dual_carriage"] is defined %}
{% set max_x = printer.toolhead.axis_maximum.x %}
{% endif %}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="printer.toolhead.axis_maximum.x {printer.toolhead.axis_maximum.x}"
{% set max_y = printer.toolhead.axis_maximum.y - bed_margin_y[1]%}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_x_max VALUE={max_x}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_y_max VALUE={max_y}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="Printable area calculated: X: 0,{max_x} Y: 0,{max_y}"
[gcode_macro CACHE_TOOLHEAD_SETTINGS]
variable_cache = {"global": {"accel": 1000, "ratio": 0.5, "speed": 50, "scv": 5}}
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set dummy = cache.__setitem__(key, {"accel": printer.toolhead.max_accel, "ratio": printer.toolhead.minimum_cruise_ratio, "speed": printer.toolhead.max_velocity, "scv": printer.toolhead.square_corner_velocity}) %}
SET_GCODE_VARIABLE MACRO=CACHE_TOOLHEAD_SETTINGS VARIABLE=cache VALUE="{cache | pprint | replace("\n", "") | replace("\"", "\\\"")}"
DEBUG_ECHO PREFIX="CACHE_TOOLHEAD_SETTINGS" MSG="Toolhead settings cached for {key}. {printer.toolhead.max_accel} accel, {printer.toolhead.minimum_cruise_ratio} ratio, {printer.toolhead.max_velocity} velocity, {printer.toolhead.square_corner_velocity} scv."
[gcode_macro RESTORE_TOOLHEAD_SETTINGS]
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set values = printer["gcode_macro CACHE_TOOLHEAD_SETTINGS"].cache.__getitem__(key) %}
{% if values is not defined or values == 'None' %}
{ action_raise_error("RESTORE_TOOLHEAD_SETTINGS: Toolhead settings not cached for key '" ~ key ~ "'.") }
{% endif %}
SET_VELOCITY_LIMIT ACCEL={values.accel} MINIMUM_CRUISE_RATIO={values.ratio} VELOCITY={values.speed} SQUARE_CORNER_VELOCITY={values.scv}
DEBUG_ECHO PREFIX="RESTORE_TOOLHEAD_SETTINGS" MSG="Toolhead settings restored. {values.accel} accel, {values.ratio} ratio, {values.speed} velocity, {values.scv} scv."
[gcode_macro SET_MACRO_TRAVEL_SETTINGS]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set accel = printer["gcode_macro RatOS"].macro_travel_accel %}
SET_VELOCITY_LIMIT ACCEL={accel} MINIMUM_CRUISE_RATIO=0.5 VELOCITY={speed} SQUARE_CORNER_VELOCITY={5}
DEBUG_ECHO PREFIX="SET_MACRO_TRAVEL_SETTINGS" MSG="Macro travel settings set. {accel} accel, {speed} velocity"
[gcode_macro SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% if printer["dual_carriage"] is not defined %}
SET_KINEMATIC_POSITION X={printable_x_max / 2} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
{% else %}
IDEX_SET_CENTER_KINEMATIC_POSITION
{% endif %}
[gcode_macro IDEX_SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set center_x = printable_x_max / 2 %}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x - (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x + (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
[gcode_macro VERIFY_HYBRID_INVERTED]
gcode =
{% set inverted = False %}
{% if printer.configfile.settings.ratos_hybrid_corexy is defined and printer.configfile.settings.ratos_hybrid_corexy.inverted is defined %}
{% if printer.configfile.settings.ratos_hybrid_corexy.inverted|lower == 'true' %}
{% set inverted = True %}
{% endif %}
{% endif %}
{% if inverted == False %}
{ action_emergency_stop("ratos_hybrid_corexy NOT INVERTED! Inverted hybrid core-xy bugfix not detected.") }
{% endif %}
[gcode_macro RATOS_ECHO]
gcode =
{% set prefix = "RatOS" %}
{% set debug = params.DEBUG|default(0)|int %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " | " ~ params.PREFIX %}
{% endif %}
{% set prefix = prefix ~ ":" %}
{% set msg = "" %}
{% if params.MSG is defined %}
{% set msg = params.MSG %}
{% else %}
{% set msg = "No msg parameter provided (this is a bug or unintended use)." %}
{% endif %}
{% if not debug %}
M117 {prefix} {msg}
{% endif %}
RATOS_LOG PREFIX="{prefix}" MSG="{msg}"
{% if not debug %}
RESPOND PREFIX="{prefix}" MSG="{msg}"
{% else %}
CONSOLE_ECHO TITLE="{prefix}" TYPE="debug" MSG="{msg}"
{% endif %}
[gcode_macro ENABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=True
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=prefix_filter VALUE="'{params.FILTER|default('')|lower}'"
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging enabled."
[gcode_macro DISABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=False
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging disabled."
[gcode_macro DEBUG_ECHO]
variable_enabled = False
variable_prefix_filter = ''
gcode =
{% set prefix = "DEBUG" %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " - " ~ params.PREFIX %}
{% endif %}
{% if enabled and (prefix_filter|lower == '' or prefix_filter|lower in params.PREFIX|lower) %}
RATOS_ECHO PREFIX="{prefix}" MSG="{params.MSG}" DEBUG=1
{% endif %}
[gcode_macro START_FEATURE]
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="Start {params.FEATURE} feature gcode"
{% set scv = printer.toolhead.square_corner_velocity|int|default(5) %}
{% set accel = printer.toolhead.max_accel|int|default(10000) %}
{% set ratio = printer.toolhead.minimum_cruise_ratio|float|default(0.5) %}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="scv" VALUE={scv}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="accel" VALUE={accel}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="ratio" VALUE={ratio}
_USER_START_FEATURE FEATURE="{params.FEATURE}"
[gcode_macro END_FEATURE]
variable_scv = 5
variable_accel = 10000
variable_ratio = 0.5
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="End {params.FEATURE} feature gcode"
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={scv} ACCEL={accel} MINIMUM_CRUISE_RATIO={ratio}
_USER_END_FEATURE FEATURE="{params.FEATURE}" SCV={scv} ACCEL={accel} RATIO={ratio}
[gcode_macro _ON_LAYER_CHANGE]
variable_layer_number = 0
description = INTERNAL USE ONLY. Call it from the slicers after layer change custom gcode
gcode =
{% set layer = params.LAYER|int %}
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE={layer}
SET_PRINT_STATS_INFO CURRENT_LAYER={layer}
[gcode_macro _LEARN_MORE_CALIBRATION]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/calibration" %}
{% set link_text = "RatOS Calibration Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_CHAMBER_FILTER]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter Control" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_FILAMENT]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/filaments" %}
{% set link_text = "RatOS Filament Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _CONSOLE_SAVE_CONFIG]
gcode =
M118 Click SAVE_CONFIG to save the settings to your printer.cfg.
[gcode_macro SAVE_Z_OFFSET]
gcode =
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SAVE_MULTIPLIER
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _LOAD_RATOS_SKEW_PROFILE]
gcode =
{% set ratos_skew_profile = printer["gcode_macro RatOS"].skew_profile|default("") %}
{% if ratos_skew_profile != "" %}
{% if printer.configfile.config["skew_correction %s" % ratos_skew_profile] is defined %}
SKEW_PROFILE LOAD={ratos_skew_profile}
GET_CURRENT_SKEW
{% else %}
{% set line_1 = '"Could not find skew profile %s!_N_Clearing skew correction."' % ratos_skew_profile %}
CONSOLE_ECHO TITLE="Missing skew profile!" TYPE="warning" MSG={line_1}
SET_SKEW CLEAR=1
{% endif %}
{% endif %}
[gcode_macro M601]
gcode =
PAUSE
[gcode_macro PAUSE]
description = Pauses the print
rename_existing = PAUSE_BASE
variable_extrude = 1.5
variable_retract = 1.5
variable_fan_speed = 0
variable_idex_mode = ""
variable_idex_toolhead = 0
variable_idex_toolhead_x = 0.0
variable_idex_toolhead_y = 0.0
variable_idex_toolhead_z = 0.0
gcode =
{% set runout_detected = true if params.RUNOUT|default(false)|lower == 'true' else false %}
_LED_PAUSE
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set idex_toolhead = 1 if idex_mode == 'primary' else 0 %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
SAVE_GCODE_STATE NAME=PAUSE_state
{% else %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_mode VALUE='"{idex_mode}"'
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead VALUE={idex_toolhead}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_x VALUE={printer.gcode_move.gcode_position.x|float}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_y VALUE={printer.gcode_move.gcode_position.y|float}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_z VALUE={printer.gcode_move.gcode_position.z|float}
DEBUG_ECHO PREFIX="PAUSE" MSG="idex_mode: {idex_mode}, idex_toolhead: {idex_toolhead}, idex_toolhead_x: {idex_toolhead_x}, idex_toolhead_y: {idex_toolhead_y}, idex_toolhead_z: {idex_toolhead_z}"
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
CACHE_TOOLHEAD_SETTINGS KEY="pause"
SET_MACRO_TRAVEL_SETTINGS
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set current_z = printer.toolhead.position.z|float %}
{% if current_z < (max_z - 20.0) %}
{% set z_safe = 20.0 %}
{% else %}
{% set z_safe = max_z - current_z %}
{% endif %}
PAUSE_BASE
{% if printer["dual_carriage"] is not defined %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan"].speed|float}
{% else %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t0"].speed|float}
{% else %}
{% if idex_toolhead == 0 %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t0"].speed|float}
{% else %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t1"].speed|float}
{% endif %}
{% endif %}
{% endif %}
M106 S0
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' else false %}
{% if idex_mode != '' %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' and printer['extruder1'].can_extrude|lower == 'true' else false %}
{% else %}
{% if printer.toolhead.extruder == 'extruder1' %}
{% set can_extrude = true if printer['extruder1'].can_extrude|lower == 'true' else false %}
{% endif %}
{% endif %}
{% endif %}
{% set R = printer["gcode_macro PAUSE"].retract|float %}
{% if can_extrude %}
G91
G1 E-{R} F2100
G90
{% else %}
{action_respond_info("Extruder not hot enough")}
{% endif %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set pause_print_park_x = printer["gcode_macro RatOS"].pause_print_park_x %}
{% set pause_print_park_in = printer["gcode_macro RatOS"].pause_print_park_in %}
{% if runout_detected %}
{% set pause_print_park_x = printer["gcode_macro RatOS"].runout_park_x %}
{% set pause_print_park_in = printer["gcode_macro RatOS"].runout_park_in %}
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
DEBUG_ECHO PREFIX="PAUSE" MSG="z_speed: {z_speed}, pause_print_park_x: {pause_print_park_x}, pause_print_park_in: {pause_print_park_in}, default_toolhead: {default_toolhead}"
{% if "xyz" in printer.toolhead.homed_axes %}
G91
G1 Z{z_safe} F{z_speed}
G90
{% if printer["dual_carriage"] is not defined %}
_PARK LOCATION={pause_print_park_in} X={pause_print_park_x}
{% else %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
_IDEX_SINGLE X={parking_position}
{% else %}
PARK_TOOLHEAD
{% endif %}
_PARK LOCATION={pause_print_park_in} X={pause_print_park_x}
{% endif %}
{% else %}
{action_respond_info("Printer not homed")}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="pause"
[gcode_macro RESUME]
description = Resumes the print if the printer is paused.
rename_existing = RESUME_BASE
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set target_idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set target_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% endif %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' else false %}
{% if target_idex_mode != '' %}
{% if target_idex_mode == 'copy' or target_idex_mode == 'mirror' %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' and printer['extruder1'].can_extrude|lower == 'true' else false %}
{% else %}
{% if printer.toolhead.extruder == 'extruder1' %}
{% set can_extrude = true if printer['extruder1'].can_extrude|lower == 'true' else false %}
{% endif %}
{% endif %}
{% endif %}
{% set fan_speed = printer["gcode_macro PAUSE"].fan_speed|float %}
{% if printer["dual_carriage"] is not defined %}
M106 S{(fan_speed * 255)}
{% else %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% else %}
{% if params.TOOLHEAD is defined %}
{% if params.TOOLHEAD == 0 %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
{% else %}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% endif %}
{% else %}
{% if printer["gcode_macro PAUSE"].idex_toolhead == 0 %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
{% else %}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% endif %}
{% endif %}
{% endif %}
M106.1 S{fan_speed}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if target_idex_mode == "copy" %}
_IDEX_COPY DANCE=0
{% elif target_idex_mode == "mirror" %}
_IDEX_MIRROR DANCE=0
{% else %}
{% if params.TOOLHEAD is defined %}
_SELECT_TOOL T={params.TOOLHEAD} X=-1 Y=-1 TOOLSHIFT=false
{% else %}
_SELECT_TOOL T={printer["gcode_macro PAUSE"].idex_toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% endif %}
{% set x = printer["gcode_macro PAUSE"].idex_toolhead_x|float %}
{% set y = printer["gcode_macro PAUSE"].idex_toolhead_y|float %}
{% set z = printer["gcode_macro PAUSE"].idex_toolhead_z|float %}
G1 X{x} Y{y} Z{z} F{speed}
{% if params.TOOLHEAD is defined %}
SAVE_GCODE_STATE NAME=PAUSE_STATE
{% endif %}
{% endif %}
{% if params.TOOLHEAD is not defined %}
{% set E = printer["gcode_macro PAUSE"].extrude|float %}
{% if can_extrude %}
G91
G1 E{E} F2100
G90
{% else %}
{action_respond_info("Extruder not hot enough")}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 MOVE_SPEED={speed}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=True
RESUME_BASE
_LED_PRINTING
[gcode_macro CANCEL_PRINT]
description = Cancels the printer
rename_existing = CANCEL_PRINT_BASE
gcode =
END_PRINT
TURN_OFF_HEATERS
CLEAR_PAUSE
CANCEL_PRINT_BASE
[gcode_macro START_PRINT]
description = Start print procedure, use this in your Slicer.
variable_post_processor_version = 2
variable_is_printing_gcode = False
variable_both_toolheads = True
variable_object_xoffset = 0
variable_first_x = -1
variable_first_y = -1
variable_total_toolshifts = 0
variable_initial_tool = 0
variable_extruder_first_layer_temp = ""
variable_extruder_other_layer_temp = ""
gcode =
{% if "xyz" in printer.toolhead.homed_axes and printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% if printer["gcode_macro _VAOC"].is_started|default(true)|lower == 'true' %}
_VAOC_END
{% endif %}
{% endif %}
_LED_START_PRINTING
CACHE_TOOLHEAD_SETTINGS KEY="start_print"
_USER_START_PRINT { rawparams }
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% set hotend_heat_soak_time = printer["gcode_macro RatOS"].hotend_heat_soak_time|default(0)|int %}
{% set z_probe_stowable = printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set X0 = params.X0|default(-1)|float %}
{% set X1 = params.X1|default(-1)|float %}
{% set Y0 = params.Y0|default(-1)|float %}
{% set Y1 = params.Y1|default(-1)|float %}
{% if first_x == -1 or first_y == -1 %}
{% set first_x = params.FIRST_X|default(-1)|float %}
{% set first_y = params.FIRST_Y|default(-1)|float %}
{% endif %}
{% set total_toolshifts = params.TOTAL_TOOLSHIFTS|default(0)|int %}
{% set initial_tool = params.INITIAL_TOOL|default(default_toolhead)|int %}
{% set start_chamber_temp = params.START_CHAMBER_TEMP|default(0)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set bed_temp = params.BED_TEMP|default(printer.heater_bed.target, true)|float %}
{% set total_layer_count = params.TOTAL_LAYER_COUNT|default(0)|int %}
{% set extruder_first_layer_temp = (params.EXTRUDER_TEMP|default("")).split(",") %}
RATOS_ECHO MSG="First print coordinates X:{first_x} Y:{first_y}"
{% if params.TOTAL_LAYER_COUNT is not defined %}
{% set link_url = "https://os.ratrig.com/docs/slicers" %}
{% set link_text = "RatOS Slicer Configuration" %}
{% set line_1 = '"Your slicer gcode settings are not up to date._N_Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="Incomplete Slicer Configuration detected" TYPE="warning" MSG={line_1}
{% endif %}
SET_PRINT_STATS_INFO CURRENT_LAYER=1
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE=1
{% if total_layer_count > 0 %}
SET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set swap_toolheads = true if printer["gcode_macro _IDEX_REMAP_TOOLHEADS"].enabled|default(false)|lower == 'true' else false %}
{% if swap_toolheads %}
{% set initial_tool = 0 if initial_tool == 1 else 1 %}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=active VALUE=True
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=active VALUE=True
{% endif %}
{% set both_toolheads = true %}
{% if total_toolshifts == 0 %}
{% set both_toolheads = false %}
{% endif %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
_IDEX_SINGLE X={parking_position}
{% endif %}
{% if both_toolheads and (idex_mode == "copy" or idex_mode == "mirror") %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Gcode tool changes found. Copy and mirror mode do not support toolchanges.")}
{% endif %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set both_toolheads = true %}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=initial_tool VALUE={initial_tool}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=first_x VALUE={first_x}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=first_y VALUE={first_y}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=total_toolshifts VALUE={total_toolshifts}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=both_toolheads VALUE={both_toolheads}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_first_layer_temp VALUE="'{params.EXTRUDER_TEMP}'"
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_other_layer_temp VALUE="'{params.EXTRUDER_OTHER_LAYER_TEMP}'"
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=_TOOLCHANGE VARIABLE=toolshift_count VALUE=0
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set svv = printer.save_variables.variables %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set parking_position_t0 = printer["gcode_macro T0"].parking_position|float %}
{% set parking_position_t1 = printer["gcode_macro T1"].parking_position|float %}
{% set stepper_x_position_min = printer.configfile.settings.stepper_x.position_min|float %}
{% set stepper_x_position_endstop = printer.configfile.settings.stepper_x.position_endstop|float %}
{% set dual_carriage_position_max = printer.configfile.settings.dual_carriage.position_max|float %}
{% set dual_carriage_position_endstop = printer.configfile.settings.dual_carriage.position_endstop|float %}
{% set x_parking_space = parking_position_t0 - (stepper_x_position_endstop , stepper_x_position_min)|max %}
{% set dc_parking_space = (dual_carriage_position_endstop , dual_carriage_position_max)|min - parking_position_t1 %}
{% if svv.idex_xoffset|abs >= (x_parking_space - 0.5) or svv.idex_xoffset|abs >= (dc_parking_space - 0.5) %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Toolhead x-offset is too high for the available parking space. Calibrate your X and DC endstop positions and make sure you stay below 1mm." % (copy_mode_max_width)) }
{% endif %}
{% endif %}
{% if (idex_mode == "copy" or idex_mode == "mirror") and printer.configfile.settings.ratos.enable_gcode_transform %}
{% if params.MIN_X is not defined or params.MAX_X is not defined %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Something went wrong! Missing important post processor start print parameter!") }
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=object_xoffset VALUE=0
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set boundary_box_min_x = params.MIN_X|default(0)|float %}
{% set boundary_box_max_x = params.MAX_X|default(printable_x_max)|float %}
{% set svv = printer.save_variables.variables %}
{% if default_toolhead == 0 %}
{% set boundary_box_max_x = boundary_box_max_x + svv.idex_xoffset %}
{% else %}
{% set boundary_box_min_x = boundary_box_min_x - svv.idex_xoffset %}
{% endif %}
{% set center_x = printable_x_max / 2.0 %}
{% set safe_distance = printer.configfile.settings.dual_carriage.safe_distance|float %}
{% set object_width = boundary_box_max_x - boundary_box_min_x %}
{% set copy_mode_max_width = center_x %}
{% set mirror_mode_max_width = center_x - safe_distance / 2.0 %}
DEBUG_ECHO PREFIX="START_PRINT" MSG="OBJECT_WIDTH: {object_width} BOUNDARY_BOX_MIN_X: {boundary_box_min_x} BOUNDARY_BOX_MAX_X: {boundary_box_max_x} CENTER_X: {center_x} SAFE_DISTANCE: {safe_distance}"
{% if idex_mode == "copy" and object_width > copy_mode_max_width %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Object is too big for copy mode! Max supported width is %s mm" % (copy_mode_max_width)) }
{% endif %}
{% if idex_mode == "mirror" and object_width > mirror_mode_max_width %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Object is too big for mirror mode! Max supported width is %s mm" % (mirror_mode_max_width)) }
{% endif %}
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
{% set object_xoffset = (printable_x_max - boundary_box_max_x - boundary_box_min_x) / 2 %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=object_xoffset VALUE={object_xoffset}
{% endif %}
{% endif %}
{% set has_initial_toolhead_filament_sensor = true if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool] is defined else false %}
{% if has_initial_toolhead_filament_sensor %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s filament sensor is empty." % (initial_tool)) }
{% endif %}
{% endif %}
{% endif %}
{% set has_initial_bowden_filament_sensor = true if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool] is defined else false %}
{% if has_initial_bowden_filament_sensor %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool].enabled|lower == "true" %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s bowden sensor is empty." % (initial_tool)) }
{% endif %}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined and both_toolheads %}
{% set has_secondary_toolhead_filament_sensor = true if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)] is defined else false %}
{% if has_secondary_toolhead_filament_sensor %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s filament sensor is empty." % (1 if initial_tool == 0 else 0)) }
{% endif %}
{% endif %}
{% endif %}
{% set has_secondary_bowden_filament_sensor = true if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)] is defined else false %}
{% if has_secondary_bowden_filament_sensor %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].enabled|lower == "true" %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s bowden sensor is empty." % (1 if initial_tool == 0 else 0)) }
{% endif %}
{% endif %}
{% endif %}
{% endif %}
_CHAMBER_FILTER_ON AT="before_print_start"
{% if printer["dual_carriage"] is defined %}
{% if printer["gcode_macro _IDEX_JOIN_SPOOLS"].enabled|default(false)|lower == 'true' %}
{% if both_toolheads %}
RATOS_ECHO MSG="Spool join is not possible if both toolheads are in use!"
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% endif %}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if idex_mode == '' %}
_SET_TOOLHEAD_OFFSET T={default_toolhead} MOVE={1 if "xyz" in printer.toolhead.homed_axes else 0}
{% endif %}
{% endif %}
CLEAR_PAUSE
{% if printer["gcode_macro RatOS"].force_absolute_position|lower == 'true' %}
G90
{% endif %}
SAVE_GCODE_STATE NAME=start_print_state
G21
G90
M82
_USER_START_PRINT_BEFORE_HOMING { rawparams }
{% if z_probe_stowable == true %}
STOWABLE_PROBE_BEGIN_BATCH
{% endif %}
MAYBE_HOME
_Z_HOP
{% if idex_mode != '' and not (printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
PARK_TOOLHEAD
{% endif %}
{% if chamber_temp > 0 %}
{% if printer["fan_generic filter"] is defined %}
{% if printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float > 0 %}
SET_FAN_SPEED FAN=filter SPEED={printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float}
{% endif %}
{% endif %}
_CHAMBER_HEATER_ON START_CHAMBER_TEMP={start_chamber_temp} CHAMBER_TEMP={chamber_temp}
_USER_START_PRINT_HEAT_CHAMBER { rawparams } CHAMBER_TEMP={chamber_temp}
{% endif %}
_START_PRINT_BEFORE_HEATING_BED T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
RATOS_ECHO MSG="Heating bed..."
M190 S{bed_temp}
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
_USER_START_PRINT_AFTER_HEATING_BED { rawparams }
_START_PRINT_AFTER_HEATING_BED T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
_USER_START_PRINT_BED_MESH { rawparams } X0={X0} X1={X1} Y0={Y0} Y1={Y1}
_START_PRINT_BED_MESH X0={X0} X1={X1} Y0={Y0} Y1={Y1} T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
{% if z_probe_stowable == true %}
STOWABLE_PROBE_END_BATCH
{% endif %}
{% if idex_mode == '' %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={extruder_first_layer_temp[0]|float}
{% else %}
{% if initial_tool == 0 or both_toolheads or (default_toolhead == 0 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={extruder_first_layer_temp[0]|float}
{% endif %}
{% if initial_tool == 1 or both_toolheads or (default_toolhead == 1 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
SET_HEATER_TEMPERATURE HEATER="extruder1" TARGET={extruder_first_layer_temp[1]|float}
{% endif %}
{% endif %}
_USER_START_PRINT_PARK { rawparams }
_START_PRINT_PARK
RATOS_ECHO MSG="Heating Extruder..."
{% if idex_mode == '' %}
TEMPERATURE_WAIT SENSOR="extruder" MINIMUM={extruder_first_layer_temp[0]|float} MAXIMUM={extruder_first_layer_temp[0]|float + 5}
{% else %}
{% if initial_tool == 0 or both_toolheads or (default_toolhead == 0 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
TEMPERATURE_WAIT SENSOR="extruder" MINIMUM={extruder_first_layer_temp[0]|float} MAXIMUM={extruder_first_layer_temp[0]|float + 5}
{% endif %}
{% if initial_tool == 1 or both_toolheads or (default_toolhead == 1 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
TEMPERATURE_WAIT SENSOR="extruder1" MINIMUM={extruder_first_layer_temp[1]|float} MAXIMUM={extruder_first_layer_temp[1]|float + 5}
{% endif %}
{% endif %}
{% if hotend_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking hotend for {hotend_heat_soak_time} seconds..."
G4 P{(hotend_heat_soak_time * 1000)}
{% endif %}
{% if idex_mode == '' %}
_LED_PRINTING
{% else %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
_LED_PRINTING
{% else %}
{% if both_toolheads %}
_LED_PRINTING TOOLHEAD={initial_tool}
{% if toolchange_standby_temp > -1 %}
_LED_TOOLHEAD_STANDBY TOOLHEAD={0 if initial_tool == 1 else 1}
{% else %}
_LED_PRINTING TOOLHEAD={0 if initial_tool == 1 else 1}
{% endif %}
{% else %}
_LED_PRINTING TOOLHEAD={initial_tool}
_LED_DEACTIVATE_TOOLHEAD TOOLHEAD={0 if initial_tool == 1 else 1}
{% endif %}
{% endif %}
{% endif %}
_USER_START_PRINT_AFTER_HEATING_EXTRUDER { rawparams } X0={X0} X1={X1} Y0={Y0} Y1={Y1}
_START_PRINT_AFTER_HEATING_EXTRUDER X0={X0} X1={X1} Y0={Y0} Y1={Y1} INITIAL_TOOLHEAD={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
{% if idex_mode != '' %}
{% if not both_toolheads %}
{% if initial_tool != default_toolhead %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
{% endif %}
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
{% if toolchange_standby_temp > -1 %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if initial_tool == 1 else 'extruder1'} TARGET={toolchange_standby_temp}
{% endif %}
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% set x_offset = printer.toolhead.position.x|float - printer.gcode_move.gcode_position.x|float %}
{% endif %}
RESTORE_GCODE_STATE NAME=start_print_state
{% if idex_mode != '' %}
{% set act_idex_mode = printer["dual_carriage"].carriage_1|default('')|lower %}
{% if act_idex_mode == "copy" or act_idex_mode == "mirror" %}
SET_GCODE_OFFSET X={x_offset} MOVE=0
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% if idex_mode == "copy" and idex_mode != act_idex_mode %}
_IDEX_COPY DANCE=0
{% elif idex_mode == "mirror" and idex_mode != act_idex_mode %}
_IDEX_MIRROR DANCE=0
{% endif %}
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
RATOS_ECHO MSG="Adjusting object x-offset by {(object_xoffset)} mm"
SET_GCODE_OFFSET X_ADJUST={object_xoffset} MOVE=0
{% endif %}
{% else %}
_SELECT_TOOL T={initial_tool} TOOLSHIFT=false
{% if initial_tool != default_toolhead %}
{% set svv = printer.save_variables.variables %}
SAVE_VARIABLE VARIABLE=idex_applied_offset VALUE={default_toolhead}
_SET_TOOLHEAD_OFFSET T={initial_tool} MOVE=0
{% endif %}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
_BEACON_SET_NOZZLE_TEMP_OFFSET TOOLHEAD={initial_tool}
{% endif %}
_SET_EXTRUSION_MODE
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=True
{% if printer["gcode_macro _SELECT_TOOL"] is defined %}
SET_GCODE_VARIABLE MACRO=_SELECT_TOOL VARIABLE=last_timestamp VALUE={printer["print_stats"].print_duration}
{% endif %}
_USER_END_START_PRINT { rawparams }
G92 E0
_CHAMBER_FILTER_ON AT="after_print_start"
RATOS_ECHO MSG="Printing..."
[gcode_macro _START_PRINT_BEFORE_HEATING_BED]
gcode =
{% set target_idex_mode = params.IDEX_MODE|default("")|lower %}
{% set initial_toolhead = params.T|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %}
{% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% set act_t = 1 if idex_mode == 'primary' else 0 %}
{% set auto_z_offset_calibration = False %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% set is_fixed = true if printer["gcode_macro _VAOC"].is_fixed|default(true)|lower == 'true' else false %}
{% if printer["gcode_macro _VAOC"].auto_z_offset_calibration|default("false")|lower == 'true' and is_fixed %}
{% if target_idex_mode != "copy" and target_idex_mode != "mirror" %}
{% if both_toolheads or initial_toolhead != default_toolhead %}
{% set auto_z_offset_calibration = True %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set is_stowable_probe = true if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' else false %}
{% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %}
RATOS_ECHO MSG="Pre-heating extruder..."
{% if printer["dual_carriage"] is defined %}
{% if auto_z_offset_calibration %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={min_temp}
SET_HEATER_TEMPERATURE HEATER="extruder1" TARGET={min_temp}
{% else %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET={min_temp}
{% endif %}
{% else %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={min_temp}
{% endif %}
{% endif %}
{% if not is_stowable_probe %}
{% if printer["dual_carriage"] is defined and act_t != default_toolhead %}
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=True
{% endif %}
RATOS_ECHO MSG="Heat soaking z probe..."
{% if auto_z_offset_calibration %}
{% set safe_distance = printer.configfile.settings.dual_carriage.safe_distance|float %}
{% if default_toolhead == 0 %}
_SELECT_TOOL T=0 TOOLSHIFT=false
G1 X{safe_home_x - safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
G1 X{safe_home_x + safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
{% elif default_toolhead == 1 %}
_SELECT_TOOL T=1 TOOLSHIFT=false
G1 X{safe_home_x + safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
G1 X{safe_home_x - safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
{% endif %}
{% else %}
_MOVE_TO_SAFE_Z_HOME
{% endif %}
G0 Z2 F{z_speed}
{% endif %}
[gcode_macro _START_PRINT_AFTER_HEATING_BED]
gcode =
{% set target_idex_mode = params.IDEX_MODE|default("")|lower %}
{% set initial_toolhead = params.T|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %}
{% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set auto_z_offset_calibration = False %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% set is_fixed = true if printer["gcode_macro _VAOC"].is_fixed|default(true)|lower == 'true' else false %}
{% if printer["gcode_macro _VAOC"].auto_z_offset_calibration|default("false")|lower == 'true' and is_fixed %}
{% if target_idex_mode != "copy" and target_idex_mode != "mirror" %}
{% if both_toolheads or initial_toolhead != default_toolhead %}
{% set auto_z_offset_calibration = True %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_wipe_before_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_wipe_before_true_zero|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %}
RATOS_ECHO MSG="Waiting for extruder to be preheated..."
{% if printer["dual_carriage"] is defined %}
{% if auto_z_offset_calibration %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
TEMPERATURE_WAIT SENSOR=extruder1 MINIMUM={min_temp} MAXIMUM={max_temp}
{% else %}
{% if default_toolhead == 0 %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
{% else %}
TEMPERATURE_WAIT SENSOR=extruder1 MINIMUM={min_temp} MAXIMUM={max_temp}
{% endif %}
{% endif %}
{% else %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_Z_HOP
{% endif %}
{% if auto_z_offset_calibration %}
{% set parking_position_t0 = printer["gcode_macro T0"].parking_position|float %}
{% set parking_position_t1 = printer["gcode_macro T1"].parking_position|float %}
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=True
PARK_TOOLHEAD
_CLEANING_MOVE TOOLHEAD={default_toolhead}
_SELECT_TOOL T={0 if default_toolhead == 1 else 1} X={parking_position_t0 if default_toolhead == 1 else parking_position_t1} Y=0 TOOLSHIFT=false
_CLEANING_MOVE TOOLHEAD={0 if default_toolhead == 1 else 1}
_VAOC_CALIBRATE_Z_OFFSET AUTO_Z_OFFSET=True
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=false
{% endif %}
{% set needs_rehoming = False %}
{% if printer.z_tilt is defined and not printer.z_tilt.applied %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% set needs_rehoming = True %}
{% endif %}
{% if printer.quad_gantry_level is defined and not printer.quad_gantry_level.applied %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% set needs_rehoming = True %}
{% endif %}
{% if needs_rehoming %}
G28 Z
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero %}
{% if beacon_contact_wipe_before_true_zero %}
_START_PRINT_AFTER_HEATING_BED_PROBE_FOR_WIPE
{% endif %}
_START_PRINT_AFTER_HEATING_CONTACT_WITH_OPTIONAL_WIPE
{% endif %}
[gcode_macro _START_PRINT_AFTER_HEATING_BED_PROBE_FOR_WIPE]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
G0 Z5 F{z_speed}
G0 X50 Y10 F{speed}
PROBE PROBE_METHOD=contact SAMPLES=1
BEACON_QUERY
[gcode_macro _START_PRINT_AFTER_HEATING_CONTACT_WITH_OPTIONAL_WIPE]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_true_zero_location = printer["gcode_macro RatOS"].beacon_contact_true_zero_location|default("front")|lower %}
{% set beacon_contact_true_zero_margin_x = printer["gcode_macro RatOS"].beacon_contact_true_zero_margin_x|default(30)|int %}
{% set beacon_contact_wipe_before_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_wipe_before_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_wipe_before_true_zero %}
{% if printer.beacon.last_probe_result|lower == "ok" %}
{% set last_z_offset = printer.beacon.last_z_result %}
RATOS_ECHO MSG="Auto calibration nozzle wipe with probe result {last_z_offset}..."
G0 Z{(0.2 + last_z_offset)} F{z_speed}
G0 X70 F300
{% else %}
RATOS_ECHO MSG="Skipping auto calibration nozzle wipe because probing failed!"
{% endif %}
{% endif %}
G0 Z5 F{z_speed}
_MOVE_TO_SAFE_Z_HOME
RATOS_ECHO MSG="Heating extruder to probing temperature..."
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET={beacon_contact_true_zero_temp}
TEMPERATURE_WAIT SENSOR={"extruder" if default_toolhead == 0 else "extruder1"} MINIMUM={beacon_contact_true_zero_temp} MAXIMUM={beacon_contact_true_zero_temp + 5}
RATOS_ECHO MSG="Beacon contact auto calibration..."
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
G0 Z5 F{z_speed}
[gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER]
gcode =
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set first_x = printer["gcode_macro START_PRINT"].first_x|default(-1)|float %}
{% set first_y = printer["gcode_macro START_PRINT"].first_y|default(-1)|float %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set center_x = printable_x_max / 2.0 %}
{% set center_y = printable_y_max / 2.0 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% if printer["dual_carriage"] is defined %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
{% endif %}
{% set X0 = params.X0|default(-1)|int %}
{% set X1 = params.X1|default(-1)|int %}
{% set Y0 = params.Y0|default(-1)|int %}
{% set Y1 = params.Y1|default(-1)|int %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set initial_toolhead = params.INITIAL_TOOLHEAD|default(default_toolhead)|int %}
{% if idex_mode == '' %}
_PRIME
{% else %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
RATOS_ECHO PREFIX="IDEX" MSG="using combined prime offset for IDEX {idex_mode} mode"
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% else %}
{% if both_toolheads %}
{% if initial_toolhead == 0 %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T1"
_SELECT_TOOL T=1 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T0"
_SELECT_TOOL T=0 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% else %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T0"
_SELECT_TOOL T=0 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T1"
_SELECT_TOOL T=1 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% endif %}
{% else %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T{initial_toolhead}"
_SELECT_TOOL T={initial_toolhead} TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% endif %}
{% endif %}
{% endif %}
CACHE_TOOLHEAD_SETTINGS KEY="start_print_after_heating_extruder"
SET_MACRO_TRAVEL_SETTINGS
{% if (X0 > -1 and Y1 > -1) or (first_x > 0 and first_y > 0) %}
{% if printer["dual_carriage"] is defined %}
{% set acceleration = printer["gcode_macro RatOS"].toolchange_travel_accel %}
{% set max_accel = printer.toolhead.max_accel|float %}
{% set square_corner_velocity = printer.toolhead.square_corner_velocity|float %}
SET_VELOCITY_LIMIT ACCEL={acceleration} MINIMUM_CRUISE_RATIO=0 SQUARE_CORNER_VELOCITY=20
{% endif %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
G0 Z3 F{z_speed}
{% endif %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro RatOS"].nozzle_priming|lower == 'false' %}
{% set first_z = 1 %}
{% else %}
{% set first_z = 3 %}
{% endif %}
{% if idex_mode == "mirror" %}
{% if first_y >= 0 %}
G0 Y{first_y} F{speed}
{% else %}
G0 Y{Y1} F{speed}
{% endif %}
{% endif %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro RatOS"].nozzle_priming|lower == 'false' %}
_MOVE_TO_LOADING_POSITION TOOLHEAD={initial_toolhead}
_PURGE_FILAMENT TOOLHEAD={initial_toolhead} E={printer["gcode_macro RatOS"].toolchange_first_purge|default(50)|float}
_CLEANING_MOVE TOOLHEAD={initial_toolhead}
{% endif %}
{% if first_x >= 0 and first_y >= 0 %}
G0 X{first_x} Y{first_y} Z{first_z} F{speed}
{% else %}
{% set first_x = X0 %}
{% set first_y = Y0 %}
{% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' or printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %}
{% set first_x = X0 %}
{% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %}
{% set first_x = X1 %}
{% else %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_x|float <= center_x %}
{% set first_x = X0 %}
{% else %}
{% set first_x = X1 %}
{% endif %}
{% endif %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %}
{% set first_y = Y0 %}
{% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %}
{% set first_y = Y1 %}
{% else %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_y|float <= center_y %}
{% set first_y = Y0 %}
{% else %}
{% set first_y = Y1 %}
{% endif %}
{% endif %}
{% endif %}
G0 X{first_x} Y{first_y} Z{first_z} F{speed}
{% endif %}
{% endif %}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print_after_heating_extruder"
_LOAD_RATOS_SKEW_PROFILE
[gcode_macro _PRIME]
gcode =
{% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' or printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %}
PRIME_BLOB INITIAL_TOOLHEAD={params.INITIAL_TOOLHEAD} BOTH_TOOLHEADS={params.BOTH_TOOLHEADS} IDEX_MODE={params.IDEX_MODE} Y1={params.Y1}
{% endif %}
[gcode_macro END_PRINT]
description = End print procedure, use this in your Slicer.
gcode =
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
SAVE_GCODE_STATE NAME=end_print_state
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=_IDEX_REMAP_TOOLHEADS VARIABLE=enabled VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
{% set object_xoffset = printer["gcode_macro START_PRINT"].object_xoffset|default(0)|float %}
RATOS_ECHO MSG="Adjusting object x-offset by {(0-object_xoffset)} mm"
SET_GCODE_OFFSET X_ADJUST={(0-object_xoffset)}
{% endif %}
{% endif %}
_USER_END_PRINT_BEFORE_HEATERS_OFF { rawparams }
_END_PRINT_BEFORE_HEATERS_OFF
TURN_OFF_HEATERS
_USER_END_PRINT_AFTER_HEATERS_OFF { rawparams }
_END_PRINT_AFTER_HEATERS_OFF
_USER_END_PRINT_PARK { rawparams }
_END_PRINT_PARK
{% if printer["gcode_macro RatOS"].skew_profile is defined %}
SET_SKEW CLEAR=1
{% endif %}
{% if printer["dual_carriage"] is not defined and printer["gcode_macro RatOS"].end_print_motors_off|lower != 'false' %}
M84
{% endif %}
M107
BED_MESH_CLEAR
RATOS_ECHO MSG="Done :)"
RESTORE_GCODE_STATE NAME=end_print_state
{% if printer["dual_carriage"] is defined %}
M84
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
{% if printer["dual_carriage"] is not defined %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
SET_GCODE_OFFSET Z=0 MOVE=0
{% endif %}
{% endif %}
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print"
_CHAMBER_FILTER_ON AT="print_end"
_CHAMBER_FILTER_OFF
_CHAMBER_HEATER_OFF
_USER_END_PRINT_FINISHED { rawparams }
[gcode_macro _END_PRINT_BEFORE_HEATERS_OFF]
gcode =
RATOS_ECHO MSG="Cleaning up..."
[gcode_macro _END_PRINT_AFTER_HEATERS_OFF]
gcode =
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set current_z = printer.toolhead.position.z|float %}
{% set z_hop = printer["gcode_macro RatOS"].end_print_park_z_hop|float %}
{% set r = printer["gcode_macro RatOS"].end_print_retract_filament|default(4)|float %}
{% if current_z < (max_z - z_hop) %}
{% set z_safe = z_hop %}
{% else %}
{% set z_safe = max_z - current_z %}
{% endif %}
G91
G1 E-2 F3600
G0 Z{z_safe} F3600
G1 E-{(r-2)} F3600
G90
[gcode_macro _SET_EXTRUSION_MODE]
gcode =
{% if printer["gcode_macro RatOS"].relative_extrusion|lower == 'true' %}
M83
{% else %}
M82
{% endif %}
[gcode_macro GENERATE_SHAPER_GRAPHS]
description = Genarates input shaper resonances graphs for analysis. Uses the AXIS parameter for if you only want to do one axis at a time, (eg. GENERATE_SHAPER_GRAPHS AXIS=X)
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="generate_shaper_graphs"
SET_MACRO_TRAVEL_SETTINGS
CACHE_IS_GRAPH_FILES
_LED_INPUT_SHAPER_START
{% set axis = params.AXIS|default('')|lower %}
{% set freq_start = params.FREQUENCY_START|default(10)|int %}
{% set freq_end = params.FREQUENCY_END|default(133)|int %}
{% set hz_per_sec = params.HZ_PER_SEC|default(1)|float %}
{% if axis != '' %}
{% if axis == 'x' %}
MAYBE_HOME
TEST_RESONANCES AXIS=X FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_x
{% elif axis == 'y' %}
MAYBE_HOME
TEST_RESONANCES AXIS=Y FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_y
{% else %}
{action_raise_error("Unknown axis specified. Expected X or Y.")}
{% endif %}
{% else %}
MAYBE_HOME
TEST_RESONANCES AXIS=X FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
TEST_RESONANCES AXIS=Y FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_x
RUN_SHELL_COMMAND CMD=generate_shaper_graph_y
{% endif %}
_LED_INPUT_SHAPER_END
RESTORE_TOOLHEAD_SETTINGS KEY="generate_shaper_graphs"
_LEARN_MORE_CALIBRATION
SHOW_IS_GRAPH_FILES TITLE="Shaper graph"
[gcode_shell_command generate_shaper_graph_x]
command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-x.sh
timeout = 60.
verbose = True
[gcode_shell_command generate_shaper_graph_y]
command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-y.sh
timeout = 60.
verbose = True
[gcode_macro MEASURE_COREXY_BELT_TENSION]
description = Generates resonance graph used to ensure belts are equally tensioned.
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="measure_corexy_belt_tension"
SET_MACRO_TRAVEL_SETTINGS
CACHE_IS_GRAPH_FILES
_LED_INPUT_SHAPER_START
{% set freq_start = params.FREQUENCY_START|default(10)|int %}
{% set freq_end = params.FREQUENCY_END|default(133)|int %}
{% set hz_per_sec = params.HZ_PER_SEC|default(1)|float %}
MAYBE_HOME
TEST_RESONANCES AXIS=1,1 OUTPUT=raw_data NAME=belt-tension-upper FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
TEST_RESONANCES AXIS=1,-1 OUTPUT=raw_data NAME=belt-tension-lower FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_belt_tension_graph
_LED_INPUT_SHAPER_END
RESTORE_TOOLHEAD_SETTINGS KEY="measure_corexy_belt_tension"
_LEARN_MORE_CALIBRATION
SHOW_IS_GRAPH_FILES TITLE="Belt Tension Graph"
[gcode_shell_command generate_belt_tension_graph]
command = /home/pi/printer_data/config/RatOS/scripts/generate-belt-tension-graph.sh
timeout = 90.
verbose = True
[idle_timeout]
gcode =
{% if printer.webhooks.state|lower == 'ready' %}
{% if printer.pause_resume.is_paused|lower == 'false' %}
RATOS_ECHO PREFIX="IDLE" MSG="2 hours since last activity. Powering off heaters and motors.."
TURN_OFF_HEATERS
M84
{% endif %}
{% endif %}
timeout = 7200
[temperature_sensor raspberry_pi]
sensor_type = temperature_host
[skew_correction]
[input_shaper]
[virtual_sdcard]
path = ~/printer_data/gcodes
[display_status]
[pause_resume]
[force_move]
enable_force_move = True
[respond]
[resonance_generator]
[ratos]
allow_unknown_gcode_generator = True
[exclude_object]
[heater_bed]
heater_pin = heater_bed_heating_pin
sensor_pin = heater_bed_sensor_pin
sensor_type = Generic 3950
min_temp = 0
max_temp = 120
pwm_cycle_time = 0.02
control = pid
pid_kp = 68.203
pid_ki = 2.842
pid_kd = 409.216
[controller_fan controller_fan]
pin = fan_controller_board_pin
[printer]
kinematics = corexy
max_velocity = 300
max_accel = 3000
max_z_velocity = 20
max_z_accel = 350
square_corner_velocity = 5
minimum_cruise_ratio = 0.5
[gcode_macro QUAD_GANTRY_LEVEL]
rename_existing = QUAD_GANTRY_LEVEL_ORIG
gcode =
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
DEPLOY_PROBE
{% endif %}
QUAD_GANTRY_LEVEL_ORIG
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
STOW_PROBE
{% endif %}
[stepper_x]
position_max = 350
position_endstop = 350
step_pin = PC14
dir_pin = !x_dir_pin
enable_pin = !PE6
microsteps = 64
full_steps_per_rotation = 400
rotation_distance = 40
homing_speed = 50
endstop_pin = tmc5160_stepper_x:virtual_endstop
homing_retract_dist = 0
position_min = 0
[stepper_y]
position_max = 350
position_endstop = 350
step_pin = PE5
dir_pin = y_dir_pin
enable_pin = !PE3
microsteps = 64
full_steps_per_rotation = 400
rotation_distance = 40
homing_speed = 50
endstop_pin = tmc5160_stepper_y:virtual_endstop
homing_retract_dist = 0
position_min = 0
[stepper_z]
position_max = 310
step_pin = PG9
dir_pin = !z0_dir_pin
enable_pin = !PG13
microsteps = 32
full_steps_per_rotation = 200
rotation_distance = 40
position_min = -5
homing_speed = 10
endstop_pin = probe:z_virtual_endstop
gear_ratio = 9:1
[bed_mesh]
speed = 300
horizontal_move_z = 10
mesh_min = 20,30
mesh_max = 310,310
fade_start = 0.6
fade_end = 10.0
probe_count = 5,5
algorithm = bicubic
[quad_gantry_level]
gantry_corners =
-60,-10
410,420
points =
50,25
50,275
300,275
300,25
speed = 300
horizontal_move_z = 10
retries = 5
retry_tolerance = 0.0075
max_adjust = 10
[gcode_macro G32]
gcode =
SAVE_GCODE_STATE NAME=STATE_G32
G90
G28
QUAD_GANTRY_LEVEL
G28
G0 X175 Y175 Z30 F3600
RESTORE_GCODE_STATE NAME=STATE_G32
[firmware_retraction]
retract_speed = 60
unretract_extra_length = 0
unretract_speed = 60
retract_length = 0.5
[resonance_tester]
accel_chip_x = beacon
accel_chip_y = beacon
probe_points =
175,175,20
[tmc5160 stepper_x]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD6
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.022
diag1_pin = ^!x_diag_pin
driver_sgt = 0
[tmc5160 stepper_y]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD5
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.022
diag1_pin = ^!y_diag_pin
driver_sgt = 0
[tmc5160 stepper_z]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD2
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[tmc5160 stepper_z1]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA15
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z1]
step_pin = PG11
dir_pin = !z1_dir_pin
enable_pin = !PG12
microsteps = 32
full_steps_per_rotation = 200
rotation_distance = 40
gear_ratio = 9:1
[tmc5160 stepper_z2]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA9
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z2]
step_pin = PB4
dir_pin = !z2_dir_pin
enable_pin = !PB5
microsteps = 32
full_steps_per_rotation = 200
rotation_distance = 40
gear_ratio = 9:1
[tmc5160 stepper_z3]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA10
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z3]
step_pin = PG15
dir_pin = !z3_dir_pin
enable_pin = !PG14
microsteps = 32
full_steps_per_rotation = 200
rotation_distance = 40
gear_ratio = 9:1
[tmc2209 extruder]
stealthchop_threshold = 0
interpolate = False
uart_pin = toolboard_t0:PB5
run_current = 0.707
driver_tbl = 0
driver_toff = 4
driver_hend = 6
driver_hstrt = 7
sense_resistor = 0.11
[beacon]
serial = /dev/beacon
x_offset = 0
y_offset = 22.5
mesh_main_direction = x
mesh_runs = 1
speed = 15.
lift_speed = 80.
contact_max_hotend_temperature = 275
[delayed_gcode _BEACON_INIT]
initial_duration = 1
gcode =
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
{% set svv = printer.save_variables.variables %}
{% set nozzle_expansion_coefficient_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(0)|float %}
{% if nozzle_expansion_coefficient_multiplier == 0 %}
{% if printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier is not defined %}
{% set nozzle_expansion_coefficient_multiplier = 1.0 %}
{% else %}
{% set nozzle_expansion_coefficient_multiplier = printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier|default(1.0)|float %}
{% endif %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_multiplier VALUE={nozzle_expansion_coefficient_multiplier}
{% endif %}
{% if printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier is defined %}
CONSOLE_ECHO TITLE="Deprecated gcode variable" TYPE="warning" MSG={'"Please remove the variable beacon_contact_expansion_multiplier from your config file."'}
{% endif %}
[gcode_macro BEACON_RATOS_CALIBRATION]
gcode =
RATOS_ECHO MSG="Did you mean BEACON_RATOS_CALIBRATE?"
[gcode_macro BEACON_RATOS_CALIBRATE]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
BEACON_INITIAL_CALIBRATION _AUTOMATED=True
{% if beacon_contact_start_print_true_zero %}
BEACON_POKE_TEST _AUTOMATED=True
_BEACON_CHECK_POKE
{% if printer["dual_carriage"] is not defined %}
BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET _AUTOMATED=True
{% endif %}
{% endif %}
{% if chamber_temp > 0 %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
BEACON_FINAL_CALIBRATION _AUTOMATED=True BED_TEMP={bed_temp} CHAMBER_TEMP={chamber_temp}
{% if beacon_contact_start_print_true_zero %}
BEACON_MEASURE_GANTRY_TWIST
_BEACON_MAYBE_SCAN_COMPENSATION
{% endif %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% if chamber_temp > 0 %}
_CHAMBER_HEATER_OFF
{% endif %}
{% if beacon_contact_start_print_true_zero %}
{% if printer["dual_carriage"] is not defined %}
_BEACON_ECHO_NOZZLE_TEMP_OFFSETS
{% endif %}
_BEACON_ECHO_POKE
{% endif %}
RATOS_ECHO MSG="Beacon calibration finished!"
_LED_BEACON_CALIBRATION_END
RATOS_ECHO MSG="Saving config and restarting klipper..."
SAVE_CONFIG
[gcode_macro BEACON_INITIAL_CALIBRATION]
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed * 60 %}
MAYBE_HOME X=True Y=True
_LED_BEACON_CALIBRATION_START
G90
_MOVE_TO_SAFE_Z_HOME
BEACON_AUTO_CALIBRATE
_Z_HOP
RATOS_ECHO MSG="Initial beacon contact calibration finished!"
{% if not automated %}
_CONSOLE_SAVE_CONFIG
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro BEACON_FINAL_CALIBRATION]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
_BEACON_HOME_AND_ABL
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
_LED_BEACON_CALIBRATION_START
G90
G0 Z2 F{z_hop_speed}
RATOS_ECHO MSG="Waiting for calibration temperature..."
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=150
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp}
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} MAXIMUM={(bed_temp + 5)}
TEMPERATURE_WAIT SENSOR={'extruder' if default_toolhead == 0 else 'extruder1'} MINIMUM=150 MAXIMUM=155
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
_Z_HOP
BEACON_AUTO_CALIBRATE
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% endif %}
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_OFF
{% endif %}
_Z_HOP
RATOS_ECHO MSG="Final beacon contact calibration finished!"
{% if not automated %}
_CONSOLE_SAVE_CONFIG
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro BEACON_POKE_TEST]
variable_poke_result_1 = -1
variable_poke_result_2 = -1
variable_poke_result_3 = -1
variable_poke_result_4 = -1
variable_poke_result_5 = -1
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_1 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_2 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_3 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_4 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_5 VALUE=-1
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
G0 Z5 F{z_hop_speed}
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=1
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=2
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=3
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=4
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=5
_Z_HOP
RATOS_ECHO MSG="Beacon poke test finished!"
{% if not automated %}
_BEACON_ECHO_POKE
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro _BEACON_PROBE_POKE]
gcode =
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
BEACON_POKE speed=3 top=5 bottom={poke_bottom}
BEACON_QUERY
[gcode_macro _BEACON_STORE_POKE]
gcode =
{% set i = params.I|default(1)|int %}
{% set last_z = printer.beacon.last_poke_result|default(0)|float %}
{% if printer.beacon.last_poke_result|lower != "none" %}
{% if printer.beacon.last_poke_result.error == 0 %}
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE={"poke_result_%s" % i} VALUE={printer.beacon.last_poke_result.latency}
{% endif %}
{% endif %}
[gcode_macro _BEACON_CHECK_POKE]
gcode =
{% set p1 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_1|int %}
{% set p2 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_2|int %}
{% set p3 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_3|int %}
{% set p4 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_4|int %}
{% set p5 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_5|int %}
{% if p1 == -1 or p2 == -1 or p3 == -1 or p4 == -1 or p5 == -1 %}
_LED_BEACON_CALIBRATION_ERROR
{ action_raise_error("Beacon poke test error!") }
{% endif %}
{% set avg = (p1 + p2 + p3 + p4 + p5) / 5 %}
{% if avg > 6 %}
_LED_BEACON_CALIBRATION_ERROR
{ action_raise_error("Beacon poke test failed!") }
{% endif %}
[gcode_macro _BEACON_ECHO_POKE]
gcode =
{% set p1 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_1|int %}
{% set p2 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_2|int %}
{% set p3 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_3|int %}
{% set p4 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_4|int %}
{% set p5 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_5|int %}
{% set avg = (p1 + p2 + p3 + p4 + p5) / 5 %}
{% if avg <= 1 %}
{% set type = "success" %}
{% set note = "Extremely low noise, rarely achieved" %}
{% elif avg > 1 and avg <= 4 %}
{% set type = "info" %}
{% set note = "Excellent performance for a typical printer" %}
{% elif avg > 4 and avg <= 8 %}
{% set type = "warning" %}
{% set note = "Acceptable performance, machine may have considerable cyclic axis noise" %}
{% elif avg > 8 and avg <= 11 %}
{% set type = "alert" %}
{% set note = "Not ideal, may want to verify proper mounting or use thinner stackups" %}
{% elif avg > 11 %}
{% set type = "alert" %}
{% set note = "Reason for concern, present setup may be risky to continue with" %}
{% endif %}
CONSOLE_ECHO TITLE="Beacon poke test result:" TYPE={type} MSG={'"Average latency: %.2f_N_%s"' % (avg, note)}
[gcode_macro BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET]
variable_reference_z = 0.0
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set test_margin = 30 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero %}
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
RATOS_ECHO PREFIX="BEACON" MSG="Nozzle temperature offset calibration..."
{% for i in range(10) %}
beacon_poke speed=3 top=5 bottom={poke_bottom}
{% endfor %}
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=250
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET=0
{% if not automated %}
_BEACON_ECHO_NOZZLE_TEMP_OFFSETS
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
{% endif %}
[gcode_macro _BEACON_PROBE_NOZZLE_TEMP_OFFSET]
gcode =
{% set temp = params.TEMP|int %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set hotend_heat_soak_time = printer["gcode_macro RatOS"].hotend_heat_soak_time|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% set idex_zcontrolpoint = svv.idex_zcontrolpoint|default(150)|float %}
RATOS_ECHO PREFIX="BEACON" MSG="Waiting for nozzle to reach {temp}°C..."
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET={temp}
TEMPERATURE_WAIT SENSOR={"extruder" if default_toolhead == 0 else "extruder1"} MINIMUM={temp} MAXIMUM={temp + 2}
{% if hotend_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking hotend for {hotend_heat_soak_time} seconds..."
G4 P{(hotend_heat_soak_time * 1000)}
{% endif %}
RATOS_ECHO PREFIX="BEACON" MSG="Probing with nozzle temperature {temp}°C..."
PROBE PROBE_METHOD=contact PROBE_SPEED=3 LIFT_SPEED=15 SAMPLES=5 SAMPLE_RETRACT_DIST=3 SAMPLES_TOLERANCE=0.005 SAMPLES_TOLERANCE_RETRIES=10 SAMPLES_RESULT=median
BEACON_QUERY
G0 Z5 F{z_speed}
[gcode_macro _BEACON_STORE_NOZZLE_TEMP_OFFSET]
gcode =
{% set temp = params.TEMP|int %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% set last_z = printer.beacon.last_z_result|default(0)|float %}
{% if temp == 150 %}
SET_GCODE_VARIABLE MACRO=BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET VARIABLE=reference_z VALUE={last_z}
{% else %}
{% set reference_z = printer["gcode_macro BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET"].reference_z|default(0)|float %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_t{default_toolhead} VALUE={(last_z - reference_z)}
{% endif %}
[gcode_macro _BEACON_ECHO_NOZZLE_TEMP_OFFSETS]
gcode =
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% if default_toolhead == 0 %}
CONSOLE_ECHO TYPE="info" MSG={'"T0 expansion coefficient %.6f"' % svv.nozzle_expansion_coefficient_t0}
{% else %}
CONSOLE_ECHO TYPE="info" MSG={'"T1 expansion coefficient %.6f"' % svv.nozzle_expansion_coefficient_t1}
{% endif %}
[gcode_macro _BEACON_SET_NOZZLE_TEMP_OFFSET]
variable_runtime_temp = 0
gcode =
{% set toolhead = params.TOOLHEAD|default(0)|int %}
{% set reset = true if params.RESET|default(false)|lower == 'true' else false %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set svv = printer.save_variables.variables %}
{% if reset %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_applied_offset VALUE=0
{% else %}
{% if beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
{% set nozzle_expansion_coefficient_t0 = svv.nozzle_expansion_coefficient_t0|default(0)|float %}
{% if printer["dual_carriage"] is defined %}
{% set nozzle_expansion_coefficient_t1 = svv.nozzle_expansion_coefficient_t1|default(0)|float %}
{% endif %}
{% set nozzle_expansion_coefficient_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(1.0)|float %}
{% set applied_offset = svv.nozzle_expansion_applied_offset|default(0)|float %}
{% set temp = printer['extruder' if toolhead == 0 else 'extruder1'].target|float %}
{% set temp_offset = temp - beacon_contact_true_zero_temp %}
{% set expansion_coefficient = nozzle_expansion_coefficient_t0 if toolhead == 0 else nozzle_expansion_coefficient_t1 %}
{% set expansion_offset = nozzle_expansion_coefficient_multiplier * (temp_offset * (expansion_coefficient / 100)) %}
{% set new_offset = ((-applied_offset) + expansion_offset) %}
SET_GCODE_OFFSET Z_ADJUST={new_offset} MOVE=1 SPEED={z_speed}
SAVE_VARIABLE VARIABLE=nozzle_expansion_applied_offset VALUE={expansion_offset}
SET_GCODE_VARIABLE MACRO=_BEACON_SET_NOZZLE_TEMP_OFFSET VARIABLE=runtime_temp VALUE={temp}
RATOS_ECHO PREFIX="BEACON" MSG={'"Nozzle expansion offset of %.6fmm applied to T%s"' % (expansion_offset, toolhead)}
DEBUG_ECHO PREFIX="_BEACON_SET_NOZZLE_TEMP_OFFSET" MSG="multiplier: {nozzle_expansion_coefficient_multiplier}, coefficient: {expansion_coefficient}, temp_offset: {temp_offset}, expansion_offset: {expansion_offset}, applied_offset: {applied_offset}, new_offset: {new_offset}"
{% endif %}
{% endif %}
[gcode_macro BEACON_MEASURE_GANTRY_TWIST]
variable_needs_compensation = False
variable_reference_z = 0.0
variable_front = 0.0
variable_front_left = 0.0
variable_front_right = 0.0
variable_back = 0.0
variable_back_left = 0.0
variable_back_right = 0.0
variable_right = 0.0
variable_left = 0.0
variable_margin_x = 40
variable_margin_y = 40
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=False
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
RATOS_ECHO PREFIX="BEACON" MSG="Measure gantry twist..."
{% for i in range(10) %}
beacon_poke speed=3 top=5 bottom={poke_bottom}
{% endfor %}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="center"
G0 X{margin_x} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front_left"
G0 X{safe_home_x} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front"
G0 X{(printable_x_max - margin_x)} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front_right"
G0 X{(printable_x_max - margin_x)} Y{safe_home_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="right"
G0 X{(printable_x_max - margin_x)} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back_right"
G0 X{safe_home_x} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back"
G0 X{margin_x} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back_left"
G0 X{margin_x} Y{safe_home_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="left"
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
_BEACON_ECHO_GANTRY_TWIST
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro _BEACON_PROBE_GANTRY_TWIST]
gcode =
RATOS_ECHO PREFIX="BEACON" MSG="Probing..."
BEACON_OFFSET_COMPARE
BEACON_QUERY
[gcode_macro _BEACON_STORE_GANTRY_TWIST]
gcode =
{% set location = params.LOCATION|lower %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set last_z = printer.beacon.last_offset_result["delta"]|default(0)|float %}
{% if location == "center" %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=reference_z VALUE={last_z}
{% else %}
{% set reference_z = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].reference_z|default(0)|float %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE={location} VALUE={(last_z - reference_z)}
{% endif %}
[gcode_macro _BEACON_ECHO_GANTRY_TWIST]
gcode =
{% set reference_z = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].reference_z|default(0)|float * 1000 %}
{% set front_left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front_left|default(0)|float * 1000 %}
{% set front = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front|default(0)|float * 1000 %}
{% set front_right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front_right|default(0)|float * 1000 %}
{% set right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].right|default(0)|float * 1000 %}
{% set back_right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back_right|default(0)|float * 1000 %}
{% set back = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back|default(0)|float * 1000 %}
{% set back_left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back_left|default(0)|float * 1000 %}
{% set left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].left|default(0)|float * 1000 %}
{% set line_1 = "Front left: %.6fμm" % (front_left) %}
{% set line_2 = "Front center: %.6fμm" % (front) %}
{% set line_3 = "Front right: %.6fμm" % (front_right) %}
{% set line_4 = "Left center: %.6fμm" % (left) %}
{% set line_5 = "Right center: %.6fμm" % (right) %}
{% set line_6 = "Back left: %.6fμm" % (back_left) %}
{% set line_7 = "Back center: %.6fμm" % (back) %}
{% set line_8 = "Back right: %.6fμm" % (back_right) %}
{% set max_value = [(front_left|abs), (front|abs), (front_right|abs), (left|abs), (right|abs), (back_left|abs), (back|abs), (back_right|abs)]|max %}
{% if max_value <= 50 %}
{% set type = "success" %}
{% set recommendation = "Very low gantry twist: %.6fμm._N_No beacon scan compensation needed." % max_value %}
{% elif max_value > 50 and max_value <= 100 %}
{% set type = "info" %}
{% set recommendation = "Low gantry twist: %.6fμm._N_You may experience first layer inconsistensies, consider beacon scan compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 100 and max_value <= 150 %}
{% set type = "warning" %}
{% set recommendation = "High gantry twist: %.6fμm._N_High chance of first layer problems, beacon scan compensation is highly encouraged." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 150 and max_value <= 200 %}
{% set type = "alert" %}
{% set recommendation = "Very High gantry twist: %.6fμm._N_You will encounter first layer problems on large prints unless you activate beacon scan compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 200 %}
{% set type = "alert" %}
{% set recommendation = "Extremely high gantry twist: %.6fμm._N_You have significant scan/contact inconsistency which is indicative of mechanical problems, please investigate before resorting to software compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% endif %}
CONSOLE_ECHO TITLE="Gantry twist relative to the center" TYPE={type} MSG={'"_N_%s_N__N_%s_N_%s_N_%s_N_%s_N_%s_N_%s_N_%s_N_%s"' % (recommendation, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8)}
[gcode_macro BEACON_CREATE_SCAN_COMPENSATION_MESH]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set profile = params.PROFILE|default("Contact")|string %}
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_scan_compensation_enable = true if printer["gcode_macro RatOS"].beacon_scan_compensation_enable|default(false)|lower == 'true' else false %}
{% set probe_count = printer["gcode_macro RatOS"].beacon_scan_compensation_probe_count %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% if not beacon_scan_compensation_enable %}
RATOS_ECHO MSG="Beacon scan compensation is disabled!"
{% else %}
MAYBE_HOME
_MOVE_TO_SAFE_Z_HOME
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_LED_BEACON_CALIBRATION_START
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=150
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp}
RATOS_ECHO MSG="Please wait..."
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} MAXIMUM={(bed_temp + 5)}
TEMPERATURE_WAIT SENSOR={'extruder' if default_toolhead == 0 else 'extruder1'} MINIMUM=150 MAXIMUM=155
{% endif %}
{% if not automated %}
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
{% endif %}
{% if printer.z_tilt is defined %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% endif %}
{% if printer.quad_gantry_level is defined %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% endif %}
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES=2 SAMPLES_DROP=1 SAMPLES_TOLERANCE_RETRIES=10 PROBE_COUNT={probe_count[0]},{probe_count[1]} PROFILE={profile}
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% endif %}
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_OFF
{% endif %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
RATOS_ECHO MSG="Beacon scan compensation mesh created!"
{% if not automated %}
RATOS_ECHO MSG="Saving config and restarting klipper..."
SAVE_CONFIG
{% endif %}
{% endif %}
[gcode_macro _BEACON_APPLY_SCAN_COMPENSATION]
gcode =
{% set beacon_scan_compensation_profile = printer["gcode_macro RatOS"].beacon_scan_compensation_profile %}
{% set beacon_scan_compensation_enable = true if printer["gcode_macro RatOS"].beacon_scan_compensation_enable|default(false)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_SCAN_COMPENSATION" MSG="beacon_scan_compensation_profile {beacon_scan_compensation_profile}, beacon_scan_compensation_enable {beacon_scan_compensation_enable}"
{% if beacon_scan_compensation_enable %}
BEACON_APPLY_SCAN_COMPENSATION PROFILE={beacon_scan_compensation_profile}
{% endif %}
[gcode_macro _BEACON_MAYBE_SCAN_COMPENSATION]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set needs_scan_compensation = true if printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].needs_compensation|default(false)|lower == 'true' else false %}
{% if needs_scan_compensation %}
BEACON_CREATE_SCAN_COMPENSATION_MESH _AUTOMATED=True BED_TEMP={bed_temp} CHAMBER_TEMP={chamber_temp}
{% endif %}
[gcode_macro _BEACON_HOME_AND_ABL]
gcode =
MAYBE_HOME X=True Y=True
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% set needs_rehoming = False %}
{% if printer.z_tilt is defined and not printer.z_tilt.applied %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% set needs_rehoming = True %}
{% endif %}
{% if printer.quad_gantry_level is defined and not printer.quad_gantry_level.applied %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% set needs_rehoming = True %}
{% endif %}
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% if needs_rehoming %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% endif %}
[gcode_macro _BEACON_SAVE_MULTIPLIER]
gcode =
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set multiplier = printer["gcode_macro _BEACON_APPLY_RUNTIME_MULTIPLIER"].runtime_multiplier|default(-1.0)|float %}
DEBUG_ECHO PREFIX="_BEACON_SAVE_MULTIPLIER" MSG="multiplier: {multiplier}, beacon_contact_start_print_true_zero: {beacon_contact_start_print_true_zero}, beacon_contact_expansion_compensation: {beacon_contact_expansion_compensation}"
{% if multiplier > 0 and beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_multiplier VALUE={multiplier}
SET_GCODE_VARIABLE MACRO=_BEACON_APPLY_RUNTIME_MULTIPLIER VARIABLE=runtime_multiplier VALUE=-1.0
CONSOLE_ECHO TITLE="Hotend thermal expansion compensation" TYPE="success" MSG={'"New value is: %.6f_N_The new multiplier value has been saved to the configuration."' % multiplier}
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _BEACON_APPLY_RUNTIME_MULTIPLIER]
variable_runtime_multiplier = -1.0
gcode =
{% set toolhead = 0 %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set toolhead = 1 if idex_mode == 'primary' else 0 %}
{% endif %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set layer_number = printer["gcode_macro _ON_LAYER_CHANGE"].layer_number|default(0)|int %}
{% set is_printing_gcode = true if printer["gcode_macro START_PRINT"].is_printing_gcode|default(true)|lower == 'true' else false %}
{% if layer_number == 0 and is_printing_gcode %}
{% set link_url = "https://os.ratrig.com/docs/slicers" %}
{% set link_text = "RatOS Slicer Documentation" %}
{% set line_1 = '"Your slicer is not correctly reporting layer information. See the layer change custom g-code in the %s".' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="Missing layer information" TYPE="warning" MSG={line_1}
{% endif %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_RUNTIME_MULTIPLIER" MSG="layer_number: {layer_number}, is_printing_gcode: {is_printing_gcode}, beacon_contact_start_print_true_zero: {beacon_contact_start_print_true_zero}, beacon_contact_expansion_compensation: {beacon_contact_expansion_compensation}"
{% if layer_number == 1 and is_printing_gcode and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
{% set svv = printer.save_variables.variables %}
{% set nozzle_expansion_coefficient = svv.nozzle_expansion_coefficient_t0|default(0)|float %}
{% if toolhead == 1 %}
{% set nozzle_expansion_coefficient = svv.nozzle_expansion_coefficient_t1|default(0)|float %}
{% endif %}
{% set beacon_contact_expansion_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(1.0)|float %}
{% set print_temp = printer["gcode_macro _BEACON_SET_NOZZLE_TEMP_OFFSET"].runtime_temp|default(0)|int %}
{% if print_temp > 0 %}
{% set z_offset = printer.gcode_move.homing_origin.z|float %}
{% set temp_delta = print_temp - beacon_contact_true_zero_temp %}
{% set coefficient_per_degree = nozzle_expansion_coefficient / 100 %}
{% set z_offset_per_degree = z_offset / temp_delta %}
{% set new_multiplier = z_offset_per_degree / coefficient_per_degree %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_RUNTIME_MULTIPLIER" MSG="print_temp: {print_temp}, z_offset: {z_offset}, temp_delta: {temp_delta}, nozzle_expansion_coefficient: {nozzle_expansion_coefficient}, coefficient_per_degree: {coefficient_per_degree}, z_offset_per_degree: {z_offset_per_degree}, old_multiplier: {beacon_contact_expansion_multiplier}, new_multiplier: {new_multiplier}"
SET_GCODE_VARIABLE MACRO=_BEACON_APPLY_RUNTIME_MULTIPLIER VARIABLE=runtime_multiplier VALUE={new_multiplier}
{% endif %}
{% endif %}
[gcode_macro T0]
variable_join = 0
variable_remap = 0
variable_alert = ""
variable_filament_name = ""
variable_filament_type = ""
variable_filament_temp = 0
variable_runout_sensor = ""
variable_active = True
variable_color = "7bff33"
variable_hotend_type = "SF"
variable_has_cht_nozzle = True
variable_cooling_position_to_nozzle_distance = 40
variable_tooolhead_sensor_to_extruder_gear_distance = 15
variable_extruder_gear_to_cooling_position_distance = 30
variable_filament_loading_nozzle_offset = -5
variable_filament_grabbing_length = 5
variable_filament_grabbing_speed = 1
variable_enable_insert_detection = True
variable_enable_runout_detection = True
variable_enable_clog_detection = True
variable_unload_after_runout = True
variable_purge_after_load = 0
variable_purge_before_unload = 0
variable_extruder_load_speed = 60
variable_filament_load_speed = 10
variable_standby = False
variable_temperature_offset = 0
variable_has_oozeguard = False
variable_has_front_arm_nozzle_wiper = False
variable_resume_after_insert = False
gcode =
{% set x = params.X|default(-1.0)|float %}
{% set y = params.Y|default(-1.0)|float %}
{% set z = params.Z|default(0.0)|float %}
{% set s = params.S|default(1)|int %}
{% if printer["gcode_macro _SELECT_TOOL"] is defined %}
_SELECT_TOOL T=0 X={x} Y={y} Z={z} TOOLSHIFT={s}
{% endif %}
[save_variables]
filename = /home/pi/printer_data/config/ratos-variables.cfg
=======================
Extruder max_extrude_ratio=0.415752
mcu 'mcu': Starting serial connect
webhooks client 4126055200: New connection
webhooks client 4126055200: Client info {'program': 'Moonraker', 'version': 'v0.9.3-0-g71f9e67'}
Loaded MCU 'mcu' 118 commands (v0.12.0-396-gb7233d119 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34)
MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 BUS_PINS_i2c3_PA8_PC9=PA8,PC9 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h723xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1
mcu 'rpi': Starting connect
Loaded MCU 'rpi' 119 commands (?-20240727_132503-fv-az659-741 / gcc: (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110 binutils: (GNU Binutils for Raspbian) 2.35.2)
MCU 'rpi' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256
mcu 'toolboard_t0': Starting serial connect
Loaded MCU 'toolboard_t0' 100 commands (v0.12.0-396-gb7233d119 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34)
MCU 'toolboard_t0' config: ADC_MAX=4095 BUS_PINS_i2c1=PB6,PB7 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB7=PB8,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c1_PF1_PF0=PF1,PF0 BUS_PINS_i2c1a=PF1,PF0 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 CLOCK_FREQ=48000000 MCU=stm32f042x6 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PF0,PF1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1
mcu_temperature 'mcu' nominal base=-275.577689 slope=1631.474104
mcu_temperature 'toolboard_t0' nominal base=342.920354 slope=-724.778761
mcu 'beacon': Starting serial connect
Loaded MCU 'beacon' 45 commands (Beacon 2.1.0 / )
MCU 'beacon' config: ADC_MAX=4095 BEACON_ACCEL_BITS=12 BEACON_ACCEL_SCALE_16G=7.81 BEACON_ACCEL_SCALE_2G=0.98 BEACON_ACCEL_SCALE_4G=1.95 BEACON_ACCEL_SCALE_8G=3.91 BEACON_ADC_SMOOTH_COUNT=16 BEACON_HAS_ACCEL=1 BEACON_REV=H CLOCK_FREQ=32000000 MCU=beacon STATS_SUMSQ_BASE=256
Config error
Traceback (most recent call last):
File "/home/pi/klipper/klippy/klippy.py", line 135, in _connect
cb()
File "/home/pi/klipper/klippy/mcu.py", line 748, in _connect
self._send_config(None)
File "/home/pi/klipper/klippy/mcu.py", line 679, in _send_config
cb()
File "/home/pi/klipper/klippy/mcu.py", line 456, in _build_config
raise pins.error("shutdown value must be 0.0 or 1.0 on soft pwm")
pins.error: shutdown value must be 0.0 or 1.0 on soft pwm
webhooks client 4126055200: Disconnected
Restarting printer
Start printer at Sun May 25 00:45:15 2025 (1748130315.8 293.8)
===== Config file =====
[mcu rpi]
serial = /tmp/klipper_host_mcu
[board_pins btt-kraken]
aliases =
x_step_pin=PC14,
x_dir_pin=PC13,
x_enable_pin=PE6,
x_uart_pin=PD6,
x_diag_pin=PC15,
x_endstop_pin=PC15,
y_step_pin=PE5,
y_dir_pin=PE4,
y_enable_pin=PE3,
y_uart_pin=PD6,
y_diag_pin=PF0,
y_endstop_pin=PF0,
z0_step_pin=PG9,
z0_dir_pin=PG10,
z0_enable_pin=PG13,
z0_uart_pin=PA15,
z0_diag_pin=PF3,
z1_step_pin=PG11,
z1_dir_pin=PD7,
z1_enable_pin=PG12,
z1_uart_pin=PA9,
z1_diag_pin=PF4,
z2_step_pin=PB4,
z2_dir_pin=PB3,
z2_enable_pin=PB5,
z2_uart_pin=PA10,
z2_diag_pin=PF10,
z3_step_pin=PG15,
z3_dir_pin=PB6,
z3_enable_pin=PG14,
z3_uart_pin=PD2,
z3_diag_pin=PC0,
e_step_pin=PG9,
e_dir_pin=PG10,
e_enable_pin=PG13,
e_uart_pin=PD2,
e_diag_pin=PF1,
e_heater_pin=PF6,
e_sensor_pin=PB1,
stepper_spi_mosi_pin=PC8,
stepper_spi_miso_pin=PC7,
stepper_spi_sclk_pin=PC6,
adxl345_cs_pin=PE10,
bltouch_sensor_pin=PG1,
bltouch_control_pin=PE9,
probe_pin=PG1,
fan_part_cooling_pin=PA0,
fan_toolhead_cooling_pin=PA1,
fan_controller_board_pin=PA2,
heater_bed_heating_pin=PF5,
heater_bed_sensor_pin=PB0,
4p_fan_part_cooling_pin=PA6,
4p_fan_part_cooling_tach_pin=PC1,
4p_toolhead_cooling_pin=PE8,
4p_toolhead_cooling_tach_pin=PG0,
4p_controller_board_pin=PE8,
4p_controller_board_tach_pin=PG0
[mcu]
serial = /dev/RatOS/btt-kraken
[temperature_sensor Kraken]
sensor_type = temperature_mcu
[adxl345 controlboard]
cs_pin = PE10
spi_software_mosi_pin = PE14
spi_software_miso_pin = PE13
spi_software_sclk_pin = PE12
[board_pins toolboard_t0]
mcu = toolboard_t0
aliases =
e_step_pin=PB7,
e_dir_pin=PB6,
e_enable_pin=PB4,
e_uart_pin=PB5,
e_heater_pin=PA0,
e_sensor_pin=PA3,
stepper_spi_mosi_pin=null,
stepper_spi_miso_pin=null,
stepper_spi_sclk_pin=null,
adxl345_cs_pin=PA4,
bltouch_sensor_pin=PA15,
bltouch_control_pin=PB3,
probe_pin=PA15,
fan_part_cooling_pin=PA10,
fan_toolhead_cooling_pin=PA9,
fan_controller_board_pin=null,
heater_bed_heating_pin=null,
heater_bed_sensor_pin=null,
4p_fan_part_cooling_pin=null,
4p_fan_part_cooling_tach_pin=null,
4p_toolhead_cooling_pin=null,
4p_toolhead_cooling_tach_pin=null,
4p_controller_board_pin=null,
4p_controller_board_tach_pin=null
[mcu toolboard_t0]
serial = /dev/RatOS/ldo-orbitool-o2-t0
[temperature_sensor Orbitool_O2_T0]
sensor_type = temperature_mcu
sensor_mcu = toolboard_t0
[lis2dw toolboard_t0]
axes_map = x, z, y
cs_pin = toolboard_t0:PA4
spi_bus = spi1
[extruder]
max_power = 0.995
rotation_distance = 4.63
full_steps_per_rotation = 200
filament_diameter = 1.750
max_extrude_only_velocity = 60
max_extrude_only_distance = 200
nozzle_diameter = 0.5
heater_pin = toolboard_t0:PA0
sensor_type = PT1000
pullup_resistor = 2200
sensor_pin = toolboard_t0:PA3
min_extrude_temp = 170
min_temp = 0
max_temp = 285
pressure_advance = 0.05
step_pin = toolboard_t0:PB7
dir_pin = !toolboard_t0:e_dir_pin
enable_pin = !toolboard_t0:PB4
microsteps = 64
control = pid
pid_kp = 21.673
pid_ki = 1.338
pid_kd = 87.776
[adc_temperature hotend_power_scale]
temperature1 = 119
voltage1 = 1.91
temperature2 = 239
voltage2 = 3.82
[fan]
max_power = 0.995
shutdown_speed = 1.0
pin = PA6
cycle_time = 0.00004
tachometer_pin = ^PC1
tachometer_poll_interval = 0.0005
[heater_fan toolhead_cooling_fan]
max_power = 0.995
cycle_time = 0.0001
shutdown_speed = 0
pin = PA1
fan_speed = 1
heater = extruder
[output_pin O2_RUN_LED]
pin = toolboard_t0:PB8
shutdown_value = 0
value = 1
[temperature_sensor hotend_power_draw]
sensor_pin = toolboard_t0:PA2
sensor_type = hotend_power_scale
[gcode_macro RatOS]
variable_homing = "endstops"
variable_z_probe = "static"
variable_sensorless_x_current = 0.49699999999999994
variable_sensorless_y_current = 0.7242
variable_safe_home_x = "middle"
variable_safe_home_y = "middle"
variable_driver_type_x = "tmc2209"
variable_driver_type_y = "tmc2209"
variable_stowable_probe_stop_on_error = False
variable_chamber_filter_enable = True
variable_chamber_filter_speed = 0.5
variable_chamber_filter_disable_speed = 1.0
variable_chamber_filter_enable_at = "after_print_start"
variable_chamber_filter_disable_period = 300
variable_chamber_filter_disable_bed_temp = 0
variable_chamber_heater_enable = True
variable_chamber_heater_bed_temp = 115
variable_chamber_heater_preheating_temp = 150
variable_chamber_heater_heating_temp_offset = 25
variable_chamber_heater_control_external_heater = False
variable_chamber_heater_air_circulation_enable = True
variable_chamber_heater_air_circulation_fan_speed = 0.35
variable_chamber_heater_air_circulation_y_pos = 0
variable_chamber_heater_air_circulation_z_pos = 100
variable_chamber_heater_extra_fan_speed = 1.0
variable_chamber_heater_filter_fan_speed = 1.0
variable_led_status_action = 0.0,1.0,1.0
variable_led_status_success = 0.0,1.0,0.0
variable_led_status_error = 1.0,0.0,1.0
variable_led_status_on = 1.0,1.0,1.0
variable_led_status_off = 0.0,0.0,1.0
variable_led_status_standby = 0.1,0.1,0.1
variable_led_status_heating = 1.0,0.0,0.0
variable_led_status_cooling = 0.0,0.0,1.0
variable_calibrate_bed_mesh = True
variable_adaptive_mesh = True
variable_start_print_park_in = "front"
variable_start_print_park_z_height = 50
variable_end_print_park_in = "back"
variable_pause_print_park_in = "front"
variable_end_print_park_z_hop = 20
variable_nozzle_priming = "primeblob"
variable_nozzle_prime_start_x = "max"
variable_nozzle_prime_start_y = "min"
variable_nozzle_prime_direction = "auto"
variable_nozzle_prime_bridge_fan = 102
variable_probe_for_priming_result = None
variable_probe_for_priming_end_result = None
variable_probe_for_priming_result_t1 = None
variable_probe_for_priming_end_result_t1 = None
variable_probe_for_priming_disable_mesh_constraints = False
variable_adaptive_prime_offset_threshold = -1.0
variable_last_z_offset = None
variable_runout_park_in = "front"
variable_enable_unload_tip_forming = False
variable_filament_unload_length = 150
description = RatOS variable storage macro, will echo variables to the console when run.
variable_relative_extrusion = False
variable_force_absolute_position = False
variable_preheat_extruder = True
variable_preheat_extruder_temp = 150
variable_macro_travel_speed = 300
variable_macro_travel_accel = 3000
variable_macro_z_speed = 15
variable_bed_margin_x = [0, 0]
variable_bed_margin_y = [0, 0]
variable_printable_x_min = 0
variable_printable_x_max = 0
variable_printable_y_min = 0
variable_printable_y_max = 0
variable_end_print_motors_off = True
variable_status_color_ok = "00FF00"
variable_status_color_error = "FF0000"
variable_status_color_unknown = "FFFF00"
variable_end_print_retract_filament = 10
gcode =
ECHO_RATOS_VARS
variable_beacon_bed_mesh_scv = 25
variable_beacon_contact_z_homing = False
variable_beacon_contact_start_print_true_zero = True
variable_beacon_contact_wipe_before_true_zero = True
variable_beacon_contact_true_zero_temp = 150
variable_beacon_contact_prime_probing = True
variable_beacon_contact_expansion_compensation = True
variable_beacon_contact_bed_mesh = False
variable_beacon_contact_bed_mesh_samples = 2
variable_beacon_contact_z_tilt_adjust = False
variable_beacon_contact_z_tilt_adjust_samples = 2
variable_beacon_scan_compensation_enable = False
variable_beacon_scan_compensation_profile = "Contact"
variable_beacon_scan_compensation_probe_count = 15,15
variable_beacon_contact_poke_bottom_limit = -1
variable_homing_x = "sensorless"
variable_homing_y = "sensorless"
variable_x_driver_types = ["tmc5160"]
variable_x_axes = ["x"]
variable_y_driver_types = ["tmc5160"]
variable_y_axes = ["y"]
variable_z_driver_types = ["tmc5160", "tmc5160", "tmc5160", "tmc5160"]
variable_z_axes = ["z", "z1", "z2", "z3"]
[ratos_homing]
axes = xyz
z_hop = 15
z_hop_speed = 15
gcode =
_LED_ON
{% set prev_stop_on_error = printer["gcode_macro RatOS"].stowable_probe_stop_on_error %}
{% if printer["dual_carriage"] is defined %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set target_idex_mode = printer["dual_carriage"].carriage_1|lower %}
_IDEX_SINGLE
_SELECT_TOOL T={default_toolhead} TOOLSHIFT=false
{% endif %}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE=True
M400
G90
{% set X = true if params.X is defined else false %}
{% set Y = true if params.Y is defined else false %}
{% set Z = true if params.Z is defined else false %}
{% if printer["gcode_macro RatOS"].home_y_first|default(false)|lower == 'true' %}
HOME_Y X={X} Y={Y} Z={Z}
HOME_X X={X} Y={Y} Z={Z}
{% else %}
HOME_X X={X} Y={Y} Z={Z}
HOME_Y X={X} Y={Y} Z={Z}
{% endif %}
HOME_Z X={X} Y={Y} Z={Z}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE={prev_stop_on_error}
{% if printer["dual_carriage"] is defined %}
{% if target_idex_mode == "copy" %}
_IDEX_COPY
{% elif target_idex_mode == "mirror" %}
_IDEX_MIRROR
{% endif %}
{% endif %}
[gcode_macro HOME_X]
gcode =
{% set x_homed = 'x' in printer.toolhead.homed_axes %}
{% set homing = printer["gcode_macro RatOS"].homing|lower %}
{% set homing_x = printer["gcode_macro RatOS"].homing_x|lower %}
{% set homing_x = homing_x if homing_x else homing %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_X" MSG="printable_x_max: {printable_x_max}, safe_home_x: {safe_home_x}, axis_maximum.x: {printer.toolhead.axis_maximum.x}, bed_margin_x: {printer['gcode_macro RatOS'].bed_margin_x}"
{% if X or not Y and not Z %}
{% if homing_x == 'endstop' %}
G28 X
{% elif homing_x == 'sensorless' %}
{% if printer["dual_carriage"] is defined %}
{ action_emergency_stop("sensorless homing not supported on IDEX!") }
{% endif %}
HOME_X_SENSORLESS
{% else %}
{ action_emergency_stop("expected RatOS variable_homing_x to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_x, homing)) }
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set parking_position = printer["gcode_macro T%s" % (0 if default_toolhead==1 else 1)].parking_position|float %}
SET_DUAL_CARRIAGE CARRIAGE={0 if default_toolhead==1 else 1} MODE=PRIMARY
G1 X{parking_position} F{speed}
SET_DUAL_CARRIAGE CARRIAGE={default_toolhead} MODE=PRIMARY
{% endif %}
{% set x_homed = True %}
G0 X{safe_home_x} F{speed}
M400
{% endif %}
[gcode_macro HOME_Y]
gcode =
{% set y_homed = 'y' in printer.toolhead.homed_axes %}
{% set homing = printer["gcode_macro RatOS"].homing|lower %}
{% set homing_y = printer["gcode_macro RatOS"].homing_y|lower %}
{% set homing_y = homing_y if homing_y else homing %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_Y" MSG="printable_y_max: {printable_y_max}, safe_home_y: {safe_home_y}, axis_maximum.y: {printer.toolhead.axis_maximum.y}, bed_margin_y: {printer['gcode_macro RatOS'].bed_margin_y}"
{% if Y or not X and not Z %}
{% if homing_y == 'endstop' %}
G28 Y
{% elif homing_y == 'sensorless' %}
HOME_Y_SENSORLESS
{% else %}
{ action_emergency_stop("expected RatOS variable_homing_y to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_y, homing)) }
{% endif %}
{% set y_homed = True %}
G0 Y{safe_home_y} F{speed}
{% endif %}
[gcode_macro HOME_Z]
gcode =
{% set x_homed = 'x' in printer.toolhead.homed_axes %}
{% set y_homed = 'y' in printer.toolhead.homed_axes %}
{% set z_probe = printer["gcode_macro RatOS"].z_probe %}
{% set beacon_contact_z_homing = true if printer["gcode_macro RatOS"].beacon_contact_z_homing|default(false)|lower == 'true' else false %}
{% set X = true if params.X|lower == 'true' else false %}
{% set Y = true if params.Y|lower == 'true' else false %}
{% set Z = true if params.Z|lower == 'true' else false %}
DEBUG_ECHO PREFIX="HOME_Z" MSG="x_homed: {x_homed}, y_homed: {y_homed}, z_probe: {z_probe}, beacon_contact_z_homing: {beacon_contact_z_homing}"
{% if Z or not Y and not X %}
RATOS_ECHO MSG="Homing Z"
{% if x_homed == False or y_homed == False %}
{ action_emergency_stop("X and Y must be homed before homing Z") }
{% else %}
{% if z_probe == "stowable" %}
DEPLOY_PROBE
_MOVE_TO_SAFE_Z_HOME
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_homing %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% else %}
G28 Z
{% endif %}
_Z_HOP
STOW_PROBE
{% else %}
_MOVE_TO_SAFE_Z_HOME
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_homing %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% else %}
G28 Z
{% endif %}
_Z_HOP
{% endif %}
{% endif %}
{% endif %}
[gcode_macro HOME_X_SENSORLESS]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="home_x_sensorless"
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
M204 S1000
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_x_current}
{% endif %}
G4 P300
G28 X
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].x_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].y_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current}
{% endif %}
G4 P300
RESTORE_TOOLHEAD_SETTINGS KEY="home_x_sensorless"
[gcode_macro HOME_Y_SENSORLESS]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="home_y_sensorless"
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
M204 S1000
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_y_current}
{% endif %}
G4 P300
G28 Y
{% if printer["gcode_macro RatOS"].x_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].x_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].x_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current}
{% endif %}
{% if printer["gcode_macro RatOS"].y_axes is defined %}
{% for axis in printer["gcode_macro RatOS"].y_axes %}
{% set stepper = "stepper_" ~ axis|lower %}
{% set stepper_driver = printer["gcode_macro RatOS"].y_driver_types[loop.index0] ~ " " ~ stepper %}
SET_TMC_CURRENT STEPPER={stepper} CURRENT={printer.configfile.config[stepper_driver].run_current}
{% endfor %}
{% else %}
{% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current}
{% endif %}
G4 P300
RESTORE_TOOLHEAD_SETTINGS KEY="home_y_sensorless"
[gcode_macro _Z_HOP]
description = Move Z axis up by Z_HOP distance at Z_HOP_SPEED. In relative mode it will move Z axis up by Z_HOP distance. In absolute mode it will move Z axis to Z_HOP distance.
gcode =
{% set z_hop = printer.configfile.config.ratos_homing.z_hop|float %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
G0 Z{z_hop} F{z_hop_speed}
[gcode_macro _MOVE_TO_SAFE_Z_HOME]
description = Move to safe home position with optional Z_HOP (pass Z_HOP=True as parameter)
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% if params.Z_HOP is defined %}
_Z_HOP
{% endif %}
DEBUG_ECHO PREFIX="_MOVE_TO_SAFE_Z_HOME" MSG="axis_maximum.x: {printer.toolhead.axis_maximum.x}, axis_maximum.y: {printer.toolhead.axis_maximum.y}, bed_margin_x: {printer['gcode_macro RatOS'].bed_margin_x}, bed_margin_y: {printer['gcode_macro RatOS'].bed_margin_y}, safe_home_x: {safe_home_x}, safe_home_y: {safe_home_y}, printable_x_max: {printable_x_max}, printable_y_max: {printable_y_max}"
G0 X{safe_home_x} Y{safe_home_y} F{speed}
[gcode_macro MAYBE_HOME]
description = Only home unhomed axis
variable_is_kinematic_position_overriden = False
gcode =
{% if printer["gcode_macro MAYBE_HOME"].is_kinematic_position_overriden|lower == 'true' %}
RATOS_ECHO MSG="SET_CENTER_KINEMATIC_POSITION has been abused. Homing all axes. Please refrain from using SET_CENTER_KINEMATIC_POSITION outside of debugging purposes."
G28
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=False
{% else %}
{% set axes = '' %}
{% set isHomed = true %}
{% set axesToHome = '' %}
{% if params.X is defined %}
{% set axes = axes ~ 'X ' %}
{% if 'x' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'X ' %}
{% endif %}
{% endif %}
{% if params.Y is defined %}
{% set axes = axes ~ 'Y ' %}
{% if 'y' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Y ' %}
{% endif %}
{% endif %}
{% if params.Z is defined %}
{% set axes = axes ~ 'Z ' %}
{% if 'z' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Z ' %}
{% endif %}
{% endif %}
{% if params.X is not defined and params.Y is not defined and params.Z is not defined %}
{% set axes = '' %}
{% if 'x' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'X ' %}
{% endif %}
{% if 'y' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Y ' %}
{% endif %}
{% if 'z' not in printer.toolhead.homed_axes %}
{% set isHomed = false %}
{% set axesToHome = axesToHome ~ 'Z ' %}
{% endif %}
{% endif %}
{% if isHomed is false %}
RATOS_ECHO MSG="Homing {axesToHome}"
G28 {axesToHome}
{% else %}
RATOS_ECHO MSG="All requested axes already homed, skipping.."
{% endif %}
{% endif %}
[gcode_macro PID_CALIBRATE_HOTEND]
description = Perform a PID calibration test for a given extruder heater.
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set temp = params.TEMP|default(220)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_HOTEND" MSG="TEMP={temp}"
{% if printer["dual_carriage"] is not defined %}
RATOS_ECHO MSG="PID calibration hotend heater T0 at {temp}°C..."
PID_CALIBRATE HEATER=extruder TARGET={temp}
_CONSOLE_SAVE_CONFIG
{% else %}
{% if toolhead==0 or toolhead==1 %}
RATOS_ECHO MSG="PID calibration hotend heater T{toolhead} at {temp}°C..."
PID_CALIBRATE HEATER=extruder{'' if toolhead==0 else toolhead} TARGET={temp}
_CONSOLE_SAVE_CONFIG
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
_LEARN_MORE_CALIBRATION
[gcode_macro PID_CALIBRATE_BED]
description = Perform a PID calibration test for the bed heater.
gcode =
{% set temp = params.TEMP|default(80)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_BED" MSG="TEMP={temp}"
RATOS_ECHO MSG="PID calibration bed heater at {temp}°C..."
PID_CALIBRATE HEATER=heater_bed TARGET={temp}
_CONSOLE_SAVE_CONFIG
_LEARN_MORE_CALIBRATION
[gcode_macro PID_CALIBRATE_CHAMBER_HEATER]
description = Perform a PID calibration test for the chamber heater.
gcode =
{% set temp = params.TEMP|default(150)|int %}
DEBUG_ECHO PREFIX="PID_CALIBRATE_CHAMBER_HEATER" MSG="TEMP={temp}"
{% if printer["heater_generic chamber_heater"] is defined %}
RATOS_ECHO MSG="PID calibration chamber heater at {temp}°C..."
PID_CALIBRATE HEATER=chamber_heater TARGET={temp}
_CONSOLE_SAVE_CONFIG
_LEARN_MORE_CALIBRATION
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_heater" %}
{% set link_text = "RatOS Chamber Heater" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber heater found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro INITIALIZE_PA_TUNING]
description = Start a pressure advance tuning tower.
gcode =
{% set start = params.START|default(0.0)|float %}
{% set factor = params.FACTOR|default(0.001)|float %}
{% set layer_number = printer["gcode_macro _ON_LAYER_CHANGE"].layer_number|default(0)|int %}
{% set is_printing_gcode = true if printer["gcode_macro START_PRINT"].is_printing_gcode|default(true)|lower == 'true' else false %}
{% if is_printing_gcode and layer_number < 2 %}
DEBUG_ECHO PREFIX="START_PA_TOWER" MSG="START: {start}, FACTOR: {factor}"
RATOS_ECHO MSG="Starting presssure advance tuning tower..."
TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START={start} FACTOR={factor}
{% endif %}
_LEARN_MORE_CALIBRATION
[gcode_macro CHAMBER_FILTER_ON]
gcode =
{% if printer["fan_generic filter"] is defined %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Activating chamber filter..."
_CHAMBER_FILTER_TURN_ON
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber filter found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro CHAMBER_FILTER_OFF]
gcode =
{% if printer["fan_generic filter"] is defined %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Deactivating chamber filter..."
_CHAMBER_FILTER_TURN_OFF
{% else %}
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="No chamber filter found" TYPE="warning" MSG={line_1}
{% endif %}
[gcode_macro _CHAMBER_FILTER_ON]
gcode =
{% set at = params.AT|default('')|lower %}
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set chamber_filter_enable_at = printer["gcode_macro RatOS"].chamber_filter_enable_at|default('after_print_start')|lower %}
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_ON" MSG="at: {at}, chamber_filter_enable: {chamber_filter_enable}, chamber_filter_enable_at: {chamber_filter_enable_at}, chamber_filter_speed: {chamber_filter_speed}"
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if chamber_filter_enable_at == at %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Activating chamber filter..."
_CHAMBER_FILTER_TURN_ON AT={at}
{% if chamber_filter_enable_at == "print_end" %}
_LED_CHAMBER_FILTER_ON
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _CHAMBER_FILTER_OFF]
gcode =
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set filter_disable_period = printer["gcode_macro RatOS"].chamber_filter_disable_period|default(0)|int %}
{% set filter_disable_bed_temp = printer["gcode_macro RatOS"].chamber_filter_disable_bed_temp|default(0)|int %}
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_OFF" MSG="chamber_filter_enable: {chamber_filter_enable}, filter_disable_period: {filter_disable_period}, filter_disable_bed_temp: {filter_disable_bed_temp}"
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if filter_disable_period > 0 %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Waiting {filter_disable_period} seconds before turning chamber filter off..."
UPDATE_DELAYED_GCODE ID=_CHAMBER_FILTER_OFF_TIMER DURATION={filter_disable_period}
{% endif %}
{% if filter_disable_bed_temp > 0 %}
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Waiting for bed temp to cool down to {filter_disable_bed_temp}°C to turn filter off..."
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM=0 MAXIMUM={filter_disable_bed_temp}
_CHAMBER_FILTER_TURN_OFF
_LED_CHAMBER_FILTER_OFF
{% endif %}
{% endif %}
[delayed_gcode _CHAMBER_FILTER_OFF_TIMER]
gcode =
DEBUG_ECHO PREFIX="_CHAMBER_FILTER_OFF_TIMER" MSG="executed"
_CHAMBER_FILTER_TURN_OFF
RATOS_ECHO PREFIX="CHAMBER_FILTER" MSG="Chamber filter turned off!"
_LED_CHAMBER_FILTER_OFF
[gcode_macro _CHAMBER_FILTER_TURN_ON]
gcode =
{% set at = params.AT|default('')|lower %}
{% set chamber_filter_speed = printer["gcode_macro RatOS"].chamber_filter_speed|default(0)|float %}
{% if at == "print_end" %}
{% set chamber_filter_speed = printer["gcode_macro RatOS"].chamber_filter_disable_speed|default(0)|float %}
{% endif %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_FILTER_OFF_TIMER DURATION=0
SET_FAN_SPEED FAN=filter SPEED={chamber_filter_speed}
[gcode_macro _CHAMBER_FILTER_TURN_OFF]
gcode =
SET_FAN_SPEED FAN=filter SPEED=0
[gcode_macro _CHAMBER_FILTER_SANITY_CHECK]
gcode =
{% set chamber_filter_enable = true if printer["gcode_macro RatOS"].chamber_filter_enable|default(true)|lower == 'true' else false %}
{% set filter_disable_period = printer["gcode_macro RatOS"].chamber_filter_disable_period|default(0)|int %}
{% set filter_disable_bed_temp = printer["gcode_macro RatOS"].chamber_filter_disable_bed_temp|default(0)|int %}
{% if chamber_filter_enable and printer["fan_generic filter"] is defined %}
{% if filter_disable_bed_temp > 0 and filter_disable_period > 0 %}
_LEARN_MORE_CHAMBER_FILTER
{action_respond_info("Wrong chamber filter options configured! Set 'filter_disable_bed_temp' or 'filter_disable_period' variable, not both.")}
{% endif %}
{% if filter_disable_bed_temp == 0 and filter_disable_period == 0 %}
_LEARN_MORE_CHAMBER_FILTER
{action_respond_info("Wrong chamber filter options configured! Set 'filter_disable_bed_temp' or 'filter_disable_period' variable.")}
{% endif %}
{% endif %}
[gcode_macro CHAMBER_HEATER_ON]
gcode =
{% set chamber_temp = params.CHAMBER_TEMP|default(45)|int %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp} IS_FROM_START_PRINT=False
[gcode_macro CHAMBER_HEATER_OFF]
gcode =
_CHAMBER_HEATER_OFF
[gcode_macro _CHAMBER_HEATER_ON]
variable_chamber_temp = 0
gcode =
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set start_chamber_temp = params.START_CHAMBER_TEMP|default(0)|int %}
{% set is_from_start_print = true if params.IS_FROM_START_PRINT|default(True)|lower == 'true' else false %}
{% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set chamber_heater_enable = true if printer["gcode_macro RatOS"].chamber_heater_enable|default(true)|lower == 'true' else false %}
{% set chamber_heater_bed_temp = printer["gcode_macro RatOS"].chamber_heater_bed_temp|default(115)|int %}
{% set chamber_heater_preheating_temp = printer["gcode_macro RatOS"].chamber_heater_preheating_temp|default(150)|int %}
{% set chamber_heater_heating_temp_offset = printer["gcode_macro RatOS"].chamber_heater_heating_temp_offset|default(20)|int %}
{% set chamber_heater_control_external_heater = true if printer["gcode_macro RatOS"].chamber_heater_control_external_heater|default(true)|lower == 'true' else false %}
{% set chamber_heater_air_circulation_enable = true if printer["gcode_macro RatOS"].chamber_heater_air_circulation_enable|default(true)|lower == 'true' else false %}
{% set chamber_heater_air_circulation_fan_speed = printer["gcode_macro RatOS"].chamber_heater_air_circulation_fan_speed|default(0.35)|float %}
{% set chamber_heater_air_circulation_y_pos = printer["gcode_macro RatOS"].chamber_heater_air_circulation_y_pos|default(0)|float %}
{% set chamber_heater_air_circulation_z_pos = printer["gcode_macro RatOS"].chamber_heater_air_circulation_z_pos|default(100)|float %}
DEBUG_ECHO PREFIX="_CHAMBER_HEATER_ON" MSG="chamber_heater_enable: {chamber_heater_enable}, chamber_heater_preheating_temp: {chamber_heater_preheating_temp}, chamber_heater_heating_temp_offset: {chamber_heater_heating_temp_offset}, bed_temp: {bed_temp}, chamber_temp: {chamber_temp}, start_chamber_temp: {start_chamber_temp}"
{% if chamber_heater_enable and chamber_temp > 0 and chamber_heater_bed_temp > 0 %}
_LED_HEATING
RATOS_ECHO MSG="Preheating chamber to {(start_chamber_temp if start_chamber_temp > 0 else chamber_temp)}°C..."
{% set chamber_temp_sensor = "extruder" %}
{% if printer["dual_carriage"] is defined and default_toolhead == 1 %}
{% set chamber_temp_sensor = "extruder1" %}
{% endif %}
{% if printer["temperature_sensor chamber"] is defined %}
{% set chamber_temp_sensor = "temperature_sensor chamber" %}
{% endif %}
{% set current_chamber_temp = printer['%s' % chamber_temp_sensor].temperature|int %}
{% set needs_heating = current_chamber_temp < (start_chamber_temp if start_chamber_temp > 0 else chamber_temp) %}
{% if needs_heating %}
_USER_CHAMBER_HEATER_BEFORE_PREHEATING
{% endif %}
{% if needs_heating %}
{% if chamber_heater_air_circulation_enable and chamber_heater_air_circulation_fan_speed > 0 %}
{% if not is_from_start_print %}
MAYBE_HOME
{% endif %}
G0 Z{chamber_heater_air_circulation_z_pos} F{z_speed}
G0 Y{chamber_heater_air_circulation_y_pos} F{speed}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={chamber_heater_air_circulation_fan_speed if default_toolhead == 0 else 0}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={chamber_heater_air_circulation_fan_speed if default_toolhead == 1 else 0}
{% else %}
M106 S{(255 * chamber_heater_air_circulation_fan_speed)}
{% endif %}
{% else %}
{% if is_from_start_print %}
G0 Z{z} F{z_speed}
{% endif %}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=_CHAMBER_HEATER_ON VARIABLE=chamber_temp VALUE={chamber_temp}
{% if needs_heating %}
M140 S{chamber_heater_bed_temp}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={chamber_heater_preheating_temp}
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=1.0
{% endif %}
{% endif %}
{% if needs_heating %}
_CHAMBER_HEATER_EXTRA_FAN_ON
{% endif %}
{% if needs_heating %}
TEMPERATURE_WAIT SENSOR="{chamber_temp_sensor}" MINIMUM={(start_chamber_temp if start_chamber_temp > 0 else chamber_temp)}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={(chamber_temp + chamber_heater_heating_temp_offset)}
{% endif %}
{% endif %}
{% if printer["fan_generic filter"] is defined %}
{% if printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float > 0 %}
SET_FAN_SPEED FAN=filter SPEED=0
_CHAMBER_FILTER_ON AT="before_print_start"
{% endif %}
{% endif %}
{% if needs_heating %}
{% if chamber_heater_air_circulation_enable and chamber_heater_air_circulation_fan_speed > 0 %}
G28 Z
{% endif %}
{% endif %}
{% if needs_heating %}
_USER_CHAMBER_HEATER_AFTER_PREHEATING
{% endif %}
{% if printer["temperature_sensor chamber"] is defined %}
{% if printer["heater_generic chamber_heater"] is defined %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined and chamber_heater_control_external_heater %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED=0
SET_FAN_SPEED FAN=part_fan_t1 SPEED=0
{% else %}
M106 S0
{% endif %}
_LED_SUCCESS
{% endif %}
[gcode_macro _CHAMBER_HEATER_OFF]
gcode =
RATOS_ECHO MSG="Deactivating chamber heater..."
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=0
SET_GCODE_VARIABLE MACRO=_CHAMBER_HEATER_ON VARIABLE=chamber_temp VALUE=0
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=0
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=0.0
{% endif %}
_CHAMBER_HEATER_EXTRA_FAN_OFF
[delayed_gcode _CHAMBER_HEATER_CONTROL]
initial_duration = 0.
gcode =
{% set chamber_temp = printer["gcode_macro _CHAMBER_HEATER_ON"].chamber_temp|default(0)|int %}
{% set chamber_heater_heating_temp_offset = printer["gcode_macro RatOS"].chamber_heater_heating_temp_offset|default(20)|int %}
{% set current_chamber_temp = printer['temperature_sensor chamber'].temperature|int %}
{% if current_chamber_temp < chamber_temp %}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET={(chamber_temp + chamber_heater_heating_temp_offset)}
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=1.0
{% endif %}
{% endif %}
{% if current_chamber_temp >= chamber_temp %}
{% if printer["heater_generic chamber_heater"] is defined %}
SET_HEATER_TEMPERATURE HEATER=chamber_heater TARGET=0
{% endif %}
{% if printer["output_pin chamber_heater_pin"] is defined %}
SET_PIN PIN=chamber_heater_pin VALUE=0.0
{% endif %}
{% endif %}
UPDATE_DELAYED_GCODE ID=_CHAMBER_HEATER_CONTROL DURATION=5
[gcode_macro _CHAMBER_HEATER_EXTRA_FAN_ON]
gcode =
{% set chamber_heater_extra_fan_speed = printer["gcode_macro RatOS"].chamber_heater_extra_fan_speed|default(0.0)|float %}
{% if printer["fan_generic chamber_heater_extra_fan"] is defined %}
{% if chamber_heater_extra_fan_speed > 0 %}
SET_FAN_SPEED FAN=chamber_heater_extra_fan SPEED={chamber_heater_extra_fan_speed}
{% endif %}
{% endif %}
[gcode_macro _CHAMBER_HEATER_EXTRA_FAN_OFF]
gcode =
{% if printer["fan_generic chamber_heater_extra_fan"] is defined %}
SET_FAN_SPEED FAN=chamber_heater_extra_fan SPEED=0
{% endif %}
[gcode_macro _USER_CHAMBER_HEATER_BEFORE_PREHEATING]
description = Will be executed before chamber preheating, only if heating is needed.
gcode =
[gcode_macro _USER_CHAMBER_HEATER_AFTER_PREHEATING]
description = Will be executed after chamber preheating, only if heating was needed.
gcode =
[gcode_macro _LED_START_PRINTING]
gcode =
_LED_ACTION
[gcode_macro _LED_START_PRINTING_ERROR]
gcode =
_LED_ERROR
[gcode_macro _LED_PRINTING]
gcode =
_LED_ON TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_PAUSE]
gcode =
_LED_ACTION
[gcode_macro _LED_CHAMBER_FILTER_ON]
gcode =
_LED_ACTION
[gcode_macro _LED_CHAMBER_FILTER_OFF]
gcode =
_LED_STANDBY
[gcode_macro _LED_LOADING_FILAMENT]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_LOADED]
gcode =
_LED_SUCCESS TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_RUNOUT]
gcode =
_LED_ERROR TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_CLOG]
gcode =
_LED_ERROR TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_UNLOADING_FILAMENT]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_FILAMENT_UNLOADED]
gcode =
_LED_SUCCESS TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_DEACTIVATE_TOOLHEAD]
gcode =
_LED_OFF TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_TOOLHEAD_STANDBY]
gcode =
_LED_STANDBY TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_TOOLHEAD_WAKEUP]
gcode =
_LED_ACTION TOOLHEAD={params.TOOLHEAD|default(-1)|int}
[gcode_macro _LED_MOTORS_OFF]
gcode =
_LED_STANDBY
_LED_VAOC_OFF
[gcode_macro _LED_INPUT_SHAPER_START]
gcode =
_LED_ACTION
[gcode_macro _LED_INPUT_SHAPER_END]
gcode =
_LED_ON
[gcode_macro _LED_BEACON_CALIBRATION_START]
gcode =
_LED_ACTION
[gcode_macro _LED_BEACON_CALIBRATION_END]
gcode =
_LED_ON
[gcode_macro _LED_BEACON_CALIBRATION_ERROR]
gcode =
_LED_ERROR
[gcode_macro _LED_VAOC_ON]
gcode =
{% if printer['neopixel vaoc_led'] is defined %}
SET_LED LED=vaoc_led RED=1.0 GREEN=1.0 BLUE=1.0
{% endif %}
[gcode_macro _LED_VAOC_OFF]
gcode =
{% if printer['neopixel vaoc_led'] is defined %}
SET_LED LED=vaoc_led RED=0.0 GREEN=0.0 BLUE=0.0
{% endif %}
[gcode_macro _LED_ACTION]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_action %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_SUCCESS]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_success %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_HEATING]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_heating %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_COOLING]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_cooling %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_ERROR]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_error %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_ON]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_on %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_OFF]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_off %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_STANDBY]
gcode =
{% set rgb = printer["gcode_macro RatOS"].led_status_standby %}
_LED_SET TOOLHEAD={params.TOOLHEAD|default(-1)|int} R={rgb[0]} G={rgb[1]} B={rgb[2]}
[gcode_macro _LED_SET]
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set r = params.R|default(0)|float %}
{% set g = params.G|default(0)|float %}
{% set b = params.B|default(0)|float %}
{% if toolhead >= 0 %}
{% if printer['neopixel nozzle_led_t%s' % toolhead] is defined %}
SET_LED LED={'nozzle_led_t%s' % toolhead} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% else %}
{% if printer['neopixel nozzle_led_t0'] is defined %}
SET_LED LED={'nozzle_led_t0'} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% if printer['neopixel nozzle_led_t1'] is defined %}
SET_LED LED={'nozzle_led_t1'} RED={r} GREEN={g} BLUE={b} SYNC=0
{% endif %}
{% endif %}
_USER_LED_SET { rawparams }
[gcode_macro _USER_LED_SET]
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set r = params.R|default(0)|float %}
{% set g = params.G|default(0)|float %}
{% set b = params.B|default(0)|float %}
[gcode_macro LOAD_FILAMENT]
description = Loads new filament. Note: be careful with PETG, make sure you inspect the tip of your filament before loading to avoid jams.
variable_ignore_min_extrude_temp = True
gcode =
_LEARN_MORE_FILAMENT
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set filament_name = params._NAME|default('')|string %}
{% set filament_type = params._TYPE|default('')|string %}
{% if filament_name == '' or filament_type == '' %}
{% set filament_name = 'unknown' %}
{% set filament_type = 'unknown' %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
_DEFAULT_LOAD_FILAMENT TEMP={temp} NAME={filament_name} TYPE={filament_type}
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Loading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead==0 or toolhead==1 %}
_IDEX_LOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead} NAME={filament_name} TYPE={filament_type}
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
[gcode_macro _DEFAULT_LOAD_FILAMENT]
description = Load filament macro for non IDEX printers.
gcode =
{% set temp = params.TEMP|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_DEFAULT_LOAD_FILAMENT" MSG="TEMP={temp}"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
_LED_LOADING_FILAMENT TOOLHEAD=0
SAVE_GCODE_STATE NAME=load_state
{% if printer.extruder.temperature|int < temp or printer.extruder.can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating extruder to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={temp}
_LOAD_FILAMENT TOOLHEAD=0
RESTORE_GCODE_STATE NAME=load_state
{% if filament_name != '' and filament_type != '' %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('{filament_type}', '{filament_name}', {temp})"
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={temp}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
_LED_FILAMENT_LOADED TOOLHEAD=0
[gcode_macro _IDEX_LOAD_FILAMENT]
description = Load filament macro for IDEX printer.
gcode =
{% set temp = params.TEMP|int %}
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_IDEX_LOAD_FILAMENT" MSG="TEMP: {temp}, TOOLHEAD: {toolhead}"
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_LOADING_FILAMENT TOOLHEAD={toolhead}
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
{% if not printer.pause_resume.is_paused %}
{% if printer[target_extruder].temperature|int < temp or printer[target_extruder].can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating T{toolhead} to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={temp}
{% endif %}
_LOAD_FILAMENT TOOLHEAD={toolhead} TEMP={temp}
{% if filament_name != '' and filament_type != '' %}
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('{filament_type}', '{filament_name}', {temp})"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='"{filament_name}"'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='"{filament_type}"'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE={temp}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_ok}"'
_LED_FILAMENT_LOADED TOOLHEAD={toolhead}
[gcode_macro _LOAD_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT" MSG="TOOLHEAD: {toolhead}"
_MOVE_TO_LOADING_POSITION TOOLHEAD={toolhead}
_LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE TOOLHEAD={toolhead}
_LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE TOOLHEAD={toolhead}
_CLEANING_MOVE TOOLHEAD={toolhead}
[gcode_macro _LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set extruder_load_speed = printer["gcode_macro T%s" % toolhead].extruder_load_speed|float * 60 %}
{% set extruder_gear_to_cooling_position_distance = printer["gcode_macro T%s" % toolhead].extruder_gear_to_cooling_position_distance|float %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT_FROM_EXTRUDER_TO_COOLING_ZONE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Loading filament into hotend.."
G92 E0
G0 E{extruder_gear_to_cooling_position_distance} F{extruder_load_speed}
G92 E0
M400
RATOS_ECHO MSG="Filament loaded into hotend."
[gcode_macro _LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set load_speed = printer["gcode_macro T%s" % toolhead].filament_load_speed|float * 60 %}
{% set filament_loading_nozzle_offset = printer["gcode_macro T%s" % toolhead].filament_loading_nozzle_offset|float %}
{% set cooling_position_to_nozzle_distance = printer["gcode_macro T%s" % toolhead].cooling_position_to_nozzle_distance|float %}
{% set purge_after_load = printer["gcode_macro T%s" % toolhead].purge_after_load|float %}
DEBUG_ECHO PREFIX="_LOAD_FILAMENT_FROM_COOLING_ZONE_TO_NOZZLE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Loading filament into nozzle... Please wait!"
G92 E0
G0 E{cooling_position_to_nozzle_distance + filament_loading_nozzle_offset} F{load_speed}
G92 E0
G4 P1000
_PURGE_FILAMENT TOOLHEAD={toolhead} E={purge_after_load}
RATOS_ECHO MSG="Filament loaded into nozzle!"
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_INSERT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_INSERT" MSG="TOOLHEAD: {toolhead}"
{% set filament_grabbing_length = printer["gcode_macro T%s" % toolhead].filament_grabbing_length|float %}
{% set filament_grabbing_speed = printer["gcode_macro T%s" % toolhead].filament_grabbing_speed|float %}
{% set resume_after_insert = true if printer["gcode_macro T%s" % toolhead].resume_after_insert|default(true)|lower == 'true' else false %}
{% set enable_insert_detection = true if printer["gcode_macro T%s" % toolhead].enable_insert_detection|default(true)|lower == 'true' else false %}
{% set current_idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% if enable_insert_detection %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_INSERT" MSG="toolhead: {toolhead}, filament_grabbing_length: {filament_grabbing_length}, filament_grabbing_speed: {filament_grabbing_speed}, current_idex_mode: {current_idex_mode}"
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Loading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
FORCE_MOVE STEPPER={'extruder%s' % ('' if toolhead == 0 else toolhead)} DISTANCE={filament_grabbing_length} VELOCITY={filament_grabbing_speed}
M400
{% if printer.pause_resume.is_paused %}
LOAD_FILAMENT TOOLHEAD={toolhead}
{% if resume_after_insert %}
RESUME
{% endif %}
{% else %}
{% if not printer.virtual_sdcard.is_active %}
LOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_INSERT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_INSERT" MSG="TOOLHEAD: {toolhead}"
[gcode_macro _PURGE_BEFORE_UNLOAD]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set purge_before_unload = printer["gcode_macro T%s" % toolhead].purge_before_unload|float %}
DEBUG_ECHO PREFIX="_PURGE_BEFORE_UNLOAD" MSG="TOOLHEAD: {toolhead}"
{% if purge_before_unload > 0 %}
G92 E0
G0 E{purge_before_unload} F300
G92 E0
M400
{% endif %}
[gcode_macro _PURGE_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set e = params.E|int %}
{% set r = params.R|default(0)|int %}
DEBUG_ECHO PREFIX="_PURGE_FILAMENT" MSG="TOOLHEAD: {toolhead}, E: {e}"
{% if e > 0 %}
G92 E0
G0 E{e} F300
G92 E0
M400
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={0.4 if toolhead == 0 else 0}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={0.4 if toolhead == 1 else 0}
{% else %}
M106 S{(255 * 0.4)}
{% endif %}
{% endif %}
G4 P3000
{% if r > 0 %}
G92 E0
G0 E-{r} F300
G92 E0
M400
{% endif %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["dual_carriage"] is defined %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED=0
SET_FAN_SPEED FAN=part_fan_t1 SPEED=0
{% else %}
M106 S0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _MOVE_TO_PARKING_POSITION]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_MOVE_TO_PARKING_POSITION" MSG="TOOLHEAD: {toolhead}"
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].parking_position is defined %}
{% set parking_position = printer["gcode_macro T%s" % toolhead].parking_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
G1 X{parking_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _MOVE_TO_LOADING_POSITION]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_MOVE_TO_LOADING_POSITION" MSG="TOOLHEAD: {toolhead}"
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].loading_position is defined %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% set act_t = 1 if idex_mode == 'primary' else 0 %}
{% if act_t == toolhead %}
{% set loading_position = printer["gcode_macro T%s" % toolhead].loading_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
G1 X{loading_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _CLEANING_MOVE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% if printer["dual_carriage"] is defined or printer["rmmu_hub"] is defined %}
{% if "xyz" in printer.toolhead.homed_axes %}
{% if printer["gcode_macro T%s" % toolhead].has_oozeguard|default(false)|lower == 'true' %}
{% if printer["gcode_macro T%s" % toolhead].parking_position is defined and printer["gcode_macro T%s" % toolhead].loading_position is defined %}
{% set loading_position = printer["gcode_macro T%s" % toolhead].loading_position|float %}
{% set parking_position = printer["gcode_macro T%s" % toolhead].parking_position|float %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
{% set cleaning_position = loading_position %}
{% if loading_position == parking_position %}
{% if loading_position > 0 %}
{% set cleaning_position = loading_position - 30 %}
{% else %}
{% set cleaning_position = loading_position + 30 %}
{% endif %}
{% endif %}
G1 X{parking_position} F{speed}
G1 X{cleaning_position} F{speed}
G1 X{parking_position} F{speed}
G1 X{cleaning_position} F{speed}
G1 X{parking_position} F{speed}
M400
{% endif %}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro _START_PRINT_BED_MESH]
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="start_print_bed_mesh"
SET_MACRO_TRAVEL_SETTINGS
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set X=[params.X0|default(-1)|float, params.X1|default(-1)|float] %}
{% set Y=[params.Y0|default(-1)|float, params.Y1|default(-1)|float] %}
DEBUG_ECHO PREFIX="_START_PRINT_BED_MESH" MSG="idex_mode: {idex_mode}, X: {X}, Y: {Y}"
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set X=[0, printable_x_max] %}
{% endif %}
{% set beacon_bed_mesh_scv = printer["gcode_macro RatOS"].beacon_bed_mesh_scv|default(25)|int %}
{% set beacon_contact_bed_mesh_samples = printer["gcode_macro RatOS"].beacon_contact_bed_mesh_samples|default(2)|int %}
{% set beacon_contact_bed_mesh = true if printer["gcode_macro RatOS"].beacon_contact_bed_mesh|default(false)|lower == 'true' else false %}
{% if printer.configfile.settings.beacon is defined and not beacon_contact_bed_mesh %}
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={beacon_bed_mesh_scv}
{% endif %}
{% set default_profile = printer["gcode_macro RatOS"].bed_mesh_profile|default('ratos') %}
{% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %}
BED_MESH_CLEAR
{% if printer["gcode_macro RatOS"].adaptive_mesh|lower == 'true' %}
CALIBRATE_ADAPTIVE_MESH PROFILE={default_profile} X0={X[0]} X1={X[1]} Y0={Y[0]} Y1={Y[1]} T={params.T|int} BOTH_TOOLHEADS={params.BOTH_TOOLHEADS} IDEX_MODE={idex_mode}
{% else %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% endif %}
BED_MESH_PROFILE LOAD={default_profile}
{% elif printer["gcode_macro RatOS"].bed_mesh_profile is defined %}
BED_MESH_CLEAR
BED_MESH_PROFILE LOAD={printer["gcode_macro RatOS"].bed_mesh_profile}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print_bed_mesh"
[gcode_macro CALIBRATE_ADAPTIVE_MESH]
gcode =
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_bed_mesh_samples = printer["gcode_macro RatOS"].beacon_contact_bed_mesh_samples|default(2)|int %}
{% set beacon_contact_bed_mesh = true if printer["gcode_macro RatOS"].beacon_contact_bed_mesh|default(false)|lower == 'true' else false %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set default_profile = params.PROFILE %}
{% set x0 = params.X0|default(-1)|float %}
{% set y0 = params.Y0|default(-1)|float %}
{% set x1 = params.X1|default(-1)|float %}
{% set y1 = params.Y1|default(-1)|float %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Recieved coordinates X0={x0} Y0={y0} X1={x1} Y1={y1}"
{% if x0 >= x1 or y0 >= y1 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Invalid coordinates received. Please check your slicer settings. Falling back to full bed mesh."
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% else %}
{% set mesh_config = printer.configfile.config.bed_mesh %}
{% set min_x = mesh_config.mesh_min.split(",")[0]|float %}
{% set min_y = mesh_config.mesh_min.split(",")[1]|float %}
{% set max_x = mesh_config.mesh_max.split(",")[0]|float %}
{% set max_y = mesh_config.mesh_max.split(",")[1]|float %}
{% set mesh_x0 = [[x0, max_x]|min, min_x]|max %}
{% set mesh_y0 = [[y0, max_y]|min, min_y]|max %}
{% set mesh_x1 = [[x1, max_x]|min, min_x]|max %}
{% set mesh_y1 = [[y1, max_y]|min, min_y]|max %}
{% if mesh_x0 == min_x and mesh_y0 == min_y and mesh_x1 == max_x and mesh_y1 == max_y %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Print is using the full bed, falling back to full bed mesh."
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile}
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% else %}
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
DEPLOY_PROBE
{% endif %}
{% set probe_count_x = mesh_config.probe_count.split(",")[0]|int %}
{% if mesh_config.probe_count.split(",")|length == 2 %}
{% set probe_count_y = mesh_config.probe_count.split(",")[1]|int %}
{% else %}
{% set probe_count_y = mesh_config.probe_count.split(",")[0]|int %}
{% endif %}
{% set probe_x_step = (max_x - min_x) / probe_count_x %}
{% set probe_y_step = (max_y - min_y) / probe_count_y %}
{% set mesh_count_x = ([(mesh_x1 - mesh_x0) / probe_x_step, 3]|max)|int %}
{% set mesh_count_y = ([(mesh_y1 - mesh_y0) / probe_y_step, 3]|max)|int %}
{% set min_mesh_count = [mesh_count_x, mesh_count_y]|min %}
{% set max_mesh_count = [mesh_count_x, mesh_count_y]|max %}
{% set algorithm = mesh_config.algorithm %}
{% if algorithm|lower == 'lagrange' and max_mesh_count > 6 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="cannot exceed a probe_count of 6 when using lagrange interpolation. Falling back to bicubic interpolation."
{% set algorithm = 'bicubic' %}
{% endif %}
{% if algorithm|lower == 'bicubic' and min_mesh_count < 4 %}
{% if max_mesh_count > 6 %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="invalid probe_count option when using bicubic interpolation. Combination of 3 points on one axis with more than 6 on another is not permitted. Forcing minimum mesh count to be 4."
{% set min_mesh_count = 4 %}
{% else %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="bicubic interpolation with a probe_count of less than 4 points detected. Forcing lagrange interpolation."
{% set algorithm = 'lagrange' %}
{% endif %}
{% endif %}
{% set mesh_count_x = ([min_mesh_count, mesh_count_x]|max)|int %}
{% set mesh_count_x = ([max_mesh_count, mesh_count_x]|min)|int %}
{% set mesh_count_y = ([min_mesh_count, mesh_count_y]|max)|int %}
{% set mesh_count_y = ([max_mesh_count, mesh_count_y]|min)|int %}
{% set should_prime = printer["gcode_macro RatOS"].nozzle_priming == 'primeblob' %}
{% if printer["dual_carriage"] is not defined %}
{% set probe_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printable_y_max) < printable_y_max / 2 %}
{% else %}
{% set probe_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printable_y_max) < printable_y_max / 2 %}
{% endif %}
{% if printer.configfile.settings.beacon is defined and printer.configfile.settings.beacon.mesh_runs % 2 != 0 and probe_first %}
{% set probe_first = false %}
{% elif printer.configfile.settings.beacon is defined and printer.configfile.settings.beacon.mesh_runs % 2 == 0 and not probe_first %}
{% set probe_first = true %}
{% endif %}
{% if should_prime and probe_first %}
{% if printer["dual_carriage"] is not defined %}
PROBE_FOR_PRIMING
{% else %}
{% if both_toolheads %}
PROBE_FOR_PRIMING TOOLHEAD=0 IDEX_MODE={idex_mode}
PROBE_FOR_PRIMING TOOLHEAD=1 IDEX_MODE={idex_mode}
{% else %}
PROBE_FOR_PRIMING TOOLHEAD={params.T|int} IDEX_MODE={idex_mode}
{% endif %}
{% endif %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="mesh coordinates X0={mesh_x0} Y0={mesh_y0} X1={mesh_x1} Y1={mesh_y1}"
{% if printer.configfile.settings.beacon is defined and beacon_contact_bed_mesh %}
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES={beacon_contact_bed_mesh_samples} PROFILE={default_profile} ALGORITHM={algorithm} MESH_MIN={mesh_x0},{mesh_y0} MESH_MAX={mesh_x1},{mesh_y1} PROBE_COUNT={mesh_count_x},{mesh_count_y} RELATIVE_REFERENCE_INDEX=-1
{% else %}
BED_MESH_CALIBRATE PROFILE={default_profile} ALGORITHM={algorithm} MESH_MIN={mesh_x0},{mesh_y0} MESH_MAX={mesh_x1},{mesh_y1} PROBE_COUNT={mesh_count_x},{mesh_count_y} RELATIVE_REFERENCE_INDEX=-1
{% if printer.configfile.settings.beacon is defined %}
_BEACON_APPLY_SCAN_COMPENSATION
{% endif %}
{% endif %}
{% if should_prime and not probe_first %}
{% if printer["dual_carriage"] is not defined %}
PROBE_FOR_PRIMING
{% else %}
{% if both_toolheads %}
PROBE_FOR_PRIMING TOOLHEAD=0 IDEX_MODE={idex_mode}
PROBE_FOR_PRIMING TOOLHEAD=1 IDEX_MODE={idex_mode}
{% else %}
PROBE_FOR_PRIMING TOOLHEAD={params.T|int} IDEX_MODE={idex_mode}
{% endif %}
{% endif %}
{% endif %}
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
STOW_PROBE
{% endif %}
{% endif %}
{% endif %}
[gcode_macro M84]
rename_existing = M84.1
gcode =
M84.1
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
{% if printer["dual_carriage"] is defined %}
_SET_TOOLHEAD_OFFSET T={printer["gcode_macro RatOS"].default_toolhead|int} MOVE=0
SET_GCODE_VARIABLE MACRO=SET_PRESSURE_ADVANCE VARIABLE=snyc_toolheads VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_REMAP_TOOLHEADS VARIABLE=enabled VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% if printer["gcode_macro _VAOC"] is defined %}
SET_GCODE_VARIABLE MACRO=_VAOC VARIABLE=is_started VALUE=False
SET_GCODE_VARIABLE MACRO=_VAOC VARIABLE=is_started_at_temp VALUE=False
{% endif %}
SET_GCODE_OFFSET X=0 Y=0 Z=0 MOVE=0
_IDEX_SINGLE INIT=1
{% endif %}
SET_SKEW CLEAR=1
_LED_MOTORS_OFF
[gcode_macro M104]
rename_existing = M104.1
gcode =
{% set s = params.S|default(0)|int %}
{% set t = params.T|default(-1)|int %}
{% set t = 0 if t == -1 else t %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
DEBUG_ECHO PREFIX="M104" MSG="s: {s}, t: {t}"
{% if printer["gcode_macro T%s" % t] is defined %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set temperature_offset_t0 = printer["gcode_macro T0"].temperature_offset|default(0)|int %}
{% set temperature_offset_t1 = printer["gcode_macro T1"].temperature_offset|default(0)|int %}
{% set s0 = [s + temperature_offset_t0, 0]|max %}
{% set s1 = [s + temperature_offset_t1, 0]|max %}
{% if temperature_offset_t0 != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset_t0}°C added to toolhead T0."
{% endif %}
{% if temperature_offset_t1 != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset_t1}°C added to toolhead T1."
{% endif %}
{% else %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set s = [s + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="M104" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
{% set is_in_standby = false %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% if toolchange_standby_temp > -1 %}
{% set is_in_standby = true if printer["gcode_macro T%s" % t].standby|default(false)|lower == 'true' else false %}
{% endif %}
{% endif %}
{% if not is_in_standby %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
M104.1 S{s0} T0
M104.1 S{s1} T1
{% else %}
M104.1 S{s} T{t}
{% endif %}
{% endif %}
[gcode_macro M109]
rename_existing = M109.1
gcode =
{% set s = params.S|default(0)|int %}
{% set t = params.T|default(-1)|int %}
{% set t = 0 if t == -1 else t %}
DEBUG_ECHO PREFIX="M109" MSG="s: {s}, t: {t}"
{% if printer["gcode_macro T%s" % t] is defined %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set s = [s + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="M109" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% set is_in_standby = false %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% if toolchange_standby_temp > -1 %}
{% set is_in_standby = true if printer["gcode_macro T%s" % t].standby|default(false)|lower == 'true' else false %}
{% endif %}
{% endif %}
{% if not is_in_standby %}
M109.1 S{s} T{t}
{% endif %}
[gcode_macro SET_HEATER_TEMPERATURE]
rename_existing = SET_HEATER_TEMPERATURE_BASE
gcode =
{% set heater = params.HEATER|default("") %}
{% set target = params.TARGET|default(0)|int %}
DEBUG_ECHO PREFIX="SET_HEATER_TEMPERATURE" MSG="heater: {heater}, target: {target}"
{% if heater|lower == "extruder" or heater|lower == "extruder1" %}
{% set t = 0 if heater|lower == "extruder" else 1 %}
{% if printer["gcode_macro T%s" % t] is defined and target > 0 %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% set target = [target + temperature_offset, 0]|max %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="SET_HEATER_TEMPERATURE" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
SET_HEATER_TEMPERATURE_BASE HEATER="{heater}" TARGET={target}
[gcode_macro TEMPERATURE_WAIT]
rename_existing = TEMPERATURE_WAIT_BASE
gcode =
{% set sensor = params.SENSOR|default("") %}
{% set minimum = params.MINIMUM|default(-1)|int %}
{% set maximum = params.MAXIMUM|default(-1)|int %}
DEBUG_ECHO PREFIX="TEMPERATURE_WAIT" MSG="sensor: {sensor}, minimum: {minimum}, maximum: {maximum}"
{% if sensor|lower == "extruder" or sensor|lower == "extruder1" %}
{% set t = 0 if sensor|lower == "extruder" else 1 %}
{% if printer["gcode_macro T%s" % t] is defined and (minimum > 0 or maximum > 0) %}
{% set temperature_offset = printer["gcode_macro T%s" % t].temperature_offset|default(0)|int %}
{% if minimum > -1 %}
{% set minimum = [minimum + temperature_offset, 0]|max %}
{% endif %}
{% if maximum > -1 %}
{% set maximum = [maximum + temperature_offset, 0]|max %}
{% endif %}
{% if temperature_offset != 0 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Temperature offset of {temperature_offset}°C added to toolhead T{t}."
{% endif %}
{% endif %}
{% endif %}
{% if minimum > -1 and maximum > -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MINIMUM: {minimum}, MAXIMUM: {maximum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MINIMUM={minimum} MAXIMUM={maximum}
{% elif minimum > -1 and maximum == -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MINIMUM: {minimum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MINIMUM={minimum}
{% elif minimum == -1 and maximum > -1 %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Waiting for sensor: {sensor}, MAXIMUM: {maximum}"
RATOS_ECHO MSG="please wait..."
TEMPERATURE_WAIT_BASE SENSOR="{sensor}" MAXIMUM={maximum}
{% endif %}
RATOS_ECHO PREFIX="TEMPERATURE_WAIT" MSG="Temperature for toolhead T{t} reached."
[gcode_macro SET_GCODE_OFFSET]
rename_existing = SET_GCODE_OFFSET_ORG
gcode =
SET_GCODE_OFFSET_ORG { rawparams }
{% if printer.configfile.settings.beacon is defined and (params.Z_ADJUST is defined or params.Z is defined) %}
_BEACON_APPLY_RUNTIME_MULTIPLIER
{% endif %}
[gcode_macro SDCARD_PRINT_FILE]
rename_existing = SDCARD_PRINT_FILE_BASE
gcode =
{% if printer["ratos"] is defined %}
PROCESS_GCODE_FILE { rawparams }
{% else %}
SDCARD_PRINT_FILE_BASE { rawparams }
{% endif %}
[gcode_macro SKEW_PROFILE]
rename_existing = SKEW_PROFILE_BASE
variable_loaded_profile = ""
gcode =
{% if params.LOAD is defined %}
{% if printer.configfile.settings["skew_correction %s" % params.LOAD] is defined %}
SET_GCODE_VARIABLE MACRO=SKEW_PROFILE VARIABLE=loaded_profile VALUE='"{params.LOAD}"'
{% endif %}
{% endif %}
SKEW_PROFILE_BASE { rawparams }
[gcode_macro SET_SKEW]
rename_existing = SET_SKEW_BASE
gcode =
{% if params.CLEAR is defined %}
{% if params.CLEAR|default(0)|int == 1 %}
SET_GCODE_VARIABLE MACRO=SKEW_PROFILE VARIABLE=loaded_profile VALUE='""'
{% endif %}
{% endif %}
SET_SKEW_BASE { rawparams }
[gcode_macro SET_VELOCITY_LIMIT]
rename_existing = SET_VELOCITY_LIMIT_BASE
gcode =
{% if params.ACCEL_TO_DECEL is defined %}
{% if params.ACCEL is defined %}
{% set accel = params.ACCEL|float %}
{% else %}
{% set accel = printer.toolhead.max_accel|float %}
{% endif %}
{% if params.VELOCITY is defined %}
{% set velocity = params.VELOCITY|float %}
{% else %}
{% set velocity = printer.toolhead.max_velocity|float %}
{% endif %}
{% if params.SQUARE_CORNER_VELOCITY is defined %}
{% set scv = params.SQUARE_CORNER_VELOCITY|float %}
{% else %}
{% set scv = printer.toolhead.square_corner_velocity|float %}
{% endif %}
{% set mcr = params.ACCEL_TO_DECEL|float / accel %}
DEBUG_ECHO PREFIX="SET_VELOCITY_LIMIT" MSG="ACCEL={accel}, VELOCITY={velocity}, SQUARE_CORNER_VELOCITY={scv}, MINIMUM_CRUISE_RATIO={mcr}"
SET_VELOCITY_LIMIT_BASE ACCEL={accel} VELOCITY={velocity} SQUARE_CORNER_VELOCITY={scv} MINIMUM_CRUISE_RATIO={1-mcr}
{% else %}
SET_VELOCITY_LIMIT_BASE { rawparams }
{% endif %}
[gcode_macro _START_PRINT_PARK]
gcode =
{% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set start_print_park_in = printer["gcode_macro RatOS"].start_print_park_in %}
{% set start_print_park_x = printer["gcode_macro RatOS"].start_print_park_x %}
{% if start_print_park_in == 'primeblob' %}
{% set z = 3 %}
{% endif %}
{% if printer["dual_carriage"] is defined and not (printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
{% if printer["gcode_macro RatOS"].start_print_park_x is defined and printer["gcode_macro RatOS"].start_print_park_x != '' %}
RATOS_ECHO PREFIX="WARNING" MSG="start_print_park_x is ignored for IDEX printers"
{% endif %}
PARK_TOOLHEAD
G90
{% endif %}
_PARK LOCATION={start_print_park_in} X={start_print_park_x}
G0 Z{z} F{z_speed}
[gcode_macro _END_PRINT_PARK]
gcode =
{% if printer["dual_carriage"] is defined %}
{% if printer["gcode_macro RatOS"].end_print_park_x is defined and printer["gcode_macro RatOS"].end_print_park_x != '' %}
RATOS_ECHO PREFIX="WARNING" MSG="end_print_park_x is ignored for IDEX printers"
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
_IDEX_SINGLE X={parking_position}
PARK_TOOLHEAD
G90
{% endif %}
_PARK LOCATION={printer["gcode_macro RatOS"].end_print_park_in} X={printer["gcode_macro RatOS"].end_print_park_x}
[gcode_macro _PARK]
gcode =
{% set x = params.X %}
{% set location = params.LOCATION|default('back')|lower %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% set nozzle_priming = printer["gcode_macro RatOS"].nozzle_priming|lower %}
CACHE_TOOLHEAD_SETTINGS KEY="park"
SET_MACRO_TRAVEL_SETTINGS
{% if x != '' %}
{% if x|float >= printer.toolhead.axis_minimum.x + 5 and x|float <= printable_x_max - 5 %}
{% set park_x = x|float %}
{% else %}
{action_respond_info('The requested X co-ordinate is outside the defined axis bounds - using defaults')}
{% set park_x = printable_x_max / 2 %}
{% endif %}
{% else %}
{% set park_x = printable_x_max / 2 %}
{% endif %}
{% if location == 'back' %}
{% set park_y = printable_y_max - 15 %}
{% elif location == 'front' %}
{% set park_y = printer.toolhead.axis_minimum.y + 5 %}
{% elif location == 'center' %}
{% set park_y = printable_y_max / 2 %}
{% elif location == 'primeblob' and printer["dual_carriage"] is defined %}
{% set park_y = printable_y_max - 15 %}
{% endif %}
{% if location == 'primeblob' and printer["dual_carriage"] is not defined %}
{% if (nozzle_priming == 'primeblob' or nozzle_priming == 'primeline') %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set park_x = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set park_x = printable_x_max - 5 %}
{% else %}
{% set park_x = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set park_y = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set park_y = printable_y_max - 5 %}
{% else %}
{% set park_y = nozzle_prime_start_y|float %}
{% endif %}
{% endif %}
{% endif %}
G90
{% if printer["dual_carriage"] is not defined %}
G0 X{park_x} Y{park_y} F{speed}
{% else %}
G0 Y{park_y} F{speed}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="park"
[gcode_macro SAVE_PROBE_RESULT]
gcode =
{% set beacon_contact_prime_probing = true if printer["gcode_macro RatOS"].beacon_contact_prime_probing|default(false)|lower == 'true' else false %}
{% set last_z_offset = 9999.9 %}
{% if printer.configfile.settings.beacon is defined %}
{% set current_z = printer.toolhead.position.z|float %}
{% if beacon_contact_prime_probing %}
{% set last_z_offset = printer.beacon.last_z_result %}
{% else %}
{% set last_z_offset = printer.beacon.last_sample.dist - current_z %}
{% endif %}
{% elif printer.configfile.settings.bltouch is defined %}
{% set config_offset = printer.configfile.settings.bltouch.z_offset|float %}
{% set last_z_offset = printer.probe.last_z_result - config_offset %}
{% elif printer.configfile.settings.probe is defined %}
{% set config_offset = printer.configfile.settings.probe.z_offset|float %}
{% set last_z_offset = printer.probe.last_z_result - config_offset %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Saving offset adjustment of {last_z_offset} in {params.VARIABLE|default('last_z_offset')}"
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE={params.VARIABLE|default('last_z_offset')} VALUE={last_z_offset}
[gcode_macro PROBE_FOR_PRIMING]
gcode =
{% set probe_for_priming_disable_mesh_constraints = true if printer["gcode_macro RatOS"].probe_for_priming_disable_mesh_constraints|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].nozzle_priming|lower != 'false' %}
SAVE_GCODE_STATE NAME=probe_for_priming_state
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the prime location.."
CACHE_TOOLHEAD_SETTINGS KEY="probe_for_priming"
SET_MACRO_TRAVEL_SETTINGS
{% set t = params.TOOLHEAD|default(-1)|int %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% if idex_mode == '' %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set x_start = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set x_start = printable_x_max - 5 %}
{% else %}
{% set x_start = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% else %}
{% set y_start = nozzle_prime_start_y|float %}
{% endif %}
{% else %}
{% set center_x = printable_x_max / 2 %}
{% if t == 0 %}
{% set x_start = 5 %}
{% else %}
{% set x_start = printable_x_max - 5 %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% endif %}
{% endif %}
{% set z = printer.configfile.settings.bed_mesh.horizontal_move_z|float %}
{% set mesh_config = printer.configfile.config.bed_mesh %}
{% if printer.configfile.settings.bltouch is defined %}
{% set x_offset = printer.configfile.settings.bltouch.x_offset|float %}
{% set y_offset = printer.configfile.settings.bltouch.y_offset|float %}
{% set z_offset = printer.configfile.settings.bltouch.z_offset|float %}
{% elif printer.configfile.settings.probe is defined %}
{% set x_offset = printer.configfile.settings.probe.x_offset|float %}
{% set y_offset = printer.configfile.settings.probe.y_offset|float %}
{% set z_offset = printer.configfile.settings.probe.z_offset|float %}
{% elif printer.configfile.settings.beacon is defined %}
{% set x_offset = printer.configfile.settings.beacon.x_offset|float %}
{% set y_offset = printer.configfile.settings.beacon.y_offset|float %}
{% set z_offset = printer.configfile.settings.beacon.trigger_distance|float %}
{% else %}
{ action_raise_error("No probe, beacon or bltouch section found. Adaptive priming only works with a [probe], [beacon] or [bltouch] section defined.") }
{% endif %}
{% if z < z_offset %}
{ action_raise_error("Horizontal move Z ({z}) is below your probe's Z offset ({z_offset}). Please adjust your horizontal_move_z setting in [bed_mesh] to be above {z}.") }
{% endif %}
{% if not probe_for_priming_disable_mesh_constraints %}
{% set min_x = mesh_config.mesh_min.split(",")[0]|float - x_offset %}
{% set min_y = mesh_config.mesh_min.split(",")[1]|float - y_offset %}
{% set max_x = mesh_config.mesh_max.split(",")[0]|float - x_offset %}
{% set max_y = mesh_config.mesh_max.split(",")[1]|float - y_offset %}
{% set x_start = [[x_start, max_x]|min, min_x]|max %}
{% set y_start = [[y_start, max_y]|min, min_y]|max %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the start of the prime location at {x_start}, {y_start}"
G90
M83
G0 Z{z} F{z_speed}
G1 X{x_start} Y{y_start} F{speed}
PROBE_CURRENT_POSITION
{% if t == 1 %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result_t1
{% else %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result
{% endif %}
{% if idex_mode == '' %}
{% set x_end = x_start %}
{% set y_end = y_start + 45 %}
{% else %}
{% if t==1 %}
{% set x_end = x_start - 45 %}
{% else %}
{% set x_end = x_start + 45 %}
{% endif %}
{% set y_end = y_start %}
{% endif %}
RATOS_ECHO PREFIX="Adaptive Mesh" MSG="Probing the end of the prime location at {x_end}, {y_end}"
G1 X{x_end} Y{y_end} F{speed}
PROBE_CURRENT_POSITION
{% if t == 1 %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_end_result_t1
{% else %}
SAVE_PROBE_RESULT VARIABLE=probe_for_priming_end_result
{% endif %}
RESTORE_GCODE_STATE NAME=probe_for_priming_state
RESTORE_TOOLHEAD_SETTINGS KEY="probe_for_priming"
{% endif %}
[gcode_macro RESET_PRIME_PROBE_STATE]
gcode =
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result VALUE=None
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_end_result VALUE=None
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result_t1 VALUE=None
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_end_result_t1 VALUE=None
{% endif %}
[gcode_macro PROBE_CURRENT_POSITION]
gcode =
{% set beacon_contact_prime_probing = true if printer["gcode_macro RatOS"].beacon_contact_prime_probing|default(false)|lower == 'true' else false %}
SAVE_GCODE_STATE NAME=probe_current_position_state
{% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
ASSERT_PROBE_DEPLOYED
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_prime_probing %}
PROBE PROBE_METHOD=contact SAMPLES=1
{% else %}
PROBE
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
BEACON_QUERY
{% else %}
RESTORE_GCODE_STATE NAME=probe_current_position_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_z_speed|float}
{% endif %}
[gcode_macro PRIME_BLOB]
description = Prints a primeblob, used internally, if configured, as part of the START_PRINT macro.
variable_x_offset = 5
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="prime_blob"
SET_MACRO_TRAVEL_SETTINGS
RATOS_ECHO PREFIX="Priming" MSG="Priming nozzle with prime blob.."
{% set current_toolhead = 0 %}
{% set target_idex_mode = '' %}
{% set extruder = 'extruder' %}
{% if printer["dual_carriage"] is defined %}
{% if params.IDEX_MODE is defined %}
{% set target_idex_mode = params.IDEX_MODE|default('')|lower %}
{% else %}
{ action_raise_error("IDEX_MODE parameter not found for PRIME_BLOB macro. This is likely a bug.") }
{% endif %}
RATOS_ECHO PREFIX="Priming" MSG="Priming in IDEX {target_idex_mode} mode.."
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set current_toolhead = 1 if current_idex_mode=='primary' else 0 %}
{% set extruder = 'extruder1' if current_toolhead == 1 else 'extruder' %}
{% endif %}
{% if target_idex_mode != "copy" or target_idex_mode != "mirror" %}
SAVE_GCODE_STATE NAME=prime_blob_state
{% endif %}
{% set first_y = printer["gcode_macro START_PRINT"].first_y|default(-1)|float %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set fan_speed = printer["gcode_macro RatOS"].nozzle_prime_bridge_fan|float %}
{% set nozzle_diameter = printer.configfile.settings[extruder].nozzle_diameter|float %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set has_start_offset_t0 = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) != 9999.9 %}
{% if printer["dual_carriage"] is defined %}
{% set has_start_offset_t1 = printer["gcode_macro RatOS"].probe_for_priming_result_t1|float(9999.9) != 9999.9 %}
{% endif %}
{% set start_print_park_in = printer["gcode_macro RatOS"].start_print_park_in %}
{% set start_print_park_z_height = printer["gcode_macro RatOS"].start_print_park_z_height|float %}
{% set nozzle_prime_direction = printer["gcode_macro RatOS"].nozzle_prime_direction|lower %}
{% set nozzle_prime_start_x = printer["gcode_macro RatOS"].nozzle_prime_start_x %}
{% set nozzle_prime_start_y = printer["gcode_macro RatOS"].nozzle_prime_start_y %}
{% set initial_toolhead = params.INITIAL_TOOLHEAD|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% if target_idex_mode == '' %}
{% set x_factor = 0 %}
{% if nozzle_prime_start_x|lower == 'min' %}
{% set x_start = 5 %}
{% elif nozzle_prime_start_x|lower == 'max' %}
{% set x_start = printable_x_max - 5 %}
{% else %}
{% set x_start = nozzle_prime_start_x|float %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% set y_factor = 1 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_y_max - 5 %}
{% set y_factor = -1 %}
{% else %}
{% set y_start = nozzle_prime_start_y|float %}
{% if nozzle_prime_start_y|float < printable_y_max / 2 %}
{% set y_factor = 1 %}
{% else %}
{% set y_factor = -1 %}
{% endif %}
{% endif %}
{% if nozzle_prime_direction == 'forwards' %}
{% set y_factor = 1 %}
{% elif nozzle_prime_direction == 'backwards' %}
{% set y_factor = -1 %}
{% endif %}
{% if start_print_park_in == 'primeblob' %}
{% set z = 3 %}
{% else %}
{% set z = start_print_park_z_height %}
{% endif %}
{% else %}
{% set center_x = printable_x_max / 2 %}
{% set y_factor = 0 %}
{% if target_idex_mode == 'copy' or target_idex_mode == 'mirror' %}
{% set x_start = center_x / 2 + 5 %}
{% set x_factor = 1 %}
{% else %}
{% if both_toolheads and initial_toolhead != current_toolhead %}
{% if current_toolhead == 0 %}
{% set x_start = 55 %}
{% set x_factor = -1 %}
{% elif current_toolhead == 1 %}
{% set x_start = printable_x_max - 55 %}
{% set x_factor = 1 %}
{% endif %}
{% else %}
{% if current_toolhead == 0 %}
{% set x_start = 5 %}
{% set x_factor = 1 %}
{% elif current_toolhead == 1 %}
{% set x_start = printable_x_max - 5 %}
{% set x_factor = -1 %}
{% endif %}
{% endif %}
{% endif %}
{% if nozzle_prime_start_y|lower == 'min' %}
{% set y_start = 5 %}
{% elif nozzle_prime_start_y|lower == 'max' %}
{% set y_start = printable_x_max - 5 %}
{% endif %}
{% set z = 10 %}
{% endif %}
{% set start_z_offset = 0 %}
{% set end_z_offset = 0 %}
{% if has_start_offset_t0 %}
{% set start_z_probe_result_t0 = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %}
{% set end_z_probe_result_t0 = printer["gcode_macro RatOS"].probe_for_priming_end_result|float(9999.9) %}
{% if printer.configfile.settings.bltouch is not defined and printer.configfile.settings.probe is not defined and printer.configfile.settings.beacon is not defined %}
{ action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe], [beacon] or [bltouch].") }
{% endif %}
{% if start_z_probe_result_t0 == 9999.9 %}
{ action_raise_error("No start probe result found for prime area. This is likely a bug.") }
{% endif %}
{% if end_z_probe_result_t0 == 9999.9 %}
{ action_raise_error("No end probe result found for prime area. This is likely a bug.") }
{% endif %}
{% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %}
{% if start_z_probe_result_t0 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (start_z_probe_result_t0) ) }
{% endif %}
{% if end_z_probe_result_t0 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (end_z_probe_result_t0) ) }
{% endif %}
{% set start_z_offset = start_z_probe_result_t0 %}
{% set end_z_offset = end_z_probe_result_t0 %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if current_toolhead == 1 or both_toolheads or target_idex_mode == "copy" or target_idex_mode == "mirror" %}
{% if has_start_offset_t1 %}
{% set start_z_probe_result_t1 = printer["gcode_macro RatOS"].probe_for_priming_result_t1|float(9999.9) %}
{% set end_z_probe_result_t1 = printer["gcode_macro RatOS"].probe_for_priming_end_result_t1|float(9999.9) %}
{% if printer.configfile.settings.bltouch is not defined and printer.configfile.settings.probe is not defined and printer.configfile.settings.beacon is not defined %}
{ action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe], [beacon] or [bltouch].") }
{% endif %}
{% if start_z_probe_result_t1 == 9999.9 %}
{ action_raise_error("No start probe result found for prime area. This is likely a bug.") }
{% endif %}
{% if end_z_probe_result_t1 == 9999.9 %}
{ action_raise_error("No end probe result found for prime area. This is likely a bug.") }
{% endif %}
{% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %}
{% if start_z_probe_result_t1 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (start_z_probe_result_t1) ) }
{% endif %}
{% if end_z_probe_result_t1 < adjustment_threshold %}
{ action_raise_error("Abnormal probe offset detected. Needed offset of %.5f is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area." % (end_z_probe_result_t1) ) }
{% endif %}
{% set start_z_offset = [start_z_offset, start_z_probe_result_t1]|max %}
{% set end_z_offset = [end_z_offset, start_z_probe_result_t1]|max %}
{% endif %}
{% endif %}
{% if target_idex_mode != 'copy' and target_idex_mode != 'mirror' %}
{% if both_toolheads and initial_toolhead != current_toolhead %}
{% set original_start_z_offset = start_z_offset %}
{% set original_end_z_offset = end_z_offset %}
{% set start_z_offset = original_end_z_offset %}
{% set end_z_offset = original_start_z_offset %}
{% endif %}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SET_NOZZLE_TEMP_OFFSET TOOLHEAD={current_toolhead}
{% endif %}
DEBUG_ECHO PREFIX="PRIME_BLOB" MSG="x_start: {x_start}, y_start: {y_start}, x_factor: {x_factor}, y_factor: {y_factor}, z: {z}, start_z_offset: {start_z_offset}, end_z_offset: {end_z_offset}"
G90
M83
RATOS_ECHO PREFIX="Priming" MSG="Lifting Z to {z}.."
G0 Z{z} F{z_speed}
{% if printer["dual_carriage"] is not defined %}
RATOS_ECHO PREFIX="Priming" MSG="Moving to {x_start}, {y_start} along the edge of the print area.."
{% if start_print_park_in != 'primeblob' %}
G1 X{x_start} F{speed}
G1 Y{y_start + (15 * y_factor)} F{speed}
{% endif %}
{% else %}
G1 Y{y_start + (15 * y_factor)} F{speed}
{% if target_idex_mode=="copy" or target_idex_mode=="mirror" %}
RATOS_ECHO PREFIX="Priming" MSG="Mirroring move to {x_start}, {y_start} along the edge of the print area.."
_IDEX_MIRROR PRIMING=1
{% else %}
RATOS_ECHO PREFIX="Priming" MSG="Moving to {x_start}, {y_start} along the edge of the print area.."
{% endif %}
G1 X{x_start} F{speed}
{% endif %}
RATOS_ECHO PREFIX="Priming" MSG="Starting prime blob.."
G1 Z{0.5 + start_z_offset} F{z_speed}
G1 Y{y_start} F{speed}
G1 F300 E{14 / ((0.4 / nozzle_diameter) ** 2)}
G1 F300 E{14 / ((0.4 / nozzle_diameter) ** 2)}
M106 S{fan_speed}
G1 Z5 F100 E5
G92 E0
RATOS_ECHO PREFIX="Priming" MSG="Bridging with {((fan_speed/255) * 100)|int}% fan speed.."
G1 F3000 X{x_start + (15 * x_factor)} Y{y_start + (15 * y_factor)} E{1 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (20 * x_factor)} Y{y_start + (20 * y_factor)} Z{3.8 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (34 * x_factor)} Y{y_start + (34 * y_factor)} Z{2.6 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (38 * x_factor)} Y{y_start + (38 * y_factor)} Z{1.4 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
G1 F3000 X{x_start + (42 * x_factor)} Y{y_start + (42 * y_factor)} Z{0.2 + end_z_offset} E{0.2 / ((0.4 / nozzle_diameter) ** 2)}
M106 S0
G1 F3000 X{x_start + (46 * x_factor)} Y{y_start + (46 * y_factor)} Z{0.2 + end_z_offset} E0.6
G1 F{speed} X{x_start + (50 * x_factor)} Y{y_start + (50 * y_factor)}
{% if target_idex_mode == "copy" or target_idex_mode == "mirror" %}
G0 Z3 F{z_speed}
{% endif %}
{% if target_idex_mode == "copy" %}
{% if first_y >= 0 %}
_IDEX_COPY DANCE=0 Y={first_y}
{% else %}
_IDEX_COPY DANCE=0 Y={params.Y1}
{% endif %}
{% endif %}
{% if target_idex_mode != "copy" or target_idex_mode != "mirror" %}
RESTORE_GCODE_STATE NAME=prime_blob_state
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="prime_blob"
G92 E0
[gcode_macro UNLOAD_FILAMENT]
description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams.
variable_ignore_min_extrude_temp = True
gcode =
_LEARN_MORE_FILAMENT
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set filament_name = params._NAME|default('')|string %}
{% set filament_type = params._TYPE|default('')|string %}
{% set temp = params.TEMP|default(220)|int %}
{% if printer["dual_carriage"] is not defined %}
_DEFAULT_UNLOAD_FILAMENT TEMP={temp} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Unloading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead==0 or toolhead==1 %}
_IDEX_UNLOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
RATOS_ECHO MSG="Please select toolhead! 0 = left, 1 = right toolhead"
{% endif %}
{% endif %}
[gcode_macro _LEGACY_UNLOAD_FILAMENT]
description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams.
gcode =
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% set unload_speed = 5 * 60 %}
{% set unload_length = printer["gcode_macro RatOS"].filament_unload_length|float %}
M117 Unloading filament...
G0 E10 F300
G0 E-5 F3600
G4 P3000
G0 E5 F6000
G0 E-15 F6000
G0 E-{unload_length} F{unload_speed}
_CLEANING_MOVE TOOLHEAD={toolhead}
M117 Filament unloaded!
RESPOND MSG="Filament unloaded! Please inspect the tip of the filament before reloading."
[gcode_macro _DEFAULT_UNLOAD_FILAMENT]
description = Unload filament macro for non IDEX printers.
gcode =
{% set temp = params.TEMP|default(220)|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set enable_unload_tip_forming = true if printer["gcode_macro RatOS"].enable_unload_tip_forming|default(false)|lower == 'true' else false %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_DEFAULT_UNLOAD_FILAMENT" MSG="TEMP: {temp}"
_LED_UNLOADING_FILAMENT TOOLHEAD=0
SAVE_GCODE_STATE NAME=unload_state
{% if printer.extruder.temperature|int < temp or printer.extruder.can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating extruder to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={temp}
G4 P3000
{% if enable_unload_tip_forming %}
_UNLOAD_FILAMENT TOOLHEAD=0 NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_LEGACY_UNLOAD_FILAMENT TOOLHEAD=0
{% endif %}
RESTORE_GCODE_STATE NAME=unload_state
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD=0
[gcode_macro _IDEX_UNLOAD_FILAMENT]
description = Unload filament macro for IDEX printer.
gcode =
{% set temp = params.TEMP|default(220)|int %}
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% set enable_unload_tip_forming = true if printer["gcode_macro RatOS"].enable_unload_tip_forming|default(false)|lower == 'true' else false %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
DEBUG_ECHO PREFIX="_IDEX_UNLOAD_FILAMENT" MSG="TEMP: {temp}, TOOLHEAD: {toolhead}"
_LED_UNLOADING_FILAMENT TOOLHEAD={toolhead}
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
{% if not printer.pause_resume.is_paused %}
{% if printer[target_extruder].temperature|int < temp or printer[target_extruder].can_extrude|lower == 'false' %}
RATOS_ECHO MSG="Heating T{toolhead} to {temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={temp}
{% endif %}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={temp}
{% endif %}
G4 P3000
{% if enable_unload_tip_forming %}
_UNLOAD_FILAMENT TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_LEGACY_UNLOAD_FILAMENT TEMP={temp} TOOLHEAD={toolhead}
{% endif %}
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD={toolhead}
[gcode_macro _UNLOAD_FILAMENT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT" MSG="TOOLHEAD: {toolhead}"
_MOVE_TO_LOADING_POSITION TOOLHEAD={toolhead}
_UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
_UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER TOOLHEAD={toolhead}
_CLEANING_MOVE TOOLHEAD={toolhead}
[gcode_macro _UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT_FROM_NOZZLE_TO_COOLING_ZONE" MSG="TOOLHEAD: {toolhead}"
RATOS_ECHO MSG="Unloading filament from nozzle to cooling zone... Please wait!"
_PURGE_BEFORE_UNLOAD TOOLHEAD={toolhead}
{% if printer["gcode_macro _UNLOAD_WITHOUT_TIP_FORMING"] is defined %}
_UNLOAD_WITHOUT_TIP_FORMING TOOLHEAD={toolhead} NAME='{filament_name}' TYPE='{filament_type}'
{% else %}
_UNLOAD_WITH_TIP_FORMING NAME='{filament_name}' TYPE='{filament_type}'
{% endif %}
G4 P3000
[gcode_macro _UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set extruder_load_speed = printer["gcode_macro T%s" % toolhead].extruder_load_speed|float * 60 %}
{% set extruder_gear_to_cooling_position_distance = printer["gcode_macro T%s" % toolhead].extruder_gear_to_cooling_position_distance|float %}
{% set tooolhead_sensor_to_extruder_gear_distance = printer["gcode_macro T%s" % toolhead].tooolhead_sensor_to_extruder_gear_distance|float %}
DEBUG_ECHO PREFIX="_UNLOAD_FILAMENT_FROM_COOLING_ZONE_TO_EXTRUDER" MSG="TOOLHEAD: {toolhead}"
G0 E-{extruder_gear_to_cooling_position_distance + tooolhead_sensor_to_extruder_gear_distance + 50} F{extruder_load_speed}
RATOS_ECHO MSG="Filament unloaded! Please inspect the tip of the filament before reloading."
[gcode_macro _UNLOAD_WITH_TIP_FORMING]
gcode =
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
{% if filament_name != '' and filament_type != '' %}
_UNLOAD_KNOWN_FILAMENT NAME={filament_name} TYPE={filament_type}
{% else %}
_UNLOAD_UNKNOWN_FILAMENT TOOLHEAD={toolhead}
{% endif %}
[gcode_macro _UNLOAD_KNOWN_FILAMENT]
description = User overrideable tip forming macro if slicer filament profiles are known
gcode =
{% set filament_name = params.NAME|default('')|string %}
{% set filament_type = params.TYPE|default('')|string %}
RATOS_ECHO PREFIX="FILAMENT TYPE" MSG='{filament_type}'
RATOS_ECHO PREFIX="FILAMENT PROFILE" MSG='{filament_name}'
{% if filament_name == "Prusament PETG @V-Minion" %}
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
{% elif filament_name == "Nobufil PETG @V-Minion" %}
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
{% else %}
RATOS_ECHO PREFIX="_UNLOAD_KNOWN_FILAMENT" MSG="Filament profile not found!"
_UNLOAD_UNKNOWN_FILAMENT
{% endif %}
[gcode_macro _UNLOAD_UNKNOWN_FILAMENT]
description = User overrideable standard tip forming macro
gcode =
DEBUG_ECHO PREFIX="_UNLOAD_UNKNOWN_FILAMENT" MSG="Using standard tip forming macro!"
_TIP_FORMING RETRACT_LENGTH=18 COOLING_MOVE_LENGTH=10
[gcode_macro _TIP_FORMING]
gcode =
{% set cooling_moves = params.COOLING_MOVES|default(4)|int %}
{% set cooling_move_length = params.COOLING_MOVE_LENGTH|default(10)|float %}
{% set start_cooling_speed = params.START_COOLING_SPEED|default(10)|float * 60 %}
{% set end_cooling_speed = params.END_COOLING_SPEED|default(50)|float * 60 %}
{% if cooling_moves == 0 %}
{% set cooling_move_length = 0 %}
{% endif %}
{% set dip = true if params.DIP|default(false)|lower == "true" else false %}
{% set dip_length = params.DIP_LENGTH|default(22)|float %}
{% set dip_speed = params.DIP_SPEED|default(30)|float * 60 %}
{% set dip_retract_speed = params.DIP_RETRACT_SPEED|default(70)|float * 60 %}
{% set retract_length = params.RETRACT_LENGTH|default(18)|float %}
{% set start_retract_speed = params.START_RETRACT_SPEED|default(120)|float * 60 %}
{% set end_retract_speed = params.END_RETRACT_SPEED|default(20)|float * 60 %}
DEBUG_ECHO PREFIX="_TIP_FORMING" MSG="cooling_moves: {cooling_moves}, cooling_move_length: {cooling_move_length}, start_cooling_speed: {start_cooling_speed}, end_cooling_speed: {end_cooling_speed}, dip: {dip}, dip_length: {dip_length}, dip_speed: {dip_speed}, dip_retract_speed: {dip_retract_speed}, retract_length: {retract_length}, start_retract_speed: {start_retract_speed}, end_retract_speed: {end_retract_speed}"
M220 S100
G92 E0
{% set retract = retract_length + cooling_move_length / 2 - 15 %}
G1 E-15 F{start_retract_speed}
G1 E-{0.7 * retract} F{1.0 * end_retract_speed}
G1 E-{0.2 * retract} F{0.5 * end_retract_speed}
G1 E-{0.1 * retract} F{0.3 * end_retract_speed}
G92 E0
{% if cooling_moves > 0 %}
{% set i = (end_cooling_speed - start_cooling_speed) / (2 * cooling_moves - 1) %}
{% for m in range(cooling_moves) %}
G1 E{cooling_move_length} F{(start_cooling_speed + i * m * 2)}
G1 E-{cooling_move_length} F{(start_cooling_speed + i * (m * 2 + 1))}
{% endfor %}
{% endif %}
G92 E0
{% if dip %}
G1 E{dip_length} F{dip_speed}
G4 P100
G1 E-{dip_length} F{dip_retract_speed}
{% endif %}
G92 E0
M400
[gcode_macro _ON_FILAMENT_SENSOR_BUTTON_PRESSED]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
DEBUG_ECHO PREFIX="_ON_FILAMENT_SENSOR_BUTTON_PRESSED" MSG="TOOLHEAD: {toolhead}"
{% if not printer.virtual_sdcard.is_active %}
UNLOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_RUNOUT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_runout_detection = true if printer["gcode_macro T%s" % toolhead].enable_runout_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_RUNOUT" MSG="TOOLHEAD: {toolhead}"
{% if enable_runout_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=false
{% endif %}
[gcode_macro _ON_TOOLHEAD_FILAMENT_SENSOR_CLOG]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_clog_detection = true if printer["gcode_macro T%s" % toolhead].enable_clog_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_TOOLHEAD_FILAMENT_SENSOR_CLOG" MSG="TOOLHEAD: {toolhead}"
{% if enable_clog_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=true
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_RUNOUT]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_runout_detection = true if printer["gcode_macro T%s" % toolhead].enable_runout_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_RUNOUT" MSG="TOOLHEAD: {toolhead}"
{% if enable_runout_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=false
{% endif %}
[gcode_macro _ON_BOWDEN_FILAMENT_SENSOR_CLOG]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set enable_clog_detection = true if printer["gcode_macro T%s" % toolhead].enable_clog_detection|default(true)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_ON_BOWDEN_FILAMENT_SENSOR_CLOG" MSG="TOOLHEAD: {toolhead}"
{% if enable_clog_detection %}
_ON_FILAMENT_END TOOLHEAD={toolhead} CLOGGED=true
{% endif %}
[gcode_macro _ON_FILAMENT_END]
gcode =
{% set toolhead = params.TOOLHEAD|int %}
{% set clogged = true if params.CLOGGED|default(false)|lower == 'true' else false %}
{% set unload_after_runout = printer["gcode_macro T%s" % toolhead].unload_after_runout|float %}
{% if clogged %}
_LED_FILAMENT_CLOG TOOLHEAD={toolhead}
{% else %}
_LED_FILAMENT_RUNOUT TOOLHEAD={toolhead}
{% endif %}
DEBUG_ECHO PREFIX="_ON_FILAMENT_END" MSG="TOOLHEAD: {toolhead}"
{% if printer.virtual_sdcard.is_active %}
{% if not printer.pause_resume.is_paused %}
PAUSE RUNOUT=True
{% endif %}
{% if not clogged and unload_after_runout %}
UNLOAD_FILAMENT TOOLHEAD={toolhead}
{% endif %}
{% if not clogged and printer["dual_carriage"] is defined %}
{% if printer["gcode_macro _IDEX_JOIN_SPOOLS"].enabled|default(false)|lower == 'true'%}
_JOIN_SPOOL TOOLHEAD={toolhead}
{% endif %}
{% endif %}
{% endif %}
[gcode_macro M600]
description = Executes a color change by pausing the printer an unloading the filament.
gcode =
PAUSE
UNLOAD_FILAMENT
RATOS_ECHO MSG="Please load new filament and resume"
[gcode_macro COLD_PULL]
description = Automated hotend cold pull.
gcode =
{% set extrusion_temp = params.EXTRUSION_TEMP|default(220)|int %}
{% set cold_pull_temp = params.COLD_PULL_TEMP|default(80)|int %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% if printer["dual_carriage"] is not defined %}
{% set toolhead = 0 %}
{% else %}
{% if not printer.pause_resume.is_paused %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %}
{action_raise_error("Unloading filament in Copy or Mirror mode is not supported! Select single mode to proceed.")}
{% else %}
{% set paused_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% if paused_idex_mode == 'copy' or paused_idex_mode == 'mirror' %}
{% set toolhead = params.TOOLHEAD|default(-1)|int %}
{% else %}
{% set toolhead = printer["gcode_macro PAUSE"].idex_toolhead|int %}
{% endif %}
{% endif %}
{% endif %}
{% if toolhead != 0 and toolhead != 1 %}
{action_raise_error("Please select toolhead! 0 = left, 1 = right toolhead")}
{% endif %}
{% endif %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
_LED_UNLOADING_FILAMENT TOOLHEAD={toolhead}
SAVE_GCODE_STATE NAME=cold_pull_state
{% if "xyz" not in printer.toolhead.homed_axes %}
_SELECT_TOOL T={toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% set target_extruder = 'extruder%s' % ('' if toolhead == 0 else toolhead) %}
ACTIVATE_EXTRUDER EXTRUDER={target_extruder}
RATOS_ECHO MSG="Heating T{toolhead} to {extrusion_temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={extrusion_temp}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={extrusion_temp} MAXIMUM={extrusion_temp + 2}
G4 P3000
RATOS_ECHO MSG="extruding..."
G92 E0
G1 E30 F300
G92 E0
RATOS_ECHO MSG="Heating T{toolhead} to {cold_pull_temp}C... Please wait."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET={cold_pull_temp}
TEMPERATURE_WAIT SENSOR={target_extruder} MINIMUM={cold_pull_temp} MAXIMUM={cold_pull_temp + 2}
G4 P10000
RATOS_ECHO MSG="cold pull..."
FORCE_MOVE STEPPER={target_extruder} DISTANCE=-40 VELOCITY=5 ACCEL=100
RATOS_ECHO MSG="eject filament..."
FORCE_MOVE STEPPER={target_extruder} DISTANCE=-200 VELOCITY=20 ACCEL=500
RATOS_ECHO MSG="cooling down extruder..."
SET_HEATER_TEMPERATURE HEATER={'extruder' if toolhead == 0 else 'extruder1'} TARGET=0
RESTORE_GCODE_STATE NAME=cold_pull_state
SAVE_VARIABLE VARIABLE=t{toolhead}_filament VALUE="('""', '""', 0)"
{% if printer["gcode_macro T%s" % toolhead].filament_name is defined and printer["gcode_macro T%s" % toolhead].filament_type is defined and printer["gcode_macro T%s" % toolhead].filament_temp is defined %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=filament_temp VALUE=0
{% endif %}
SET_GCODE_VARIABLE MACRO=T{toolhead} VARIABLE=color VALUE='"{color_unknown}"'
_LED_FILAMENT_UNLOADED TOOLHEAD={toolhead}
CONSOLE_ECHO TITLE="Cold pull finished!" MSG="Please remove the filament from the PTFE tube and cut the end off. Do NOT try to load it again." TYPE="warning"
[gcode_macro _USER_START_PRINT_BEFORE_HOMING]
gcode =
[gcode_macro _USER_START_PRINT_AFTER_HEATING_BED]
gcode =
[gcode_macro _USER_START_PRINT_BED_MESH]
gcode =
[gcode_macro _USER_START_PRINT_PARK]
gcode =
[gcode_macro _USER_START_PRINT_AFTER_HEATING_EXTRUDER]
gcode =
[gcode_macro _USER_START_PRINT_HEAT_CHAMBER]
description = Uses the extruder sensor to wait for chamber temp. Override the _START_PRINT_HEAT_CHAMBER macro to implement heated chamber handling.
gcode =
{% set chamber_heater_bed_temp = printer["gcode_macro RatOS"].chamber_heater_bed_temp|default(115)|int %}
[gcode_macro _USER_END_PRINT_BEFORE_HEATERS_OFF]
gcode =
[gcode_macro _USER_END_PRINT_AFTER_HEATERS_OFF]
gcode =
[gcode_macro _USER_END_PRINT_PARK]
gcode =
[gcode_macro _USER_END_PRINT_FINISHED]
description = User hook for when the print is finished after gcode state has been restored.
gcode =
[gcode_macro _USER_START_PRINT]
gcode =
[gcode_macro _USER_END_START_PRINT]
gcode =
[gcode_macro _USER_START_FEATURE]
gcode =
[gcode_macro _USER_END_FEATURE]
gcode =
[gcode_macro ECHO_T_VARS]
description = Echo Toolhead variables to the console.
gcode =
{% set t = params.T|default(0) %}
RATOS_ECHO MSG="T{t} Variables"
{% for var, value in printer["gcode_macro T%s" % t].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[gcode_macro ECHO_RATOS_VARS]
description = Echo RatOS variables to the console.
gcode =
{% for var, value in printer["gcode_macro RatOS"].items() %}
{action_respond_info(var ~ ": " ~ value)}
{% endfor %}
[delayed_gcode RATOS_INIT]
initial_duration = 0.1
gcode =
_LED_STANDBY
CALCULATE_PRINTABLE_AREA
INITIAL_FRONTEND_UPDATE
_CHAMBER_FILTER_SANITY_CHECK
[delayed_gcode RATOS_LOGO]
initial_duration = 2
gcode =
HELLO_RATOS
[gcode_macro INITIAL_FRONTEND_UPDATE]
gcode =
{% set color_ok = printer["gcode_macro RatOS"].status_color_ok|string %}
{% set color_error = printer["gcode_macro RatOS"].status_color_error|string %}
{% set color_unknown = printer["gcode_macro RatOS"].status_color_unknown|string %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_unknown}"'
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_unknown}"'
{% endif %}
{% set t0_sensor = "undefined" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t0"].filament_detected|lower == "true" %}
{% set t0_sensor = "detected" %}
{% else %}
{% set t0_sensor = "empty" %}
{% endif %}
{% else %}
{% set t0_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set t1_sensor = "undefined" %}
{% if printer["dual_carriage"] is defined and printer["filament_switch_sensor toolhead_filament_sensor_t1"] is defined %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t1"].filament_detected|lower == "true" %}
{% set t1_sensor = "detected" %}
{% else %}
{% set t1_sensor = "empty" %}
{% endif %}
{% else %}
{% set t1_sensor = "disabled" %}
{% endif %}
{% endif %}
{% set svv = printer.save_variables.variables %}
{% if svv.t0_filament is defined and printer["gcode_macro T0"] is defined %}
{% if printer["gcode_macro T0"].filament_name is defined and printer["gcode_macro T0"].filament_type is defined and printer["gcode_macro T0"].filament_temp is defined %}
{% if t0_sensor != "empty" %}
{% set t0_filament_type = svv.t0_filament[0]|default('')|string %}
{% set t0_filament_name = svv.t0_filament[1]|default('')|string %}
{% set t0_filament_temp = svv.t0_filament[2]|default(0)|float %}
{% if t0_filament_name != '' and t0_filament_type != '' and t0_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='"{t0_filament_name}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='"{t0_filament_type}"'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE={t0_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t0_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
{% if svv.t1_filament is defined and printer["gcode_macro T1"] is defined %}
{% if printer["gcode_macro T1"].filament_name is defined and printer["gcode_macro T1"].filament_type is defined and printer["gcode_macro T1"].filament_temp is defined %}
{% if t1_sensor != "empty" %}
{% set t1_filament_type = svv.t1_filament[0]|default('')|string %}
{% set t1_filament_name = svv.t1_filament[1]|default('')|string %}
{% set t1_filament_temp = svv.t1_filament[2]|default(0)|float %}
{% if t1_filament_name != '' and t1_filament_type != '' and t1_filament_temp > 0 %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=color VALUE='"{color_ok}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='"{t1_filament_name}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='"{t1_filament_type}"'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE={t1_filament_temp}
{% endif %}
{% else %}
SAVE_VARIABLE VARIABLE=t1_filament VALUE="('""', '""', 0)"
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_name VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_type VALUE='""'
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=filament_temp VALUE=0
{% endif %}
{% endif %}
{% endif %}
[gcode_macro CALCULATE_PRINTABLE_AREA]
gcode =
{% set bed_margin_x = printer["gcode_macro RatOS"].bed_margin_x %}
{% set bed_margin_y = printer["gcode_macro RatOS"].bed_margin_y %}
{% set tool = 0 if printer["gcode_macro T0"] is not defined or printer["gcode_macro T0"].active else 1 %}
{% set max_x = printer.toolhead.axis_maximum.x if printer["dual_carriage"] is defined and tool == 0 else printer.toolhead.axis_maximum.x - bed_margin_x[1] %}
{% if printer["dual_carriage"] is defined %}
{% set max_x = printer.toolhead.axis_maximum.x %}
{% endif %}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="printer.toolhead.axis_maximum.x {printer.toolhead.axis_maximum.x}"
{% set max_y = printer.toolhead.axis_maximum.y - bed_margin_y[1]%}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_x_max VALUE={max_x}
SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=printable_y_max VALUE={max_y}
DEBUG_ECHO PREFIX="CALCULATE_PRINTABLE_AREA" MSG="Printable area calculated: X: 0,{max_x} Y: 0,{max_y}"
[gcode_macro CACHE_TOOLHEAD_SETTINGS]
variable_cache = {"global": {"accel": 1000, "ratio": 0.5, "speed": 50, "scv": 5}}
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set dummy = cache.__setitem__(key, {"accel": printer.toolhead.max_accel, "ratio": printer.toolhead.minimum_cruise_ratio, "speed": printer.toolhead.max_velocity, "scv": printer.toolhead.square_corner_velocity}) %}
SET_GCODE_VARIABLE MACRO=CACHE_TOOLHEAD_SETTINGS VARIABLE=cache VALUE="{cache | pprint | replace("\n", "") | replace("\"", "\\\"")}"
DEBUG_ECHO PREFIX="CACHE_TOOLHEAD_SETTINGS" MSG="Toolhead settings cached for {key}. {printer.toolhead.max_accel} accel, {printer.toolhead.minimum_cruise_ratio} ratio, {printer.toolhead.max_velocity} velocity, {printer.toolhead.square_corner_velocity} scv."
[gcode_macro RESTORE_TOOLHEAD_SETTINGS]
gcode =
{% set key = "global" %}
{% if params.KEY is defined %}
{% set key = params.KEY %}
{% endif %}
{% set values = printer["gcode_macro CACHE_TOOLHEAD_SETTINGS"].cache.__getitem__(key) %}
{% if values is not defined or values == 'None' %}
{ action_raise_error("RESTORE_TOOLHEAD_SETTINGS: Toolhead settings not cached for key '" ~ key ~ "'.") }
{% endif %}
SET_VELOCITY_LIMIT ACCEL={values.accel} MINIMUM_CRUISE_RATIO={values.ratio} VELOCITY={values.speed} SQUARE_CORNER_VELOCITY={values.scv}
DEBUG_ECHO PREFIX="RESTORE_TOOLHEAD_SETTINGS" MSG="Toolhead settings restored. {values.accel} accel, {values.ratio} ratio, {values.speed} velocity, {values.scv} scv."
[gcode_macro SET_MACRO_TRAVEL_SETTINGS]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set accel = printer["gcode_macro RatOS"].macro_travel_accel %}
SET_VELOCITY_LIMIT ACCEL={accel} MINIMUM_CRUISE_RATIO=0.5 VELOCITY={speed} SQUARE_CORNER_VELOCITY={5}
DEBUG_ECHO PREFIX="SET_MACRO_TRAVEL_SETTINGS" MSG="Macro travel settings set. {accel} accel, {speed} velocity"
[gcode_macro SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% if printer["dual_carriage"] is not defined %}
SET_KINEMATIC_POSITION X={printable_x_max / 2} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
{% else %}
IDEX_SET_CENTER_KINEMATIC_POSITION
{% endif %}
[gcode_macro IDEX_SET_CENTER_KINEMATIC_POSITION]
description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position.
gcode =
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
RATOS_ECHO MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE."
SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set center_x = printable_x_max / 2 %}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x - (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
SET_KINEMATIC_POSITION X={center_x + (center_x / 2)} Y={printable_y_max / 2} Z={printer.toolhead.axis_maximum.z / 2}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
[gcode_macro VERIFY_HYBRID_INVERTED]
gcode =
{% set inverted = False %}
{% if printer.configfile.settings.ratos_hybrid_corexy is defined and printer.configfile.settings.ratos_hybrid_corexy.inverted is defined %}
{% if printer.configfile.settings.ratos_hybrid_corexy.inverted|lower == 'true' %}
{% set inverted = True %}
{% endif %}
{% endif %}
{% if inverted == False %}
{ action_emergency_stop("ratos_hybrid_corexy NOT INVERTED! Inverted hybrid core-xy bugfix not detected.") }
{% endif %}
[gcode_macro RATOS_ECHO]
gcode =
{% set prefix = "RatOS" %}
{% set debug = params.DEBUG|default(0)|int %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " | " ~ params.PREFIX %}
{% endif %}
{% set prefix = prefix ~ ":" %}
{% set msg = "" %}
{% if params.MSG is defined %}
{% set msg = params.MSG %}
{% else %}
{% set msg = "No msg parameter provided (this is a bug or unintended use)." %}
{% endif %}
{% if not debug %}
M117 {prefix} {msg}
{% endif %}
RATOS_LOG PREFIX="{prefix}" MSG="{msg}"
{% if not debug %}
RESPOND PREFIX="{prefix}" MSG="{msg}"
{% else %}
CONSOLE_ECHO TITLE="{prefix}" TYPE="debug" MSG="{msg}"
{% endif %}
[gcode_macro ENABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=True
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=prefix_filter VALUE="'{params.FILTER|default('')|lower}'"
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging enabled."
[gcode_macro DISABLE_DEBUG]
gcode =
SET_GCODE_VARIABLE MACRO=DEBUG_ECHO VARIABLE=enabled VALUE=False
RATOS_ECHO PREFIX="DEBUG" MSG="Debugging disabled."
[gcode_macro DEBUG_ECHO]
variable_enabled = False
variable_prefix_filter = ''
gcode =
{% set prefix = "DEBUG" %}
{% if params.PREFIX is defined %}
{% set prefix = prefix ~ " - " ~ params.PREFIX %}
{% endif %}
{% if enabled and (prefix_filter|lower == '' or prefix_filter|lower in params.PREFIX|lower) %}
RATOS_ECHO PREFIX="{prefix}" MSG="{params.MSG}" DEBUG=1
{% endif %}
[gcode_macro START_FEATURE]
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="Start {params.FEATURE} feature gcode"
{% set scv = printer.toolhead.square_corner_velocity|int|default(5) %}
{% set accel = printer.toolhead.max_accel|int|default(10000) %}
{% set ratio = printer.toolhead.minimum_cruise_ratio|float|default(0.5) %}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="scv" VALUE={scv}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="accel" VALUE={accel}
SET_GCODE_VARIABLE MACRO="END_FEATURE" VARIABLE="ratio" VALUE={ratio}
_USER_START_FEATURE FEATURE="{params.FEATURE}"
[gcode_macro END_FEATURE]
variable_scv = 5
variable_accel = 10000
variable_ratio = 0.5
gcode =
DEBUG_ECHO PREFIX="G-Code" MSG="End {params.FEATURE} feature gcode"
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={scv} ACCEL={accel} MINIMUM_CRUISE_RATIO={ratio}
_USER_END_FEATURE FEATURE="{params.FEATURE}" SCV={scv} ACCEL={accel} RATIO={ratio}
[gcode_macro _ON_LAYER_CHANGE]
variable_layer_number = 0
description = INTERNAL USE ONLY. Call it from the slicers after layer change custom gcode
gcode =
{% set layer = params.LAYER|int %}
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE={layer}
SET_PRINT_STATS_INFO CURRENT_LAYER={layer}
[gcode_macro _LEARN_MORE_CALIBRATION]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/calibration" %}
{% set link_text = "RatOS Calibration Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_CHAMBER_FILTER]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/chamber_filter" %}
{% set link_text = "RatOS Chamber Filter Control" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _LEARN_MORE_FILAMENT]
gcode =
{% set link_url = "https://os.ratrig.com/docs/configuration/filaments" %}
{% set link_text = "RatOS Filament Macros" %}
{% set line_1 = '"Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="INFO" MSG={line_1}
[gcode_macro _CONSOLE_SAVE_CONFIG]
gcode =
M118 Click SAVE_CONFIG to save the settings to your printer.cfg.
[gcode_macro SAVE_Z_OFFSET]
gcode =
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SAVE_MULTIPLIER
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _LOAD_RATOS_SKEW_PROFILE]
gcode =
{% set ratos_skew_profile = printer["gcode_macro RatOS"].skew_profile|default("") %}
{% if ratos_skew_profile != "" %}
{% if printer.configfile.config["skew_correction %s" % ratos_skew_profile] is defined %}
SKEW_PROFILE LOAD={ratos_skew_profile}
GET_CURRENT_SKEW
{% else %}
{% set line_1 = '"Could not find skew profile %s!_N_Clearing skew correction."' % ratos_skew_profile %}
CONSOLE_ECHO TITLE="Missing skew profile!" TYPE="warning" MSG={line_1}
SET_SKEW CLEAR=1
{% endif %}
{% endif %}
[gcode_macro M601]
gcode =
PAUSE
[gcode_macro PAUSE]
description = Pauses the print
rename_existing = PAUSE_BASE
variable_extrude = 1.5
variable_retract = 1.5
variable_fan_speed = 0
variable_idex_mode = ""
variable_idex_toolhead = 0
variable_idex_toolhead_x = 0.0
variable_idex_toolhead_y = 0.0
variable_idex_toolhead_z = 0.0
gcode =
{% set runout_detected = true if params.RUNOUT|default(false)|lower == 'true' else false %}
_LED_PAUSE
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set idex_toolhead = 1 if idex_mode == 'primary' else 0 %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
SAVE_GCODE_STATE NAME=PAUSE_state
{% else %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_mode VALUE='"{idex_mode}"'
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead VALUE={idex_toolhead}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_x VALUE={printer.gcode_move.gcode_position.x|float}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_y VALUE={printer.gcode_move.gcode_position.y|float}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=idex_toolhead_z VALUE={printer.gcode_move.gcode_position.z|float}
DEBUG_ECHO PREFIX="PAUSE" MSG="idex_mode: {idex_mode}, idex_toolhead: {idex_toolhead}, idex_toolhead_x: {idex_toolhead_x}, idex_toolhead_y: {idex_toolhead_y}, idex_toolhead_z: {idex_toolhead_z}"
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
CACHE_TOOLHEAD_SETTINGS KEY="pause"
SET_MACRO_TRAVEL_SETTINGS
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set current_z = printer.toolhead.position.z|float %}
{% if current_z < (max_z - 20.0) %}
{% set z_safe = 20.0 %}
{% else %}
{% set z_safe = max_z - current_z %}
{% endif %}
PAUSE_BASE
{% if printer["dual_carriage"] is not defined %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan"].speed|float}
{% else %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t0"].speed|float}
{% else %}
{% if idex_toolhead == 0 %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t0"].speed|float}
{% else %}
SET_GCODE_VARIABLE MACRO=PAUSE VARIABLE=fan_speed VALUE={printer["fan_generic part_fan_t1"].speed|float}
{% endif %}
{% endif %}
{% endif %}
M106 S0
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' else false %}
{% if idex_mode != '' %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' and printer['extruder1'].can_extrude|lower == 'true' else false %}
{% else %}
{% if printer.toolhead.extruder == 'extruder1' %}
{% set can_extrude = true if printer['extruder1'].can_extrude|lower == 'true' else false %}
{% endif %}
{% endif %}
{% endif %}
{% set R = printer["gcode_macro PAUSE"].retract|float %}
{% if can_extrude %}
G91
G1 E-{R} F2100
G90
{% else %}
{action_respond_info("Extruder not hot enough")}
{% endif %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set pause_print_park_x = printer["gcode_macro RatOS"].pause_print_park_x %}
{% set pause_print_park_in = printer["gcode_macro RatOS"].pause_print_park_in %}
{% if runout_detected %}
{% set pause_print_park_x = printer["gcode_macro RatOS"].runout_park_x %}
{% set pause_print_park_in = printer["gcode_macro RatOS"].runout_park_in %}
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
DEBUG_ECHO PREFIX="PAUSE" MSG="z_speed: {z_speed}, pause_print_park_x: {pause_print_park_x}, pause_print_park_in: {pause_print_park_in}, default_toolhead: {default_toolhead}"
{% if "xyz" in printer.toolhead.homed_axes %}
G91
G1 Z{z_safe} F{z_speed}
G90
{% if printer["dual_carriage"] is not defined %}
_PARK LOCATION={pause_print_park_in} X={pause_print_park_x}
{% else %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
_IDEX_SINGLE X={parking_position}
{% else %}
PARK_TOOLHEAD
{% endif %}
_PARK LOCATION={pause_print_park_in} X={pause_print_park_x}
{% endif %}
{% else %}
{action_respond_info("Printer not homed")}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="pause"
[gcode_macro RESUME]
description = Resumes the print if the printer is paused.
rename_existing = RESUME_BASE
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set target_idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set target_idex_mode = printer["gcode_macro PAUSE"].idex_mode|lower %}
{% endif %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' else false %}
{% if target_idex_mode != '' %}
{% if target_idex_mode == 'copy' or target_idex_mode == 'mirror' %}
{% set can_extrude = true if printer['extruder'].can_extrude|lower == 'true' and printer['extruder1'].can_extrude|lower == 'true' else false %}
{% else %}
{% if printer.toolhead.extruder == 'extruder1' %}
{% set can_extrude = true if printer['extruder1'].can_extrude|lower == 'true' else false %}
{% endif %}
{% endif %}
{% endif %}
{% set fan_speed = printer["gcode_macro PAUSE"].fan_speed|float %}
{% if printer["dual_carriage"] is not defined %}
M106 S{(fan_speed * 255)}
{% else %}
{% if idex_mode == 'copy' or idex_mode == 'mirror' %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% else %}
{% if params.TOOLHEAD is defined %}
{% if params.TOOLHEAD == 0 %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
{% else %}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% endif %}
{% else %}
{% if printer["gcode_macro PAUSE"].idex_toolhead == 0 %}
SET_FAN_SPEED FAN=part_fan_t0 SPEED={fan_speed}
{% else %}
SET_FAN_SPEED FAN=part_fan_t1 SPEED={fan_speed}
{% endif %}
{% endif %}
{% endif %}
M106.1 S{fan_speed}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if target_idex_mode == "copy" %}
_IDEX_COPY DANCE=0
{% elif target_idex_mode == "mirror" %}
_IDEX_MIRROR DANCE=0
{% else %}
{% if params.TOOLHEAD is defined %}
_SELECT_TOOL T={params.TOOLHEAD} X=-1 Y=-1 TOOLSHIFT=false
{% else %}
_SELECT_TOOL T={printer["gcode_macro PAUSE"].idex_toolhead} X=-1 Y=-1 TOOLSHIFT=false
{% endif %}
{% endif %}
{% set x = printer["gcode_macro PAUSE"].idex_toolhead_x|float %}
{% set y = printer["gcode_macro PAUSE"].idex_toolhead_y|float %}
{% set z = printer["gcode_macro PAUSE"].idex_toolhead_z|float %}
G1 X{x} Y{y} Z{z} F{speed}
{% if params.TOOLHEAD is defined %}
SAVE_GCODE_STATE NAME=PAUSE_STATE
{% endif %}
{% endif %}
{% if params.TOOLHEAD is not defined %}
{% set E = printer["gcode_macro PAUSE"].extrude|float %}
{% if can_extrude %}
G91
G1 E{E} F2100
G90
{% else %}
{action_respond_info("Extruder not hot enough")}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is not defined %}
RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 MOVE_SPEED={speed}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=True
RESUME_BASE
_LED_PRINTING
[gcode_macro CANCEL_PRINT]
description = Cancels the printer
rename_existing = CANCEL_PRINT_BASE
gcode =
END_PRINT
TURN_OFF_HEATERS
CLEAR_PAUSE
CANCEL_PRINT_BASE
[gcode_macro START_PRINT]
description = Start print procedure, use this in your Slicer.
variable_post_processor_version = 2
variable_is_printing_gcode = False
variable_both_toolheads = True
variable_object_xoffset = 0
variable_first_x = -1
variable_first_y = -1
variable_total_toolshifts = 0
variable_initial_tool = 0
variable_extruder_first_layer_temp = ""
variable_extruder_other_layer_temp = ""
gcode =
{% if "xyz" in printer.toolhead.homed_axes and printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% if printer["gcode_macro _VAOC"].is_started|default(true)|lower == 'true' %}
_VAOC_END
{% endif %}
{% endif %}
_LED_START_PRINTING
CACHE_TOOLHEAD_SETTINGS KEY="start_print"
_USER_START_PRINT { rawparams }
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% set hotend_heat_soak_time = printer["gcode_macro RatOS"].hotend_heat_soak_time|default(0)|int %}
{% set z_probe_stowable = printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %}
{% if printer["dual_carriage"] is defined %}
{% set toolchange_standby_temp = printer["gcode_macro RatOS"].toolchange_standby_temp|default(-1)|float %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set X0 = params.X0|default(-1)|float %}
{% set X1 = params.X1|default(-1)|float %}
{% set Y0 = params.Y0|default(-1)|float %}
{% set Y1 = params.Y1|default(-1)|float %}
{% if first_x == -1 or first_y == -1 %}
{% set first_x = params.FIRST_X|default(-1)|float %}
{% set first_y = params.FIRST_Y|default(-1)|float %}
{% endif %}
{% set total_toolshifts = params.TOTAL_TOOLSHIFTS|default(0)|int %}
{% set initial_tool = params.INITIAL_TOOL|default(default_toolhead)|int %}
{% set start_chamber_temp = params.START_CHAMBER_TEMP|default(0)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set bed_temp = params.BED_TEMP|default(printer.heater_bed.target, true)|float %}
{% set total_layer_count = params.TOTAL_LAYER_COUNT|default(0)|int %}
{% set extruder_first_layer_temp = (params.EXTRUDER_TEMP|default("")).split(",") %}
RATOS_ECHO MSG="First print coordinates X:{first_x} Y:{first_y}"
{% if params.TOTAL_LAYER_COUNT is not defined %}
{% set link_url = "https://os.ratrig.com/docs/slicers" %}
{% set link_text = "RatOS Slicer Configuration" %}
{% set line_1 = '"Your slicer gcode settings are not up to date._N_Learn more about the %s"' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="Incomplete Slicer Configuration detected" TYPE="warning" MSG={line_1}
{% endif %}
SET_PRINT_STATS_INFO CURRENT_LAYER=1
SET_GCODE_VARIABLE MACRO=_ON_LAYER_CHANGE VARIABLE=layer_number VALUE=1
{% if total_layer_count > 0 %}
SET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set swap_toolheads = true if printer["gcode_macro _IDEX_REMAP_TOOLHEADS"].enabled|default(false)|lower == 'true' else false %}
{% if swap_toolheads %}
{% set initial_tool = 0 if initial_tool == 1 else 1 %}
{% endif %}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=active VALUE=True
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=T1 VARIABLE=active VALUE=True
{% endif %}
{% set both_toolheads = true %}
{% if total_toolshifts == 0 %}
{% set both_toolheads = false %}
{% endif %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set parking_position = printer["gcode_macro T%s" % default_toolhead].parking_position|float %}
_IDEX_SINGLE X={parking_position}
{% endif %}
{% if both_toolheads and (idex_mode == "copy" or idex_mode == "mirror") %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Gcode tool changes found. Copy and mirror mode do not support toolchanges.")}
{% endif %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% set both_toolheads = true %}
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=initial_tool VALUE={initial_tool}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=first_x VALUE={first_x}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=first_y VALUE={first_y}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=total_toolshifts VALUE={total_toolshifts}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=both_toolheads VALUE={both_toolheads}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_first_layer_temp VALUE="'{params.EXTRUDER_TEMP}'"
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_other_layer_temp VALUE="'{params.EXTRUDER_OTHER_LAYER_TEMP}'"
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=_TOOLCHANGE VARIABLE=toolshift_count VALUE=0
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set svv = printer.save_variables.variables %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% set parking_position_t0 = printer["gcode_macro T0"].parking_position|float %}
{% set parking_position_t1 = printer["gcode_macro T1"].parking_position|float %}
{% set stepper_x_position_min = printer.configfile.settings.stepper_x.position_min|float %}
{% set stepper_x_position_endstop = printer.configfile.settings.stepper_x.position_endstop|float %}
{% set dual_carriage_position_max = printer.configfile.settings.dual_carriage.position_max|float %}
{% set dual_carriage_position_endstop = printer.configfile.settings.dual_carriage.position_endstop|float %}
{% set x_parking_space = parking_position_t0 - (stepper_x_position_endstop , stepper_x_position_min)|max %}
{% set dc_parking_space = (dual_carriage_position_endstop , dual_carriage_position_max)|min - parking_position_t1 %}
{% if svv.idex_xoffset|abs >= (x_parking_space - 0.5) or svv.idex_xoffset|abs >= (dc_parking_space - 0.5) %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Toolhead x-offset is too high for the available parking space. Calibrate your X and DC endstop positions and make sure you stay below 1mm." % (copy_mode_max_width)) }
{% endif %}
{% endif %}
{% if (idex_mode == "copy" or idex_mode == "mirror") and printer.configfile.settings.ratos.enable_gcode_transform %}
{% if params.MIN_X is not defined or params.MAX_X is not defined %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Something went wrong! Missing important post processor start print parameter!") }
{% endif %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=object_xoffset VALUE=0
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set boundary_box_min_x = params.MIN_X|default(0)|float %}
{% set boundary_box_max_x = params.MAX_X|default(printable_x_max)|float %}
{% set svv = printer.save_variables.variables %}
{% if default_toolhead == 0 %}
{% set boundary_box_max_x = boundary_box_max_x + svv.idex_xoffset %}
{% else %}
{% set boundary_box_min_x = boundary_box_min_x - svv.idex_xoffset %}
{% endif %}
{% set center_x = printable_x_max / 2.0 %}
{% set safe_distance = printer.configfile.settings.dual_carriage.safe_distance|float %}
{% set object_width = boundary_box_max_x - boundary_box_min_x %}
{% set copy_mode_max_width = center_x %}
{% set mirror_mode_max_width = center_x - safe_distance / 2.0 %}
DEBUG_ECHO PREFIX="START_PRINT" MSG="OBJECT_WIDTH: {object_width} BOUNDARY_BOX_MIN_X: {boundary_box_min_x} BOUNDARY_BOX_MAX_X: {boundary_box_max_x} CENTER_X: {center_x} SAFE_DISTANCE: {safe_distance}"
{% if idex_mode == "copy" and object_width > copy_mode_max_width %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Object is too big for copy mode! Max supported width is %s mm" % (copy_mode_max_width)) }
{% endif %}
{% if idex_mode == "mirror" and object_width > mirror_mode_max_width %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Object is too big for mirror mode! Max supported width is %s mm" % (mirror_mode_max_width)) }
{% endif %}
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
{% set object_xoffset = (printable_x_max - boundary_box_max_x - boundary_box_min_x) / 2 %}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=object_xoffset VALUE={object_xoffset}
{% endif %}
{% endif %}
{% set has_initial_toolhead_filament_sensor = true if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool] is defined else false %}
{% if has_initial_toolhead_filament_sensor %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % initial_tool].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s filament sensor is empty." % (initial_tool)) }
{% endif %}
{% endif %}
{% endif %}
{% set has_initial_bowden_filament_sensor = true if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool] is defined else false %}
{% if has_initial_bowden_filament_sensor %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool].enabled|lower == "true" %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % initial_tool].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s bowden sensor is empty." % (initial_tool)) }
{% endif %}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined and both_toolheads %}
{% set has_secondary_toolhead_filament_sensor = true if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)] is defined else false %}
{% if has_secondary_toolhead_filament_sensor %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].enabled|lower == "true" %}
{% if printer["filament_switch_sensor toolhead_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s filament sensor is empty." % (1 if initial_tool == 0 else 0)) }
{% endif %}
{% endif %}
{% endif %}
{% set has_secondary_bowden_filament_sensor = true if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)] is defined else false %}
{% if has_secondary_bowden_filament_sensor %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].enabled|lower == "true" %}
{% if printer["filament_switch_sensor bowden_filament_sensor_t%s" % (1 if initial_tool == 0 else 0)].filament_detected|lower != "true" %}
_LED_START_PRINTING_ERROR
{ action_raise_error("Filament not detected! Toolhead T%s bowden sensor is empty." % (1 if initial_tool == 0 else 0)) }
{% endif %}
{% endif %}
{% endif %}
{% endif %}
_CHAMBER_FILTER_ON AT="before_print_start"
{% if printer["dual_carriage"] is defined %}
{% if printer["gcode_macro _IDEX_JOIN_SPOOLS"].enabled|default(false)|lower == 'true' %}
{% if both_toolheads %}
RATOS_ECHO MSG="Spool join is not possible if both toolheads are in use!"
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% endif %}
{% endif %}
{% endif %}
{% if printer["dual_carriage"] is defined %}
{% if idex_mode == '' %}
_SET_TOOLHEAD_OFFSET T={default_toolhead} MOVE={1 if "xyz" in printer.toolhead.homed_axes else 0}
{% endif %}
{% endif %}
CLEAR_PAUSE
{% if printer["gcode_macro RatOS"].force_absolute_position|lower == 'true' %}
G90
{% endif %}
SAVE_GCODE_STATE NAME=start_print_state
G21
G90
M82
_USER_START_PRINT_BEFORE_HOMING { rawparams }
{% if z_probe_stowable == true %}
STOWABLE_PROBE_BEGIN_BATCH
{% endif %}
MAYBE_HOME
_Z_HOP
{% if idex_mode != '' and not (printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
PARK_TOOLHEAD
{% endif %}
{% if chamber_temp > 0 %}
{% if printer["fan_generic filter"] is defined %}
{% if printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float > 0 %}
SET_FAN_SPEED FAN=filter SPEED={printer["gcode_macro RatOS"].chamber_heater_filter_fan_speed|default(0)|float}
{% endif %}
{% endif %}
_CHAMBER_HEATER_ON START_CHAMBER_TEMP={start_chamber_temp} CHAMBER_TEMP={chamber_temp}
_USER_START_PRINT_HEAT_CHAMBER { rawparams } CHAMBER_TEMP={chamber_temp}
{% endif %}
_START_PRINT_BEFORE_HEATING_BED T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
RATOS_ECHO MSG="Heating bed..."
M190 S{bed_temp}
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
_USER_START_PRINT_AFTER_HEATING_BED { rawparams }
_START_PRINT_AFTER_HEATING_BED T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
_USER_START_PRINT_BED_MESH { rawparams } X0={X0} X1={X1} Y0={Y0} Y1={Y1}
_START_PRINT_BED_MESH X0={X0} X1={X1} Y0={Y0} Y1={Y1} T={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
{% if z_probe_stowable == true %}
STOWABLE_PROBE_END_BATCH
{% endif %}
{% if idex_mode == '' %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={extruder_first_layer_temp[0]|float}
{% else %}
{% if initial_tool == 0 or both_toolheads or (default_toolhead == 0 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={extruder_first_layer_temp[0]|float}
{% endif %}
{% if initial_tool == 1 or both_toolheads or (default_toolhead == 1 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
SET_HEATER_TEMPERATURE HEATER="extruder1" TARGET={extruder_first_layer_temp[1]|float}
{% endif %}
{% endif %}
_USER_START_PRINT_PARK { rawparams }
_START_PRINT_PARK
RATOS_ECHO MSG="Heating Extruder..."
{% if idex_mode == '' %}
TEMPERATURE_WAIT SENSOR="extruder" MINIMUM={extruder_first_layer_temp[0]|float} MAXIMUM={extruder_first_layer_temp[0]|float + 5}
{% else %}
{% if initial_tool == 0 or both_toolheads or (default_toolhead == 0 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
TEMPERATURE_WAIT SENSOR="extruder" MINIMUM={extruder_first_layer_temp[0]|float} MAXIMUM={extruder_first_layer_temp[0]|float + 5}
{% endif %}
{% if initial_tool == 1 or both_toolheads or (default_toolhead == 1 and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero) %}
TEMPERATURE_WAIT SENSOR="extruder1" MINIMUM={extruder_first_layer_temp[1]|float} MAXIMUM={extruder_first_layer_temp[1]|float + 5}
{% endif %}
{% endif %}
{% if hotend_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking hotend for {hotend_heat_soak_time} seconds..."
G4 P{(hotend_heat_soak_time * 1000)}
{% endif %}
{% if idex_mode == '' %}
_LED_PRINTING
{% else %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
_LED_PRINTING
{% else %}
{% if both_toolheads %}
_LED_PRINTING TOOLHEAD={initial_tool}
{% if toolchange_standby_temp > -1 %}
_LED_TOOLHEAD_STANDBY TOOLHEAD={0 if initial_tool == 1 else 1}
{% else %}
_LED_PRINTING TOOLHEAD={0 if initial_tool == 1 else 1}
{% endif %}
{% else %}
_LED_PRINTING TOOLHEAD={initial_tool}
_LED_DEACTIVATE_TOOLHEAD TOOLHEAD={0 if initial_tool == 1 else 1}
{% endif %}
{% endif %}
{% endif %}
_USER_START_PRINT_AFTER_HEATING_EXTRUDER { rawparams } X0={X0} X1={X1} Y0={Y0} Y1={Y1}
_START_PRINT_AFTER_HEATING_EXTRUDER X0={X0} X1={X1} Y0={Y0} Y1={Y1} INITIAL_TOOLHEAD={initial_tool} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode}
{% if idex_mode != '' %}
{% if not both_toolheads %}
{% if initial_tool != default_toolhead %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
{% endif %}
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
{% if toolchange_standby_temp > -1 %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if initial_tool == 1 else 'extruder1'} TARGET={toolchange_standby_temp}
{% endif %}
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% set x_offset = printer.toolhead.position.x|float - printer.gcode_move.gcode_position.x|float %}
{% endif %}
RESTORE_GCODE_STATE NAME=start_print_state
{% if idex_mode != '' %}
{% set act_idex_mode = printer["dual_carriage"].carriage_1|default('')|lower %}
{% if act_idex_mode == "copy" or act_idex_mode == "mirror" %}
SET_GCODE_OFFSET X={x_offset} MOVE=0
{% endif %}
{% endif %}
{% if idex_mode != '' %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
{% if idex_mode == "copy" and idex_mode != act_idex_mode %}
_IDEX_COPY DANCE=0
{% elif idex_mode == "mirror" and idex_mode != act_idex_mode %}
_IDEX_MIRROR DANCE=0
{% endif %}
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
RATOS_ECHO MSG="Adjusting object x-offset by {(object_xoffset)} mm"
SET_GCODE_OFFSET X_ADJUST={object_xoffset} MOVE=0
{% endif %}
{% else %}
_SELECT_TOOL T={initial_tool} TOOLSHIFT=false
{% if initial_tool != default_toolhead %}
{% set svv = printer.save_variables.variables %}
SAVE_VARIABLE VARIABLE=idex_applied_offset VALUE={default_toolhead}
_SET_TOOLHEAD_OFFSET T={initial_tool} MOVE=0
{% endif %}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
_BEACON_SET_NOZZLE_TEMP_OFFSET TOOLHEAD={initial_tool}
{% endif %}
_SET_EXTRUSION_MODE
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=True
{% if printer["gcode_macro _SELECT_TOOL"] is defined %}
SET_GCODE_VARIABLE MACRO=_SELECT_TOOL VARIABLE=last_timestamp VALUE={printer["print_stats"].print_duration}
{% endif %}
_USER_END_START_PRINT { rawparams }
G92 E0
_CHAMBER_FILTER_ON AT="after_print_start"
RATOS_ECHO MSG="Printing..."
[gcode_macro _START_PRINT_BEFORE_HEATING_BED]
gcode =
{% set target_idex_mode = params.IDEX_MODE|default("")|lower %}
{% set initial_toolhead = params.T|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %}
{% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set idex_mode = '' %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% endif %}
{% set act_t = 1 if idex_mode == 'primary' else 0 %}
{% set auto_z_offset_calibration = False %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% set is_fixed = true if printer["gcode_macro _VAOC"].is_fixed|default(true)|lower == 'true' else false %}
{% if printer["gcode_macro _VAOC"].auto_z_offset_calibration|default("false")|lower == 'true' and is_fixed %}
{% if target_idex_mode != "copy" and target_idex_mode != "mirror" %}
{% if both_toolheads or initial_toolhead != default_toolhead %}
{% set auto_z_offset_calibration = True %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set is_stowable_probe = true if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' else false %}
{% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %}
RATOS_ECHO MSG="Pre-heating extruder..."
{% if printer["dual_carriage"] is defined %}
{% if auto_z_offset_calibration %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={min_temp}
SET_HEATER_TEMPERATURE HEATER="extruder1" TARGET={min_temp}
{% else %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET={min_temp}
{% endif %}
{% else %}
SET_HEATER_TEMPERATURE HEATER="extruder" TARGET={min_temp}
{% endif %}
{% endif %}
{% if not is_stowable_probe %}
{% if printer["dual_carriage"] is defined and act_t != default_toolhead %}
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=True
{% endif %}
RATOS_ECHO MSG="Heat soaking z probe..."
{% if auto_z_offset_calibration %}
{% set safe_distance = printer.configfile.settings.dual_carriage.safe_distance|float %}
{% if default_toolhead == 0 %}
_SELECT_TOOL T=0 TOOLSHIFT=false
G1 X{safe_home_x - safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
G1 X{safe_home_x + safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
{% elif default_toolhead == 1 %}
_SELECT_TOOL T=1 TOOLSHIFT=false
G1 X{safe_home_x + safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY
G1 X{safe_home_x - safe_distance / 2} F{speed}
SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY
{% endif %}
{% else %}
_MOVE_TO_SAFE_Z_HOME
{% endif %}
G0 Z2 F{z_speed}
{% endif %}
[gcode_macro _START_PRINT_AFTER_HEATING_BED]
gcode =
{% set target_idex_mode = params.IDEX_MODE|default("")|lower %}
{% set initial_toolhead = params.T|default(default_toolhead)|int %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %}
{% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set auto_z_offset_calibration = False %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro _VAOC"] is defined %}
{% set is_fixed = true if printer["gcode_macro _VAOC"].is_fixed|default(true)|lower == 'true' else false %}
{% if printer["gcode_macro _VAOC"].auto_z_offset_calibration|default("false")|lower == 'true' and is_fixed %}
{% if target_idex_mode != "copy" and target_idex_mode != "mirror" %}
{% if both_toolheads or initial_toolhead != default_toolhead %}
{% set auto_z_offset_calibration = True %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_wipe_before_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_wipe_before_true_zero|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %}
RATOS_ECHO MSG="Waiting for extruder to be preheated..."
{% if printer["dual_carriage"] is defined %}
{% if auto_z_offset_calibration %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
TEMPERATURE_WAIT SENSOR=extruder1 MINIMUM={min_temp} MAXIMUM={max_temp}
{% else %}
{% if default_toolhead == 0 %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
{% else %}
TEMPERATURE_WAIT SENSOR=extruder1 MINIMUM={min_temp} MAXIMUM={max_temp}
{% endif %}
{% endif %}
{% else %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp}
{% endif %}
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
_Z_HOP
{% endif %}
{% if auto_z_offset_calibration %}
{% set parking_position_t0 = printer["gcode_macro T0"].parking_position|float %}
{% set parking_position_t1 = printer["gcode_macro T1"].parking_position|float %}
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=True
PARK_TOOLHEAD
_CLEANING_MOVE TOOLHEAD={default_toolhead}
_SELECT_TOOL T={0 if default_toolhead == 1 else 1} X={parking_position_t0 if default_toolhead == 1 else parking_position_t1} Y=0 TOOLSHIFT=false
_CLEANING_MOVE TOOLHEAD={0 if default_toolhead == 1 else 1}
_VAOC_CALIBRATE_Z_OFFSET AUTO_Z_OFFSET=True
_SELECT_TOOL T={default_toolhead} X={safe_home_x} Y={safe_home_y} TOOLSHIFT=false
{% endif %}
{% set needs_rehoming = False %}
{% if printer.z_tilt is defined and not printer.z_tilt.applied %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% set needs_rehoming = True %}
{% endif %}
{% if printer.quad_gantry_level is defined and not printer.quad_gantry_level.applied %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% set needs_rehoming = True %}
{% endif %}
{% if needs_rehoming %}
G28 Z
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero %}
{% if beacon_contact_wipe_before_true_zero %}
_START_PRINT_AFTER_HEATING_BED_PROBE_FOR_WIPE
{% endif %}
_START_PRINT_AFTER_HEATING_CONTACT_WITH_OPTIONAL_WIPE
{% endif %}
[gcode_macro _START_PRINT_AFTER_HEATING_BED_PROBE_FOR_WIPE]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
G0 Z5 F{z_speed}
G0 X50 Y10 F{speed}
PROBE PROBE_METHOD=contact SAMPLES=1
BEACON_QUERY
[gcode_macro _START_PRINT_AFTER_HEATING_CONTACT_WITH_OPTIONAL_WIPE]
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_true_zero_location = printer["gcode_macro RatOS"].beacon_contact_true_zero_location|default("front")|lower %}
{% set beacon_contact_true_zero_margin_x = printer["gcode_macro RatOS"].beacon_contact_true_zero_margin_x|default(30)|int %}
{% set beacon_contact_wipe_before_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_wipe_before_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_wipe_before_true_zero %}
{% if printer.beacon.last_probe_result|lower == "ok" %}
{% set last_z_offset = printer.beacon.last_z_result %}
RATOS_ECHO MSG="Auto calibration nozzle wipe with probe result {last_z_offset}..."
G0 Z{(0.2 + last_z_offset)} F{z_speed}
G0 X70 F300
{% else %}
RATOS_ECHO MSG="Skipping auto calibration nozzle wipe because probing failed!"
{% endif %}
{% endif %}
G0 Z5 F{z_speed}
_MOVE_TO_SAFE_Z_HOME
RATOS_ECHO MSG="Heating extruder to probing temperature..."
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET={beacon_contact_true_zero_temp}
TEMPERATURE_WAIT SENSOR={"extruder" if default_toolhead == 0 else "extruder1"} MINIMUM={beacon_contact_true_zero_temp} MAXIMUM={beacon_contact_true_zero_temp + 5}
RATOS_ECHO MSG="Beacon contact auto calibration..."
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
G0 Z5 F{z_speed}
[gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER]
gcode =
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set first_x = printer["gcode_macro START_PRINT"].first_x|default(-1)|float %}
{% set first_y = printer["gcode_macro START_PRINT"].first_y|default(-1)|float %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set center_x = printable_x_max / 2.0 %}
{% set center_y = printable_y_max / 2.0 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% if printer["dual_carriage"] is defined %}
{% set speed = printer["gcode_macro RatOS"].toolchange_travel_speed|float * 60 %}
{% endif %}
{% set X0 = params.X0|default(-1)|int %}
{% set X1 = params.X1|default(-1)|int %}
{% set Y0 = params.Y0|default(-1)|int %}
{% set Y1 = params.Y1|default(-1)|int %}
{% set idex_mode = params.IDEX_MODE|default('')|lower %}
{% set both_toolheads = true if params.BOTH_TOOLHEADS|default(true)|lower=='true' else false %}
{% set initial_toolhead = params.INITIAL_TOOLHEAD|default(default_toolhead)|int %}
{% if idex_mode == '' %}
_PRIME
{% else %}
{% if idex_mode == "copy" or idex_mode == "mirror" %}
RATOS_ECHO PREFIX="IDEX" MSG="using combined prime offset for IDEX {idex_mode} mode"
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% else %}
{% if both_toolheads %}
{% if initial_toolhead == 0 %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T1"
_SELECT_TOOL T=1 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T0"
_SELECT_TOOL T=0 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% else %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T0"
_SELECT_TOOL T=0 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T1"
_SELECT_TOOL T=1 TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% endif %}
{% else %}
RATOS_ECHO PREFIX="IDEX" MSG="using prime offset for T{initial_toolhead}"
_SELECT_TOOL T={initial_toolhead} TOOLSHIFT=false
_PRIME INITIAL_TOOLHEAD={initial_toolhead} BOTH_TOOLHEADS={both_toolheads} IDEX_MODE={idex_mode} Y1={Y1}
{% endif %}
{% endif %}
{% endif %}
CACHE_TOOLHEAD_SETTINGS KEY="start_print_after_heating_extruder"
SET_MACRO_TRAVEL_SETTINGS
{% if (X0 > -1 and Y1 > -1) or (first_x > 0 and first_y > 0) %}
{% if printer["dual_carriage"] is defined %}
{% set acceleration = printer["gcode_macro RatOS"].toolchange_travel_accel %}
{% set max_accel = printer.toolhead.max_accel|float %}
{% set square_corner_velocity = printer.toolhead.square_corner_velocity|float %}
SET_VELOCITY_LIMIT ACCEL={acceleration} MINIMUM_CRUISE_RATIO=0 SQUARE_CORNER_VELOCITY=20
{% endif %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
G0 Z3 F{z_speed}
{% endif %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro RatOS"].nozzle_priming|lower == 'false' %}
{% set first_z = 1 %}
{% else %}
{% set first_z = 3 %}
{% endif %}
{% if idex_mode == "mirror" %}
{% if first_y >= 0 %}
G0 Y{first_y} F{speed}
{% else %}
G0 Y{Y1} F{speed}
{% endif %}
{% endif %}
{% if idex_mode != "copy" and idex_mode != "mirror" %}
{% if printer["dual_carriage"] is defined and printer["gcode_macro RatOS"].nozzle_priming|lower == 'false' %}
_MOVE_TO_LOADING_POSITION TOOLHEAD={initial_toolhead}
_PURGE_FILAMENT TOOLHEAD={initial_toolhead} E={printer["gcode_macro RatOS"].toolchange_first_purge|default(50)|float}
_CLEANING_MOVE TOOLHEAD={initial_toolhead}
{% endif %}
{% if first_x >= 0 and first_y >= 0 %}
G0 X{first_x} Y{first_y} Z{first_z} F{speed}
{% else %}
{% set first_x = X0 %}
{% set first_y = Y0 %}
{% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' or printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %}
{% set first_x = X0 %}
{% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %}
{% set first_x = X1 %}
{% else %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_x|float <= center_x %}
{% set first_x = X0 %}
{% else %}
{% set first_x = X1 %}
{% endif %}
{% endif %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %}
{% set first_y = Y0 %}
{% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %}
{% set first_y = Y1 %}
{% else %}
{% if printer["gcode_macro RatOS"].nozzle_prime_start_y|float <= center_y %}
{% set first_y = Y0 %}
{% else %}
{% set first_y = Y1 %}
{% endif %}
{% endif %}
{% endif %}
G0 X{first_x} Y{first_y} Z{first_z} F{speed}
{% endif %}
{% endif %}
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print_after_heating_extruder"
_LOAD_RATOS_SKEW_PROFILE
[gcode_macro _PRIME]
gcode =
{% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' or printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %}
PRIME_BLOB INITIAL_TOOLHEAD={params.INITIAL_TOOLHEAD} BOTH_TOOLHEADS={params.BOTH_TOOLHEADS} IDEX_MODE={params.IDEX_MODE} Y1={params.Y1}
{% endif %}
[gcode_macro END_PRINT]
description = End print procedure, use this in your Slicer.
gcode =
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=is_printing_gcode VALUE=False
SAVE_GCODE_STATE NAME=end_print_state
{% if printer["dual_carriage"] is defined %}
SET_GCODE_VARIABLE MACRO=_IDEX_REMAP_TOOLHEADS VARIABLE=enabled VALUE=False
SET_GCODE_VARIABLE MACRO=_IDEX_JOIN_SPOOLS VARIABLE=enabled VALUE=False
{% if printer["gcode_macro RatOS"].auto_center_subject|default(false)|lower == 'true' %}
{% set object_xoffset = printer["gcode_macro START_PRINT"].object_xoffset|default(0)|float %}
RATOS_ECHO MSG="Adjusting object x-offset by {(0-object_xoffset)} mm"
SET_GCODE_OFFSET X_ADJUST={(0-object_xoffset)}
{% endif %}
{% endif %}
_USER_END_PRINT_BEFORE_HEATERS_OFF { rawparams }
_END_PRINT_BEFORE_HEATERS_OFF
TURN_OFF_HEATERS
_USER_END_PRINT_AFTER_HEATERS_OFF { rawparams }
_END_PRINT_AFTER_HEATERS_OFF
_USER_END_PRINT_PARK { rawparams }
_END_PRINT_PARK
{% if printer["gcode_macro RatOS"].skew_profile is defined %}
SET_SKEW CLEAR=1
{% endif %}
{% if printer["dual_carriage"] is not defined and printer["gcode_macro RatOS"].end_print_motors_off|lower != 'false' %}
M84
{% endif %}
M107
BED_MESH_CLEAR
RATOS_ECHO MSG="Done :)"
RESTORE_GCODE_STATE NAME=end_print_state
{% if printer["dual_carriage"] is defined %}
M84
{% endif %}
{% if printer.configfile.settings.beacon is defined %}
{% if printer["dual_carriage"] is not defined %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
SET_GCODE_OFFSET Z=0 MOVE=0
{% endif %}
{% endif %}
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
{% endif %}
RESTORE_TOOLHEAD_SETTINGS KEY="start_print"
_CHAMBER_FILTER_ON AT="print_end"
_CHAMBER_FILTER_OFF
_CHAMBER_HEATER_OFF
_USER_END_PRINT_FINISHED { rawparams }
[gcode_macro _END_PRINT_BEFORE_HEATERS_OFF]
gcode =
RATOS_ECHO MSG="Cleaning up..."
[gcode_macro _END_PRINT_AFTER_HEATERS_OFF]
gcode =
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set current_z = printer.toolhead.position.z|float %}
{% set z_hop = printer["gcode_macro RatOS"].end_print_park_z_hop|float %}
{% set r = printer["gcode_macro RatOS"].end_print_retract_filament|default(4)|float %}
{% if current_z < (max_z - z_hop) %}
{% set z_safe = z_hop %}
{% else %}
{% set z_safe = max_z - current_z %}
{% endif %}
G91
G1 E-2 F3600
G0 Z{z_safe} F3600
G1 E-{(r-2)} F3600
G90
[gcode_macro _SET_EXTRUSION_MODE]
gcode =
{% if printer["gcode_macro RatOS"].relative_extrusion|lower == 'true' %}
M83
{% else %}
M82
{% endif %}
[gcode_macro GENERATE_SHAPER_GRAPHS]
description = Genarates input shaper resonances graphs for analysis. Uses the AXIS parameter for if you only want to do one axis at a time, (eg. GENERATE_SHAPER_GRAPHS AXIS=X)
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="generate_shaper_graphs"
SET_MACRO_TRAVEL_SETTINGS
CACHE_IS_GRAPH_FILES
_LED_INPUT_SHAPER_START
{% set axis = params.AXIS|default('')|lower %}
{% set freq_start = params.FREQUENCY_START|default(10)|int %}
{% set freq_end = params.FREQUENCY_END|default(133)|int %}
{% set hz_per_sec = params.HZ_PER_SEC|default(1)|float %}
{% if axis != '' %}
{% if axis == 'x' %}
MAYBE_HOME
TEST_RESONANCES AXIS=X FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_x
{% elif axis == 'y' %}
MAYBE_HOME
TEST_RESONANCES AXIS=Y FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_y
{% else %}
{action_raise_error("Unknown axis specified. Expected X or Y.")}
{% endif %}
{% else %}
MAYBE_HOME
TEST_RESONANCES AXIS=X FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
TEST_RESONANCES AXIS=Y FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_shaper_graph_x
RUN_SHELL_COMMAND CMD=generate_shaper_graph_y
{% endif %}
_LED_INPUT_SHAPER_END
RESTORE_TOOLHEAD_SETTINGS KEY="generate_shaper_graphs"
_LEARN_MORE_CALIBRATION
SHOW_IS_GRAPH_FILES TITLE="Shaper graph"
[gcode_shell_command generate_shaper_graph_x]
command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-x.sh
timeout = 60.
verbose = True
[gcode_shell_command generate_shaper_graph_y]
command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-y.sh
timeout = 60.
verbose = True
[gcode_macro MEASURE_COREXY_BELT_TENSION]
description = Generates resonance graph used to ensure belts are equally tensioned.
gcode =
CACHE_TOOLHEAD_SETTINGS KEY="measure_corexy_belt_tension"
SET_MACRO_TRAVEL_SETTINGS
CACHE_IS_GRAPH_FILES
_LED_INPUT_SHAPER_START
{% set freq_start = params.FREQUENCY_START|default(10)|int %}
{% set freq_end = params.FREQUENCY_END|default(133)|int %}
{% set hz_per_sec = params.HZ_PER_SEC|default(1)|float %}
MAYBE_HOME
TEST_RESONANCES AXIS=1,1 OUTPUT=raw_data NAME=belt-tension-upper FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
TEST_RESONANCES AXIS=1,-1 OUTPUT=raw_data NAME=belt-tension-lower FREQ_START={freq_start} FREQ_END={freq_end} HZ_PER_SEC={hz_per_sec}
RUN_SHELL_COMMAND CMD=generate_belt_tension_graph
_LED_INPUT_SHAPER_END
RESTORE_TOOLHEAD_SETTINGS KEY="measure_corexy_belt_tension"
_LEARN_MORE_CALIBRATION
SHOW_IS_GRAPH_FILES TITLE="Belt Tension Graph"
[gcode_shell_command generate_belt_tension_graph]
command = /home/pi/printer_data/config/RatOS/scripts/generate-belt-tension-graph.sh
timeout = 90.
verbose = True
[idle_timeout]
gcode =
{% if printer.webhooks.state|lower == 'ready' %}
{% if printer.pause_resume.is_paused|lower == 'false' %}
RATOS_ECHO PREFIX="IDLE" MSG="2 hours since last activity. Powering off heaters and motors.."
TURN_OFF_HEATERS
M84
{% endif %}
{% endif %}
timeout = 7200
[temperature_sensor raspberry_pi]
sensor_type = temperature_host
[skew_correction]
[input_shaper]
[virtual_sdcard]
path = ~/printer_data/gcodes
[display_status]
[pause_resume]
[force_move]
enable_force_move = True
[respond]
[resonance_generator]
[ratos]
allow_unknown_gcode_generator = True
[exclude_object]
[heater_bed]
heater_pin = heater_bed_heating_pin
sensor_pin = heater_bed_sensor_pin
sensor_type = Generic 3950
min_temp = 0
max_temp = 120
pwm_cycle_time = 0.02
control = pid
pid_kp = 68.203
pid_ki = 2.842
pid_kd = 409.216
[controller_fan controller_fan]
pin = fan_controller_board_pin
[printer]
kinematics = corexy
max_velocity = 300
max_accel = 3000
max_z_velocity = 20
max_z_accel = 350
square_corner_velocity = 5
minimum_cruise_ratio = 0.5
[gcode_macro QUAD_GANTRY_LEVEL]
rename_existing = QUAD_GANTRY_LEVEL_ORIG
gcode =
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
DEPLOY_PROBE
{% endif %}
QUAD_GANTRY_LEVEL_ORIG
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
STOW_PROBE
{% endif %}
[stepper_x]
position_max = 350
position_endstop = 350
step_pin = PC14
dir_pin = !x_dir_pin
enable_pin = !PE6
microsteps = 64
full_steps_per_rotation = 400
rotation_distance = 40
homing_speed = 50
endstop_pin = tmc5160_stepper_x:virtual_endstop
homing_retract_dist = 0
position_min = 0
[stepper_y]
position_max = 350
position_endstop = 350
step_pin = PE5
dir_pin = y_dir_pin
enable_pin = !PE3
microsteps = 64
full_steps_per_rotation = 400
rotation_distance = 40
homing_speed = 50
endstop_pin = tmc5160_stepper_y:virtual_endstop
homing_retract_dist = 0
position_min = 0
[stepper_z]
position_max = 310
step_pin = PG9
dir_pin = !z0_dir_pin
enable_pin = !PG13
microsteps = 32
full_steps_per_rotation = 200
rotation_distance = 40
position_min = -5
homing_speed = 10
endstop_pin = probe:z_virtual_endstop
gear_ratio = 9:1
[bed_mesh]
speed = 300
horizontal_move_z = 10
mesh_min = 20,30
mesh_max = 310,310
fade_start = 0.6
fade_end = 10.0
probe_count = 5,5
algorithm = bicubic
[quad_gantry_level]
gantry_corners =
-60,-10
410,420
points =
50,25
50,275
300,275
300,25
speed = 300
horizontal_move_z = 10
retries = 5
retry_tolerance = 0.0075
max_adjust = 10
[gcode_macro G32]
gcode =
SAVE_GCODE_STATE NAME=STATE_G32
G90
G28
QUAD_GANTRY_LEVEL
G28
G0 X175 Y175 Z30 F3600
RESTORE_GCODE_STATE NAME=STATE_G32
[firmware_retraction]
retract_speed = 60
unretract_extra_length = 0
unretract_speed = 60
retract_length = 0.5
[resonance_tester]
accel_chip_x = beacon
accel_chip_y = beacon
probe_points =
175,175,20
[tmc5160 stepper_x]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD6
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.022
diag1_pin = ^!x_diag_pin
driver_sgt = 0
[tmc5160 stepper_y]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD5
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.022
diag1_pin = ^!y_diag_pin
driver_sgt = 0
[tmc5160 stepper_z]
stealthchop_threshold = 0
interpolate = False
cs_pin = PD2
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[tmc5160 stepper_z1]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA15
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z1]
step_pin = PG11
dir_pin = !z1_dir_pin
enable_pin = !PG12
microsteps = 32
full_steps_per_rotation = 200
rotation_distance = 40
gear_ratio = 9:1
[tmc5160 stepper_z2]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA9
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z2]
step_pin = PB4
dir_pin = !z2_dir_pin
enable_pin = !PB5
microsteps = 32
full_steps_per_rotation = 200
rotation_distance = 40
gear_ratio = 9:1
[tmc5160 stepper_z3]
stealthchop_threshold = 0
interpolate = False
cs_pin = PA10
spi_software_mosi_pin = PC8
spi_software_miso_pin = PC7
spi_software_sclk_pin = PC6
run_current = 0.8
sense_resistor = 0.075
[stepper_z3]
step_pin = PG15
dir_pin = !z3_dir_pin
enable_pin = !PG14
microsteps = 32
full_steps_per_rotation = 200
rotation_distance = 40
gear_ratio = 9:1
[tmc2209 extruder]
stealthchop_threshold = 0
interpolate = False
uart_pin = toolboard_t0:PB5
run_current = 0.707
driver_tbl = 0
driver_toff = 4
driver_hend = 6
driver_hstrt = 7
sense_resistor = 0.11
[beacon]
serial = /dev/beacon
x_offset = 0
y_offset = 22.5
mesh_main_direction = x
mesh_runs = 1
speed = 15.
lift_speed = 80.
contact_max_hotend_temperature = 275
[delayed_gcode _BEACON_INIT]
initial_duration = 1
gcode =
_BEACON_SET_NOZZLE_TEMP_OFFSET RESET=True
{% set svv = printer.save_variables.variables %}
{% set nozzle_expansion_coefficient_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(0)|float %}
{% if nozzle_expansion_coefficient_multiplier == 0 %}
{% if printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier is not defined %}
{% set nozzle_expansion_coefficient_multiplier = 1.0 %}
{% else %}
{% set nozzle_expansion_coefficient_multiplier = printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier|default(1.0)|float %}
{% endif %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_multiplier VALUE={nozzle_expansion_coefficient_multiplier}
{% endif %}
{% if printer["gcode_macro RatOS"].beacon_contact_expansion_multiplier is defined %}
CONSOLE_ECHO TITLE="Deprecated gcode variable" TYPE="warning" MSG={'"Please remove the variable beacon_contact_expansion_multiplier from your config file."'}
{% endif %}
[gcode_macro BEACON_RATOS_CALIBRATION]
gcode =
RATOS_ECHO MSG="Did you mean BEACON_RATOS_CALIBRATE?"
[gcode_macro BEACON_RATOS_CALIBRATE]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
BEACON_INITIAL_CALIBRATION _AUTOMATED=True
{% if beacon_contact_start_print_true_zero %}
BEACON_POKE_TEST _AUTOMATED=True
_BEACON_CHECK_POKE
{% if printer["dual_carriage"] is not defined %}
BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET _AUTOMATED=True
{% endif %}
{% endif %}
{% if chamber_temp > 0 %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
BEACON_FINAL_CALIBRATION _AUTOMATED=True BED_TEMP={bed_temp} CHAMBER_TEMP={chamber_temp}
{% if beacon_contact_start_print_true_zero %}
BEACON_MEASURE_GANTRY_TWIST
_BEACON_MAYBE_SCAN_COMPENSATION
{% endif %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% if chamber_temp > 0 %}
_CHAMBER_HEATER_OFF
{% endif %}
{% if beacon_contact_start_print_true_zero %}
{% if printer["dual_carriage"] is not defined %}
_BEACON_ECHO_NOZZLE_TEMP_OFFSETS
{% endif %}
_BEACON_ECHO_POKE
{% endif %}
RATOS_ECHO MSG="Beacon calibration finished!"
_LED_BEACON_CALIBRATION_END
RATOS_ECHO MSG="Saving config and restarting klipper..."
SAVE_CONFIG
[gcode_macro BEACON_INITIAL_CALIBRATION]
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed * 60 %}
MAYBE_HOME X=True Y=True
_LED_BEACON_CALIBRATION_START
G90
_MOVE_TO_SAFE_Z_HOME
BEACON_AUTO_CALIBRATE
_Z_HOP
RATOS_ECHO MSG="Initial beacon contact calibration finished!"
{% if not automated %}
_CONSOLE_SAVE_CONFIG
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro BEACON_FINAL_CALIBRATION]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
_BEACON_HOME_AND_ABL
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
_LED_BEACON_CALIBRATION_START
G90
G0 Z2 F{z_hop_speed}
RATOS_ECHO MSG="Waiting for calibration temperature..."
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=150
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp}
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} MAXIMUM={(bed_temp + 5)}
TEMPERATURE_WAIT SENSOR={'extruder' if default_toolhead == 0 else 'extruder1'} MINIMUM=150 MAXIMUM=155
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
_Z_HOP
BEACON_AUTO_CALIBRATE
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% endif %}
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_OFF
{% endif %}
_Z_HOP
RATOS_ECHO MSG="Final beacon contact calibration finished!"
{% if not automated %}
_CONSOLE_SAVE_CONFIG
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro BEACON_POKE_TEST]
variable_poke_result_1 = -1
variable_poke_result_2 = -1
variable_poke_result_3 = -1
variable_poke_result_4 = -1
variable_poke_result_5 = -1
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %}
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_1 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_2 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_3 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_4 VALUE=-1
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE=poke_result_5 VALUE=-1
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
G0 Z5 F{z_hop_speed}
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=1
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=2
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=3
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=4
_BEACON_PROBE_POKE
_BEACON_STORE_POKE I=5
_Z_HOP
RATOS_ECHO MSG="Beacon poke test finished!"
{% if not automated %}
_BEACON_ECHO_POKE
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro _BEACON_PROBE_POKE]
gcode =
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
BEACON_POKE speed=3 top=5 bottom={poke_bottom}
BEACON_QUERY
[gcode_macro _BEACON_STORE_POKE]
gcode =
{% set i = params.I|default(1)|int %}
{% set last_z = printer.beacon.last_poke_result|default(0)|float %}
{% if printer.beacon.last_poke_result|lower != "none" %}
{% if printer.beacon.last_poke_result.error == 0 %}
SET_GCODE_VARIABLE MACRO=BEACON_POKE_TEST VARIABLE={"poke_result_%s" % i} VALUE={printer.beacon.last_poke_result.latency}
{% endif %}
{% endif %}
[gcode_macro _BEACON_CHECK_POKE]
gcode =
{% set p1 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_1|int %}
{% set p2 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_2|int %}
{% set p3 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_3|int %}
{% set p4 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_4|int %}
{% set p5 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_5|int %}
{% if p1 == -1 or p2 == -1 or p3 == -1 or p4 == -1 or p5 == -1 %}
_LED_BEACON_CALIBRATION_ERROR
{ action_raise_error("Beacon poke test error!") }
{% endif %}
{% set avg = (p1 + p2 + p3 + p4 + p5) / 5 %}
{% if avg > 6 %}
_LED_BEACON_CALIBRATION_ERROR
{ action_raise_error("Beacon poke test failed!") }
{% endif %}
[gcode_macro _BEACON_ECHO_POKE]
gcode =
{% set p1 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_1|int %}
{% set p2 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_2|int %}
{% set p3 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_3|int %}
{% set p4 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_4|int %}
{% set p5 = printer["gcode_macro BEACON_POKE_TEST"].poke_result_5|int %}
{% set avg = (p1 + p2 + p3 + p4 + p5) / 5 %}
{% if avg <= 1 %}
{% set type = "success" %}
{% set note = "Extremely low noise, rarely achieved" %}
{% elif avg > 1 and avg <= 4 %}
{% set type = "info" %}
{% set note = "Excellent performance for a typical printer" %}
{% elif avg > 4 and avg <= 8 %}
{% set type = "warning" %}
{% set note = "Acceptable performance, machine may have considerable cyclic axis noise" %}
{% elif avg > 8 and avg <= 11 %}
{% set type = "alert" %}
{% set note = "Not ideal, may want to verify proper mounting or use thinner stackups" %}
{% elif avg > 11 %}
{% set type = "alert" %}
{% set note = "Reason for concern, present setup may be risky to continue with" %}
{% endif %}
CONSOLE_ECHO TITLE="Beacon poke test result:" TYPE={type} MSG={'"Average latency: %.2f_N_%s"' % (avg, note)}
[gcode_macro BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET]
variable_reference_z = 0.0
gcode =
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set test_margin = 30 %}
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero %}
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
RATOS_ECHO PREFIX="BEACON" MSG="Nozzle temperature offset calibration..."
{% for i in range(10) %}
beacon_poke speed=3 top=5 bottom={poke_bottom}
{% endfor %}
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=150
_BEACON_PROBE_NOZZLE_TEMP_OFFSET TEMP=250
_BEACON_STORE_NOZZLE_TEMP_OFFSET TEMP=250
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET=0
{% if not automated %}
_BEACON_ECHO_NOZZLE_TEMP_OFFSETS
{% endif %}
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
{% endif %}
[gcode_macro _BEACON_PROBE_NOZZLE_TEMP_OFFSET]
gcode =
{% set temp = params.TEMP|int %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set hotend_heat_soak_time = printer["gcode_macro RatOS"].hotend_heat_soak_time|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% set idex_zcontrolpoint = svv.idex_zcontrolpoint|default(150)|float %}
RATOS_ECHO PREFIX="BEACON" MSG="Waiting for nozzle to reach {temp}°C..."
SET_HEATER_TEMPERATURE HEATER={"extruder" if default_toolhead == 0 else "extruder1"} TARGET={temp}
TEMPERATURE_WAIT SENSOR={"extruder" if default_toolhead == 0 else "extruder1"} MINIMUM={temp} MAXIMUM={temp + 2}
{% if hotend_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking hotend for {hotend_heat_soak_time} seconds..."
G4 P{(hotend_heat_soak_time * 1000)}
{% endif %}
RATOS_ECHO PREFIX="BEACON" MSG="Probing with nozzle temperature {temp}°C..."
PROBE PROBE_METHOD=contact PROBE_SPEED=3 LIFT_SPEED=15 SAMPLES=5 SAMPLE_RETRACT_DIST=3 SAMPLES_TOLERANCE=0.005 SAMPLES_TOLERANCE_RETRIES=10 SAMPLES_RESULT=median
BEACON_QUERY
G0 Z5 F{z_speed}
[gcode_macro _BEACON_STORE_NOZZLE_TEMP_OFFSET]
gcode =
{% set temp = params.TEMP|int %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% set last_z = printer.beacon.last_z_result|default(0)|float %}
{% if temp == 150 %}
SET_GCODE_VARIABLE MACRO=BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET VARIABLE=reference_z VALUE={last_z}
{% else %}
{% set reference_z = printer["gcode_macro BEACON_CALIBRATE_NOZZLE_TEMP_OFFSET"].reference_z|default(0)|float %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_t{default_toolhead} VALUE={(last_z - reference_z)}
{% endif %}
[gcode_macro _BEACON_ECHO_NOZZLE_TEMP_OFFSETS]
gcode =
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set svv = printer.save_variables.variables %}
{% if default_toolhead == 0 %}
CONSOLE_ECHO TYPE="info" MSG={'"T0 expansion coefficient %.6f"' % svv.nozzle_expansion_coefficient_t0}
{% else %}
CONSOLE_ECHO TYPE="info" MSG={'"T1 expansion coefficient %.6f"' % svv.nozzle_expansion_coefficient_t1}
{% endif %}
[gcode_macro _BEACON_SET_NOZZLE_TEMP_OFFSET]
variable_runtime_temp = 0
gcode =
{% set toolhead = params.TOOLHEAD|default(0)|int %}
{% set reset = true if params.RESET|default(false)|lower == 'true' else false %}
{% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set svv = printer.save_variables.variables %}
{% if reset %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_applied_offset VALUE=0
{% else %}
{% if beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
{% set nozzle_expansion_coefficient_t0 = svv.nozzle_expansion_coefficient_t0|default(0)|float %}
{% if printer["dual_carriage"] is defined %}
{% set nozzle_expansion_coefficient_t1 = svv.nozzle_expansion_coefficient_t1|default(0)|float %}
{% endif %}
{% set nozzle_expansion_coefficient_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(1.0)|float %}
{% set applied_offset = svv.nozzle_expansion_applied_offset|default(0)|float %}
{% set temp = printer['extruder' if toolhead == 0 else 'extruder1'].target|float %}
{% set temp_offset = temp - beacon_contact_true_zero_temp %}
{% set expansion_coefficient = nozzle_expansion_coefficient_t0 if toolhead == 0 else nozzle_expansion_coefficient_t1 %}
{% set expansion_offset = nozzle_expansion_coefficient_multiplier * (temp_offset * (expansion_coefficient / 100)) %}
{% set new_offset = ((-applied_offset) + expansion_offset) %}
SET_GCODE_OFFSET Z_ADJUST={new_offset} MOVE=1 SPEED={z_speed}
SAVE_VARIABLE VARIABLE=nozzle_expansion_applied_offset VALUE={expansion_offset}
SET_GCODE_VARIABLE MACRO=_BEACON_SET_NOZZLE_TEMP_OFFSET VARIABLE=runtime_temp VALUE={temp}
RATOS_ECHO PREFIX="BEACON" MSG={'"Nozzle expansion offset of %.6fmm applied to T%s"' % (expansion_offset, toolhead)}
DEBUG_ECHO PREFIX="_BEACON_SET_NOZZLE_TEMP_OFFSET" MSG="multiplier: {nozzle_expansion_coefficient_multiplier}, coefficient: {expansion_coefficient}, temp_offset: {temp_offset}, expansion_offset: {expansion_offset}, applied_offset: {applied_offset}, new_offset: {new_offset}"
{% endif %}
{% endif %}
[gcode_macro BEACON_MEASURE_GANTRY_TWIST]
variable_needs_compensation = False
variable_reference_z = 0.0
variable_front = 0.0
variable_front_left = 0.0
variable_front_right = 0.0
variable_back = 0.0
variable_back_left = 0.0
variable_back_right = 0.0
variable_right = 0.0
variable_left = 0.0
variable_margin_x = 40
variable_margin_y = 40
gcode =
{% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %}
{% set printable_x_max = printer["gcode_macro RatOS"].printable_x_max|float %}
{% set printable_y_max = printer["gcode_macro RatOS"].printable_y_max|float %}
{% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %}
{% if safe_home_x is not defined or safe_home_x|lower == 'middle' %}
{% set safe_home_x = printable_x_max / 2 %}
{% endif %}
{% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %}
{% if safe_home_y is not defined or safe_home_y|lower == 'middle' %}
{% set safe_home_y = printable_y_max / 2 %}
{% endif %}
{% set poke_bottom = printer["gcode_macro RatOS"].beacon_contact_poke_bottom_limit|default(-1)|float %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% if beacon_contact_start_print_true_zero %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=False
_BEACON_HOME_AND_ABL
_LED_BEACON_CALIBRATION_START
RATOS_ECHO PREFIX="BEACON" MSG="Measure gantry twist..."
{% for i in range(10) %}
beacon_poke speed=3 top=5 bottom={poke_bottom}
{% endfor %}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="center"
G0 X{margin_x} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front_left"
G0 X{safe_home_x} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front"
G0 X{(printable_x_max - margin_x)} Y{margin_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="front_right"
G0 X{(printable_x_max - margin_x)} Y{safe_home_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="right"
G0 X{(printable_x_max - margin_x)} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back_right"
G0 X{safe_home_x} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back"
G0 X{margin_x} Y{(printable_y_max - margin_y)} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="back_left"
G0 X{margin_x} Y{safe_home_y} F{speed}
_BEACON_PROBE_GANTRY_TWIST
_BEACON_STORE_GANTRY_TWIST LOCATION="left"
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
_BEACON_ECHO_GANTRY_TWIST
_LED_BEACON_CALIBRATION_END
{% endif %}
[gcode_macro _BEACON_PROBE_GANTRY_TWIST]
gcode =
RATOS_ECHO PREFIX="BEACON" MSG="Probing..."
BEACON_OFFSET_COMPARE
BEACON_QUERY
[gcode_macro _BEACON_STORE_GANTRY_TWIST]
gcode =
{% set location = params.LOCATION|lower %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set last_z = printer.beacon.last_offset_result["delta"]|default(0)|float %}
{% if location == "center" %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=reference_z VALUE={last_z}
{% else %}
{% set reference_z = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].reference_z|default(0)|float %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE={location} VALUE={(last_z - reference_z)}
{% endif %}
[gcode_macro _BEACON_ECHO_GANTRY_TWIST]
gcode =
{% set reference_z = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].reference_z|default(0)|float * 1000 %}
{% set front_left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front_left|default(0)|float * 1000 %}
{% set front = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front|default(0)|float * 1000 %}
{% set front_right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].front_right|default(0)|float * 1000 %}
{% set right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].right|default(0)|float * 1000 %}
{% set back_right = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back_right|default(0)|float * 1000 %}
{% set back = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back|default(0)|float * 1000 %}
{% set back_left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].back_left|default(0)|float * 1000 %}
{% set left = printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].left|default(0)|float * 1000 %}
{% set line_1 = "Front left: %.6fμm" % (front_left) %}
{% set line_2 = "Front center: %.6fμm" % (front) %}
{% set line_3 = "Front right: %.6fμm" % (front_right) %}
{% set line_4 = "Left center: %.6fμm" % (left) %}
{% set line_5 = "Right center: %.6fμm" % (right) %}
{% set line_6 = "Back left: %.6fμm" % (back_left) %}
{% set line_7 = "Back center: %.6fμm" % (back) %}
{% set line_8 = "Back right: %.6fμm" % (back_right) %}
{% set max_value = [(front_left|abs), (front|abs), (front_right|abs), (left|abs), (right|abs), (back_left|abs), (back|abs), (back_right|abs)]|max %}
{% if max_value <= 50 %}
{% set type = "success" %}
{% set recommendation = "Very low gantry twist: %.6fμm._N_No beacon scan compensation needed." % max_value %}
{% elif max_value > 50 and max_value <= 100 %}
{% set type = "info" %}
{% set recommendation = "Low gantry twist: %.6fμm._N_You may experience first layer inconsistensies, consider beacon scan compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 100 and max_value <= 150 %}
{% set type = "warning" %}
{% set recommendation = "High gantry twist: %.6fμm._N_High chance of first layer problems, beacon scan compensation is highly encouraged." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 150 and max_value <= 200 %}
{% set type = "alert" %}
{% set recommendation = "Very High gantry twist: %.6fμm._N_You will encounter first layer problems on large prints unless you activate beacon scan compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% elif max_value > 200 %}
{% set type = "alert" %}
{% set recommendation = "Extremely high gantry twist: %.6fμm._N_You have significant scan/contact inconsistency which is indicative of mechanical problems, please investigate before resorting to software compensation." % max_value %}
SET_GCODE_VARIABLE MACRO=BEACON_MEASURE_GANTRY_TWIST VARIABLE=needs_compensation VALUE=True
{% endif %}
CONSOLE_ECHO TITLE="Gantry twist relative to the center" TYPE={type} MSG={'"_N_%s_N__N_%s_N_%s_N_%s_N_%s_N_%s_N_%s_N_%s_N_%s"' % (recommendation, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8)}
[gcode_macro BEACON_CREATE_SCAN_COMPENSATION_MESH]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set profile = params.PROFILE|default("Contact")|string %}
{% set automated = true if params._AUTOMATED|default(false)|lower == 'true' else false %}
{% set default_toolhead = printer["gcode_macro RatOS"].default_toolhead|default(0)|int %}
{% set beacon_scan_compensation_enable = true if printer["gcode_macro RatOS"].beacon_scan_compensation_enable|default(false)|lower == 'true' else false %}
{% set probe_count = printer["gcode_macro RatOS"].beacon_scan_compensation_probe_count %}
{% set bed_heat_soak_time = printer["gcode_macro RatOS"].bed_heat_soak_time|default(0)|int %}
{% if not beacon_scan_compensation_enable %}
RATOS_ECHO MSG="Beacon scan compensation is disabled!"
{% else %}
MAYBE_HOME
_MOVE_TO_SAFE_Z_HOME
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
_LED_BEACON_CALIBRATION_START
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_ON CHAMBER_TEMP={chamber_temp}
{% endif %}
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=150
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp}
RATOS_ECHO MSG="Please wait..."
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} MAXIMUM={(bed_temp + 5)}
TEMPERATURE_WAIT SENSOR={'extruder' if default_toolhead == 0 else 'extruder1'} MINIMUM=150 MAXIMUM=155
{% endif %}
{% if not automated %}
{% if bed_heat_soak_time > 0 %}
RATOS_ECHO MSG="Heat soaking bed for {bed_heat_soak_time} seconds..."
G4 P{(bed_heat_soak_time * 1000)}
{% endif %}
{% endif %}
{% if printer.z_tilt is defined %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% endif %}
{% if printer.quad_gantry_level is defined %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% endif %}
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
BED_MESH_CALIBRATE PROBE_METHOD=contact USE_CONTACT_AREA=1 SAMPLES=2 SAMPLES_DROP=1 SAMPLES_TOLERANCE_RETRIES=10 PROBE_COUNT={probe_count[0]},{probe_count[1]} PROFILE={profile}
{% if not automated %}
SET_HEATER_TEMPERATURE HEATER={'extruder' if default_toolhead == 0 else 'extruder1'} TARGET=0
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0
{% endif %}
{% if chamber_temp > 0 and not automated %}
_CHAMBER_HEATER_OFF
{% endif %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% if not automated %}
_LED_BEACON_CALIBRATION_END
{% endif %}
RATOS_ECHO MSG="Beacon scan compensation mesh created!"
{% if not automated %}
RATOS_ECHO MSG="Saving config and restarting klipper..."
SAVE_CONFIG
{% endif %}
{% endif %}
[gcode_macro _BEACON_APPLY_SCAN_COMPENSATION]
gcode =
{% set beacon_scan_compensation_profile = printer["gcode_macro RatOS"].beacon_scan_compensation_profile %}
{% set beacon_scan_compensation_enable = true if printer["gcode_macro RatOS"].beacon_scan_compensation_enable|default(false)|lower == 'true' else false %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_SCAN_COMPENSATION" MSG="beacon_scan_compensation_profile {beacon_scan_compensation_profile}, beacon_scan_compensation_enable {beacon_scan_compensation_enable}"
{% if beacon_scan_compensation_enable %}
BEACON_APPLY_SCAN_COMPENSATION PROFILE={beacon_scan_compensation_profile}
{% endif %}
[gcode_macro _BEACON_MAYBE_SCAN_COMPENSATION]
gcode =
{% set bed_temp = params.BED_TEMP|default(85)|int %}
{% set chamber_temp = params.CHAMBER_TEMP|default(0)|int %}
{% set needs_scan_compensation = true if printer["gcode_macro BEACON_MEASURE_GANTRY_TWIST"].needs_compensation|default(false)|lower == 'true' else false %}
{% if needs_scan_compensation %}
BEACON_CREATE_SCAN_COMPENSATION_MESH _AUTOMATED=True BED_TEMP={bed_temp} CHAMBER_TEMP={chamber_temp}
{% endif %}
[gcode_macro _BEACON_HOME_AND_ABL]
gcode =
MAYBE_HOME X=True Y=True
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% set needs_rehoming = False %}
{% if printer.z_tilt is defined and not printer.z_tilt.applied %}
RATOS_ECHO MSG="Adjusting Z tilt..."
Z_TILT_ADJUST
RATOS_ECHO MSG="Rehoming Z after Z tilt adjustment..."
{% set needs_rehoming = True %}
{% endif %}
{% if printer.quad_gantry_level is defined and not printer.quad_gantry_level.applied %}
RATOS_ECHO MSG="Running quad gantry leveling..."
QUAD_GANTRY_LEVEL
RATOS_ECHO MSG="Rehoming Z after quad gantry leveling..."
{% set needs_rehoming = True %}
{% endif %}
_MOVE_TO_SAFE_Z_HOME Z_HOP=True
{% if needs_rehoming %}
BEACON_AUTO_CALIBRATE SKIP_MODEL_CREATION=1
{% endif %}
[gcode_macro _BEACON_SAVE_MULTIPLIER]
gcode =
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set multiplier = printer["gcode_macro _BEACON_APPLY_RUNTIME_MULTIPLIER"].runtime_multiplier|default(-1.0)|float %}
DEBUG_ECHO PREFIX="_BEACON_SAVE_MULTIPLIER" MSG="multiplier: {multiplier}, beacon_contact_start_print_true_zero: {beacon_contact_start_print_true_zero}, beacon_contact_expansion_compensation: {beacon_contact_expansion_compensation}"
{% if multiplier > 0 and beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
SAVE_VARIABLE VARIABLE=nozzle_expansion_coefficient_multiplier VALUE={multiplier}
SET_GCODE_VARIABLE MACRO=_BEACON_APPLY_RUNTIME_MULTIPLIER VARIABLE=runtime_multiplier VALUE=-1.0
CONSOLE_ECHO TITLE="Hotend thermal expansion compensation" TYPE="success" MSG={'"New value is: %.6f_N_The new multiplier value has been saved to the configuration."' % multiplier}
{% else %}
Z_OFFSET_APPLY_PROBE
{% endif %}
[gcode_macro _BEACON_APPLY_RUNTIME_MULTIPLIER]
variable_runtime_multiplier = -1.0
gcode =
{% set toolhead = 0 %}
{% if printer["dual_carriage"] is defined %}
{% set idex_mode = printer["dual_carriage"].carriage_1|lower %}
{% set toolhead = 1 if idex_mode == 'primary' else 0 %}
{% endif %}
{% set beacon_contact_true_zero_temp = printer["gcode_macro RatOS"].beacon_contact_true_zero_temp|default(150)|int %}
{% set beacon_contact_start_print_true_zero = true if printer["gcode_macro RatOS"].beacon_contact_start_print_true_zero|default(false)|lower == 'true' else false %}
{% set beacon_contact_expansion_compensation = true if printer["gcode_macro RatOS"].beacon_contact_expansion_compensation|default(false)|lower == 'true' else false %}
{% set layer_number = printer["gcode_macro _ON_LAYER_CHANGE"].layer_number|default(0)|int %}
{% set is_printing_gcode = true if printer["gcode_macro START_PRINT"].is_printing_gcode|default(true)|lower == 'true' else false %}
{% if layer_number == 0 and is_printing_gcode %}
{% set link_url = "https://os.ratrig.com/docs/slicers" %}
{% set link_text = "RatOS Slicer Documentation" %}
{% set line_1 = '"Your slicer is not correctly reporting layer information. See the layer change custom g-code in the %s".' % (link_url, link_text) %}
CONSOLE_ECHO TITLE="Missing layer information" TYPE="warning" MSG={line_1}
{% endif %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_RUNTIME_MULTIPLIER" MSG="layer_number: {layer_number}, is_printing_gcode: {is_printing_gcode}, beacon_contact_start_print_true_zero: {beacon_contact_start_print_true_zero}, beacon_contact_expansion_compensation: {beacon_contact_expansion_compensation}"
{% if layer_number == 1 and is_printing_gcode and printer.configfile.settings.beacon is defined and beacon_contact_start_print_true_zero and beacon_contact_expansion_compensation %}
{% set svv = printer.save_variables.variables %}
{% set nozzle_expansion_coefficient = svv.nozzle_expansion_coefficient_t0|default(0)|float %}
{% if toolhead == 1 %}
{% set nozzle_expansion_coefficient = svv.nozzle_expansion_coefficient_t1|default(0)|float %}
{% endif %}
{% set beacon_contact_expansion_multiplier = svv.nozzle_expansion_coefficient_multiplier|default(1.0)|float %}
{% set print_temp = printer["gcode_macro _BEACON_SET_NOZZLE_TEMP_OFFSET"].runtime_temp|default(0)|int %}
{% if print_temp > 0 %}
{% set z_offset = printer.gcode_move.homing_origin.z|float %}
{% set temp_delta = print_temp - beacon_contact_true_zero_temp %}
{% set coefficient_per_degree = nozzle_expansion_coefficient / 100 %}
{% set z_offset_per_degree = z_offset / temp_delta %}
{% set new_multiplier = z_offset_per_degree / coefficient_per_degree %}
DEBUG_ECHO PREFIX="_BEACON_APPLY_RUNTIME_MULTIPLIER" MSG="print_temp: {print_temp}, z_offset: {z_offset}, temp_delta: {temp_delta}, nozzle_expansion_coefficient: {nozzle_expansion_coefficient}, coefficient_per_degree: {coefficient_per_degree}, z_offset_per_degree: {z_offset_per_degree}, old_multiplier: {beacon_contact_expansion_multiplier}, new_multiplier: {new_multiplier}"
SET_GCODE_VARIABLE MACRO=_BEACON_APPLY_RUNTIME_MULTIPLIER VARIABLE=runtime_multiplier VALUE={new_multiplier}
{% endif %}
{% endif %}
[gcode_macro T0]
variable_join = 0
variable_remap = 0
variable_alert = ""
variable_filament_name = ""
variable_filament_type = ""
variable_filament_temp = 0
variable_runout_sensor = ""
variable_active = True
variable_color = "7bff33"
variable_hotend_type = "SF"
variable_has_cht_nozzle = True
variable_cooling_position_to_nozzle_distance = 40
variable_tooolhead_sensor_to_extruder_gear_distance = 15
variable_extruder_gear_to_cooling_position_distance = 30
variable_filament_loading_nozzle_offset = -5
variable_filament_grabbing_length = 5
variable_filament_grabbing_speed = 1
variable_enable_insert_detection = True
variable_enable_runout_detection = True
variable_enable_clog_detection = True
variable_unload_after_runout = True
variable_purge_after_load = 0
variable_purge_before_unload = 0
variable_extruder_load_speed = 60
variable_filament_load_speed = 10
variable_standby = False
variable_temperature_offset = 0
variable_has_oozeguard = False
variable_has_front_arm_nozzle_wiper = False
variable_resume_after_insert = False
gcode =
{% set x = params.X|default(-1.0)|float %}
{% set y = params.Y|default(-1.0)|float %}
{% set z = params.Z|default(0.0)|float %}
{% set s = params.S|default(1)|int %}
{% if printer["gcode_macro _SELECT_TOOL"] is defined %}
_SELECT_TOOL T=0 X={x} Y={y} Z={z} TOOLSHIFT={s}
{% endif %}
[save_variables]
filename = /home/pi/printer_data/config/ratos-variables.cfg
=======================
Extruder max_extrude_ratio=0.415752
mcu 'mcu': Starting serial connect
webhooks client 4131501008: New connection
webhooks client 4131501008: Client info {'program': 'Moonraker', 'version': 'v0.9.3-0-g71f9e67'}
Loaded MCU 'mcu' 118 commands (v0.12.0-396-gb7233d119 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34)
MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 BUS_PINS_i2c3_PA8_PC9=PA8,PC9 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 BUS_PINS_spi3a=PC11,PC12,PC10 BUS_PINS_spi4=PE13,PE14,PE12 BUS_PINS_spi5=PF8,PF9,PF7 BUS_PINS_spi5a=PH7,PF11,PH6 BUS_PINS_spi6=PG12,PG14,PG13 CLOCK_FREQ=400000000 MCU=stm32h723xx PWM_MAX=255 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PH0,PH1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1
mcu 'rpi': Starting connect
Loaded MCU 'rpi' 119 commands (?-20240727_132503-fv-az659-741 / gcc: (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110 binutils: (GNU Binutils for Raspbian) 2.35.2)
MCU 'rpi' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256
mcu 'toolboard_t0': Starting serial connect
Loaded MCU 'toolboard_t0' 100 commands (v0.12.0-396-gb7233d119 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34)
MCU 'toolboard_t0' config: ADC_MAX=4095 BUS_PINS_i2c1=PB6,PB7 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB7=PB8,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c1_PF1_PF0=PF1,PF0 BUS_PINS_i2c1a=PF1,PF0 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 CLOCK_FREQ=48000000 MCU=stm32f042x6 RESERVE_PINS_USB=PA11,PA12 RESERVE_PINS_crystal=PF0,PF1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1
mcu_temperature 'mcu' nominal base=-275.577689 slope=1631.474104
mcu_temperature 'toolboard_t0' nominal base=342.920354 slope=-724.778761
mcu 'beacon': Starting serial connect
Loaded MCU 'beacon' 45 commands (Beacon 2.1.0 / )
MCU 'beacon' config: ADC_MAX=4095 BEACON_ACCEL_BITS=12 BEACON_ACCEL_SCALE_16G=7.81 BEACON_ACCEL_SCALE_2G=0.98 BEACON_ACCEL_SCALE_4G=1.95 BEACON_ACCEL_SCALE_8G=3.91 BEACON_ADC_SMOOTH_COUNT=16 BEACON_HAS_ACCEL=1 BEACON_REV=H CLOCK_FREQ=32000000 MCU=beacon STATS_SUMSQ_BASE=256
Config error
Traceback (most recent call last):
File "/home/pi/klipper/klippy/klippy.py", line 135, in _connect
cb()
File "/home/pi/klipper/klippy/mcu.py", line 748, in _connect
self._send_config(None)
File "/home/pi/klipper/klippy/mcu.py", line 679, in _send_config
cb()
File "/home/pi/klipper/klippy/mcu.py", line 456, in _build_config
raise pins.error("shutdown value must be 0.0 or 1.0 on soft pwm")
pins.error: shutdown value must be 0.0 or 1.0 on soft pwm