Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-205-g5f0d252b' Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ARMv7 Processor rev 4 (v7l) Python: '3.9.2 (default, Mar 12 2021, 04:06:34) \n[GCC 10.2.1 20210110]' =============== Log rollover at Sun Apr 14 15:18:32 2024 =============== Start printer at Sun Apr 14 15:18:32 2024 (1713100712.2 80.5) Unable to open config file /home/pi/printer_data/config/printer.cfg Traceback (most recent call last): File "/home/pi/klipper/klippy/configfile.py", line 158, in _read_config_file f = open(filename, 'r') FileNotFoundError: [Errno 2] No such file or directory: '/home/pi/printer_data/config/printer.cfg' Config error Traceback (most recent call last): File "/home/pi/klipper/klippy/configfile.py", line 158, in _read_config_file f = open(filename, 'r') FileNotFoundError: [Errno 2] No such file or directory: '/home/pi/printer_data/config/printer.cfg' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 175, in _connect self._read_config() File "/home/pi/klipper/klippy/klippy.py", line 134, in _read_config config = pconfig.read_main_config() File "/home/pi/klipper/klippy/configfile.py", line 279, in read_main_config data = self._read_config_file(filename) File "/home/pi/klipper/klippy/configfile.py", line 164, in _read_config_file raise error(msg) configparser.Error: Unable to open config file /home/pi/printer_data/config/printer.cfg webhooks client 1971051320: New connection webhooks client 1971051320: Client info {'program': 'Moonraker', 'version': 'v0.8.0-41-g348b7f5'} Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.12.0-158-g36f9b26e' Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ARMv7 Processor rev 4 (v7l) Python: '3.9.2 (default, Mar 12 2021, 04:06:34) \n[GCC 10.2.1 20210110]' Building C code module c_helper.so Start printer at Sun Apr 14 15:26:02 2024 (1713101162.5 530.7) ===== Config file ===== ======================= Config error Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 175, in _connect self._read_config() File "/home/pi/klipper/klippy/klippy.py", line 139, in _read_config m.add_printer_objects(config) File "/home/pi/klipper/klippy/mcu.py", line 1042, in add_printer_objects printer.add_object('mcu', MCU(config.getsection('mcu'), mainsync)) File "/home/pi/klipper/klippy/mcu.py", line 567, in __init__ self._serialport = config.get('serial') File "/home/pi/klipper/klippy/configfile.py", line 57, in get return self._get_wrapper(self.fileconfig.get, option, default, File "/home/pi/klipper/klippy/configfile.py", line 32, in _get_wrapper raise error("Option '%s' in section '%s' must be specified" configparser.Error: Option 'serial' in section 'mcu' must be specified webhooks client 1970597504: New connection webhooks client 1970597504: Client info {'program': 'Moonraker', 'version': 'v0.8.0-41-g348b7f5'} webhooks client 1970597504: Disconnected webhooks client 1970655320: New connection webhooks client 1970655320: Client info {'program': 'Moonraker', 'version': 'v0.8.0-325-g99b97af'} webhooks client 1970655320: Disconnected Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.12.0-158-g36f9b26e' Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ARMv7 Processor rev 4 (v7l) Python: '3.9.2 (default, Mar 12 2021, 04:06:34) \n[GCC 10.2.1 20210110]' Start printer at Sun Apr 14 15:28:17 2024 (1713101297.6 23.6) ===== Config file ===== ======================= Config error Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 175, in _connect self._read_config() File "/home/pi/klipper/klippy/klippy.py", line 139, in _read_config m.add_printer_objects(config) File "/home/pi/klipper/klippy/mcu.py", line 1042, in add_printer_objects printer.add_object('mcu', MCU(config.getsection('mcu'), mainsync)) File "/home/pi/klipper/klippy/mcu.py", line 567, in __init__ self._serialport = config.get('serial') File "/home/pi/klipper/klippy/configfile.py", line 57, in get return self._get_wrapper(self.fileconfig.get, option, default, File "/home/pi/klipper/klippy/configfile.py", line 32, in _get_wrapper raise error("Option '%s' in section '%s' must be specified" configparser.Error: Option 'serial' in section 'mcu' must be specified webhooks client 1970790352: New connection webhooks client 1970790352: Client info {'program': 'Moonraker', 'version': 'v0.8.0-325-g99b97af'} webhooks client 1970790352: Disconnected Restarting printer Start printer at Sun Apr 14 15:29:24 2024 (1713101364.3 78.4) ===== Config file ===== [virtual_sdcard] path = /home/pi/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_VARIABLE] gcode = variable_use_custom_pos = True variable_custom_park_x = 150 variable_custom_park_y = 20 variable_custom_park_dz = 15.0 variable_speed_move = 100.0 [exclude_object] [gcode_arcs] resolution = 0.1 [firmware_retraction] retract_length = 0.6 retract_speed = 30 unretract_extra_length = 0 unretract_speed = 30 [save_variables] filename = /home/pi/printer_data/config/my_config/save_variables.cfg [mcu] canbus_uuid = 377045208276 [temperature_sensor SKRat] sensor_mcu = mcu sensor_type = temperature_mcu min_temp = 10 max_temp = 100 [printer] kinematics = cartesian max_velocity = 600 max_accel = 3000 max_z_velocity = 15 max_z_accel = 20 [stepper_x] step_pin = PF9 dir_pin = !PD7 enable_pin = !PD6 microsteps = 16 rotation_distance = 48 endstop_pin = ^PB5 position_endstop = 0 position_min = 0 position_max = 200 homing_speed = 50 [stepper_y] step_pin = PD3 dir_pin = !PD2 enable_pin = !PD5 microsteps = 16 rotation_distance = 60 endstop_pin = ^PC1 position_endstop = 200 position_min = 0 position_max = 200 homing_speed = 50 [dual_carriage] axis = x safe_distance = 60 step_pin = PA15 dir_pin = PF8 enable_pin = !PC9 microsteps = 16 rotation_distance = 48 endstop_pin = ^PC0 position_endstop = 298 position_min = 0 position_max = 298 homing_speed = 50 [stepper_z] step_pin = PC7 dir_pin = !PC6 enable_pin = !PD9 rotation_distance = 5.0 gear_ratio = 30:20 microsteps = 16 endstop_pin = PE5 position_endstop = 0 position_max = 160 position_min = -2 [tmc2209 stepper_x] uart_pin = PF10 run_current = 0.800 [tmc2209 stepper_y] uart_pin = PD4 run_current = 0.800 [tmc2209 dual_carriage] uart_pin = PC8 run_current = 0.800 [tmc2209 stepper_z] uart_pin = PD8 run_current = 0.800 [heater_bed] heater_pin = PB3 sensor_type = Generic 3950 sensor_pin = PB2 min_temp = 0 max_temp = 130 control = pid pid_kp = 67.148 pid_ki = 0.904 pid_kd = 1246.428 [controller_fan TMC_driver] pin = PD15 max_power = 1.0 kick_start_time = 0.5 off_below = 0.10 fan_speed = 1.0 heater = stepper = stepper_x, stepper_y [heater_fan chamber] pin = PD14 max_power = 1.0 kick_start_time = 0.5 heater = heater_bed heater_temp = 40.0 fan_speed = 1.0 [temperature_fan Raspberry] pin = PD13 max_power = 1.0 shutdown_speed = 0.0 kick_start_time = 5.0 cycle_time = 0.01 off_below = 0.1 sensor_type = temperature_host min_temp = 0 max_temp = 100 target_temp = 40.0 control = pid pid_kp = 1.0 pid_ki = 0.5 pid_kd = 2.0 [temperature_fan EBB_L] pin = PE14 max_power = 1.0 shutdown_speed = 0.0 kick_start_time = 5.0 cycle_time = 0.01 off_below = 0.1 sensor_mcu = EBB_L sensor_type = temperature_mcu min_temp = 0 max_temp = 100 target_temp = 40.0 control = pid pid_kp = 1.0 pid_ki = 0.5 pid_kd = 2.0 [temperature_fan EBB_R] pin = PE9 max_power = 1.0 shutdown_speed = 0.0 kick_start_time = 5.0 cycle_time = 0.01 off_below = 0.1 sensor_mcu = EBB_R sensor_type = temperature_mcu min_temp = 0 max_temp = 100 target_temp = 40.0 control = pid pid_kp = 1.0 pid_ki = 0.5 pid_kd = 2.0 [board_pins] aliases = EXP1_1=PC13, EXP1_3=PC3, EXP1_5=PB1, EXP1_7=PC5, EXP1_9=, EXP1_2=PF3, EXP1_4=PC2, EXP1_6=PB0, EXP1_8=PC4, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PE8, EXP2_7=PE10, EXP2_9=, EXP2_2=PA5, EXP2_4=PF7, EXP2_6=PA7, EXP2_8=, EXP2_10= [mcu EBB_L] canbus_uuid = 62eab7b637c4 [adxl345 extruder] cs_pin = EBB_L: PB12 spi_software_sclk_pin = EBB_L: PB10 spi_software_mosi_pin = EBB_L: PB11 spi_software_miso_pin = EBB_L: PB2 axes_map = x,y,z [resonance_tester] accel_chip = adxl345 extruder1 probe_points = 180, 140, 5 [extruder] step_pin = EBB_L: PD0 dir_pin = !EBB_L: PD1 enable_pin = !EBB_L: PD2 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 3.433 pressure_advance = 0.04 pressure_advance_smooth_time = 0.08 nozzle_diameter = 0.400 filament_diameter = 1.750 sensor_type = ATC Semitec 104NT-4-R025H42G sensor_pin = EBB_L: PA3 heater_pin = EBB_L: PB13 max_power = 0.8 min_temp = 0 max_temp = 280 min_extrude_temp = 170 max_extrude_only_distance = 200 max_extrude_cross_section = 4 control = pid pid_kp = 26.604 pid_ki = 6.320 pid_kd = 27.995 [tmc2209 extruder] uart_pin = EBB_L: PA15 run_current = 0.450 stealthchop_threshold = 999999 [heater_fan extruder] pin = EBB_L: PA1 heater = extruder heater_temp = 50.0 [fan_generic fan] pin = EBB_L: PA0 cycle_time = 0.0100 kick_start_time = 1.000 hardware_pwm = false [bltouch] sensor_pin = ^EBB_L:PB8 control_pin = EBB_L:PB9 x_offset = -25 y_offset = -9 samples = 2 samples_tolerance = 0.200 z_offset = 1.000 [safe_z_home] home_xy_position = 120,140 speed = 120 z_hop = 5 z_hop_speed = 5 [bed_mesh] speed = 240 horizontal_move_z = 6 mesh_min = 0,0 mesh_max = 215,255 algorithm = bicubic probe_count = 10 fade_start = 1.0 fade_end = 10.0 [screws_tilt_adjust] screw1 = 30, 15 screw1_name = front left screw screw2 = 245, 15 screw2_name = front right screw screw3 = 245, 280 screw3_name = rear right screw screw4 = 30, 280 screw4_name = rear left screw horizontal_move_z = 6 speed = 50 screw_thread = CCW-M6 [filament_motion_sensor extruder] switch_pin = EBB_L:PB6 detection_length = 4.00 extruder = extruder pause_on_runout = False runout_gcode = M117 Filament encoder runout TRIGGER_RUNOUT SENSOR=motion T0 insert_gcode = M117 Filament encoder inserted [mcu EBB_R] canbus_uuid = 7d0c115fe0a6 [adxl345 extruder1] cs_pin = EBB_R: PB12 spi_software_sclk_pin = EBB_R: PB10 spi_software_mosi_pin = EBB_R: PB11 spi_software_miso_pin = EBB_R: PB2 axes_map = x,y,z [extruder1] step_pin = EBB_R: PD0 dir_pin = !EBB_R: PD1 enable_pin = !EBB_R: PD2 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 3.433 pressure_advance = 0.04 pressure_advance_smooth_time = 0.08 nozzle_diameter = 0.400 filament_diameter = 1.750 sensor_type = ATC Semitec 104NT-4-R025H42G sensor_pin = EBB_R: PA3 heater_pin = EBB_R: PB13 max_power = 0.8 min_temp = 0 max_temp = 280 min_extrude_temp = 170 max_extrude_only_distance = 200 max_extrude_cross_section = 4 control = pid pid_kp = 26.604 pid_ki = 6.320 pid_kd = 27.995 [tmc2209 extruder1] uart_pin = EBB_R: PA15 run_current = 0.450 stealthchop_threshold = 999999 [heater_fan extruder1] pin = EBB_R: PA1 heater = extruder1 heater_temp = 50.0 [fan_generic fan1] pin = EBB_R: PA0 cycle_time = 0.0100 kick_start_time = 1.000 hardware_pwm = false [filament_motion_sensor extruder1] switch_pin = EBB_R:PB6 detection_length = 4.00 extruder = extruder pause_on_runout = False runout_gcode = M117 Filament encoder runout TRIGGER_RUNOUT SENSOR=motion T1 insert_gcode = M117 Filament encoder inserted [gcode_macro ACTIVATE_TOOL] description = Activate the tool by index EXTRUDER gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set target_tool = params.EXTRUDER|default("extruder")|string %} {% set act_tool = printer.toolhead.extruder %} {% if act_tool != target_tool %} ACTIVATE_EXTRUDER EXTRUDER={target_tool} {% if 'gcode_macro SWITCHING_EXTRUDER' in printer and user_vars.switching_extruder.enable %} SWITCHING_EXTRUDER E={target_tool} {% endif %} {% if 'gcode_macro SWITCHING_HOTEND' in printer and user_vars.switching_hotend.enable %} SWITCHING_HOTEND E={target_tool} {% endif %} {% else %} {action_respond_info("The '%s' is alredy activated." % (target_tool))} {% endif %} [delayed_gcode _INIT] initial_duration = 1 gcode = {% if 'bed_mesh' in printer and 'default' in printer['bed_mesh'].profiles %} BED_MESH_PROFILE LOAD=default {% endif %} {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if printer.save_variables.variables.dump_list %} GET_USER_VARIABLE RESPOND MSG="list actual user variable" {% endif %} RUN_MACRO_INIT {% if printer.save_variables.variables.dump_list %} GET_MACRO_INIT RESPOND MSG="list run of INIT macro" {% endif %} {% if printer.save_variables.variables.dump_list %} GET_USER_VARIABLE RESPOND MSG="list actual user variable" {% endif %} {% if printer['menu'] %} UPDATE_DELAYED_GCODE ID=main_display_group DURATION=3 {% endif %} [delayed_gcode clear_display] gcode = M117 M83 [gcode_macro RUN_MACRO_INIT] gcode = {% for object in printer|sort %} {% if object != 'configfile' and '_INIT_' is in object %} {object.lstrip('gcode_macro')} {% endif %} {% endfor %} [gcode_macro GET_MACRO_INIT] gcode = {% set out = [] %} {% for object in printer|sort %} {% if object != 'configfile' and '_INIT_' is in object %} {% set _dummy = out.append("%s" % (object.lstrip('gcode_macro'))) %} {% endif %} {% endfor %} {% if out|length == 0 %}{% set _dummy = out.append("Nothing found for \"DUMP_GCODE %s\"" % rawparams) %}{% endif %} {action_respond_info(out|join("\n"))} [gcode_macro DUMP_PRINTER_PARAM] description = Debug: Print entries of the printer object without gcode_macro gcode = {% set out = [] %} {% for object in printer|sort %} {% if object != 'configfile' and 'gcode_macro' is not in object %} {% for parameter, value in printer[object].items()|sort %} {% set _dummy = out.append("printer['%s'].%s = %s" % (object, parameter, value)) %} {% endfor %} {% endif %} {% endfor %} {% if out|length == 0 %}{% set _dummy = out.append("Nothing found for \"DUMP_PRINTER_PARAM %s\"" % rawparams) %}{% endif %} {action_respond_info(out|join("\n"))} [gcode_macro DUMP_MACRO_GCODE] description = Debug: Print entries of the printer object containing gcode_macro gcode = {% set out = [] %} {% for object in printer|sort %} {% if object != 'configfile' and 'gcode_macro' is in object %} {% for parameter, value in printer[object].items()|sort %} {% set _dummy = out.append("printer['%s'].%s = %s" % (object, parameter, value)) %} {% endfor %} {% endif %} {% endfor %} {% if out|length == 0 %}{% set _dummy = out.append("Nothing found for \"DUMP_GCODE %s\"" % rawparams) %}{% endif %} {action_respond_info(out|join("\n"))} [gcode_macro DUMP_PARAMETERS] description = Debug: Print all entries of the printer object gcode = {% set parameters = namespace(output = '') %} {% for name1 in printer %} {% for name2 in printer[name1] %} {% set donotwant = ['bed_mesh','configfile'] %} {% if name1 is not in donotwant %} {% set param = "printer['%s'].%s = %s" % (name1, name2, printer[name1][name2]) %} {% set parameters.output = parameters.output + param + "\n" %} {% endif %} {% else %} {% set param = "printer['%s'] = %s" % (name1, printer[name1]) %} {% set parameters.output = parameters.output + param + "\n" %} {% endfor %} {% endfor %} {action_respond_info(parameters.output)} [gcode_macro DUMP_CONFIG] description = Debug: Print all entries of the printer config object gcode = {% set show = params.S|lower %} {% set parameters = namespace(output = '') %} {% for name1 in printer.configfile.config %} {% if name1 is in show %} {% for name2 in printer.configfile.config[name1] %} {% set param = "printer.configfile.config['%s'].%s = %s" % (name1, name2, printer.configfile.config[name1][name2]) %} {% set parameters.output = parameters.output + param + "\n" %} {% endfor %} {% endif %} {% endfor %} {action_respond_info(parameters.output)} [gcode_macro DUMP_SETTINGS] description = Debug: Print all entries of the printer settings object gcode = {%if 'S' in params %} {% set show = [params.S] %} {% set parameters = namespace(output = '') %} {% for name1 in printer.configfile.settings %} {% if name1 is in show %} {% for name2 in printer.configfile.settings[name1] %} {% set param = "printer.configfile.settings['%s'].%s = %s" % (name1, name2, printer.configfile.settings[name1][name2]) %} {% set parameters.output = parameters.output + param + "\n" %} {% endfor %} {% endif %} {% endfor %} {action_respond_info(parameters.output)} {% else %} {action_respond_info("WARNING: parameter S needed call e.g. DUMP_SETTINGS S='printer'")} {% endif %} [gcode_macro SEARCH_VARS] gcode = {% set search = params.S|lower %} {% set ns = namespace() %} {% for item in printer %} {% if ' ' in item %} {% set ns.path = ['printer', "['%s']" % (item), ''] %} {% else %} {% set ns.path = ['printer.', item, ''] %} {% endif %} {% if search in ns.path|lower %} { action_respond_info(ns.path|join) } {% endif %} {% if printer[item].items() %} {% for childkey, child in printer[item].items() recursive %} {% set ns.path = ns.path[:loop.depth|int + 1] %} {% if ' ' in childkey %} {% set null = ns.path.append("['%s']" % (childkey)) %} {% else %} {% set null = ns.path.append(".%s" % (childkey)) %} {% endif %} {% if child is mapping %} { loop(child.items()) } {% else %} {% if search in ns.path|lower %} { action_respond_info("%s : %s" % (ns.path|join, child)) } {% endif %} {% endif %} {% endfor %} {% endif %} {% endfor %} [gcode_macro VARIABLE] gcode = variable_retract_z_hop = { } variable_offset_temp = { } variable_fan = { } variable_bed_temp = { } variable_beeper = { } variable_power_supply = { } variable_filament_sensor = { } variable_active = { } variable_tool = { } variable_toolhead = { } variable_hotend_offset = { } variable_tool_change = { } description = HELP: for list of variables send GET_USER_VARIABLE variable_aaa = {'printer' : 'BOLT-Pro' } variable_tmp = 0 variable_restore_variable = ['hotend_offset'] variable_dual_carriage = { } variable_idex_mode = { } [gcode_macro _INIT_RETRACT_Z_HOP] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "retract_z_hop" %} {% set init = { } %} {% set val_step = printer.configfile.config['extruder'].nozzle_diameter %} {% set val_speed = printer.configfile.config['printer'].max_z_velocity %} {% set _dummy = init.update({'enable': false, 'step':val_step, 'speed': val_speed }) %} {action_respond_info("Creating a list of variables for z-hop") if printer.save_variables.variables.dump_list} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" [gcode_macro SET_RETRACT_Z_HOP] description = SET_RETRACT_Z_HOP ENABLE=[0|1] STEP=0.4 SPEED=60 gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "retract_z_hop" %} {% set init = user_vars[name] %} {% if not params %} {action_respond_info("The ENABLE, STEP, or SPEED parameters are not defined for the SET_RETRACT_Z_HOP command")} {% else %} {% set enable_param=params.ENABLE|default(1) if params.ENABLE is defined else -1 %} {% set step_param=params.STEP|default(0.4) if params.STEP is defined else -1 %} {% set speed_param=params.SPEED|default(60) if params.SPEED is defined else -1 %} {% for key in params %} {% if key|lower =='step' %} {% set _dummy = init.update( {'change_step' : step_param|float} ) %} {% elif key|lower =='speed' %} {% set _dummy = init.update( {'speed' : speed_param|int} ) %} {% elif key|lower =='enable' %} {% if enable_param not in ['0','1'] %} {action_respond_info(" Invalid parameter ENABLE=%s " % enable_param )} {% elif init.enable|lower == 'false' and enable_param|int != 1 %} {action_respond_info("Z-hop with G10/G11 G-code is disabled.")} {% elif init.enable|lower == 'true' and enable_param|int != 0 %} {action_respond_info("Z-hop with G10/G11 G-code is already active.")} {% else %} {% set _dummy = init.update( { 'change_enable':true} ) %} {action_respond_info(" Change ENABLE after G-code G11 " )} {% endif %} {% endif %} {% endfor %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% endif %} [gcode_macro GET_RETRACT_Z_HOP] description = list of settings gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "retract_z_hop" %} {% set init = user_vars[name] %} {action_respond_info("ENABLE=%s STEP=%s SPEED=%s" % (init.enable, init.step, init.speed))} [gcode_macro G10] rename_existing = G10.1 description = Overide "G10" retract macro gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "retract_z_hop" %} {% set init = user_vars[name] %} G10.1 {% if init.enable and "xyz" in printer.toolhead.homed_axes %} {% set retract_pos = printer['gcode_move'].gcode_position.z %} {% set _dummy = init.update( { 'layer': retract_pos} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" G91 G1 Z{init.step|float} F{init.speed*60} G90 {% endif %} [gcode_macro G11] rename_existing = G11.1 description = Overide "G11" unretract macro gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "retract_z_hop" %} {% set init = user_vars[name] %} {% if init.enable and "xyz" in printer.toolhead.homed_axes %} {% set unretract_pos = printer['gcode_move'].gcode_position.z %} {% set retract_pos = init.layer|float + init.step|float %} {% if retract_pos == unretract_pos %} G91 G1 Z-{init.step|float} F{init.speed*60} G90 {% endif %} {% endif %} G11.1 {% if 'change_enable' in init %} {% set value = false if init.enable else true %} {% set info = 'enable' if value else 'disable' %} {action_respond_info(" Z-hop with G-code G10/G11 is %s " % info )} {% set _dummy = init.update( { 'enable': value} ) %} {% set _dummy = init.pop( 'change_enable' ) %} {% if not value %} {% set _dummy = init.pop( 'layer' ) %} {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% endif %} {% if 'change_step' in init %} {action_respond_info(" Change Z-hop step after G-code G11 ")} {% set _dummy = init.update( { 'step': init.change_step} ) %} {% set _dummy = init.pop( 'change_step' ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% endif %} [gcode_macro _INIT_OFFSET_TEMP] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "offset_temp" %} {% set init = { } %} {% for tool in printer.heaters.available_heaters|sort %} {% if 'extruder' in tool %} {% set _dummy = init.update({tool: 0}) %} {% endif %} {% endfor %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {action_respond_info("Creating a list of variables for macro M104 ") if printer.save_variables.variables.dump_list } [gcode_macro M104] rename_existing = M104.1 description = Overide "M104" to allow multiple extruders gcode = SET_TOOL_HEATER T={params.T|default(0)} S={params.S|default(0)} WAIT='False' [gcode_macro M109] rename_existing = M109.1 description = Overide "M109" to allow multiple extruders gcode = SET_TOOL_HEATER T={params.T|default(0)} S={ params.R|default(0)|float if params.R is defined else params.S|default(0)|float } WAIT='True' [gcode_macro SET_TOOL_HEATER] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set active_tool = printer.toolhead.extruder.lstrip("extruder") if printer.toolhead.extruder.lstrip("extruder")|length != 0 else 0 %} {% set target_tool = params.T|default(active_tool)|int %} {% if user_vars.tool |length < target_tool + 1 %} {action_respond_info("G-code T%s is not defined for extruder." % (target_tool))} {% else %} {% set default_heater = user_vars.tool[target_tool] %} {% set temp = params.S|default(0)|float %} {% set wait = params.WAIT|default('False')%} {% set target_offset = user_vars.offset_temp[default_heater] if temp != 0 else 0 %} {% if temp == 0 %} {% set _dummy = user_vars.offset_temp.update({default_heater : 0}) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=offset_temp VALUE="{user_vars.offset_temp}" {% endif %} {% if 'gcode_macro M605' in printer and user_vars.idex_mode.active in [2,3] %} SET_HEATER_TEMPERATURE HEATER="{default_heater}" TARGET={temp + target_offset} {% if printer['gcode_macro SET_SYNC_HEATERS_MODE'] is defined %} SET_SYNC_HEATERS_MODE WAIT=0 {% endif %} {% else %} SET_HEATER_TEMPERATURE HEATER="{default_heater}" TARGET={temp + target_offset} {% if wait == 'True' and temp !=0 %} TEMPERATURE_WAIT SENSOR="{default_heater}" MINIMUM={temp - 2.0} MAXIMUM={temp + 2.0} {% endif %} {% endif %} {% endif %} [gcode_macro SET_TEMP_OFFSET] description = SET_TEMP_OFFSET T=(tool) R=(offset_temp) gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set act_tool = printer.toolhead.extruder %} {% set act_tool_nr = act_tool.lstrip("extruder")|int if act_tool.lstrip("extruder")|length != 0 else 0|int %} {% set target_tool = params.T|default(act_tool_nr)|int %} {% set target_offset = params.R|default(0)|int %} {% set default_heater = user_vars.tool[target_tool] %} {% set act_temp = printer[default_heater].target |float %} {% if target_offset !=0 %} {% if act_temp !=0 and target_offset|abs <= 10 %} {% set temp = act_temp - user_vars.offset_temp[default_heater] %} SET_HEATER_TEMPERATURE HEATER="{default_heater}" TARGET={temp + user_vars.offset_temp[default_heater]} {% else %} RESPOND MSG=" Set temperature first or offset must be range -10 to 10 !" {% set target_offset = 0|int %} {% endif %} {% else %} {% set temp = act_temp - user_vars.offset_temp[default_heater] %} RESPOND MSG="Reset offset temp for "{default_heater} SET_HEATER_TEMPERATURE HEATER="{default_heater}" TARGET={temp + target_offset } {% endif %} {% set _dummy = user_vars.offset_temp.update({default_heater: target_offset}) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=offset_temp VALUE="{user_vars.offset_temp}" [gcode_macro SET_SYNC_HEATERS_MODE] description = Set both heater + offset temp. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set wait_heating = params.WAIT|default(0)|int %} {% if user_vars.tool|length > 2 %} {% set toolhead_0_extr_0 = user_vars.toolhead[0][0] %} {% set toolhead_1_extr_0 = user_vars.toolhead[1][0] %} {% set act_temp_0 = printer[toolhead_0_extr_0].target|float %} {% set both_temp_0 = act_temp_0 + user_vars.offset_temp[toolhead_1_extr_0] %} {% if user_vars.tool|length == 4 %} {% set toolhead_0_extr_1 = user_vars.toolhead[0][1] %} {% set toolhead_1_extr_1 = user_vars.toolhead[1][1] %} {% set act_temp_1 = printer[ toolhead_0_extr_1].target|float %} {% set both_temp_1 = act_temp_1 + user_vars.offset_temp[toolhead_1_extr_1] %} {% endif %} {% if act_temp_0 > 0 or act_temp_1 > 0 %} SET_HEATER_TEMPERATURE HEATER={toolhead_0_extr_0} TARGET={act_temp_0} SET_HEATER_TEMPERATURE HEATER={toolhead_1_extr_0} TARGET={both_temp_0} {% if wait_heating == 1 %} TEMPERATURE_WAIT SENSOR={toolhead_0_extr_0} MINIMUM={act_temp_0 - 2.0} MAXIMUM={act_temp_0 + 2.0} TEMPERATURE_WAIT SENSOR={toolhead_1_extr_0} MINIMUM={both_temp_0 - 2.0} MAXIMUM={both_temp_0 + 2.0} {% endif %} {% if user_vars.tool|length == 4 %} SET_HEATER_TEMPERATURE HEATER={toolhead_0_extr_1} TARGET={act_temp_1} SET_HEATER_TEMPERATURE HEATER={toolhead_1_extr_1} TARGET={both_temp_1} {% if wait_heating == 1 %} TEMPERATURE_WAIT SENSOR={toolhead_0_extr_1} MINIMUM={act_temp_1 - 2.0} MAXIMUM={act_temp_1 + 2.0} TEMPERATURE_WAIT SENSOR={toolhead_1_extr_1} MINIMUM={both_temp_1 - 2.0} MAXIMUM={both_temp_1 + 2.0} {% endif %} {% endif %} {% else %} {% set name = "offset_temp" %} {% set upd_init = user_vars.offset_temp %} SET_HEATER_TEMPERATURE HEATER={toolhead_1_extr_0} TARGET=0 {% set _dummy = upd_init.update({toolhead_0_extr_0: 0 }) %} {% set _dummy = upd_init.update({toolhead_1_extr_0: 0 }) %} {% if user_vars.tool|length == 4 %} SET_HEATER_TEMPERATURE HEATER={toolhead_1_extr_1} TARGET=0 {% set _dummy = upd_init.update({toolhead_0_extr_1: 0 }) %} {% set _dummy = upd_init.update({toolhead_1_extr_1: 0 }) %} {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{upd_init}" {% endif %} {% else %} {action_respond_info("Configuration is not valid for synchronized heaters.")} {% endif %} [gcode_macro _INIT_FAN_GENERIC] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set var_fan = { 'menu': False } %} {% set ns = namespace(menu=0|int) %} {% for object in printer.configfile.config|sort %} {% if 'fan_generic' is in object %} {% if var_fan.index is not defined %} {% set _dummy = var_fan.update( {'index': [ ]} ) %} {% endif %} {% set _dummy = var_fan.index.append(object.split(' ')[1]) %} {% set _dummy = var_fan.update({'active': 0 }) %} {% set ns.menu = 1 %} {% endif %} {% endfor %} {% if ns.menu == 1 %} {% set _dummy = var_fan.update( { 'menu': True } ) %} {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=fan VALUE="{var_fan}" {action_respond_info("Creating a list of variables for FANs ") if printer.save_variables.variables.dump_list} [gcode_macro M106] description = Override "M106" to allow multiple extruders. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set raw_speed = params.S|default(255)|float %} {% set fan_speed = (raw_speed / 255.0)|round(2) %} {% if (params.P) is defined %} {% set target_fan = params.P|int %} {% set index_fan = user_vars.fan.index|length -1 %} {% if index_fan >= target_fan %} {% set default_fan = user_vars.fan.index[target_fan] %} {action_respond_info("Set fan [P%s] ... fan_generic %s" % (target_fan,default_fan))} {% else %} {% set default_fan = user_vars.fan.index[0] %} {action_respond_info("Fan [P%s] is not defined, set default [P0] ... fan_generic %s" % (target_fan,default_fan))} {% endif %} SET_FAN_SPEED FAN={default_fan} SPEED={fan_speed} {% else %} TOOLHEAD_PRINT_FAN SPEED={fan_speed} {% endif %} [gcode_macro M107] description = Override "M107" to allow multiple extruders. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if (params.P) is defined %} M106 S0 P{params.P} {% else %} {% for fan in user_vars.fan.index|sort %} SET_FAN_SPEED FAN={fan} SPEED=0 {% endfor %} {% endif %} [gcode_macro TOOLHEAD_PRINT_FAN] description = Set automatically the print fan speed. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set fan_speed = [ ] %} {% set act_extruder = printer.toolhead.extruder %} {% if params.SPEED is defined %} {% set _dummy=fan_speed.append( params.SPEED|float) %} {% else %} {% for index in user_vars.toolhead %} {% set _dummy = fan_speed.append( printer["fan_generic " + user_vars.fan.index[index]].speed|float ) %} {% endfor %} {% endif %} {% if 'gcode_macro M605' in printer and user_vars.idex_mode.active in [2,3] %} {% for index in user_vars.toolhead %} SET_FAN_SPEED FAN={user_vars.fan.index[index]} SPEED={fan_speed|max } {% endfor %} {% else %} {% for index in user_vars.toolhead %} {% if act_extruder in user_vars.toolhead[index] %} SET_FAN_SPEED FAN={user_vars.fan.index[index]} SPEED={fan_speed|max } {% else %} SET_FAN_SPEED FAN={user_vars.fan.index[index]} SPEED=0 {% endif %} {% endfor %} {% endif %} [gcode_macro _INIT_DELTA_BED_TEMP] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "bed_temp" %} {% set init = { } %} {% set delta_temp = 10.0 %} {% set offset_target = 0.5 %} {% set _dummy = init.update({'sensor':sensor|default("heater_bed"), 'delta_temp':delta_temp, 'offset_target':offset_target }) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {action_respond_info("Creating a list of variables for macro M140/M190") if printer.save_variables.variables.dump_list } [gcode_macro M140] rename_existing = M140.1 gcode = SET_BED_HEATER TEMP={params.S|default(0)} WAIT=0 [gcode_macro M190] rename_existing = M190.1 gcode = SET_BED_HEATER TEMP={params.S|default(0)} WAIT=1 [gcode_macro SET_BED_HEATER ] description = Use an external sensor to mesure the bed temp gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set temp = params.TEMP|float %} {% set wait = params.WAIT|default(0)|int %} {% if user_vars.bed_temp.sensor == "heater_bed" %} {% set delta_temp = 0.0 %} {% set sensor = user_vars.bed_temp.sensor %} {% else %} {% set delta_temp = user_vars.bed_temp.delta_temp %} {% set sensor = ("temperature_sensor %s" % user_vars.bed_temp.sensor) %} {% endif %} {% set heater_temp = (temp + delta_temp) if temp > 0 else 0 %} {% if heater_temp < printer.configfile.settings.heater_bed.max_temp|float|round(1) %} SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={heater_temp} {% if wait == 1 and heater_temp > 0.0 %} TEMPERATURE_WAIT SENSOR="{sensor}" MINIMUM={ heater_temp - user_vars.bed_temp.offset_target } MAXIMUM={ heater_temp + user_vars.bed_temp.offset_target } {% endif %} {% else %} {action_respond_info("Aborted, target %3.1f\u00B0C exedes max_temp config limit" % heater_temp)} {% endif %} [gcode_macro SET_DELTA_BED_TEMP] description = SET_DELTA_BED_TEMP SENSOR=bed_plate DELTA=10.0 OFFSET=0.5 gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "bed_temp" %} {% set init = user_vars[name] %} {% if not params %} {action_respond_info("Actual settings: SENSOR=%s DELTA=%s OFFSET=%s " % (init.sensor, init.delta_temp, init.offset_target))} {action_respond_info("The SENSOR, DELTA, or OFFSET parameters are not defined for the SET_DELTA_BED_TEMP command")} {% else %} {% set SENSOR_param=params.SENSOR|default("heater_bed") if params.SENSOR is defined else -1 %} {% set DELTA_param=params.DELTA|default(10) if params.DELTA is defined else -1 %} {% set OFFSET_param=params.OFFSET|default(0.5) if params.OFFSET is defined else -1 %} {% for key in params %} {% if key|lower =='delta' %} {% set _dummy = init.update( {'delta_temp' : DELTA_param|float} ) %} {% elif key|lower =='offset' %} {% set _dummy = init.update( {'offset_target' : OFFSET_param|float} ) %} {% elif key|lower =='sensor' %} {% set _dummy = init.update( { 'sensor': SENSOR_param} ) %} {% endif %} {% endfor %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% endif %} [gcode_macro M218] description = Sets hotend offset (in mm): T X Y Z. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set ns = namespace(key_in_params=false) %} {% if params.T is not defined %} {% for tool in printer.heaters.available_heaters|sort %} {% if 'extruder' in tool %} {% set tool_nr = tool.lstrip("extruder") if tool.lstrip("extruder")|length != 0 else 0 %} {% set hotend_offset = user_vars.hotend_offset[tool_nr|int] %} { action_respond_info("Hotend offset T%s is: ( X %s / Y %s / Z %s ) " % (tool_nr, hotend_offset.x, hotend_offset.y, hotend_offset.z)) } {% endif %} {% endfor %} {% else %} {% set target_tool = params.T|default(0)|int %} {% if user_vars.tool|length < target_tool + 1 %} {action_respond_info("The tool T%s is not defined for Hotend or extruder." % (params.T)) } {% else %} {% if target_tool == 0 and printer.save_variables.variables.hotend_offset.change_T0 == False %} {action_respond_info("The tool T0 is not defined for change offset." )} {% else %} {% set new_hotend_offset = user_vars.hotend_offset %} {% for key in params %} {% if key in [ 'X' ,'Y', 'Z' ] %} {% set ns.key_in_params = true %} {% set value_offset = params[key] %} {% set _dummy =new_hotend_offset[target_tool].update( { key|lower : value_offset|float }) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=hotend_offset VALUE="{new_hotend_offset}" {% set act_extruder = printer['toolhead'].extruder %} {% set act_extruder_nr = act_extruder.lstrip("extruder") if act_extruder.lstrip("extruder")|length != 0 else 0 %} {% if act_extruder_nr|int == target_tool|int %} {action_respond_info ("SET_GCODE_OFFSET %s=%s MOVE=1 " % (key, value_offset))} SET_GCODE_OFFSET {key}={value_offset} MOVE=1 MOVE_SPEED=500 {% endif %} {% endif %} {% endfor %} {% endif %} {% if ns.key_in_params == false %} {% set hotend_offset = user_vars.hotend_offset[target_tool|int] %} {action_respond_info("Hotend offset T%s is: ( X %s / Y %s / Z %s ) " % (target_tool, hotend_offset.x, hotend_offset.y, hotend_offset.z))} {% endif %} {% endif %} {% endif %} [output_pin beeper] pin = EXP1_1 [gcode_macro _INIT_BEEPER] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set beeper = { } %} {% if 'output_pin beeper' in printer %} {% set _dummy = beeper.update( {'enable': True ,'silent': False, 'output_pin': 'beeper' } ) %} {% else %} {% set _dummy = beeper.update( {'enable': False } ) %} {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=beeper VALUE="{beeper}" {action_respond_info("Creating a list of variables for beeper") if user_vars.list} [gcode_macro M300] description = Play beep sound: M300 P gcode = {% set P = '' if 'P' not in params else " P=%s" % params.P %} SET_BEEPER {"%s" % (P)} [gcode_macro SET_BEEPER] description = Play beep sound: SET_BEEPER P= R= PLAY= gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if user_vars.beeper.enable %} {% set var_beeper = user_vars.beeper %} {% set time = params.P|default(300)|int %} {% set repeat = params.R|default(1)|int %} {% set play = params.PLAY|upper %} {% set active = 1 %} {% if play == 'ON' %} {% set time = 100 %} {% set _dummy = var_beeper.update( {'silent': False } ) %} {% elif play == 'OFF' %} {% set active = 0 %} {% set _dummy = var_beeper.update( {'silent': True } ) %} {% elif not user_vars.beeper.silent %} {% for n in range(repeat) %} SET_PIN PIN={user_vars.beeper.output_pin} VALUE={active} G4 P{time} SET_PIN PIN={user_vars.beeper.output_pin} VALUE=0 G4 P{time} {% endfor %} {% else %} RESPOND MSG=" Beeper is OFF, please send SET_BEEPER PLAY=ON " {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=beeper VALUE="{var_beeper}" {% else %} RESPOND MSG=" [output_pin beeper] is not defined in printer.cfg ! " {% endif %} [output_pin PS_ON] pin = PF6 value = 1 [gcode_button PW_DET] pin = PE12 press_gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set init = user_vars.power_supply %} {% if user_vars.power_supply.wait_off %} {% set _dummy = init.update( { 'wait_off':False} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" RESPOND MSG=" STOP - wait for cooling and shutting down." M117 STOP - Turn OFF {% else %} POWER_DETECT_OFF {% endif %} [led PS_LED] green_pin = PD12 cycle_time = 0.010 hardware_pwm = False initial_green = 1.0 [gcode_macro _INIT_POWER_SUPPLY] gcode = {% set macro_name = "VARIABLE" %} {% set name = "power_supply" %} {% set init = { } %} {% set _dummy = init.update( { 'auto_off':False, 'wait_off': False, 'running':False, 'time':0, 'power_loss': False} ) %} {% if printer.save_variables.variables[name] is not defined %} SAVE_VARIABLE VARIABLE={name} VALUE="{init}" {% else %} SAVE_VARIABLE VARIABLE={name} VALUE="{init}" {% endif %} SET_GCODE_VARIABLE MACRO={macro_name} VARIABLE={name} VALUE="{init}" [gcode_macro POWER_DETECT_OFF ] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set init = user_vars.power_supply %} {% if printer['virtual_sdcard'].is_active == true %} {% if printer.save_variables.variables.power_supply.power_loss %} RESPOND MSG=" run TRIGGER_POWER_LOSS_RECOVERY macro " {% else %} {% set value = false if printer.save_variables.variables.power_supply.auto_off else true %} {% set _dummy = init.update( {'auto_off':value} ) %} {% set info = 'enable' if value else 'disable' %} {% set msg = "G-code M81 power off is %s " % info %} RESPOND MSG=" '{msg}' " SAVE_VARIABLE VARIABLE=power_supply VALUE="{init}" SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" {% if printer['led PS_LED'] is defined %} SET_LED LED=PS_LED GREEN={0.00 if value else 1.00} SYNC=0 TRANSMIT=1 {% endif %} {% endif %} {% else %} {% if not printer["gcode_macro VARIABLE"].power_supply.running %} _COOLING_HEATER {% endif %} {% endif %} [gcode_macro _POWER_SUPPLY_OFF] description = Turn off. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set init = user_vars.power_supply %} {% if printer['led PS_LED'] is defined %} SET_LED LED=PS_LED GREEN={1.00 if init.time % 2 else 0.00} SYNC=0 TRANSMIT=1 {% endif %} {% set waittime = 10 %} {% if not init.running %} {% set _dummy = init.update( { 'running':True, 'time':0} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" RESPOND MSG="The printer will turn off! Hold the button for cancel." M117 Power supply OFF {% if 'gcode_macro SET_BEEPER' in printer %} SET_BEEPER P=250 R=3 {% endif %} UPDATE_DELAYED_GCODE ID=_POWER_SUPPLY_OFF_STEP DURATION=1 {% elif init.time < waittime %} UPDATE_DELAYED_GCODE ID=_POWER_SUPPLY_OFF_STEP DURATION=1 {% else %} {% set _dummy = init.update( { 'running':False, 'time':0} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" RESPOND MSG="Turn OFF" M117 Turn OFF {% if printer['led PS_LED'] is defined %} SET_LED LED=PS_LED GREEN=0.00 SYNC=0 TRANSMIT=1 {% endif %} SET_PIN PIN=PS_ON VALUE=0 {% endif %} [delayed_gcode _POWER_SUPPLY_OFF_STEP] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set init = user_vars.power_supply %} {% if init.running and printer['gcode_button PW_DET'].state == "RELEASED"%} {% set _dummy = init.update( { 'time':(init.time + 1) } ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" _POWER_SUPPLY_OFF {% else %} {% set _dummy = init.update( { 'running':False, 'time':0} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" {% if printer['led PS_LED'] is defined %} SET_LED LED=PS_LED GREEN=1.00 SYNC=0 TRANSMIT=1 {% endif %} RESPOND MSG=" STOP - Turn OFF" M117 STOP - Turn OFF {% endif %} [gcode_macro _COOLING_HEATER] description = Turn off. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set init = user_vars.power_supply %} {% set ns = namespace(power_off=true, info=' ') %} {% for object in printer.configfile.config|sort %} {% if 'heater_fan' is in object and printer[(object)].speed|float > 0.0 %} {% set ns.power_off = false %} {% set ns.info ="Fan is still cooling hotend." %} {% endif %} {% endfor %} {% for tool in printer.heaters.available_heaters|sort %} {% if printer[tool].target > 0.0 %} {% set ns.power_off = false %} {% set ns.info = "Heating is ON." %} {% endif %} {% endfor %} {% if ns.power_off %} {% set _dummy = init.update( { 'wait_off':False} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" RESPOND MSG=" The printer will turn off ! " M117 Power supply OFF _POWER_SUPPLY_OFF {% else %} {% set msg = "%s Printer cannot be switched off !" % ns.info %} RESPOND MSG=" '{msg}' " {% set time = 30|int %} {% set _dummy = init.update( { 'wait_off':True} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" UPDATE_DELAYED_GCODE ID=_WAIT_FOR_COOLING DURATION={time} {% endif %} [delayed_gcode _WAIT_FOR_COOLING ] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if user_vars.power_supply.wait_off %} _COOLING_HEATER {% endif %} [gcode_macro SET_AUTO_OFF] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set init = user_vars.power_supply %} {% set value = false if init.auto_off else true %} {% set _dummy = init.update( { 'auto_off': value} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" {% set info = 'enable' if value else 'disable' %} {action_respond_info(" G-code M81 power off is %s " % info )} [gcode_macro M80] description = Turn on the high-voltage power supply. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set init = user_vars.power_supply %} {% set _dummy = init.update( { 'running':False, 'wait_off':False} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" {% if printer['output_pin PS_ON'].value != 1.0 %} SET_PIN PIN=PS_ON VALUE=1 {% if printer['led PS_LED'] is defined %} SET_LED LED=PS_LED GREEN=1 SYNC=0 TRANSMIT=1 {% endif %} RESPOND MSG=" Power supply ON. " M117 Power supply ON. {% else %} RESPOND MSG=" The printer is already turned on !" M117 The printer is already turned on ! {% endif %} [gcode_macro M81] description = Turn off the high-voltage power supply. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if user_vars.power_supply.auto_off %} _COOLING_HEATER {% elif printer['virtual_sdcard'].is_active != true %} POWER_DETECT_OFF {% endif %} [gcode_macro _INIT_FILAMENT_SENSOR] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "filament_sensor" %} {% set init = { 'defined' : False } %} {% set ns = namespace(index=1|int) %} {% for object in printer.configfile.config|sort %} {% if object.split(' ')[0] == 'filament_switch_sensor' %} {% set type = 'switch' %} {% elif object.split(' ')[0] == 'filament_motion_sensor' %} {% set type = 'motion' %} {% else %} {% set type = 'false' %} {% endif %} {% if type != 'false' %} {% set _dummy = init.update( {'defined' : True } ) %} {% set name = (object.split(' ')[1]) %} {% if type == 'motion' %} {% set _dummy = init.update({ 'motion': [name]}) if init.motion is not defined else init.motion.append(name) %} {% elif type == 'switch' %} {% set _dummy = init.update({ 'switch': [name]}) if init.switch is not defined else init.switch.append(name) %} {% endif %} {% set _dummy = init.update({ 'active': 0|int }) %} {% set _dummy = init.update({ 'index': [name]}) if init.index is not defined else init.index.append(name) %} {% set _dummy = init.update({ 'count': ns.index }) %} {% set ns.index = ns.index + 1 %} {% endif %} {% endfor %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {action_respond_info("Creating a list of variables for filament sensor." ) if printer.save_variables.variables.dump_list} [gcode_macro TRIGGER_RUNOUT] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set trig_sensor = params.SENSOR |lower %} {% if trig_sensor == 'switch' %} {action_respond_info("Activated runout switch sensor")} PAUSE X=120 Y=0 Z_MIN=20 {% if 'gcode_macro SET_BEEPER' in printer %} SET_BEEPER P=250 R=3 {% endif %} RESPOND MSG="End of filament!" M117 End of filament! {% elif trig_sensor == 'motion' %} {action_respond_info("Activated runout encoder sensor")} PAUSE X=120 Y=0 Z_MIN=20 {% if 'gcode_macro SET_BEEPER' in printer %} SET_BEEPER P=125 R=3 {% endif %} RESPOND MSG="Filament does not move!" M117 Filament does not move! {% else %} {action_respond_info("params SENSOR = %s not defined" % trig_sensor) } {% endif %} [gcode_macro _A_INIT_ACTIVE] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "active" %} {% set init = { } %} {% set _dummy = init.update({'mode': 0, 'z':{ 'hop':4.0, 'restore': 4.0, 'print_offset':0.0 , 'hop_enable': true } }) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {action_respond_info("Creating a list of active variable") if printer.save_variables.variables.dump_list} [gcode_macro _A_INIT_TOOL] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "tool" %} {% set init = { } %} {% for tool in printer.heaters.available_heaters|sort %} {% if 'extruder' in tool %} {% set tool_nr = tool.lstrip("extruder") if tool.lstrip("extruder")|length != 0 else 0 %} {% set _dummy = init.update({tool_nr|int: tool}) %} {% endif %} {% endfor %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {action_respond_info("Creating a list of variables for %s extruder" % (init|length)) if printer.save_variables.variables.dump_list} [gcode_macro _B_INIT_TOOLHEAD] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set count_extruder = user_vars.tool|length %} {% set name = "toolhead" %} {% set init = { } %} {% if 'dual_carriage' in printer['motion_report'].steppers or printer.configfile.settings['printer'].kinematics == 'dualgantry_cartesian' %} {% set ns=namespace(extruder=0|int) %} {% set count_0 = count_extruder - count_extruder // 2 %} {% set count_1 = count_extruder // 2 %} {% for toolhead in range(0, 2) %} {% for extruder in range(0, count_0 if toolhead == 0 else count_1) %} {% set _dummy = init.update({ toolhead: [user_vars.tool[ns.extruder]] }) if init[toolhead] is not defined else init[toolhead].append(user_vars.tool[ns.extruder]) %} {% set ns.extruder = ns.extruder + 1 %} {% endfor %} {% endfor %} {% else %} {% for extruder in range(0, count_extruder) %} {% set _dummy = init.update({ 0: [user_vars.tool[extruder]] }) if init.0 is not defined else init.0.append(user_vars.tool[extruder]) %} {% endfor %} {% endif %} {action_respond_info("Creating a list of variables for user configuration extruder / carriages.") if printer.save_variables.variables.dump_list} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" [gcode_macro _C_INIT_HOTEND_OFFSET] description = init or restore hotend offset after restart from [save_variables] file. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if user_vars.tool|length > 1 %} {% set name = "hotend_offset" %} {% set init = user_vars.hotend_offset %} {% for tool in printer.heaters.available_heaters|sort %} {% if 'extruder' in tool %} {% set tool_nr = tool.lstrip("extruder") if tool.lstrip("extruder")|length != 0 else 0 %} {% if user_vars.hotend_offset[tool_nr|int] is not defined %} {% set _dummy = init.update( { tool_nr|int : {'x': 0.0 , 'y': 0.0 , 'z': 0.0}} ) %} {% endif %} {% endif %} {% endfor %} {% set _dummy = init.update( {'change_T0': False} ) %} {action_respond_info("Creating a list of variables for macro M218 ") if printer.save_variables.variables.dump_list} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% else %} {action_respond_info("Configuration not valid for Hotend offset.") if printer.save_variables.variables.dump_list} {% endif %} [gcode_macro _D_INIT_TOOL_CHANGE_PARAM] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "tool_change" %} {% set init = {'enable' : False } %} {% if user_vars.tool|length > 1 %} {% for tool in printer.heaters.available_heaters|sort %} {% if 'extruder' in tool %} {% if init.delay is not defined %} {% set _dummy = init.update( { 'delay': { }} ) %} {% endif %} {% set _dummy = init.delay.update( { tool: 250 } ) %} {% endif %} {% endfor %} {% set _dummy = init.update( {'filament' : {'load': 0.5 , 'unload': 1.0, 'speed' : 45 }} ) %} {% set _dummy = init.update( {'axis_z' : {'hop': 3.0, 'restore': 3.0 }} ) %} {% set _dummy = init.update( {'enable' : True} ) %} {% if printer.configfile.settings['menu __main __user __toolchange'] is defined %} {% set _dummy = init.update( { 'menu': 'extruder'} ) %} {% endif %} {action_respond_info("Creating a list of variables for tool change param ") if printer.save_variables.variables.dump_list} {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" [gcode_macro T0] gcode = DEFINE_TOOL T=0 [gcode_macro T1] gcode = DEFINE_TOOL T=1 [gcode_macro DEFINE_TOOL] description = Define the tool for G-code 'Txx'. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set target_tool = params.T|default(0)|int %} {% if user_vars.tool |length < target_tool + 1 %} {action_respond_info("The tool T%s is not defined for extruder." % (target_tool))} {% else %} {% set target_extruder = (user_vars.tool[target_tool])|string %} SETINGS_TOOL EXTRUDER={target_extruder} {% endif %} [gcode_macro SETINGS_TOOL] description = Set the tool by param EXTRUDER. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set target_extruder = params.EXTRUDER|default('extruder') %} {% set act_extruder = (printer.toolhead.extruder)|string %} {% set act_speed = printer.gcode_move.speed %} {% if user_vars.tool_change.enable %} {% if 'gcode_macro SYNC_SWITCHING_TOOL' in printer and user_vars.idex_mode.active in [2,3] %} SYNC_SWITCHING_TOOL T={( target_extruder.lstrip("extruder") if target_extruder.lstrip("extruder")|length != 0 else 0 )|int } {% else %} {% if 'gcode_macro MULTI_HOTEND' in printer and printer['virtual_sdcard'].is_active %} MULTI_HOTEND EXTRUDER={target_extruder} {% endif %} {% if act_extruder != target_extruder %} {action_respond_info("Will now be set '%s'." % (target_extruder))} M400 SAVE_PRINT_OFFSET_Z {% if 'gcode_macro ACTIVATE_OOZING_PREVENT' in printer and printer['virtual_sdcard'].is_active %} ACTIVATE_OOZING_PREVENT ACTUAL={act_extruder} TARGET={target_extruder} {% endif %} {% if printer[act_extruder].can_extrude | lower == 'true' and printer['virtual_sdcard'].is_active == true %} G92 E0 G1 E-{user_vars.tool_change.filament.unload} F{ (user_vars.tool_change.filament.speed * 60)|int } {% endif %} Z_HOP_TOOL {% if 'gcode_macro SWITCHING_HOTEND' in printer and user_vars.switching_hotend.park is defined %} {% endif %} {% set systems = 'CARRIAGE' if 'dual_carriage' in printer['motion_report'].steppers else 'GANTRY' if printer.configfile.settings['printer'].kinematics == 'dualgantry_cartesian' else 'TOOL' %} ACTIVATE_{systems} EXTRUDER={target_extruder} APPLY_OFFSETS_TOOL T={target_extruder} G4 P{user_vars.tool_change.delay[target_extruder]} {% if 'gcode_macro PRINT_WIPE_TOWER' in printer %} PRINT_WIPE_TOWER {% endif %} RESTORE_Z_TOOL {% if 'gcode_macro ACTIVATE_OOZING_PREVENT' in printer and printer['virtual_sdcard'].is_active %} {% set new_target_temp = (printer[target_extruder].target + user_vars.oozing_prevent.diff_temp[target_extruder])|int %} M109 S{new_target_temp|string} {% endif %} {% if printer[target_extruder].can_extrude | lower == 'true' and printer['virtual_sdcard'].is_active == true %} G92 E0 G1 E{user_vars.tool_change.filament.load} F{(user_vars.tool_change.filament.speed* 60)|int } {% endif %} {% else %} {action_respond_info("The Tool is alredy activated.")} {% endif %} {% endif %} G1 F{act_speed} {% else %} {action_respond_info("The tool cahnge is disabled !")} {% endif %} [gcode_macro SAVE_PRINT_OFFSET_Z] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if printer.toolhead.extruder == "extruder" %} {% set offset = user_vars.active %} {% set _dummy =offset.z.update({'print_offset': printer.gcode_move.homing_origin.z|float }) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=active VALUE="{offset}" {% endif %} [gcode_macro APPLY_OFFSETS_TOOL] description = Apply Offsets HotEnd (tool) by params T. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set target_tool = params.T|default(printer.toolhead.extruder)%} {% set tool_nr = target_tool.lstrip("extruder") if target_tool.lstrip("extruder")|length != 0 else 0 %} {% set offset = user_vars.hotend_offset[tool_nr|int] %} {% if printer['virtual_sdcard'].is_active != true %} SET_GCODE_OFFSET X={offset.x} Y={offset.y} MOVE=1 MOVE_SPEED=500 {% else %} SET_GCODE_OFFSET X={offset.x} Y={offset.y} {% endif %} SET_GCODE_OFFSET Z={offset.z + user_vars.active.z.print_offset} MOVE=1 MOVE_SPEED=500 [gcode_macro Z_HOP_TOOL] description = z-hop before action toolhead gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set z_hop_tool = params.Z|default(user_vars.active.z.hop)|float %} {% if user_vars.active.z.hop_enable %} {% if z_hop_tool > 0.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set cur_z = printer.toolhead.position.z|float %} {% set z_safe = z_hop_tool if cur_z < (max_z - z_hop_tool) else (max_z - cur_z) %} G91 G1 Z{z_safe} G90 {% set active = user_vars.active %} {% if printer['virtual_sdcard'].is_active %} {% set _dummy =active.z.update( {'restore':0.0 }) %} {% else %} {% set _dummy =active.z.update( { 'restore': z_safe }) %} {% endif %} {% set _dummy = active.z.update( {'hop_enable':false} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=active VALUE="{active}" {% endif %} {% endif %} [gcode_macro RESTORE_Z_TOOL] description = restore z-hop after action toolhead gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if user_vars.active.z.restore != 0 %} G91 G1 Z-{user_vars.active.z.restore} G90 {% else %} {% endif %} {% set active = user_vars.active %} {% set _dummy = active.z.update( {'hop_enable':true} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=active VALUE="{active}" [gcode_macro SET_GCODE_TOOL] description = SET_GCODE_TOOL TOOL=[0|1|2|3] EXTRUDER= gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = 'tool' %} {% set init = user_vars.tool %} {% if params.EXTRUDER is defined and params.TOOL is defined %} {% set extruder = params.EXTRUDER|default('extruder') %} {% set tool = params.TOOL|default(0)|int %} {% if extruder|lower in printer.heaters.available_heaters and tool <= init|length -1 %} {% set _dummy = init.update( { tool : extruder.lower() } ) %} {% else %} {action_respond_info("params EXTRUDER=%s or TOOL=%s not valid for this configuration." % (extruder,tool))} {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% else %} {action_respond_info("params EXTRUDER and TOOL must be defined!")} {% endif %} [gcode_macro SET_TOOLHEAD] description = SET_TOOLHEAD CARRIAGE=[0|1] TOOL= gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = 'toolhead' %} {% set init = user_vars.toolhead %} {% if params.CARRIAGE is defined and params.TOOL is defined %} {% set carriage = params.CARRIAGE|default(0)|int %} {% set tool = params.TOOL|default('extruder') %} {% set count_tool = params.TOOL.split(",")|length %} {% set ns = namespace(tool=true, extruder=()) %} {% for count in range(0, count_tool) %} {% set tool = params.TOOL.split(",")[count] %} {% if tool|lower not in printer.heaters.available_heaters %} {% set ns.extruder = tool %} {% set ns.tool = false %} {% endif %} {% endfor %} {% if carriage > init|length -1 %} {action_respond_info("params CARRIAGE= %s not valid for this configuration." % (carriage))} {% elif ns.tool == false %} {action_respond_info("params TOOL= %s not valid for this configuration." % (ns.extruder))} {% else %} {% for del in range(0, init[carriage]|length ) %} {% set _dummy = init[carriage].pop() %} {% endfor %} {% for count in range(0, count_tool) %} {% set tool = params.TOOL.split(",")[count] %} {% set _dummy = init[carriage].append( tool.lower() ) %} {% endfor %} {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% else %} {action_respond_info("params CARRIAGE and TOOL must be defined!")} {% endif %} [gcode_macro SET_CHANGE_PARAM] description = SET_CHANGE_PARAM LOAD=0.5 UNLOAD=1.5 SPEED=45 EXTRUDER=extruder DELAY=250 HOP=3.0 RESTORE=0.0 gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = 'tool_change' %} {% set init = user_vars.tool_change %} {% for key in params %} {% if key|lower =='extruder' %} {% set extruder = params[key]|default('extruder') %} {% set delay = params.DELAY|default(250)|int %} {% if extruder in init.delay %} {% set _dummy = init.delay.update( {extruder : delay} ) %} {% else %} {action_respond_info("params EXTRUDER=%s not valid for this configuration." % (extruder))} {% endif%} {% elif key|lower =='load' %} {% set load = params[key]|default(0.5)|float(2) %} {% set _dummy = init.filament.update( {'load' : load } ) %} {% elif key|lower =='unload' %} {% set unload = params[key]|default(1.5)|float(2) %} {% set _dummy = init.filament.update( {'unload' : unload } ) %} {% elif key|lower =='speed' %} {% set speed = params[key]|default(45)|int %} {% set _dummy = init.filament.update( {'speed' : speed } ) %} {% elif key|lower =='hop' %} {% set hop = params[key]|default(3.0)|float(2) %} {% set _dummy = init.axis_z.update( { 'hop' : hop } ) %} {% elif key|lower =='restore' %} {% set restore = params[key]|default(0.0)|float(2) %} {% set _dummy = init.axis_z.update( { 'restore' : restore } ) %} {% endif %} {% endfor %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" [gcode_macro _Z_INIT_RESTORE_USER_VARIABLE] gcode = {% if printer.save_variables.variables.restore_variable is defined %} RESTORE_USER_VARIABLE {% endif %} [gcode_macro GET_USER_VARIABLE] description = Debug: Print entries of the printer object containing gcode_macro gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set out = [] %} {% for parameter, value in printer["gcode_macro VARIABLE"].items()|sort %} {% set _dummy = out.append("printer['gcode_macro VARIABLE'].%s = %s" % (parameter, value)) %} {% endfor %} {action_respond_info(out|join("\n"))} [gcode_macro DUMP_LIST] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set value = false if printer.save_variables.variables.dump_list else true %} SAVE_VARIABLE VARIABLE=dump_list VALUE={value} {action_respond_info("set > %s " % value )} [gcode_macro SAVE_USER_VARIABLE] description = SAVE_USER_VARIABLE VAR= gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if params.VAR is defined %} {% set parameter = params.VAR|lower %} {% if parameter in user_vars %} {% set value = user_vars[parameter] %} SAVE_VARIABLE VARIABLE={parameter} VALUE="{value}" {% else %} {action_respond_info(" VAR=%s not in user variable." % params.VAR )} {% endif %} {% else %} {% for parameter,value in printer["gcode_macro VARIABLE"].items()|sort %} SAVE_VARIABLE VARIABLE={parameter} VALUE="{value}" {% endfor %} {% endif %} [gcode_macro RESTORE_USER_VARIABLE] description = gcode = {% set recovery = printer.save_variables.variables %} {% if 'none' in recovery.restore_variable %} {action_respond_info("No variables were restored !")} {% elif 'all' in recovery.restore_variable %} {% for parameter,value in printer["gcode_macro VARIABLE"].items()|sort %} {% if parameter in recovery %} {% set value = recovery[parameter] %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={parameter} VALUE="{value}" {% endif %} {% endfor %} {action_respond_info("All variables restored from SD card !")} {% else %} {% for parameter,value in printer["gcode_macro VARIABLE"].items()|sort %} {% if parameter in recovery.restore_variable %} {% set value = recovery[parameter] %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={parameter} VALUE="{value}" {% endif %} {% endfor %} {action_respond_info("From SD card restored this variables : %s" % recovery.restore_variable )} {% endif %} [gcode_macro DELETE_USER_VARIABLE] gcode = {% for variable in printer["gcode_macro VARIABLE"]|sort %} {% set value = { } %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={variable} VALUE="{value}" {% endfor %} [gcode_macro DELETE_SAVE_VARIABLE] description = for delete send: DELETE_SAVE_VARIABLE YES= gcode = {% if params.YES is defined %} {% for variable in printer.save_variables.variables|sort %} {% set value = { } %} SAVE_VARIABLE VARIABLE={variable} VALUE="{value}" {% endfor %} {action_respond_info(" DELETED ")} {% else %} {action_respond_info(" NOT DELETED - for delete send: DELETE_SAVE_VARIABLE YES= ")} {% endif %} [gcode_macro _INIT_DUAL_CARRIAGE] gcode = {% if 'dual_carriage' in printer['motion_report'].steppers %} {% set name = "dual_carriage" %} {% set init = { } %} {% set _dummy = init.update( {'auto_exchange':True, 'movespeed': 500, 'feedrate': 30000 }) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% endif %} [gcode_macro ACTIVATE_CARRIAGE] description = Activate the tool by index EXTRUDER gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set act_speed = printer.gcode_move.speed %} {% set target_tool = params.EXTRUDER|default('extruder')|string %} {% set default_carriage = 0 if target_tool in user_vars.toolhead[0] else 1 %} {% set act_carriage = 0 if printer.toolhead.extruder in user_vars.toolhead[0] else 1 %} {% if act_tool != target_tool %} {% if act_carriage|int != default_carriage|int %} {% if user_vars.dual_carriage.sync_exchange %} SYNC_CHANGE_CARRIAGE EXTRUDER={target_tool} {% elif user_vars.dual_carriage.auto_exchange %} PARK_CARRIAGE {% endif %} {% endif %} ACTIVATE_TOOL EXTRUDER={target_tool} SET_DUAL_CARRIAGE CARRIAGE={default_carriage} {% if act_carriage|int != default_carriage|int %} {% if user_vars.dual_carriage.sync_exchange %} {% elif user_vars.dual_carriage.auto_exchange %} CHANGE_CARRIAGE {% endif %} {% endif %} TOOLHEAD_PRINT_FAN G1 F{act_speed} {% else %} {action_respond_info("The '%s' is alredy activated." % (target_tool))} {% endif %} [gcode_macro PARK_CARRIAGE] description = Park the active toolhead. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set act_carriage = 0 if printer.toolhead.extruder in user_vars.toolhead[0] else 1 %} SET_GCODE_OFFSET X=0 Y=0 Z=0 {% set x_pos = printer.gcode_move.gcode_position.x %} {% set y_pos = printer.gcode_move.gcode_position.y %} {% set z_pos = printer.gcode_move.gcode_position.z %} {% set gcode_position = user_vars.dual_carriage %} {% set _dummy = gcode_position.update( {'gcode_position':{ 'x': x_pos|float, 'y': y_pos|float , 'z': z_pos|float }} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=dual_carriage VALUE="{gcode_position}" {% set axis = printer.configfile.settings.dual_carriage.axis %} {% set stepper = ('stepper_'+axis,'dual_carriage')[act_carriage|int] %} G1 {axis + (printer.configfile.config[(stepper)].position_endstop)} F{user_vars.dual_carriage.feedrate} [gcode_macro CHANGE_CARRIAGE] description = Change the new carriage. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set target_tool = printer.toolhead.extruder %} {% set tool_nr = target_tool.lstrip("extruder") if target_tool.lstrip("extruder")|length != 0 else 0 %} {% set offset = user_vars.hotend_offset[tool_nr|int] %} SET_GCODE_OFFSET X={offset.x} Y={offset.y} Z={offset.z + user_vars.active.z.print_offset} {% set gcode_position = user_vars.dual_carriage.gcode_position %} {% set x_pos = gcode_position.x %} {% set y_pos = gcode_position.y %} {% set z_pos = gcode_position.z %} G1 X{x_pos|string} Y{y_pos|string} Z{z_pos|string} F{user_vars.dual_carriage.feedrate} {% set gcode_position = user_vars.dual_carriage %} {% set _dummy = gcode_position.pop( 'gcode_position' ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=dual_carriage VALUE="{gcode_position}" [gcode_macro ACTUAL_CARRIAGE_OFFSET] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set axis = 0 if printer.configfile.settings.dual_carriage.axis == 'x' else 1 %} {% set init_pos_car0 = printer['dual_carriage'].init_mode_positions[0][axis|int] %} {% set init_pos_car1 = printer['dual_carriage'].init_mode_positions[1][axis|int] %} {% set act_carriage_offset = init_pos_car1 - init_pos_car0 %} {% set _dummy =user_vars.idex_mode.update( {'carriage_offset' : act_carriage_offset } ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=idex_mode VALUE="{user_vars.idex_mode}" [gcode_macro SET_CARRIAGE_OFFSET] gcode = {% set axis = printer.configfile.settings.dual_carriage.axis %} SET_GCODE_OFFSET {axis}={printer["gcode_macro VARIABLE"].idex_mode.carriage_offset} [gcode_macro DISABLE_CARRIAGE_0] description = Disable carriage 0 in mode "DUPLICATION" or "MIRRORED". gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if user_vars.tool_change.enable %} {% set axis = printer.configfile.settings.dual_carriage.axis %} {% set fan_carriage = printer["gcode_macro VARIABLE"].fan.index %} {% if user_vars.idex_mode.active in [2,3] %} {% if user_vars.idex_mode.active == 2 %} SAVE_GCODE_STATE name=park_carriage SET_DUAL_CARRIAGE CARRIAGE=0 ACTUAL_CARRIAGE_OFFSET SYNC_EXTRUDER_MOTION EXTRUDER={user_vars.toolhead[0][0]} MOTION_QUEUE= G1 {axis + (printer.configfile.config[('stepper_'+axis)].position_endstop)} F{user_vars.dual_carriage.feedrate} SET_DUAL_CARRIAGE CARRIAGE=1 RESTORE_GCODE_STATE name=park_carriage SET_CARRIAGE_OFFSET {% elif user_vars.idex_mode.active == 3 %} SYNC_EXTRUDER_MOTION EXTRUDER={user_vars.toolhead[0][0]} MOTION_QUEUE= {% endif %} SET_FAN_SPEED FAN={fan_carriage[0]} SPEED=0 {% for tool in user_vars.toolhead.0 %} {% set heater = tool.lstrip("extruder") if tool.lstrip("extruder")|length != 0 else 0 %} M104 S0 T{heater|int} {% endfor %} _A_INIT_TOOL {% set _dummy = user_vars.tool_change.update( {'enable' : False } ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=tool_change VALUE="{user_vars.tool_change}" {% else %} RESPOND TYPE="error" MSG="Disable carriage only in DUPLICTION or MIRRORED Idex modes." {% endif %} {% endif %} [gcode_macro DISABLE_CARRIAGE_1] description = Disable carriage 1 in mode "DUPLICATION" or "MIRRORED". gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if user_vars.tool_change.enable %} {% set axis = printer.configfile.settings.dual_carriage.axis %} {% set fan_carriage = printer["gcode_macro VARIABLE"].fan.index %} {% if user_vars.idex_mode.active in [2,3] %} SAVE_GCODE_STATE name=park_carriage SET_DUAL_CARRIAGE CARRIAGE=0 SYNC_EXTRUDER_MOTION EXTRUDER={user_vars.toolhead[1][0]} MOTION_QUEUE= SET_DUAL_CARRIAGE CARRIAGE=1 G1 {axis + (printer.configfile.config[('dual_carriage')].position_endstop)} F{user_vars.dual_carriage.feedrate} SET_DUAL_CARRIAGE CARRIAGE=0 RESTORE_GCODE_STATE name=park_carriage SET_GCODE_OFFSET {axis}=0 SET_FAN_SPEED FAN={fan_carriage[1]} SPEED=0 {% for tool in user_vars.toolhead.1 %} {% set heater = tool.lstrip("extruder") if tool.lstrip("extruder")|length != 0 else 0 %} M104 S0 T{heater|int} {% endfor %} _A_INIT_TOOL {% set _dummy = user_vars.tool_change.update( {'enable' : False } ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=tool_change VALUE="{user_vars.tool_change}" {% else %} RESPOND TYPE="error" MSG="Disable carriage only in DUPLICTION or MIRRORED Idex modes." {% endif %} {% endif %} [gcode_macro _INIT_IDEX_MODE] gcode = {% if 'dual_carriage' in printer['motion_report'].steppers %} {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "idex_mode" %} {% set init = { } %} {% set axis = printer.configfile.settings.dual_carriage.axis %} {% if printer.configfile.config['dual_carriage'].safe_distance is defined %} {% set dupl_min = (printer.configfile.config['dual_carriage'].safe_distance)|int %} {% else %} {% set dupl_min = ( printer.configfile.config[('stepper_'+axis)].position_min|int) |abs %} {% endif %} {% set dupl_max = ( printer.configfile.config[('stepper_'+axis)].position_max|int / 2) |int %} {% set mirrored = printer.configfile.config[('stepper_'+axis)].position_max|int %} {% set _dummy = init.update( {'active': 1, 'carriage_offset': 0 , 'movespeed': 500, 'feedrate': 30000 } ) %} {% if init.position is not defined %} {% set _dummy = init.update( { 'position': { } } ) %} {% endif %} {% set _dummy = init.position.update( {'dupl_min': dupl_min, 'dupl_max': dupl_max , 'mirrored': mirrored } ) %} {% if 'bed_mesh' in printer %} {% if init.bed_mesh is not defined %} {% set _dummy = init.update( { 'act_bed_mesh': { } } ) %} {% endif %} {% set _dummy = init.update( { 'act_bed_mesh': printer['bed_mesh'].profile_name } ) %} {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% endif %} [gcode_macro M605] description = Set dual carriage movement mode: M605 S1 [0,2,3,4] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if 'dual_carriage' not in printer['motion_report'].steppers %} RESPOND TYPE="error" MSG="Idex modes are not available for the kinematic or [dual_carriage] section is missing." {% elif "xyz" not in printer.toolhead.homed_axes %} RESPOND TYPE="error" MSG="For M605 mode must be home axis first !!" {% else %} {% set mode = params.S|default(1)|int %} {% set offset_dual = params.X|default(user_vars.idex_mode.position.dupl_max)|int %} {% set offset_temp = params.R|default(0)|float %} {% set act_speed = printer.gcode_move.speed %} {% if offset_dual < user_vars.idex_mode.position.dupl_min or offset_dual > user_vars.idex_mode.position.dupl_max %} {action_respond_info("The distance between dual carriages must be %s - %s " % ( user_vars.idex_mode.position.dupl_min, user_vars.idex_mode.position.dupl_max))} {% set offset_dual = user_vars.idex_mode.position.dupl_max %} {action_respond_info("Will now be set to : %s " % ( user_vars.idex_mode.position.dupl_max))} {% endif %} {% if 'gcode_macro SET_TEMP_OFFSET' in printer %} {% set tool_0 = user_vars.toolhead[0][0] %} {% set tool_1 = user_vars.toolhead[1][0] %} {% set _dummy = user_vars.offset_temp.update({tool_0: 0.0}) %} {% set _dummy = user_vars.offset_temp.update({tool_1: offset_temp}) %} {% if user_vars.tool|length == 4 %} {% set tool_2 = user_vars.toolhead[0][1] %} {% set tool_3 = user_vars.toolhead[1][1] %} {% set _dummy = user_vars.offset_temp.update({tool_2: offset_temp}) %} {% set _dummy = user_vars.offset_temp.update({tool_3: offset_temp}) %} {% endif %} {% else %} {action_respond_info("The macro SET_TEMP_OFFSET is not defined." )} {% endif %} {% if (mode) == 0 %} {% set _dummy =user_vars.idex_mode.update( {'active' : 0, 'carriage_offset' : 0} ) %} {% set _dummy =user_vars.dual_carriage.update( {'auto_exchange':False} ) %} RESPOND MSG="Dual-extruder Full-control mode is active" {% set activate_mode = 'PRIMARY' %} {% elif (mode) == 1 %} {% set _dummy =user_vars.idex_mode.update( {'active' : 1, 'carriage_offset' : 0} ) %} {% set _dummy =user_vars.dual_carriage.update( {'auto_exchange':True} ) %} RESPOND MSG="Dual-extruder Auto-park mode is active" {% set activate_mode = 'PRIMARY' %} {% elif (mode) == 2 %} {% set _dummy =user_vars.idex_mode.update( {'active' : 2, 'carriage_offset' : offset_dual} ) %} {% set _dummy =user_vars.dual_carriage.update( {'auto_exchange':True} ) %} RESPOND MSG="Duplication mode is active" {% set activate_mode = 'COPY' %} {% elif (mode) == 3 %} {% set _dummy =user_vars.idex_mode.update( {'active' : 3, 'carriage_offset' : user_vars.idex_mode.position.mirrored } ) %} {% set _dummy =user_vars.dual_carriage.update( {'auto_exchange':True} ) %} RESPOND MSG="Mirrored mode is active" {% set activate_mode = 'MIRROR' %} {% else %} {% set _dummy =user_vars.idex_mode.update( {'active' : 1, 'carriage_offset' : 0} ) %} {% set _dummy =user_vars.dual_carriage.update( {'auto_exchange':True} ) %} RESPOND MSG="mod M605 S"{mode}" does not exist, I set the default mod M605 S1" {% set activate_mode = 'PRIMARY' %} {% endif %} {% if 'bed_mesh' in printer and printer['bed_mesh'].profile_name !='' and (mode) in [2,3] %} {action_respond_info("Save BED_MESH profile = %s " % printer['bed_mesh'].profile_name)} {% set _dummy = user_vars.idex_mode.update( { 'act_bed_mesh': printer['bed_mesh'].profile_name } ) %} {% endif %} {% set _dummy = user_vars.tool_change.update( {'enable' : True } ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=tool_change VALUE="{user_vars.tool_change}" SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=idex_mode VALUE="{user_vars.idex_mode}" SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=dual_carriage VALUE="{user_vars.dual_carriage}" SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=offset_temp VALUE="{user_vars.offset_temp}" DEFAULT_EXTRUDER_SETTINGS ACTIVATE_IDEX MODE={activate_mode} G1 F{act_speed} {% endif %} [gcode_macro DEFAULT_EXTRUDER_SETTINGS] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} _A_INIT_TOOL {% for tool in printer.motion_report.steppers|sort %} {% if 'extruder' in tool %} SYNC_EXTRUDER_MOTION EXTRUDER={tool} MOTION_QUEUE= SYNC_EXTRUDER_MOTION EXTRUDER={tool} MOTION_QUEUE={tool} {% endif %} {% endfor %} {% if 'gcode_macro SWITCHING_EXTRUDER' in printer or 'gcode_macro SWITCHING_HOTEND' in printer %} ACTIVATE_TOOL EXTRUDER={user_vars.toolhead[1][0]} ACTIVATE_TOOL EXTRUDER={user_vars.toolhead[0][0]} {% endif %} [gcode_macro ACTIVATE_IDEX] description = Set the dual-carriages mode. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set axis = printer.configfile.settings.dual_carriage.axis %} {% set mode = params.MODE|default('FULL_CONTROL') %} {% set _dummy = user_vars.tool_change.update( {'enable' : True } ) %} {% set systems = 'TOOL' if 'gcode_macro SWITCHING_EXTRUDER' in printer or 'gcode_macro SWITCHING_HOTEND' in printer else 'EXTRUDER' %} SET_DUAL_CARRIAGE CARRIAGE=0 Z_HOP_TOOL G28 {axis} SET_GCODE_OFFSET X=0 Y=0 Z=0 {% if mode == 'PRIMARY' %} {% if 'bed_mesh' in printer and user_vars.idex_mode.act_bed_mesh !='' %} {action_respond_info("Restore BED_MESH profile = %s " % user_vars.idex_mode.act_bed_mesh)} BED_MESH_PROFILE LOAD={user_vars.idex_mode.act_bed_mesh} {% endif %} {% if user_vars.dual_carriage.auto_exchange %} SET_DUAL_CARRIAGE CARRIAGE=0 SET_GCODE_OFFSET X=0 Y=0 Z=0 MOVE=1 MOVE_SPEED={user_vars.idex_mode.movespeed} G1 {axis + (user_vars.idex_mode.position.dupl_max)|string} F{user_vars.idex_mode.feedrate} ACTIVATE_{systems} EXTRUDER={user_vars.toolhead[0][0]} {% endif %} {% else %} {% if 'bed_mesh' in printer %} {action_respond_info("Disable BED_MESH profile = %s " % user_vars.idex_mode.act_bed_mesh)} BED_MESH_CLEAR {% endif %} {% if 'gcode_macro MULTI_HOTEND' in printer and printer['virtual_sdcard'].is_active %} {% for carriage in user_vars.toolhead %} {% if user_vars.toolhead[carriage].0 !=user_vars.multi_hotend[carriage] %} SET_DUAL_CARRIAGE CARRIAGE={carriage} MULTI_HOTEND_ACTION EXTRUDER={user_vars.toolhead[carriage].0} {% endif %} {% endfor %} {% endif %} SET_DUAL_CARRIAGE CARRIAGE=1 G1 {axis + (user_vars.idex_mode.carriage_offset)|string} F{user_vars.idex_mode.feedrate} ACTIVATE_{systems} EXTRUDER={user_vars.toolhead[1][0]} SET_GCODE_OFFSET {axis}=0 SET_DUAL_CARRIAGE CARRIAGE=0 G1 {axis + 0|string} F{user_vars.idex_mode.feedrate} SET_DUAL_CARRIAGE CARRIAGE=1 MODE={mode} {% if printer['gcode_macro SET_SYNC_HEATERS_MODE'] is defined %} SET_SYNC_HEATERS_MODE WAIT=0 {% endif %} ACTIVATE_{systems} EXTRUDER={user_vars.toolhead[0][0]} SYNC_EXTRUDER_MOTION EXTRUDER={user_vars.toolhead[1][0]} MOTION_QUEUE={user_vars.toolhead[0][0]} {% if 'gcode_macro SYNC_SWITCHING_TOOL' not in printer %} {% set _dummy = user_vars.tool_change.update( {'enable' : False } ) %} {% endif %} {% endif %} TOOLHEAD_PRINT_FAN RESTORE_Z_TOOL SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=tool_change VALUE="{user_vars.tool_change}" [gcode_macro _INIT_SYNC_CHANGE_CARRIAGE] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if 'dual_carriage' in printer['motion_report'].steppers %} {% set name = "dual_carriage" %} {% set init = user_vars.dual_carriage %} {% set axis = printer.configfile.settings.dual_carriage.axis %} {% set endstop_0 = (printer.configfile.config[('stepper_'+axis)].position_endstop )|int %} {% set endstop_1 = (printer.configfile.config['dual_carriage'].position_endstop)|int %} {% set _dummy = init.update( {'sync_exchange': True, 'parking': [ endstop_0, endstop_1 ] } ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% endif %} [gcode_macro SYNC_CHANGE_CARRIAGE] description = params EXTRUDER - define new tool (extruder) gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if user_vars.dual_carriage.auto_exchange %} {% set act_carriage = 0 if printer.toolhead.extruder in user_vars.toolhead[0] else 1 %} {% set axis = printer.configfile.settings.dual_carriage.axis %} {% set act_speed = printer.gcode_move.speed %} {% set tool = params.EXTRUDER|default('extruder') %} {% set tool_nr = tool.lstrip("extruder") if tool.lstrip("extruder")|length != 0 else 0 %} {% set offset = user_vars.hotend_offset[tool_nr|int][axis|string] %} {% set axis_pos = printer.gcode_move.gcode_position[axis] %} {% set tool_pos = printer.gcode_move.position[axis] %} {% set gap_0 = ((user_vars.dual_carriage.parking[0])|abs + tool_pos)|float %} {% set gap_1 = (user_vars.dual_carriage.parking[1] - tool_pos)|float %} SET_DUAL_CARRIAGE CARRIAGE=1 MODE=COPY {% if act_carriage == 0 %} {% if gap_0 <= gap_1 %} SET_GCODE_OFFSET {axis}=0 G1{axis + (user_vars.dual_carriage.parking[0])|string} F{user_vars.dual_carriage.feedrate} SET_DUAL_CARRIAGE CARRIAGE=1 SET_GCODE_OFFSET {axis}={offset} G1 {axis + ((axis_pos)|string) } F{user_vars.dual_carriage.feedrate} {% else %} G91 G1 {axis +'-'+((gap_1)|string)} F{user_vars.dual_carriage.feedrate} G90 SET_DUAL_CARRIAGE CARRIAGE=0 SET_GCODE_OFFSET {axis}=0 G1{axis + (user_vars.dual_carriage.parking[0])|string} F{user_vars.dual_carriage.feedrate} SET_DUAL_CARRIAGE CARRIAGE=1 SET_GCODE_OFFSET {axis}={offset} G1 {axis + ((axis_pos)|string) } F{user_vars.dual_carriage.feedrate} {% endif %} {% elif act_carriage ==1 %} {% if gap_0 <= gap_1 %} SET_GCODE_OFFSET {axis}={offset} G1 {axis + ((axis_pos)|string)} F{user_vars.dual_carriage.feedrate} SET_DUAL_CARRIAGE CARRIAGE=1 SET_GCODE_OFFSET {axis}=0 G1{axis + (user_vars.dual_carriage.parking[1])|string} F{user_vars.dual_carriage.feedrate} SET_DUAL_CARRIAGE CARRIAGE=0 SET_GCODE_OFFSET {axis}={offset} {% else %} G91 G1 {axis + ((gap_1)|string)} F{user_vars.dual_carriage.feedrate} G90 SET_DUAL_CARRIAGE CARRIAGE=0 SET_GCODE_OFFSET {axis}={offset} G1 {axis + ((axis_pos)|string)} F{user_vars.dual_carriage.feedrate} {% endif %} {% endif %} G1 F{act_speed} {% endif %} [gcode_macro _GET_SYNC_CHANGE_CARRIAGE] description = gcode = {% set axis = printer.configfile.settings.dual_carriage.axis %} {action_respond_info("G-code %s=%s" % (axiy, printer.gcode_move.gcode_position[axis] ) )} {action_respond_info("position %s=%s" % (axiy, printer.gcode_move.position[axis] ) )} {action_respond_info("offset %s=%s" % (axiy, printer.gcode_move.homing_origin[axis]) )} [gcode_macro TEST_IDEX] variable_bed_size = {'x_min': 10, 'x_max': 230, 'y_min':10, 'y_max': 230} gcode = {% set axis = printer.configfile.settings.dual_carriage.axis %} {% set dual_bed_min = bed_size[axis+'_min'] %} {% set dual_bed_max = bed_size[axis+'_max'] %} {% set dual_bed_mid = (dual_bed_max|int - dual_bed_min|int) /2 %} RESPOND MSG=" max pos.: "{dual_bed_max} RESPOND MSG=" mid pos.: "{dual_bed_mid} RESPOND MSG=" min pos.: "{dual_bed_min} RESPOND MSG=" Dual carriage axis: "{axis} G28 M83 T0 M106 G1 Z2 F4000 G1 {axis + dual_bed_max|string} G1 {axis + dual_bed_min|string} G1 {axis + dual_bed_mid|string} T1 G1 Z2 F4000 G1 {axis + dual_bed_max|string} G1 {axis + dual_bed_min|string} G1 {axis + dual_bed_mid|string} M605 s2 M106 G1 Z2 F2000 G1 {axis + dual_bed_mid|string} G1 {axis + dual_bed_min|string} M107 M605 s3 M106 G1 Z2 F2000 G1 {axis + '90'} G1 {axis + dual_bed_min|string} M107 M605 M106 G1 Z2 F4000 G1 {axis + dual_bed_min|string} G1 {axis + dual_bed_mid|string} T2 G1 Z2 F4000 G1 {axis + dual_bed_min|string} G1 {axis + dual_bed_mid|string} T0 G1 Z10 F500 G1 Z5 F2000 M107 ======================= Extruder max_extrude_ratio=1.663007 Extruder max_extrude_ratio=1.663007 mcu 'mcu': Starting CAN connect Created a socket webhooks client 1956582808: New connection webhooks client 1956582808: Client info {'program': 'Moonraker', 'version': 'v0.8.0-325-g99b97af'} Loaded MCU 'mcu' 114 commands (v0.12.0-155-g4cfa266e / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.35.2-2+14+b2) 2.35.2) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c1_PA9_PA10=PA9,PA10 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 BUS_PINS_i2c2_PB13_PB14=PB13,PB14 BUS_PINS_i2c3_PB3_PB4=PB3,PB4 BUS_PINS_i2c3_PC0_PC1=PC0,PC1 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 BUS_PINS_spi3=PB4,PB5,PB3 CANBUS_FREQUENCY=1000000 CLOCK_FREQ=64000000 INITIAL_PINS=PF6 MCU=stm32g0b1xx PWM_MAX=255 RECEIVE_WINDOW=192 RESERVE_PINS_CAN=PA11,PA12 RESERVE_PINS_crystal=PF0,PF1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'EBB_L': Starting CAN connect Created a socket Loaded MCU 'EBB_L' 108 commands (v0.12.0-132-ge37b007f / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'EBB_L' config: ADC_MAX=4095 BUS_PINS_i2c1_PA9_PA10=PA9,PA10 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 BUS_PINS_i2c2_PB13_PB14=PB13,PB14 BUS_PINS_i2c3_PB3_PB4=PB3,PB4 BUS_PINS_i2c3_PC0_PC1=PC0,PC1 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 BUS_PINS_spi3=PB4,PB5,PB3 CANBUS_FREQUENCY=1000000 CLOCK_FREQ=64000000 MCU=stm32g0b1xx PWM_MAX=255 RECEIVE_WINDOW=192 RESERVE_PINS_CAN=PB0,PB1 RESERVE_PINS_crystal=PF0,PF1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'EBB_R': Starting CAN connect Created a socket Loaded MCU 'EBB_R' 108 commands (v0.12.0-132-ge37b007f / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'EBB_R' config: ADC_MAX=4095 BUS_PINS_i2c1_PA9_PA10=PA9,PA10 BUS_PINS_i2c1_PB6_PB7=PB6,PB7 BUS_PINS_i2c1_PB8_PB9=PB8,PB9 BUS_PINS_i2c2_PB10_PB11=PB10,PB11 BUS_PINS_i2c2_PB13_PB14=PB13,PB14 BUS_PINS_i2c3_PB3_PB4=PB3,PB4 BUS_PINS_i2c3_PC0_PC1=PC0,PC1 BUS_PINS_spi1=PA6,PA7,PA5 BUS_PINS_spi1a=PB4,PB5,PB3 BUS_PINS_spi2=PB14,PB15,PB13 BUS_PINS_spi2a=PC2,PC3,PB10 BUS_PINS_spi3=PB4,PB5,PB3 CANBUS_FREQUENCY=1000000 CLOCK_FREQ=64000000 MCU=stm32g0b1xx PWM_MAX=255 RECEIVE_WINDOW=192 RESERVE_PINS_CAN=PB0,PB1 RESERVE_PINS_crystal=PF0,PF1 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu_temperature 'mcu' nominal base=-268.850575 slope=1294.396552 mcu_temperature 'EBB_L' nominal base=-267.118156 slope=1298.126801 mcu_temperature 'EBB_R' nominal base=-271.449275 slope=1305.652174 Sending MCU 'mcu' printer configuration... Configured MCU 'mcu' (1024 moves) Sending MCU 'EBB_L' printer configuration... Configured MCU 'EBB_L' (1024 moves) Sending MCU 'EBB_R' printer configuration... Configured MCU 'EBB_R' (1024 moves) TMC dual_carriage failed to init: Unable to read tmc uart 'dual_carriage' register IFCNT Starting heater checks for heater_bed Failed to verify BLTouch probe is raised; retrying. Failed to verify BLTouch probe is raised; retrying. BLTouch raise probe error: BLTouch failed to raise probe bed_mesh: generated points Index | Tool Adjusted | Probe 0 | (25.0, 9.0) | (0.0, 0.0) 1 | (48.9, 9.0) | (23.9, 0.0) 2 | (72.8, 9.0) | (47.8, 0.0) 3 | (96.6, 9.0) | (71.6, 0.0) 4 | (120.5, 9.0) | (95.5, 0.0) 5 | (144.4, 9.0) | (119.4, 0.0) 6 | (168.3, 9.0) | (143.3, 0.0) 7 | (192.2, 9.0) | (167.2, 0.0) 8 | (216.0, 9.0) | (191.0, 0.0) 9 | (239.9, 9.0) | (214.9, 0.0) 10 | (239.9, 37.3) | (214.9, 28.3) 11 | (216.0, 37.3) | (191.0, 28.3) 12 | (192.2, 37.3) | (167.2, 28.3) 13 | (168.3, 37.3) | (143.3, 28.3) 14 | (144.4, 37.3) | (119.4, 28.3) 15 | (120.5, 37.3) | (95.5, 28.3) 16 | (96.6, 37.3) | (71.6, 28.3) 17 | (72.8, 37.3) | (47.8, 28.3) 18 | (48.9, 37.3) | (23.9, 28.3) 19 | (25.0, 37.3) | (0.0, 28.3) 20 | (25.0, 65.7) | (0.0, 56.7) 21 | (48.9, 65.7) | (23.9, 56.7) 22 | (72.8, 65.7) | (47.8, 56.7) 23 | (96.6, 65.7) | (71.6, 56.7) 24 | (120.5, 65.7) | (95.5, 56.7) 25 | (144.4, 65.7) | (119.4, 56.7) 26 | (168.3, 65.7) | (143.3, 56.7) 27 | (192.2, 65.7) | (167.2, 56.7) 28 | (216.0, 65.7) | (191.0, 56.7) 29 | (239.9, 65.7) | (214.9, 56.7) 30 | (239.9, 94.0) | (214.9, 85.0) 31 | (216.0, 94.0) | (191.0, 85.0) 32 | (192.2, 94.0) | (167.2, 85.0) 33 | (168.3, 94.0) | (143.3, 85.0) 34 | (144.4, 94.0) | (119.4, 85.0) 35 | (120.5, 94.0) | (95.5, 85.0) 36 | (96.6, 94.0) | (71.6, 85.0) 37 | (72.8, 94.0) | (47.8, 85.0) 38 | (48.9, 94.0) | (23.9, 85.0) 39 | (25.0, 94.0) | (0.0, 85.0) 40 | (25.0, 122.3) | (0.0, 113.3) 41 | (48.9, 122.3) | (23.9, 113.3) 42 | (72.8, 122.3) | (47.8, 113.3) 43 | (96.6, 122.3) | (71.6, 113.3) 44 | (120.5, 122.3) | (95.5, 113.3) 45 | (144.4, 122.3) | (119.4, 113.3) 46 | (168.3, 122.3) | (143.3, 113.3) 47 | (192.2, 122.3) | (167.2, 113.3) 48 | (216.0, 122.3) | (191.0, 113.3) 49 | (239.9, 122.3) | (214.9, 113.3) 50 | (239.9, 150.6) | (214.9, 141.6) 51 | (216.0, 150.6) | (191.0, 141.6) 52 | (192.2, 150.6) | (167.2, 141.6) 53 | (168.3, 150.6) | (143.3, 141.6) 54 | (144.4, 150.6) | (119.4, 141.6) 55 | (120.5, 150.6) | (95.5, 141.6) 56 | (96.6, 150.6) | (71.6, 141.6) 57 | (72.8, 150.6) | (47.8, 141.6) 58 | (48.9, 150.6) | (23.9, 141.6) 59 | (25.0, 150.6) | (0.0, 141.6) 60 | (25.0, 179.0) | (0.0, 170.0) 61 | (48.9, 179.0) | (23.9, 170.0) 62 | (72.8, 179.0) | (47.8, 170.0) 63 | (96.6, 179.0) | (71.6, 170.0) 64 | (120.5, 179.0) | (95.5, 170.0) 65 | (144.4, 179.0) | (119.4, 170.0) 66 | (168.3, 179.0) | (143.3, 170.0) 67 | (192.2, 179.0) | (167.2, 170.0) 68 | (216.0, 179.0) | (191.0, 170.0) 69 | (239.9, 179.0) | (214.9, 170.0) 70 | (239.9, 207.3) | (214.9, 198.3) 71 | (216.0, 207.3) | (191.0, 198.3) 72 | (192.2, 207.3) | (167.2, 198.3) 73 | (168.3, 207.3) | (143.3, 198.3) 74 | (144.4, 207.3) | (119.4, 198.3) 75 | (120.5, 207.3) | (95.5, 198.3) 76 | (96.6, 207.3) | (71.6, 198.3) 77 | (72.8, 207.3) | (47.8, 198.3) 78 | (48.9, 207.3) | (23.9, 198.3) 79 | (25.0, 207.3) | (0.0, 198.3) 80 | (25.0, 235.6) | (0.0, 226.6) 81 | (48.9, 235.6) | (23.9, 226.6) 82 | (72.8, 235.6) | (47.8, 226.6) 83 | (96.6, 235.6) | (71.6, 226.6) 84 | (120.5, 235.6) | (95.5, 226.6) 85 | (144.4, 235.6) | (119.4, 226.6) 86 | (168.3, 235.6) | (143.3, 226.6) 87 | (192.2, 235.6) | (167.2, 226.6) 88 | (216.0, 235.6) | (191.0, 226.6) 89 | (239.9, 235.6) | (214.9, 226.6) 90 | (239.9, 264.0) | (214.9, 255.0) 91 | (216.0, 264.0) | (191.0, 255.0) 92 | (192.2, 264.0) | (167.2, 255.0) 93 | (168.3, 264.0) | (143.3, 255.0) 94 | (144.4, 264.0) | (119.4, 255.0) 95 | (120.5, 264.0) | (95.5, 255.0) 96 | (96.6, 264.0) | (71.6, 255.0) 97 | (72.8, 264.0) | (47.8, 255.0) 98 | (48.9, 264.0) | (23.9, 255.0) 99 | (25.0, 264.0) | (0.0, 255.0) Unable to obtain tmc dual_carriage phase Starting heater checks for extruder Starting heater checks for extruder1 webhooks: registering remote method 'shutdown_machine' for connection id: 1956582808 webhooks: registering remote method 'reboot_machine' for connection id: 1956582808 webhooks: registering remote method 'pause_job_queue' for connection id: 1956582808 webhooks: registering remote method 'start_job_queue' for connection id: 1956582808 printer['gcode_macro VARIABLE'].aaa = {'printer': 'BOLT-Pro'} printer['gcode_macro VARIABLE'].active = {} printer['gcode_macro VARIABLE'].bed_temp = {} printer['gcode_macro VARIABLE'].beeper = {} printer['gcode_macro VARIABLE'].dual_carriage = {} printer['gcode_macro VARIABLE'].fan = {} printer['gcode_macro VARIABLE'].filament_sensor = {} printer['gcode_macro VARIABLE'].hotend_offset = {} printer['gcode_macro VARIABLE'].idex_mode = {} printer['gcode_macro VARIABLE'].offset_temp = {} printer['gcode_macro VARIABLE'].power_supply = {} printer['gcode_macro VARIABLE'].restore_variable = ['hotend_offset'] printer['gcode_macro VARIABLE'].retract_z_hop = {} printer['gcode_macro VARIABLE'].tmp = 0 printer['gcode_macro VARIABLE'].tool = {} printer['gcode_macro VARIABLE'].tool_change = {} printer['gcode_macro VARIABLE'].toolhead = {} Creating a list of active variable Creating a list of variables for 2 extruder Creating a list of variables for user configuration extruder / carriages. Creating a list of variables for macro M218 Creating a list of variables for tool change param Creating a list of variables for macro M140/M190 Creating a list of variables for FANs Creating a list of variables for filament sensor. Creating a list of variables for macro M104 Creating a list of variables for z-hop From SD card restored this variables : ['hotend_offset'] _A_INIT_ACTIVE _A_INIT_TOOL _B_INIT_TOOLHEAD _C_INIT_HOTEND_OFFSET _D_INIT_TOOL_CHANGE_PARAM _INIT_BEEPER _INIT_DELTA_BED_TEMP _INIT_DUAL_CARRIAGE _INIT_FAN_GENERIC _INIT_FILAMENT_SENSOR _INIT_IDEX_MODE _INIT_OFFSET_TEMP _INIT_POWER_SUPPLY _INIT_RETRACT_Z_HOP _INIT_SYNC_CHANGE_CARRIAGE _Z_INIT_RESTORE_USER_VARIABLE printer['gcode_macro VARIABLE'].aaa = {'printer': 'BOLT-Pro'} printer['gcode_macro VARIABLE'].active = {'mode': 0, 'z': {'hop': 4.0, 'restore': 4.0, 'print_offset': 0.0, 'hop_enable': True}} printer['gcode_macro VARIABLE'].bed_temp = {'sensor': 'heater_bed', 'delta_temp': 10.0, 'offset_target': 0.5} printer['gcode_macro VARIABLE'].beeper = {'enable': True, 'silent': False, 'output_pin': 'beeper'} printer['gcode_macro VARIABLE'].dual_carriage = {'auto_exchange': True, 'movespeed': 500, 'feedrate': 30000, 'sync_exchange': True, 'parking': [0, 298]} printer['gcode_macro VARIABLE'].fan = {'menu': True, 'index': ['fan', 'fan1'], 'active': 0} printer['gcode_macro VARIABLE'].filament_sensor = {'defined': True, 'motion': ['extruder', 'extruder1'], 'active': 0, 'index': ['extruder', 'extruder1'], 'count': 2} printer['gcode_macro VARIABLE'].hotend_offset = {0: {'x': 0.0, 'y': 0.0, 'z': 0.0}, 1: {'x': 0.0, 'y': 0.0, 'z': 0.0}, 'change_T0': False} printer['gcode_macro VARIABLE'].idex_mode = {'active': 1, 'carriage_offset': 0, 'movespeed': 500, 'feedrate': 30000, 'position': {'dupl_min': 60, 'dupl_max': 100, 'mirrored': 200}, 'act_bed_mesh': ''} printer['gcode_macro VARIABLE'].offset_temp = {'extruder': 0, 'extruder1': 0} printer['gcode_macro VARIABLE'].power_supply = {'auto_off': False, 'wait_off': False, 'running': False, 'time': 0, 'power_loss': False} printer['gcode_macro VARIABLE'].restore_variable = ['hotend_offset'] printer['gcode_macro VARIABLE'].retract_z_hop = {'enable': False, 'step': '0.400', 'speed': '15'} printer['gcode_macro VARIABLE'].tmp = 0 printer['gcode_macro VARIABLE'].tool = {0: 'extruder', 1: 'extruder1'} printer['gcode_macro VARIABLE'].tool_change = {'enable': True, 'delay': {'extruder': 250, 'extruder1': 250}, 'filament': {'load': 0.5, 'unload': 1.0, 'speed': 45}, 'axis_z': {'hop': 3.0, 'restore': 3.0}} printer['gcode_macro VARIABLE'].toolhead = {0: ['extruder'], 1: ['extruder1']} webhooks client 1956582808: Disconnected Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.12.0-158-g36f9b26e' Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ARMv7 Processor rev 4 (v7l) Python: '3.9.2 (default, Mar 12 2021, 04:06:34) \n[GCC 10.2.1 20210110]' Start printer at Sun Apr 14 15:30:37 2024 (1713101437.3 23.3) ===== Config file ===== [virtual_sdcard] path = /home/pi/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_VARIABLE] gcode = variable_use_custom_pos = True variable_custom_park_x = 150 variable_custom_park_y = 20 variable_custom_park_dz = 15.0 variable_speed_move = 100.0 [exclude_object] [gcode_arcs] resolution = 0.1 [firmware_retraction] retract_length = 0.6 retract_speed = 30 unretract_extra_length = 0 unretract_speed = 30 [save_variables] filename = /home/pi/printer_data/config/my_config/save_variables.cfg [mcu] canbus_uuid = 377045208276 [temperature_sensor SKRat] sensor_mcu = mcu sensor_type = temperature_mcu min_temp = 10 max_temp = 100 [printer] kinematics = cartesian max_velocity = 600 max_accel = 3000 max_z_velocity = 15 max_z_accel = 20 [stepper_x] step_pin = PF9 dir_pin = !PD7 enable_pin = !PD6 microsteps = 16 rotation_distance = 48 endstop_pin = ^PB5 position_endstop = 0 position_min = 0 position_max = 200 homing_speed = 50 [stepper_y] step_pin = PD3 dir_pin = !PD2 enable_pin = !PD5 microsteps = 16 rotation_distance = 60 endstop_pin = ^PC1 position_endstop = 200 position_min = 0 position_max = 200 homing_speed = 50 [dual_carriage] axis = x safe_distance = 60 step_pin = PA15 dir_pin = PF8 enable_pin = !PC9 microsteps = 16 rotation_distance = 48 endstop_pin = ^PC0 position_endstop = 298 position_min = 0 position_max = 298 homing_speed = 50 [stepper_z] step_pin = PC7 dir_pin = !PC6 enable_pin = !PD9 rotation_distance = 5.0 gear_ratio = 30:20 microsteps = 16 endstop_pin = PE5 position_endstop = 0 position_max = 160 position_min = -2 [tmc2209 stepper_x] uart_pin = PF10 run_current = 0.800 [tmc2209 stepper_y] uart_pin = PD4 run_current = 0.800 [tmc2209 dual_carriage] uart_pin = PC8 run_current = 0.800 [tmc2209 stepper_z] uart_pin = PD8 run_current = 0.800 [heater_bed] heater_pin = PB3 sensor_type = Generic 3950 sensor_pin = PB2 min_temp = 0 max_temp = 130 control = pid pid_kp = 67.148 pid_ki = 0.904 pid_kd = 1246.428 [controller_fan TMC_driver] pin = PD15 max_power = 1.0 kick_start_time = 0.5 off_below = 0.10 fan_speed = 1.0 heater = stepper = stepper_x, stepper_y [heater_fan chamber] pin = PD14 max_power = 1.0 kick_start_time = 0.5 heater = heater_bed heater_temp = 40.0 fan_speed = 1.0 [temperature_fan Raspberry] pin = PD13 max_power = 1.0 shutdown_speed = 0.0 kick_start_time = 5.0 cycle_time = 0.01 off_below = 0.1 sensor_type = temperature_host min_temp = 0 max_temp = 100 target_temp = 40.0 control = pid pid_kp = 1.0 pid_ki = 0.5 pid_kd = 2.0 [temperature_fan EBB_L] pin = PE14 max_power = 1.0 shutdown_speed = 0.0 kick_start_time = 5.0 cycle_time = 0.01 off_below = 0.1 sensor_mcu = EBB_L sensor_type = temperature_mcu min_temp = 0 max_temp = 100 target_temp = 40.0 control = pid pid_kp = 1.0 pid_ki = 0.5 pid_kd = 2.0 [temperature_fan EBB_R] pin = PE9 max_power = 1.0 shutdown_speed = 0.0 kick_start_time = 5.0 cycle_time = 0.01 off_below = 0.1 sensor_mcu = EBB_R sensor_type = temperature_mcu min_temp = 0 max_temp = 100 target_temp = 40.0 control = pid pid_kp = 1.0 pid_ki = 0.5 pid_kd = 2.0 [board_pins] aliases = EXP1_1=PC13, EXP1_3=PC3, EXP1_5=PB1, EXP1_7=PC5, EXP1_9=, EXP1_2=PF3, EXP1_4=PC2, EXP1_6=PB0, EXP1_8=PC4, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PE8, EXP2_7=PE10, EXP2_9=, EXP2_2=PA5, EXP2_4=PF7, EXP2_6=PA7, EXP2_8=, EXP2_10= [mcu EBB_L] canbus_uuid = 62eab7b637c4 [adxl345 extruder] cs_pin = EBB_L: PB12 spi_software_sclk_pin = EBB_L: PB10 spi_software_mosi_pin = EBB_L: PB11 spi_software_miso_pin = EBB_L: PB2 axes_map = x,y,z [resonance_tester] accel_chip = adxl345 extruder1 probe_points = 180, 140, 5 [extruder] step_pin = EBB_L: PD0 dir_pin = !EBB_L: PD1 enable_pin = !EBB_L: PD2 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 3.433 pressure_advance = 0.04 pressure_advance_smooth_time = 0.08 nozzle_diameter = 0.400 filament_diameter = 1.750 sensor_type = ATC Semitec 104NT-4-R025H42G sensor_pin = EBB_L: PA3 heater_pin = EBB_L: PB13 max_power = 0.8 min_temp = 0 max_temp = 280 min_extrude_temp = 170 max_extrude_only_distance = 200 max_extrude_cross_section = 4 control = pid pid_kp = 26.604 pid_ki = 6.320 pid_kd = 27.995 [tmc2209 extruder] uart_pin = EBB_L: PA15 run_current = 0.450 stealthchop_threshold = 999999 [heater_fan extruder] pin = EBB_L: PA1 heater = extruder heater_temp = 50.0 [fan_generic fan] pin = EBB_L: PA0 cycle_time = 0.0100 kick_start_time = 1.000 hardware_pwm = false [bltouch] sensor_pin = ^EBB_L:PB8 control_pin = EBB_L:PB9 x_offset = -25 y_offset = -9 samples = 2 samples_tolerance = 0.200 z_offset = 1.000 [safe_z_home] home_xy_position = 120,140 speed = 120 z_hop = 5 z_hop_speed = 5 [bed_mesh] speed = 240 horizontal_move_z = 6 mesh_min = 0,0 mesh_max = 215,255 algorithm = bicubic probe_count = 10 fade_start = 1.0 fade_end = 10.0 [screws_tilt_adjust] screw1 = 30, 15 screw1_name = front left screw screw2 = 245, 15 screw2_name = front right screw screw3 = 245, 280 screw3_name = rear right screw screw4 = 30, 280 screw4_name = rear left screw horizontal_move_z = 6 speed = 50 screw_thread = CCW-M6 [filament_motion_sensor extruder] switch_pin = EBB_L:PB6 detection_length = 4.00 extruder = extruder pause_on_runout = False runout_gcode = M117 Filament encoder runout TRIGGER_RUNOUT SENSOR=motion T0 insert_gcode = M117 Filament encoder inserted [mcu EBB_R] canbus_uuid = 7d0c115fe0a6 [adxl345 extruder1] cs_pin = EBB_R: PB12 spi_software_sclk_pin = EBB_R: PB10 spi_software_mosi_pin = EBB_R: PB11 spi_software_miso_pin = EBB_R: PB2 axes_map = x,y,z [extruder1] step_pin = EBB_R: PD0 dir_pin = !EBB_R: PD1 enable_pin = !EBB_R: PD2 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 3.433 pressure_advance = 0.04 pressure_advance_smooth_time = 0.08 nozzle_diameter = 0.400 filament_diameter = 1.750 sensor_type = ATC Semitec 104NT-4-R025H42G sensor_pin = EBB_R: PA3 heater_pin = EBB_R: PB13 max_power = 0.8 min_temp = 0 max_temp = 280 min_extrude_temp = 170 max_extrude_only_distance = 200 max_extrude_cross_section = 4 control = pid pid_kp = 26.604 pid_ki = 6.320 pid_kd = 27.995 [tmc2209 extruder1] uart_pin = EBB_R: PA15 run_current = 0.450 stealthchop_threshold = 999999 [heater_fan extruder1] pin = EBB_R: PA1 heater = extruder1 heater_temp = 50.0 [fan_generic fan1] pin = EBB_R: PA0 cycle_time = 0.0100 kick_start_time = 1.000 hardware_pwm = false [filament_motion_sensor extruder1] switch_pin = EBB_R:PB6 detection_length = 4.00 extruder = extruder pause_on_runout = False runout_gcode = M117 Filament encoder runout TRIGGER_RUNOUT SENSOR=motion T1 insert_gcode = M117 Filament encoder inserted [gcode_macro ACTIVATE_TOOL] description = Activate the tool by index EXTRUDER gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set target_tool = params.EXTRUDER|default("extruder")|string %} {% set act_tool = printer.toolhead.extruder %} {% if act_tool != target_tool %} ACTIVATE_EXTRUDER EXTRUDER={target_tool} {% if 'gcode_macro SWITCHING_EXTRUDER' in printer and user_vars.switching_extruder.enable %} SWITCHING_EXTRUDER E={target_tool} {% endif %} {% if 'gcode_macro SWITCHING_HOTEND' in printer and user_vars.switching_hotend.enable %} SWITCHING_HOTEND E={target_tool} {% endif %} {% else %} {action_respond_info("The '%s' is alredy activated." % (target_tool))} {% endif %} [delayed_gcode _INIT] initial_duration = 1 gcode = {% if 'bed_mesh' in printer and 'default' in printer['bed_mesh'].profiles %} BED_MESH_PROFILE LOAD=default {% endif %} {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if printer.save_variables.variables.dump_list %} GET_USER_VARIABLE RESPOND MSG="list actual user variable" {% endif %} RUN_MACRO_INIT {% if printer.save_variables.variables.dump_list %} GET_MACRO_INIT RESPOND MSG="list run of INIT macro" {% endif %} {% if printer.save_variables.variables.dump_list %} GET_USER_VARIABLE RESPOND MSG="list actual user variable" {% endif %} {% if printer['menu'] %} UPDATE_DELAYED_GCODE ID=main_display_group DURATION=3 {% endif %} [delayed_gcode clear_display] gcode = M117 M83 [gcode_macro RUN_MACRO_INIT] gcode = {% for object in printer|sort %} {% if object != 'configfile' and '_INIT_' is in object %} {object.lstrip('gcode_macro')} {% endif %} {% endfor %} [gcode_macro GET_MACRO_INIT] gcode = {% set out = [] %} {% for object in printer|sort %} {% if object != 'configfile' and '_INIT_' is in object %} {% set _dummy = out.append("%s" % (object.lstrip('gcode_macro'))) %} {% endif %} {% endfor %} {% if out|length == 0 %}{% set _dummy = out.append("Nothing found for \"DUMP_GCODE %s\"" % rawparams) %}{% endif %} {action_respond_info(out|join("\n"))} [gcode_macro DUMP_PRINTER_PARAM] description = Debug: Print entries of the printer object without gcode_macro gcode = {% set out = [] %} {% for object in printer|sort %} {% if object != 'configfile' and 'gcode_macro' is not in object %} {% for parameter, value in printer[object].items()|sort %} {% set _dummy = out.append("printer['%s'].%s = %s" % (object, parameter, value)) %} {% endfor %} {% endif %} {% endfor %} {% if out|length == 0 %}{% set _dummy = out.append("Nothing found for \"DUMP_PRINTER_PARAM %s\"" % rawparams) %}{% endif %} {action_respond_info(out|join("\n"))} [gcode_macro DUMP_MACRO_GCODE] description = Debug: Print entries of the printer object containing gcode_macro gcode = {% set out = [] %} {% for object in printer|sort %} {% if object != 'configfile' and 'gcode_macro' is in object %} {% for parameter, value in printer[object].items()|sort %} {% set _dummy = out.append("printer['%s'].%s = %s" % (object, parameter, value)) %} {% endfor %} {% endif %} {% endfor %} {% if out|length == 0 %}{% set _dummy = out.append("Nothing found for \"DUMP_GCODE %s\"" % rawparams) %}{% endif %} {action_respond_info(out|join("\n"))} [gcode_macro DUMP_PARAMETERS] description = Debug: Print all entries of the printer object gcode = {% set parameters = namespace(output = '') %} {% for name1 in printer %} {% for name2 in printer[name1] %} {% set donotwant = ['bed_mesh','configfile'] %} {% if name1 is not in donotwant %} {% set param = "printer['%s'].%s = %s" % (name1, name2, printer[name1][name2]) %} {% set parameters.output = parameters.output + param + "\n" %} {% endif %} {% else %} {% set param = "printer['%s'] = %s" % (name1, printer[name1]) %} {% set parameters.output = parameters.output + param + "\n" %} {% endfor %} {% endfor %} {action_respond_info(parameters.output)} [gcode_macro DUMP_CONFIG] description = Debug: Print all entries of the printer config object gcode = {% set show = params.S|lower %} {% set parameters = namespace(output = '') %} {% for name1 in printer.configfile.config %} {% if name1 is in show %} {% for name2 in printer.configfile.config[name1] %} {% set param = "printer.configfile.config['%s'].%s = %s" % (name1, name2, printer.configfile.config[name1][name2]) %} {% set parameters.output = parameters.output + param + "\n" %} {% endfor %} {% endif %} {% endfor %} {action_respond_info(parameters.output)} [gcode_macro DUMP_SETTINGS] description = Debug: Print all entries of the printer settings object gcode = {%if 'S' in params %} {% set show = [params.S] %} {% set parameters = namespace(output = '') %} {% for name1 in printer.configfile.settings %} {% if name1 is in show %} {% for name2 in printer.configfile.settings[name1] %} {% set param = "printer.configfile.settings['%s'].%s = %s" % (name1, name2, printer.configfile.settings[name1][name2]) %} {% set parameters.output = parameters.output + param + "\n" %} {% endfor %} {% endif %} {% endfor %} {action_respond_info(parameters.output)} {% else %} {action_respond_info("WARNING: parameter S needed call e.g. DUMP_SETTINGS S='printer'")} {% endif %} [gcode_macro SEARCH_VARS] gcode = {% set search = params.S|lower %} {% set ns = namespace() %} {% for item in printer %} {% if ' ' in item %} {% set ns.path = ['printer', "['%s']" % (item), ''] %} {% else %} {% set ns.path = ['printer.', item, ''] %} {% endif %} {% if search in ns.path|lower %} { action_respond_info(ns.path|join) } {% endif %} {% if printer[item].items() %} {% for childkey, child in printer[item].items() recursive %} {% set ns.path = ns.path[:loop.depth|int + 1] %} {% if ' ' in childkey %} {% set null = ns.path.append("['%s']" % (childkey)) %} {% else %} {% set null = ns.path.append(".%s" % (childkey)) %} {% endif %} {% if child is mapping %} { loop(child.items()) } {% else %} {% if search in ns.path|lower %} { action_respond_info("%s : %s" % (ns.path|join, child)) } {% endif %} {% endif %} {% endfor %} {% endif %} {% endfor %} [gcode_macro VARIABLE] gcode = variable_retract_z_hop = { } variable_offset_temp = { } variable_fan = { } variable_bed_temp = { } variable_beeper = { } variable_power_supply = { } variable_filament_sensor = { } variable_active = { } variable_tool = { } variable_toolhead = { } variable_hotend_offset = { } variable_tool_change = { } description = HELP: for list of variables send GET_USER_VARIABLE variable_aaa = {'printer' : 'BOLT-Pro' } variable_tmp = 0 variable_restore_variable = ['hotend_offset'] variable_dual_carriage = { } variable_idex_mode = { } [gcode_macro _INIT_RETRACT_Z_HOP] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "retract_z_hop" %} {% set init = { } %} {% set val_step = printer.configfile.config['extruder'].nozzle_diameter %} {% set val_speed = printer.configfile.config['printer'].max_z_velocity %} {% set _dummy = init.update({'enable': false, 'step':val_step, 'speed': val_speed }) %} {action_respond_info("Creating a list of variables for z-hop") if printer.save_variables.variables.dump_list} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" [gcode_macro SET_RETRACT_Z_HOP] description = SET_RETRACT_Z_HOP ENABLE=[0|1] STEP=0.4 SPEED=60 gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "retract_z_hop" %} {% set init = user_vars[name] %} {% if not params %} {action_respond_info("The ENABLE, STEP, or SPEED parameters are not defined for the SET_RETRACT_Z_HOP command")} {% else %} {% set enable_param=params.ENABLE|default(1) if params.ENABLE is defined else -1 %} {% set step_param=params.STEP|default(0.4) if params.STEP is defined else -1 %} {% set speed_param=params.SPEED|default(60) if params.SPEED is defined else -1 %} {% for key in params %} {% if key|lower =='step' %} {% set _dummy = init.update( {'change_step' : step_param|float} ) %} {% elif key|lower =='speed' %} {% set _dummy = init.update( {'speed' : speed_param|int} ) %} {% elif key|lower =='enable' %} {% if enable_param not in ['0','1'] %} {action_respond_info(" Invalid parameter ENABLE=%s " % enable_param )} {% elif init.enable|lower == 'false' and enable_param|int != 1 %} {action_respond_info("Z-hop with G10/G11 G-code is disabled.")} {% elif init.enable|lower == 'true' and enable_param|int != 0 %} {action_respond_info("Z-hop with G10/G11 G-code is already active.")} {% else %} {% set _dummy = init.update( { 'change_enable':true} ) %} {action_respond_info(" Change ENABLE after G-code G11 " )} {% endif %} {% endif %} {% endfor %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% endif %} [gcode_macro GET_RETRACT_Z_HOP] description = list of settings gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "retract_z_hop" %} {% set init = user_vars[name] %} {action_respond_info("ENABLE=%s STEP=%s SPEED=%s" % (init.enable, init.step, init.speed))} [gcode_macro G10] rename_existing = G10.1 description = Overide "G10" retract macro gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "retract_z_hop" %} {% set init = user_vars[name] %} G10.1 {% if init.enable and "xyz" in printer.toolhead.homed_axes %} {% set retract_pos = printer['gcode_move'].gcode_position.z %} {% set _dummy = init.update( { 'layer': retract_pos} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" G91 G1 Z{init.step|float} F{init.speed*60} G90 {% endif %} [gcode_macro G11] rename_existing = G11.1 description = Overide "G11" unretract macro gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "retract_z_hop" %} {% set init = user_vars[name] %} {% if init.enable and "xyz" in printer.toolhead.homed_axes %} {% set unretract_pos = printer['gcode_move'].gcode_position.z %} {% set retract_pos = init.layer|float + init.step|float %} {% if retract_pos == unretract_pos %} G91 G1 Z-{init.step|float} F{init.speed*60} G90 {% endif %} {% endif %} G11.1 {% if 'change_enable' in init %} {% set value = false if init.enable else true %} {% set info = 'enable' if value else 'disable' %} {action_respond_info(" Z-hop with G-code G10/G11 is %s " % info )} {% set _dummy = init.update( { 'enable': value} ) %} {% set _dummy = init.pop( 'change_enable' ) %} {% if not value %} {% set _dummy = init.pop( 'layer' ) %} {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% endif %} {% if 'change_step' in init %} {action_respond_info(" Change Z-hop step after G-code G11 ")} {% set _dummy = init.update( { 'step': init.change_step} ) %} {% set _dummy = init.pop( 'change_step' ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% endif %} [gcode_macro _INIT_OFFSET_TEMP] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "offset_temp" %} {% set init = { } %} {% for tool in printer.heaters.available_heaters|sort %} {% if 'extruder' in tool %} {% set _dummy = init.update({tool: 0}) %} {% endif %} {% endfor %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {action_respond_info("Creating a list of variables for macro M104 ") if printer.save_variables.variables.dump_list } [gcode_macro M104] rename_existing = M104.1 description = Overide "M104" to allow multiple extruders gcode = SET_TOOL_HEATER T={params.T|default(0)} S={params.S|default(0)} WAIT='False' [gcode_macro M109] rename_existing = M109.1 description = Overide "M109" to allow multiple extruders gcode = SET_TOOL_HEATER T={params.T|default(0)} S={ params.R|default(0)|float if params.R is defined else params.S|default(0)|float } WAIT='True' [gcode_macro SET_TOOL_HEATER] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set active_tool = printer.toolhead.extruder.lstrip("extruder") if printer.toolhead.extruder.lstrip("extruder")|length != 0 else 0 %} {% set target_tool = params.T|default(active_tool)|int %} {% if user_vars.tool |length < target_tool + 1 %} {action_respond_info("G-code T%s is not defined for extruder." % (target_tool))} {% else %} {% set default_heater = user_vars.tool[target_tool] %} {% set temp = params.S|default(0)|float %} {% set wait = params.WAIT|default('False')%} {% set target_offset = user_vars.offset_temp[default_heater] if temp != 0 else 0 %} {% if temp == 0 %} {% set _dummy = user_vars.offset_temp.update({default_heater : 0}) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=offset_temp VALUE="{user_vars.offset_temp}" {% endif %} {% if 'gcode_macro M605' in printer and user_vars.idex_mode.active in [2,3] %} SET_HEATER_TEMPERATURE HEATER="{default_heater}" TARGET={temp + target_offset} {% if printer['gcode_macro SET_SYNC_HEATERS_MODE'] is defined %} SET_SYNC_HEATERS_MODE WAIT=0 {% endif %} {% else %} SET_HEATER_TEMPERATURE HEATER="{default_heater}" TARGET={temp + target_offset} {% if wait == 'True' and temp !=0 %} TEMPERATURE_WAIT SENSOR="{default_heater}" MINIMUM={temp - 2.0} MAXIMUM={temp + 2.0} {% endif %} {% endif %} {% endif %} [gcode_macro SET_TEMP_OFFSET] description = SET_TEMP_OFFSET T=(tool) R=(offset_temp) gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set act_tool = printer.toolhead.extruder %} {% set act_tool_nr = act_tool.lstrip("extruder")|int if act_tool.lstrip("extruder")|length != 0 else 0|int %} {% set target_tool = params.T|default(act_tool_nr)|int %} {% set target_offset = params.R|default(0)|int %} {% set default_heater = user_vars.tool[target_tool] %} {% set act_temp = printer[default_heater].target |float %} {% if target_offset !=0 %} {% if act_temp !=0 and target_offset|abs <= 10 %} {% set temp = act_temp - user_vars.offset_temp[default_heater] %} SET_HEATER_TEMPERATURE HEATER="{default_heater}" TARGET={temp + user_vars.offset_temp[default_heater]} {% else %} RESPOND MSG=" Set temperature first or offset must be range -10 to 10 !" {% set target_offset = 0|int %} {% endif %} {% else %} {% set temp = act_temp - user_vars.offset_temp[default_heater] %} RESPOND MSG="Reset offset temp for "{default_heater} SET_HEATER_TEMPERATURE HEATER="{default_heater}" TARGET={temp + target_offset } {% endif %} {% set _dummy = user_vars.offset_temp.update({default_heater: target_offset}) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=offset_temp VALUE="{user_vars.offset_temp}" [gcode_macro SET_SYNC_HEATERS_MODE] description = Set both heater + offset temp. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set wait_heating = params.WAIT|default(0)|int %} {% if user_vars.tool|length > 2 %} {% set toolhead_0_extr_0 = user_vars.toolhead[0][0] %} {% set toolhead_1_extr_0 = user_vars.toolhead[1][0] %} {% set act_temp_0 = printer[toolhead_0_extr_0].target|float %} {% set both_temp_0 = act_temp_0 + user_vars.offset_temp[toolhead_1_extr_0] %} {% if user_vars.tool|length == 4 %} {% set toolhead_0_extr_1 = user_vars.toolhead[0][1] %} {% set toolhead_1_extr_1 = user_vars.toolhead[1][1] %} {% set act_temp_1 = printer[ toolhead_0_extr_1].target|float %} {% set both_temp_1 = act_temp_1 + user_vars.offset_temp[toolhead_1_extr_1] %} {% endif %} {% if act_temp_0 > 0 or act_temp_1 > 0 %} SET_HEATER_TEMPERATURE HEATER={toolhead_0_extr_0} TARGET={act_temp_0} SET_HEATER_TEMPERATURE HEATER={toolhead_1_extr_0} TARGET={both_temp_0} {% if wait_heating == 1 %} TEMPERATURE_WAIT SENSOR={toolhead_0_extr_0} MINIMUM={act_temp_0 - 2.0} MAXIMUM={act_temp_0 + 2.0} TEMPERATURE_WAIT SENSOR={toolhead_1_extr_0} MINIMUM={both_temp_0 - 2.0} MAXIMUM={both_temp_0 + 2.0} {% endif %} {% if user_vars.tool|length == 4 %} SET_HEATER_TEMPERATURE HEATER={toolhead_0_extr_1} TARGET={act_temp_1} SET_HEATER_TEMPERATURE HEATER={toolhead_1_extr_1} TARGET={both_temp_1} {% if wait_heating == 1 %} TEMPERATURE_WAIT SENSOR={toolhead_0_extr_1} MINIMUM={act_temp_1 - 2.0} MAXIMUM={act_temp_1 + 2.0} TEMPERATURE_WAIT SENSOR={toolhead_1_extr_1} MINIMUM={both_temp_1 - 2.0} MAXIMUM={both_temp_1 + 2.0} {% endif %} {% endif %} {% else %} {% set name = "offset_temp" %} {% set upd_init = user_vars.offset_temp %} SET_HEATER_TEMPERATURE HEATER={toolhead_1_extr_0} TARGET=0 {% set _dummy = upd_init.update({toolhead_0_extr_0: 0 }) %} {% set _dummy = upd_init.update({toolhead_1_extr_0: 0 }) %} {% if user_vars.tool|length == 4 %} SET_HEATER_TEMPERATURE HEATER={toolhead_1_extr_1} TARGET=0 {% set _dummy = upd_init.update({toolhead_0_extr_1: 0 }) %} {% set _dummy = upd_init.update({toolhead_1_extr_1: 0 }) %} {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{upd_init}" {% endif %} {% else %} {action_respond_info("Configuration is not valid for synchronized heaters.")} {% endif %} [gcode_macro _INIT_FAN_GENERIC] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set var_fan = { 'menu': False } %} {% set ns = namespace(menu=0|int) %} {% for object in printer.configfile.config|sort %} {% if 'fan_generic' is in object %} {% if var_fan.index is not defined %} {% set _dummy = var_fan.update( {'index': [ ]} ) %} {% endif %} {% set _dummy = var_fan.index.append(object.split(' ')[1]) %} {% set _dummy = var_fan.update({'active': 0 }) %} {% set ns.menu = 1 %} {% endif %} {% endfor %} {% if ns.menu == 1 %} {% set _dummy = var_fan.update( { 'menu': True } ) %} {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=fan VALUE="{var_fan}" {action_respond_info("Creating a list of variables for FANs ") if printer.save_variables.variables.dump_list} [gcode_macro M106] description = Override "M106" to allow multiple extruders. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set raw_speed = params.S|default(255)|float %} {% set fan_speed = (raw_speed / 255.0)|round(2) %} {% if (params.P) is defined %} {% set target_fan = params.P|int %} {% set index_fan = user_vars.fan.index|length -1 %} {% if index_fan >= target_fan %} {% set default_fan = user_vars.fan.index[target_fan] %} {action_respond_info("Set fan [P%s] ... fan_generic %s" % (target_fan,default_fan))} {% else %} {% set default_fan = user_vars.fan.index[0] %} {action_respond_info("Fan [P%s] is not defined, set default [P0] ... fan_generic %s" % (target_fan,default_fan))} {% endif %} SET_FAN_SPEED FAN={default_fan} SPEED={fan_speed} {% else %} TOOLHEAD_PRINT_FAN SPEED={fan_speed} {% endif %} [gcode_macro M107] description = Override "M107" to allow multiple extruders. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if (params.P) is defined %} M106 S0 P{params.P} {% else %} {% for fan in user_vars.fan.index|sort %} SET_FAN_SPEED FAN={fan} SPEED=0 {% endfor %} {% endif %} [gcode_macro TOOLHEAD_PRINT_FAN] description = Set automatically the print fan speed. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set fan_speed = [ ] %} {% set act_extruder = printer.toolhead.extruder %} {% if params.SPEED is defined %} {% set _dummy=fan_speed.append( params.SPEED|float) %} {% else %} {% for index in user_vars.toolhead %} {% set _dummy = fan_speed.append( printer["fan_generic " + user_vars.fan.index[index]].speed|float ) %} {% endfor %} {% endif %} {% if 'gcode_macro M605' in printer and user_vars.idex_mode.active in [2,3] %} {% for index in user_vars.toolhead %} SET_FAN_SPEED FAN={user_vars.fan.index[index]} SPEED={fan_speed|max } {% endfor %} {% else %} {% for index in user_vars.toolhead %} {% if act_extruder in user_vars.toolhead[index] %} SET_FAN_SPEED FAN={user_vars.fan.index[index]} SPEED={fan_speed|max } {% else %} SET_FAN_SPEED FAN={user_vars.fan.index[index]} SPEED=0 {% endif %} {% endfor %} {% endif %} [gcode_macro _INIT_DELTA_BED_TEMP] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "bed_temp" %} {% set init = { } %} {% set delta_temp = 10.0 %} {% set offset_target = 0.5 %} {% set _dummy = init.update({'sensor':sensor|default("heater_bed"), 'delta_temp':delta_temp, 'offset_target':offset_target }) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {action_respond_info("Creating a list of variables for macro M140/M190") if printer.save_variables.variables.dump_list } [gcode_macro M140] rename_existing = M140.1 gcode = SET_BED_HEATER TEMP={params.S|default(0)} WAIT=0 [gcode_macro M190] rename_existing = M190.1 gcode = SET_BED_HEATER TEMP={params.S|default(0)} WAIT=1 [gcode_macro SET_BED_HEATER ] description = Use an external sensor to mesure the bed temp gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set temp = params.TEMP|float %} {% set wait = params.WAIT|default(0)|int %} {% if user_vars.bed_temp.sensor == "heater_bed" %} {% set delta_temp = 0.0 %} {% set sensor = user_vars.bed_temp.sensor %} {% else %} {% set delta_temp = user_vars.bed_temp.delta_temp %} {% set sensor = ("temperature_sensor %s" % user_vars.bed_temp.sensor) %} {% endif %} {% set heater_temp = (temp + delta_temp) if temp > 0 else 0 %} {% if heater_temp < printer.configfile.settings.heater_bed.max_temp|float|round(1) %} SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={heater_temp} {% if wait == 1 and heater_temp > 0.0 %} TEMPERATURE_WAIT SENSOR="{sensor}" MINIMUM={ heater_temp - user_vars.bed_temp.offset_target } MAXIMUM={ heater_temp + user_vars.bed_temp.offset_target } {% endif %} {% else %} {action_respond_info("Aborted, target %3.1f\u00B0C exedes max_temp config limit" % heater_temp)} {% endif %} [gcode_macro SET_DELTA_BED_TEMP] description = SET_DELTA_BED_TEMP SENSOR=bed_plate DELTA=10.0 OFFSET=0.5 gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "bed_temp" %} {% set init = user_vars[name] %} {% if not params %} {action_respond_info("Actual settings: SENSOR=%s DELTA=%s OFFSET=%s " % (init.sensor, init.delta_temp, init.offset_target))} {action_respond_info("The SENSOR, DELTA, or OFFSET parameters are not defined for the SET_DELTA_BED_TEMP command")} {% else %} {% set SENSOR_param=params.SENSOR|default("heater_bed") if params.SENSOR is defined else -1 %} {% set DELTA_param=params.DELTA|default(10) if params.DELTA is defined else -1 %} {% set OFFSET_param=params.OFFSET|default(0.5) if params.OFFSET is defined else -1 %} {% for key in params %} {% if key|lower =='delta' %} {% set _dummy = init.update( {'delta_temp' : DELTA_param|float} ) %} {% elif key|lower =='offset' %} {% set _dummy = init.update( {'offset_target' : OFFSET_param|float} ) %} {% elif key|lower =='sensor' %} {% set _dummy = init.update( { 'sensor': SENSOR_param} ) %} {% endif %} {% endfor %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% endif %} [gcode_macro M218] description = Sets hotend offset (in mm): T X Y Z. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set ns = namespace(key_in_params=false) %} {% if params.T is not defined %} {% for tool in printer.heaters.available_heaters|sort %} {% if 'extruder' in tool %} {% set tool_nr = tool.lstrip("extruder") if tool.lstrip("extruder")|length != 0 else 0 %} {% set hotend_offset = user_vars.hotend_offset[tool_nr|int] %} { action_respond_info("Hotend offset T%s is: ( X %s / Y %s / Z %s ) " % (tool_nr, hotend_offset.x, hotend_offset.y, hotend_offset.z)) } {% endif %} {% endfor %} {% else %} {% set target_tool = params.T|default(0)|int %} {% if user_vars.tool|length < target_tool + 1 %} {action_respond_info("The tool T%s is not defined for Hotend or extruder." % (params.T)) } {% else %} {% if target_tool == 0 and printer.save_variables.variables.hotend_offset.change_T0 == False %} {action_respond_info("The tool T0 is not defined for change offset." )} {% else %} {% set new_hotend_offset = user_vars.hotend_offset %} {% for key in params %} {% if key in [ 'X' ,'Y', 'Z' ] %} {% set ns.key_in_params = true %} {% set value_offset = params[key] %} {% set _dummy =new_hotend_offset[target_tool].update( { key|lower : value_offset|float }) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=hotend_offset VALUE="{new_hotend_offset}" {% set act_extruder = printer['toolhead'].extruder %} {% set act_extruder_nr = act_extruder.lstrip("extruder") if act_extruder.lstrip("extruder")|length != 0 else 0 %} {% if act_extruder_nr|int == target_tool|int %} {action_respond_info ("SET_GCODE_OFFSET %s=%s MOVE=1 " % (key, value_offset))} SET_GCODE_OFFSET {key}={value_offset} MOVE=1 MOVE_SPEED=500 {% endif %} {% endif %} {% endfor %} {% endif %} {% if ns.key_in_params == false %} {% set hotend_offset = user_vars.hotend_offset[target_tool|int] %} {action_respond_info("Hotend offset T%s is: ( X %s / Y %s / Z %s ) " % (target_tool, hotend_offset.x, hotend_offset.y, hotend_offset.z))} {% endif %} {% endif %} {% endif %} [output_pin beeper] pin = EXP1_1 [gcode_macro _INIT_BEEPER] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set beeper = { } %} {% if 'output_pin beeper' in printer %} {% set _dummy = beeper.update( {'enable': True ,'silent': False, 'output_pin': 'beeper' } ) %} {% else %} {% set _dummy = beeper.update( {'enable': False } ) %} {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=beeper VALUE="{beeper}" {action_respond_info("Creating a list of variables for beeper") if user_vars.list} [gcode_macro M300] description = Play beep sound: M300 P gcode = {% set P = '' if 'P' not in params else " P=%s" % params.P %} SET_BEEPER {"%s" % (P)} [gcode_macro SET_BEEPER] description = Play beep sound: SET_BEEPER P= R= PLAY= gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if user_vars.beeper.enable %} {% set var_beeper = user_vars.beeper %} {% set time = params.P|default(300)|int %} {% set repeat = params.R|default(1)|int %} {% set play = params.PLAY|upper %} {% set active = 1 %} {% if play == 'ON' %} {% set time = 100 %} {% set _dummy = var_beeper.update( {'silent': False } ) %} {% elif play == 'OFF' %} {% set active = 0 %} {% set _dummy = var_beeper.update( {'silent': True } ) %} {% elif not user_vars.beeper.silent %} {% for n in range(repeat) %} SET_PIN PIN={user_vars.beeper.output_pin} VALUE={active} G4 P{time} SET_PIN PIN={user_vars.beeper.output_pin} VALUE=0 G4 P{time} {% endfor %} {% else %} RESPOND MSG=" Beeper is OFF, please send SET_BEEPER PLAY=ON " {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=beeper VALUE="{var_beeper}" {% else %} RESPOND MSG=" [output_pin beeper] is not defined in printer.cfg ! " {% endif %} [output_pin PS_ON] pin = PF6 value = 1 [gcode_button PW_DET] pin = PE12 press_gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set init = user_vars.power_supply %} {% if user_vars.power_supply.wait_off %} {% set _dummy = init.update( { 'wait_off':False} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" RESPOND MSG=" STOP - wait for cooling and shutting down." M117 STOP - Turn OFF {% else %} POWER_DETECT_OFF {% endif %} [led PS_LED] green_pin = PD12 cycle_time = 0.010 hardware_pwm = False initial_green = 1.0 [gcode_macro _INIT_POWER_SUPPLY] gcode = {% set macro_name = "VARIABLE" %} {% set name = "power_supply" %} {% set init = { } %} {% set _dummy = init.update( { 'auto_off':False, 'wait_off': False, 'running':False, 'time':0, 'power_loss': False} ) %} {% if printer.save_variables.variables[name] is not defined %} SAVE_VARIABLE VARIABLE={name} VALUE="{init}" {% else %} SAVE_VARIABLE VARIABLE={name} VALUE="{init}" {% endif %} SET_GCODE_VARIABLE MACRO={macro_name} VARIABLE={name} VALUE="{init}" [gcode_macro POWER_DETECT_OFF ] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set init = user_vars.power_supply %} {% if printer['virtual_sdcard'].is_active == true %} {% if printer.save_variables.variables.power_supply.power_loss %} RESPOND MSG=" run TRIGGER_POWER_LOSS_RECOVERY macro " {% else %} {% set value = false if printer.save_variables.variables.power_supply.auto_off else true %} {% set _dummy = init.update( {'auto_off':value} ) %} {% set info = 'enable' if value else 'disable' %} {% set msg = "G-code M81 power off is %s " % info %} RESPOND MSG=" '{msg}' " SAVE_VARIABLE VARIABLE=power_supply VALUE="{init}" SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" {% if printer['led PS_LED'] is defined %} SET_LED LED=PS_LED GREEN={0.00 if value else 1.00} SYNC=0 TRANSMIT=1 {% endif %} {% endif %} {% else %} {% if not printer["gcode_macro VARIABLE"].power_supply.running %} _COOLING_HEATER {% endif %} {% endif %} [gcode_macro _POWER_SUPPLY_OFF] description = Turn off. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set init = user_vars.power_supply %} {% if printer['led PS_LED'] is defined %} SET_LED LED=PS_LED GREEN={1.00 if init.time % 2 else 0.00} SYNC=0 TRANSMIT=1 {% endif %} {% set waittime = 10 %} {% if not init.running %} {% set _dummy = init.update( { 'running':True, 'time':0} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" RESPOND MSG="The printer will turn off! Hold the button for cancel." M117 Power supply OFF {% if 'gcode_macro SET_BEEPER' in printer %} SET_BEEPER P=250 R=3 {% endif %} UPDATE_DELAYED_GCODE ID=_POWER_SUPPLY_OFF_STEP DURATION=1 {% elif init.time < waittime %} UPDATE_DELAYED_GCODE ID=_POWER_SUPPLY_OFF_STEP DURATION=1 {% else %} {% set _dummy = init.update( { 'running':False, 'time':0} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" RESPOND MSG="Turn OFF" M117 Turn OFF {% if printer['led PS_LED'] is defined %} SET_LED LED=PS_LED GREEN=0.00 SYNC=0 TRANSMIT=1 {% endif %} SET_PIN PIN=PS_ON VALUE=0 {% endif %} [delayed_gcode _POWER_SUPPLY_OFF_STEP] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set init = user_vars.power_supply %} {% if init.running and printer['gcode_button PW_DET'].state == "RELEASED"%} {% set _dummy = init.update( { 'time':(init.time + 1) } ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" _POWER_SUPPLY_OFF {% else %} {% set _dummy = init.update( { 'running':False, 'time':0} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" {% if printer['led PS_LED'] is defined %} SET_LED LED=PS_LED GREEN=1.00 SYNC=0 TRANSMIT=1 {% endif %} RESPOND MSG=" STOP - Turn OFF" M117 STOP - Turn OFF {% endif %} [gcode_macro _COOLING_HEATER] description = Turn off. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set init = user_vars.power_supply %} {% set ns = namespace(power_off=true, info=' ') %} {% for object in printer.configfile.config|sort %} {% if 'heater_fan' is in object and printer[(object)].speed|float > 0.0 %} {% set ns.power_off = false %} {% set ns.info ="Fan is still cooling hotend." %} {% endif %} {% endfor %} {% for tool in printer.heaters.available_heaters|sort %} {% if printer[tool].target > 0.0 %} {% set ns.power_off = false %} {% set ns.info = "Heating is ON." %} {% endif %} {% endfor %} {% if ns.power_off %} {% set _dummy = init.update( { 'wait_off':False} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" RESPOND MSG=" The printer will turn off ! " M117 Power supply OFF _POWER_SUPPLY_OFF {% else %} {% set msg = "%s Printer cannot be switched off !" % ns.info %} RESPOND MSG=" '{msg}' " {% set time = 30|int %} {% set _dummy = init.update( { 'wait_off':True} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" UPDATE_DELAYED_GCODE ID=_WAIT_FOR_COOLING DURATION={time} {% endif %} [delayed_gcode _WAIT_FOR_COOLING ] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if user_vars.power_supply.wait_off %} _COOLING_HEATER {% endif %} [gcode_macro SET_AUTO_OFF] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set init = user_vars.power_supply %} {% set value = false if init.auto_off else true %} {% set _dummy = init.update( { 'auto_off': value} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" {% set info = 'enable' if value else 'disable' %} {action_respond_info(" G-code M81 power off is %s " % info )} [gcode_macro M80] description = Turn on the high-voltage power supply. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set init = user_vars.power_supply %} {% set _dummy = init.update( { 'running':False, 'wait_off':False} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=power_supply VALUE="{init}" {% if printer['output_pin PS_ON'].value != 1.0 %} SET_PIN PIN=PS_ON VALUE=1 {% if printer['led PS_LED'] is defined %} SET_LED LED=PS_LED GREEN=1 SYNC=0 TRANSMIT=1 {% endif %} RESPOND MSG=" Power supply ON. " M117 Power supply ON. {% else %} RESPOND MSG=" The printer is already turned on !" M117 The printer is already turned on ! {% endif %} [gcode_macro M81] description = Turn off the high-voltage power supply. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if user_vars.power_supply.auto_off %} _COOLING_HEATER {% elif printer['virtual_sdcard'].is_active != true %} POWER_DETECT_OFF {% endif %} [gcode_macro _INIT_FILAMENT_SENSOR] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "filament_sensor" %} {% set init = { 'defined' : False } %} {% set ns = namespace(index=1|int) %} {% for object in printer.configfile.config|sort %} {% if object.split(' ')[0] == 'filament_switch_sensor' %} {% set type = 'switch' %} {% elif object.split(' ')[0] == 'filament_motion_sensor' %} {% set type = 'motion' %} {% else %} {% set type = 'false' %} {% endif %} {% if type != 'false' %} {% set _dummy = init.update( {'defined' : True } ) %} {% set name = (object.split(' ')[1]) %} {% if type == 'motion' %} {% set _dummy = init.update({ 'motion': [name]}) if init.motion is not defined else init.motion.append(name) %} {% elif type == 'switch' %} {% set _dummy = init.update({ 'switch': [name]}) if init.switch is not defined else init.switch.append(name) %} {% endif %} {% set _dummy = init.update({ 'active': 0|int }) %} {% set _dummy = init.update({ 'index': [name]}) if init.index is not defined else init.index.append(name) %} {% set _dummy = init.update({ 'count': ns.index }) %} {% set ns.index = ns.index + 1 %} {% endif %} {% endfor %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {action_respond_info("Creating a list of variables for filament sensor." ) if printer.save_variables.variables.dump_list} [gcode_macro TRIGGER_RUNOUT] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set trig_sensor = params.SENSOR |lower %} {% if trig_sensor == 'switch' %} {action_respond_info("Activated runout switch sensor")} PAUSE X=120 Y=0 Z_MIN=20 {% if 'gcode_macro SET_BEEPER' in printer %} SET_BEEPER P=250 R=3 {% endif %} RESPOND MSG="End of filament!" M117 End of filament! {% elif trig_sensor == 'motion' %} {action_respond_info("Activated runout encoder sensor")} PAUSE X=120 Y=0 Z_MIN=20 {% if 'gcode_macro SET_BEEPER' in printer %} SET_BEEPER P=125 R=3 {% endif %} RESPOND MSG="Filament does not move!" M117 Filament does not move! {% else %} {action_respond_info("params SENSOR = %s not defined" % trig_sensor) } {% endif %} [gcode_macro _A_INIT_ACTIVE] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "active" %} {% set init = { } %} {% set _dummy = init.update({'mode': 0, 'z':{ 'hop':4.0, 'restore': 4.0, 'print_offset':0.0 , 'hop_enable': true } }) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {action_respond_info("Creating a list of active variable") if printer.save_variables.variables.dump_list} [gcode_macro _A_INIT_TOOL] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "tool" %} {% set init = { } %} {% for tool in printer.heaters.available_heaters|sort %} {% if 'extruder' in tool %} {% set tool_nr = tool.lstrip("extruder") if tool.lstrip("extruder")|length != 0 else 0 %} {% set _dummy = init.update({tool_nr|int: tool}) %} {% endif %} {% endfor %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {action_respond_info("Creating a list of variables for %s extruder" % (init|length)) if printer.save_variables.variables.dump_list} [gcode_macro _B_INIT_TOOLHEAD] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set count_extruder = user_vars.tool|length %} {% set name = "toolhead" %} {% set init = { } %} {% if 'dual_carriage' in printer['motion_report'].steppers or printer.configfile.settings['printer'].kinematics == 'dualgantry_cartesian' %} {% set ns=namespace(extruder=0|int) %} {% set count_0 = count_extruder - count_extruder // 2 %} {% set count_1 = count_extruder // 2 %} {% for toolhead in range(0, 2) %} {% for extruder in range(0, count_0 if toolhead == 0 else count_1) %} {% set _dummy = init.update({ toolhead: [user_vars.tool[ns.extruder]] }) if init[toolhead] is not defined else init[toolhead].append(user_vars.tool[ns.extruder]) %} {% set ns.extruder = ns.extruder + 1 %} {% endfor %} {% endfor %} {% else %} {% for extruder in range(0, count_extruder) %} {% set _dummy = init.update({ 0: [user_vars.tool[extruder]] }) if init.0 is not defined else init.0.append(user_vars.tool[extruder]) %} {% endfor %} {% endif %} {action_respond_info("Creating a list of variables for user configuration extruder / carriages.") if printer.save_variables.variables.dump_list} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" [gcode_macro _C_INIT_HOTEND_OFFSET] description = init or restore hotend offset after restart from [save_variables] file. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if user_vars.tool|length > 1 %} {% set name = "hotend_offset" %} {% set init = user_vars.hotend_offset %} {% for tool in printer.heaters.available_heaters|sort %} {% if 'extruder' in tool %} {% set tool_nr = tool.lstrip("extruder") if tool.lstrip("extruder")|length != 0 else 0 %} {% if user_vars.hotend_offset[tool_nr|int] is not defined %} {% set _dummy = init.update( { tool_nr|int : {'x': 0.0 , 'y': 0.0 , 'z': 0.0}} ) %} {% endif %} {% endif %} {% endfor %} {% set _dummy = init.update( {'change_T0': False} ) %} {action_respond_info("Creating a list of variables for macro M218 ") if printer.save_variables.variables.dump_list} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% else %} {action_respond_info("Configuration not valid for Hotend offset.") if printer.save_variables.variables.dump_list} {% endif %} [gcode_macro _D_INIT_TOOL_CHANGE_PARAM] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "tool_change" %} {% set init = {'enable' : False } %} {% if user_vars.tool|length > 1 %} {% for tool in printer.heaters.available_heaters|sort %} {% if 'extruder' in tool %} {% if init.delay is not defined %} {% set _dummy = init.update( { 'delay': { }} ) %} {% endif %} {% set _dummy = init.delay.update( { tool: 250 } ) %} {% endif %} {% endfor %} {% set _dummy = init.update( {'filament' : {'load': 0.5 , 'unload': 1.0, 'speed' : 45 }} ) %} {% set _dummy = init.update( {'axis_z' : {'hop': 3.0, 'restore': 3.0 }} ) %} {% set _dummy = init.update( {'enable' : True} ) %} {% if printer.configfile.settings['menu __main __user __toolchange'] is defined %} {% set _dummy = init.update( { 'menu': 'extruder'} ) %} {% endif %} {action_respond_info("Creating a list of variables for tool change param ") if printer.save_variables.variables.dump_list} {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" [gcode_macro T0] gcode = DEFINE_TOOL T=0 [gcode_macro T1] gcode = DEFINE_TOOL T=1 [gcode_macro DEFINE_TOOL] description = Define the tool for G-code 'Txx'. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set target_tool = params.T|default(0)|int %} {% if user_vars.tool |length < target_tool + 1 %} {action_respond_info("The tool T%s is not defined for extruder." % (target_tool))} {% else %} {% set target_extruder = (user_vars.tool[target_tool])|string %} SETINGS_TOOL EXTRUDER={target_extruder} {% endif %} [gcode_macro SETINGS_TOOL] description = Set the tool by param EXTRUDER. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set target_extruder = params.EXTRUDER|default('extruder') %} {% set act_extruder = (printer.toolhead.extruder)|string %} {% set act_speed = printer.gcode_move.speed %} {% if user_vars.tool_change.enable %} {% if 'gcode_macro SYNC_SWITCHING_TOOL' in printer and user_vars.idex_mode.active in [2,3] %} SYNC_SWITCHING_TOOL T={( target_extruder.lstrip("extruder") if target_extruder.lstrip("extruder")|length != 0 else 0 )|int } {% else %} {% if 'gcode_macro MULTI_HOTEND' in printer and printer['virtual_sdcard'].is_active %} MULTI_HOTEND EXTRUDER={target_extruder} {% endif %} {% if act_extruder != target_extruder %} {action_respond_info("Will now be set '%s'." % (target_extruder))} M400 SAVE_PRINT_OFFSET_Z {% if 'gcode_macro ACTIVATE_OOZING_PREVENT' in printer and printer['virtual_sdcard'].is_active %} ACTIVATE_OOZING_PREVENT ACTUAL={act_extruder} TARGET={target_extruder} {% endif %} {% if printer[act_extruder].can_extrude | lower == 'true' and printer['virtual_sdcard'].is_active == true %} G92 E0 G1 E-{user_vars.tool_change.filament.unload} F{ (user_vars.tool_change.filament.speed * 60)|int } {% endif %} Z_HOP_TOOL {% if 'gcode_macro SWITCHING_HOTEND' in printer and user_vars.switching_hotend.park is defined %} {% endif %} {% set systems = 'CARRIAGE' if 'dual_carriage' in printer['motion_report'].steppers else 'GANTRY' if printer.configfile.settings['printer'].kinematics == 'dualgantry_cartesian' else 'TOOL' %} ACTIVATE_{systems} EXTRUDER={target_extruder} APPLY_OFFSETS_TOOL T={target_extruder} G4 P{user_vars.tool_change.delay[target_extruder]} {% if 'gcode_macro PRINT_WIPE_TOWER' in printer %} PRINT_WIPE_TOWER {% endif %} RESTORE_Z_TOOL {% if 'gcode_macro ACTIVATE_OOZING_PREVENT' in printer and printer['virtual_sdcard'].is_active %} {% set new_target_temp = (printer[target_extruder].target + user_vars.oozing_prevent.diff_temp[target_extruder])|int %} M109 S{new_target_temp|string} {% endif %} {% if printer[target_extruder].can_extrude | lower == 'true' and printer['virtual_sdcard'].is_active == true %} G92 E0 G1 E{user_vars.tool_change.filament.load} F{(user_vars.tool_change.filament.speed* 60)|int } {% endif %} {% else %} {action_respond_info("The Tool is alredy activated.")} {% endif %} {% endif %} G1 F{act_speed} {% else %} {action_respond_info("The tool cahnge is disabled !")} {% endif %} [gcode_macro SAVE_PRINT_OFFSET_Z] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if printer.toolhead.extruder == "extruder" %} {% set offset = user_vars.active %} {% set _dummy =offset.z.update({'print_offset': printer.gcode_move.homing_origin.z|float }) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=active VALUE="{offset}" {% endif %} [gcode_macro APPLY_OFFSETS_TOOL] description = Apply Offsets HotEnd (tool) by params T. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set target_tool = params.T|default(printer.toolhead.extruder)%} {% set tool_nr = target_tool.lstrip("extruder") if target_tool.lstrip("extruder")|length != 0 else 0 %} {% set offset = user_vars.hotend_offset[tool_nr|int] %} {% if printer['virtual_sdcard'].is_active != true %} SET_GCODE_OFFSET X={offset.x} Y={offset.y} MOVE=1 MOVE_SPEED=500 {% else %} SET_GCODE_OFFSET X={offset.x} Y={offset.y} {% endif %} SET_GCODE_OFFSET Z={offset.z + user_vars.active.z.print_offset} MOVE=1 MOVE_SPEED=500 [gcode_macro Z_HOP_TOOL] description = z-hop before action toolhead gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set z_hop_tool = params.Z|default(user_vars.active.z.hop)|float %} {% if user_vars.active.z.hop_enable %} {% if z_hop_tool > 0.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set cur_z = printer.toolhead.position.z|float %} {% set z_safe = z_hop_tool if cur_z < (max_z - z_hop_tool) else (max_z - cur_z) %} G91 G1 Z{z_safe} G90 {% set active = user_vars.active %} {% if printer['virtual_sdcard'].is_active %} {% set _dummy =active.z.update( {'restore':0.0 }) %} {% else %} {% set _dummy =active.z.update( { 'restore': z_safe }) %} {% endif %} {% set _dummy = active.z.update( {'hop_enable':false} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=active VALUE="{active}" {% endif %} {% endif %} [gcode_macro RESTORE_Z_TOOL] description = restore z-hop after action toolhead gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if user_vars.active.z.restore != 0 %} G91 G1 Z-{user_vars.active.z.restore} G90 {% else %} {% endif %} {% set active = user_vars.active %} {% set _dummy = active.z.update( {'hop_enable':true} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=active VALUE="{active}" [gcode_macro SET_GCODE_TOOL] description = SET_GCODE_TOOL TOOL=[0|1|2|3] EXTRUDER= gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = 'tool' %} {% set init = user_vars.tool %} {% if params.EXTRUDER is defined and params.TOOL is defined %} {% set extruder = params.EXTRUDER|default('extruder') %} {% set tool = params.TOOL|default(0)|int %} {% if extruder|lower in printer.heaters.available_heaters and tool <= init|length -1 %} {% set _dummy = init.update( { tool : extruder.lower() } ) %} {% else %} {action_respond_info("params EXTRUDER=%s or TOOL=%s not valid for this configuration." % (extruder,tool))} {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% else %} {action_respond_info("params EXTRUDER and TOOL must be defined!")} {% endif %} [gcode_macro SET_TOOLHEAD] description = SET_TOOLHEAD CARRIAGE=[0|1] TOOL= gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = 'toolhead' %} {% set init = user_vars.toolhead %} {% if params.CARRIAGE is defined and params.TOOL is defined %} {% set carriage = params.CARRIAGE|default(0)|int %} {% set tool = params.TOOL|default('extruder') %} {% set count_tool = params.TOOL.split(",")|length %} {% set ns = namespace(tool=true, extruder=()) %} {% for count in range(0, count_tool) %} {% set tool = params.TOOL.split(",")[count] %} {% if tool|lower not in printer.heaters.available_heaters %} {% set ns.extruder = tool %} {% set ns.tool = false %} {% endif %} {% endfor %} {% if carriage > init|length -1 %} {action_respond_info("params CARRIAGE= %s not valid for this configuration." % (carriage))} {% elif ns.tool == false %} {action_respond_info("params TOOL= %s not valid for this configuration." % (ns.extruder))} {% else %} {% for del in range(0, init[carriage]|length ) %} {% set _dummy = init[carriage].pop() %} {% endfor %} {% for count in range(0, count_tool) %} {% set tool = params.TOOL.split(",")[count] %} {% set _dummy = init[carriage].append( tool.lower() ) %} {% endfor %} {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% else %} {action_respond_info("params CARRIAGE and TOOL must be defined!")} {% endif %} [gcode_macro SET_CHANGE_PARAM] description = SET_CHANGE_PARAM LOAD=0.5 UNLOAD=1.5 SPEED=45 EXTRUDER=extruder DELAY=250 HOP=3.0 RESTORE=0.0 gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = 'tool_change' %} {% set init = user_vars.tool_change %} {% for key in params %} {% if key|lower =='extruder' %} {% set extruder = params[key]|default('extruder') %} {% set delay = params.DELAY|default(250)|int %} {% if extruder in init.delay %} {% set _dummy = init.delay.update( {extruder : delay} ) %} {% else %} {action_respond_info("params EXTRUDER=%s not valid for this configuration." % (extruder))} {% endif%} {% elif key|lower =='load' %} {% set load = params[key]|default(0.5)|float(2) %} {% set _dummy = init.filament.update( {'load' : load } ) %} {% elif key|lower =='unload' %} {% set unload = params[key]|default(1.5)|float(2) %} {% set _dummy = init.filament.update( {'unload' : unload } ) %} {% elif key|lower =='speed' %} {% set speed = params[key]|default(45)|int %} {% set _dummy = init.filament.update( {'speed' : speed } ) %} {% elif key|lower =='hop' %} {% set hop = params[key]|default(3.0)|float(2) %} {% set _dummy = init.axis_z.update( { 'hop' : hop } ) %} {% elif key|lower =='restore' %} {% set restore = params[key]|default(0.0)|float(2) %} {% set _dummy = init.axis_z.update( { 'restore' : restore } ) %} {% endif %} {% endfor %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" [gcode_macro _Z_INIT_RESTORE_USER_VARIABLE] gcode = {% if printer.save_variables.variables.restore_variable is defined %} RESTORE_USER_VARIABLE {% endif %} [gcode_macro GET_USER_VARIABLE] description = Debug: Print entries of the printer object containing gcode_macro gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set out = [] %} {% for parameter, value in printer["gcode_macro VARIABLE"].items()|sort %} {% set _dummy = out.append("printer['gcode_macro VARIABLE'].%s = %s" % (parameter, value)) %} {% endfor %} {action_respond_info(out|join("\n"))} [gcode_macro DUMP_LIST] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set value = false if printer.save_variables.variables.dump_list else true %} SAVE_VARIABLE VARIABLE=dump_list VALUE={value} {action_respond_info("set > %s " % value )} [gcode_macro SAVE_USER_VARIABLE] description = SAVE_USER_VARIABLE VAR= gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if params.VAR is defined %} {% set parameter = params.VAR|lower %} {% if parameter in user_vars %} {% set value = user_vars[parameter] %} SAVE_VARIABLE VARIABLE={parameter} VALUE="{value}" {% else %} {action_respond_info(" VAR=%s not in user variable." % params.VAR )} {% endif %} {% else %} {% for parameter,value in printer["gcode_macro VARIABLE"].items()|sort %} SAVE_VARIABLE VARIABLE={parameter} VALUE="{value}" {% endfor %} {% endif %} [gcode_macro RESTORE_USER_VARIABLE] description = gcode = {% set recovery = printer.save_variables.variables %} {% if 'none' in recovery.restore_variable %} {action_respond_info("No variables were restored !")} {% elif 'all' in recovery.restore_variable %} {% for parameter,value in printer["gcode_macro VARIABLE"].items()|sort %} {% if parameter in recovery %} {% set value = recovery[parameter] %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={parameter} VALUE="{value}" {% endif %} {% endfor %} {action_respond_info("All variables restored from SD card !")} {% else %} {% for parameter,value in printer["gcode_macro VARIABLE"].items()|sort %} {% if parameter in recovery.restore_variable %} {% set value = recovery[parameter] %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={parameter} VALUE="{value}" {% endif %} {% endfor %} {action_respond_info("From SD card restored this variables : %s" % recovery.restore_variable )} {% endif %} [gcode_macro DELETE_USER_VARIABLE] gcode = {% for variable in printer["gcode_macro VARIABLE"]|sort %} {% set value = { } %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={variable} VALUE="{value}" {% endfor %} [gcode_macro DELETE_SAVE_VARIABLE] description = for delete send: DELETE_SAVE_VARIABLE YES= gcode = {% if params.YES is defined %} {% for variable in printer.save_variables.variables|sort %} {% set value = { } %} SAVE_VARIABLE VARIABLE={variable} VALUE="{value}" {% endfor %} {action_respond_info(" DELETED ")} {% else %} {action_respond_info(" NOT DELETED - for delete send: DELETE_SAVE_VARIABLE YES= ")} {% endif %} [gcode_macro _INIT_DUAL_CARRIAGE] gcode = {% if 'dual_carriage' in printer['motion_report'].steppers %} {% set name = "dual_carriage" %} {% set init = { } %} {% set _dummy = init.update( {'auto_exchange':True, 'movespeed': 500, 'feedrate': 30000 }) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% endif %} [gcode_macro ACTIVATE_CARRIAGE] description = Activate the tool by index EXTRUDER gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set act_speed = printer.gcode_move.speed %} {% set target_tool = params.EXTRUDER|default('extruder')|string %} {% set default_carriage = 0 if target_tool in user_vars.toolhead[0] else 1 %} {% set act_carriage = 0 if printer.toolhead.extruder in user_vars.toolhead[0] else 1 %} {% if act_tool != target_tool %} {% if act_carriage|int != default_carriage|int %} {% if user_vars.dual_carriage.sync_exchange %} SYNC_CHANGE_CARRIAGE EXTRUDER={target_tool} {% elif user_vars.dual_carriage.auto_exchange %} PARK_CARRIAGE {% endif %} {% endif %} ACTIVATE_TOOL EXTRUDER={target_tool} SET_DUAL_CARRIAGE CARRIAGE={default_carriage} {% if act_carriage|int != default_carriage|int %} {% if user_vars.dual_carriage.sync_exchange %} {% elif user_vars.dual_carriage.auto_exchange %} CHANGE_CARRIAGE {% endif %} {% endif %} TOOLHEAD_PRINT_FAN G1 F{act_speed} {% else %} {action_respond_info("The '%s' is alredy activated." % (target_tool))} {% endif %} [gcode_macro PARK_CARRIAGE] description = Park the active toolhead. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set act_carriage = 0 if printer.toolhead.extruder in user_vars.toolhead[0] else 1 %} SET_GCODE_OFFSET X=0 Y=0 Z=0 {% set x_pos = printer.gcode_move.gcode_position.x %} {% set y_pos = printer.gcode_move.gcode_position.y %} {% set z_pos = printer.gcode_move.gcode_position.z %} {% set gcode_position = user_vars.dual_carriage %} {% set _dummy = gcode_position.update( {'gcode_position':{ 'x': x_pos|float, 'y': y_pos|float , 'z': z_pos|float }} ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=dual_carriage VALUE="{gcode_position}" {% set axis = printer.configfile.settings.dual_carriage.axis %} {% set stepper = ('stepper_'+axis,'dual_carriage')[act_carriage|int] %} G1 {axis + (printer.configfile.config[(stepper)].position_endstop)} F{user_vars.dual_carriage.feedrate} [gcode_macro CHANGE_CARRIAGE] description = Change the new carriage. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set target_tool = printer.toolhead.extruder %} {% set tool_nr = target_tool.lstrip("extruder") if target_tool.lstrip("extruder")|length != 0 else 0 %} {% set offset = user_vars.hotend_offset[tool_nr|int] %} SET_GCODE_OFFSET X={offset.x} Y={offset.y} Z={offset.z + user_vars.active.z.print_offset} {% set gcode_position = user_vars.dual_carriage.gcode_position %} {% set x_pos = gcode_position.x %} {% set y_pos = gcode_position.y %} {% set z_pos = gcode_position.z %} G1 X{x_pos|string} Y{y_pos|string} Z{z_pos|string} F{user_vars.dual_carriage.feedrate} {% set gcode_position = user_vars.dual_carriage %} {% set _dummy = gcode_position.pop( 'gcode_position' ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=dual_carriage VALUE="{gcode_position}" [gcode_macro ACTUAL_CARRIAGE_OFFSET] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set axis = 0 if printer.configfile.settings.dual_carriage.axis == 'x' else 1 %} {% set init_pos_car0 = printer['dual_carriage'].init_mode_positions[0][axis|int] %} {% set init_pos_car1 = printer['dual_carriage'].init_mode_positions[1][axis|int] %} {% set act_carriage_offset = init_pos_car1 - init_pos_car0 %} {% set _dummy =user_vars.idex_mode.update( {'carriage_offset' : act_carriage_offset } ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=idex_mode VALUE="{user_vars.idex_mode}" [gcode_macro SET_CARRIAGE_OFFSET] gcode = {% set axis = printer.configfile.settings.dual_carriage.axis %} SET_GCODE_OFFSET {axis}={printer["gcode_macro VARIABLE"].idex_mode.carriage_offset} [gcode_macro DISABLE_CARRIAGE_0] description = Disable carriage 0 in mode "DUPLICATION" or "MIRRORED". gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if user_vars.tool_change.enable %} {% set axis = printer.configfile.settings.dual_carriage.axis %} {% set fan_carriage = printer["gcode_macro VARIABLE"].fan.index %} {% if user_vars.idex_mode.active in [2,3] %} {% if user_vars.idex_mode.active == 2 %} SAVE_GCODE_STATE name=park_carriage SET_DUAL_CARRIAGE CARRIAGE=0 ACTUAL_CARRIAGE_OFFSET SYNC_EXTRUDER_MOTION EXTRUDER={user_vars.toolhead[0][0]} MOTION_QUEUE= G1 {axis + (printer.configfile.config[('stepper_'+axis)].position_endstop)} F{user_vars.dual_carriage.feedrate} SET_DUAL_CARRIAGE CARRIAGE=1 RESTORE_GCODE_STATE name=park_carriage SET_CARRIAGE_OFFSET {% elif user_vars.idex_mode.active == 3 %} SYNC_EXTRUDER_MOTION EXTRUDER={user_vars.toolhead[0][0]} MOTION_QUEUE= {% endif %} SET_FAN_SPEED FAN={fan_carriage[0]} SPEED=0 {% for tool in user_vars.toolhead.0 %} {% set heater = tool.lstrip("extruder") if tool.lstrip("extruder")|length != 0 else 0 %} M104 S0 T{heater|int} {% endfor %} _A_INIT_TOOL {% set _dummy = user_vars.tool_change.update( {'enable' : False } ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=tool_change VALUE="{user_vars.tool_change}" {% else %} RESPOND TYPE="error" MSG="Disable carriage only in DUPLICTION or MIRRORED Idex modes." {% endif %} {% endif %} [gcode_macro DISABLE_CARRIAGE_1] description = Disable carriage 1 in mode "DUPLICATION" or "MIRRORED". gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if user_vars.tool_change.enable %} {% set axis = printer.configfile.settings.dual_carriage.axis %} {% set fan_carriage = printer["gcode_macro VARIABLE"].fan.index %} {% if user_vars.idex_mode.active in [2,3] %} SAVE_GCODE_STATE name=park_carriage SET_DUAL_CARRIAGE CARRIAGE=0 SYNC_EXTRUDER_MOTION EXTRUDER={user_vars.toolhead[1][0]} MOTION_QUEUE= SET_DUAL_CARRIAGE CARRIAGE=1 G1 {axis + (printer.configfile.config[('dual_carriage')].position_endstop)} F{user_vars.dual_carriage.feedrate} SET_DUAL_CARRIAGE CARRIAGE=0 RESTORE_GCODE_STATE name=park_carriage SET_GCODE_OFFSET {axis}=0 SET_FAN_SPEED FAN={fan_carriage[1]} SPEED=0 {% for tool in user_vars.toolhead.1 %} {% set heater = tool.lstrip("extruder") if tool.lstrip("extruder")|length != 0 else 0 %} M104 S0 T{heater|int} {% endfor %} _A_INIT_TOOL {% set _dummy = user_vars.tool_change.update( {'enable' : False } ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=tool_change VALUE="{user_vars.tool_change}" {% else %} RESPOND TYPE="error" MSG="Disable carriage only in DUPLICTION or MIRRORED Idex modes." {% endif %} {% endif %} [gcode_macro _INIT_IDEX_MODE] gcode = {% if 'dual_carriage' in printer['motion_report'].steppers %} {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set name = "idex_mode" %} {% set init = { } %} {% set axis = printer.configfile.settings.dual_carriage.axis %} {% if printer.configfile.config['dual_carriage'].safe_distance is defined %} {% set dupl_min = (printer.configfile.config['dual_carriage'].safe_distance)|int %} {% else %} {% set dupl_min = ( printer.configfile.config[('stepper_'+axis)].position_min|int) |abs %} {% endif %} {% set dupl_max = ( printer.configfile.config[('stepper_'+axis)].position_max|int / 2) |int %} {% set mirrored = printer.configfile.config[('stepper_'+axis)].position_max|int %} {% set _dummy = init.update( {'active': 1, 'carriage_offset': 0 , 'movespeed': 500, 'feedrate': 30000 } ) %} {% if init.position is not defined %} {% set _dummy = init.update( { 'position': { } } ) %} {% endif %} {% set _dummy = init.position.update( {'dupl_min': dupl_min, 'dupl_max': dupl_max , 'mirrored': mirrored } ) %} {% if 'bed_mesh' in printer %} {% if init.bed_mesh is not defined %} {% set _dummy = init.update( { 'act_bed_mesh': { } } ) %} {% endif %} {% set _dummy = init.update( { 'act_bed_mesh': printer['bed_mesh'].profile_name } ) %} {% endif %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% endif %} [gcode_macro M605] description = Set dual carriage movement mode: M605 S1 [0,2,3,4] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if 'dual_carriage' not in printer['motion_report'].steppers %} RESPOND TYPE="error" MSG="Idex modes are not available for the kinematic or [dual_carriage] section is missing." {% elif "xyz" not in printer.toolhead.homed_axes %} RESPOND TYPE="error" MSG="For M605 mode must be home axis first !!" {% else %} {% set mode = params.S|default(1)|int %} {% set offset_dual = params.X|default(user_vars.idex_mode.position.dupl_max)|int %} {% set offset_temp = params.R|default(0)|float %} {% set act_speed = printer.gcode_move.speed %} {% if offset_dual < user_vars.idex_mode.position.dupl_min or offset_dual > user_vars.idex_mode.position.dupl_max %} {action_respond_info("The distance between dual carriages must be %s - %s " % ( user_vars.idex_mode.position.dupl_min, user_vars.idex_mode.position.dupl_max))} {% set offset_dual = user_vars.idex_mode.position.dupl_max %} {action_respond_info("Will now be set to : %s " % ( user_vars.idex_mode.position.dupl_max))} {% endif %} {% if 'gcode_macro SET_TEMP_OFFSET' in printer %} {% set tool_0 = user_vars.toolhead[0][0] %} {% set tool_1 = user_vars.toolhead[1][0] %} {% set _dummy = user_vars.offset_temp.update({tool_0: 0.0}) %} {% set _dummy = user_vars.offset_temp.update({tool_1: offset_temp}) %} {% if user_vars.tool|length == 4 %} {% set tool_2 = user_vars.toolhead[0][1] %} {% set tool_3 = user_vars.toolhead[1][1] %} {% set _dummy = user_vars.offset_temp.update({tool_2: offset_temp}) %} {% set _dummy = user_vars.offset_temp.update({tool_3: offset_temp}) %} {% endif %} {% else %} {action_respond_info("The macro SET_TEMP_OFFSET is not defined." )} {% endif %} {% if (mode) == 0 %} {% set _dummy =user_vars.idex_mode.update( {'active' : 0, 'carriage_offset' : 0} ) %} {% set _dummy =user_vars.dual_carriage.update( {'auto_exchange':False} ) %} RESPOND MSG="Dual-extruder Full-control mode is active" {% set activate_mode = 'PRIMARY' %} {% elif (mode) == 1 %} {% set _dummy =user_vars.idex_mode.update( {'active' : 1, 'carriage_offset' : 0} ) %} {% set _dummy =user_vars.dual_carriage.update( {'auto_exchange':True} ) %} RESPOND MSG="Dual-extruder Auto-park mode is active" {% set activate_mode = 'PRIMARY' %} {% elif (mode) == 2 %} {% set _dummy =user_vars.idex_mode.update( {'active' : 2, 'carriage_offset' : offset_dual} ) %} {% set _dummy =user_vars.dual_carriage.update( {'auto_exchange':True} ) %} RESPOND MSG="Duplication mode is active" {% set activate_mode = 'COPY' %} {% elif (mode) == 3 %} {% set _dummy =user_vars.idex_mode.update( {'active' : 3, 'carriage_offset' : user_vars.idex_mode.position.mirrored } ) %} {% set _dummy =user_vars.dual_carriage.update( {'auto_exchange':True} ) %} RESPOND MSG="Mirrored mode is active" {% set activate_mode = 'MIRROR' %} {% else %} {% set _dummy =user_vars.idex_mode.update( {'active' : 1, 'carriage_offset' : 0} ) %} {% set _dummy =user_vars.dual_carriage.update( {'auto_exchange':True} ) %} RESPOND MSG="mod M605 S"{mode}" does not exist, I set the default mod M605 S1" {% set activate_mode = 'PRIMARY' %} {% endif %} {% if 'bed_mesh' in printer and printer['bed_mesh'].profile_name !='' and (mode) in [2,3] %} {action_respond_info("Save BED_MESH profile = %s " % printer['bed_mesh'].profile_name)} {% set _dummy = user_vars.idex_mode.update( { 'act_bed_mesh': printer['bed_mesh'].profile_name } ) %} {% endif %} {% set _dummy = user_vars.tool_change.update( {'enable' : True } ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=tool_change VALUE="{user_vars.tool_change}" SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=idex_mode VALUE="{user_vars.idex_mode}" SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=dual_carriage VALUE="{user_vars.dual_carriage}" SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=offset_temp VALUE="{user_vars.offset_temp}" DEFAULT_EXTRUDER_SETTINGS ACTIVATE_IDEX MODE={activate_mode} G1 F{act_speed} {% endif %} [gcode_macro DEFAULT_EXTRUDER_SETTINGS] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} _A_INIT_TOOL {% for tool in printer.motion_report.steppers|sort %} {% if 'extruder' in tool %} SYNC_EXTRUDER_MOTION EXTRUDER={tool} MOTION_QUEUE= SYNC_EXTRUDER_MOTION EXTRUDER={tool} MOTION_QUEUE={tool} {% endif %} {% endfor %} {% if 'gcode_macro SWITCHING_EXTRUDER' in printer or 'gcode_macro SWITCHING_HOTEND' in printer %} ACTIVATE_TOOL EXTRUDER={user_vars.toolhead[1][0]} ACTIVATE_TOOL EXTRUDER={user_vars.toolhead[0][0]} {% endif %} [gcode_macro ACTIVATE_IDEX] description = Set the dual-carriages mode. gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% set axis = printer.configfile.settings.dual_carriage.axis %} {% set mode = params.MODE|default('FULL_CONTROL') %} {% set _dummy = user_vars.tool_change.update( {'enable' : True } ) %} {% set systems = 'TOOL' if 'gcode_macro SWITCHING_EXTRUDER' in printer or 'gcode_macro SWITCHING_HOTEND' in printer else 'EXTRUDER' %} SET_DUAL_CARRIAGE CARRIAGE=0 Z_HOP_TOOL G28 {axis} SET_GCODE_OFFSET X=0 Y=0 Z=0 {% if mode == 'PRIMARY' %} {% if 'bed_mesh' in printer and user_vars.idex_mode.act_bed_mesh !='' %} {action_respond_info("Restore BED_MESH profile = %s " % user_vars.idex_mode.act_bed_mesh)} BED_MESH_PROFILE LOAD={user_vars.idex_mode.act_bed_mesh} {% endif %} {% if user_vars.dual_carriage.auto_exchange %} SET_DUAL_CARRIAGE CARRIAGE=0 SET_GCODE_OFFSET X=0 Y=0 Z=0 MOVE=1 MOVE_SPEED={user_vars.idex_mode.movespeed} G1 {axis + (user_vars.idex_mode.position.dupl_max)|string} F{user_vars.idex_mode.feedrate} ACTIVATE_{systems} EXTRUDER={user_vars.toolhead[0][0]} {% endif %} {% else %} {% if 'bed_mesh' in printer %} {action_respond_info("Disable BED_MESH profile = %s " % user_vars.idex_mode.act_bed_mesh)} BED_MESH_CLEAR {% endif %} {% if 'gcode_macro MULTI_HOTEND' in printer and printer['virtual_sdcard'].is_active %} {% for carriage in user_vars.toolhead %} {% if user_vars.toolhead[carriage].0 !=user_vars.multi_hotend[carriage] %} SET_DUAL_CARRIAGE CARRIAGE={carriage} MULTI_HOTEND_ACTION EXTRUDER={user_vars.toolhead[carriage].0} {% endif %} {% endfor %} {% endif %} SET_DUAL_CARRIAGE CARRIAGE=1 G1 {axis + (user_vars.idex_mode.carriage_offset)|string} F{user_vars.idex_mode.feedrate} ACTIVATE_{systems} EXTRUDER={user_vars.toolhead[1][0]} SET_GCODE_OFFSET {axis}=0 SET_DUAL_CARRIAGE CARRIAGE=0 G1 {axis + 0|string} F{user_vars.idex_mode.feedrate} SET_DUAL_CARRIAGE CARRIAGE=1 MODE={mode} {% if printer['gcode_macro SET_SYNC_HEATERS_MODE'] is defined %} SET_SYNC_HEATERS_MODE WAIT=0 {% endif %} ACTIVATE_{systems} EXTRUDER={user_vars.toolhead[0][0]} SYNC_EXTRUDER_MOTION EXTRUDER={user_vars.toolhead[1][0]} MOTION_QUEUE={user_vars.toolhead[0][0]} {% if 'gcode_macro SYNC_SWITCHING_TOOL' not in printer %} {% set _dummy = user_vars.tool_change.update( {'enable' : False } ) %} {% endif %} {% endif %} TOOLHEAD_PRINT_FAN RESTORE_Z_TOOL SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE=tool_change VALUE="{user_vars.tool_change}" [gcode_macro _INIT_SYNC_CHANGE_CARRIAGE] gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if 'dual_carriage' in printer['motion_report'].steppers %} {% set name = "dual_carriage" %} {% set init = user_vars.dual_carriage %} {% set axis = printer.configfile.settings.dual_carriage.axis %} {% set endstop_0 = (printer.configfile.config[('stepper_'+axis)].position_endstop )|int %} {% set endstop_1 = (printer.configfile.config['dual_carriage'].position_endstop)|int %} {% set _dummy = init.update( {'sync_exchange': True, 'parking': [ endstop_0, endstop_1 ] } ) %} SET_GCODE_VARIABLE MACRO=VARIABLE VARIABLE={name} VALUE="{init}" {% endif %} [gcode_macro SYNC_CHANGE_CARRIAGE] description = params EXTRUDER - define new tool (extruder) gcode = {% set user_vars = printer["gcode_macro VARIABLE"] %} {% if user_vars.dual_carriage.auto_exchange %} {% set act_carriage = 0 if printer.toolhead.extruder in user_vars.toolhead[0] else 1 %} {% set axis = printer.configfile.settings.dual_carriage.axis %} {% set act_speed = printer.gcode_move.speed %} {% set tool = params.EXTRUDER|default('extruder') %} {% set tool_nr = tool.lstrip("extruder") if tool.lstrip("extruder")|length != 0 else 0 %} {% set offset = user_vars.hotend_offset[tool_nr|int][axis|string] %} {% set axis_pos = printer.gcode_move.gcode_position[axis] %} {% set tool_pos = printer.gcode_move.position[axis] %} {% set gap_0 = ((user_vars.dual_carriage.parking[0])|abs + tool_pos)|float %} {% set gap_1 = (user_vars.dual_carriage.parking[1] - tool_pos)|float %} SET_DUAL_CARRIAGE CARRIAGE=1 MODE=COPY {% if act_carriage == 0 %} {% if gap_0 <= gap_1 %} SET_GCODE_OFFSET {axis}=0 G1{axis + (user_vars.dual_carriage.parking[0])|string} F{user_vars.dual_carriage.feedrate} SET_DUAL_CARRIAGE CARRIAGE=1 SET_GCODE_OFFSET {axis}={offset} G1 {axis + ((axis_pos)|string) } F{user_vars.dual_carriage.feedrate} {% else %} G91 G1 {axis +'-'+((gap_1)|string)} F{user_vars.dual_carriage.feedrate} G90 SET_DUAL_CARRIAGE CARRIAGE=0 SET_GCODE_OFFSET {axis}=0 G1{axis + (user_vars.dual_carriage.parking[0])|string} F{user_vars.dual_carriage.feedrate} SET_DUAL_CARRIAGE CARRIAGE=1 SET_GCODE_OFFSET {axis}={offset} G1 {axis + ((axis_pos)|string) } F{user_vars.dual_carriage.feedrate} {% endif %} {% elif act_carriage ==1 %} {% if gap_0 <= gap_1 %} SET_GCODE_OFFSET {axis}={offset} G1 {axis + ((axis_pos)|string)} F{user_vars.dual_carriage.feedrate} SET_DUAL_CARRIAGE CARRIAGE=1 SET_GCODE_OFFSET {axis}=0 G1{axis + (user_vars.dual_carriage.parking[1])|string} F{user_vars.dual_carriage.feedrate} SET_DUAL_CARRIAGE CARRIAGE=0 SET_GCODE_OFFSET {axis}={offset} {% else %} G91 G1 {axis + ((gap_1)|string)} F{user_vars.dual_carriage.feedrate} G90 SET_DUAL_CARRIAGE CARRIAGE=0 SET_GCODE_OFFSET {axis}={offset} G1 {axis + ((axis_pos)|string)} F{user_vars.dual_carriage.feedrate} {% endif %} {% endif %} G1 F{act_speed} {% endif %} [gcode_macro _GET_SYNC_CHANGE_CARRIAGE] description = gcode = {% set axis = printer.configfile.settings.dual_carriage.axis %} {action_respond_info("G-code %s=%s" % (axiy, printer.gcode_move.gcode_position[axis] ) )} {action_respond_info("position %s=%s" % (axiy, printer.gcode_move.position[axis] ) )} {action_respond_info("offset %s=%s" % (axiy, printer.gcode_move.homing_origin[axis]) )} [gcode_macro TEST_IDEX] variable_bed_size = {'x_min': 10, 'x_max': 230, 'y_min':10, 'y_max': 230} gcode = {% set axis = printer.configfile.settings.dual_carriage.axis %} {% set dual_bed_min = bed_size[axis+'_min'] %} {% set dual_bed_max = bed_size[axis+'_max'] %} {% set dual_bed_mid = (dual_bed_max|int - dual_bed_min|int) /2 %} RESPOND MSG=" max pos.: "{dual_bed_max} RESPOND MSG=" mid pos.: "{dual_bed_mid} RESPOND MSG=" min pos.: "{dual_bed_min} RESPOND MSG=" Dual carriage axis: "{axis} G28 M83 T0 M106 G1 Z2 F4000 G1 {axis + dual_bed_max|string} G1 {axis + dual_bed_min|string} G1 {axis + dual_bed_mid|string} T1 G1 Z2 F4000 G1 {axis + dual_bed_max|string} G1 {axis + dual_bed_min|string} G1 {axis + dual_bed_mid|string} M605 s2 M106 G1 Z2 F2000 G1 {axis + dual_bed_mid|string} G1 {axis + dual_bed_min|string} M107 M605 s3 M106 G1 Z2 F2000 G1 {axis + '90'} G1 {axis + dual_bed_min|string} M107 M605 M106 G1 Z2 F4000 G1 {axis + dual_bed_min|string} G1 {axis + dual_bed_mid|string} T2 G1 Z2 F4000 G1 {axis + dual_bed_min|string} G1 {axis + dual_bed_mid|string} T0 G1 Z10 F500 G1 Z5 F2000 M107 ======================= Extruder max_extrude_ratio=1.663007 Extruder max_extrude_ratio=1.663007 mcu 'mcu': Starting CAN connect Created a socket webhooks client 1956184152: New connection webhooks client 1956184152: Client info {'program': 'Moonraker', 'version': 'v0.8.0-325-g99b97af'} mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect Created a socket mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed mcu 'mcu': Timeout on connect MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 785, in _mcu_identify self._serial.connect_canbus(self._serialport, nodeid, File "/home/pi/klipper/klippy/serialhdl.py", line 133, in connect_canbus self._error("Unable to connect") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 796, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect No build file /home/pi/klipper/klippy/../.config No build file /home/pi/klipper/klippy/../out/klipper.dict No build file /home/pi/klipper/klippy/../out/klipper.elf mcu 'mcu': Wait for identify_response Traceback (most recent call last): File "/home/pi/klipper/klippy/serialhdl.py", line 68, in _get_identify_data params = self.send_with_response(msg, 'identify_response') File "/home/pi/klipper/klippy/serialhdl.py", line 261, in send_with_response return src.get_response([cmd], self.default_cmd_queue) File "/home/pi/klipper/klippy/serialhdl.py", line 318, in get_response self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, File "/home/pi/klipper/klippy/serialhdl.py", line 253, in raw_send_wait_ack self._error("Serial connection closed") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Serial connection closed