refactored SmarActRecord.move()

This commit is contained in:
2020-08-21 12:59:19 +02:00
parent 496bbf816a
commit 1fbc002806
+75 -51
View File
@@ -119,77 +119,101 @@ class SmarActRecord(Adjustable):
-12 : target value outside soft limits. Move not attempted.
-11 : drive PV is not connected. Move not attempted.
-8 : move started, but timed-out.
-7 : move started, timed-out, but appears done.
# -7 : move started, timed-out, but appears done.
-5 : move started, unexpected return value from PV.put().
-4 : move-with-wait finished, soft limit violation seen.
-3 : move-with-wait finished, hard limit violation seen.
0 : move-with-wait finish OK.
# -4 : move-with-wait finished, soft limit violation seen.
# -3 : move-with-wait finished, hard limit violation seen.
0 : move-with-wait finished OK.
0 : move-without-wait executed, move not confirmed.
1 : move-without-wait executed, move confirmed.
3 : move-without-wait finished, hard limit violation seen.
4 : move-without-wait finished, soft limit violation seen.
# 3 : move-without-wait finished, hard limit violation seen.
# 4 : move-without-wait finished, soft limit violation seen.
"""
NONFLOAT, OUTSIDE_LIMITS, UNCONNECTED = -13, -12, -11
TIMEOUT = -8
UNKNOWN_ERROR = -5
DONE_OK = 0
MOVE_BEGUN, MOVE_BEGUN_CONFIRMED = 0, 1
INVALID_VALUE = -13
OUTSIDE_LIMITS = -12
NOT_CONNECTED = -11
TIMEOUT = -8
UNKNOWN_ERROR = -5
SUCCESS = 0
EXECUTED = 0
CONFIRMED = 1
PV_PUT_SUCCESS = 1
PV_PUT_TIMEOUT = -1
try:
val = float(val)
except TypeError:
return NONFLOAT
except Exception:
return INVALID_VALUE
if relative:
val += self.pvs.drive.get()
# Check for limit violations
if not ignore_limits:
if not self.within_limits(val):
return OUTSIDE_LIMITS
stat = self.pvs.drive.put(val, wait=wait, timeout=timeout)
if stat is None:
return UNCONNECTED
if wait and stat == -1:
if stat is None:
return NOT_CONNECTED
if wait and stat == PV_PUT_TIMEOUT:
return TIMEOUT
if 1 == stat:
s0 = self.pvs.status.get()
s1 = s0
t0 = time.time()
t1 = t0 + min(10.0, timeout) # should be moving by now
thold = self.pvs.hold.get() * 0.001 + t0
tout = t0 + timeout
if wait or confirm_move:
while time.time() <= thold and s1 == 3:
ca.poll(evt=1.0e-2)
s1 = self.pvs.status.get()
while time.time() <= t1 and s1 == 0:
ca.poll(evt=1.0e-2)
s1 = self.pvs.status.get()
if s1 == 4:
if wait:
while time.time() <= tout and s1 == 4:
ca.poll(evt=1.0e-2)
s1 = self.pvs.status.get()
if s1 == 3 or s1 == 4:
if time.time() > tout:
return TIMEOUT
else:
twv = abs(self.pvs.twv.get())
while s1 == 3 and time.time() <= tout and abs(self.pvs.readback.get() - val) >= twv:
ca.poll(evt=1.0e-2)
return DONE_OK
else:
return MOVE_BEGUN_CONFIRMED
elif time.time() > tout:
return TIMEOUT
else:
return UNKNOWN_ERROR
if stat != PV_PUT_SUCCESS:
return UNKNOWN_ERROR
s1 = self.pvs.status.get() #TODO: what do the return values (0, 3, 4) mean?
t0 = time.time()
thold = t0 + self.pvs.hold.get() * 0.001
t1 = t0 + min(timeout, 10.0) # should be moving by now #TODO: why? what is this doing?
tout = t0 + timeout
if not wait and not confirm_move:
return EXECUTED
while s1 == 3 and time.time() <= thold:
ca.poll(evt=1.0e-2)
s1 = self.pvs.status.get()
while s1 == 0 and time.time() <= t1:
ca.poll(evt=1.0e-2)
s1 = self.pvs.status.get()
if s1 != 4:
if time.time() > tout:
return TIMEOUT
else:
return MOVE_BEGUN
return UNKNOWN_ERROR
if not wait:
return CONFIRMED
while s1 == 4 and time.time() <= tout:
ca.poll(evt=1.0e-2)
s1 = self.pvs.status.get()
if s1 not in (3, 4):
return UNKNOWN_ERROR
if time.time() > tout:
return TIMEOUT
twv = self.pvs.twv.get()
twv = abs(twv)
while s1 == 3 and time.time() <= tout:
ca.poll(evt=1.0e-2)
s1 = self.pvs.status.get()
delta = self.pvs.readback.get() - val
delta = abs(delta)
if delta < twv:
return SUCCESS
return UNKNOWN_ERROR