minor cleanup and organization
1 parent a6e2a8c commit d7df1bdee536191de84bacd23e0eef15021da2da
@Cory Tucker Cory Tucker authored 24 days ago
Showing 10 changed files
View
487
config/00_macros.cfg 0 → 100644
# gcode to run on printer start
[delayed_gcode STARTUP]
gcode:
# grab saved variables
{% set svv = printer.save_variables.variables %}
{% set bed_leeway_temp = 5 %}
{% set extruder_leeway_temp = 20 %}
{% set hotend_filament = svv.hotend_filament %}
# check if stored variables make sense, and set them to default values if not
{% if not(svv.heater_mode == "auto" or svv.heater_mode == "manual" or svv.heater_mode == "slicer")%}
{ action_respond_info("setting heater_mode to AUTO, before: %s" % (svv.heater_mode)) }
SAVE_VARIABLE VARIABLE=heater_mode VALUE='"auto"'
{% endif %}
# set temp variables - call variables macro
VARIABLES
 
# kickstart fan control macro
# UPDATE_DELAYED_GCODE ID=FAN_CONTROL_LOOP DURATION=2
 
# check the current heater states and re enable heaters if able
{% if svv.extruder_state == 'hot' %}
{% if svv.extruder_temperature - extruder_leeway_temp <= printer.extruder.temperature %}
{ action_respond_info("re-enabling extruder after printer shutoff") }
SET_HEATER_TEMPERATURE HEATER=extruder TARGET={svv.extruder_temperature}
{% else %}
{ action_respond_info("extruder was enabled before last shutoff. State updated to cold.") }
SAVE_VARIABLE VARIABLE=extruder_state VALUE='"cold"'
{% endif %}
{% endif %}
{% if svv.bed_state == 'hot' %}
{action_respond_info(printer.heater_bed.temperature|string)}
{action_respond_info(bed_leeway_temp|string)}
{action_respond_info(svv.bed_temperature|string)}
 
{% if svv.bed_temperature - bed_leeway_temp <= printer.heater_bed.temperature %}
{ action_respond_info("re-enabling bed after printer shutoff") }
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={svv.bed_temperature}
{% else %}
{ action_respond_info("bed was enabled before last shutoff. State updated to cold.") }
SAVE_VARIABLE VARIABLE=bed_state VALUE='"cold"'
{% endif %}
{% endif %}
 
# check the filament load state:
# exit-entry-bowden
# 000 unloaded
# 001 unloaded
# 010 invalid
# 011 unloaded
# 100 runout
# 101 invalid
# 110 near_runout
# 111 loaded
 
# store button vals
{% set exit_sense = (printer["gcode_button extruder_exit"].state == "PRESSED") %}
{% set entry_sense = (printer["gcode_button extruder_entry"].state == "PRESSED") %}
{% set bowden_sense = (printer["gcode_button bowden_sensor"].state == "PRESSED") %}
 
# detect unloaded
{% if not(entry_sense and exit_sense) or (not(entry_sense) and bowden_sense) %}
{% if svv.filament_load_state != "unloaded" %}
{ action_respond_info("Current filament state does not match filament state on last boot. Was " ~ (svv.filament_load_state|string) ~ ", currently unloaded.") }
{% endif %}
SET_FILAMENT_LOAD_STATE STATE="unloaded"
SET_FILAMENT_SENSOR SENSOR=bowden_encoder_sensor ENABLE=0
 
# loaded
{% elif entry_sense and exit_sense and bowden_sense %}
{% if svv.filament_load_state not in ["loaded", "primed"] %}
{ action_respond_info("Current filament state does not match filament state on last boot. Was " ~ (svv.filament_load_state|string) ~ "") }
{% endif %}
SET_FILAMENT_LOAD_STATE STATE="loaded"
SET_FILAMENT_SENSOR SENSOR=bowden_encoder_sensor ENABLE=1
 
# runout
{% elif entry_sense and not(exit_sense) and not(bowden_sense) %}
{ action_respond_info("Current filament state is runout. Unable to print.") }
SET_FILAMENT_SENSOR SENSOR=bowden_encoder_sensor ENABLE=0
 
# near_runout
{% elif entry_sense and exit_sense and not(bowden_sense) %}
{ action_respond_info("Current filament state is runout. Unable to print.") }
SET_FILAMENT_SENSOR SENSOR=bowden_encoder_sensor ENABLE=0
{% endif %}
 
initial_duration: 4
 
[gcode_macro TEST]
gcode:
{% set svv = printer.save_variables.variables %}
{break}
{action_respond_info(svv.filaments|selectattr("name", "in", [svv.filament_hotend,
svv.filament_extruder])|map(attribute="extruder",default='None')|max|string)}
 
####### Calibration
[gcode_macro calibrate_full]
gcode:
G28
QUAD_GANTRY_LEVEL
BED_MESH_CALIBRATE METHOD=rapid_scan
SET_GCODE_VARIABLE MACRO=VARIABLES VARIABLE=mesh_bed_temp VALUE={printer['heater_bed'].temperature}
MOVE_TO_PURGE_BUCKET
[gcode_macro calibrate]
gcode:
{% set mesh_temp_leeway = printer["gcode_macro VARIABLES"].mesh_bed_temp_leeway %}
{% set mesh_temp = printer["gcode_macro VARIABLES"].mesh_bed_temp %}
{% set skip_mesh = params.SKIP_MESH|default(False)%}
{% if "xyz" not in printer['toolhead'].homed_axes %}
G28
{% endif %}
{% if not printer['quad_gantry_level'].applied %}
QUAD_GANTRY_LEVEL
{% endif %}
 
