From d82a2f88de130e7e6e65d6bbb3ecfcbeb4fc4bab Mon Sep 17 00:00:00 2001 From: Sven Augustin Date: Tue, 8 Dec 2020 15:16:57 +0100 Subject: [PATCH] added _move_requested flag, adjusted waiting (for start/move done) to use/set flag correctly, added _stop method which puts 1 to STOP.PROC PV and sets flag; consider move as done when holding phase starts; made both puts wait --- slic/devices/general/smaract.py | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/slic/devices/general/smaract.py b/slic/devices/general/smaract.py index 5d7fe0a5..a94038a6 100644 --- a/slic/devices/general/smaract.py +++ b/slic/devices/general/smaract.py @@ -41,6 +41,8 @@ class SmarActAxis(Adjustable): super().__init__(name=name, units=units) self.Id = Id + self._move_requested = False + self.pvs = SimpleNamespace( drive = PV(Id + ":DRIVE"), readback = PV(Id + ":MOTRBV"), @@ -65,24 +67,37 @@ class SmarActAxis(Adjustable): def set_target_value(self, value, hold=False): change = lambda: self._move(value) - stopper = lambda: self.pvs.stop.put(1) + stopper = lambda: self._stop() return self._as_task(change, stopper=stopper, hold=hold) def _move(self, value, checktime=0.1, timeout=60): timeout += time.time() - self.pvs.drive.put(value) + self._move_requested = True + self.pvs.drive.put(value, wait=True) - while not self.is_moving(): + # wait for start + while self._move_requested and not self.is_moving(): time.sleep(checktime) if time.time() >= timeout: tname = typename(self) + self._stop() raise SmarActError(f"starting to move {tname} \"{self.name}\" to {value} {self.units} timed out") - while self.is_moving(): + # wait for move done + while self._move_requested and self.is_moving(): + if self.pvs.status.get() == 3: # holding == arrived at target! + break time.sleep(checktime) + self._move_requested = False + + + def _stop(self): + self._move_requested = False + self.pvs.stop.put(1, wait=True) + def is_moving(self): """ @@ -98,11 +113,12 @@ class SmarActAxis(Adjustable): """ return self.pvs.status.get() != 0 + def stop(self): try: return super().stop() except: - self.pvs.stop.put(1) + self._stop() def within_limits(self, val):