########################################################################################################################
# Happy Hare MMU Software
#
# EDIT THIS FILE BASED ON YOUR SETUP
#
# Copyright (C) 2022-2025  moggieuk#6538 (discord)
#                          moggieuk@hotmail.com
# This file may be distributed under the terms of the GNU GPLv3 license.
#
# Goal: Happy Hare supporting MACRO configuration
#
# (\_/)
# ( *,*)
# (")_(") Happy Hare Ready
#
#
# Supporting set of macros supplied with Happy Hare can be customized by editing the macro "variables" declared here.
#
# This configuration will automatically retained and upgraded between releases (a backup of previous config files will
# always be made for your reference). If you want to customize macros beyond what is possible through these variables
# it is highly recommended you copy the macro to a new name and change the callback macro name in 'mmu_parameters.cfg'
# That way the default macros can still be upgraded but your customization will be left intact
#


# PERSISTED STATE ---------------------------------------------------------
# Happy Hare stores configuration and state in the klipper variables file.
# Since klipper can only be a single 'save_variables' file, if you already
# have one you will need to merge the two and point this appropriately.
#
[save_variables]
filename: ~/printer_data/config/mmu/mmu_vars.cfg


# NECESSARY KLIPPER OVERRIDES ---------------------------------------------
# ██╗  ██╗██╗     ██╗██████╗ ██████╗ ███████╗██████╗ 
# ██║ ██╔╝██║     ██║██╔══██╗██╔══██╗██╔════╝██╔══██╗
# █████╔╝ ██║     ██║██████╔╝██████╔╝█████╗  ██████╔╝
# ██╔═██╗ ██║     ██║██╔═══╝ ██╔═══╝ ██╔══╝  ██╔══██╗
# ██║  ██╗███████╗██║██║     ██║     ███████╗██║  ██║
# ╚═╝  ╚═╝╚══════╝╚═╝╚═╝     ╚═╝     ╚══════╝╚═╝  ╚═╝
#
# These supplemental settings essentially disable klipper's built in
# extrusion limits and is necessary when using an MMU
[extruder]
max_extrude_only_distance: 200
max_extrude_cross_section: 50

# For dialog prompts and progress in Mainsail. Requires Mainsail version >= v2.9.0
[respond]

# Other Happy Hare prerequisites. Harmless if already defined elsewhere in user config
[display_status]
[pause_resume]
[virtual_sdcard]
path: ~/printer_data/gcodes
#on_error_gcode: CANCEL_PRINT


# PRINT START/END ---------------------------------------------------------
# ██████╗ ██████╗ ██╗███╗   ██╗████████╗    ███████╗████████╗ █████╗ ██████╗ ████████╗
# ██╔══██╗██╔══██╗██║████╗  ██║╚══██╔══╝    ██╔════╝╚══██╔══╝██╔══██╗██╔══██╗╚══██╔══╝
# ██████╔╝██████╔╝██║██╔██╗ ██║   ██║       ███████╗   ██║   ███████║██████╔╝   ██║   
# ██╔═══╝ ██╔══██╗██║██║╚██╗██║   ██║       ╚════██║   ██║   ██╔══██║██╔══██╗   ██║   
# ██║     ██║  ██║██║██║ ╚████║   ██║       ███████║   ██║   ██║  ██║██║  ██║   ██║   
# ╚═╝     ╚═╝  ╚═╝╚═╝╚═╝  ╚═══╝   ╚═╝       ╚══════╝   ╚═╝   ╚═╝  ╚═╝╚═╝  ╚═╝   ╚═╝   
#   (base/mmu_software.cfg)
#
[gcode_macro _MMU_SOFTWARE_VARS]
description: Happy Hare optional configuration for print start/end checks
gcode: # Leave empty

# These variables control the behavior of the MMU_START_SETUP and MMU_START_LOAD_INITIAL_TOOL macros
variable_user_pre_initialize_extension      : ''	; Executed at start of MMU_START_SETUP. Commonly G28 to home
variable_home_mmu                           : False	; True/False, Whether to home mmu before print starts
variable_check_gates                        : True	; True/False, Whether to check filament is loaded in all gates used
variable_load_initial_tool                  : True	; True/False, Whether to automatically load initial tool
#
# Automapping strategy to apply slicer tool map to find matching MMU gate (will adjust tool-to-gate map). Options are:
#   'none'           - don't automap (i.e. don't update tool-to-gate map)
#   'filament_name'  - exactly match on case insensitive filament name
#   'material'       - exactly match on material
#   'color'          - exactly match on color (with same material)
#   'closest_color'  - match to closest available filament color (with same material)
#   'spool_id'       - exactly match on spool_id  [FUTURE]
variable_automap_strategy                   : "none"	; none|filament_name|material|color|closest_color|spool_id