{action_respond_info((not printer['bed_mesh'].profile_name)|string)}
{% if skip_mesh %}
G0 X239 Y210 F{700*60}
# if a bed mesh has not been performed, or the temperature hasn't changed by more than 15 degrees.
{% elif ((not printer['bed_mesh'].profile_name) or
(printer['heater_bed'].temperature <= mesh_temp - mesh_temp_leeway) or
(printer['heater_bed'].temperature >= mesh_temp + mesh_temp_leeway)) %}
G0 X15 Y22 F{700*60}
BED_MESH_CALIBRATE METHOD=rapid_scan
SET_GCODE_VARIABLE MACRO=VARIABLES VARIABLE=mesh_bed_temp VALUE={printer['heater_bed'].temperature}
 
G0 X239 Y210 F{700*60}
{% endif %}
MOVE_TO_PURGE_BUCKET
 
####### PRINT START AND STOP ETC
[gcode_macro START_PRINT]
description: Runs before the start of a print. Checks print readyness, corrects if nessesary, and primes the nozzle.
gcode:
{% set svv = printer.save_variables.variables %}
# check the state of the loaded filament
{% if svv.filament_load_state in ["loaded", "primed"] and svv.filament_runout_state != "runout" %}
# if in auto, set bed and extruder to loaded filament parameters.
{% if svv.heater_mode == "auto" %}
SET_BED_TO_FILAMENT
SET_HOTEND_TO_FILAMENT POSITION=both
# if in slicer or manual mode, quickly sanity check the set temperatures:
{% else %}
{% if printer['extruder'].target <= 0 %}
{action_raise_error("Extruder temperature is set to at or below zero")}
{% endif %}
{% endif %}
 
# check calibration
# CALIBRATE SKIP_MESH=True
# {% if svv.filament_extruder != svv.filament_hotend %}
# PURGE_FILAMENT
# {% endif %}
# final enable of heaters and wait for temperature to be reached
SET_HEATERS_TO_FILAMENT_AND_WAIT
# CLEAN_NOZZLE
# CALIBRATE
# PRIME_FILAMENT
_CLIENT_LINEAR_MOVE E=2 F=600
# enable the encoder filament sensor
SET_FILAMENT_SENSOR SENSOR=bowden_encoder_sensor ENABLE=1
{% elif svv.filament_runout_state == "runout" %}
{action_raise_error("Error, filament in runout state")}
 
{% else %}
{action_raise_error("Error, filament not loaded. Filament is %s" % (svv.filament_state))}
{% endif %}
 
[gcode_macro stop_print]
gcode:
{% set z = params.Z|default(50)|int %} ; z hop amount
 
SET_FILAMENT_SENSOR SENSOR=bowden_encoder_sensor ENABLE=0
 
