# 7704: Git version: 'v0.12.0-396-gb7233d119-dirty'
# 126792: Start printer at Wed May 7 01:37:13 2025 (1746599833.9 106439.1)
# 126793: config file
[mcu rpi]
serial = /tmp/klipper_host_mcu
[board_pins btt-octopus-pro-446]
aliases =
x_step_pin=PF13,
x_dir_pin=PF12,
x_enable_pin=PF14,
x_uart_pin=PC4,
x_diag_pin=PG6,
x_endstop_pin=PG6,
y_step_pin=PG0,
y_dir_pin=PG1,
y_enable_pin=PF15,
y_uart_pin=PD11,
y_diag_pin=PG9,
y_endstop_pin=PG9,
z0_step_pin=PC13,
z0_dir_pin=PF0,
z0_enable_pin=PF1,
z0_uart_pin=PE4,
z0_diag_pin=PG13,
z1_step_pin=PE2,
z1_dir_pin=PE3,
z1_enable_pin=PD4,
z1_uart_pin=PE1,
z1_diag_pin=PG14,
z2_step_pin=PE6,
z2_dir_pin=PA14,
z2_enable_pin=PE0,
z2_uart_pin=PD3,
z2_diag_pin=PG15,
e_step_pin=PF11,
e_dir_pin=PG3,
e_enable_pin=PG5,
e_uart_pin=PC6,
e_heater_pin=PA2,
e_sensor_pin=PF4,
stepper_spi_mosi_pin=PA7,
stepper_spi_miso_pin=PA6,
stepper_spi_sclk_pin=PA5,
adxl345_cs_pin=PA15,
bltouch_sensor_pin=PB7,
bltouch_control_pin=PB6,
probe_pin=PB7,
fan_part_cooling_pin=PA8,
fan_toolhead_cooling_pin=PE5,
fan_controller_board_pin=PD12,
heater_bed_heating_pin=PA1,
heater_bed_sensor_pin=PF3,
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]
serial = /dev/RatOS/btt-octopus-pro-446
[temperature_sensor Octopus_Pro_446]
sensor_type = temperature_mcu
[adxl345 controlboard]
cs_pin = PA15
spi_bus = spi3
[board_pins toolboard_t0]
mcu = toolboard_t0
aliases =
e_step_pin=PD0,
e_dir_pin=PD1,
e_enable_pin=PD2,
e_uart_pin=PA15,
e_heater_pin=PB13,
e_sensor_pin=PA3,
stepper_spi_mosi_pin=null,
stepper_spi_miso_pin=null,
stepper_spi_sclk_pin=null,
adxl345_cs_pin=PB12,
bltouch_sensor_pin=PB8,
bltouch_control_pin=PB9,
probe_pin=PB9,
fan_part_cooling_pin=PA0,
fan_toolhead_cooling_pin=PA1,
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/btt-ebb42-12-t0
[temperature_sensor EBB42_v1.2_T0]
sensor_type = temperature_mcu
sensor_mcu = toolboard_t0
[adxl345 toolboard_t0]
axes_map = x, z, y
cs_pin = toolboard_t0:PB12
spi_software_mosi_pin = toolboard_t0:PB11
spi_software_miso_pin = toolboard_t0:PB2
spi_software_sclk_pin = toolboard_t0:PB10
[gcode_macro RatOS]
variable_homing = "endstops"
variable_z_probe = "static"
variable_sensorless_x_current = 0.6
variable_sensorless_y_current = 0.9
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 = "back"
variable_start_print_park_z_height = 50
variable_end_print_park_in = "back"
variable_pause_print_park_in = "back"
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 = 600
variable_macro_travel_accel = 8000
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 = "endstop"
variable_homing_y = "endstop"
variable_x_driver_types = ["tmc2209"]
variable_x_axes = ["x"]
variable_y_driver_types = ["tmc2209"]
variable_y_axes = ["y"]
variable_z_driver_types = ["tmc2209", "tmc2209", "tmc2209"]
variable_z_axes = ["z", "z1", "z2"]
variable_skew_profile = "my_skew"
[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
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=skip_load VALUE=True
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 %}
{% if initial_tool == '0' %}
TOOL_LOAD LANE=lane1
{% else %}
TOOL_LOAD LANE=lane{initial_tool + 1}
{% 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 }
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=skip_load VALUE=True
[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]
shaper_freq_x = 68.4
shaper_type_x = mzv
shaper_freq_y = 35.0
shaper_type_y = mzv
[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
allow_unsupported_slicer_versions = 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 = 140
pwm_cycle_time = 0.02
control = pid
pid_kp = 69.075
pid_ki = 2.193
pid_kd = 543.966
[fan]
pin = !toolboard_t0:PA0
shutdown_speed = 1.0
cycle_time = 0.00004
[heater_fan toolhead_cooling_fan]
pin = toolboard_t0:PA1
fan_speed = 1
heater = extruder
[controller_fan controller_fan]
pin = PD12
[printer]
kinematics = corexy
max_velocity = 800
max_accel = 10000
minimum_cruise_ratio = 0.5
max_z_velocity = 50
max_z_accel = 600
square_corner_velocity = 5
[gcode_macro Z_TILT_ADJUST]
rename_existing = Z_TILT_ADJUST_ORIG
gcode =
{% set beacon_contact_z_tilt_adjust_samples = printer["gcode_macro RatOS"].beacon_contact_z_tilt_adjust_samples|default(2)|int %}
{% set beacon_contact_z_tilt_adjust = true if printer["gcode_macro RatOS"].beacon_contact_z_tilt_adjust|default(false)|lower == 'true' else false %}
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
DEPLOY_PROBE
{% endif %}
{% if printer.configfile.settings.beacon is defined and beacon_contact_z_tilt_adjust %}
Z_TILT_ADJUST_ORIG PROBE_METHOD=contact SAMPLES={beacon_contact_z_tilt_adjust_samples}
{% else %}
Z_TILT_ADJUST_ORIG
{% endif %}
{% if printer["gcode_macro RatOS"].z_probe == 'stowable' %}
STOW_PROBE
{% endif %}
[stepper_x]
position_max = 502.5
position_endstop = -5
step_pin = PF13
dir_pin = !x_dir_pin
enable_pin = !PF14
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
homing_speed = 50
endstop_pin = toolboard_t0:PB6
position_min = -5
[stepper_y]
position_max = 500
position_endstop = 500
step_pin = PG0
dir_pin = !y_dir_pin
enable_pin = !PF15
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 40
homing_speed = 50
endstop_pin = PG9
position_min = 0
[stepper_z]
position_max = 500
step_pin = PC13
dir_pin = !z0_dir_pin
enable_pin = !PF1
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 4
position_min = -5
homing_speed = 10
endstop_pin = probe:z_virtual_endstop
[bed_mesh]
horizontal_move_z = 5
mesh_min = 20,30
mesh_max = 465,460
probe_count = 100,25
fade_start = 1.0
fade_end = 10.0
mesh_pps = 2,2
algorithm = bicubic
bicubic_tension = .2
speed = 600
[z_tilt]
z_positions =
0,0
250,500
500,0
points =
60,60
285,470
460,60
horizontal_move_z = 20
retries = 10
retry_tolerance = 0.02
speed = 600
[extruder]
rotation_distance = 4.63
full_steps_per_rotation = 200
filament_diameter = 1.750
max_extrude_only_velocity = 60
max_extrude_only_distance = 400
nozzle_diameter = 0.4
heater_pin = toolboard_t0:PB13
sensor_type = PT1000
pullup_resistor = 2200
sensor_pin = toolboard_t0:PA3
min_extrude_temp = 170
min_temp = 0
max_temp = 350
pressure_advance = 0.03
step_pin = toolboard_t0:PD0
dir_pin = toolboard_t0:e_dir_pin
enable_pin = !toolboard_t0:PD2
microsteps = 64
control = pid
pid_kp = 22.601
pid_ki = 2.009
pid_kd = 63.567
[firmware_retraction]
retract_speed = 60
unretract_extra_length = 0
unretract_speed = 60
retract_length = 0.5
[resonance_tester]
accel_chip_x = adxl345 toolboard_t0
accel_chip_y = adxl345 toolboard_t0
probe_points =
250,250,20
[tmc2209 stepper_x]
stealthchop_threshold = 0
interpolate = False
uart_pin = PC4
run_current = 1.6
driver_tbl = 2
driver_toff = 3
driver_hend = 0
driver_hstrt = 6
sense_resistor = 0.11
[tmc2209 stepper_y]
stealthchop_threshold = 0
interpolate = False
uart_pin = PD11
run_current = 1.6
driver_tbl = 2
driver_toff = 3
driver_hend = 0
driver_hstrt = 6
sense_resistor = 0.11
[tmc2209 stepper_z]
stealthchop_threshold = 0
interpolate = False
uart_pin = PE4
run_current = 1.6
driver_tbl = 2
driver_toff = 3
driver_hend = 0
driver_hstrt = 6
sense_resistor = 0.11
[tmc2209 stepper_z1]
stealthchop_threshold = 0
interpolate = False
uart_pin = PE1
run_current = 1.6
driver_tbl = 2
driver_toff = 3
driver_hend = 0
driver_hstrt = 6
sense_resistor = 0.11
[stepper_z1]
step_pin = PE2
dir_pin = !z1_dir_pin
enable_pin = !PD4
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 4
[tmc2209 stepper_z2]
stealthchop_threshold = 0
interpolate = False
uart_pin = PD3
run_current = 1.6
driver_tbl = 2
driver_toff = 3
driver_hend = 0
driver_hstrt = 6
sense_resistor = 0.11
[stepper_z2]
step_pin = PE6
dir_pin = !z2_dir_pin
enable_pin = !PE0
microsteps = 64
full_steps_per_rotation = 200
rotation_distance = 4
[tmc2209 extruder]
stealthchop_threshold = 0
interpolate = False
uart_pin = toolboard_t0:PA15
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_active = True
variable_hotend_type = "UHF"
variable_has_oozeguard = False
variable_has_front_arm_nozzle_wiper = False
gcode =
{% set purge_length = params.PURGE_LENGTH|default("0")|int %}
{% 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 skip_load != True %}
BT_TOOL_UNLOAD
TOOL_LOAD LANE=lane1 PURGE_LENGTH={purge_length}
{% else %}
SET_GCODE_VARIABLE MACRO=T0 VARIABLE=skip_load VALUE=False
{% endif %}
variable_skip_load = True
[save_variables]
filename = /home/pi/printer_data/config/ratos-variables.cfg
[gcode_macro UNSAFE_MOVE_TOOL]
description = Move the toolhead without homing
gcode =
{% set z = params.Z|default(0)|float %}
{% set x = params.X|default(0)|float %}
{% set y = params.Y|default(0)|float %}
{% set f = params.F|default(10)|float %}
G90
SET_KINEMATIC_POSITION Z={(printer.toolhead.axis_maximum.z/2)} X={(printer.toolhead.axis_maximum.x/2)} Y={(printer.toolhead.axis_maximum.y/2)}
G0 X{(printer.toolhead.axis_maximum.x/2)+x} Y{(printer.toolhead.axis_maximum.y/2)+y} Z{(printer.toolhead.axis_maximum.z/2)+z} F{ (f*60) }
M84
[AFC]
varfile = /home/pi/printer_data/config/AFC/AFC.var
long_moves_speed = 225
long_moves_accel = 250
short_moves_speed = 75
short_moves_accel = 300
short_move_dis = 10
enable_sensors_in_gui = True
default_material_temps = default: 235, PLA:210, ABS:235, ASA:235
load_to_hub = True
assisted_unload = True
z_hop = 5
resume_speed = 120
resume_z_speed = 30
led_name = AFC_Indicator
led_fault = 1,0,0,0
led_ready = 0,0.8,0,0
led_not_ready = 1,0,0,0
led_loading = 1,1,1,0
led_tool_loaded = 0,0,1,0
led_buffer_advancing = 0,0,1,0
led_buffer_trailing = 0,1,0,0
led_buffer_disable = 0,0,0,0.25
tool_cut = True
tool_cut_cmd = AFC_CUT
park = True
park_cmd = AFC_PARK
poop = False
poop_cmd = AFC_POOP
kick = False
kick_cmd = AFC_KICK
wipe = False
wipe_cmd = AFC_BRUSH
form_tip = False
form_tip_cmd = AFC
[AFC_prep]
enable = True
[delayed_gcode welcome]
initial_duration = 0.5
gcode =
PREP
[AFC_form_tip]
ramming_volume = 0
toolchange_temp = 0
unloading_speed_start = 40
unloading_speed = 15
cooling_tube_position = 35
cooling_tube_length = 10
initial_cooling_speed = 10
final_cooling_speed = 50
cooling_moves = 4
use_skinnydip = False
skinnydip_distance = 30
dip_insertion_speed = 30
dip_extraction_speed = 70
melt_zone_pause = 0
cooling_zone_pause = 0
[AFC_extruder extruder]
pin_tool_start = ^toolboard_t0:PB4
tool_stn = 54
tool_stn_unload = 115
tool_sensor_after_extruder = 0
tool_unload_speed = 25
tool_load_speed = 25
[AFC_buffer Turtle_1]
advance_pin = ^Turtle_1:TN_ADV
trailing_pin = ^Turtle_1:TN_TRL
multiplier_high = 1.05
multiplier_low = 0.95
velocity = 0
[AFC_buffer Turtle_2]
advance_pin = ^Turtle_2:TN_ADV
trailing_pin = ^Turtle_2:TN_TRL
multiplier_high = 1.05
multiplier_low = 0.95
velocity = 0
[gcode_macro BT_TOOL_UNLOAD]
description = Unloads the currently loaded lane
gcode =
TOOL_UNLOAD
[gcode_macro BT_CHANGE_TOOL]
description = Switch to a new lane by ejecting the previously loaded one and then load the lane specified by LANE parameter. Lane parameter is an integer and defaults to 1. ex. `BT_CHANGE_TOOL LANE=2`
gcode =
{% set lane_num = params.LANE|default(1)|int %}
{% set stepper = printer['gcode_macro _AFC_GLOBAL_VARS'].stepper_name|string %}
CHANGE_TOOL LANE={stepper ~ lane_num}
[gcode_macro BT_LANE_EJECT]
description = Fully eject the filament from the lane so spool can be removed. Lane parameter is an integer and defaults to 1. ex. `BT_LANE_EJECT LANE=2`
gcode =
{% set lane_num = params.LANE|default(1)|int %}
{% set stepper = printer['gcode_macro _AFC_GLOBAL_VARS'].stepper_name|string %}
LANE_UNLOAD LANE={stepper ~ lane_num}
[gcode_macro BT_LANE_MOVE]
description = Move the specified lane the specified amount. Lane parameter is an integer and defaults to 1. Distance parameter is and integer and defaults to 20. Distance over 200 uses long load speeds. ex `BT_LANE_MOVE LANE=2 DISTANCE=100`
gcode =
{% set lane_num = params.LANE|default(1)|int %}
{% set dist_str = params.DISTANCE|default('20')|string %}
{% set stepper = printer['gcode_macro _AFC_GLOBAL_VARS'].stepper_name|string %}
{% set valid_chars = '0123456789' %}
{% set is_valid = true %}
{% if dist_str|length > 0 %}
{% if dist_str[-1] not in valid_chars %}
{% set is_valid = false %}
{% endif %}
{% else %}
{% set is_valid = false %}
{% endif %}
{% if is_valid %}
{% set dist = dist_str|float %}
LANE_MOVE LANE={stepper ~ lane_num} DISTANCE={dist}
{% else %}
{ action_respond_info("Error: Invalid DISTANCE parameter: " ~ dist_str) }
{% endif %}
[gcode_macro BT_RESUME]
description = Resume the print after an error, using normal resume will also call AFC_RESUME
gcode =
{% if not printer.pause_resume.is_paused %}
RESPOND MSG="Print is not paused. Resume ignored"
{% else %}
AFC_RESUME
{% endif %}
[gcode_macro BT_PREP]
description = Run the AFC PREP sequence
gcode =
PREP
[gcode_macro AFC_BRUSH]
description = Wipe the nozzle on the brush
gcode =
{% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %}
{% set accel = gVars['accel']|float %}
{% set travel_speed = gVars['travel_speed'] * 60|float %}
{% set z_travel_speed = gVars['z_travel_speed'] * 60|float %}
{% set verbose = gVars['verbose']|int %}
{% set vars = printer['gcode_macro _AFC_BRUSH_VARS'] %}
{% set Bx, By, Bz = vars.brush_loc|map('float') %}
{% set brush_clean_accel = vars['brush_clean_accel']|float %}
{% set y_brush = vars['y_brush']|default(false)|lower == 'true' %}
{% set brush_clean_speed = vars['brush_clean_speed'] * 60|float %}
{% set brush_width = vars['brush_width']|float %}
{% set brush_depth = vars['brush_depth']|float %}
{% set brush_count = vars['brush_count']|int %}
{% set z_move = vars['z_move'] |float %}
{% if printer.dual_carriage is defined %}
{% if printer.dual_carriage.carriage_0 == "INACTIVE" %}
{% set x_max = printer.configfile.config.dual_carriage.position_max|float|round(3) %}
{% set x_min = printer.configfile.config.dual_carriage.position_min|float|round(3) %}
{% else %}
{% set x_max = printer.toolhead.axis_maximum.x %}
{% set x_min = printer.toolhead.axis_minimum.x %}
{% endif %}
{% else %}
{% set x_max = printer.toolhead.axis_maximum.x %}
{% set x_min = printer.toolhead.axis_minimum.x %}
{% endif %}
{% set y_max = printer.toolhead.axis_maximum.y %}
{% set y_min = printer.toolhead.axis_minimum.y %}
{% set brush_x_max = Bx + brush_width / 2 %}
{% set brush_x_min = Bx - brush_width / 2 %}
{% set brush_y_max = By + brush_depth / 2 %}
{% set brush_y_min = By - brush_depth / 2 %}
{% set saved_accel = printer.toolhead.max_accel %}
{% if brush_clean_accel > 0 %}
{% set selected_accel = brush_clean_accel %}
{% else %}
{% set selected_accel = accel %}
{% endif %}
SET_VELOCITY_LIMIT ACCEL={selected_accel}
{% if verbose > 0 %}
RESPOND TYPE=command MSG='AFC_Brush: Clean Nozzle'
{% endif %}
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Brush: Move to Brush.'
{% endif %}
G90
G1 X{Bx} Y{By} F{travel_speed}
{% if Bz >= 0 %}
G1 Z{Bz} F{z_travel_speed}
{% endif %}
{% if y_brush %}
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Brush: Y Brush Moves'
{% endif %}
{% for wipe in range(brush_count) %}
{% if brush_y_min >= y_min %}
G1 Y{brush_y_min} F{brush_clean_speed}
{% endif %}
{% if brush_y_max <= y_max %}
G1 Y{brush_y_max} F{brush_clean_speed}
{% endif %}
G1 Y{By} F{brush_clean_speed}
{% endfor %}
{% endif %}
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Brush: X Brush Moves'
{% endif %}
{% for wipe in range(brush_count) %}
{% if brush_x_min >= x_min %}
G1 X{brush_x_min} F{brush_clean_speed}
{% endif %}
{% if brush_x_max <= x_max %}
G1 X{brush_x_max} F{brush_clean_speed}
{% endif %}
G1 X{Bx} F{brush_clean_speed}
{% endfor %}
{% if z_move >= 0 %}
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Brush: Finish z_move.'
{% endif %}
G91
G1 Z{z_move} F{z_travel_speed}
G90
{% endif %}
G90
SET_VELOCITY_LIMIT ACCEL={saved_accel}
[gcode_macro AFC_CUT]
description = Cut filament by pressing the cutter on a pin
gcode =
{% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %}
{% set accel = gVars['accel']|float %}
{% set travel_speed = gVars['travel_speed'] * 60|float %}
{% set verbose = gVars['verbose']|int %}
{% set vars = printer['gcode_macro _AFC_CUT_TIP_VARS'] %}
{% set pin_loc_x, pin_loc_y = vars.pin_loc_xy|map('float') %}
{% set pin_park_dist = vars['pin_park_dist']|float %}
{% set retract_length = vars['retract_length']|float %}
{% set quick_tip_forming = vars['quick_tip_forming']|default(true)|lower == 'true' %}
{% set rip_length = vars['rip_length']|float %}
{% set cut_direction = vars['cut_direction']|default('')|lower %}
{% set cut_accel = vars['cut_accel']|float %}
{% set pushback_length = vars['pushback_length']|float %}
{% set pushback_dwell_time = vars['pushback_dwell_time']|int %}
{% set extruder_move_speed = vars['extruder_move_speed'] * 60|float %}
{% set restore_position = vars['restore_position']|default(true)|lower == 'true' %}
{% set cut_count = vars['cut_count']|int %}
{% set y_cut = vars['y_cut']|default(false)|lower == 'true' %}
{% set awd = vars['awd']|default(false)|lower == 'true' %}
{% set cut_current_x = vars['cut_current_stepper_x']|default(0)|float %}
{% set cut_current_dc = vars['cut_current_dual_carriage']|default(0)|float %}
{% set cut_current_y = vars['cut_current_stepper_y']|default(0)|float %}
{% set cut_current_z = vars['cut_current_stepper_z']|default(0)|float %}
{% if verbose > 0 %}
RESPOND TYPE=command MSG='AFC_Cut: Cut Filament'
{% endif %}
{% set location_factor = {
'left' : { 'x': 1, 'y': 0 },
'right' : { 'x': -1, 'y': 0 },
'front' : { 'x': 0, 'y': 1 },
'back' : { 'x': 0, 'y': -1 }
} %}
{% if cut_direction == "left" or cut_direction == "right" %}
{% set pin_park_x_loc = pin_loc_x + location_factor[cut_direction].x * pin_park_dist %}
{% set pin_park_y_loc = pin_loc_y %}
{% elif cut_direction == "front" or cut_direction == "back" %}
{% set pin_park_x_loc = pin_loc_x %}
{% set pin_park_y_loc = pin_loc_y + location_factor[cut_direction].y * pin_park_dist %}
{% else %}
{ action_raise_error("Invalid cut direction. Check the cut_direction in your AFC_Macro_Vars.cfg file!") }
{% endif %}
{% set _extruder_moved_dist = 0 %}
{% if "xy" not in printer.toolhead.homed_axes %}
G28 X Y
{% endif %}
SAVE_GCODE_STATE NAME=_AFC_CUT
{% set saved_accel = printer.toolhead.max_accel %}
{% if cut_accel > 0 %}
{% set selected_accel = cut_accel %}
{% else %}
{% set selected_accel = accel %}
{% endif %}
SET_VELOCITY_LIMIT ACCEL={selected_accel}
{% set prev_pa = printer.extruder.pressure_advance %}
SET_PRESSURE_ADVANCE ADVANCE=0
DEPLOY_ACTUATOR
G4 P1200
G90
M83
G92 E0
{% if retract_length > 0 %}
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Cut: Retract Filament for Cut'
{% endif %}
G1 E-{retract_length} F{extruder_move_speed}
{% if quick_tip_forming %}
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Cut: Performing Quick Tip Form'
{% endif %}
G1 E{retract_length / 2} F{extruder_move_speed}
G1 E-{retract_length / 2} F{extruder_move_speed}
{% endif %}
{% set _extruder_moved_dist = _extruder_moved_dist + retract_length %}
{% endif %}
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Cut: Move to Cut Pin Location'
{% endif %}
_MOVE_TO_CUTTER_PIN PIN_PARK_X_LOC={pin_park_x_loc} PIN_PARK_Y_LOC={pin_park_y_loc}
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Cut: Cut Move...'
{% endif %}
{% if cut_current_x > 0 or cut_current_dc > 0 %}
{% if printer.dual_carriage is defined %}
{% if printer.dual_carriage.carriage_0 == "INACTIVE" %}
{% set conf_name = vars['conf_name_dual_carriage']|default('tmc2209 dual_carriage') %}
{% set conf_current_dc = printer.configfile.settings[conf_name].run_current|float %}
SET_TMC_CURRENT STEPPER=dual_carriage CURRENT={cut_current_dc}
{% else %}
{% set conf_name = vars['conf_name_stepper_x']|default('tmc2209 stepper_x') %}
{% set conf_current_x = printer.configfile.settings[conf_name].run_current|float %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={cut_current_x}
{% endif %}
{% else %}
{% set conf_name = vars['conf_name_stepper_x']|default('tmc2209 stepper_x') %}
{% set conf_current_x = printer.configfile.settings[conf_name].run_current|float %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={cut_current_x}
{% if awd %}
SET_TMC_CURRENT STEPPER=stepper_x1 CURRENT={cut_current_x}
{% endif %}
{% endif %}
{% endif %}
{% if cut_current_y > 0 %}
{% set conf_name = vars['conf_name_stepper_y']|default('tmc2209 stepper_y') %}
{% set conf_current_y = printer.configfile.settings[conf_name].run_current|float %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={cut_current_y}
{% if awd %}
SET_TMC_CURRENT STEPPER=stepper_y1 CURRENT={cut_current_y}
{% endif %}
{% endif %}
{% if cut_current_z > 0 %}
{% set conf_name = vars['conf_name_stepper_z']|default('tmc2209 stepper_z') %}
{% set conf_current_z = printer.configfile.settings[conf_name].run_current|float %}
SET_TMC_CURRENT STEPPER=stepper_z CURRENT={cut_current_z}
{% endif %}
{% for cut in range(cut_count - 1) %}
_DO_CUT_MOTION PIN_PARK_X_LOC={pin_park_x_loc} PIN_PARK_Y_LOC={pin_park_y_loc} RIP_LENGTH=0
{% endfor %}
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Cut: Final Cut...'
{% endif %}
_DO_CUT_MOTION PIN_PARK_X_LOC={pin_park_x_loc} PIN_PARK_Y_LOC={pin_park_y_loc} RIP_LENGTH={rip_length}
{% if cut_current_x > 0 or cut_current_dc > 0 %}
{% if printer.dual_carriage is defined %}
{% if printer.dual_carriage.carriage_0 == "INACTIVE" %}
SET_TMC_CURRENT STEPPER=dual_carriage CURRENT={conf_current_dc}
{% else %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={conf_current_x}
{% endif %}
{% else %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={conf_current_x}
{% if awd %}
SET_TMC_CURRENT STEPPER=stepper_x1 CURRENT={conf_current_x}
{% endif %}
{% endif %}
{% endif %}
{% if cut_current_y > 0 %}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={conf_current_y}
{% if awd %}
SET_TMC_CURRENT STEPPER=stepper_y1 CURRENT={conf_current_y}
{% endif %}
{% endif %}
{% if cut_current_z > 0 %}
SET_TMC_CURRENT STEPPER=stepper_z CURRENT={conf_current_z}
{% endif %}
{% set _extruder_moved_dist = _extruder_moved_dist + rip_length %}
{% if pushback_length > 0 %}
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Cut: Push cut tip back into hotend'
{% endif %}
G1 E{pushback_length} F{extruder_move_speed}
G4 P{pushback_dwell_time}
G1 E-{pushback_length} F{extruder_move_speed}
{% set _extruder_moved_dist = _extruder_moved_dist - pushback_length %}
{% endif %}
SET_PRESSURE_ADVANCE ADVANCE={prev_pa}
SET_VELOCITY_LIMIT ACCEL={saved_accel}
STOW_ACTUATOR
RESTORE_GCODE_STATE NAME=_AFC_CUT MOVE={1 if restore_position else 0} MOVE_SPEED={travel_speed}
[gcode_macro _MOVE_TO_CUTTER_PIN]
description = Helper to move the toolhead to the target pin in either safe or faster way, depending on toolhead clearance
gcode =
{% set pin_park_x_loc = params.PIN_PARK_X_LOC|float %}
{% set pin_park_y_loc = params.PIN_PARK_Y_LOC|float %}
{% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %}
{% set travel_speed = gVars['travel_speed'] * 60|float %}
{% set vars = printer['gcode_macro _AFC_CUT_TIP_VARS'] %}
{% set safe_margin_x, safe_margin_y = vars.safe_margin_xy|map('float') %}
{% if ((printer.gcode_move.gcode_position.x - pin_park_x_loc)|abs < safe_margin_x) or ((printer.gcode_move.gcode_position.y - pin_park_y_loc)|abs < safe_margin_y) %}
G1 X{pin_park_x_loc} F{travel_speed}
G1 Y{pin_park_y_loc} F{travel_speed}
{% else %}
G1 X{pin_park_x_loc} Y{pin_park_y_loc} F{travel_speed}
{% endif %}
[gcode_macro _DO_CUT_MOTION]
description = Helper to do a single horizontal cut movement
gcode =
{% set pin_park_x_loc = params.PIN_PARK_X_LOC|float %}
{% set pin_park_y_loc = params.PIN_PARK_Y_LOC|float %}
{% set rip_length = params.RIP_LENGTH|float %}
{% set vars = printer['gcode_macro _AFC_CUT_TIP_VARS'] %}
{% set cut_move_dist = vars['cut_move_dist']|float %}
{% set cut_direction = vars['cut_direction']|default('')|lower %}
{% set cut_fast_move_fraction = vars['cut_fast_move_fraction']|float %}
{% set pin_park_dist = vars['pin_park_dist']|float %}
{% set cut_fast_move_speed = vars['cut_fast_move_speed'] * 60|float %}
{% set cut_slow_move_speed = vars['cut_slow_move_speed'] * 60|float %}
{% set cut_dwell_time = vars['cut_dwell_time']|float %}
{% set evacuate_speed = vars['evacuate_speed'] * 60|float %}
{% set rip_speed = vars['rip_speed'] * 60|float %}
{% if printer.dual_carriage is defined %}
{% if printer.dual_carriage.carriage_0 == "INACTIVE" %}
{% set x_max = printer.configfile.config.dual_carriage.position_max|float|round(3) %}
{% set x_min = printer.configfile.config.dual_carriage.position_min|float|round(3) %}
{% else %}
{% set x_max = printer.toolhead.axis_maximum.x %}
{% set x_min = printer.toolhead.axis_minimum.x %}
{% endif %}
{% else %}
{% set x_max = printer.toolhead.axis_maximum.x %}
{% set x_min = printer.toolhead.axis_minimum.x %}
{% endif %}
{% set y_max = printer.toolhead.axis_maximum.y %}
{% set y_min = printer.toolhead.axis_minimum.y %}
{% set cut_dist = cut_move_dist + pin_park_dist %}
{% set location_factor = {
'left' : { 'x': -1, 'y': 0 },
'right' : { 'x': 1, 'y': 0 },
'front' : { 'x': 0, 'y': -1 },
'back' : { 'x': 0, 'y': 1 }
} %}
{% if cut_direction == "left" or cut_direction == "right" %}
{% set fast_slow_transition_loc_x = pin_park_x_loc + location_factor[cut_direction].x * (cut_dist * cut_fast_move_fraction)| float %}
{% set full_cut_loc_x = pin_park_x_loc + location_factor[cut_direction].x * cut_dist| float %}
{% if full_cut_loc_x > x_max or full_cut_loc_x < x_min %}
{ action_raise_error("X Cut move is outside your printer bounds. Check the cut_move_dist in your AFC_Macro_Vars.cfg file!") }
{% else %}
G1 X{fast_slow_transition_loc_x} F{cut_fast_move_speed}
G1 X{full_cut_loc_x} F{cut_slow_move_speed}
G4 P{cut_dwell_time}
{% if rip_length > 0 %}
G1 E-{rip_length} F{rip_speed}
{% endif %}
G4 P200
G1 X{pin_park_x_loc} F{evacuate_speed}
G4 P200
{% endif %}
{% elif cut_direction == "front" or cut_direction == "back" %}
{% set fast_slow_transition_loc_y = pin_park_y_loc + location_factor[cut_direction].y * (cut_dist * cut_fast_move_fraction)| float %}
{% set full_cut_loc_y = pin_park_y_loc + location_factor[cut_direction].y * cut_dist| float %}
{% if full_cut_loc_y > y_max or full_cut_loc_y < y_min %}
{ action_raise_error("Y Cut move is outside your printer bounds. Check the cut_move_dist in your AFC_Macro_Vars.cfg file!") }
{% else %}
G1 Y{fast_slow_transition_loc_y} F{cut_fast_move_speed}
G1 Y{full_cut_loc_y} F{cut_slow_move_speed}
G4 P{cut_dwell_time}
{% if rip_length > 0 %}
G1 E-{rip_length} F{rip_speed}
{% endif %}
G4 P200
G1 Y{pin_park_y_loc} F{evacuate_speed}
G4 P200
{% endif %}
{% else %}
{ action_raise_error("Invalid cut direction. Check the cut_direction in your AFC_Macro_Vars.cfg file!") }
{% endif %}
[gcode_macro AFC_KICK]
gcode =
{% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %}
{% set accel = gVars['accel']|float %}
{% set travel_speed = gVars['travel_speed'] * 60|float %}
{% set z_travel_speed = gVars['z_travel_speed'] * 60|float %}
{% set verbose = gVars['verbose']|int %}
{% set vars = printer['gcode_macro _AFC_KICK_VARS'] %}
{% set kick_start_x, kick_start_y, kick_start_z = vars.kick_start_loc|map('float') %}
{% set kick_z = vars['kick_z']|float %}
{% set kick_direction = vars['kick_direction']|default('')|lower %}
{% set kick_move_dist = vars['kick_move_dist']|float %}
{% set z_after_kick = vars['z_after_kick']|float %}
{% set kick_speed = vars['kick_speed'] * 60|float %}
{% set kick_accel = vars['kick_accel']|float %}
{% if printer.dual_carriage is defined %}
{% if printer.dual_carriage.carriage_0 == "INACTIVE" %}
{% set x_max = printer.configfile.config.dual_carriage.position_max|float|round(3) %}
{% set x_min = printer.configfile.config.dual_carriage.position_min|float|round(3) %}
{% else %}
{% set x_max = printer.toolhead.axis_maximum.x %}
{% set x_min = printer.toolhead.axis_minimum.x %}
{% endif %}
{% else %}
{% set x_max = printer.toolhead.axis_maximum.x %}
{% set x_min = printer.toolhead.axis_minimum.x %}
{% endif %}
{% set y_max = printer.toolhead.axis_maximum.y %}
{% set y_min = printer.toolhead.axis_minimum.y %}
{% set saved_accel = printer.toolhead.max_accel %}
{% if kick_accel > 0 %}
{% set selected_accel = kick_accel %}
{% else %}
{% set selected_accel = accel %}
{% endif %}
SET_VELOCITY_LIMIT ACCEL={selected_accel}
{% if verbose > 0 %}
RESPOND TYPE=command MSG='AFC_Kick: Starting Filament Kick'
{% endif %}
G90
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Kick: Move to Start Position'
{% endif %}
G1 Z{kick_start_z} F{z_travel_speed}
G1 X{kick_start_x} Y{kick_start_y} F{travel_speed}
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Kick: Drop Z For Kick Move'
{% endif %}
{% if kick_z > 0 %}
G1 Z{kick_z} F{z_travel_speed}
{% else %}
RESPOND TYPE=command MSG='AFC-KICK: kick_z value to low. Please adjust in AFC_Macro_Vars.cfg. Defaulting to 0.5mm z-height'
G1 Z0.5 F{z_travel_speed}
{% endif %}
{% set location_factor = {
'left' : { 'x': -1, 'y': 0 },
'right' : { 'x': 1, 'y': 0 },
'front' : { 'x': 0, 'y': -1 },
'back' : { 'x': 0, 'y': 1 }
} %}
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Kick: Kick filament'
{% endif %}
{% if kick_direction == "left" or kick_direction == "right" %}
{% if (kick_start_x + location_factor[kick_direction].x * kick_move_dist) > x_max or (kick_start_x + location_factor[kick_direction].x * kick_move_dist) < x_min %}
{ action_raise_error("X Kick move is outside your printer bounds. Check the kick_move_dist in your AFC_Macro_Vars.cfg file!") }
{% else %}
G1 X{kick_start_x + location_factor[kick_direction].x * kick_move_dist} F{kick_speed}
{% endif %}
{% elif kick_direction == "front" or kick_direction == "back" %}
{% if (kick_start_y + location_factor[kick_direction].y * kick_move_dist) > y_max or (kick_start_y + location_factor[kick_direction].y * kick_move_dist) < y_min %}
{ action_raise_error("Y Kick move is outside your printer bounds. Check the kick_move_dist in your AFC_Macro_Vars.cfg file!") }
{% else %}
G1 Y{kick_start_y + location_factor[kick_direction].y * kick_move_dist} F{kick_speed}
{% endif %}
{% else %}
{ action_raise_error("Error in kick movement. Check the directions in your AFC_Macro_Vars.cfg file!") }
{% endif %}
G1 Z{z_after_kick} F{z_travel_speed}
SET_VELOCITY_LIMIT ACCEL={saved_accel}
[gcode_macro AFC_PARK]
gcode =
{% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %}
{% set travel_speed = gVars['travel_speed'] * 60|float %}
{% set verbose = gVars['verbose']|int %}
{% set z_travel_speed = gVars['z_travel_speed'] * 60|float %}
{% set vars = printer['gcode_macro _AFC_PARK_VARS'] %}
{% set Px, Py = vars.park_loc_xy|map('float') %}
{% set Px = params.X|default(Px)|float %}
{% set Py = params.Y|default(Py)|float %}
{% set z_hop = vars['z_hop']|float %}
{% set z_hop = params.Z_HOP|default(z_hop)|float %}
{% set max_z = printer.toolhead.axis_maximum.z - printer.gcode_move.homing_origin.z |float %}
{% set cur_z = printer.toolhead.position.z|float %}
{% set z_safe = cur_z + z_hop %}
{% if z_safe > max_z %}
{% set z_safe = max_z %}
{% endif %}
{% if verbose > 0 %}
RESPOND TYPE=command MSG='AFC_Park: Park Toolhead'
{% endif %}
G90
G1 Z{z_safe} F{z_travel_speed}
G1 X{Px} Y{Py} F{travel_speed}
[gcode_macro AFC_POOP]
variable_max_iteration_length = 40
variable_iteration_z_raise = 6
variable_iteration_z_change = 0.6
variable_max_iterations_per_blob = 3
variable_pressure_release_time = 1000
variable_purge_z = 0
gcode =
{% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %}
{% set travel_speed = gVars['travel_speed'] * 60|float %}
{% set z_travel_speed = gVars['z_travel_speed'] * 60|float %}
{% set verbose = gVars['verbose']|int %}
{% set vars = printer['gcode_macro _AFC_POOP_VARS'] %}
{% set purge_x, purge_y = vars.purge_loc_xy|map('float') %}
{% set purge_spd = vars['purge_spd'] * 60|float %}
{% set z_poop = vars['z_purge_move']|default(true)|lower == 'true' %}
{% set fast_z = vars['fast_z'] * 60|float %}
{% set z_lift = vars['z_lift']|float %}
{% set part_cooling_fan = vars['part_cooling_fan']|default(true)|lower == 'true' %}
{% set part_cooling_fan_speed = vars['part_cooling_fan_speed']|default(1.0)|float %}
{% set purge_cool_time = vars['purge_cool_time'] * 1000|float %}
{% set purge_length = vars['purge_length']|float %}
{% set purge_length_minimum = vars['purge_length_minimum']|float %}
{% set purge_start = vars['purge_start']|float %}
{% set restore_position = vars['restore_position']|default(true)|lower == 'true' %}
{% if verbose > 0 %}
RESPOND TYPE=command MSG='AFC_Poop: Starting poop'
{% endif %}
SAVE_GCODE_STATE NAME=_AFC_POOPING
{% if part_cooling_fan %}
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Poop: Set Cooling Fan to Full Speed'
{% endif %}
{% set backup_fan_speed = printer.fan.speed %}
M106 S{(part_cooling_fan_speed * 255)|int}
{% endif %}
{% set backup_feedrate = printer.gcode_move.speed_factor %}
M220 S100
{% if params.PURGE_LENGTH %}
{% set purge_len = params.PURGE_LENGTH|float %}
{% else %}
{% set purge_len = purge_length %}
{% endif %}
{% set purge_len = [purge_len, purge_length_minimum]|max %}
G90
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Poop: Move To Purge Location'
{% endif %}
G1 X{purge_x} Y{purge_y} F{travel_speed}
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Poop: z_poop {z_poop}'
{% endif %}
{% if z_poop %}
G1 Z{purge_z + purge_start} F{z_travel_speed}
{% endif %}
{% set iterations = (purge_len / max_iteration_length)|round(0, 'ceil')|int %}
{% for n in range(iterations) %}
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Poop: Purge Iteration {n}'
{% endif %}
{% set step = n % max_iterations_per_blob %}
{% if step == 0 %}
{% if z_poop %}
G1 Z{purge_z + purge_start} F{z_travel_speed}
{% endif %}
{% endif %}
{% set purge_amount_left = purge_len - (max_iteration_length * n) %}
{% set extrude_amount = [purge_amount_left, max_iteration_length]|min %}
{% set extrude_ratio = extrude_amount / max_iteration_length %}
G91
M83
{% set step_triangular = step * (step + 1) / 2 %}
{% set z_raise_substract = purge_start if step == 0 else step_triangular * iteration_z_change %}
{% set raise_z = (iteration_z_raise - z_raise_substract) * extrude_ratio %}
{% set raise_z = [raise_z, 0]|max %}
{% set duration = extrude_amount / purge_spd %}
{% if z_poop %}
{% set speed = raise_z / duration %}
G1 Z{raise_z} E{extrude_amount} F{speed}
{% else %}
G1 E{extrude_amount} F{purge_spd}
{% endif %}
{% set max_iterations_reached = step == max_iterations_per_blob - 1 %}
{% set purge_length_reached = purge_len - max_iteration_length * (n + 1) <= 0 %}
{% if max_iterations_reached or purge_length_reached %}
M83
G4 P{purge_cool_time}
{% endif %}
{% endfor %}
G90
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Poop: Fast Z Lift to keep poop from sticking'
{% endif %}
{% if z_poop %}
G1 Z{z_lift} F{fast_z}21000
{% endif %}
{% if verbose > 1 %}
RESPOND TYPE=command MSG='AFC_Poop: Restore fan speed and feedrate'
{% endif %}
{% if part_cooling_fan %}
M106 S{(backup_fan_speed * 255)|int}
{% endif %}
M220 S{(backup_feedrate * 100)|int}
RESTORE_GCODE_STATE NAME=_AFC_POOPING MOVE={1 if restore_position else 0}
[gcode_macro _AFC_GLOBAL_VARS]
description = Global variables used in multiple macros
gcode =
variable_stepper_name = 'lane'
variable_travel_speed = 120
variable_z_travel_speed = 30
variable_accel = 2000
variable_verbose = 1
[gcode_macro _AFC_PARK_VARS]
description = Park macro configuration variables
gcode =
variable_park_loc_xy = 480, 250
variable_z_hop = 0
[gcode_macro _AFC_CUT_TIP_VARS]
description = Toolhead tip cutting macro configuration variables
gcode =
variable_pin_loc_xy = 490, 250
variable_cut_accel = 0
variable_cut_direction = "right"
variable_pin_park_dist = 8.0
variable_cut_move_dist = 12
variable_cut_fast_move_speed = 32
variable_cut_slow_move_speed = 10
variable_evacuate_speed = 175
variable_cut_dwell_time = 50
variable_cut_fast_move_fraction = 0.85
variable_extruder_move_speed = 25
variable_restore_position = False
variable_retract_length = 12
variable_quick_tip_forming = False
variable_cut_count = 2
variable_rip_length = 1.0
variable_rip_speed = 3
variable_pushback_length = 8
variable_pushback_dwell_time = 20
variable_safe_margin_xy = 50, 50
[gcode_macro _AFC_POOP_VARS]
description = Poop macro configuration variables
gcode =
variable_purge_loc_xy = -1, -1
variable_purge_spd = 6.5
variable_z_purge_move = True
variable_fast_z = 200
variable_z_lift = 20
variable_restore_position = False
variable_purge_start = 0.6
variable_part_cooling_fan = True
variable_part_cooling_fan_speed = 1.0
variable_purge_cool_time = 2
variable_purge_length = 72.111
variable_purge_length_minimum = 60.999
[gcode_macro _AFC_KICK_VARS]
description = Kick macro configuration variables
gcode =
variable_kick_start_loc = -1,-1,10
variable_kick_z = 1.5
variable_kick_speed = 150
variable_kick_accel = 0
variable_kick_direction = "right"
variable_kick_move_dist = 45
variable_z_after_kick = 10
[gcode_macro _AFC_BRUSH_VARS]
description = Brush macro configuration variables
gcode =
variable_brush_loc = -1,-1,-1
variable_brush_clean_speed = 150
variable_brush_clean_accel = 0
variable_brush_width = 30
variable_brush_depth = 10
variable_y_brush = True
variable_brush_count = 4
variable_z_move = -1
[board_pins Turtle_1]
mcu = Turtle_1
aliases =
M1_STEP=PD4 , M1_DIR=PD3 , M1_EN=PD6 , M1_UART=PD5 ,
M2_STEP=PC12 , M2_DIR=PC11 , M2_EN=PD1 , M2_UART=PD0 ,
M3_STEP=PE2 , M3_DIR=PE3 , M3_EN=PE0 , M3_UART=PE1 ,
M4_STEP=PD15 , M4_DIR=PD14 , M4_EN=PC7 , M4_UART=PC6 ,
HUB=PC4 ,
TRG1=PC5 , TRG2=PB0 , TRG3=PB1 , TRG4=PB2 ,
EXT1=PE8 , EXT2=PE9 , EXT3=PE10 , EXT4=PE11 ,
TN_ADV=PE12 , TN_TRL=PE13 ,
SW1=PC4 , SW2=PC5 , SW3=PB0 , SW4=PB1 , SW5=PB2 , SW6=PE7 ,
SW7=PE8 , SW8=PE9 , SW9=PE10 , SW10=PE11 , SW11=PE12 , SW12=PE13 ,
MOT1_RWD=PA0 , MOT1_FWD=PA1 , MOT1_EN=PA2 ,
MOT2_RWD=PA6 , MOT2_FWD=PA7 , MOT2_EN=PA5 ,
MOT3_RWD=PB14 , MOT3_FWD=PB15 , MOT3_EN=PB13 ,
MOT4_RWD=PD12 , MOT4_FWD=PD13 , MOT4_EN=PD11 ,
RGB1=PE14 , RGB2=PE15 , RGB3=PB10 , RGB4=PB11 ,
[board_pins Turtle_2]
mcu = Turtle_2
aliases =
M1_STEP=PD4 , M1_DIR=PD3 , M1_EN=PD6 , M1_UART=PD5 ,
M2_STEP=PC12 , M2_DIR=PC11 , M2_EN=PD1 , M2_UART=PD0 ,
M3_STEP=PE2 , M3_DIR=PE3 , M3_EN=PE0 , M3_UART=PE1 ,
M4_STEP=PD15 , M4_DIR=PD14 , M4_EN=PC7 , M4_UART=PC6 ,
HUB=PC4 ,
TRG1=PC5 , TRG2=PB0 , TRG3=PB1 , TRG4=PB2 ,
EXT1=PE8 , EXT2=PE9 , EXT3=PE10 , EXT4=PE11 ,
TN_ADV=PE12 , TN_TRL=PE13 ,
SW1=PC4 , SW2=PC5 , SW3=PB0 , SW4=PB1 , SW5=PB2 , SW6=PE7 ,
SW7=PE8 , SW8=PE9 , SW9=PE10 , SW10=PE11 , SW11=PE12 , SW12=PE13 ,
MOT1_RWD=PA0 , MOT1_FWD=PA1 , MOT1_EN=PA2 ,
MOT2_RWD=PA6 , MOT2_FWD=PA7 , MOT2_EN=PA5 ,
MOT3_RWD=PB14 , MOT3_FWD=PB15 , MOT3_EN=PB13 ,
MOT4_RWD=PD12 , MOT4_FWD=PD13 , MOT4_EN=PD11 ,
RGB1=PE14 , RGB2=PE15 , RGB3=PB10 , RGB4=PB11 ,
[mcu Turtle_1]
serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_34000A000D51333235363331-if00
[AFC_BoxTurtle Turtle_1]
type = 'Box Turtle'
hub = Turtle_1
extruder = extruder
buffer = Turtle_1
[temperature_sensor Turtle_1]
sensor_type = temperature_mcu
sensor_mcu = Turtle_1
[AFC_stepper lane1]
unit = Turtle_1:1
step_pin = Turtle_1:M1_STEP
dir_pin = !Turtle_1:M1_DIR
enable_pin = !Turtle_1:M1_EN
microsteps = 16
rotation_distance = 4.65
dist_hub = 180.0
park_dist = 10
led_index = AFC_Indicator:1
afc_motor_rwd = Turtle_1:MOT1_RWD
afc_motor_fwd = Turtle_1:MOT1_FWD
afc_motor_enb = Turtle_1:MOT1_EN
rwd_speed_multiplier = 0.5
fwd_speed_multiplier = 0.5
pwm = True
prep = ^!Turtle_1:TRG1
load = ^Turtle_1:EXT1
[tmc2209 AFC_stepper lane1]
uart_pin = Turtle_1:M1_UART
uart_address = 0
run_current = 0.8
sense_resistor = 0.110
[AFC_stepper lane2]
unit = Turtle_1:2
step_pin = Turtle_1:M2_STEP
dir_pin = !Turtle_1:M2_DIR
enable_pin = !Turtle_1:M2_EN
microsteps = 16
rotation_distance = 4.65
dist_hub = 110.0
park_dist = 10
led_index = AFC_Indicator:2
afc_motor_rwd = Turtle_1:MOT2_RWD
afc_motor_fwd = Turtle_1:MOT2_FWD
afc_motor_enb = Turtle_1:MOT2_EN
rwd_speed_multiplier = 0.5
fwd_speed_multiplier = 0.5
pwm = True
prep = ^!Turtle_1:TRG2
load = ^Turtle_1:EXT2
[tmc2209 AFC_stepper lane2]
uart_pin = Turtle_1:M2_UART
uart_address = 0
run_current = 0.8
sense_resistor = 0.110
[AFC_stepper lane3]
unit = Turtle_1:3
step_pin = Turtle_1:M3_STEP
dir_pin = !Turtle_1:M3_DIR
enable_pin = !Turtle_1:M3_EN
microsteps = 16
rotation_distance = 4.65
dist_hub = 110.0
park_dist = 10
led_index = AFC_Indicator:3
afc_motor_rwd = Turtle_1:MOT3_RWD
afc_motor_fwd = Turtle_1:MOT3_FWD
afc_motor_enb = Turtle_1:MOT3_EN
rwd_speed_multiplier = 0.5
fwd_speed_multiplier = 0.5
pwm = True
prep = ^!Turtle_1:TRG3
load = ^Turtle_1:EXT3
[tmc2209 AFC_stepper lane3]
uart_pin = Turtle_1:M3_UART
uart_address = 0
run_current = 0.8
sense_resistor = 0.110
[AFC_stepper lane4]
unit = Turtle_1:4
step_pin = Turtle_1:M4_STEP
dir_pin = !Turtle_1:M4_DIR
enable_pin = !Turtle_1:M4_EN
microsteps = 16
rotation_distance = 4.65
dist_hub = 175.0
park_dist = 10
led_index = AFC_Indicator:4
afc_motor_rwd = Turtle_1:MOT4_RWD
afc_motor_fwd = Turtle_1:MOT4_FWD
afc_motor_enb = Turtle_1:MOT4_EN
rwd_speed_multiplier = 0.5
fwd_speed_multiplier = 0.5
pwm = True
prep = ^!Turtle_1:TRG4
load = ^Turtle_1:EXT4
[tmc2209 AFC_stepper lane4]
uart_pin = Turtle_1:M4_UART
uart_address = 0
run_current = 0.8
sense_resistor = 0.110
[AFC_hub Turtle_1]
switch_pin = ^Turtle_1:HUB
afc_bowden_length = 2420.0
move_dis = 50
cut = False
assisted_retract = False
cut_cmd = AFC
cut_dist = 50
cut_clear = 120
cut_min_length = 300.0
cut_servo_pass_angle = 10
cut_servo_clip_angle = 180
cut_servo_prep_angle = 80
[AFC_led AFC_Indicator]
pin = Turtle_1:RGB1
chain_count = 4
color_order = GRBW
[mcu Turtle_2]
serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_380017000651333039393136-if00
[AFC_BoxTurtle Turtle_2]
type = 'Box Turtle'
hub = Turtle_2
extruder = extruder
buffer = Turtle_2
[temperature_sensor Turtle_2]
sensor_type = temperature_mcu
sensor_mcu = Turtle_2
[AFC_stepper lane5]
unit = Turtle_2:1
step_pin = Turtle_2:M1_STEP
dir_pin = !Turtle_2:M1_DIR
enable_pin = !Turtle_2:M1_EN
microsteps = 16
rotation_distance = 4.65
dist_hub = 185.0
park_dist = 10
led_index = AFC_Indicator_2:1
afc_motor_rwd = Turtle_2:MOT1_RWD
afc_motor_fwd = Turtle_2:MOT1_FWD
afc_motor_enb = Turtle_2:MOT1_EN
rwd_speed_multiplier = 0.5
fwd_speed_multiplier = 0.5
pwm = True
prep = ^!Turtle_2:TRG1
load = ^Turtle_2:EXT1
[tmc2209 AFC_stepper lane5]
uart_pin = Turtle_2:M1_UART
uart_address = 0
run_current = 0.8
sense_resistor = 0.110
[AFC_stepper lane6]
unit = Turtle_2:2
step_pin = Turtle_2:M2_STEP
dir_pin = !Turtle_2:M2_DIR
enable_pin = !Turtle_2:M2_EN
microsteps = 16
rotation_distance = 4.65
dist_hub = 110.0
park_dist = 10
led_index = AFC_Indicator_2:2
afc_motor_rwd = Turtle_2:MOT2_RWD
afc_motor_fwd = Turtle_2:MOT2_FWD
afc_motor_enb = Turtle_2:MOT2_EN
rwd_speed_multiplier = 0.5
fwd_speed_multiplier = 0.5
pwm = True
prep = ^!Turtle_2:TRG2
load = ^Turtle_2:EXT2
[tmc2209 AFC_stepper lane6]
uart_pin = Turtle_2:M2_UART
uart_address = 0
run_current = 0.8
sense_resistor = 0.110
[AFC_stepper lane7]
unit = Turtle_2:3
step_pin = Turtle_2:M3_STEP
dir_pin = !Turtle_2:M3_DIR
enable_pin = !Turtle_2:M3_EN
microsteps = 16
rotation_distance = 4.65
dist_hub = 110.0
park_dist = 10
led_index = AFC_Indicator_2:3
afc_motor_rwd = Turtle_2:MOT3_RWD
afc_motor_fwd = Turtle_2:MOT3_FWD
afc_motor_enb = Turtle_2:MOT3_EN
rwd_speed_multiplier = 0.5
fwd_speed_multiplier = 0.5
pwm = True
prep = ^!Turtle_2:TRG3
load = ^Turtle_2:EXT3
[tmc2209 AFC_stepper lane7]
uart_pin = Turtle_2:M3_UART
uart_address = 0
run_current = 0.8
sense_resistor = 0.110
[AFC_stepper lane8]
unit = Turtle_2:4
step_pin = Turtle_2:M4_STEP
dir_pin = !Turtle_2:M4_DIR
enable_pin = !Turtle_2:M4_EN
microsteps = 16
rotation_distance = 4.65
dist_hub = 180.0
park_dist = 10
led_index = AFC_Indicator_2:4
afc_motor_rwd = Turtle_2:MOT4_RWD
afc_motor_fwd = Turtle_2:MOT4_FWD
afc_motor_enb = Turtle_2:MOT4_EN
rwd_speed_multiplier = 0.5
fwd_speed_multiplier = 0.5
pwm = True
prep = ^!Turtle_2:TRG4
load = ^Turtle_2:EXT4
[tmc2209 AFC_stepper lane8]
uart_pin = Turtle_2:M4_UART
uart_address = 0
run_current = 0.8
sense_resistor = 0.110
[AFC_hub Turtle_2]
switch_pin = ^Turtle_2:HUB
afc_bowden_length = 2445.0
move_dis = 50
cut = False
assisted_retract = False
cut_cmd = AFC
cut_dist = 50
cut_clear = 120
cut_min_length = 300.0
cut_servo_pass_angle = 10
cut_servo_clip_angle = 180
cut_servo_prep_angle = 80
[AFC_led AFC_Indicator_2]
pin = Turtle_2:RGB1
chain_count = 4
color_order = GRBW
[servo cutter_actuator]
pin = PB6
maximum_servo_angle = 180
minimum_pulse_width = 0.0005
maximum_pulse_width = 0.0025
initial_angle = 0
[delayed_gcode actuator]
initial_duration = 3
gcode =
SET_SERVO SERVO=cutter_actuator ANGLE=90
G4 P1000
SET_SERVO SERVO=cutter_actuator ANGLE=0
[gcode_macro deploy_actuator]
gcode =
SET_SERVO SERVO=cutter_actuator ANGLE=180
[gcode_macro stow_actuator]
gcode =
SET_SERVO SERVO=cutter_actuator ANGLE=0
[beacon model default]
model_coef = 1.454271046021162,
1.760722380109884,
0.723336437131532,
0.34941767439206506,
0.3276880118736016,
0.3342507526841628,
-0.07234733414357813,
-0.22858845434742733,
0.16686409206848246,
0.1879369693065624
model_domain = 1.8160720597506062e-07,1.9307506131326977e-07
model_range = 0.200000,5.000000
model_temp = 48.857232
model_offset = 0.34900
[bed_mesh ratos]
version = 1
points =
0.091023, 0.092963, 0.095142, 0.096224, 0.097968, 0.095030, 0.092112, 0.087336, 0.081910, 0.074641, 0.066498, 0.062016, 0.056972, 0.049323, 0.045043, 0.039596, 0.036852, 0.030289, 0.029613, 0.026252, 0.024045, 0.022688, 0.023521, 0.021486, 0.024160, 0.021341, 0.022112, 0.023162, 0.020577, 0.019864, 0.018366, 0.018380, 0.016062, 0.014576, 0.016948, 0.015899, 0.019402, 0.023704, 0.023765, 0.030572, 0.034268, 0.036646, 0.042965, 0.045580, 0.043573
0.089806, 0.093755, 0.095176, 0.095886, 0.096461, 0.092489, 0.090049, 0.086566, 0.078915, 0.073273, 0.067168, 0.061070, 0.055183, 0.051475, 0.049176, 0.042874, 0.042304, 0.039048, 0.034603, 0.031459, 0.028924, 0.026577, 0.026427, 0.024474, 0.025887, 0.025401, 0.028651, 0.025784, 0.025383, 0.022613, 0.020505, 0.019055, 0.017622, 0.014593, 0.017932, 0.018355, 0.016230, 0.022682, 0.023812, 0.026661, 0.033946, 0.033952, 0.037160, 0.041451, 0.040082
0.085153, 0.089109, 0.090682, 0.092252, 0.090794, 0.089006, 0.086016, 0.079305, 0.074329, 0.070604, 0.062127, 0.059774, 0.055386, 0.049102, 0.045578, 0.040054, 0.039628, 0.036664, 0.031546, 0.031274, 0.027693, 0.025440, 0.026022, 0.022646, 0.025381, 0.026076, 0.025274, 0.027401, 0.026771, 0.024628, 0.024956, 0.021446, 0.018624, 0.019255, 0.017574, 0.015851, 0.018358, 0.019505, 0.020995, 0.023706, 0.024910, 0.026511, 0.031024, 0.030255, 0.030776
0.088476, 0.092023, 0.090310, 0.088719, 0.088321, 0.085028, 0.081958, 0.077433, 0.072147, 0.067638, 0.061958, 0.055986, 0.051482, 0.047135, 0.042804, 0.039575, 0.035571, 0.031573, 0.031541, 0.027876, 0.025120, 0.026280, 0.025493, 0.028105, 0.027956, 0.028569, 0.031363, 0.028725, 0.027156, 0.027603, 0.023508, 0.021319, 0.020376, 0.017428, 0.019380, 0.017786, 0.019319, 0.021705, 0.024248, 0.025122, 0.028226, 0.029258, 0.031132, 0.030875, 0.031879
0.082949, 0.084915, 0.088340, 0.087102, 0.086918, 0.085833, 0.083153, 0.078133, 0.071762, 0.067529, 0.062128, 0.056440, 0.054795, 0.048979, 0.044569, 0.040218, 0.037685, 0.033243, 0.028113, 0.028143, 0.027334, 0.024166, 0.026857, 0.027434, 0.027123, 0.029047, 0.029640, 0.029156, 0.028233, 0.026615, 0.023183, 0.019728, 0.016063, 0.014526, 0.014642, 0.013590, 0.014030, 0.017706, 0.019418, 0.021471, 0.025433, 0.026440, 0.028941, 0.029815, 0.030504
0.083504, 0.088480, 0.088740, 0.089239, 0.090354, 0.087293, 0.084212, 0.078588, 0.072125, 0.066282, 0.060857, 0.054188, 0.048381, 0.044226, 0.040008, 0.035672, 0.033277, 0.029078, 0.025453, 0.024822, 0.023655, 0.024331, 0.026133, 0.028094, 0.027799, 0.028557, 0.029871, 0.027179, 0.024251, 0.023465, 0.020135, 0.018755, 0.016331, 0.013980, 0.014513, 0.013872, 0.015593, 0.018418, 0.021437, 0.024018, 0.025776, 0.029084, 0.028811, 0.028216, 0.029164
0.087927, 0.093797, 0.098374, 0.097845, 0.096272, 0.097443, 0.092131, 0.085968, 0.081140, 0.074896, 0.066579, 0.061483, 0.054759, 0.049246, 0.043494, 0.039163, 0.036329, 0.030629, 0.028825, 0.026426, 0.025313, 0.024513, 0.026317, 0.028029, 0.027706, 0.029286, 0.030082, 0.028901, 0.026112, 0.022625, 0.020030, 0.016239, 0.013314, 0.011987, 0.014133, 0.011368, 0.013160, 0.016681, 0.019030, 0.024039, 0.025760, 0.025525, 0.030829, 0.031124, 0.028994
0.097367, 0.100371, 0.103048, 0.104258, 0.104982, 0.102334, 0.098385, 0.093645, 0.087137, 0.078168, 0.072519, 0.065211, 0.058132, 0.052922, 0.047693, 0.043808, 0.038805, 0.034295, 0.032569, 0.029093, 0.029429, 0.030978, 0.033201, 0.034417, 0.035284, 0.035904, 0.035956, 0.033121, 0.028010, 0.025146, 0.019954, 0.015389, 0.012864, 0.008536, 0.009411, 0.009384, 0.010453, 0.012864, 0.014893, 0.019406, 0.024057, 0.026501, 0.028011, 0.030384, 0.033426
0.093367, 0.100109, 0.105692, 0.106670, 0.107842, 0.107843, 0.102084, 0.097608, 0.091487, 0.085452, 0.078330, 0.071547, 0.066661, 0.060993, 0.054484, 0.050613, 0.045539, 0.044452, 0.041890, 0.039634, 0.039734, 0.039861, 0.041898, 0.043465, 0.045465, 0.043955, 0.044525, 0.042244, 0.036828, 0.031147, 0.027720, 0.020985, 0.015664, 0.013107, 0.012242, 0.011426, 0.012520, 0.017046, 0.019063, 0.023075, 0.026057, 0.027682, 0.032122, 0.035020, 0.032624
0.084108, 0.089527, 0.091761, 0.094979, 0.097159, 0.093962, 0.090919, 0.087797, 0.082502, 0.076194, 0.071346, 0.066220, 0.063992, 0.058676, 0.056138, 0.053542, 0.050926, 0.049786, 0.046776, 0.046102, 0.045872, 0.045753, 0.048098, 0.047872, 0.046265, 0.046080, 0.045425, 0.039836, 0.036253, 0.031105, 0.025621, 0.022193, 0.017851, 0.013777, 0.016215, 0.014789, 0.015557, 0.018460, 0.019475, 0.022155, 0.025050, 0.027780, 0.026425, 0.027743, 0.029834
0.047687, 0.054482, 0.063660, 0.068022, 0.066795, 0.071453, 0.073571, 0.069945, 0.068368, 0.066087, 0.063016, 0.059401, 0.057281, 0.055473, 0.053341, 0.050899, 0.050294, 0.048932, 0.047967, 0.047142, 0.044962, 0.044656, 0.046674, 0.046384, 0.046034, 0.046560, 0.045182, 0.042807, 0.039529, 0.034085, 0.029253, 0.025067, 0.019415, 0.015412, 0.014762, 0.013685, 0.012655, 0.016303, 0.018710, 0.019890, 0.023226, 0.025088, 0.026052, 0.027925, 0.026686
-0.004311, 0.002233, 0.011198, 0.017793, 0.023349, 0.028646, 0.029623, 0.033117, 0.034852, 0.031301, 0.031234, 0.029998, 0.028674, 0.028821, 0.030630, 0.030501, 0.032125, 0.033937, 0.034690, 0.037393, 0.041094, 0.044647, 0.049079, 0.050959, 0.048869, 0.048822, 0.047069, 0.042479, 0.038411, 0.035488, 0.030121, 0.026343, 0.023681, 0.019008, 0.020074, 0.019758, 0.019305, 0.024581, 0.027662, 0.030614, 0.033924, 0.038906, 0.036962, 0.037061, 0.039146
-0.086865, -0.075061, -0.063307, -0.054552, -0.048299, -0.040463, -0.033833, -0.030720, -0.028064, -0.023402, -0.019935, -0.015558, -0.011698, -0.006696, 0.003399, 0.006518, 0.013612, 0.021223, 0.025726, 0.034751, 0.042328, 0.049064, 0.057958, 0.061599, 0.064164, 0.063613, 0.061156, 0.056691, 0.050932, 0.047449, 0.040728, 0.036667, 0.030941, 0.026885, 0.027592, 0.026207, 0.025263, 0.030225, 0.033604, 0.036722, 0.041703, 0.042912, 0.046107, 0.045048, 0.043271
-0.196388, -0.181827, -0.168882, -0.152901, -0.137123, -0.124726, -0.113888, -0.100577, -0.092319, -0.082551, -0.072148, -0.063674, -0.053681, -0.041192, -0.031234, -0.019921, -0.010787, -0.003511, 0.005841, 0.013038, 0.020500, 0.029431, 0.036308, 0.041493, 0.044190, 0.045412, 0.047774, 0.048074, 0.043302, 0.041550, 0.038256, 0.033464, 0.029877, 0.024358, 0.024218, 0.024156, 0.024406, 0.027783, 0.030613, 0.032859, 0.036960, 0.038457, 0.037468, 0.038127, 0.038979
x_count = 45
y_count = 14
mesh_x_pps = 2
mesh_y_pps = 2
algo = bicubic
tension = 0.2
min_x = 147.779
max_x = 352.221
min_y = 124.379
max_y = 375.621
[skew_correction my_skew]
xy_skew = -0.0007121000592710458
xz_skew = 0.0
yz_skew = 0.0