# These variables control the behavior of the MMU_END macro
variable_user_print_end_extension           : ''	; Executed at start of MMU_END. Good place to move off print
variable_unload_tool                        : True	; True/False, Whether to unload the tool at the end of the print
variable_reset_ttg                          : False	; True/False, Whether reset TTG map at end of print
variable_dump_stats                         : True	; True/False, Whether to display print stats at end of print


# STATE MACHINE CHANGES ---------------------------------------------------
# ███████╗████████╗ █████╗ ████████╗███████╗     ██████╗██╗  ██╗ █████╗ ███╗   ██╗ ██████╗ ███████╗
# ██╔════╝╚══██╔══╝██╔══██╗╚══██╔══╝██╔════╝    ██╔════╝██║  ██║██╔══██╗████╗  ██║██╔════╝ ██╔════╝
# ███████╗   ██║   ███████║   ██║   █████╗      ██║     ███████║███████║██╔██╗ ██║██║  ███╗█████╗  
# ╚════██║   ██║   ██╔══██║   ██║   ██╔══╝      ██║     ██╔══██║██╔══██║██║╚██╗██║██║   ██║██╔══╝  
# ███████║   ██║   ██║  ██║   ██║   ███████╗    ╚██████╗██║  ██║██║  ██║██║ ╚████║╚██████╔╝███████╗
# ╚══════╝   ╚═╝   ╚═╝  ╚═╝   ╚═╝   ╚══════╝     ╚═════╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝  ╚═══╝ ╚═════╝ ╚══════╝
#   (base/mmu_state.cfg)
#
[gcode_macro _MMU_STATE_VARS]
description: Happy Hare configuration for state change hooks
gcode: # Leave empty

# You can extend functionality to all Happy Hare state change or event
# macros by adding a command (or call to your gcode macro).
# E.g for additional LED logic or consumption counters
variable_user_action_changed_extension      : ''	; Executed after default logic with duplicate params
variable_user_print_state_changed_extension : ''	; Executed after default logic with duplicate params
variable_user_mmu_event_extension           : ''	; Executed after default logic with duplicate params

# Maintenance warning limits (consumption counters)
variable_servo_down_limit                   : 5000      ; Set to -1 for no limit / disable warning
variable_cutter_blade_limit                 : 3000      ; Set to -1 for no limit / disable warning


# LED CONTROL -------------------------------------------------------------
# ██╗     ███████╗██████╗ ███████╗
# ██║     ██╔════╝██╔══██╗██╔════╝
# ██║     █████╗  ██║  ██║███████╗
# ██║     ██╔══╝  ██║  ██║╚════██║
# ███████╗███████╗██████╔╝███████║
# ╚══════╝╚══════╝╚═════╝ ╚══════╝
# Only configure if you have LEDs installed. The led_effects option is
# automatically ignored if led-effects klipper module is not installed
#   (base/mmu_led.cfg)
#
[gcode_macro _MMU_LED_VARS]
description: Happy Hare led macro configuration variables
gcode: # Leave empty

# Default effects for LED segments when not providing action status
#   'off'             - LED's off
#   'on'              - LED's white
#   'gate_status'     - indicate gate availability / status            (printer.mmu.gate_status)
#   'filament_color'  - display filament color defined in gate map     (printer.mmu.gate_color_rgb)
#   'slicer_color'    - display slicer defined set color for each gate (printer.mmu.slicer_color_rgb)
#   'r,g,b'           - display static r,g,b color e.g. "0,0,0.3" for dim blue
#   '_effect_'        - display the named led effect
#
variable_led_enable             : True			; True = LEDs are enabled at startup (MMU_LED can control), False = Disabled
variable_led_animation          : True			; True = Use led-animation-effects, False = Static LEDs
variable_default_exit_effect    : "gate_status"		;    off|gate_status|filament_color|slicer_color|r,g,b|_effect_
variable_default_entry_effect   : "filament_color"	;    off|gate_status|filament_color|slicer_color|r,g,b|_effect_
variable_default_status_effect  : "filament_color"	; on|off|gate_status|filament_color|slicer_color|r,g,b|_effect_
variable_default_logo_effect    : "0,0,.3"		;    off                                        |r,g,b|_effect_
variable_white_light            : (1, 1, 1)		; RGB color for static white light
variable_black_light            : (.01, 0, .02)		; RGB color used to represent "black" (filament)
variable_empty_light            : (0, 0, 0)		; RGB color used to represent empty gate