# reduce temperature of extruder by 10c to reduce oozing
SET_HEATER_TEMPERATURE HEATER=extruder TARGET={printer['extruder'].target - 10} MODE=auto
{% if (printer.gcode_move.position.z + z) < printer.toolhead.axis_maximum.z %} ; check that zhop doesn't exceed z max
G91 ; relative positioning
G1 Z{z} F900 ; raise Z up by z hop amount
{% else %}
G0 Z{printer.toolhead.axis_maximum.z}
{ action_respond_info("Pause zhop exceeds maximum Z height.") }
{% endif %}
G90 ; absolute positioning
G1 Y{258} F6000 ; park toolhead
 
 
[gcode_macro PAUSE]
description: Pause the actual running print
rename_existing: PAUSE_MAINSAIL
gcode:
# Parameters
{% set svv = printer.save_variables.variables %}
{% set z = params.Z|default(10)|int %} ; z hop amount
#{% set idle_timeout = client.idle_timeout|default({60*5}) %}
{% set idle_timeout = 60*5 %}
# if printer is not already paused...
{% if printer['pause_resume'].is_paused|int == 0 %}
# set variables for reference in resume macro
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=posx VALUE={printer['gcode_move'].gcode_position.x}
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=posy VALUE={printer['gcode_move'].gcode_position.y}
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=posz VALUE={printer['gcode_move'].gcode_position.z}
 
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=etemp VALUE={printer['extruder'].target}
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=btemp VALUE={printer['heater_bed'].target}
SAVE_GCODE_STATE NAME=PAUSE
PAUSE_MAINSAIL
# set a new idle_timeout value
SET_IDLE_TIMEOUT TIMEOUT={idle_timeout}
# {client.user_pause_macro|default("")}
# reduce temperature of extruder by 10c to reduce oozing if extruder is enabled
{% if svv.extruder_state == 'hot' %}
SET_HEATER_TEMPERATURE HEATER=extruder TARGET={printer['extruder'].target - 10} MODE=auto
{% endif %}
{% if (printer.gcode_move.position.z + z) < printer.toolhead.axis_maximum.z %} ; check that zhop doesn't exceed z max
G91 ; relative positioning
G1 Z{z} F900 ; raise Z up by z hop amount
{% else %}
G0 Z{printer.toolhead.axis_maximum.z}
{ action_respond_info("Pause zhop exceeds maximum Z height.") }
{% endif %}
G90 ; absolute positioning
G1 Y{258} F6000 ; park toolhead
SAVE_GCODE_STATE NAME=PAUSEPARK ; save parked position in case toolhead is moved during the pause (otherwise the return zhop can error)
{% endif %}
[gcode_macro RESUME]
description: Resume the actual running print
rename_existing: RESUME_MAINSAIL
variable_posx: 0
variable_posy: 0
variable_posz: 0
variable_zhop: 0
variable_etemp: 0
variable_btemp: 0
gcode:
# Parameters
{% set e = params.E|default(2.5)|int %} ; hotend prime amount (in mm)
{% 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("") == "" # no runout
else True if not printer[client.runout_sensor].enabled # sensor is disabled
else printer[client.runout_sensor].filament_detected %} # sensor status
{% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config
else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder
{% set do_resume = False %}
{% set prompt_txt = [] %}
 
# if printer is paused...
{% if printer['pause_resume'].is_paused|int == 1 %}
SET_IDLE_TIMEOUT TIMEOUT={printer.configfile.settings.idle_timeout.timeout} ; set timeout back to configured value
 
RESTORE_GCODE_STATE NAME=PAUSEPARK MOVE=1 MOVE_SPEED=200 ; go back to parked position in case toolhead was moved during pause (otherwise the return zhop can error)
 
# reset temperatures
{% if etemp > 0 %}
SET_HEATER_TEMPERATURE HEATER=extruder TARGET={etemp} MODE=auto
{% endif %}
{% if btemp > 0 %}
SET_HEATER_TEMPERATURE_AND_WAIT HEATER=heater_bed TARGET={btemp} MODE=auto
{% endif %}
{% if etemp > 0 %}
SET_HEATER_TEMPERATURE_AND_WAIT HEATER=extruder TARGET={etemp} MODE=auto ; Wait for hotend temp
{% endif %}
G91 ; relative positioning
M83 ; relative extruder positioning
{% if printer[printer.toolhead.extruder].temperature >= printer.configfile.settings.extruder.min_extrude_temp %}
G1 Z{zhop * -1} E{e} F900 ; prime nozzle by E, lower Z back down
{% else %}
G1 Z{zhop * -1} F900 ; lower Z back down without priming (just in case we are testing the macro with cold hotend)
{% endif %}
RESTORE_GCODE_STATE NAME=PAUSE MOVE=1 MOVE_SPEED=60 ; restore position
RESUME_MAINSAIL
{% endif %}
 
[gcode_macro CANCEL_PRINT]
rename_existing: CANCEL_PRINT_MAINSAIL
gcode:
{% set z = params.Z|default(10)|int %} ; z hop amount
 
SET_IDLE_TIMEOUT TIMEOUT={printer.configfile.settings.idle_timeout.timeout} ; set timeout back to configured value
CLEAR_PAUSE
CANCEL_PRINT_MAINSAIL
# reduce temperature of extruder by 10c to reduce oozing
SET_HEATER_TEMPERATURE HEATER=extruder TARGET={printer['extruder'].target - 10} MODE=auto
{% if (printer.gcode_move.position.z + z) < printer.toolhead.axis_maximum.z %} ; check that zhop doesn't exceed z max
G91 ; relative positioning
G1 Z{z} F900 ; raise Z up by z hop amount
{% else %}
G0 Z{printer.toolhead.axis_maximum.z}
{ action_respond_info("Pause zhop exceeds maximum Z height.") }
{% endif %}
G90 ; absolute positioning
G1 Y{258} F6000 ; park toolhead
# clear pause_next_layer and pause_at_layer as preparation for next print
SET_PAUSE_NEXT_LAYER ENABLE=0
SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0
 
 
## MISC MACROS
 
[gcode_macro DUMP_VARIABLES]
gcode:
{% set filter_name = params.NAME|default('')|string|lower %}
{% set filter_value = params.VALUE|default('')|string|lower %}
{% set show_cfg = params.SHOW_CFG|default(0)|int %}
{% set out = [] %}
 
{% for key1 in printer %}
{% for key2 in printer[key1] %}
{% if (show_cfg or not (key1|lower == 'configfile' and key2|lower in ['config', 'settings'])) and (filter_name in key1|lower or filter_name in key2|lower) and filter_value in printer[key1][key2]|string|lower %}
{% set dummy = out.append("printer['%s'].%s = %s" % (key1, key2, printer[key1][key2])) %}
{% endif %}
{% else %}
{% if filter_name in key1|lower and filter_value in printer[key1]|string|lower %}
{% set dummy = out.append("printer['%s'] = %s" % (key1, printer[key1])) %}
{% endif %}
{% endfor %}
{% endfor %}
{action_respond_info(out|join("\n"))}
 
[gcode_macro TEST_SPEED]
# Home, get position, throw around toolhead, home again.
# If MCU stepper positions (first line in GET_POSITION) are greater than a full step different (your number of microsteps), then skipping occured.
# We only measure to a full step to accomodate for endstop variance.
# Example: TEST_SPEED SPEED=300 ACCEL=5000 ITERATIONS=10
 
description: Test for max speed and acceleration parameters for the printer. Procedure: Home -> ReadPositionFromMCU -> MovesToolhead@Vel&Accel -> Home -> ReadPositionfromMCU
 
gcode:
# Speed
{% set speed = params.SPEED|default(printer.configfile.settings.printer.max_velocity)|int %}
# Iterations
{% set iterations = params.ITERATIONS|default(5)|int %}
# Acceleration
{% set accel = params.ACCEL|default(printer.configfile.settings.printer.max_accel)|int %}
# Minimum Cruise Ratio
{% set min_cruise_ratio = params.MIN_CRUISE_RATIO|default(0.5)|float %}
# Bounding inset for large pattern (helps prevent slamming the toolhead into the sides after small skips, and helps to account for machines with imperfectly set dimensions)
{% set bound = params.BOUND|default(20)|int %}
# Size for small pattern box
{% set smallpatternsize = SMALLPATTERNSIZE|default(20)|int %}
# Large pattern
# Max positions, inset by BOUND
{% set x_min = printer.toolhead.axis_minimum.x %}
{% if x_min < 0 %}
{% set x_min = 0 %}
{% endif %}
{% set y_min = printer.toolhead.axis_minimum.y %}
{% if y_min < 0 %}
{% set y_min = 0 %}
{% endif %}
{% set x_min = x_min + bound %}
{% set x_max = printer.toolhead.axis_maximum.x - bound %}
{% set y_min = y_min + bound %}
{% set y_max = printer.toolhead.axis_maximum.y - bound %}
# Small pattern at center
# Find X/Y center point
{% set x_center = (printer.toolhead.axis_minimum.x|float + printer.toolhead.axis_maximum.x|float ) / 2 %}
{% set y_center = (printer.toolhead.axis_minimum.y|float + printer.toolhead.axis_maximum.y|float ) / 2 %}
# Set small pattern box around center point
{% set x_center_min = x_center - (smallpatternsize/2) %}
{% set x_center_max = x_center + (smallpatternsize/2) %}
{% set y_center_min = y_center - (smallpatternsize/2) %}
{% set y_center_max = y_center + (smallpatternsize/2) %}
 
# Save current gcode state (absolute/relative, etc)
SAVE_GCODE_STATE NAME=TEST_SPEED
# Output parameters to g-code terminal
{ action_respond_info("TEST_SPEED: starting %d iterations at speed %d, accel %d" % (iterations, speed, accel)) }
# Home and get position for comparison later:
M400 # Finish moves - https://github.com/AndrewEllis93/Print-Tuning-Guide/issues/66
# QGL if not already QGLd (only if QGL section exists in config)
{% if printer.configfile.settings.quad_gantry_level %}
{% if printer.quad_gantry_level.applied == False %}
G28
QUAD_GANTRY_LEVEL
G28 Z
{% endif %}
{% endif %}
# Move 50mm away from max position and home again (to help with hall effect endstop accuracy - https://github.com/AndrewEllis93/Print-Tuning-Guide/issues/24)
G90
G1 X{printer.toolhead.axis_maximum.x-50} Y{printer.toolhead.axis_maximum.y-50} F{100*60}
M400 # Finish moves - https://github.com/AndrewEllis93/Print-Tuning-Guide/issues/66
G28 X Y
G0 X{printer.toolhead.axis_maximum.x-1} Y{printer.toolhead.axis_maximum.y-1} F{100*60}
G4 P1000
GET_POSITION
 
# Go to starting position
G0 X{x_min} Y{y_min} Z{bound + 10} F{speed*60}
 
# Set new limits
{% if printer.configfile.settings.printer.minimum_cruise_ratio is defined %}
SET_VELOCITY_LIMIT VELOCITY={speed} ACCEL={accel} MINIMUM_CRUISE_RATIO={min_cruise_ratio}
{% else %}
SET_VELOCITY_LIMIT VELOCITY={speed} ACCEL={accel} ACCEL_TO_DECEL={accel / 2}
{% endif %}
 
{% for i in range(iterations) %}
# Large pattern diagonals
G0 X{x_min} Y{y_min} F{speed*60}
G0 X{x_max} Y{y_max} F{speed*60}
G0 X{x_min} Y{y_min} F{speed*60}
G0 X{x_max} Y{y_min} F{speed*60}
G0 X{x_min} Y{y_max} F{speed*60}
G0 X{x_max} Y{y_min} F{speed*60}
# Large pattern box
G0 X{x_min} Y{y_min} F{speed*60}
G0 X{x_min} Y{y_max} F{speed*60}
G0 X{x_max} Y{y_max} F{speed*60}
G0 X{x_max} Y{y_min} F{speed*60}
# Small pattern diagonals
G0 X{x_center_min} Y{y_center_min} F{speed*60}
G0 X{x_center_max} Y{y_center_max} F{speed*60}
G0 X{x_center_min} Y{y_center_min} F{speed*60}
G0 X{x_center_max} Y{y_center_min} F{speed*60}
G0 X{x_center_min} Y{y_center_max} F{speed*60}
G0 X{x_center_max} Y{y_center_min} F{speed*60}
# Small pattern box
G0 X{x_center_min} Y{y_center_min} F{speed*60}
G0 X{x_center_min} Y{y_center_max} F{speed*60}
G0 X{x_center_max} Y{y_center_max} F{speed*60}
G0 X{x_center_max} Y{y_center_min} F{speed*60}
{% endfor %}
 
# Restore max speed/accel/accel_to_decel to their configured values
{% if printer.configfile.settings.printer.minimum_cruise_ratio is defined %}
SET_VELOCITY_LIMIT VELOCITY={printer.configfile.settings.printer.max_velocity} ACCEL={printer.configfile.settings.printer.max_accel} MINIMUM_CRUISE_RATIO={printer.configfile.settings.printer.minimum_cruise_ratio}
{% else %}
SET_VELOCITY_LIMIT VELOCITY={printer.configfile.settings.printer.max_velocity} ACCEL={printer.configfile.settings.printer.max_accel} ACCEL_TO_DECEL={printer.configfile.settings.printer.max_accel_to_decel}
{% endif %}
 
# Re-home and get position again for comparison:
M400 # Finish moves - https://github.com/AndrewEllis93/Print-Tuning-Guide/issues/66
# G28 # This is a full G28 to fix an issue with CoreXZ - https://github.com/AndrewEllis93/Print-Tuning-Guide/issues/12
# Go to XY home positions (in case your homing override leaves it elsewhere)
G90motors
G0 X{printer.toolhead.axis_maximum.x-1} Y{printer.toolhead.axis_maximum.y-1} F{100*60}
G4 P1000
GET_POSITION
 
# Restore previous gcode state (absolute/relative, etc)
RESTORE_GCODE_STATE NAME=TEST_SPEED
View
386
config/01_filament_management.cfg 0 → 100644
# filament states:
# is_ready_to_print -
# load_state
# hotend_filament - the filament currently in the hotend. Set to the current loaded filament
# loaded_filament - the filament spool which is currently connected to the extruder. Modifiable when filament is
# heater_state - cold, heating, heated
# if the heater state is 'heated' on printer boot,
# and the current hotend and bed temperature is within 15c of the set temperature, then turn the heaters back on.
 
[filaments]
on_set_filament_gcode:
# A list of G-Code commands to execute after the SET_FILAMENT macro runs. See
# docs/Command_Templates.md for G-Code format. These parameters are passed
# to the gcode:
# * 'EXTRUDER' - the name of the extruder. 'extruder', 'extruder1' etc.
# * 'T' - the integer index of the extruder
# * 'PRESET' - the filament preset that was just assigned to th extruder
# * 'LAST_PRESET' - the filament preset that was previously assigned to the extruder, if any
on_clear_filament_gcode:
# A list of G-Code commands to execute after the CLEAR_FILAMENT macro runs. See
# docs/Command_Templates.md for G-Code format. These parameters are pass to the gcode:
# * 'EXTRUDER' - the name of the extruder. 'extruder', 'extruder1' etc.
# * 'T' - the integer index of the extruder
# * 'LAST_PRESET' - the filament preset that was previously assigned to the extruder, if any
 
[gcode_macro QUERY_FILAMENT]
description: Prompts the user to select a filament, and sets the value of filament_extruder to that filament
gcode:
{% set response = params.RESPONSE|default(False) %}
{% set name = params.NAME|default(False) %}
{% set return_macro = params.RETURN_MACRO|default(False) %}
{% if not response %}
RESPOND TYPE=command MSG="action:prompt_begin Select Filament"
{% for filament_name in printer.filaments.presets|map(attribute='name',default='None') %}
RESPOND TYPE=command MSG="action:prompt_button {filament_name}|QUERY_FILAMENT {rawparams} NAME={filament_name} RESPONSE=True|primary"
{% endfor %}
RESPOND TYPE=command MSG="action:prompt_show"
{% else %}
# close the dialog
RESPOND TYPE=command MSG="action:prompt_end"
SET_EXTRUDER_FILAMENT NAME={name}
# if we've specified a return macro, run this next.
{% if return_macro %}
{return_macro}
{% endif %}
{% endif %}
 
[gcode_macro UNPRIME_FILAMENT]
description: Unprimes the filament, leaving it in a state where it can be unloaded without changing temperatures
gcode:
{% set svv = printer.save_variables.variables %}
{% set unload = params.UNLOAD|default(False) %}
{% if svv.filament_load_state == "primed" %}
# check if there is a valid value for the currently loaded filament. if not, prompt the user for it.
{% if svv.filament_extruder == 'None' %}
# if there isn't a set loaded filament, run QUERY_FILAMENT
QUERY_FILAMENT RETURN_MACRO=UNPRIME_FILAMENT
{% else %}
SET_FILAMENT_LOAD_STATE STATE="processing"
# tell the end macro wether to call the unload macro after this
SET_GCODE_VARIABLE MACRO=END_UNPRIME_FILAMENT VARIABLE=unload VALUE={unload}
# If the extruder was cold, keep it cold after finishing.
SET_GCODE_VARIABLE MACRO=END_UNPRIME_FILAMENT VARIABLE=etemp VALUE={printer['extruder'].target}
# set temperature of extruder
# if in auto mode, set temperature and wait. Otherwise wait for the set temperature if it it's above 25c.
{% if svv.heater_mode == "auto" %}
SET_TEMPERATURE_AND_WAIT HEATER=extruder TARGET={printer['extruder'].filament.extruder} MODE=auto
{% elif printer['extruder'].target > 25 %}
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={printer['extruder'].target|float - 1} MAXIMUM={printer['extruder'].target|float + 2}
{% endif %}
# run the loop to retract until the switch is no longer pressed
CLEAN_NOZZLE
# mini purge to ensure filament remains connected
_CLIENT_LINEAR_MOVE E=10 F={60*20}
_CLIENT_LINEAR_MOVE E=-30 F={60*30}
UPDATE_DELAYED_GCODE ID=LOOP_UNPRIME_FILAMENT DURATION=0.15
# retract filament until the button is no longer pressed
{% endif %}
{% else %}
{action_respond_info("unable to unprime filament. Current filament state: %s " %(svv.filament_load_state))}
{% endif %}
[delayed_gcode LOOP_UNPRIME_FILAMENT]
# Retracts filament until the extruder_exit button is no longer pressed
gcode:
{% if printer["gcode_button extruder_exit"].state == "PRESSED" %}
G0 E-2 F{20*60}
# retract by -2mm at 20mm/s (0.1s)
UPDATE_DELAYED_GCODE ID=LOOP_UNPRIME_FILAMENT DURATION=0.15
# really long wait here. Otherwise klipper gets angry and queues up moves or something.
{% else %}
END_UNPRIME_FILAMENT
{% endif %}
 
[gcode_macro END_UNPRIME_FILAMENT]
description: Called by LOOP_UNPRIME_FILAMENT, finishes up unpriming the filament.
variable_etemp = 0
variable_unload = False
gcode:
# set temperature to what it was before
SET_HEATER_TEMPERATURE HEATER='extruder' TARGET={etemp} MODE=auto
 
# set filament state
SET_FILAMENT_LOAD_STATE STATE="loaded"
 
# if we want to unload after this, do so
{% if unload %}
UNLOAD_FILAMENT
{% else %}
# reload filament by an extra 10mm to press the button again
_CLIENT_LINEAR_MOVE E=10 F={60*60}
{% endif %}
[gcode_macro UNLOAD_FILAMENT]
description: Unloads the current filament
gcode:
{% set svv = printer.save_variables.variables %}
# check against current filament state
{% if svv.filament_load_state == "loaded" %}
_CLIENT_LINEAR_MOVE E=-40 F={60*10}
{action_respond_info('fuck')}
SET_STEPPER_ENABLE STEPPER=extruder ENABLE=0
SET_FILAMENT_LOAD_STATE STATE="unloaded_waiting"
SET_EXTRUDER_FILAMENT NAME="None"
 
{% elif svv.filament_load_state == "primed" %}
{action_respond_info('shit')}
UNPRIME_FILAMENT UNLOAD=True
{% else %}
{action_respond_info("unable to unload filament. Current filament state: %s " %(svv.filament_load_state))}
{% endif %}
 
[gcode_macro LOAD_FILAMENT]
# loads filament after it has been detected in the entry sensor or manually triggered
gcode:
{% set svv = printer.save_variables.variables %}
{% set prompt = params.PROMPT|default(False) %}M84 E
{% set prime = params.PRIME|default(False) %}
# tell the end macro wether to call the prime macro after this
SET_GCODE_VARIABLE MACRO=END_LOAD_FILAMENT VARIABLE=prime VALUE={prime}
 
{% if not filament_state in ['unloaded'] %}
# forward the filament name to the next macro
SET_GCODE_VARIABLE MACRO=END_LOAD_FILAMENT VARIABLE=name VALUE="'{params.NAME}'"
# we could set it here, but it avoids weird states if the macro fails for some reason.
SET_FILAMENT_LOAD_STATE STATE="processing"
M83 # relative extruder moves
# load filament into extruder gear
UPDATE_DELAYED_GCODE ID=LOOP_LOAD_FILAMENT DURATION=0.15
{% else %}
{action_respond_info("unable to load filament. Current filament state: %s " %(svv.filament_load_state))}
{% endif %}
 
[delayed_gcode LOOP_LOAD_FILAMENT]
gcode:
{% if printer["gcode_button extruder_exit"].state == "RELEASED" %}
G0 E2 F{20*60}
# Extrude by 2mm at 20mm/s (0.1s)
UPDATE_DELAYED_GCODE ID=LOOP_LOAD_FILAMENT DURATION=0.15
# really long wait here. Otherwise klipper gets angry and queues up moves or something.
{% else %}
END_LOAD_FILAMENT
{% endif %}
 
 
[gcode_macro END_LOAD_FILAMENT]
variable_prime = False
variable_name = None
gcode:
{% set svv = printer.save_variables.variables %}
M82 # absolute extruder moves
# set loaded filament
SET_FILAMENT_LOAD_STATE STATE="loaded"
# check if there is a valid value for the currently loaded filament. if not, prompt the user for it.
{% if not svv.filament_extruder in printer.filaments.presets|map(attribute='name',default='yeet') %}
# if there isn't a set loaded filament, extrude a bit then run QUERY_FILAMENT
G0 E4 F{20*60}
QUERY_FILAMENT RETURN_MACRO=LOAD_FILAMENT
{% endif %}
 
{% if prime %}
PRIME_FILAMENT
{% endif %}
 
 
[gcode_macro PRIME_FILAMENT]
gcode:
{% set svv = printer.save_variables.variables %}
 
{% if svv.filament_load_state in ['unloaded', 'loaded', 'primed'] %}
# check if there is a valid value for the currently loaded filament. if not, prompt the user for it.
{% if not svv.filament_extruder in printer.filaments.presets|map(attribute='name',default='yeet') %}
# if there isn't a set loaded filament, run QUERY_FILAMENT
QUERY_FILAMENT RETURN_MACRO=PRIME_FILAMENT
{% elif svv.filament_load_state in ['unloaded'] %}
LOAD_FILAMENT PRIME=True
{% elif svv.filament_load_state in ['loaded', 'primed'] %}
# ensure that the filament in the hotend is the same as the filament in the extruder
{% if svv.filament_extruder == svv.filament_hotend %}
SET_HOTEND_TO_FILAMENT
MOVE_TO_PURGE_BUCKET
 
SET_HOTEND_TO_FILAMENT WAIT=True
 
# if the filament is only loaded, then extrude a bit to get it to the end of the extruder
{% if svv.filament_load_state in ['loaded'] %}
_CLIENT_LINEAR_MOVE E=25 F={60*20}
{% endif %}
_CLIENT_LINEAR_MOVE E=10 F={60*10}
_CLIENT_LINEAR_MOVE E={-printer['gcode_macro VARIABLES'].retraction_length} F={60*20}
 
CLEAN_NOZZLE
SET_FILAMENT_LOAD_STATE STATE=primed
{% else %}
{action_respond_info("unable to prime filament. Filament in hotend doesn't match current filament")}
{% endif %}
{% endif %}
{% else %}
{action_respond_info("unable to prime filament. Current filament state: %s " % (svv.filament_load_state))}
{% endif %}
[gcode_macro PURGE_FILAMENT]
gcode:
{% set svv = printer.save_variables.variables %}
 
{% if not svv.filament_extruder in printer.filaments.presets|map(attribute='name',default='yeet') %}
# if there isn't a set loaded filament, run QUERY_FILAMENT
QUERY_FILAMENT RETURN_MACRO=PURGE_FILAMENT
{% elif svv.filament_load_state in ["loaded", "primed"] %}
# if the filament is loaded or primed, then continue
SET_HOTEND_TO_FILAMENT POSITION=both
# move to purge bucket
MOVE_TO_PURGE_BUCKET
 
SET_HOTEND_TO_FILAMENT Wait=True POSITION=both
{% if svv.filament_load_state in ['loaded'] %}
_CLIENT_LINEAR_MOVE E=25 F={60*20}
{% endif %}
_CLIENT_LINEAR_MOVE E={printer['gcode_macro VARIABLES'].purge_line_length} F={60*10}
_CLIENT_LINEAR_MOVE E={-printer['gcode_macro VARIABLES'].retraction_length} F={60*20}
 
CLEAN_NOZZLE
SET_HOTEND_FILAMENT NAME={svv.filament_extruder}
SET_FILAMENT_LOAD_STATE STATE=primed
{% else %}
{action_respond_info("unable to purge filament. Current filament state: %s " %(svv.filament_load_state))}
{% endif %}
 
[gcode_macro MOVE_TO_PURGE_BUCKET]
gcode:
# move z to minimum of 6
{% if printer['gcode_move'].position.z < 6 %}
_CLIENT_LINEAR_MOVE Z=6 F={60*60} ABSOLUTE=1
{% endif %}
 
# move y out if necessary
{% if printer['gcode_move'].position.y > 254 %}
_CLIENT_LINEAR_MOVE Y=254 F={60*700} ABSOLUTE=1
{% endif %}
# move xy to purge bucket
_CLIENT_LINEAR_MOVE Y=254 X=25 F={60*700} ABSOLUTE=1
_CLIENT_LINEAR_MOVE Y=259 F={60*60} ABSOLUTE=1
[gcode_macro CLEAN_NOZZLE]
description: wipes filament off the nozzle
gcode:
MOVE_TO_PURGE_BUCKET
 
# wipe a few times
{% for x in range(2) %}
_CLIENT_LINEAR_MOVE X=55 F={60*700}
_CLIENT_LINEAR_MOVE X=-55 F={60*700}
{% endfor %}
 
[gcode_macro STABILIZE_NOZZLE]
description: tries to prevent the nozzle from leaking filament too much
gcode:
 
 
[gcode_button bowden_sensor]
pin: PF2
press_gcode:
{% set svv = printer.save_variables.variables %}
{ action_respond_info("bowden_load") } #DEBUG
# TODO - USER LOAD FILAMENT. Setup some sort of response? Maybe wake printer from sleep mode and turn on lights?
# can't switch back frgom near runout as the extruder can't grab further filament
 
release_gcode:
{% set svv = printer.save_variables.variables %}
{% if svv.filament_load_state in ['primed', 'loaded'] %}
{action_raise_error("Warning: bowden sensor released, nearing filament runout")}
# disable the encoder sensor
 
# TODO IMPLEMENT MORE WARNINGS.
{% elif svv.filament_load_state != 'unloaded' %}
{action_raise_error("Warning: bowden sensor released during nonsensical filament state.")}
{% endif %}
 
[filament_motion_sensor bowden_encoder_sensor]
detection_length: 10
extruder: extruder
switch_pin: ^PF3
pause_on_runout: False
insert_gcode:
runout_gcode:
# if the printer is both printing, and the bowden sensor is pressed, then pause print.
{% if (printer["gcode_button bowden_sensor"].state == "PRESSED") and
printer['print_stats'].state == "printing" %}
PAUSE
{% endif %}
# check if the bowden sensor is pressed
[gcode_button extruder_entry]
pin: printHead:PB7
press_gcode:
{% set svv = printer.save_variables.variables %}
{ action_respond_info("extruder_entry_insert") }
{% if svv.filament_load_state == 'unloaded' %}
LOAD_FILAMENT
{% endif %}
 
release_gcode:
{ action_respond_info("extruder_entry_release") }
{% set svv = printer.save_variables.variables %}
 
# if filament is loaded, check if it's running out or being unloaded
{% if svv.filament_load_state == 'loaded' %}
# runout
{% if printer['gcode_button extruder_exit'].state == PRESSED %}
{action_raise_error("Warning: extruder entry sensor released, filament runout")}
SET_FILAMENT_LOAD_STATE STATE="runout"
 
# pause printer on runout
{% if svv.printer_state == 'printing'%}
# PAUSE
{% endif %}
# being unloaded
{% else %}
SET_FILAMENT_LOAD_STATE STATE="unloaded"
{% endif %}
{% elif svv.filament_load_state == 'unloaded_waiting' %}
SET_FILAMENT_LOAD_STATE STATE="unloaded"
{% elif svv.filament_load_state != 'unloaded' %}
{action_raise_error("Warning: bowden sensor released during nonsensical filament state.")}
{% endif %}
 
[gcode_button extruder_exit]
pin: printHead:PB5
 
press_gcode:
{ action_respond_info("extruder_exit_insert") }
{% set svv = printer.save_variables.variables %}
 
# auto state update if the user is manually doing things
{% if svv.filament_load_state not in ['loaded', 'primed'] %}
SET_FILAMENT_LOAD_STATE STATE="loaded"
{% endif %}
 
 
release_gcode:
{ action_respond_info("extruder_exit_runout") }
{% set svv = printer.save_variables.variables %}
 
View
48
config/01_heater_management.cfg 0 → 100644
###### HEATER AUTO HANDLING
[gcode_macro SET_HEATERS_TO_FILAMENT_AND_WAIT]
description:
gcode:
{% set svv = printer.save_variables.variables %}
 
SET_HEATER_TEMPERATURE HEATER=extruder TARGET={svv.filaments|selectattr("name", "equalto", svv.filament_hotend)|map(attribute="extruder",default='None')|first|string} MODE=auto
SET_HEATER_TEMPERATURE_AND_WAIT HEATER=heater_bed TARGET={svv.filaments|selectattr("name", "equalto", svv.filament_hotend)|map(attribute="bed",default='None')|first|string} MODE=auto
SET_HEATER_TEMPERATURE_AND_WAIT HEATER=extruder TARGET={svv.filaments|selectattr("name", "equalto", svv.filament_hotend)|map(attribute="extruder",default='None')|first|string} MODE=auto
 
[gcode_macro SET_HOTEND_TO_FILAMENT]
description: sets the temperature of the hotend to the temperature required by the stored filament
gcode:
{% set wait = params.WAIT|default(False) %} ; z hop amount
{% set svv = printer.save_variables.variables %}
{% set position = params.POSITION|default('extruder')|string|lower %}
{% if wait %}
{% if position == 'extruder' %}
SET_HEATER_TEMPERATURE_AND_WAIT HEATER=extruder TARGET={svv.filaments|selectattr("name", "in", [svv.filament_extruder])|map(attribute="extruder",default='None')|max|string} MODE=auto
{% elif position == 'hotend' %}
SET_HEATER_TEMPERATURE_AND_WAIT HEATER=extruder TARGET={svv.filaments|selectattr("name", "in", [svv.filament_hotend])|map(attribute="extruder",default='None')|max|string} MODE=auto
{% elif position == 'both' %}
SET_HEATER_TEMPERATURE_AND_WAIT HEATER=extruder TARGET={svv.filaments|selectattr("name", "in", [svv.filament_hotend, svv.filament_extruder])|map(attribute="extruder",default='None')|max|string} MODE=auto
{% endif %}
{% else %}
{% if position == 'extruder' %}
SET_HEATER_TEMPERATURE HEATER=extruder TARGET={svv.filaments|selectattr("name", "in", [svv.filament_extruder])|map(attribute="extruder",default='None')|max|string} MODE=auto
{% elif position == 'hotend' %}
SET_HEATER_TEMPERATURE HEATER=extruder TARGET={svv.filaments|selectattr("name", "in", [svv.filament_hotend])|map(attribute="extruder",default='None')|max|string} MODE=auto
{% elif position == 'both' %}
SET_HEATER_TEMPERATURE HEATER=extruder TARGET={svv.filaments|selectattr("name", "in", [svv.filament_hotend, svv.filament_extruder])|map(attribute="extruder",default='None')|max|string} MODE=auto
{% endif %}
{% endif %}
[gcode_macro SET_BED_TO_FILAMENT]
description: sets the temperature of the bed to the temperature required by the stored filament
gcode:
{% set svv = printer.save_variables.variables %}
 
{% set position = params.POSITION|default('extruder')|string|lower %}
{% if position == 'extruder' %}
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={svv.filaments|selectattr("name", "in", [svv.filament_extruder])|map(attribute="bed",default='None')|max|string} MODE=auto
{% elif position == 'hotend' %}
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={svv.filaments|selectattr("name", "in", [svv.filament_hotend])|map(attribute="bed",default='None')|max|string} MODE=auto
{% elif position == 'both' %}
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={svv.filaments|selectattr("name", "in", [svv.filament_hotend, svv.filament_extruder])|map(attribute="bed",default='None')|max|string} MODE=auto
{% endif %}
View
config/calibration.cfg 0 → 100644
View
config/eddy.cfg
View
config/filament_sensors.cfg 100644 → 0
View
config/macros.cfg 100644 → 0
View
config/overrides.cfg
View
config/unused 100644 → 0
View
printer.cfg