# 4: config file [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32f446xx_200037000550314D35323820-if00 restart_method = command [skew_correction] [shaketune] result_folder = ~/printer_data/config/ShakeTune_results number_of_results_to_keep = 10 keep_raw_data = False show_macros_in_webui = True timeout = 600 measurements_chunk_size = 2 max_freq = 200 dpi = 300 [input_shaper] shaper_freq_x = 53.8 shaper_type_x = mzv shaper_freq_y = 38.0 shaper_type_y = mzv damping_ratio_x = 0.066 damping_ratio_y = 0.046 [mcu nhk] serial = /dev/serial/by-id/usb-Klipper_rp2040_4E363334320B287B-if00 restart_method = command [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set allow_park = client.park_at_cancel|default(false)|lower == 'true' %} {% set retract = client.cancel_retract|default(5.0)|abs %} {% set park_x = "" if (client.park_at_cancel_x|default(none) is none) else "X=" ~ client.park_at_cancel_x %} {% set park_y = "" if (client.park_at_cancel_y|default(none) is none) else "Y=" ~ client.park_at_cancel_y %} {% set custom_park = park_x|length > 0 or park_y|length > 0 %} {% if printer['gcode_macro RESUME'].restore_idle_timeout > 0 %} SET_IDLE_TIMEOUT TIMEOUT={printer['gcode_macro RESUME'].restore_idle_timeout} {% endif %} {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} _CLIENT_RETRACT LENGTH={retract} TURN_OFF_HEATERS M106 S0 {client.user_cancel_macro|default("")} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False SET_PAUSE_NEXT_LAYER ENABLE=0 SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 CANCEL_PRINT_BASE [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set idle_timeout = client.idle_timeout|default(0) %} {% set temp = printer[printer.toolhead.extruder].target if printer.toolhead.extruder != '' else 0 %} {% set restore = False if printer.toolhead.extruder == '' else True if params.RESTORE|default(1)|int == 1 else False %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder_temp VALUE="{{'restore': restore, 'temp': temp}}" {% if idle_timeout > 0 %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=restore_idle_timeout VALUE={printer.configfile.settings.idle_timeout.timeout} SET_IDLE_TIMEOUT TIMEOUT={idle_timeout} {% endif %} PAUSE_BASE {client.user_pause_macro|default("")} _TOOLHEAD_PARK_PAUSE_CANCEL {rawparams} [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} {% set sp_move = client.speed_move|default(velocity) %} {% set runout_resume = True if client.runout_sensor|default("") == "" else True if not printer[client.runout_sensor].enabled else printer[client.runout_sensor].filament_detected %} {% set can_extrude = True if printer.toolhead.extruder == '' else printer[printer.toolhead.extruder].can_extrude %} {% set do_resume = False %} {% set prompt_txt = [] %} {% if printer.idle_timeout.state|upper == "IDLE" or idle_state %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False {% if last_extruder_temp.restore %} RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % (printer.toolhead.extruder, last_extruder_temp.temp) }' M109 S{last_extruder_temp.temp} {% set do_resume = True %} {% elif can_extrude %} {% set do_resume = True %} {% else %} RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}' {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} {% endif %} {% elif can_extrude %} {% set do_resume = True %} {% else %} RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}' {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} {% endif %} {% if runout_resume %} {% if do_resume %} {% if restore_idle_timeout > 0 %} SET_IDLE_TIMEOUT TIMEOUT={restore_idle_timeout} {% endif %} {client.user_resume_macro|default("")} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} {% endif %} {% else %} RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" detects no filament, please load filament and press RESUME" % (client.runout_sensor.split(" "))[1]}' {% set _d = prompt_txt.append("\"%s\" detects no filament, please load filament and press RESUME" % (client.runout_sensor.split(" "))[1]) %} {% endif %} {% if not (runout_resume and do_resume) %} RESPOND TYPE=command MSG="action:prompt_begin RESUME aborted !!!" {% for element in prompt_txt %} RESPOND TYPE=command MSG='{"action:prompt_text %s" % element}' {% endfor %} RESPOND TYPE=command MSG="action:prompt_footer_button Ok|RESPOND TYPE=command MSG=action:prompt_end|info" RESPOND TYPE=command MSG="action:prompt_show" {% endif %} [gcode_macro SET_PAUSE_NEXT_LAYER] description = Enable a pause if the next layer is reached gcode = {% set pause_next_layer = printer['gcode_macro SET_PRINT_STATS_INFO'].pause_next_layer %} {% set ENABLE = params.ENABLE|default(1)|int != 0 %} {% set MACRO = params.MACRO|default(pause_next_layer.call, True) %} SET_GCODE_VARIABLE MACRO=SET_PRINT_STATS_INFO VARIABLE=pause_next_layer VALUE="{{ 'enable': ENABLE, 'call': MACRO }}" [gcode_macro SET_PAUSE_AT_LAYER] description = Enable/disable a pause if a given layer number is reached gcode = {% set pause_at_layer = printer['gcode_macro SET_PRINT_STATS_INFO'].pause_at_layer %} {% set ENABLE = params.ENABLE|int != 0 if params.ENABLE is defined else params.LAYER is defined %} {% set LAYER = params.LAYER|default(pause_at_layer.layer)|int %} {% set MACRO = params.MACRO|default(pause_at_layer.call, True) %} SET_GCODE_VARIABLE MACRO=SET_PRINT_STATS_INFO VARIABLE=pause_at_layer VALUE="{{ 'enable': ENABLE, 'layer': LAYER, 'call': MACRO }}" [gcode_macro SET_PRINT_STATS_INFO] rename_existing = SET_PRINT_STATS_INFO_BASE description = Overwrite, to get pause_next_layer and pause_at_layer feature variable_pause_next_layer = { 'enable': False, 'call': "PAUSE" } variable_pause_at_layer = { 'enable': False, 'layer': 0, 'call': "PAUSE" } gcode = {% if pause_next_layer.enable %} RESPOND TYPE=echo MSG='{"%s, forced by pause_next_layer" % pause_next_layer.call}' {pause_next_layer.call} SET_PAUSE_NEXT_LAYER ENABLE=0 {% elif pause_at_layer.enable and params.CURRENT_LAYER is defined and params.CURRENT_LAYER|int == pause_at_layer.layer %} RESPOND TYPE=echo MSG='{"%s, forced by pause_at_layer [%d]" % (pause_at_layer.call, pause_at_layer.layer)}' {pause_at_layer.call} SET_PAUSE_AT_LAYER ENABLE=0 {% endif %} SET_PRINT_STATS_INFO_BASE {rawparams} [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] description = Helper: park toolhead used in PAUSE and CANCEL_PRINT gcode = {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} {% set use_custom = client.use_custom_pos|default(false)|lower == 'true' %} {% set custom_park_x = client.custom_park_x|default(0.0) %} {% set custom_park_y = client.custom_park_y|default(0.0) %} {% set park_dz = client.custom_park_dz|default(2.0)|abs %} {% set sp_hop = client.speed_hop|default(15) * 60 %} {% set sp_move = client.speed_move|default(velocity) * 60 %} {% set origin = printer.gcode_move.homing_origin %} {% set act = printer.gcode_move.gcode_position %} {% set max = printer.toolhead.axis_maximum %} {% set cone = printer.toolhead.cone_start_z|default(max.z) %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set z_min = params.Z_MIN|default(0)|float %} {% set z_park = [[(act.z + park_dz), z_min]|max, (max.z - origin.z)]|min %} {% set x_park = params.X if params.X is defined else custom_park_x if use_custom else 0.0 if round_bed else (max.x - 5.0) %} {% set y_park = params.Y if params.Y is defined else custom_park_y if use_custom else (max.y - 5.0) if round_bed and z_park < cone else 0.0 if round_bed else (max.y - 5.0) %} _CLIENT_RETRACT {% if "xyz" in printer.toolhead.homed_axes %} G90 G1 Z{z_park} F{sp_hop} G1 X{x_park} Y{y_park} F{sp_move} {% if not printer.gcode_move.absolute_coordinates %} G91 {% endif %} {% else %} RESPOND TYPE=echo MSG='Printer not homed' {% endif %} [gcode_macro _CLIENT_EXTRUDE] description = Extrudes, if the extruder is hot enough gcode = {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set use_fw_retract = (client.use_fw_retract|default(false)|lower == 'true') and (printer.firmware_retraction is defined) %} {% set length = params.LENGTH|default(client.unretract)|default(1.0)|float %} {% set speed = params.SPEED|default(client.speed_unretract)|default(35) %} {% set absolute_extrude = printer.gcode_move.absolute_extrude %} {% if printer.toolhead.extruder != '' %} {% if printer[printer.toolhead.extruder].can_extrude %} {% if use_fw_retract %} {% if length < 0 %} G10 {% else %} G11 {% endif %} {% else %} M83 G1 E{length} F{(speed|float|abs) * 60} {% if absolute_extrude %} M82 {% endif %} {% endif %} {% else %} RESPOND TYPE=echo MSG='{"\"%s\" not hot enough" % printer.toolhead.extruder}' {% endif %} {% endif %} [gcode_macro _CLIENT_RETRACT] description = Retracts, if the extruder is hot enough gcode = {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set length = params.LENGTH|default(client.retract)|default(1.0)|float %} {% set speed = params.SPEED|default(client.speed_retract)|default(35) %} _CLIENT_EXTRUDE LENGTH=-{length|float|abs} SPEED={speed|float|abs} [gcode_macro _CLIENT_LINEAR_MOVE] description = Linear move with save and restore of the gcode state gcode = {% set x_move = "X" ~ params.X if params.X is defined else "" %} {% set y_move = "Y" ~ params.Y if params.Y is defined else "" %} {% set z_move = "Z" ~ params.Z if params.Z is defined else "" %} {% set e_move = "E" ~ params.E if params.E is defined else "" %} {% set rate = "F" ~ params.F if params.F is defined else "" %} {% set ABSOLUTE = params.ABSOLUTE | default(0) | int != 0 %} {% set ABSOLUTE_E = params.ABSOLUTE_E | default(0) | int != 0 %} SAVE_GCODE_STATE NAME=_client_movement {% if x_move or y_move or z_move %} G9{ 0 if ABSOLUTE else 1 } {% endif %} {% if e_move %} M8{ 2 if ABSOLUTE_E else 3 } {% endif %} G1 { x_move } { y_move } { z_move } { e_move } { rate } RESTORE_GCODE_STATE NAME=_client_movement [gcode_macro _User_Variables] variable_verbose = True variable_debug = False variable_travel_speed = 200 variable_move_accel = 1000 variable_dock_speed = 50 variable_release_speed = 75 variable_z_drop_speed = 20 variable_safe_z = 25 variable_enable_z_hop = True variable_max_bed_y = 350 variable_max_bed_x = 350 variable_z_endstop_x = 229 variable_z_endstop_y = 350 variable_docklocation_x = 64.00 variable_docklocation_y = 349.00 variable_docklocation_z = -128 variable_enable_dock_servo = False variable_servo_name = 'NAME' variable_servo_deploy = 10 variable_servo_retract = 11 variable_servo_delay = 250 variable_dockmove_x = 40 variable_dockmove_y = 0 variable_dockmove_z = 0 variable_attachmove_x = 0 variable_attachmove_y = 25 variable_attachmove_z = 0 variable_umbilical = False variable_umbilical_x = 15 variable_umbilical_y = 15 variable_park_toolhead = True variable_parkposition_x = 175 variable_parkposition_y = 175 variable_parkposition_z = 30 variable_version = 1 variable_attachmove2_x = 0 variable_attachmove2_y = 0 variable_attachmove2_z = 0 variable_home_backoff_x = 10 variable_home_backoff_y = 10 variable_override_homing = '' gcode = {% set Mx = printer['configfile'].config["stepper_x"]["position_max"]|float %} {% set My = printer['configfile'].config["stepper_y"]["position_max"]|float %} {% set Ox = printer['configfile'].config["probe"]["x_offset"]|float %} {% set Oy = printer['configfile'].config["probe"]["y_offset"]|float %} {% set Oz = printer['configfile'].config["probe"]["z_offset"]|float %} {% if z_endstop_x != 0 or z_endstop_y != 0 %} SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=z_endstop_x VALUE={ z_endstop_x } SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=z_endstop_y VALUE={ z_endstop_y } {% else %} SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=z_endstop_x VALUE={ (Mx * 0.5) - Ox } SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=z_endstop_y VALUE={ (My * 0.5) - Oy } {% endif %} [gcode_macro _Probe_Variables] variable_probe_attached = False variable_probe_state = False variable_probe_lock = False variable_probe_z_homed = False variable_z_endstop_x = 0 variable_z_endstop_y = 0 gcode = [gcode_macro _klicky_check_variables_version] gcode = {% set version = printer["gcode_macro _User_Variables"].version|default(0) %} {% if version != 1 %} { action_raise_error("Please update your klicky variables, there are some functionality changes") } {% endif %} [gcode_macro _KlickyDebug] gcode = {% set message = params.MSG %} {% set debug = printer["gcode_macro _User_Variables"].debug|default(False) %} {% if debug %} { action_respond_info(message) } {% endif %} [gcode_macro _exit_point] gcode = {% set function = 'pre_' ~ params.FUNCTION %} {% set move = params.MOVE|default(0) %} {% set speed = printer["gcode_macro _User_Variables"].travel_speed %} M400 SET_VELOCITY_LIMIT ACCEL={printer.configfile.settings.printer.max_accel} RESTORE_GCODE_STATE NAME={function} MOVE={move} MOVE_SPEED={speed} [gcode_macro _entry_point] gcode = {% set function = 'pre_' ~ params.FUNCTION %} {% set move_accel = printer["gcode_macro _User_Variables"].move_accel|default(1000) %} M400 SAVE_GCODE_STATE NAME={function} SET_GCODE_OFFSET Z=0 G90 SET_VELOCITY_LIMIT ACCEL={move_accel} [gcode_macro _Homing_Variables] gcode = {% set reset = params.RESET|default(0) %} {% if reset %} SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_lock VALUE={ False } {% endif %} [gcode_macro Attach_Probe_Lock] description = Attaches Klicky Probe, can only be docked after unlocking gcode = Attach_Probe _Probe_Lock [gcode_macro Dock_Probe_Unlock] description = Docks Klicky Probe even if it was locked gcode = _Probe_Unlock Dock_Probe [gcode_macro _Probe_Unlock] description = Unlocks Klicky Probe state gcode = _KlickyDebug msg="_Probe_Lock setting probe_lock variable to False" SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_lock VALUE={ False } [gcode_macro _Probe_Lock] description = Locks Klicky Probe state gcode = _KlickyDebug msg="_Probe_Lock setting probe_lock variable to True" SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_lock VALUE={ True } [gcode_macro _DeployKlickyDock] description = Deploys Klicky servo-controlled dock gcode = {% set enable_dock_servo = printer["gcode_macro _User_Variables"].enable_dock_servo|default(False) %} {% set servo_delay = printer["gcode_macro _User_Variables"].servo_delay|default(1000)|int %} {% set servo_name = printer["gcode_macro _User_Variables"].servo_name %} {% set servo_deploy = printer["gcode_macro _User_Variables"].servo_deploy|default(360)|float %} M400 {% if enable_dock_servo != False %} _KlickyDebug msg="_DeployKlickyDock Klicky servo configuration enabled" {% if servo_deploy == 360 %} { action_raise_error("Klicky: servo active on klicky-variables, but no servo deploy angle specified") } {% endif %} _KlickyDebug msg="_DeployKlickyDock SET_SERVO SERVO={servo_name|string} ANGLE={servo_deploy}" SET_SERVO SERVO={servo_name|string} ANGLE={servo_deploy} M400 G4 P{servo_delay} _KlickyDebug msg="_DeployKlickyDock SET_SERVO SERVO={servo_name|string} WIDTH=0" SET_SERVO SERVO={servo_name|string} WIDTH=0 {% elif printer["gcode_macro _DeployDock"] is defined %} _KlickyDebug msg="_DeployKlickyDock calling _DeployDock" _DeployDock {% endif %} [gcode_macro _RetractKlickyDock] description = Retracts Klicky servo-controlled dock gcode = {% set enable_dock_servo = printer["gcode_macro _User_Variables"].enable_dock_servo|default(False) %} {% set servo_delay = printer["gcode_macro _User_Variables"].servo_delay|default(1000)|int %} {% set servo_name = printer["gcode_macro _User_Variables"].servo_name %} {% set servo_retract = printer["gcode_macro _User_Variables"].servo_retract|default(360)|float %} M400 {% if enable_dock_servo != False %} _KlickyDebug msg="_RetractKlickyDock Klicky servo configuration enabled" {% if servo_retract == 360 %} { action_raise_error("Klicky: servo active on klicky-variables, but no servo retract angle specified") } {% endif %} _KlickyDebug msg="_RetractKlickyDock SET_SERVO SERVO={servo_name|string} ANGLE={servo_retract}" SET_SERVO SERVO={servo_name|string} ANGLE={servo_retract} M400 G4 P{servo_delay} _KlickyDebug msg="_RetractKlickyDock SET_SERVO SERVO={servo_name|string} WIDTH=0" SET_SERVO SERVO={servo_name|string} WIDTH=0 {% elif printer["gcode_macro _RetractDock"] is defined %} _KlickyDebug msg="_RetractKlickyDock calling _RetractDock" _RetractDock {% endif %} [gcode_macro Attach_Probe] description = Attaches Klicky Probe gcode = {% set goback = params.BACK|default(0) %} {% set probe_attached = printer["gcode_macro _Probe_Variables"].probe_attached %} {% set probe_lock = printer["gcode_macro _Probe_Variables"].probe_lock %} {% set verbose = printer["gcode_macro _User_Variables"].verbose %} {% set dockmove_x = printer["gcode_macro _User_Variables"].dockmove_x|default(0)|float %} {% set dockmove_y = printer["gcode_macro _User_Variables"].dockmove_y|default(0)|float %} {% set dockmove_z = printer["gcode_macro _User_Variables"].dockmove_z|default(0)|float %} {% set docklocation_x = printer["gcode_macro _User_Variables"].docklocation_x|float %} {% set docklocation_y = printer["gcode_macro _User_Variables"].docklocation_y|float %} {% set docklocation_z = printer["gcode_macro _User_Variables"].docklocation_z|float %} {% set attachmove_x = printer["gcode_macro _User_Variables"].attachmove_x|default(0)|float %} {% set attachmove_y = printer["gcode_macro _User_Variables"].attachmove_y|default(0)|float %} {% set attachmove_z = printer["gcode_macro _User_Variables"].attachmove_z|default(0)|float %} {% set attachmove2_x = printer["gcode_macro _User_Variables"].attachmove2_x|default(0)|float %} {% set attachmove2_y = printer["gcode_macro _User_Variables"].attachmove2_y|default(0)|float %} {% set attachmove2_z = printer["gcode_macro _User_Variables"].attachmove2_z|default(0)|float %} {% set safe_z = printer["gcode_macro _User_Variables"].safe_z %} {% set enable_z_hop = printer["gcode_macro _User_Variables"].enable_z_hop %} {% set travel_feedrate = printer["gcode_macro _User_Variables"].travel_speed * 60 %} {% set dock_feedrate = printer["gcode_macro _User_Variables"].dock_speed * 60 %} {% set release_feedrate = printer["gcode_macro _User_Variables"].release_speed * 60 %} {% set z_drop_feedrate = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %} {% set bypass_probe_docking = printer["gcode_macro _User_Variables"].bypass_probe_docking|default(False) %} _entry_point function=Attach_Probe {% if bypass_probe_docking == False %} {% if not 'xy' in printer.toolhead.homed_axes %} { action_raise_error("Must Home X and Y Axis First!") } _KlickyDebug msg="Attach_Probe Axis homed" {% elif not probe_attached and not probe_lock %} _KlickyDebug msg="Attach_Probe going to attach probe" {% if verbose %} { action_respond_info("Attaching Probe") } {% endif %} _KLICKY_STATUS_BUSY {% if not 'z' in printer.toolhead.homed_axes %} {% if verbose %} { action_respond_info("Resetting Z position to zero") } {% endif %} _KlickyDebug msg="Attach_Probe Z not homed, setting position as X=Y=Z=0" SET_KINEMATIC_POSITION Z=0 {% if not enable_z_hop %} _KlickyDebug msg="Attach_Probe z_hop disabled" {% set safe_z = 0 %} {% endif %} {% endif %} {% if printer.gcode_move.gcode_position.z < safe_z %} _KlickyDebug msg="Attach_Probe toolhead too low, raising it to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm" {% if verbose %} { action_respond_info("moving to a safe Z distance") } {% endif %} G0 Z{safe_z} F{z_drop_feedrate} {% endif %} {% if not 'z' in printer.toolhead.homed_axes %} {% if verbose %} { action_respond_info("Resetting Z position to zero, duplicate?") } {% endif %} _KlickyDebug msg="Attach_Probe Z not homed, setting position as X=Y=Z=0" SET_KINEMATIC_POSITION Z=0 {% endif %} {% if printer.gcode_move.gcode_position.z < safe_z %} _KlickyDebug msg="Attach_Probe toolhead too low, raising it to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm" G0 Z{safe_z} F{z_drop_feedrate} {% endif %} _Umbilical_Path _entry_point function=Attach_Probe_intern _KlickyDebug msg="Attach_Probe moving near the dock with G0 X{docklocation_x - attachmove_x - attachmove2_x} Y{docklocation_y - attachmove_y - attachmove2_y} F{travel_feedrate}" G0 X{docklocation_x - attachmove_x - attachmove2_x} Y{docklocation_y - attachmove_y - attachmove2_y} F{travel_feedrate} {% if docklocation_z != -128 %} _KlickyDebug msg="Attach_Probe moving near the dock with G0 Z{docklocation_z - attachmove_z - attachmove2_z} F{dock_feedrate}" G0 Z{docklocation_z - attachmove_z - attachmove2_z} F{dock_feedrate} _KlickyDebug msg="Attach_Probe moving near the dock with G0 Z{docklocation_z - attachmove_z} F{dock_feedrate}" G0 Z{docklocation_z - attachmove_z} F{dock_feedrate} {% endif %} _DeployKlickyDock {% if docklocation_z != -128 %} _KlickyDebug msg="Attach_Probe moving to the dock with G0 Z{docklocation_z} F{dock_feedrate}" G0 Z{docklocation_z} F{dock_feedrate} {% endif %} _KlickyDebug msg="Attach_Probe moving to the dock with G0 X{docklocation_x - attachmove2_x} Y{docklocation_y - attachmove2_y} F{dock_feedrate}" G0 X{docklocation_x - attachmove2_x} Y{docklocation_y - attachmove2_y} F{dock_feedrate} _KlickyDebug msg="Attach_Probe moving to the dock with G0 X{docklocation_x} Y{docklocation_y} F{dock_feedrate}" G0 X{docklocation_x} Y{docklocation_y} F{dock_feedrate} {% if docklocation_z != -128 %} _KlickyDebug msg="Attach_Probe moving from the dock to G0 Z{docklocation_z - attachmove_z} F{z_drop_feedrate}" G0 Z{docklocation_z - attachmove_z} F{z_drop_feedrate} {% endif %} _KlickyDebug msg="Attach_Probe moving from the dock to G0 X{docklocation_x - attachmove_x} Y{docklocation_y - attachmove_y} F{release_feedrate}" G0 X{docklocation_x - attachmove_x} Y{docklocation_y - attachmove_y} F{release_feedrate} _RetractKlickyDock {% if ((printer.gcode_move.gcode_position.z < safe_z) or (docklocation_z != -128 and docklocation_z < safe_z ))%} _KlickyDebug msg="Attach_Probe moving to a safe Z position: G0 Z{safe_z} F{z_drop_feedrate} from {printer.gcode_move.gcode_position.z}" G0 Z{safe_z} F{z_drop_feedrate} {% endif %} _Park_Toolhead _CheckProbe action=attach _exit_point function=Attach_Probe_intern move={goback} _KLICKY_STATUS_READY {% elif probe_lock %} {% if verbose %} { action_respond_info("Probe locked!") } {% endif %} _KlickyDebug msg="Attach_Probe probe locked not attaching probe" _CheckProbe action=query {% else %} {% if verbose %} { action_respond_info("Probe already attached!") } {% endif %} _KlickyDebug msg="Attach_Probe probe already attached, doing nothing" _CheckProbe action=query {% endif %} _exit_point function=Attach_Probe {% else %} _KlickyDebug msg="Attach_Probe probe docking bypassed, doing nothing" {% endif %} [gcode_macro Dock_Probe] description = Docks Klicky Probe gcode = {% set goback = params.BACK|default(0) %} {% set probe_attached = printer["gcode_macro _Probe_Variables"].probe_attached %} {% set probe_lock = printer["gcode_macro _Probe_Variables"].probe_lock %} {% set verbose = printer["gcode_macro _User_Variables"].verbose %} {% set dockmove_x = printer["gcode_macro _User_Variables"].dockmove_x|default(0)|float %} {% set dockmove_y = printer["gcode_macro _User_Variables"].dockmove_y|default(0)|float %} {% set dockmove_z = printer["gcode_macro _User_Variables"].dockmove_z|default(0)|float %} {% set docklocation_x = printer["gcode_macro _User_Variables"].docklocation_x|float %} {% set docklocation_y = printer["gcode_macro _User_Variables"].docklocation_y|float %} {% set docklocation_z = printer["gcode_macro _User_Variables"].docklocation_z|float %} {% set attachmove_x = printer["gcode_macro _User_Variables"].attachmove_x|default(0)|float %} {% set attachmove_y = printer["gcode_macro _User_Variables"].attachmove_y|default(0)|float %} {% set attachmove_z = printer["gcode_macro _User_Variables"].attachmove_z|default(0)|float %} {% set safe_z = printer["gcode_macro _User_Variables"].safe_z|float %} {% set travel_feedrate = printer["gcode_macro _User_Variables"].travel_speed * 60 %} {% set dock_feedrate = printer["gcode_macro _User_Variables"].dock_speed * 60 %} {% set release_feedrate = printer["gcode_macro _User_Variables"].release_speed * 60 %} {% set z_drop_feedrate = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %} {% set bypass_probe_docking = printer["gcode_macro _User_Variables"].bypass_probe_docking|default(False) %} {% if bypass_probe_docking == True %} _KlickyDebug msg="Attach_Probe probe docking bypassed, doing nothing" {% endif %} {% if bypass_probe_docking != True %} _entry_point function=Dock_Probe {% if probe_attached and not probe_lock %} _KLICKY_STATUS_BUSY {% if printer.gcode_move.gcode_position.z < safe_z %} _KlickyDebug msg="Dock_Probe toolhead too low, raising it to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm" G0 Z{safe_z} F{z_drop_feedrate} {% endif %} _Umbilical_Path _KlickyDebug msg="Dock_Probe moving near the dock with G0 X{docklocation_x - attachmove_x} Y{docklocation_y - attachmove_y} F{travel_feedrate}" G0 X{docklocation_x - attachmove_x} Y{docklocation_y - attachmove_y} F{travel_feedrate} {% if docklocation_z != -128 %} _KlickyDebug msg="Dock_Probe moving near the dock with G0 Z{docklocation_z - attachmove_z} F{dock_feedrate}" G0 Z{docklocation_z - attachmove_z} F{dock_feedrate} {% endif %} _DeployKlickyDock _KlickyDebug msg="Dock_Probe moving to the dock with G0 X{docklocation_x} Y{docklocation_y} F{dock_feedrate}" G0 X{docklocation_x} Y{docklocation_y} F{dock_feedrate} {% if docklocation_z != -128 %} _KlickyDebug msg="Attach_Probe moving to the dock with G0 Z{docklocation_z} F{dock_feedrate}" G0 Z{docklocation_z} F{dock_feedrate} {% endif %} {% if docklocation_z != -128 %} _KlickyDebug msg="Dock_Probe moving from the dock to G0 Z{docklocation_z + dockmove_z} F{release_feedrate}" G0 Z{docklocation_z + dockmove_z} F{release_feedrate} {% endif %} _KlickyDebug msg="Dock_Probe moving from the dock to G0 X{docklocation_x + dockmove_x} Y{docklocation_y + dockmove_y} F{release_feedrate}" G0 X{docklocation_x + dockmove_x} Y{docklocation_y + dockmove_y} F{release_feedrate} _KlickyDebug msg="Dock_Probe moving away from the dock to G0 X{docklocation_x + dockmove_x - attachmove_x} Y{docklocation_y + dockmove_y - attachmove_y} F{release_feedrate}" G0 X{docklocation_x + dockmove_x - attachmove_x} Y{docklocation_y + dockmove_y - attachmove_y} F{release_feedrate} _RetractKlickyDock {% if (printer.gcode_move.gcode_position.z < safe_z) %} _KlickyDebug msg="Dock_Probe moving to a safe Z position: G0 Z{safe_z} F{z_drop_feedrate} from {printer.gcode_move.gcode_position.z}" G0 Z{safe_z} F{z_drop_feedrate} {% endif %} _Park_Toolhead G4 P1000 _CheckProbe action=dock _KLICKY_STATUS_READY {% elif probe_lock %} {% if verbose %} { action_respond_info("Probe locked") } {% endif %} _KlickyDebug msg="Dock_Probe probe locked not docking probe" _CheckProbe action=query {% else %} {% if verbose %} { action_respond_info("Probe already docked") } {% endif %} _KlickyDebug msg="Dock_Probe probe already docked, doing nothing" _CheckProbe action=query {% endif %} _exit_point function=Dock_Probe move={goback} {% else %} _KlickyDebug msg="Dock_Probe probe docking bypassed, doing nothing" {% endif %} [gcode_macro PROBE_CALIBRATE] rename_existing = _PROBE_CALIBRATE description = Calibrate the probes z_offset with klicky automount gcode = {% set safe_z = printer["gcode_macro _User_Variables"].safe_z|float %} {% set z_drop_feedrate = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %} {% set max_x = printer["gcode_macro _User_Variables"].max_bed_x|float %} {% set max_y = printer["gcode_macro _User_Variables"].max_bed_y|float %} {% set probe_offset_x = printer['configfile'].config["probe"]["x_offset"]|float %} {% set probe_offset_y = printer['configfile'].config["probe"]["y_offset"]|float %} {% set bypass_probe_docking = printer["gcode_macro _User_Variables"].bypass_probe_docking|default(False) %} {% if not 'xyz' in printer.toolhead.homed_axes %} { action_raise_error("Must Home X, Y and Z Axis First!") } {% endif %} _KlickyDebug msg="probe_calibrate Axis homed" _KlickyDebug msg="probe_calibrate Variables max_x={max_x},max_y={max_y},probe_offset_x={probe_offset_x},probe_offset_y={probe_offset_y}" {% if printer['gcode_move'].position.y > (max_y - probe_offset_y) or printer['gcode_move'].position.y < - probe_offset_y or printer['gcode_move'].position.x > (max_x - probe_offset_x) or printer['gcode_move'].position.x < - probe_offset_x %} { action_raise_error("Must perform PROBE_CALIBRATE with the probe above the BED, check klicky_variables bed size!") } {% endif %} {% if bypass_probe_docking == False %} _CheckProbe action=query G90 Attach_Probe back=1 _KLICKY_STATUS_CALIBRATING_Z _KlickyDebug msg="probe_calibrate calling klipper probe_calibrate" _PROBE_CALIBRATE {% for p in params %}{'%s=%s ' % (p, params[p])}{% endfor %} M118 moving the toolhead 20 mm from the bed _KlickyDebug msg="probe_calibrate Moving Z up by 20mm" TESTZ Z=20 M118 remove manually the probe and continue calibration _KLICKY_STATUS_READY {% else %} _KLICKY_STATUS_CALIBRATING_Z _KlickyDebug msg="probe_calibrate calling klipper probe_calibrate" _PROBE_CALIBRATE {% for p in params %}{'%s=%s ' % (p, params[p])}{% endfor %} _KLICKY_STATUS_READY {% endif %} [gcode_macro PROBE_ACCURACY] rename_existing = _PROBE_ACCURACY description = Probe Z-height accuracy at current XY position with klicky automount gcode = {% set safe_z = printer["gcode_macro _User_Variables"].safe_z|float %} {% set z_drop_feedrate = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %} {% set max_x = printer["gcode_macro _User_Variables"].max_bed_x|float %} {% set max_y = printer["gcode_macro _User_Variables"].max_bed_y|float %} {% set probe_offset_x = printer['configfile'].config["probe"]["x_offset"]|float %} {% set probe_offset_y = printer['configfile'].config["probe"]["y_offset"]|float %} {% if not 'xyz' in printer.toolhead.homed_axes %} { action_raise_error("Must Home X, Y and Z Axis First!") } {% endif %} _KlickyDebug msg="probe_accuracy Axis homed" _KlickyDebug msg="probe_accuracy Variables max_x={max_x},max_y={max_y},probe_offset_x={probe_offset_x},probe_offset_y={probe_offset_y}" _entry_point function=PROBE_ACCURACY {% if printer['gcode_move'].position.y > (max_y - probe_offset_y) or printer['gcode_move'].position.y < - probe_offset_y or printer['gcode_move'].position.x > (max_x - probe_offset_x) or printer['gcode_move'].position.x < - probe_offset_x %} { action_raise_error("Must perform PROBE_ACCURACY with the probe above the BED, check klicky_variables bed size!") } {% endif%} _CheckProbe action=query Attach_Probe back=1 _KlickyDebug msg="probe_accuracy calling klipper probe accuracy" _PROBE_ACCURACY {% for p in params %}{'%s=%s ' % (p, params[p])}{% endfor %} Dock_Probe back=1 _exit_point function=PROBE_ACCURACY move=1 [force_move] enable_force_move = True [homing_override] axes = xyz gcode = _User_Variables {% set verbose = printer["gcode_macro _User_Variables"].verbose %} {% set safe_z = printer["gcode_macro _User_Variables"].safe_z|float %} {% set safe_z = printer["gcode_macro _User_Variables"].safe_z %} {% set enable_z_hop = printer["gcode_macro _User_Variables"].enable_z_hop %} {% set kinematic_z = 0 %} {% set dock_on_zhome = printer["gcode_macro _User_Variables"].dock_on_zhome|default(True) %} {% set attachmove_y = printer["gcode_macro _User_Variables"].attachmove_y|default(0)|float %} {% set z_drop_feedrate = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %} {% set travel_feedrate = printer["gcode_macro _User_Variables"].travel_speed * 60 %} {% set home_backoff_x = printer["gcode_macro _User_Variables"].home_backoff_x|default(0)|float %} {% set home_backoff_y = printer["gcode_macro _User_Variables"].home_backoff_y|default(0)|float %} {% set override_homing = printer["gcode_macro _User_Variables"].override_homing|default('') %} _klicky_check_variables_version _CheckProbe action=query {% set home_x, home_y, home_z, leave_probe_attached = False, False, False, False %} {% if 'PROBE_LOCK' in params%} {% if verbose %} { action_respond_info("PROBE_LOCK = True") } {% endif %} {% set leave_probe_attached = True %} {% endif %} {% if not 'X' in params and not 'Y' in params and not 'Z' in params %} {% set home_x, home_y, home_z = True, True, True %} _KlickyDebug msg="homing_override going to home all axes" {% else %} {% if 'X' in params %} {% set home_x = True %} _KlickyDebug msg="homing_override going to home X" {% endif %} {% if 'Y' in params %} {% set home_y = True %} _KlickyDebug msg="homing_override going to home Y" {% endif %} {% if 'Z' in params %} {% set home_z = True %} _KlickyDebug msg="homing_override going to home Z" {% endif %} {% if 'X' in params and 'Y' in params and 'Z' in params %} _Homing_Variables reset=1 _KlickyDebug msg="homing_override going to home all axes" {% endif %} {% endif %} _entry_point function=homing_override _KLICKY_STATUS_HOMING {% if 'z' not in printer.toolhead.homed_axes %} {% if enable_z_hop == False %} _KlickyDebug msg="homing_override z_hop disabled" {% set kinematic_z = safe_z %} {% set safe_z = safe_z %} {% endif %} {% endif %} {% if 'x' not in printer.toolhead.homed_axes and 'y' not in printer.toolhead.homed_axes and 'z' not in printer.toolhead.homed_axes%} {% if verbose %} { action_respond_info("No axis homed") } {% endif %} _KlickyDebug msg="homing_override no axis homed, setting position as X=Y=0 Z={kinematic_z}" SET_KINEMATIC_POSITION X=0 Y=0 Z={kinematic_z} M400 _KlickyDebug msg="homing_override moving toolhead to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm" {% if verbose %} { action_respond_info("moving to a safe Z distance") } {% endif %} G0 Z{safe_z} F{z_drop_feedrate} {% if home_z != True %} _KlickyDebug msg="homing_override clearing axis homed state if not already homing Z" M84 {% endif %} {% else %} _KlickyDebug msg="All axis homed" {% if printer.gcode_move.gcode_position.z > safe_z %} {% set safe_z = printer.gcode_move.gcode_position.z|float %} _KlickyDebug msg="Setting Safe_z to {printer.gcode_move.gcode_position.z}mm as Z is now above configured safe_z" {% endif %} {% endif %} {% if home_z %} {% if 'x' not in printer.toolhead.homed_axes and 'y' not in printer.toolhead.homed_axes%} {% if verbose %} { action_respond_info("X or Y not homed, forcing full G28") } {% endif %} {% set home_x, home_y, home_z = True, True, True %} {% endif %} {% endif %} {% if ((attachmove_y == 0 and override_homing == '' ) or (override_homing == 'Y'))%} {% if home_y %} {% if override_homing == 'Y' %} _KlickyDebug msg="homing_override Y homing first override, due to override_homing = Y" {% else %} _KlickyDebug msg="homing_override Y homing first override, due to attachmove_y = 0" {% endif %} {% if verbose %} { action_respond_info("Homing Y") } {% endif %} {% if 'z' in printer.toolhead.homed_axes and printer.gcode_move.gcode_position.z < safe_z %} _KlickyDebug msg="homing_override moving toolhead to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm in Y homing seq" {% if verbose %} { action_respond_info("moving to a safe Z distance") } {% endif %} G0 Z{safe_z} F{z_drop_feedrate} {% endif %} {% if printer["gcode_macro _HOME_Y"] is defined %} _KlickyDebug msg="homing_override calling _HOME_Y external script to handle the Y homing" _HOME_Y {% else %} _KlickyDebug msg="homing_override Homing Y G28 Y0" G28 Y0 {% if home_backoff_y != 0 %} {% if (printer.configfile.settings.stepper_y.position_endstop > (printer.configfile.settings.stepper_y.position_min|default(0) + printer.configfile.settings.stepper_y.position_max)/2) %} _KlickyDebug msg="homing_override backing off Y endstop, G0 Y{printer.configfile.settings.stepper_y.position_endstop-home_backoff_y} F{travel_feedrate}" G0 Y{printer.configfile.settings.stepper_y.position_endstop - home_backoff_y} F{travel_feedrate} {% else %} _KlickyDebug msg="homing_override backing off Y endstop, G0 Y{printer.configfile.settings.stepper_y.position_endstop + home_backoff_y} F{travel_feedrate}" G0 Y{printer.configfile.settings.stepper_y.position_endstop + home_backoff_y} F{travel_feedrate} {%endif %} {%endif %} {% endif %} {% endif %} {% set home_y = False %} {% endif %} {% if home_x %} {% if verbose %} { action_respond_info("Homing X") } {% endif %} {% if 'z' in printer.toolhead.homed_axes and printer.gcode_move.gcode_position.z < safe_z %} _KlickyDebug msg="homing_override moving toolhead to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm in X homing seq" {% if verbose %} { action_respond_info("moving to a safe Z distance") } {% endif %} G0 Z{safe_z} F{z_drop_feedrate} {% endif %} {% if printer["gcode_macro _HOME_X"] is defined %} _KlickyDebug msg="homing_override calling _HOME_X external script to handle the X homing" _HOME_X {% else %} _KlickyDebug msg="homing_override Homing X, G28 X0" G28 X0 {% if home_backoff_x != 0 %} {% if (printer.configfile.settings.stepper_x.position_endstop > (printer.configfile.settings.stepper_x.position_min|default(0) + printer.configfile.settings.stepper_x.position_max)/2) %} _KlickyDebug msg="homing_override backing off X endstop, G0 X{printer.configfile.settings.stepper_x.position_endstop - home_backoff_x} F{travel_feedrate}" G0 X{printer.configfile.settings.stepper_x.position_endstop - home_backoff_x} F{travel_feedrate} {% else %} _KlickyDebug msg="homing_override backing off X endstop, G0 X{printer.configfile.settings.stepper_x.position_endstop + home_backoff_x} F{travel_feedrate}" G0 X{printer.configfile.settings.stepper_x.position_endstop + home_backoff_x} F{travel_feedrate} {%endif %} {%endif %} {% endif %} {% endif %} {% if home_y %} {% if verbose %} { action_respond_info("Homing Y") } {% endif %} {% if 'z' in printer.toolhead.homed_axes and printer.gcode_move.gcode_position.z < safe_z %} _KlickyDebug msg="homing_override moving toolhead to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm in Y homing seq" {% if verbose %} { action_respond_info("moving to a safe Z distance") } {% endif %} G0 Z{safe_z} F{z_drop_feedrate} {% endif %} {% if printer["gcode_macro _HOME_Y"] is defined %} _KlickyDebug msg="homing_override calling _HOME_Y external script to handle the Y homing" _HOME_Y {% else %} _KlickyDebug msg="homing_override Homing Y, G28 Y0" G28 Y0 {% if home_backoff_y != 0 %} {% if (printer.configfile.settings.stepper_y.position_endstop > (printer.configfile.settings.stepper_y.position_min|default(0) + printer.configfile.settings.stepper_y.position_max)/2) %} _KlickyDebug msg="homing_override backing off Y endstop, G0 Y{printer.configfile.settings.stepper_y.position_endstop - home_backoff_y} F{travel_feedrate}" G0 Y{printer.configfile.settings.stepper_y.position_endstop - home_backoff_y} F{travel_feedrate} {% else %} _KlickyDebug msg="homing_override backing off Y endstop, G0 Y{printer.configfile.settings.stepper_y.position_endstop + home_backoff_y} F{travel_feedrate}" G0 Y{printer.configfile.settings.stepper_y.position_endstop + home_backoff_y} F{travel_feedrate} {%endif %} {%endif %} {% endif %} {% endif %} {% if home_z %} {% if verbose %} { action_respond_info("Homing Z") } {% endif %} {% if 'z' in printer.toolhead.homed_axes and printer.gcode_move.gcode_position.z < safe_z %} _KlickyDebug msg="homing_override moving toolhead to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm in Y homing seq" {% if verbose %} { action_respond_info("moving to a safe Z distance") } {% endif %} G0 Z{safe_z} F{z_drop_feedrate} {% endif %} {% if 'z_virtual_endstop' in printer['configfile'].config["stepper_z"]["endstop_pin"] %} _KlickyDebug msg="homing_override probe configured as a virtual Z endstop attaching probe" Attach_Probe {% if leave_probe_attached %} _Probe_Lock {% endif %} {% elif dock_on_zhome == True %} Dock_Probe {% endif %} _Home_Z_ {% if 'z_virtual_endstop' in printer['configfile'].config["stepper_z"]["endstop_pin"] %} _KlickyDebug msg="homing_override probe no longer required, docking probe" Dock_Probe {% elif dock_on_zhome == False %} Dock_Probe {% endif %} {% endif %} _CheckProbe action=query _Park_Toolhead _exit_point function=homing_override _KLICKY_STATUS_READY [gcode_macro _Umbilical_Path] gcode = {% set umbilical = printer["gcode_macro _User_Variables"].umbilical %} {% set umbilical_x = printer["gcode_macro _User_Variables"].umbilical_x %} {% set umbilical_y = printer["gcode_macro _User_Variables"].umbilical_y %} {% set safe_z = printer["gcode_macro _User_Variables"].safe_z|float %} {% set travel_feedrate = printer["gcode_macro _User_Variables"].travel_speed * 60 %} {% if umbilical %} _entry_point function=Umbilical_Path _KlickyDebug msg="_Umbilical_Path moving to G0 X{umbilical_x} Y{umbilical_y} Z{safe_z} F{travel_feedrate}" G0 X{umbilical_x} Y{umbilical_y} Z{safe_z} F{travel_feedrate} _exit_point function=Umbilical_Path {% endif %} [gcode_macro _Home_Z_] gcode = {% set z_endstop_x = printer["gcode_macro _Probe_Variables"].z_endstop_x %} {% set z_endstop_y = printer["gcode_macro _Probe_Variables"].z_endstop_y %} {% set safe_z = printer["gcode_macro _User_Variables"].safe_z|float %} {% set travel_feedrate = printer["gcode_macro _User_Variables"].travel_speed * 60 %} {% set z_drop_feedrate = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %} {% set verbose = printer["gcode_macro _User_Variables"].verbose %} _entry_point function=Home_Z {% if not 'xy' in printer.toolhead.homed_axes %} { action_raise_error("Must Home X and Y Axis First!") } {% else %} _KlickyDebug msg="_Home_Z_ XY Axis homed" {% if not 'z' in printer.toolhead.homed_axes %} {% if verbose %} { action_respond_info("Resetting Z position to zero") } {% endif %} _KlickyDebug msg="_Home_Z_ Z not homed, setting position as X=Y=Z=0" SET_KINEMATIC_POSITION Z=0 {% endif %} _KlickyDebug msg="_Home_Z_ moving to Z endstop position G0 X{z_endstop_x} Y{z_endstop_y} F{travel_feedrate}" G0 X{z_endstop_x} Y{z_endstop_y} F{travel_feedrate} _KlickyDebug msg="_Home_Z_ Homing Z G28 Z" G28 Z0 _KlickyDebug msg="_Home_Z_ toolhead too low, raising it to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm" G0 Z{safe_z} F{z_drop_feedrate} {% endif %} _exit_point function=Home_Z [gcode_macro _CheckProbe] variable_probe_state = 0 gcode = Query_Probe _SetProbeState action={ params.ACTION } [gcode_macro _SetProbeState] gcode = {% set query_probe_triggered = printer.probe.last_query %} {% set action = params.ACTION|default('') %} {% if query_probe_triggered %} SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_attached VALUE={ False } {% else %} SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_attached VALUE={ True } {% endif %} {% if action == 'query' %} SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_state VALUE={ query_probe_triggered } {% endif %} {% if not query_probe_triggered and action == 'dock' %} { action_raise_error("Probe dock failed!") } {% endif %} {% if query_probe_triggered and action == 'attach' %} { action_raise_error("Probe attach failed!") } {% endif %} [gcode_macro _Park_Toolhead] gcode = {% set park_toolhead = printer["gcode_macro _User_Variables"].park_toolhead %} {% set parkposition_x = printer["gcode_macro _User_Variables"].parkposition_x %} {% set parkposition_y = printer["gcode_macro _User_Variables"].parkposition_y %} {% set parkposition_z = printer["gcode_macro _User_Variables"].parkposition_z %} {% set travel_feedrate = printer["gcode_macro _User_Variables"].travel_speed * 60 %} {% set verbose = printer["gcode_macro _User_Variables"].verbose %} _entry_point function=Park_Toolhead {% if park_toolhead and 'xyz' in printer.toolhead.homed_axes %} {% if verbose %} { action_respond_info("Parking Toolhead") } {% endif %} {% if parkposition_z == -128 %} _KlickyDebug msg="_Park_Toolhead moving to G0 X{parkposition_x} Y{parkposition_y} F{travel_feedrate}" G0 X{parkposition_x} Y{parkposition_y} F{travel_feedrate} {% else %} _KlickyDebug msg="_Park_Toolhead moving to G0 X{parkposition_x} Y{parkposition_y} Z{parkposition_z} F{travel_feedrate}" G0 X{parkposition_x} Y{parkposition_y} Z{parkposition_z} F{travel_feedrate} {% endif %} {% endif %} _exit_point function=Park_Toolhead [gcode_macro _klicky_status_ready] gcode = {% if printer['gcode_macro status_ready'] is defined %} _KlickyDebug msg="_klicky_status_ready activating the LED STATUS_READY" STATUS_READY {% endif %} [gcode_macro _klicky_status_busy] gcode = {% if printer['gcode_macro status_busy'] is defined %} _KlickyDebug msg="_klicky_status_busy activating the LED STATUS_BUSY" STATUS_BUSY {% endif %} [gcode_macro _klicky_status_leveling] gcode = {% if printer['gcode_macro status_leveling'] is defined %} _KlickyDebug msg="_klicky_status_leveling activating the LED STATUS_LEVELING" STATUS_LEVELING {% endif %} [gcode_macro _klicky_status_homing] gcode = {% if printer['gcode_macro status_homing'] is defined %} _KlickyDebug msg="_klicky_status_homing activating the LED STATUS_HOMING" STATUS_HOMING {% endif %} [gcode_macro _klicky_status_cleaning] gcode = {% if printer['gcode_macro status_cleaning'] is defined %} _KlickyDebug msg="_klicky_status_cleaning activating the LED STATUS_CLEANING" STATUS_CLEANING {% endif %} [gcode_macro _klicky_status_meshing] gcode = {% if printer['gcode_macro status_meshing'] is defined %} _KlickyDebug msg="_klicky_status_meshing activating the LED STATUS_MESHING" STATUS_MESHING {% endif %} [gcode_macro _klicky_status_calibrating_z] gcode = {% if printer['gcode_macro status_calibrating_z'] is defined %} _KlickyDebug msg="_klicky_status_calibrating_z activating the LED STATUS_CALIBRATING_Z" STATUS_CALIBRATING_Z {% endif %} [gcode_macro BED_MESH_CALIBRATE] rename_existing = _BED_MESH_CALIBRATE description = Perform Mesh Bed Leveling with klicky automount gcode = {% set V = printer["gcode_macro _User_Variables"].verbose %} {% if V %} { action_respond_info("Bed Mesh Calibrate") } {% endif %} _CheckProbe action=query G90 Attach_Probe _KLICKY_STATUS_MESHING _BED_MESH_CALIBRATE {% for p in params %}{'%s=%s ' % (p, params[p])}{% endfor %} Dock_Probe [gcode_macro QUAD_GANTRY_LEVEL] rename_existing = _QUAD_GANTRY_LEVEL description = Conform a moving, twistable gantry to the shape of a stationary bed with klicky automount gcode = {% set V = printer["gcode_macro _User_Variables"].verbose %} {% if V %} { action_respond_info("QG Level") } {% endif %} _CheckProbe action=query G90 Attach_Probe _KLICKY_STATUS_LEVELING _QUAD_GANTRY_LEVEL {% for p in params %}{'%s=%s ' % (p, params[p])}{% endfor %} Dock_Probe [z_calibration] nozzle_xy_position = 229.00,350.00 switch_xy_position = 235.00,331.00 wiggle_xy_offsets = 0,0 switch_offset = 4.16 offset_margins = -3,4 speed = 50 probing_first_fast = false start_gcode = Dock_Probe_Unlock before_switch_gcode = Attach_Probe end_gcode = Dock_Probe [printer] kinematics = corexy max_velocity = 300 max_accel = 4220 max_z_velocity = 15 max_z_accel = 350 square_corner_velocity = 5.0 [mcu rpi] serial = /tmp/klipper_host_mcu [adxl345] cs_pin = nhk:gpio21 spi_software_sclk_pin = nhk:gpio18 spi_software_mosi_pin = nhk:gpio20 spi_software_miso_pin = nhk:gpio19 [resonance_tester] accel_chip = adxl345 accel_per_hz = 100 sweeping_accel = 400 sweeping_period = 0 probe_points = 175, 175, 20 [temperature_sensor chamber_temp] sensor_type = Generic 3950 sensor_pin = nhk:gpio28 min_temp = 0 max_temp = 100 gcode_id = chamber_th [thermistor CMFB103F3950FANT] temperature1 = 0.0 resistance1 = 32116.0 temperature2 = 40.0 resistance2 = 5309.0 temperature3 = 80.0 resistance3 = 1228.0 [temperature_sensor nh_temp] sensor_type = CMFB103F3950FANT sensor_pin = nhk:gpio26 pullup_resistor = 2200 min_temp = 0 max_temp = 100 gcode_id = nh_th [stepper_x] step_pin = PF13 dir_pin = PF12 enable_pin = !PF14 rotation_distance = 40 microsteps = 32 full_steps_per_rotation = 200 endstop_pin = nhk:gpio13 position_min = 0 position_endstop = 350 position_max = 350 homing_speed = 25 homing_retract_dist = 5 homing_positive_dir = true [tmc2209 stepper_x] uart_pin = PC4 interpolate = false run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [stepper_y] step_pin = PG0 dir_pin = PG1 enable_pin = !PF15 rotation_distance = 40 microsteps = 32 full_steps_per_rotation = 200 endstop_pin = PG9 position_min = 0 position_endstop = 350 position_max = 350 homing_speed = 25 homing_retract_dist = 5 homing_positive_dir = true [tmc2209 stepper_y] uart_pin = PD11 interpolate = false run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [stepper_z] step_pin = PF11 dir_pin = PG3 enable_pin = !PG5 rotation_distance = 40 gear_ratio = 80:16 microsteps = 32 endstop_pin = PG10 position_max = 310 position_min = -5 homing_speed = 8 second_homing_speed = 3 homing_retract_dist = 3 position_endstop = 1.920 [tmc2209 stepper_z] uart_pin = PC6 interpolate = false run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [stepper_z1] step_pin = PG4 dir_pin = !PC1 enable_pin = !PA0 rotation_distance = 40 gear_ratio = 80:16 microsteps = 32 [tmc2209 stepper_z1] uart_pin = PC7 interpolate = false run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [stepper_z2] step_pin = PF9 dir_pin = PF10 enable_pin = !PG2 rotation_distance = 40 gear_ratio = 80:16 microsteps = 32 [tmc2209 stepper_z2] uart_pin = PF2 interpolate = false run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [stepper_z3] step_pin = PC13 dir_pin = !PF0 enable_pin = !PF1 rotation_distance = 40 gear_ratio = 80:16 microsteps = 32 [tmc2209 stepper_z3] uart_pin = PE4 interpolate = false run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [extruder] step_pin = nhk:gpio23 dir_pin = !nhk:gpio24 enable_pin = !nhk:gpio25 rotation_distance = 22.6789511 gear_ratio = 50:10 microsteps = 32 full_steps_per_rotation = 200 nozzle_diameter = 0.400 filament_diameter = 1.75 heater_pin = nhk:gpio9 sensor_type = Generic 3950 sensor_pin = nhk:gpio29 pullup_resistor = 2200 min_temp = 10 max_temp = 270 max_power = 1.0 min_extrude_temp = 170 pressure_advance = 0.02 pressure_advance_smooth_time = 0.040 control = pid pid_kp = 16.939 pid_ki = 0.620 pid_kd = 115.609 [tmc2209 extruder] sense_resistor = 0.100 uart_pin = nhk:gpio0 tx_pin = nhk:gpio1 interpolate = false run_current = 0.5 [heater_bed] heater_pin = PA3 sensor_type = Generic 3950 sensor_pin = PF3 max_power = 0.6 min_temp = 0 max_temp = 120 control = pid pid_kp = 38.860 pid_ki = 1.258 pid_kd = 300.197 [probe] pin = nhk:gpio10 x_offset = 0 y_offset = 25.0 speed = 10.0 samples = 3 samples_result = median sample_retract_dist = 3.0 samples_tolerance = 0.006 samples_tolerance_retries = 3 z_offset = 7.580 [fan] pin = nhk:gpio6 kick_start_time = 0.5 off_below = 0.05 [heater_fan hotend_fan] pin = nhk:gpio5 max_power = 1.0 kick_start_time = 0.5 heater = extruder heater_temp = 50.0 [controller_fan controller_fan] pin = PD12 kick_start_time = 0.5 heater = heater_bed [heater_fan exhaust_fan] pin = PD14 max_power = 1.0 shutdown_speed = 0.0 kick_start_time = 5.0 heater = heater_bed fan_speed = 1.0 [output_pin caselight] pin = PB10 pwm = true shutdown_value = 0 value = 1 cycle_time = 0.01 [idle_timeout] timeout = 1800 [quad_gantry_level] gantry_corners = -60,-10 410,420 points = 50,25 50,275 300,275 300,25 speed = 100 horizontal_move_z = 10 retries = 5 retry_tolerance = 0.0075 max_adjust = 10 [board_pins] aliases = EXP1_1=PE8, EXP1_2=PE7, EXP1_3=PE9, EXP1_4=PE10, EXP1_5=PE12, EXP1_6=PE13, EXP1_7=PE14, EXP1_8=PE15, EXP1_9=, EXP1_10=<5V>, EXP2_1=PA6, EXP2_2=PA5, EXP2_3=PB1, EXP2_4=PA4, EXP2_5=PB2, EXP2_6=PA7, EXP2_7=PC15, EXP2_8=, EXP2_9=, EXP2_10=<5V> [bed_mesh] speed = 300 horizontal_move_z = 10 mesh_min = 40, 40 mesh_max = 310,310 fade_start = 0.6 fade_end = 10.0 probe_count = 5,5 algorithm = bicubic zero_reference_position = 175,175 [gcode_macro G32] gcode = SAVE_GCODE_STATE NAME=STATE_G32 G90 G28 QUAD_GANTRY_LEVEL G28 G0 X175 Y175 Z30 F3600 RESTORE_GCODE_STATE NAME=STATE_G32 [gcode_macro PRINT_START] gcode = {% set target_bed = params.BED|int %} {% set target_extruder = params.EXTRUDER|int %} {% set x_wait = printer.toolhead.axis_maximum.x|float / 2 %} {% set y_wait = printer.toolhead.axis_maximum.y|float / 2 %} STATUS_HOMING G28 G90 BED_MESH_CLEAR {% if params.BED|int > 90 %} SET_DISPLAY_TEXT MSG="Bed: {target_bed}c" STATUS_HEATING M106 S255 G1 X{x_wait} Y{y_wait} Z15 F9000 M190 S{target_bed} SET_DISPLAY_TEXT MSG="Heatsoak: {target_chamber}c" {% else %} SET_DISPLAY_TEXT MSG="Bed: {target_bed}c" STATUS_HEATING G1 X{x_wait} Y{y_wait} Z15 F9000 M190 S{target_bed} SET_DISPLAY_TEXT MSG="Soak for 5min" G4 P300000 {% endif %} SET_DISPLAY_TEXT MSG="Hotend: 150c" M109 S150 SET_DISPLAY_TEXT MSG="QGL" STATUS_LEVELING quad_gantry_level G28 Z CALIBRATE_Z SET_DISPLAY_TEXT MSG="Z-offset" SET_DISPLAY_TEXT MSG="Bed mesh" STATUS_MESHING bed_mesh_calibrate SET_DISPLAY_TEXT MSG="Hotend: {target_extruder}c" STATUS_HEATING G1 X{x_wait} Y{y_wait} Z15 F9000 M107 M109 S{target_extruder} SET_DISPLAY_TEXT MSG="Printer goes brr" STATUS_PRINTING G0 X{x_wait - 50} Y4 F10000 G0 Z0.4 G91 G1 X100 E20 F1000 G90 SKEW_PROFILE LOAD=Califlower [gcode_macro PRINT_END] gcode = {% set th = printer.toolhead %} {% set x_safe = th.position.x + 20 * (1 if th.axis_maximum.x - th.position.x > 20 else -1) %} {% set y_safe = th.position.y + 20 * (1 if th.axis_maximum.y - th.position.y > 20 else -1) %} {% set z_safe = [th.position.z + 2, th.axis_maximum.z]|min %} SAVE_GCODE_STATE NAME=STATE_PRINT_END M400 G92 E0 G1 E-5.0 F1800 TURN_OFF_HEATERS G90 G0 X{x_safe} Y{y_safe} Z{z_safe} F20000 G0 X{th.axis_maximum.x//2} Y{th.axis_maximum.y - 2} F3600 M107 BED_MESH_CLEAR RESTORE_GCODE_STATE NAME=STATE_PRINT_END SET_SKEW CLEAR=1 [neopixel sb_leds] pin = nhk:gpio7 chain_count = 3 color_order = GRBW initial_red = 0.0 initial_green = 0.0 initial_blue = 1.0 initial_white = 0.0 [gcode_macro _sb_vars] variable_colors = { 'logo': { 'busy': {'r': 0.4, 'g': 0.0, 'b': 0.0, 'w': 0.0}, 'cleaning': {'r': 0.0, 'g': 0.02, 'b': 0.5, 'w': 0.0}, 'calibrating_z': {'r': 0.8, 'g': 0., 'b': 0.35, 'w': 0.0}, 'heating': {'r': 0.9, 'g': 0.0, 'b': 0.0, 'w': 0.0}, 'homing': {'r': 0.2, 'g': 0.0, 'b': 0.2, 'w': 0.0}, 'leveling': {'r': 0.5, 'g': 0.1, 'b': 0.4, 'w': 0.0}, 'meshing': {'r': 0.0, 'g': 1.0, 'b': 0.0, 'w': 0.0}, 'off': {'r': 0.0, 'g': 0.0, 'b': 0.0, 'w': 0.0}, 'printing': {'r': 0.0, 'g': 0.0, 'b': 0.0, 'w': 0.1}, 'standby': {'r': 0.01, 'g': 0.01, 'b': 0.01, 'w': 0.1}, }, 'nozzle': { 'heating': {'r': 1.0, 'g': 0.0, 'b': 0.0, 'w':0.0}, 'off': {'r': 0.0, 'g': 0.0, 'b': 0.0, 'w': 0.0}, 'on': {'r': 0.0, 'g': 0.0, 'b': 0.0, 'w':1.0}, 'standby': {'r': 0.0, 'g': 0.0, 'b': 0.0, 'w':1.0}, }, 'thermal': { 'hot': {'r': 1.0, 'g': 0.0, 'b': 0.0, 'w': 0.0}, 'cold': {'r': 0.3, 'g': 0.0, 'b': 0.8, 'w': 0.0} } } variable_logo_led_name = "sb_leds" variable_logo_idx = "1" variable_nozzle_led_name = "sb_leds" variable_nozzle_idx = "2,3" variable_thermal_config = { 'extruder': { 'cool_temp': 40, 'leds': 'logo', }, 'heater_bed': { 'cool_temp': 40, 'leds': 'nozzle', }, } gcode = [gcode_macro _set_sb_leds] gcode = {% set red = params.RED|default(0)|float %} {% set green = params.GREEN|default(0)|float %} {% set blue = params.BLUE|default(0)|float %} {% set white = params.WHITE|default(0)|float %} {% set led = params.LED|string %} {% set idx = (params.IDX|string).split(',') %} {% set transmit_last = params.TRANSMIT|default(1) %} {% for led_index in idx %} {% set transmit=transmit_last if loop.last else 0 %} set_led led={led} red={red} green={green} blue={blue} white={white} index={led_index} transmit={transmit} {% endfor %} [gcode_macro _set_sb_leds_by_name] gcode = {% set leds_name = params.LEDS %} {% set color_name = params.COLOR %} {% set color = printer["gcode_macro _sb_vars"].colors[leds_name][color_name] %} {% set led = printer["gcode_macro _sb_vars"][leds_name + "_led_name"] %} {% set idx = printer["gcode_macro _sb_vars"][leds_name + "_idx"] %} {% set transmit = params.TRANSMIT|default(1) %} _set_sb_leds led={led} red={color.r} green={color.g} blue={color.b} white={color.w} idx="{idx}" transmit={transmit} [gcode_macro _set_logo_leds] gcode = {% set red = params.RED|default(0)|float %} {% set green = params.GREEN|default(0)|float %} {% set blue = params.BLUE|default(0)|float %} {% set white = params.WHITE|default(0)|float %} {% set led = printer["gcode_macro _sb_vars"].logo_led_name %} {% set idx = printer["gcode_macro _sb_vars"].logo_idx %} {% set transmit=params.TRANSMIT|default(1) %} _set_sb_leds led={led} red={red} green={green} blue={blue} white={white} idx="{idx}" transmit={transmit} [gcode_macro _set_nozzle_leds] gcode = {% set red = params.RED|default(0)|float %} {% set green = params.GREEN|default(0)|float %} {% set blue = params.BLUE|default(0)|float %} {% set white = params.WHITE|default(0)|float %} {% set led = printer["gcode_macro _sb_vars"].nozzle_led_name %} {% set idx = printer["gcode_macro _sb_vars"].nozzle_idx %} {% set transmit=params.TRANSMIT|default(1) %} _set_sb_leds led={led} red={red} green={green} blue={blue} white={white} idx="{idx}" transmit={transmit} [gcode_macro set_logo_leds_off] gcode = {% set transmit=params.TRANSMIT|default(1) %} _set_logo_leds red=0 blue=0 green=0 white=0 transmit={transmit} [gcode_macro set_nozzle_leds_on] gcode = {% set transmit=params.TRANSMIT|default(1) %} _set_sb_leds_by_name leds="nozzle" color="on" transmit={transmit} [gcode_macro set_nozzle_leds_off] gcode = {% set transmit=params.TRANSMIT|default(1) %} _set_sb_leds_by_name leds="nozzle" color="off" transmit={transmit} [gcode_macro status_off] gcode = set_logo_leds_off transmit=0 set_nozzle_leds_off [gcode_macro status_ready] gcode = _set_sb_leds_by_name leds="logo" color="standby" transmit=0 _set_sb_leds_by_name leds="nozzle" color="standby" transmit=1 [gcode_macro status_busy] gcode = _set_sb_leds_by_name leds="logo" color="busy" transmit=0 set_nozzle_leds_on [gcode_macro status_heating] gcode = _set_sb_leds_by_name leds="logo" color="heating" transmit=0 _set_sb_leds_by_name leds="nozzle" color="heating" transmit=1 [gcode_macro status_leveling] gcode = _set_sb_leds_by_name leds="logo" color="leveling" transmit=0 set_nozzle_leds_on [gcode_macro status_homing] gcode = _set_sb_leds_by_name leds="logo" color="homing" transmit=0 set_nozzle_leds_on [gcode_macro status_cleaning] gcode = _set_sb_leds_by_name leds="logo" color="cleaning" transmit=0 set_nozzle_leds_on [gcode_macro status_meshing] gcode = _set_sb_leds_by_name leds="logo" color="meshing" transmit=0 set_nozzle_leds_on [gcode_macro status_calibrating_z] gcode = _set_sb_leds_by_name leds="logo" color="calibrating_z" transmit=0 set_nozzle_leds_on [gcode_macro status_printing] gcode = _set_sb_leds_by_name leds="logo" color="printing" transmit=0 set_nozzle_leds_on [AFC] varfile = /home/pi/printer_data/config/AFC/AFC.var long_moves_speed = 150 long_moves_accel = 250 short_moves_speed = 50 short_moves_accel = 300 short_move_dis = 10 enable_sensors_in_gui = True default_material_temps = default: 235, PLA:210, PETG:235, ABS:235, ASA:235 common_density_values = PLA:1.24, PETG:1.23, ABS:1.04, ASA:1.07 load_to_hub = True assisted_unload = True z_hop = 5 resume_speed = 120 resume_z_speed = 30 error_timeout = 36000 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 led_spool_illuminate = 1,1,1,0 tool_cut = True tool_cut_threshold = 10000 tool_cut_cmd = AFC_CUT park = True park_cmd = AFC_PARK poop = True poop_cmd = AFC_POOP kick = True kick_cmd = AFC_KICK wipe = True 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 = ^nhk:gpio3 tool_stn = 72 tool_stn_unload = 100 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 [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_DISABLE_SKEW] gcode = {% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %} {% set verbose = gVars['verbose']|int %} {% set disable_skew = gVars['disable_skew_correction']|default(false)|lower == 'true' %} {% if disable_skew %} SET_GCODE_VARIABLE MACRO=AFC_ENABLE_SKEW VARIABLE=skew_profile VALUE='"{printer.skew_correction.current_profile_name}"' {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC: Disabling skew correction' {% endif %} SET_SKEW CLEAR=1 {% if verbose > 1 %} GET_CURRENT_SKEW {% endif %} {% endif %} [gcode_macro AFC_ENABLE_SKEW] variable_skew_profile = "my_skew_profile" gcode = {% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %} {% set verbose = gVars['verbose']|int %} {% set disable_skew = gVars['disable_skew_correction']|default(false)|lower == 'true' %} {% if disable_skew %} {% if verbose > 1 %} { action_respond_info("AFC: Restoring skew correction profile " ~ skew_profile) } {% endif %} SKEW_PROFILE LOAD={skew_profile} {% if verbose > 1 %} GET_CURRENT_SKEW {% endif %} {% endif %} [gcode_macro AFC_BRUSH] description = Wipe the nozzle on the brush gcode = {% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %} {% set accel = gVars['accel'] | default(2000) | float %} {% set travel_speed = gVars['travel_speed'] | default(120)*60| float %} {% set z_travel_speed = gVars['z_travel_speed'] | default(30)*60 | float %} {% set verbose = gVars['verbose'] | default(1) | int %} {% set vars = printer['gcode_macro _AFC_BRUSH_VARS'] %} {% set Bx, By, Bz = vars.brush_loc | default([-1,-1,-1])| map('float') %} {% set brush_clean_accel = vars['brush_clean_accel']| default(0) | float %} {% set y_brush = vars['y_brush'] | default(false) | lower == 'true' %} {% set brush_clean_speed = vars['brush_clean_speed']| default(150)*60 | float %} {% set brush_width = vars['brush_width'] | default(30) | float %} {% set brush_depth = vars['brush_depth'] | default(10) | float %} {% set brush_count = vars['brush_count'] | default(4) | int %} {% set z_move = vars['z_move'] | default(-1) | float %} {% set tool_servo_enable = vars['tool_servo_enable']|default(false) | lower == 'true' %} {% 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 %} AFC_DISABLE_SKEW SET_VELOCITY_LIMIT ACCEL={selected_accel} {% if tool_servo_enable %} {% if verbose > 1 %} RESPOND TYPE=command MSG='Brush Servo Extended' {% endif %} _BRUSH_SERVO POS=out {% endif %} {% 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 {% if tool_servo_enable %} {% if verbose > 1 %} RESPOND TYPE=command MSG='Brush Servo Retracted' {% endif %} _BRUSH_SERVO POS=in {% endif %} SET_VELOCITY_LIMIT ACCEL={saved_accel} AFC_ENABLE_SKEW [gcode_macro _BRUSH_SERVO] variable_dwell_time = 200 gcode = {% set c1 = printer['gcode_macro _AFC_BRUSH_VARS'] %} {% set pos = params.POS %} {% if pos == "in" %} SET_SERVO SERVO={c1.tool_servo_name} ANGLE={c1.tool_servo_angle_in} G4 P{dwell_time} {% elif pos == "out" %} SET_SERVO SERVO={c1.tool_servo_name} ANGLE={c1.tool_servo_angle_out} G4 P{dwell_time} {% else %} {action_respond_info("Brush Servo: provide POS=[in|out]")} {% endif %} SET_SERVO SERVO={c1.tool_servo_name} WIDTH=0 [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'] |default(2000) | float %} {% set travel_speed = gVars['travel_speed'] |default(120)*60| float %} {% set verbose = gVars['verbose'] |default(1) | int %} {% set vars = printer['gcode_macro _AFC_CUT_TIP_VARS'] %} {% set pin_loc_x, pin_loc_y = vars.pin_loc_xy |default([-1, -1])| map('float') %} {% set pin_park_dist = vars['pin_park_dist'] |default(6.0) | float %} {% set retract_length = vars['retract_length'] |default(8.5) | float %} {% set quick_tip_forming = vars['quick_tip_forming'] |default(true) | lower == 'true' %} {% set rip_length = vars['rip_length'] |default(1.0) | float %} {% set cut_direction = vars['cut_direction'] |default('') | lower %} {% set cut_accel = vars['cut_accel'] |default(0) | float %} {% set pushback_length = vars['pushback_length'] |default(15) | float %} {% set pushback_dwell_time = vars['pushback_dwell_time'] |default(20) | int %} {% set extruder_move_speed = vars['extruder_move_speed'] |default(25)*60 | float %} {% set restore_position = vars['restore_position'] |default(true) | lower == 'true' %} {% set cut_count = vars['cut_count'] |default(2) | int %} {% set y_cut = vars['y_cut'] |default(false) | lower == 'true' %} {% set awd = vars['awd'] |default(false) | lower == 'true' %} {% set tool_servo_enable = vars['tool_servo_enable'] |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 AFC_DISABLE_SKEW 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 tool_servo_enable %} {% if verbose > 1 %} RESPOND TYPE=command MSG='Cut Servo Extended' {% endif %} _CUTTER_SERVO POS=out {% endif %} {% 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 tool_servo_enable %} {% if verbose > 1 %} RESPOND TYPE=command MSG='Cut Servo Retracted' {% endif %} _CUTTER_SERVO POS=in {% 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} AFC_ENABLE_SKEW 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 cut_direction = vars['cut_direction']|default('')|lower %} {% 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) %} {% if cut_direction == "left" or cut_direction == "right" %} G1 X{pin_park_x_loc} F{travel_speed} G1 Y{pin_park_y_loc} F{travel_speed} {% elif cut_direction == "front" or cut_direction == "back" %} G1 Y{pin_park_y_loc} F{travel_speed} G1 X{pin_park_x_loc} F{travel_speed} {% else %} { action_raise_error("Invalid cut direction. Check the cut_direction in your AFC_Macro_Vars.cfg file!") } {% endif %} {% 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 _CUTTER_SERVO] variable_dwell_time = 200 gcode = {% set c1 = printer['gcode_macro _AFC_CUT_TIP_VARS'] %} {% set pos = params.POS %} {% if pos == "in" %} SET_SERVO SERVO={c1.tool_servo_name} ANGLE={c1.tool_servo_angle_in} G4 P{dwell_time} {% elif pos == "out" %} SET_SERVO SERVO={c1.tool_servo_name} ANGLE={c1.tool_servo_angle_out} G4 P{dwell_time} {% else %} {action_respond_info("Cutter Servo: provide POS=[in|out]")} {% endif %} SET_SERVO SERVO={c1.tool_servo_name} WIDTH=0 [gcode_macro AFC_KICK] gcode = {% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %} {% set accel = gVars['accel'] | default(2000) | float %} {% set travel_speed = gVars['travel_speed'] | default(120)*60 | float %} {% set z_travel_speed = gVars['z_travel_speed'] | default(30)*60 | float %} {% set verbose = gVars['verbose'] | default(1) | int %} {% set vars = printer['gcode_macro _AFC_KICK_VARS'] %} {% set kick_start_x, kick_start_y, kick_start_z = vars.kick_start_loc|default([-1,-1,5])|map('float') %} {% set kick_z = vars['kick_z'] | default(1.5) | float %} {% set kick_direction = vars['kick_direction'] | default('') | lower %} {% set kick_move_dist = vars['kick_move_dist'] | default(45) | float %} {% set z_after_kick = vars['z_after_kick'] | default(10) | float %} {% set kick_speed = vars['kick_speed'] | default(150)*60 | float %} {% set kick_accel = vars['kick_accel'] | default(0) | 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 AFC_DISABLE_SKEW {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Kick: Move to Start Position' {% endif %} G1 X{kick_start_x} Y{kick_start_y} F{travel_speed} G1 Z{kick_start_z} F{z_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} AFC_ENABLE_SKEW [gcode_macro AFC_PARK] gcode = {% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %} {% set travel_speed = gVars['travel_speed'] | default(120)*60 | float %} {% set verbose = gVars['verbose'] | default(1) | int %} {% set z_travel_speed = gVars['z_travel_speed'] | default(30)*60 | float %} {% set vars = printer['gcode_macro _AFC_PARK_VARS'] %} {% set Px, Py = vars.park_loc_xy | default([-1,-1]) | map('float') %} {% set Px = params.X | default(Px) | float %} {% set Py = params.Y | default(Py) | float %} {% set z_hop = vars['z_hop'] | default(0) | float %} {% set z_hop = params.Z_HOP | default(z_hop) | float %} {% set park_z = vars['park_z'] | default(0.0) | 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 AFC_DISABLE_SKEW G1 Z{z_safe} F{z_travel_speed} G1 X{Px} Y{Py} F{travel_speed} AFC_ENABLE_SKEW {% if park_z > 0 and park_z < z_safe %} G1 Z{park_z} F{z_travel_speed} {% endif %} [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'] | default(120)*60 | float %} {% set z_travel_speed = gVars['z_travel_speed'] | default(30)*60 | float %} {% set verbose = gVars['verbose'] | default(1) | int %} {% set vars = printer['gcode_macro _AFC_POOP_VARS'] %} {% set purge_x, purge_y = vars.purge_loc_xy | default([-1,-1]) | map('float') %} {% set purge_spd = vars['purge_spd'] | default(6.5)*60 | float %} {% set z_poop = vars['z_purge_move'] | default(true) | lower == 'true' %} {% set fast_z = vars['fast_z'] | default(200)*60 | float %} {% set z_lift = vars['z_lift'] | default(10) | 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'] | default(2)*1000 | float %} {% set purge_length = vars['purge_length'] | default(72.111) | float %} {% set purge_length_minimum = vars['purge_length_minimum']| default(60.999) | float %} {% set purge_start = vars['purge_start'] | default(0.6) | 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 AFC_DISABLE_SKEW {% 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 {% set final_poop_height = purge_z + purge_start + (iterations * iteration_z_raise) %} {% set new_z = final_poop_height + z_lift %} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Poop: Lifting Z to {new_z} mm' {% endif %} {% if z_poop %} G1 Z{new_z} F{fast_z} {% 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} AFC_ENABLE_SKEW 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_disable_skew_correction = False variable_verbose = 1 [gcode_macro _AFC_CUT_TIP_VARS] description = Toolhead tip cutting macro configuration variables gcode = variable_pin_loc_xy = -1, -1 variable_cut_accel = 0 variable_cut_direction = "left" variable_pin_park_dist = 6.0 variable_cut_move_dist = 8.5 variable_cut_fast_move_speed = 32 variable_cut_slow_move_speed = 10 variable_evacuate_speed = 150 variable_cut_dwell_time = 50 variable_cut_fast_move_fraction = 0.85 variable_extruder_move_speed = 25 variable_restore_position = False variable_retract_length = 20 variable_quick_tip_forming = False variable_cut_count = 2 variable_rip_length = 1.0 variable_rip_speed = 3 variable_pushback_length = 15 variable_pushback_dwell_time = 20 variable_safe_margin_xy = 30, 30 [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 = 10 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,5 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 [gcode_macro _AFC_PARK_VARS] description = Park macro configuration variables gcode = variable_park_loc_xy = -1, -1 variable_z_hop = 0 variable_park_z = 0 [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 , [mcu Turtle_1] serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_1D0005000551333235393937-if00 [AFC_BoxTurtle Turtle_1] hub = Turtle_1 extruder = extruder enable_assist = True enable_kick_start = True 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 = 155.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 hardware_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 hardware_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 = 90.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 hardware_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 = 145.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 hardware_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 = 970.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_unload_bowden_length = 970.0 [AFC_led AFC_Indicator] pin = Turtle_1:RGB1 chain_count = 4 color_order = GRBW [bed_mesh default] version = 1 points = 0.085000, 0.108750, 0.120000, 0.110000, 0.133750 0.037500, 0.055000, 0.045000, 0.041250, 0.056250 0.031250, 0.026250, 0.000000, 0.002500, 0.018750 0.026250, 0.011250, -0.018750, 0.003750, 0.033750 0.095000, 0.083750, 0.085000, 0.092500, 0.106250 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = bicubic tension = 0.2 min_x = 40.0 max_x = 310.0 min_y = 40.0 max_y = 310.0 [skew_correction Califlower] xy_skew = 0.002216861244163702 xz_skew = 0.0 yz_skew = 0.0