# SEQUENCE MACRO - PARKING MOVEMENT AND TOOLCHANGE CONTROL ----------------
# ███╗   ███╗ ██████╗ ██╗   ██╗███████╗███╗   ███╗███████╗███╗   ██╗████████╗
# ████╗ ████║██╔═══██╗██║   ██║██╔════╝████╗ ████║██╔════╝████╗  ██║╚══██╔══╝
# ██╔████╔██║██║   ██║██║   ██║█████╗  ██╔████╔██║█████╗  ██╔██╗ ██║   ██║   
# ██║╚██╔╝██║██║   ██║╚██╗ ██╔╝██╔══╝  ██║╚██╔╝██║██╔══╝  ██║╚██╗██║   ██║   
# ██║ ╚═╝ ██║╚██████╔╝ ╚████╔╝ ███████╗██║ ╚═╝ ██║███████╗██║ ╚████║   ██║   
# ╚═╝     ╚═╝ ╚═════╝   ╚═══╝  ╚══════╝╚═╝     ╚═╝╚══════╝╚═╝  ╚═══╝   ╚═╝   
# Configure carefully if you 'enable_park: True'
#   (base/mmu_sequence.cfg)
#
[gcode_macro _MMU_SEQUENCE_VARS]
description: Happy Hare sequence macro configuration variables
gcode: # Leave empty

# Parking and movement controls:
# Happy Hare defines 7 operations that may require parking. You can specify
# whether to park for each of those operations both during a print and
# standalone (not printing) with Happy Hare or when HH is disabled:
#
#  enable_park_printing
#    This is a list of the operations that should result in toolhead parking
#    while in a print. There are really two main starting points from which
#    you can customize. If using the slicer to form tips (and toolchange is
#    over the wipetower) you don't want to park on "toolchange" but you would
#    want to on "runout" which is a forced toolchange unknown by the slicer.
#    Typically you would also want to park at least on pause, cancel and
#    complete if not done elsewhere
#
#  enabled_park_standalone
#    List of the operations that should result in toolhead parking when not
#    printing, for example, just manipulating the MMU manually or via
#    Klipperscreen. Really it is up to you to choose based on personal
#    workflow preferences but this defaults to just 'pause,cancel'
#    (i.e. disabled for toolchange)
#
#  enabled_park_disabled
#    List of the operations that should result in toolhead parking when MMU is
#    disabled (MMU ENABLE=0) and using Happy Hare client macros. Note that only
#    pause and cancel can occur in this mode and would typically be enabled
#
# The operations are as follows:
#   toolchange - normal toolchange initiated with Tx or MMU_CHANGE_TOOL command
#   runout     - when a forced toolchange occurs as a result of runout
#   load       - individual MMU_LOAD operation
#   unload     - individual MMU_UNLOAD/MMU_EJECT operation
#   complete   - when print is complete (Happy Hare enabled)
#   pause      - a regular klipper PAUSE
#   cancel     - a regular klipper CANCEL_PRINT
#
# It is possible to call the parking macro manually in this form should you wish
# to include in your macros.
#
#    _MMU_PARK FORCE_PARK=1 X=10 Y=10 Z_HOP=5
#
# restore_xy_pos
#    Controls where the toolhead (x,y) is returned to after an operation that
#    invokes a parking move:
#   last - return to original position before park (frequently the default)
#   next - return to next print position if possible else last logic will be applied.
#          In print this reduces dwell time at the last position reducing blobbing
#          and unnecessary movement. Only applied to "toolchange" operation
#   none - the toolhead is left wherever it ends up after change. In a print the
#          next gcode command will restore toolhead x,y position
#
# Notes:
# - The starting z-height will always be restored, thus the different between 'next'
#   and 'none' is the z-height at which the (x,y) move occurs and the location of
#   of any un-retract
# - The default parking logic is a straight line move to the 'park_*' position.
#   To implement fancy movement and control you can specify your own
#   'user_park_move_macro' to use instead of default straight line move
#
# Retraction can be used to optimize stringing and blobs that can occur when
# changing tools and are active only during a print.
# IMPORTANT: For toolchanging the config order would be:
#   1. In mmu_parameters.cfg configure extruder dimensions like
#      'toolhead_extruder_to_nozzle',etc. These are based on geometry.
#   2. In mmu_parameters.cfg tweak 'toolhead_ooze_reduction' only if necessary
#      so that filament _just_ appears at the nozzle on load
#   3. Only then, adjust retraction to control stringing and blobs when
#      changing tool in a print
variable_enable_park_printing   : 'toolchange,runout,load,unload,complete,pause,cancel'	; Empty '' to disable parking
variable_enable_park_standalone : 'toolchange,load,unload,pause,cancel'			; Empty '' to disable parking
variable_enable_park_disabled   : 'pause,cancel'					; Empty '' to disable parking

