#  __  __                          
# |  \/  |                         
# | \  / | __ _  ___ _ __ ___  ___ 
# | |\/| |/ _` |/ __| '__/ _ \/ __|
# | |  | | (_| | (__| | | (_) \__ \
# |_|  |_|\__,_|\___|_|  \___/|___/
#
# Macros Configurations - Flsun V400
# Version 3.0
#
# Guislain Cyril


##################################################
# Start and End G-Codes
##################################################

[gcode_macro START_PRINT]
description: Start G-Code
gcode:
  {% set BED_TEMP = params.BED_TEMP|default(60)|float %}
  {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(210)|float %}
  LED_HOTEND_ON
  G21
  G90
  M82
  {% if printer.extruder.target != 0 %}
  M104 S{EXTRUDER_TEMP}
  {% else %}
  M104 S150
  {% endif %}
  M140 S{BED_TEMP}
  {% if printer.toolhead.homed_axes != "xyz" %}
  G28
  {% endif %}
  G1 Z370 F3000
  G1 X-150 F3000
  M190 S{BED_TEMP}
  M109 S{EXTRUDER_TEMP}
  G1 Z1 F3000
  G1 X-150 Y0 Z0.4
  G92 E0
  G3 X0 Y-130 I150 J1 Z0.3 E30 F2000
  G92 E0
  G1 E-1 F2100


[gcode_macro END_PRINT]
description: End G-Code
gcode:
  M106 S0
  M104 S0
  M140 S0
  G92 E0
  G91
  G1 E-1 F2100
  G1 Z+5 F6000
  G28
  G90
  LED_HOTEND_OFF
  M84


##################################################
# Pause / Resume / Cancel Print
##################################################

[gcode_macro PAUSE]
description: Pause the current print
rename_existing: PAUSE_BASE
gcode:
  ##### set defaults #####
  {% set x = params.X|default(0) %}
  {% set y = params.Y|default(-90) %}
  {% set z = params.Z|default(10)|float %}
  {% set e = params.E|default(1) %}
  ##### calculate save lift position #####
  {% set max_z = printer.toolhead.axis_maximum.z|float %}
  {% set act_z = printer.toolhead.position.z|float %}
  {% set lift_z = z|abs %}
  {% if act_z < (max_z - lift_z) %}
  {% set z_safe = lift_z %}
  {% else %}
  {% set z_safe = max_z - act_z %}
  {% endif %}
  ##### end of definitions #####
  RESPOND MSG="Pausing printing..."
  PAUSE_BASE
  G91
  G1 E-{e} F2100
  G1 Z{z_safe}
  G90
  G1 X{x} Y{y} F2500


[gcode_macro RESUME]
description: Resume the current print
rename_existing: RESUME_BASE
gcode:
  ##### set defaults #####
  {% set e = params.E|default(1) %}
  #### get VELOCITY parameter if specified ####
  {% if 'VELOCITY' in params|upper %}
  {% set get_params = ('VELOCITY=' + params.VELOCITY)  %}
  {% else %}
  {% set get_params = "" %}
  {% endif %}
  ##### end of definitions #####
  G91
  {% if printer["gcode_macro M600"].m600_enabled == 1 %}
  RESPOND MSG="Nozzle heating..."
  M109 S{printer["gcode_macro M600"].hotend_temp}
  M106 S{printer["gcode_macro M600"].fan_speed}
  RESPOND MSG="Loading filament..."
  G0 E50 F800
  G0 E30 F300
  M400
  SET_GCODE_VARIABLE MACRO=M600 VARIABLE=m600_enabled VALUE=0
  {% else %}
  G1 E{e} F2100
  {% endif %}
  RESPOND MSG="Resuming printing..."
  SET_IDLE_TIMEOUT TIMEOUT=1800
  RESUME_BASE {get_params}


[gcode_macro CANCEL_PRINT]
description: Cancel the current print
rename_existing: CANCEL_PRINT_BASE
gcode:
  RESPOND MSG="Printing canceled!"
  G28
  M106 S0
  M104 S0
  M140 S0
  CANCEL_PRINT_BASE


##################################################
# Filament / Color Change
##################################################

[gcode_macro M600]
description: Filament change
variable_hotend_temp: 0
variable_m600_enabled: 0
variable_fan_speed: 0
gcode:
  ##### set defaults #####
  {% set x = params.X|default(0) %}
  {% set y = params.Y|default(-90) %}
  {% set z = params.Z|default(10)|float %}
  {% set e = params.E|default(1) %}
  ##### calculate save lift position #####
  {% set max_z = printer.toolhead.axis_maximum.z|float %}
  {% set act_z = printer.toolhead.position.z|float %}
  {% set lift_z = z|abs %}
  {% if act_z < (max_z - lift_z) %}
  {% set z_safe = lift_z %}
  {% else %}
  {% set z_safe = max_z - act_z %}
  {% endif %}
  ##### end of definitions #####
  SAVE_GCODE_STATE NAME=M600_state
  SET_IDLE_TIMEOUT TIMEOUT=86400
  SET_GCODE_VARIABLE MACRO=M600 VARIABLE=m600_enabled VALUE=1
  SET_GCODE_VARIABLE MACRO=M600 VARIABLE=hotend_temp VALUE={printer.extruder.target}
  SET_GCODE_VARIABLE MACRO=M600 VARIABLE=fan_speed VALUE={printer.fan.speed}
  RESPOND MSG="Pausing printing..."
  PAUSE
  G91
  G1 E-{e} F2100
  G1 Z{z_safe}
  G90
  G1 X{x} Y{y} F2500
  RESPOND MSG="Unloading filament..."
  G91
  G0 E-10 F300
  G0 E-30 F800
  M400
  RESPOND MSG="Nozzle heating stopped!"
  M104 S0
  M106 S0
  RESTORE_GCODE_STATE NAME=M600_state


##################################################
# Load / Unload Filament
##################################################

[gcode_macro UNLOAD_FILAMENT]
description: Filament unloading
gcode:
  {% if printer.idle_timeout.state == "Printing" and not printer.pause_resume.is_paused %}
  RESPOND TYPE=error MSG="This macro cannot be used while printing!"
  {% else %}
  SAVE_GCODE_STATE NAME=unload_state
  {% if printer.extruder.temperature < 200 %}
  RESPOND MSG="Nozzle heating..."
  M109 S200
  {% endif %}
  RESPOND MSG="Unloading filament..."
  G91
  G0 E-10 F300
  G0 E-30 F800
  RESTORE_GCODE_STATE NAME=unload_state
  {% endif %}


[gcode_macro LOAD_FILAMENT]
description: Filament loading
gcode:
  {% if printer.idle_timeout.state == "Printing" and not printer.pause_resume.is_paused %}
  RESPOND TYPE=error MSG="This macro cannot be used while printing!"
  {% else %}
  SAVE_GCODE_STATE NAME=load_state
  {% if printer.extruder.temperature < 200 %}
  RESPOND MSG="Nozzle heating..."
  M109 S200
  {% endif %}
  RESPOND MSG="Loading filament..."
  G91
  G0 E50 F800
  G0 E30 F300
  M400
  RESTORE_GCODE_STATE NAME=load_state
  {% endif %}


##################################################
# Calibrations
##################################################

[gcode_macro Z_OFFSET_CALIBRATION]
description: Measure Z-Offset
gcode:
  SET_GCODE_OFFSET Z=0
  G28
  G1 X0 Y0 Z50 F2500
  M400
  #SET_GCODE_VARIABLE MACRO=_KNOMI_STATUS VARIABLE=probing VALUE=True  # Enable if Knomi is used
  PROBE_CALIBRATE
  #SET_GCODE_VARIABLE MACRO=_KNOMI_STATUS VARIABLE=probing VALUE=False  # Enable if Knomi is used


[gcode_macro ENDSTOPS_CALIBRATION]
description: Endstops Phase Calibration
gcode:
  {% if printer.idle_timeout.state == "Printing" %}
  RESPOND TYPE=error MSG="This macro cannot be used while printing!"
  {% else %}
  {% if printer.toolhead.homed_axes != "xyz" %}
  G28
  {% endif %}
  G91
  G0 Z-80 F1500
  G28
  G91
  G0 Z-80 F1500
  G28
  G91
  G0 Z-80 F1500
  G28
  G91
  G0 Z-80 F1500
  G28
  G91
  G0 Z-80 F1500
  ENDSTOP_PHASE_CALIBRATE stepper=stepper_a
  ENDSTOP_PHASE_CALIBRATE stepper=stepper_b
  ENDSTOP_PHASE_CALIBRATE stepper=stepper_c
  M400
  G28
  {% endif %}


[gcode_macro DELTA_CALIBRATION]
description: Delta Calibration
gcode:
  {% if printer.idle_timeout.state == "Printing" %}
  RESPOND TYPE=error MSG="This macro cannot be used while printing!"
  {% else %}
  SET_GCODE_OFFSET Z=0
  BED_MESH_CLEAR
  {% if printer.toolhead.homed_axes != "xyz" %}
  G28
  {% endif %}
  #SET_GCODE_VARIABLE MACRO=_KNOMI_STATUS VARIABLE=probing VALUE=True  # Enable if Knomi is used
  DELTA_CALIBRATE
  #SET_GCODE_VARIABLE MACRO=_KNOMI_STATUS VARIABLE=probing VALUE=False  # Enable if Knomi is used
  M400
  G1 X0 Y0 Z50 F2500
  G28
  {% endif %}


[gcode_macro BED_LEVELING]
description: Bed Leveling
gcode:
  {% if printer.idle_timeout.state == "Printing" %}
  RESPOND TYPE=error MSG="This macro cannot be used while printing!"
  {% else %}
  SET_GCODE_OFFSET Z=0
  {% if printer.toolhead.homed_axes != "xyz" %}
  G28
  {% endif %}
  G1 X0 Y0 Z50 F2500
  #SET_GCODE_VARIABLE MACRO=_KNOMI_STATUS VARIABLE=probing VALUE=True  # Enable if Knomi is used
  BED_MESH_CALIBRATE
  #SET_GCODE_VARIABLE MACRO=_KNOMI_STATUS VARIABLE=probing VALUE=False  # Enable if Knomi is used
  M400
  G1 X0 Y0 Z50 F2500
  G28
  {% endif %}


[gcode_macro PRESSURE_ADVANCE]
description: Pressure Advance
gcode:
  {% if printer.idle_timeout.state == "Printing" %}
  RESPOND TYPE=error MSG="This macro cannot be used while printing!"
  {% else %}
  SET_PRESSURE_ADVANCE ADVANCE=0   
  SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=1 ACCEL=500
  TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START=0 FACTOR=.005
  {% endif %}


##################################################
# Nozzle / Bed PID Calibration
##################################################

[gcode_macro PID_BED]
description: Bed PID
gcode:
  {% if printer.idle_timeout.state == "Printing" %}
  RESPOND TYPE=error MSG="This macro cannot be used while printing!"
  {% else %}
  RESPOND MSG="Bed PID calibration in progress..."
  G28
  G90
  G1 Z50 F1500
  M400
  M106
  PID_CALIBRATE HEATER=heater_bed TARGET={params.TEMP|default(70)}
  M107
  RESPOND MSG="PID calibration complete! Remember to save the configuration!"
  G28
  {% endif %}


[gcode_macro PID_HOTEND]
description: Hotend PID
gcode:
  {% if printer.idle_timeout.state == "Printing" %}
  RESPOND TYPE=error MSG="This macro cannot be used while printing!"
  {% else %}
  RESPOND MSG="Hotend PID calibration in progress..."
  G28
  G90
  G1 Z50 F1500
  M400
  M106
  PID_CALIBRATE HEATER=extruder TARGET={params.TEMP|default(250)}
  M107
  RESPOND MSG="PID calibration complete! Remember to save the configuration!"
  G28
  {% endif %}
  
  
[gcode_macro _PID_KS_START]
description: PID for KlipperScreen
gcode:
  RESPOND MSG="PID calibration in progress..."
  G28
  G90
  G1 Z50 F1500
  M400
  M106


[gcode_macro _PID_KS_END]
description: PID for KlipperScreen
gcode:
  M107
  RESPOND MSG="PID calibration complete! Remember to save the configuration!"
  G28


##################################################
# Verifications and Measurements with ADXL
##################################################

[gcode_macro ADXL_TEST]
description: ADXL Test
gcode:
  ACCELEROMETER_QUERY


[gcode_macro ADXL_NOISE]
description: Measure Accelerometer Noise
gcode:
  MEASURE_AXES_NOISE


[gcode_macro ADXL_AXE_X]
description: Measure X axis resonances
gcode:
  SHAPER_CALIBRATE AXIS=X


[gcode_macro ADXL_AXE_Y]
description: Measure Y axis resonances
gcode:
  SHAPER_CALIBRATE AXIS=Y


##################################################
# Save Configuration
##################################################

[gcode_macro SAVE]
description: Save Configuration
gcode:
  SAVE_CONFIG


##################################################
# Power On/Off LED
##################################################

[gcode_macro LED_HOTEND_ON]
description: Turn on Hotend LEDs
gcode:
  SET_PIN PIN=LED_Hotend VALUE=1


[gcode_macro LED_HOTEND_OFF]
description: Turn off Hotend LEDs
gcode:
  SET_PIN PIN=LED_Hotend VALUE=0


[gcode_macro LED_LOGO_ON]
description: Turn on Logo LEDs
gcode:
  SET_PIN PIN=LED_Logo VALUE=1


[gcode_macro LED_LOGO_OFF]
description: Turn off Logo LEDs
gcode:
  SET_PIN PIN=LED_Logo VALUE=0


##################################################
# Managing Slicer Controls
##################################################

