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
|
# Support for Marlin/Smoothie/Reprap style firmware retraction via G10/G11
#
# Copyright (C) 2019 Len Trigg <lenbok@gmail.com>
#
# This file may be distributed under the terms of the GNU GPLv3 license.
class FirmwareRetraction:
def __init__(self, config):
self.printer = config.get_printer()
self.retract_length = config.getfloat("retract_length", 0.0, minval=0.0)
self.retract_speed = config.getfloat("retract_speed", 20.0, minval=1)
self.unretract_extra_length = config.getfloat(
"unretract_extra_length", 0.0, minval=0.0
)
self.unretract_speed = config.getfloat("unretract_speed", 10.0, minval=1)
self.unretract_length = self.retract_length + self.unretract_extra_length
self.is_retracted = False
self.gcode = self.printer.lookup_object("gcode")
self.gcode.register_command(
"SET_RETRACTION", self.cmd_SET_RETRACTION, desc=self.cmd_SET_RETRACTION_help
)
self.gcode.register_command(
"GET_RETRACTION", self.cmd_GET_RETRACTION, desc=self.cmd_GET_RETRACTION_help
)
self.gcode.register_command("G10", self.cmd_G10)
self.gcode.register_command("G11", self.cmd_G11)
def get_status(self, eventtime):
return {
"retract_length": self.retract_length,
"retract_speed": self.retract_speed,
"unretract_extra_length": self.unretract_extra_length,
"unretract_speed": self.unretract_speed,
}
cmd_SET_RETRACTION_help = "Set firmware retraction parameters"
def cmd_SET_RETRACTION(self, gcmd):
self.retract_length = gcmd.get_float(
"RETRACT_LENGTH", self.retract_length, minval=0.0
)
self.retract_speed = gcmd.get_float(
"RETRACT_SPEED", self.retract_speed, minval=1
)
self.unretract_extra_length = gcmd.get_float(
"UNRETRACT_EXTRA_LENGTH", self.unretract_extra_length, minval=0.0
)
self.unretract_speed = gcmd.get_float(
"UNRETRACT_SPEED", self.unretract_speed, minval=1
)
self.unretract_length = self.retract_length + self.unretract_extra_length
self.is_retracted = False
cmd_GET_RETRACTION_help = "Report firmware retraction parameters"
def cmd_GET_RETRACTION(self, gcmd):
gcmd.respond_info(
"RETRACT_LENGTH=%.5f RETRACT_SPEED=%.5f"
" UNRETRACT_EXTRA_LENGTH=%.5f UNRETRACT_SPEED=%.5f"
% (
self.retract_length,
self.retract_speed,
self.unretract_extra_length,
self.unretract_speed,
)
)
def cmd_G10(self, gcmd):
if not self.is_retracted:
self.gcode.run_script_from_command(
"SAVE_GCODE_STATE NAME=_retract_state\n"
"G91\n"
"G1 E-%.5f F%d\n"
"RESTORE_GCODE_STATE NAME=_retract_state"
% (self.retract_length, self.retract_speed * 60)
)
self.is_retracted = True
def cmd_G11(self, gcmd):
if self.is_retracted:
self.gcode.run_script_from_command(
"SAVE_GCODE_STATE NAME=_retract_state\n"
"G91\n"
"G1 E%.5f F%d\n"
"RESTORE_GCODE_STATE NAME=_retract_state"
% (self.unretract_length, self.unretract_speed * 60)
)
self.is_retracted = False
def load_config(config):
return FirmwareRetraction(config)
|