variable_min_toolchange_z       : 1.0		; The absolute minimum safety floor (z-height) for ALL parking moves

# These specify the parking location, z_hop and retraction for all enabled operation
# types. Each must be 5 values:
#   x_coord, y_coord, z_hop(delta), z_hop_ramp, retraction length
# Use -1,-1 for no x,y move (you can just have z_hop). Use 0 for no z_hop
# The z_hop ramp is the horizontal distance in mm to travel during the lift. The
# direction is automatic and only applied if lifting the first time from print.
# This move is useful to help break the filament "string"
variable_park_toolchange        : -1, -1, 1,  5, 2	; x,y,z-hop,z_hop_ramp,retract for "toolchange" operations (toolchange,load,unload)
variable_park_runout            : -1, -1, 1,  5, 2	; x,y,z-hop,z_hop_ramp,retract
variable_park_pause             : 50, 50, 5,  0, 2	; x,y,z-hop,z_hop_ramp,retract (park position when mmu error occurs)
variable_park_cancel            : -1, -1, 10, 0, 5	; x,y,z-hop,z_hop_ramp,retract
variable_park_complete          : 50, 50, 10, 0, 5	; x,y,z-hop,z_hop_ramp,retract

# For toolchange operations, this allows to you to specify additional parking moves
# at various stages of the toolchange. Each must have 3 values:
#   x_coord, y_coord, z_hop(delta)
# Use -1,-1,0 for no movement at that stage (no-op).
# All movement will be at the established movement plane (z-height)
variable_pre_unload_position    : -1, -1, 0	; x,y,z-hop position before unloading starts
variable_post_form_tip_position : -1, -1, 0	; x,y,z-hop position after form/cut tip on unload
variable_pre_load_position      : -1, -1, 0	; x,y,z-hop position before loading starts

variable_restore_xy_pos         : "last"	; last|next|none - What x,y position the toolhead should travel to after a "toolchange"

variable_park_travel_speed      : 200		; Speed for any travel movement XY(Z) in mm/s
variable_park_lift_speed        : 15		; Z-only travel speed in mm/s
variable_retract_speed          : 30		; Speed of the retract move in mm/s
variable_unretract_speed        : 30		; Speed of the unretract move in mm/s

# ADVANCED: Normally x,y moves default to 'G1 X Y' to park position. This allows
# you to create exotic movements. Macro will be provided the following parameters:
#    YOUR_MOVE_MACRO X=<x_coord> Y=<y_coord> F=<speed>
# when restoring the from parked postion the same macro is called but passed a RESTORE=1 parameter, along with co-ordinates to restore to
#    YOUR_MOVE_MACRO RESTORE=1 X=<x_coord> Y=<y_coord> F=<speed>
variable_user_park_move_macro   : ''		; Executed instead of default 'G1 X Y move' to park position

variable_auto_home              : True		; True = automatically home if necessary, False = disable
variable_timelapse              : False		; True = take frame snapshot after load, False = disable

# Instead of completely defining your your own macros you can can extend functionality
# of default sequence macros by adding a command (or call to your gcode macro)
variable_user_mmu_error_extension     : ''	; Executed after default logic when mmu error condition occurs
variable_user_pre_unload_extension    : ''	; Executed after default logic
variable_user_post_form_tip_extension : ''	; Executed after default logic
variable_user_post_unload_extension   : ''	; Executed after default logic
variable_user_pre_load_extension      : ''	; Executed after default logic
variable_user_post_load_extension     : ''	; Executed after default logic but before restoring toolhead position


