frappy_psi.magfield: add trainmode
This commit is contained in:
@@ -61,6 +61,7 @@ class SimpleMagfield(HasStates, Drivable):
|
||||
'trained field (positive)',
|
||||
TupleOf(FloatRange(-99, 0, unit='$'), FloatRange(0, unit='$')),
|
||||
readonly=False, default=(0, 0))
|
||||
trainmode = Parameter('train mode flag', EnumType(off=0, on=1, undef=2), default=2)
|
||||
wait_stable_field = Parameter(
|
||||
'wait time to ensure field is stable', FloatRange(0, unit='s'), readonly=False, default=31)
|
||||
ramp_tmo = Parameter(
|
||||
@@ -149,10 +150,24 @@ class SimpleMagfield(HasStates, Drivable):
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def handle_train_mode(self):
|
||||
self.log.info('handle %r %r', self.trained, self.value)
|
||||
if self.trained[0] < self.value < self.trained[1]:
|
||||
trainmode = 'off'
|
||||
else:
|
||||
trainmode = 'on'
|
||||
if self.value > 0:
|
||||
self.trained = (self.trained[0], max(self.trained[1], self.value))
|
||||
else:
|
||||
self.trained = (min(self.trained[0], self.value), self.trained[1])
|
||||
if self.trainmode != trainmode:
|
||||
self.write_trainmode(trainmode)
|
||||
|
||||
@status_code(BUSY, 'ramping field')
|
||||
def ramp_to_target(self, sm):
|
||||
if sm.init:
|
||||
self.init_progress(sm, self.value)
|
||||
self.handle_train_mode()
|
||||
# Remarks: assume there is a ramp limiting feature
|
||||
if abs(self.value - sm.target) > self.tolerance:
|
||||
if self.get_progress(sm, self.value) > self.ramp_tmo:
|
||||
@@ -166,11 +181,15 @@ class SimpleMagfield(HasStates, Drivable):
|
||||
def stabilize_field(self, sm):
|
||||
if sm.now - sm.stabilize_start < self.wait_stable_field:
|
||||
return Retry
|
||||
self.handle_train_mode()
|
||||
return self.final_status()
|
||||
|
||||
def read_workingramp(self):
|
||||
return self.ramp
|
||||
|
||||
def write_trainmode(self, value):
|
||||
"""overwrite when needed"""
|
||||
|
||||
|
||||
class Magfield(SimpleMagfield):
|
||||
status = Parameter(datatype=StatusType(Status))
|
||||
@@ -335,6 +354,7 @@ class Magfield(SimpleMagfield):
|
||||
|
||||
@status_code(Status.RAMPING)
|
||||
def ramp_to_target(self, sm):
|
||||
self.handle_train_mode()
|
||||
dif = abs(self.value - sm.target)
|
||||
if sm.init:
|
||||
sm.stabilize_start = 0 # in case current is already at target
|
||||
@@ -353,6 +373,7 @@ class Magfield(SimpleMagfield):
|
||||
|
||||
@status_code(Status.STABILIZING)
|
||||
def stabilize_field(self, sm):
|
||||
self.handle_train_mode()
|
||||
if sm.now < sm.stabilize_start + self.wait_stable_field:
|
||||
return Retry
|
||||
return self.check_switch_off
|
||||
|
||||
Reference in New Issue
Block a user