aboutsummaryrefslogtreecommitdiffstats
path: root/klippy
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2017-03-05 15:00:15 -0500
committerKevin O'Connor <kevin@koconnor.net>2017-03-09 14:54:52 -0500
commita38437f378ece33cb762b482120be629c78d3540 (patch)
treea4a4ec60221aecbb3e41a5854f75bbaf629065d4 /klippy
parent8d6ecd9af87d3e0da312588bacb1c43332412107 (diff)
downloadkutter-a38437f378ece33cb762b482120be629c78d3540.tar.gz
kutter-a38437f378ece33cb762b482120be629c78d3540.tar.xz
kutter-a38437f378ece33cb762b482120be629c78d3540.zip
stepper: Introduce stepper_get_position command and remove from endstop.c
Move the logic to calculate and report the stepper's current position from endstop.c to stepper.c. This localizes the stepper code into stepper.c. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'klippy')
-rw-r--r--klippy/mcu.py19
-rw-r--r--klippy/serialhdl.py11
2 files changed, 17 insertions, 13 deletions
diff --git a/klippy/mcu.py b/klippy/mcu.py
index e4d17898..c7fde801 100644
--- a/klippy/mcu.py
+++ b/klippy/mcu.py
@@ -43,6 +43,8 @@ class MCU_stepper:
"set_next_step_dir oid=%c dir=%c")
self._reset_cmd = mcu.lookup_command(
"reset_step_clock oid=%c clock=%u")
+ self._get_position_cmd = mcu.lookup_command(
+ "stepper_get_position oid=%c")
ffi_main, self.ffi_lib = chelper.get_ffi()
self._stepqueue = ffi_main.gc(self.ffi_lib.stepcompress_alloc(
max_error, self._step_cmd.msgid
@@ -51,13 +53,9 @@ class MCU_stepper:
self.print_to_mcu_time = mcu.print_to_mcu_time
def get_oid(self):
return self._oid
- def get_invert_dir(self):
- return self._invert_dir
def set_position(self, pos):
self._mcu_position_offset += self.commanded_position - pos
self.commanded_position = pos
- def set_mcu_position(self, pos):
- self._mcu_position_offset = pos - self.commanded_position
def get_mcu_position(self):
return self.commanded_position + self._mcu_position_offset
def note_homing_start(self, homing_clock):
@@ -71,6 +69,14 @@ class MCU_stepper:
ret = self.ffi_lib.stepcompress_reset(self._stepqueue, 0)
if ret:
raise error("Internal error in stepcompress")
+ def note_homing_triggered(self):
+ params = self._mcu.serial.send_with_response(
+ self._get_position_cmd.encode(self._oid),
+ 'stepper_position', self._oid)
+ pos = params['pos']
+ if self._invert_dir:
+ pos = -pos
+ self._mcu_position_offset = pos - self.commanded_position
def reset_step_clock(self, mcu_time):
clock = int(mcu_time * self._mcu_freq)
ret = self.ffi_lib.stepcompress_reset(self._stepqueue, clock)
@@ -188,10 +194,7 @@ class MCU_endstop:
if not self._homing:
return False
if not self._last_state.get('homing', 0):
- pos = self._last_state.get('pos', 0)
- if self._stepper.get_invert_dir():
- pos = -pos
- self._stepper.set_mcu_position(pos)
+ self._stepper.note_homing_triggered()
self._homing = False
return False
if (self._mcu.serial.get_clock(last_sent_time)
diff --git a/klippy/serialhdl.py b/klippy/serialhdl.py
index 8112d703..6ccd9636 100644
--- a/klippy/serialhdl.py
+++ b/klippy/serialhdl.py
@@ -171,8 +171,8 @@ class SerialReader:
def encode_and_send(self, data, minclock, reqclock, cq):
self.ffi_lib.serialqueue_encode_and_send(
self.serialqueue, cq, data, len(data), minclock, reqclock)
- def send_with_response(self, cmd, name):
- src = SerialRetryCommand(self, cmd, name)
+ def send_with_response(self, cmd, name, oid=None):
+ src = SerialRetryCommand(self, cmd, name, oid)
return src.get_response()
def alloc_command_queue(self):
return self.ffi_main.gc(self.ffi_lib.serialqueue_alloc_commandqueue(),
@@ -235,17 +235,18 @@ class SerialReader:
class SerialRetryCommand:
TIMEOUT_TIME = 5.0
RETRY_TIME = 0.500
- def __init__(self, serial, cmd, name):
+ def __init__(self, serial, cmd, name, oid=None):
self.serial = serial
self.cmd = cmd
self.name = name
+ self.oid = oid
self.response = None
self.min_query_time = self.serial.reactor.monotonic()
- self.serial.register_callback(self.handle_callback, self.name)
+ self.serial.register_callback(self.handle_callback, self.name, self.oid)
self.send_timer = self.serial.reactor.register_timer(
self.send_event, self.serial.reactor.NOW)
def unregister(self):
- self.serial.unregister_callback(self.name)
+ self.serial.unregister_callback(self.name, self.oid)
self.serial.reactor.unregister_timer(self.send_timer)
def send_event(self, eventtime):
if self.response is not None: