-
Notifications
You must be signed in to change notification settings - Fork 4
/
klicky-probe.cfg
758 lines (626 loc) · 26.6 KB
/
klicky-probe.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
# This macro was provided by discord user Garrettwp to whom i give my thanks for sharing it with me.
# I have tweaked it a lot.
#
# this macro is based on the great Annex magprobe dockable probe macros "#Originally developed by Mental, modified for better use on K-series printers by RyanG and Trails"
# that macro can be found here https://github.com/Annex-Engineering/Annex-Engineering_Other_Printer_Mods/blob/master/All_Printers/Microswitch_Probe/Klipper_Macros/dockable_probe_macros.cfg
#
# by standing on the shoulders of giants, lets see if we can see further
# Klicky-probe.cfg version 16-11-2021 01
[gcode_macro _User_Variables]
variable_verbose: True # Enable verbose output
variable_travel_speed: 200 # how fast all other travel moves will be performed when running these macros
variable_dock_speed: 50 # how fast should the toolhead move when docking the probe for the final movement
variable_release_speed: 75 # how fast should the toolhead move to release the hold of the magnets after docking
variable_z_drop_speed: 20 # how fast the z will lower when moving to the z location to clear the probe
variable_home_z_height: 16 # Z when homing
#bed type
variable_gravity: 'gantry' # What goes down with gravity, bed or gantry?
variable_max_bed_y: 350 # maximum Bed size avoids doing a probe_accuracy outside the bed
# if a separate Z endstop switch is in
# use, specify the coordinates of the switch here (Voron).
# Set to 0 to have the probe move to center of bed
variable_z_endstop_x: 230
variable_z_endstop_y: 357
#dock location
variable_docklocation_x: 45 # X Dock position
variable_docklocation_y: 359.4 # Y Dock position
variable_docklocation_z: -128 # Z dock position (-128 for a gantry mount)
variable_dockarmslenght: 30 # Dock arms lenght, toolhead movement necessary to clear the dock arms
#Umbilical to help untangle the umbilical in difficult situations
variable_umbilical: False # should we untabgle the umbilical
variable_umbilical_x: 15 # X umbilical position
variable_umbilical_y: 15 # Y umbilical position
# location to park the toolhead
variable_park_toolhead: False # Enable toolhead parking
variable_parkposition_x: 125
variable_parkposition_y: 125
variable_parkposition_z: 30
# Do not modify below
gcode:
{% set Mx = printer['configfile'].config["stepper_x"]["position_max"]|float %}
{% set My = printer['configfile'].config["stepper_y"]["position_max"]|float %}
{% set Ox = printer['configfile'].config["probe"]["x_offset"]|float %}
{% set Oy = printer['configfile'].config["probe"]["y_offset"]|float %}
{% set Oz = printer['configfile'].config["probe"]["z_offset"]|float %}
# if docklocation_z is zero, use Home Z height for safety
{% if docklocation_z == 0 %}
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=docklocation_z VALUE={ home_z_height }
{% endif %}
# If x, y coordinates are set for z endstop, assign them
{% if z_endstop_x != 0 or z_endstop_y != 0 %}
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=z_endstop_x VALUE={ z_endstop_x }
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=z_endstop_y VALUE={ z_endstop_y }
# if no x, y coordinates for z endstop, assume probe is endstop and move toolhead to center of bed
{% else %}
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=z_endstop_x VALUE={ (Mx * 0.5) - Ox }
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=z_endstop_y VALUE={ (My * 0.5) - Oy }
{% endif %}
# This macro was provided by discord user Garrettwp to whom i give my thanks for sharing it with me.
# I have tweaked it a lot.
#
# this macro is based on the great Annex magprobe dockable probe macros "#Originally developed by Mental, modified for better use on K-series printers by RyanG and Trails"
# that macro can be found here https://github.com/Annex-Engineering/Annex-Engineering_Other_Printer_Mods/blob/master/All_Printers/Microswitch_Probe/Klipper_Macros/dockable_probe_macros.cfg
#
# by standing on the shoulders of giants, lets see if we can see further
[gcode_macro _Probe_Variables]
variable_probe_attached: False
variable_probe_state: False
variable_probe_lock: False
variable_z_endstop_x: 0
variable_z_endstop_y: 0
gcode:
[gcode_macro _exit_point]
gcode:
{% set function = 'pre_' ~ params.FUNCTION %}
{% set move = params.MOVE|default(0) %}
# mandatory to save the new safe position
M400
RESTORE_GCODE_STATE NAME={function} MOVE={move}
[gcode_macro _entry_point]
gcode:
{% set function = 'pre_' ~ params.FUNCTION %}
# mandatory to save the new safe position
M400
SAVE_GCODE_STATE NAME={function}
# removes the Z offset for better bed based docking
SET_GCODE_OFFSET Z=0
# all the macros initially assume absolute positioning
G90
[gcode_macro _Homing_Variables]
gcode:
{% set R = params.RESET|default(0) %}
{% if R %}
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_lock VALUE={ False }
{% endif %}
# Attach probe and lock it
[gcode_macro Attach_Probe_Lock]
description: Attaches Klicky Probe, can only be docked after unlocking
gcode:
Attach_Probe
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_lock VALUE={ True }
# Dock probe and lock it
[gcode_macro Dock_Probe_Unlock]
description: Docks Klicky Probe even if it was locked
gcode:
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_lock VALUE={ False }
Dock_Probe
# Unlock Probe
[gcode_macro Probe_Unlock]
description: Unlocks Klicky Probe state
gcode:
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_lock VALUE={ False }
# Lock Probe
[gcode_macro Probe_Lock]
description: Locks Klicky Probe state
gcode:
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_lock VALUE={ True }
# Attach Probe Routine
[gcode_macro Attach_Probe]
description: Attaches Klicky Probe
gcode:
# Get probe attach status
{% set P = printer["gcode_macro _Probe_Variables"].probe_attached %}
{% set L = printer["gcode_macro _Probe_Variables"].probe_lock %}
{% set V = printer["gcode_macro _User_Variables"].verbose %}
# Get Docking location
{% set Mx = printer["gcode_macro _User_Variables"].dockmove_x|default(0) %}
{% set My = printer["gcode_macro _User_Variables"].dockmove_y|default(0) %}
{% set Mz = printer["gcode_macro _User_Variables"].dockmove_z|default(0) %}
{% set Dx = printer["gcode_macro _User_Variables"].docklocation_x %}
{% set Dy = printer["gcode_macro _User_Variables"].docklocation_y %}
{% set Dz = printer["gcode_macro _User_Variables"].docklocation_z %}
{% set Ax = printer["gcode_macro _User_Variables"].attachmove_x|default(0) %}
{% set Ay = printer["gcode_macro _User_Variables"].attachmove_y|default(0) %}
{% set Az = printer["gcode_macro _User_Variables"].attachmove_z|default(0) %}
{% set Gm = printer["gcode_macro _User_Variables"].gravity %}
{% set Da = printer["gcode_macro _User_Variables"].dockarmslenght|default(0) %}
# Safe Z for travel
{% set Hzh = printer["gcode_macro _User_Variables"].home_z_height|float %}
#Set speed
{% set St = printer["gcode_macro _User_Variables"].travel_speed * 60 %}
{% set Sd = printer["gcode_macro _User_Variables"].dock_speed * 60 %}
{% set Sr = printer["gcode_macro _User_Variables"].release_speed * 60 %}
{% set Sz = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %}
_entry_point function=Attach_Probe
#if there is no undock movement, assume older behavior
{% if Mx == My == Mz == 0 %}
{% set Mx = 40 %}
{% endif %}
#if there is no Attach movement, assume older behavior
{% if Ax == Ay == Az == 0 %}
{% set Ay = Da %}
{% endif %}
# if x and y are not homed
{% if not 'xy' in printer.toolhead.homed_axes %}
{ action_raise_error("Must Home X and Y Axis First!") }
# If probe not attached and locked
{% elif not P and not L %}
{% if V %}
{ action_respond_info("Attaching Probe") }
{% endif %}
{% if (not 'z' in printer.toolhead.homed_axes) %}
{% if V %}
{ action_respond_info("Resetting Z position to zero") }
{% endif %}
SET_KINEMATIC_POSITION Z=0
{% if ('bed' in Gm) %} # checks if the bed or gantry move with gravity
{% set Hzh = 0 %}
{% elif ('gantry' in Gm) %} # checks if the bed or gantry move with gravity
{% set Hzh = Hzh %}
{% else %}
{ action_raise_error("To avoid head crashes, configure Klicky probe gravity variable!") }
{% endif %}
{% endif %}
#prior to saving actual position, check if its necessary to move to a safe Z
#that has enought overhead for the attached probe
{% if (printer.toolhead.position.z < Hzh) %}
{% if V %}
{ action_respond_info("moving to a safe Z distance") }
{% endif %}
G0 Z{Hzh} F{Sz}
{% endif %}
{% if (not 'z' in printer.toolhead.homed_axes) %}
{% if V %}
{ action_respond_info("Resetting Z position to zero") }
{% endif %}
SET_KINEMATIC_POSITION Z=0
{% endif %}
{% if (printer.toolhead.position.z < Hzh) %}
G0 Z{Hzh} F{Sz}
{% endif %}
_Umbilical_Path
# Probe entry location
G0 X{Dx|int - Ax|int} Y{Dy|int - Ay|int} F{St}
{% if Dz != -128 %}
G0 Z{Dz|int - Az|int} F{Sd}
{% endif %}
# Drop Probe to Probe location
{% if Dz != -128 %}
G0 Z{Dz} F{Sd}
{% endif %}
G0 X{Dx} Y{Dy} F{Sd}
# Probe Attach
{% if Dz != -128 %}
G0 Z{Dz|int - Az|int} F{Sz}
{% endif %}
G0 X{Dx|int - Ax|int} Y{Dy|int - Ay|int} F{Sr}
#Go to Z safe distance
{% if (printer.toolhead.position.z < Hzh) %}
G0 Z{Hzh} F{Sz}
{% endif %}
_Park_Toolhead
_CheckProbe action=attach
{% elif L %}
{% if V %}
{ action_respond_info("Probe locked!") }
{% endif %}
# Probe attached, do nothing
_CheckProbe action=query
{% else %}
{% if V %}
{ action_respond_info("Probe already attached!") }
{% endif %}
# Probe attached, do nothing
_CheckProbe action=query
{% endif %}
_exit_point function=Attach_Probe
# Dock Probe Routine
[gcode_macro Dock_Probe]
description: Docks Klicky Probe
gcode:
# Get probe attach status
{% set P = printer["gcode_macro _Probe_Variables"].probe_attached %}
{% set L = printer["gcode_macro _Probe_Variables"].probe_lock %}
{% set V = printer["gcode_macro _User_Variables"].verbose %}
# Get Docking location
{% set Mx = printer["gcode_macro _User_Variables"].dockmove_x|default(0) %}
{% set My = printer["gcode_macro _User_Variables"].dockmove_y|default(0) %}
{% set Mz = printer["gcode_macro _User_Variables"].dockmove_z|default(0) %}
{% set Dx = printer["gcode_macro _User_Variables"].docklocation_x %}
{% set Dy = printer["gcode_macro _User_Variables"].docklocation_y %}
{% set Dz = printer["gcode_macro _User_Variables"].docklocation_z %}
{% set Ax = printer["gcode_macro _User_Variables"].attachmove_x|default(0) %}
{% set Ay = printer["gcode_macro _User_Variables"].attachmove_y|default(0) %}
{% set Az = printer["gcode_macro _User_Variables"].attachmove_z|default(0) %}
{% set Da = printer["gcode_macro _User_Variables"].dockarmslenght|default(0) %}
# Safe Z for travel
{% set Hzh = printer["gcode_macro _User_Variables"].home_z_height|float %}
# Set speed
{% set St = printer["gcode_macro _User_Variables"].travel_speed * 60 %}
{% set Sd = printer["gcode_macro _User_Variables"].dock_speed * 60 %}
{% set Sr = printer["gcode_macro _User_Variables"].release_speed * 60 %}
{% set Sz = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %}
#if there is no undock movement, assume older behavior
{% if Mx == My == Mz == 0 %}
{% set Mx = 40 %}
{% endif %}
#if there is no Attach movement, assume older behavior
{% if Ax == Ay == Az == 0 %}
{% set Ay = Da %}
{% endif %}
_entry_point function=Dock_Probe
{% if not 'xyz' in printer.toolhead.homed_axes %}
{ action_raise_error("Must Home X, Y and Z Axis First!") }
# If probe not attached and not locked
{% elif P and not L %}
{% if V %}
{ action_respond_info("Docking Probe") }
{% endif %}
{% if (printer.toolhead.position.z < Hzh) %}
G0 Z{Hzh} F{Sz}
{% endif %}
_Umbilical_Path
# Probe entry location
G0 X{Dx|int - Ax|int} Y{Dy|int - Ay|int} F{St}
{% if Dz != -128 %}
G0 Z{Dz|int - Az|int} F{Sd}
{% endif %}
# Drop Probe to Probe location
G0 X{Dx} Y{Dy} F{Sd}
{% if Dz != -128 %}
G0 Z{Dz} F{Sd}
{% endif %}
# Probe decoupling
{% if Dz != -128 %}
G0 Z{Dz|int + Mz|int} F{Sr}
{% endif %}
G0 X{Dx|int + Mx|int} Y{Dy|int + My|int} F{Sr}
#Go to Z safe distance
{% if (printer.toolhead.position.z < Hzh) %}
G0 Z{Hzh} F{Sz}
{% endif %}
_Park_Toolhead
G4 P1000
_CheckProbe action=dock
{% elif L %}
{% if V %}
{ action_respond_info("Probe locked!") }
{% endif %}
# Probe docked, do nothing
_CheckProbe action=query
{% else %}
{% if V %}
{ action_respond_info("Probe already docked!") }
{% endif %}
# Probe docked, do nothing
_CheckProbe action=query
{% endif %}
_exit_point function=Dock_Probe
# Probe Calibrate
[gcode_macro PROBE_CALIBRATE]
rename_existing: _PROBE_CALIBRATE
description:Calibrate the probe's z_offset with klicky automount
gcode:
{% set Hzh = printer["gcode_macro _User_Variables"].home_z_height|float %}
{% set Sz = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %}
{% set St = printer["gcode_macro _User_Variables"].travel_speed %}
{% set Mx = printer['configfile'].config["stepper_x"]["position_max"]|float %}
{% set My = printer['configfile'].config["stepper_y"]["position_max"]|float %}
{% set Ox = printer['configfile'].config["probe"]["x_offset"]|float %}
{% set Oy = printer['configfile'].config["probe"]["y_offset"]|float %}
{% if not 'xyz' in printer.toolhead.homed_axes %}
{ action_raise_error("Must Home X, Y and Z Axis First!") }
{% endif %}
_entry_point function=PROBE_CALIBRATE
# Go to Z safe distance before saving location in order to
# avoid crashing the probe on the bed when coming back
{% if (printer.toolhead.position.z < Hzh) %}
G0 Z{Hzh} F{Sz}
{% endif %}
#Protect against PROBE CALIBRATE performed from outside the bed
{% if (printer['gcode_move'].position.y > (My - Oy)) or (printer['gcode_move'].position.x > (Mx - Ox)) or (printer['gcode_move'].position.x < Ox) %}
{ action_raise_error("Must perform PROBE_CALIBRATE with the probe above the BED!!!") }
{% endif%}
M400 # mandatory to save the new safe position
SAVE_GCODE_STATE NAME=_original_nozzle_location
_CheckProbe action=query
Attach_Probe
# Restore nozzle location to probe the right place
RESTORE_GCODE_STATE NAME=_original_nozzle_location MOVE=1 MOVE_SPEED={St}
_PROBE_CALIBRATE {% for p in params
%}{'%s=%s ' % (p, params[p])}{%
endfor %}
#store current nozzle location
SAVE_GCODE_STATE NAME=_original_nozzle_location
Dock_Probe
# Restore nozzle location again at the end
RESTORE_GCODE_STATE NAME=_original_nozzle_location MOVE=1 MOVE_SPEED={St}
_exit_point function=PROBE_CALIBRATE
# Probe Accuracy
[gcode_macro PROBE_ACCURACY]
rename_existing: _PROBE_ACCURACY
description:Probe Z-height accuracy at current XY position with klicky automount
gcode:
{% set Hzh = printer["gcode_macro _User_Variables"].home_z_height|float %}
{% set Sz = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %}
{% set St = printer["gcode_macro _User_Variables"].travel_speed %}
{% set By = printer["gcode_macro _User_Variables"].max_bed_y %}
{% set Oy = printer['configfile'].config["probe"]["y_offset"]|float %}
{% if not 'xyz' in printer.toolhead.homed_axes %}
{ action_raise_error("Must Home X, Y and Z Axis First!") }
{% endif %}
_entry_point function=PROBE_ACCURACY
# Go to Z safe distance before saving location in order to
# avoid crashing the probe on the bed when coming back
{% if (printer.toolhead.position.z < Hzh) %}
G0 Z{Hzh} F{Sz}
{% endif %}
#Protect against PROBE ACCURACY performed from outside the bed
{% if (printer.toolhead.position.y > (By - Oy)) %}
{ action_raise_error("Must perform PROBE_ACCURACY with the probe above the BED!!!") }
{% endif%}
M400 # mandatory to save the new safe position
SAVE_GCODE_STATE NAME=_original_nozzle_location
_CheckProbe action=query
Attach_Probe
# Restore nozzle location to probe the right place
RESTORE_GCODE_STATE NAME=_original_nozzle_location MOVE=1 MOVE_SPEED={St}
_PROBE_ACCURACY {% for p in params
%}{'%s=%s ' % (p, params[p])}{%
endfor %}
#store current nozzle location
SAVE_GCODE_STATE NAME=_original_nozzle_location
Dock_Probe
# Restore nozzle location again at the end
RESTORE_GCODE_STATE NAME=_original_nozzle_location MOVE=1 MOVE_SPEED={St}
_exit_point function=PROBE_ACCURACY
# enable to SET_KINEMATIC_POSITION for Z hop
[force_move]
enable_force_move: True
# Homeing Override
[homing_override]
axes: xyz
gcode:
# collect user state variables
_User_Variables
{% set V = printer["gcode_macro _User_Variables"].verbose %}
{% set Hzh = printer["gcode_macro _User_Variables"].home_z_height|float %}
{% set Gm = printer["gcode_macro _User_Variables"].gravity %}
{% set Ax = printer["gcode_macro _User_Variables"].attachmove_x|default(0) %}
{% set Ay = printer["gcode_macro _User_Variables"].attachmove_y|default(0) %}
{% set Az = printer["gcode_macro _User_Variables"].attachmove_z|default(0) %}
{% set Da = printer["gcode_macro _User_Variables"].dockarmslenght|default(0) %}
#if there is no Attach movement, assume older behavior
{% if Ax == Ay == Az == 0 %}
{% set Ay = Da %}
{% endif %}
_CheckProbe action=query
# reset parameters
{% set X, Y, Z = False, False, False %}
# which axes have been requested for homing
{% if not 'X' in params
and not 'Y' in params
and not 'Z' in params %}
{% set X, Y, Z = True, True, True %}
{% else %}
{% if 'X' in params %}
{% set X = True %}
{% endif %}
{% if 'Y' in params %}
{% set Y = True %}
{% endif %}
{% if 'Z' in params %}
{% set Z = True %}
{% endif %}
{% if 'X' in params
and 'Y' in params
and 'Z' in params %}
# reset homing state variables
# if homing all axes
_Homing_Variables reset=1
{% endif %}
{% endif %}
_entry_point function=homing_override
# if Z is not homed, do not move the bed if it goes down
{% if ('z' not in printer.toolhead.homed_axes) %}
{% if ('bed' in Gm) %} # checks if the bed or gantry move with gravity
{% set Hzh = 0 %}
{% elif ('gantry' in Gm) %} # checks if the bed or gantry move with gravity
{% set Hzh = Hzh %}
{% else %}
{ action_raise_error("To avoid head crashes, configure Klicky probe gravity variable!") }
{% endif %}
{% endif %}
{% if Z %}
{% if ('z' in printer.toolhead.homed_axes) %}
{% if (printer.toolhead.position.z < Hzh) %}
{% if V %}
{ action_respond_info("Z too low, performing ZHOP") }
{% endif %}
G0 Z{Hzh} F1200
{% endif %}
{% else %}
{% if V %}
{ action_respond_info("Z not homed, forcing full G28") }
{% endif %}
SET_KINEMATIC_POSITION X=0 Y=0 Z=0
G0 Z{Hzh} F600
{% set X, Y, Z = True, True, True %}
{% endif %}
{% endif %}
# if the dock is oriented on the Y, first do Y endstop
{% if Ay == 0 %}
# Home y
{% if Y %}
{% if V %}
{ action_respond_info("Homing Y") }
{% endif %}
G28 Y0
{% endif %}
{% set Y = 0 %}
{% endif %}
# Home x
{% if X %}
{% if V %}
{ action_respond_info("Homing X") }
{% endif %}
G28 X0
{% endif %}
# Home y
{% if Y %}
{% if V %}
{ action_respond_info("Homing Y") }
{% endif %}
G28 Y0
{% endif %}
# Home z
{% if Z %}
{% if V %}
{ action_respond_info("Homing Z") }
{% endif %}
# if probe is configured as endstop, attach it, else dock the probe if attached
{% if printer['configfile'].config["stepper_z"]["endstop_pin"] == 'probe:z_virtual_endstop' %}
Attach_Probe
{% else %}
Dock_Probe
{% endif %}
_Home_Z
# if probe is configured as endstop, dock it
{% if printer['configfile'].config["stepper_z"]["endstop_pin"] == 'probe:z_virtual_endstop' %}
Dock_Probe
{% endif %}
{% endif %}
_CheckProbe action=query
# park the toolhead
_Park_Toolhead
_exit_point function=homing_override
# umbilical path setup
[gcode_macro _Umbilical_Path]
gcode:
{% set Ux = printer["gcode_macro _User_Variables"].umbilical_x %}
{% set Uy = printer["gcode_macro _User_Variables"].umbilical_y %}
{% set U = printer["gcode_macro _User_Variables"].umbilical %}
{% set Hzh = printer["gcode_macro _User_Variables"].home_z_height|float %}
{% set St = printer["gcode_macro _User_Variables"].travel_speed * 60 %}
{% if U %}
# Used to give the umbilical a better path to follow and coil properly if dock is tight in space
_entry_point function=Umbilical_Path
G0 X{Ux} Y{Uy} Z{Hzh} F{St}
_exit_point function=Umbilical_Path
{% endif %}
# Home Z Routine
[gcode_macro _Home_Z]
gcode:
{% set Zx = printer["gcode_macro _Probe_Variables"].z_endstop_x %}
{% set Zy = printer["gcode_macro _Probe_Variables"].z_endstop_y %}
{% set Hzh = printer["gcode_macro _User_Variables"].home_z_height|float %}
{% set St = printer["gcode_macro _User_Variables"].travel_speed * 60 %}
{% set Sz = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %}
_entry_point function=Home_Z
# if x and y are not homed yet, raise error
{% if not 'xy' in printer.toolhead.homed_axes %}
{ action_raise_error("Must Home X and Y Axis First!") }
{% else %}
{% if (not 'z' in printer.toolhead.homed_axes) %}
{% if V %}
{ action_respond_info("Resetting Z position to zero") }
{% endif %}
SET_KINEMATIC_POSITION Z=0
{% endif %}
# move tool to safe homing position and home Z axis
# location of z endstop
G0 X{Zx} Y{Zy} F{St}
G28 Z0
G0 Z{Hzh} F{Sz}
{% endif %}
_exit_point function=Home_Z
# check to see if probe is where it is supposed to be after
# attaching/docking maneuver and set homing error or shutdown
[gcode_macro _CheckProbe]
variable_probe_state: 0
gcode:
Query_Probe
_SetProbeState action={ ACTION }
# due to how templates are evaluated, we have query endstops in one
# macro and call another macro to make decisions based on the result
[gcode_macro _SetProbeState]
gcode:
{% set P = printer.probe.last_query %}
{% set V = printer["gcode_macro _User_Variables"].verbose %}
# If triggered (true), probe not attached
{% if P %}
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_attached VALUE={ False }
# If not triggered (false), probe attached
{% else %}
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_attached VALUE={ True }
{% endif %}
{% if params.ACTION == 'query' %}
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_state VALUE={ P }
{% endif %}
# if probe fails to attach/detach
# if not docked
{% if (not P and params.ACTION == 'dock') %}
{ action_raise_error("Probe dock failed!") }
{% endif %}
# if not attached
{% if P and params.ACTION == 'attach' %}
{ action_raise_error("Probe attach failed!") }
{% endif %}
# Park Toolhead Routine
[gcode_macro _Park_Toolhead]
gcode:
{% set P = printer["gcode_macro _User_Variables"].park_toolhead %}
{% set Px = printer["gcode_macro _User_Variables"].parkposition_x %}
{% set Py = printer["gcode_macro _User_Variables"].parkposition_y %}
{% set Pz = printer["gcode_macro _User_Variables"].parkposition_z %}
{% set St = printer["gcode_macro _User_Variables"].travel_speed * 60 %}
{% set V = printer["gcode_macro _User_Variables"].verbose %}
_entry_point function=Park_Toolhead
{% if (P and 'xyz' in printer.toolhead.homed_axes) %}
{% if V %}
{ action_respond_info("Parking Toolhead") }
{% endif %}
G0 X{Px} Y{Py} Z{Pz} F{St}
{% endif %}
_exit_point function=Park_Toolhead
# Quad Gantry Level
[gcode_macro QUAD_GANTRY_LEVEL]
rename_existing: _QUAD_GANTRY_LEVEL
description: Conform a moving, twistable gantry to the shape of a stationary bed with klicky automount
gcode:
{% set V = printer["gcode_macro _User_Variables"].verbose %}
{% if V %}
{ action_respond_info("QG Level") }
{% endif %}
_CheckProbe action=query
Attach_Probe
_QUAD_GANTRY_LEVEL {% for p in params
%}{'%s=%s ' % (p, params[p])}{%
endfor %}
Dock_Probe
# Bed Mesh Calibrate
[bed_mesh]
[gcode_macro BED_MESH_CALIBRATE]
rename_existing: _BED_MESH_CALIBRATE
description: Perform Mesh Bed Leveling with klicky automount
gcode:
{% set V = printer["gcode_macro _User_Variables"].verbose %}
{% if V %}
{ action_respond_info("Bed Mesh Calibrate") }
{% endif %}
_CheckProbe action=query
Attach_Probe
_BED_MESH_CALIBRATE {% for p in params
%}{'%s=%s ' % (p, params[p])}{%
endfor %}
Dock_Probe