aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/homing.py
blob: 8eb0d0656f83265330f391fb9069db78713f33b9 (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
# Code for state tracking during homing operations
#
# Copyright (C) 2016  Kevin O'Connor <kevin@koconnor.net>
#
# This file may be distributed under the terms of the GNU GPLv3 license.

import logging

class Homing:
    def __init__(self, toolhead, steppers):
        self.toolhead = toolhead
        self.steppers = steppers

        self.states = []
        self.endstops = []
        self.changed_axis = []
    def plan_home(self, axis, precise=False):
        s = self.steppers[axis]
        state = self.states
        self.changed_axis.append(axis)
        speed = s.homing_speed
        if s.homing_positive_dir:
            pos = s.position_endstop + 1.5*(s.position_min - s.position_endstop)
            rpos = s.position_endstop - s.homing_retract_dist
            r2pos = rpos - s.homing_retract_dist
        else:
            pos = s.position_endstop + 1.5*(s.position_max - s.position_endstop)
            rpos = s.position_endstop + s.homing_retract_dist
            r2pos = rpos + s.homing_retract_dist
        # Initial homing
        state.append((self.do_home, ({axis: pos}, speed)))
        state.append((self.do_wait_endstop, ({axis: 1},)))
        # Retract
        state.append((self.do_move, ({axis: rpos}, speed)))
        # Home again
        state.append((self.do_home, ({axis: r2pos}, speed/2.0)))
        state.append((self.do_wait_endstop, ({axis: 1},)))
    def plan_axis_update(self, callback):
        self.states.append((callback, (self.changed_axis,)))
    def check_busy(self, eventtime):
        while self.states:
            first = self.states[0]
            ret = first[0](*first[1])
            if ret:
                return True
            self.states.pop(0)
        return False

    def do_move(self, axis_pos, speed):
        # Issue a move command to axis_pos
        newpos = self.toolhead.get_position()
        for axis, pos in axis_pos.items():
            newpos[axis] = pos
        self.toolhead.move(newpos, speed)
        return False
    def do_home(self, axis_pos, speed):
        # Alter kinematics class to think printer is at axis_pos
        newpos = self.toolhead.get_position()
        forcepos = list(newpos)
        for axis, pos in axis_pos.items():
            newpos[axis] = self.steppers[axis].position_endstop
            forcepos[axis] = pos
        self.toolhead.set_position(forcepos)
        # Start homing and issue move
        print_time = self.toolhead.get_last_move_time()
        for axis in axis_pos:
            hz = speed * self.steppers[axis].inv_step_dist
            es = self.steppers[axis].enable_endstop_checking(print_time, hz)
            self.endstops.append(es)
        self.toolhead.move(newpos, speed)
        self.toolhead.reset_print_time()
        for es in self.endstops:
            es.home_finalize()
        return False
    def do_wait_endstop(self, axis_wait):
        # Check if axis_wait endstops have triggered
        for es in self.endstops:
            if es.is_homing():
                return True
        # Finished
        del self.endstops[:]
        return False