aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/extras/firmware_retraction.py
blob: 697d77e76de33734a5d58f2a750ea744db70aae0 (plain)
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)