mirror of
https://github.com/andreili/klipper.git
synced 2025-09-15 01:41:14 +02:00
stepper_enable: Unify explicit stepper enable/disable code
There were several slightly different implementations of explicit stepper motor enabling/disabling in the force_move, stepper_enable, and manual_stepper modules. Introduce a new set_motors_enable() method and use this in all implementations. This simplifies the code and reduces the chance of obscure timing issues. This fixes a manual_stepper error introduced in commit 9399e738. That commit changed the manual_stepper class to no longer explicitly flush and clear all steps after each move, which broke the expectations of manual_stepper's custom enable code. Using the more robust implementation in stepper_enable fixes that issue. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
parent
77d4cdbae4
commit
1f14e950e7
@ -1,6 +1,6 @@
|
|||||||
# Utility for manually moving a stepper for diagnostic purposes
|
# Utility for manually moving a stepper for diagnostic purposes
|
||||||
#
|
#
|
||||||
# Copyright (C) 2018-2019 Kevin O'Connor <kevin@koconnor.net>
|
# Copyright (C) 2018-2025 Kevin O'Connor <kevin@koconnor.net>
|
||||||
#
|
#
|
||||||
# This file may be distributed under the terms of the GNU GPLv3 license.
|
# This file may be distributed under the terms of the GNU GPLv3 license.
|
||||||
import math, logging
|
import math, logging
|
||||||
@ -10,7 +10,6 @@ BUZZ_DISTANCE = 1.
|
|||||||
BUZZ_VELOCITY = BUZZ_DISTANCE / .250
|
BUZZ_VELOCITY = BUZZ_DISTANCE / .250
|
||||||
BUZZ_RADIANS_DISTANCE = math.radians(1.)
|
BUZZ_RADIANS_DISTANCE = math.radians(1.)
|
||||||
BUZZ_RADIANS_VELOCITY = BUZZ_RADIANS_DISTANCE / .250
|
BUZZ_RADIANS_VELOCITY = BUZZ_RADIANS_DISTANCE / .250
|
||||||
STALL_TIME = 0.100
|
|
||||||
|
|
||||||
# Calculate a move's accel_t, cruise_t, and cruise_v
|
# Calculate a move's accel_t, cruise_t, and cruise_v
|
||||||
def calc_move_time(dist, speed, accel):
|
def calc_move_time(dist, speed, accel):
|
||||||
@ -56,24 +55,16 @@ class ForceMove:
|
|||||||
raise self.printer.config_error("Unknown stepper %s" % (name,))
|
raise self.printer.config_error("Unknown stepper %s" % (name,))
|
||||||
return self.steppers[name]
|
return self.steppers[name]
|
||||||
def _force_enable(self, stepper):
|
def _force_enable(self, stepper):
|
||||||
toolhead = self.printer.lookup_object('toolhead')
|
stepper_name = stepper.get_name()
|
||||||
print_time = toolhead.get_last_move_time()
|
|
||||||
stepper_enable = self.printer.lookup_object('stepper_enable')
|
stepper_enable = self.printer.lookup_object('stepper_enable')
|
||||||
enable = stepper_enable.lookup_enable(stepper.get_name())
|
did_enable = stepper_enable.set_motors_enable([stepper_name], True)
|
||||||
was_enable = enable.is_motor_enabled()
|
return did_enable
|
||||||
if not was_enable:
|
def _restore_enable(self, stepper, did_enable):
|
||||||
enable.motor_enable(print_time)
|
if not did_enable:
|
||||||
toolhead.dwell(STALL_TIME)
|
return
|
||||||
return was_enable
|
stepper_name = stepper.get_name()
|
||||||
def _restore_enable(self, stepper, was_enable):
|
stepper_enable = self.printer.lookup_object('stepper_enable')
|
||||||
if not was_enable:
|
stepper_enable.set_motors_enable([stepper_name], False)
|
||||||
toolhead = self.printer.lookup_object('toolhead')
|
|
||||||
toolhead.dwell(STALL_TIME)
|
|
||||||
print_time = toolhead.get_last_move_time()
|
|
||||||
stepper_enable = self.printer.lookup_object('stepper_enable')
|
|
||||||
enable = stepper_enable.lookup_enable(stepper.get_name())
|
|
||||||
enable.motor_disable(print_time)
|
|
||||||
toolhead.dwell(STALL_TIME)
|
|
||||||
def manual_move(self, stepper, dist, speed, accel=0.):
|
def manual_move(self, stepper, dist, speed, accel=0.):
|
||||||
toolhead = self.printer.lookup_object('toolhead')
|
toolhead = self.printer.lookup_object('toolhead')
|
||||||
toolhead.flush_step_generation()
|
toolhead.flush_step_generation()
|
||||||
@ -100,7 +91,7 @@ class ForceMove:
|
|||||||
def cmd_STEPPER_BUZZ(self, gcmd):
|
def cmd_STEPPER_BUZZ(self, gcmd):
|
||||||
stepper = self._lookup_stepper(gcmd)
|
stepper = self._lookup_stepper(gcmd)
|
||||||
logging.info("Stepper buzz %s", stepper.get_name())
|
logging.info("Stepper buzz %s", stepper.get_name())
|
||||||
was_enable = self._force_enable(stepper)
|
did_enable = self._force_enable(stepper)
|
||||||
toolhead = self.printer.lookup_object('toolhead')
|
toolhead = self.printer.lookup_object('toolhead')
|
||||||
dist, speed = BUZZ_DISTANCE, BUZZ_VELOCITY
|
dist, speed = BUZZ_DISTANCE, BUZZ_VELOCITY
|
||||||
if stepper.units_in_radians():
|
if stepper.units_in_radians():
|
||||||
@ -110,7 +101,7 @@ class ForceMove:
|
|||||||
toolhead.dwell(.050)
|
toolhead.dwell(.050)
|
||||||
self.manual_move(stepper, -dist, speed)
|
self.manual_move(stepper, -dist, speed)
|
||||||
toolhead.dwell(.450)
|
toolhead.dwell(.450)
|
||||||
self._restore_enable(stepper, was_enable)
|
self._restore_enable(stepper, did_enable)
|
||||||
cmd_FORCE_MOVE_help = "Manually move a stepper; invalidates kinematics"
|
cmd_FORCE_MOVE_help = "Manually move a stepper; invalidates kinematics"
|
||||||
def cmd_FORCE_MOVE(self, gcmd):
|
def cmd_FORCE_MOVE(self, gcmd):
|
||||||
stepper = self._lookup_stepper(gcmd)
|
stepper = self._lookup_stepper(gcmd)
|
||||||
|
@ -50,15 +50,9 @@ class ManualStepper:
|
|||||||
self.next_cmd_time = print_time
|
self.next_cmd_time = print_time
|
||||||
def do_enable(self, enable):
|
def do_enable(self, enable):
|
||||||
self.sync_print_time()
|
self.sync_print_time()
|
||||||
|
stepper_names = [s.get_name() for s in self.steppers]
|
||||||
stepper_enable = self.printer.lookup_object('stepper_enable')
|
stepper_enable = self.printer.lookup_object('stepper_enable')
|
||||||
if enable:
|
stepper_enable.set_motors_enable(stepper_names, enable)
|
||||||
for s in self.steppers:
|
|
||||||
se = stepper_enable.lookup_enable(s.get_name())
|
|
||||||
se.motor_enable(self.next_cmd_time)
|
|
||||||
else:
|
|
||||||
for s in self.steppers:
|
|
||||||
se = stepper_enable.lookup_enable(s.get_name())
|
|
||||||
se.motor_disable(self.next_cmd_time)
|
|
||||||
self.sync_print_time()
|
self.sync_print_time()
|
||||||
def do_set_position(self, setpos):
|
def do_set_position(self, setpos):
|
||||||
toolhead = self.printer.lookup_object('toolhead')
|
toolhead = self.printer.lookup_object('toolhead')
|
||||||
|
@ -88,30 +88,30 @@ class PrinterStepperEnable:
|
|||||||
name = mcu_stepper.get_name()
|
name = mcu_stepper.get_name()
|
||||||
enable = setup_enable_pin(self.printer, config.get('enable_pin', None))
|
enable = setup_enable_pin(self.printer, config.get('enable_pin', None))
|
||||||
self.enable_lines[name] = EnableTracking(mcu_stepper, enable)
|
self.enable_lines[name] = EnableTracking(mcu_stepper, enable)
|
||||||
|
def set_motors_enable(self, stepper_names, enable):
|
||||||
|
toolhead = self.printer.lookup_object('toolhead')
|
||||||
|
toolhead.dwell(DISABLE_STALL_TIME)
|
||||||
|
print_time = toolhead.get_last_move_time()
|
||||||
|
did_change = False
|
||||||
|
for stepper_name in stepper_names:
|
||||||
|
el = self.enable_lines[stepper_name]
|
||||||
|
was_enabled = el.is_motor_enabled()
|
||||||
|
if enable:
|
||||||
|
el.motor_enable(print_time)
|
||||||
|
else:
|
||||||
|
el.motor_disable(print_time)
|
||||||
|
if was_enabled != el.is_motor_enabled():
|
||||||
|
did_change = True
|
||||||
|
toolhead.dwell(DISABLE_STALL_TIME)
|
||||||
|
return did_change
|
||||||
def motor_off(self):
|
def motor_off(self):
|
||||||
|
self.set_motors_enable(self.get_steppers(), False)
|
||||||
toolhead = self.printer.lookup_object('toolhead')
|
toolhead = self.printer.lookup_object('toolhead')
|
||||||
toolhead.dwell(DISABLE_STALL_TIME)
|
|
||||||
print_time = toolhead.get_last_move_time()
|
|
||||||
for el in self.enable_lines.values():
|
|
||||||
el.motor_disable(print_time)
|
|
||||||
toolhead.get_kinematics().clear_homing_state("xyz")
|
toolhead.get_kinematics().clear_homing_state("xyz")
|
||||||
self.printer.send_event("stepper_enable:motor_off", print_time)
|
self.printer.send_event("stepper_enable:motor_off")
|
||||||
toolhead.dwell(DISABLE_STALL_TIME)
|
|
||||||
def motor_debug_enable(self, stepper, enable):
|
|
||||||
toolhead = self.printer.lookup_object('toolhead')
|
|
||||||
toolhead.dwell(DISABLE_STALL_TIME)
|
|
||||||
print_time = toolhead.get_last_move_time()
|
|
||||||
el = self.enable_lines[stepper]
|
|
||||||
if enable:
|
|
||||||
el.motor_enable(print_time)
|
|
||||||
logging.info("%s has been manually enabled", stepper)
|
|
||||||
else:
|
|
||||||
el.motor_disable(print_time)
|
|
||||||
logging.info("%s has been manually disabled", stepper)
|
|
||||||
toolhead.dwell(DISABLE_STALL_TIME)
|
|
||||||
def get_status(self, eventtime):
|
def get_status(self, eventtime):
|
||||||
steppers = { name: et.is_motor_enabled()
|
steppers = { name: et.is_motor_enabled()
|
||||||
for (name, et) in self.enable_lines.items() }
|
for (name, et) in self.enable_lines.items() }
|
||||||
return {'steppers': steppers}
|
return {'steppers': steppers}
|
||||||
def _handle_request_restart(self, print_time):
|
def _handle_request_restart(self, print_time):
|
||||||
self.motor_off()
|
self.motor_off()
|
||||||
@ -126,7 +126,11 @@ class PrinterStepperEnable:
|
|||||||
% (stepper_name,))
|
% (stepper_name,))
|
||||||
return
|
return
|
||||||
stepper_enable = gcmd.get_int('ENABLE', 1)
|
stepper_enable = gcmd.get_int('ENABLE', 1)
|
||||||
self.motor_debug_enable(stepper_name, stepper_enable)
|
self.set_motors_enable([stepper_name], stepper_enable)
|
||||||
|
if stepper_enable:
|
||||||
|
logging.info("%s has been manually enabled", stepper_name)
|
||||||
|
else:
|
||||||
|
logging.info("%s has been manually disabled", stepper_name)
|
||||||
def lookup_enable(self, name):
|
def lookup_enable(self, name):
|
||||||
if name not in self.enable_lines:
|
if name not in self.enable_lines:
|
||||||
raise self.printer.config_error("Unknown stepper '%s'" % (name,))
|
raise self.printer.config_error("Unknown stepper '%s'" % (name,))
|
||||||
|
@ -79,7 +79,7 @@ class ZAdjustStatus:
|
|||||||
self.applied = False
|
self.applied = False
|
||||||
def get_status(self, eventtime):
|
def get_status(self, eventtime):
|
||||||
return {'applied': self.applied}
|
return {'applied': self.applied}
|
||||||
def _motor_off(self, print_time):
|
def _motor_off(self):
|
||||||
self.reset()
|
self.reset()
|
||||||
|
|
||||||
class RetryHelper:
|
class RetryHelper:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user