[gcode_macro START_PRINT]
gcode:
    {% set BED_TEMP = params.T_BED|default(60)|float %}
    {% set EXTRUDER_TEMP = params.T_EXTRUDER|default(240)|float %}
    
    # Set and wait for bed to reach temperature
    
    SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={BED_TEMP}
    TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={BED_TEMP-3} MAXIMUM={BED_TEMP+3}

    # Home X and Y axes in the correct order
    G28 X Y
    WIPE_NOZZLE

    # Home Z and perform bed mesh calibration
    G28 Z
    BED_MESH_CALIBRATE

    # Move to bucket to wait for hotend heating up
    
    G1 X60 Y240 F10000
    G1 Y267 F3000

    SET_HEATER_TEMPERATURE HEATER=extruder TARGET={EXTRUDER_TEMP}
    TEMPERATURE_WAIT SENSOR=extruder MINIMUM={EXTRUDER_TEMP-5}

    # Wipe nozzle

    G1 X95 F10000
    G1 X75 F10000
    G1 X95 F10000
    G1 X75 F10000
    G1 X95 F5000
    G1 X128 F10000
    G1 Y240 F10000

    # Purge Line

    LINE_PURGE

[gcode_macro END_PRINT]
gcode:
    # Ensure the printer is in absolute positioning
    G90
    # Move to the purge bucket position
    M104 S0 ## turn off hotend
    M140 S0 ## turn off bed
    M204
    M106 S0 ## turn off fans
    #G1 X60 Y240 F20000
    #G1 Y265 F3000
    #G1 E-5 F1000
    #G1 Z150 F1000
    #G1 X95 F10000
    #G1 X75 F10000
    #G1 X95 F10000
    #G1 X75 F10000
    G1 X128 F15000
    G1 Y240 F15000
    M84 ## disable motors
    BED_MESH_CLEAR

[gcode_macro UNLOAD_FILAMENT]
gcode:
    {% set EXTRUDER_TEMP = params.T_EXTRUDER|default(240)|float %}
    # Ensure the printer is in absolute positioning
    G90
    # Home X and Y axes in the correct order
    G28 X Y
    # Move to purge bucket
    G1 Y5 F1000
    G1 X60 Y240 F20000
    G1 Y267 F2000
    SET_HEATER_TEMPERATURE HEATER=extruder TARGET={EXTRUDER_TEMP}
    TEMPERATURE_WAIT SENSOR=extruder MINIMUM={EXTRUDER_TEMP-5}
    # Wipe then move to unload location
    G1 X95 F10000
    G1 X70 F10000
    G1 X95 F10000
    G1 X70 F10000
    G1 X120 F15000
    # Move to Filament cutter and cut the filament
    G1 X20.00 Y20.5 F25000
    G1 X20.00 Y0.5 F3000
    G1 X10.5 F100
    G1 X20 F1500
    G1 X60 F20000
    G1 Y240 F20000
    G1 Y265 F2000
    # Retract Filament
    G1 E-75 F1000

[gcode_macro LOAD_FILAMENT]
gcode:
    {% set EXTRUDER_TEMP = params.T_EXTRUDER|default(240)|float %}
    # Ensure the printer is in absolute positioning
    G90
    # Home X and Y axes
    G28 X Y
    # Move to purge bucket
    G1 Y5 F5000
    G1 X60 Y240 F20000
    G1 Y267 F3000
    # Set extruder temperature
    SET_HEATER_TEMPERATURE HEATER=extruder TARGET={EXTRUDER_TEMP}
    TEMPERATURE_WAIT SENSOR=extruder MINIMUM={EXTRUDER_TEMP-5}
    RESPOND TYPE=echo MSG="You have 15 seconds to load filament into the extruder."
    G4 P15000 #P15000  ; 15-second delay
    G92 E0
    G1 E70 F400
    M400
    M106 S255
    M104 S0
    TEMPERATURE_WAIT SENSOR=extruder MAXIMUM={EXTRUDER_TEMP-30}
    # Prompt and delay for filament loading
    SET_HEATER_TEMPERATURE HEATER=extruder TARGET=140
    TEMPERATURE_WAIT SENSOR=extruder MINIMUM=145
    G1 X70 F15000
    G1 X76
    G1 X65
    G1 X76
    G1 X65
    G1 X90 F3000
    G1 Y255
    G1 X100
    G1 Y267
    G1 X70 F10000
    G1 X100 F5000
    G1 X70 F10000
    G1 X100 F5000
    G1 X70 F10000
    G1 X100 F5000
    G1 X128 F12000
    G1 Y180 F15000
    SET_HEATER_TEMPERATURE HEATER=extruder TARGET=140
    M117 "Filament loaded!"
    M400
    M106 P2 S0

[gcode_macro WIPE_NOZZLE]
gcode:
    {% set EXTRUDER_TEMP = params.T_EXTRUDER|default(220)|float %}
    # Move to purge bucket
    G1 X60 Y240 F15000
    G1 Y267 F3500

    # Set extruder temperature
    SET_HEATER_TEMPERATURE HEATER=extruder TARGET={EXTRUDER_TEMP}
    TEMPERATURE_WAIT SENSOR=extruder MINIMUM={EXTRUDER_TEMP-5}
    G92 E0
    G1 E70 F400
    M400
    M106 S255
    M104 S0
    TEMPERATURE_WAIT SENSOR=extruder MAXIMUM={EXTRUDER_TEMP-30}

    # Wipe the nozzle
    G1 X70 F9000
    G1 X78 F15000
    G1 X65 F15000
    G1 X78 F15000
    G1 X65 F15000
    G1 X75 F6000
    G1 X95 F15000
    G1 X75 F15000
    G1 X95 F15000
    G1 X75 F15000
    G1 X95 F15000
    G1 X75 F15000
    G1 X165 F15000
    G4 P500
    G1 X65 Y230 F18000
    G1 Y264 F6000
    G4 P2000
    G1 X95 F15000
    G1 X75 F15000
    G1 X75 F15000
    G1 X75 F15000
    G1 X128
    G1 Y128 F20000
    
    M400
    M106 P2 S0

[gcode_macro SPEED_TEST_BALLS]
gcode:

  g28
  g1 z30 f500
  g1 x40 y40 f30000
  g1 x210 y210
  g1 x40 y40
  g1 x210
  g1 x40 y210
  g1 x210 y40
  g1 x40
  g1 y210
  g1 x210
  g1 y40
  g1 x125 y125
  g1 x150 y150
  g1 x125 y125
  g1 x150
  g1 x125 y150
  g1 x150 y125
  g1 x125
  g1 y150
  g1 x150
  g1 y125
  g1 x40 y40
  g1 x210 y210
  g1 x40 y40
  g1 x210
  g1 x40 y210
  g1 x210 y40
  g1 x40
  g1 y210
  g1 x210
  g1 y40
  g1 x125 y125
  g1 x150 y150
  g1 x125 y125
  g1 x150
  g1 x125 y150
  g1 x150 y125
  g1 x125
  g1 y150
  g1 x150
  g1 y125