# CUT_TIP -----------------------------------------------------------------
#  ██████╗██╗   ██╗████████╗    ████████╗██╗██████╗ 
# ██╔════╝██║   ██║╚══██╔══╝    ╚══██╔══╝██║██╔══██╗
# ██║     ██║   ██║   ██║          ██║   ██║██████╔╝
# ██║     ██║   ██║   ██║          ██║   ██║██╔═══╝ 
# ╚██████╗╚██████╔╝   ██║          ██║   ██║██║     
#  ╚═════╝ ╚═════╝    ╚═╝          ╚═╝   ╚═╝╚═╝     
# Don't need to configure if using tip forming
#   (base/mmu_cut_tip.cfg)
#
[gcode_macro _MMU_CUT_TIP_VARS]
description: Happy Hare toolhead tip cutting macro configuration variables
gcode: # Leave empty

# Whether the toolhead tip cutting macro will return toolhead to initial position
# after the cut is complete. If using parking logic it is better to disable this
variable_restore_position       : False		; True = return to initial position, False = don't return

# Distance from the internal nozzle tip to the cutting blade. This dimension
# is based on your toolhead and should not be used for tuning
# Note: If you have a toolhead sensor this variable can be automatically determined!
# Read https://github.com/moggieuk/Happy-Hare/wiki/Blobing-and-Stringing
variable_blade_pos              : 37.5		; TUNE ME: Distance in mm from internal nozzle tip

# Distance to retract prior to making the cut, measured from the internal nozzle
# tip. This reduces wasted filament (left behind in extruder) but might cause a
# clog if set too large. This must be less than 'blade_pos'
# Note: the residual filament left in nozzle ('toolhead_ooze_reduction') is
# subtracted from this value so make sure toolhead is calibrated
variable_retract_length         : 32.5		; TUNE ME: 5mm less than 'blade_pos' is a good starting point

# Whether to perform a simple tip forming move after the initial retraction
# Enabling this adds gives some additional cooling time of molten filament and
# may help avoid potential clogging on some hotends
variable_simple_tip_forming     : True		; True = Perform simple tip forming, False = skip

# This should be the position of the toolhead where the cutter arm just
# lightly touches the depressor pin
variable_cutting_axis		: "x"		; "x" or "y". Determines cut direction (axis) during cut motion, used for park distance
variable_pin_loc_xy             : 14, 250	; x,y coordinates of depressor pin

# This distance is added to "pin_loc_x" or "pin_loc_y" depending on the 'cutting_axis'
# to determine the starting position and to create a small safety distance that aids
# in generating momentum
variable_pin_park_dist          : 5.0		; Distance in mm

# Position of the toolhead when the cutter is fully compressed. Should leave a small headroom from the
# extremes of your printer edges (e.g. it should be a bit larger than 0, or whatever Xmin is) to avoid
# banging the toolhead or gantry. Typically x position will match x in pin_loc_xy if cutting in y direction
# or y position will match y in pin_loc_xy if cutting in x direction, but diagonal cuts are possible
variable_pin_loc_compressed_xy  : 0.5, 250	; x,y coordinates of fully depressed location

# Retract length and speed after the cut so that the cutter blade doesn't
# get stuck on return to origin position
variable_rip_length             : 1.0		; Distance in mm to retract to aid lever decompression (>= 0)
variable_rip_speed              : 3		; Speed mm/s

# Pushback of the remaining tip from the cold end into the hotend. This does
# not have to push back all the way, just sufficient to ensure filament fragment
# stays in hot end and the "nail head" of the cut is pushed back past the
# PTFE/metal junction so it cannot cause clogging problems on future loads.
# Cannot be larger than 'retract_length' - `toolhead_ooze_reduction`
variable_pushback_length        : 15.0		; TUNE ME: PTFE tube length + 3mm is good starting point
variable_pushback_dwell_time    : 0		; Time in ms to dwell after the pushback

# Speed related settings for tip cutting
# Note that if the cut speed is too fast, the steppers can lose steps.
# Therefore, for a cut:
# - We first make a fast move to accumulate some momentum and get the cut
#   blade to the initial contact with the filament
# - We then make a slow move for the actual cut to happen
variable_travel_speed           : 150		; Speed mm/s
variable_cut_fast_move_speed    : 32		; Speed mm/s
variable_cut_slow_move_speed    : 8		; Speed mm/s
variable_evacuate_speed         : 150		; Speed mm/s
variable_cut_dwell_time         : 50		; Time in ms to dwell at the cut point
variable_cut_fast_move_fraction : 1.0		; Fraction of the move that uses fast move
variable_extruder_move_speed    : 25		; Speed mm/s for all extruder movement