[gcode_macro M204]
description: Sets maximum accelleration
rename_existing: M204.1
gcode:
  {% if 'S' in params %}
  {% set s = params.S|float %}
  SET_VELOCITY_LIMIT ACCEL={s}
  {% else %}
  {% if 'P' in params %}
  {% set p = params.P|float %}
  {% if 'T' in params %}
  {% set t = params.T|float %}
  {% if p < t %}
  SET_VELOCITY_LIMIT ACCEL={p}
  {% else %}
  SET_VELOCITY_LIMIT ACCEL={t}
  {% endif %}
  {% else %}
  SET_VELOCITY_LIMIT ACCEL={p}
  {% endif %}
  {% elif 'T' in params %}
  {% set t = params.T|float %}
  SET_VELOCITY_LIMIT ACCEL={t}
  {% endif %}
  {% endif %}


[gcode_macro M205]
description: Sets square corner velocity
gcode:
  {% if 'X' in params %}
  SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={params.X}
  {% elif 'Y' in params %}
  SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={params.Y}
  {% endif %}
  

##################################################
# Managing Temperatures Controls
##################################################

[gcode_macro M109]
description: Managing extruder temperature
rename_existing: M99109
gcode:
  {% set s = params.S|float %}
  M104 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %}
  {% if s != 0 %}
  TEMPERATURE_WAIT SENSOR=extruder MINIMUM={s} MAXIMUM={s+1}
  {% endif %}


[gcode_macro M190]
description: Managing bed temperature
rename_existing: M99190
gcode:
  {% set s = params.S|float %}
  M140 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %}
  {% if s != 0 %}
  TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={s} MAXIMUM={s+1}
  {% endif %}


##################################################
# Loading default bed mesh at startup
##################################################

[delayed_gcode bed_mesh_init]
initial_duration: .01
gcode:
  BED_MESH_PROFILE LOAD=default


##################################################
# KNOMI
##################################################

# Enable this section if Knomi is used

#[homing_override]
#gcode:
  #SET_GCODE_VARIABLE MACRO=_KNOMI_STATUS VARIABLE=homing VALUE=True
  #G28
  #SET_GCODE_VARIABLE MACRO=_KNOMI_STATUS VARIABLE=homing VALUE=False


#[gcode_macro _KNOMI_STATUS] 
#variable_homing: False  
#variable_probing: False  
#gcode:


##################################################
# Z-Offset Management
##################################################

[gcode_macro SECURITY_OFFSET]
description: Apply a 2mm Safety Offset
gcode:
  SET_GCODE_OFFSET Z=+2
  RESPOND MSG="Safety Offset applied!"


[gcode_macro SET_GCODE_OFFSET]
description: Saving Z-Offset
rename_existing: _SET_GCODE_OFFSET
gcode:
  {% if printer.save_variables.variables.zoffset %}
  {% set zoffset = printer.save_variables.variables.zoffset %}
  {% else %}
  {% set zoffset = {'z': None} %}
  {% endif %}
  {% set ns = namespace(zoffset={'z': zoffset.z}) %}
  _SET_GCODE_OFFSET {% for p in params %}{'%s=%s '% (p, params[p])}{% endfor %}
  {%if 'Z' in params %}{% set null = ns.zoffset.update({'z': params.Z}) %}{% endif %}
  {%if 'Z_ADJUST' in params %}
  {%if ns.zoffset.z == None %}{% set null = ns.zoffset.update({'z': 0}) %}{% endif %}
  {% set null = ns.zoffset.update({'z': (ns.zoffset.z | float) + (params.Z_ADJUST | float)}) %}
  {% endif %}
  SAVE_VARIABLE VARIABLE=zoffset VALUE="{ns.zoffset}"


[delayed_gcode LOAD_GCODE_OFFSETS]
initial_duration: 2
gcode:
  {% if printer.save_variables.variables.zoffset %}
  {% set zoffset = printer.save_variables.variables.zoffset %}
  _SET_GCODE_OFFSET {% for axis, offset in zoffset.items() if zoffset[axis] %}{ "%s=%s " % (axis, offset) }{% endfor %}
  RESPOND TYPE=command MSG="Loaded Z-Offset from variables.cfg: {zoffset.z}mm"
  {% endif %}

##################################################
# Maintenance Macros
##################################################

[gcode_macro APPLY_GREASE]
description: Moves the head to apply silicon grease to all joints
gcode:
  G28
  G90
  G0 X0 Y0 Z20 F3500
  G0 X0 Y0 Z400 F3500
  G0 X0 Y0 Z20 F3500
  G0 X0 Y0 Z400 F3500
  G0 X0 Y0 Z20 F3500
  G0 X0 Y0 Z400 F3500
  G0 X0 Y0 Z20 F3500
  G0 X0 Y0 Z400 F3500
  G0 X0 Y0 Z20 F3500
  G0 X0 Y0 Z400 F3500
  G0 X0 Y0 Z20 F3500
  G28
  G90
  G0 X150 Y0 Z20 F3500
  G2 I-150 F3500
  G3 I-150 F3500
  G2 I-150 F3500
  G3 I-150 F3500
  G2 I-150 F3500
  G3 I-150 F3500
  G28
