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