# Safety margin for fast vs slow travel. When traveling to the pin location
# we make a safer but longer move if we are closer to the pin than this
# specified margin. Usually setting these to the size of the toolhead
# (plus a small margin) should be good enough
variable_safe_margin_xy         : 30, 30	; Approx toolhead width +5mm, height +5mm)

# If gantry servo option is installed, enable the servo and set up and down
# angle positions
variable_gantry_servo_enabled   : False		; True = enabled, False = disabled
variable_gantry_servo_down_angle: 55		; Angle for when pin is deployed
variable_gantry_servo_up_angle  : 180		; Angle for when pin is retracted


# FORM_TIP ----------------------------------------------------------------
# ███████╗ ██████╗ ██████╗ ███╗   ███╗    ████████╗██╗██████╗ 
# ██╔════╝██╔═══██╗██╔══██╗████╗ ████║    ╚══██╔══╝██║██╔══██╗
# █████╗  ██║   ██║██████╔╝██╔████╔██║       ██║   ██║██████╔╝
# ██╔══╝  ██║   ██║██╔══██╗██║╚██╔╝██║       ██║   ██║██╔═══╝ 
# ██║     ╚██████╔╝██║  ██║██║ ╚═╝ ██║       ██║   ██║██║     
# ╚═╝      ╚═════╝ ╚═╝  ╚═╝╚═╝     ╚═╝       ╚═╝   ╚═╝╚═╝     
# Don't need to configure if using tip cutting
#   (base/mmu_form_tip.cfg)
#
[gcode_macro _MMU_FORM_TIP_VARS]
description: Happy Hare tip forming macro configuration variables
gcode: # Leave empty

# Step 1 - Ramming
# Ramming is the initial squeeze of filament prior to cooling moves and is
# described in terms of total volume and progression of squeeze intensity
# printing/standalone. This can be separately controlled when printing or
# standalone
variable_ramming_volume            : 0		; Volume in mm^3, 0 = disabled (optionally let slicer do it)
variable_ramming_volume_standalone : 0		; Volume in mm^3, 0 = disabled

# Optionally set for temperature change (reduction). The wait will occur
# before nozzle separation if 'use_fast_skinnydip: False' else after cooling
# moves. Temperature will be restored after tip creation is complete
variable_toolchange_temp        : 0		; 0 = don't change temp, else temp to set
variable_toolchange_fan_assist  : False		; Whether to use part cooling fan for quicker temp change
variable_toolchange_fan_speed   : 50		; Fan speed % if using fan_assist enabled

# Step 2 - Nozzle Separation
# The filament is then quickly separated from the meltzone by a fast movement
# before then slowing to travel the remaining distance to cooling tube. The
# initial fast movement should be as fast as extruder can comfortably perform.
# A good starting point# for slower move is unloading_speed_start/cooling_moves.
# Too fast a slower movement can lead to excessively long tips or hairs
variable_unloading_speed_start  : 80		; Speed in mm/s for initial fast movement
variable_unloading_speed        : 18		; Speed in mm/s for slow move to cooling zone

# Step 3 - Cooling Moves
# The cooling move allows the filament to harden while constantly moving back
# and forth in the cooling tube portion of the extruder to prevent a bulbous
# tip forming. The cooling tube position is measured from the internal nozzle
# to just past the top of the heater block (often it is beneficial to add a
# couple of mm to ensure the tip is in the cooling section. The cooling tube
# length is then the distance from here to top of heatsink (this is the length
# length of the cooling moves). The final cooling move is a fast movement to
# break the string formed.
variable_cooling_tube_position  : 35		; Start of cooling tube. DragonST:35, DragonHF:30, Mosquito:30, Revo:35, RapidoHF:27
variable_cooling_tube_length    : 10		; Movement length. DragonST:15, DragonHF:10, Mosquito:20, Revo:10, RapidoHF:10
variable_initial_cooling_speed  : 10		; Initial slow movement (mm/s) to solidify tip and cool string if formed
variable_final_cooling_speed    : 50		; Fast movement (mm/s) Too fast: tip deformation on eject, Too Slow: long string/no separation
variable_cooling_moves          : 4		; Number of back and forth cooling moves to make (2-4 is a good start)

