skew_correction: Add SET_SKEW gcode

This moves skew_correction configuration out of printer.cfg.   It is now dynamically set by the SET_SKEW gcode.

Signed-off-by:  Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
Arksine 2019-06-28 12:45:04 -04:00 committed by KevinOConnor
parent 4df78cd843
commit 026752e399
1 changed files with 28 additions and 11 deletions

View File

@ -16,22 +16,14 @@ def calc_skew_factor(ac, bd, ad):
return math.tan(math.pi/2 - math.acos( return math.tan(math.pi/2 - math.acos(
(ac*ac - side*side - ad*ad) / (2*side*ad))) (ac*ac - side*side - ad*ad) / (2*side*ad)))
def get_skew_from_plane(plane, config):
ac = config.getfloat(plane + "_ac_length", None, above=0.)
if ac is None:
return 0.
bd = config.getfloat(plane + "_bd_length", above=0.)
ad = config.getfloat(plane + "_ad_length", above=0.)
return calc_skew_factor(ac, bd, ad)
class PrinterSkew: class PrinterSkew:
def __init__(self, config): def __init__(self, config):
self.printer = config.get_printer() self.printer = config.get_printer()
self.gcode = self.printer.lookup_object('gcode') self.gcode = self.printer.lookup_object('gcode')
self.toolhead = None self.toolhead = None
self.xy_factor = get_skew_from_plane("xy", config) self.xy_factor = 0.
self.xz_factor = get_skew_from_plane("xz", config) self.xz_factor = 0.
self.yz_factor = get_skew_from_plane("yz", config) self.yz_factor = 0.
self.printer.register_event_handler("klippy:ready", self.printer.register_event_handler("klippy:ready",
self._handle_ready) self._handle_ready)
self.next_transform = None self.next_transform = None
@ -41,6 +33,9 @@ class PrinterSkew:
self.gcode.register_command( self.gcode.register_command(
'CALC_MEASURED_SKEW', self.cmd_CALC_MEASURED_SKEW, 'CALC_MEASURED_SKEW', self.cmd_CALC_MEASURED_SKEW,
desc=self.cmd_CALC_MEASURED_SKEW_help) desc=self.cmd_CALC_MEASURED_SKEW_help)
self.gcode.register_command(
'SET_SKEW', self.cmd_SET_SKEW,
desc=self.cmd_SET_SKEW_help)
def _handle_ready(self): def _handle_ready(self):
self.next_transform = self.gcode.set_move_transform(self, force=True) self.next_transform = self.gcode.set_move_transform(self, force=True)
def calc_skew(self, pos): def calc_skew(self, pos):
@ -77,6 +72,28 @@ class PrinterSkew:
self.gcode.respond_info( self.gcode.respond_info(
"Calculated Skew: %.6f radians, %.2f degrees" % "Calculated Skew: %.6f radians, %.2f degrees" %
(factor, math.degrees(factor))) (factor, math.degrees(factor)))
cmd_SET_SKEW_help = "Set skew based on lengths of measured object"
def cmd_SET_SKEW(self, params):
if self.gcode.get_int("CLEAR", params, 0):
self.xy_factor = 0.
self.xz_factor = 0.
self.yz_factor = 0.
return
planes = ["XY", "XZ", "YZ"]
for plane in planes:
lengths = self.gcode.get_str(plane, params, None)
if lengths is not None:
try:
lengths = lengths.strip().split(",", 2)
lengths = [float(l.strip()) for l in lengths]
if len(lengths) != 3:
raise Exception
except Exception:
raise self.gcode.error(
"skew_correction: improperly formatted entry for "
"plane [%s]\n%s" % (plane, params['#original']))
factor = plane.lower() + '_factor'
setattr(self, factor, calc_skew_factor(*lengths))
def load_config(config): def load_config(config):
return PrinterSkew(config) return PrinterSkew(config)