# Step 4 - Skinnydip
# Skinnydip is an advanced final move that may have benefit with some
# material like PLA to burn off persistent very fine hairs. To work the
# depth of insertion is critical (start with it disabled and tune last)
# For reference the internal nozzle would be at a distance of
# cooling_tube_position + cooling_tube_length, the top of the heater
# block would be cooling_tube_length away.
variable_use_skinnydip          : False		; True = enable skinnydip, False = skinnydip move disabled
variable_skinnydip_distance     : 30		; Distance to reinsert filament into hotend starting from end of cooling tube
variable_dip_insertion_speed    : 30		; Medium/Slow insertion speed mm/s - Just long enough to melt the fine hairs, too slow will pull up molten filament
variable_dip_extraction_speed   : 70		; Speed mm/s - Around 2x Insertion speed to prevents forming new hairs
variable_melt_zone_pause        : 0		; Pause if melt zone in ms. Default 0
variable_cooling_zone_pause     : 0		; Pause if cooling zone after dip in ms. Default 0
variable_use_fast_skinnydip     : False		; False = Skip the toolhead temp change wait during skinnydip move

# Step 5 - Parking
# Park filament ready to eject
variable_parking_distance       : 0		; Position mm to park the filament at end of tip forming, 0 = leave where filament ends up after tip forming
variable_extruder_eject_speed   : 25		; Speed mm/s used for parking_distance (and final_eject when testing)


# CLIENT MACROS -----------------------------------------------------------
# ██████╗  █████╗ ██╗   ██╗███████╗███████╗    ██████╗ ███████╗███████╗██╗   ██╗███╗   ███╗███████╗
# ██╔══██╗██╔══██╗██║   ██║██╔════╝██╔════╝    ██╔══██╗██╔════╝██╔════╝██║   ██║████╗ ████║██╔════╝
# ██████╔╝███████║██║   ██║███████╗█████╗      ██████╔╝█████╗  ███████╗██║   ██║██╔████╔██║█████╗  
# ██╔═══╝ ██╔══██║██║   ██║╚════██║██╔══╝      ██╔══██╗██╔══╝  ╚════██║██║   ██║██║╚██╔╝██║██╔══╝  
# ██║     ██║  ██║╚██████╔╝███████║███████╗    ██║  ██║███████╗███████║╚██████╔╝██║ ╚═╝ ██║███████╗
# ╚═╝     ╚═╝  ╚═╝ ╚═════╝ ╚══════╝╚══════╝    ╚═╝  ╚═╝╚══════╝╚══════╝ ╚═════╝ ╚═╝     ╚═╝╚══════╝
# If using the recommended PAUSE/RESUME/CANCEL_PRINT macros shipped with
# Happy Hare these variables allow for customization and basic extension
# Note that most parameters are pulled from the "movement" (sequence)
# macro above and thus these are supplemental a
#   (optional/client_macros.cfg)
#
[gcode_macro _MMU_CLIENT_VARS]
description: Happy Hare client macro configuration variables
gcode: # Leave empty

variable_reset_ttg_on_cancel    : False		; True/False, Whether reset TTG map if print is canceled
variable_unload_tool_on_cancel  : False		; True/False, Whether to unload the tool on cancel

# You can extend functionality by adding a command (or call to your gcode macro)
variable_user_pause_extension   : ''		; Executed after the klipper base pause
variable_user_resume_extension  : ''		; Executed before the klipper base resume
variable_user_cancel_extension  : ''		; Executed before the klipper base cancel_print


###########################################################################
# Tool change macros
# This is automatically created on installation but you can increase or
# reduce this list to match your number of tools in operation
# Note: it is annoying to have to do this but interfaces like Mainsail rely
# on real macro definitions for tools to be visible in the UI
#
[gcode_macro T0]
gcode: MMU_CHANGE_TOOL TOOL=0
[gcode_macro T1]
gcode: MMU_CHANGE_TOOL TOOL=1
[gcode_macro T2]
gcode: MMU_CHANGE_TOOL TOOL=2
[gcode_macro T3]
gcode: MMU_CHANGE_TOOL TOOL=3
[gcode_macro T4]
gcode: MMU_CHANGE_TOOL TOOL=4
[gcode_macro T5]
gcode: MMU_CHANGE_TOOL TOOL=5
[gcode_macro T6]
gcode: MMU_CHANGE_TOOL TOOL=6
[gcode_macro T7]
gcode: MMU_CHANGE_TOOL TOOL=7