use flag instead tolerance for redo check
when target is changed, a flag is set, and this is used to jump back in the sequence to the right step for redoing
This commit is contained in:
@ -84,6 +84,7 @@ class Magfield(HasLimits, Drivable):
|
||||
_state = None
|
||||
_init = True
|
||||
_super_sw_check = False
|
||||
_target_changed = False
|
||||
switch_time = None
|
||||
|
||||
def doPoll(self):
|
||||
@ -113,6 +114,7 @@ class Magfield(HasLimits, Drivable):
|
||||
|
||||
def write_target(self, target):
|
||||
self.check_limits(target)
|
||||
self._target_changed = target != self.target
|
||||
self.target = target
|
||||
if not self._state.is_active:
|
||||
# as long as the state machine is still running, it takes care of changing targets
|
||||
@ -145,7 +147,7 @@ class Magfield(HasLimits, Drivable):
|
||||
def start_field_change(self, state):
|
||||
self.setFastPoll(True, 1.0)
|
||||
self.status = Status.PREPARING, 'changed target field'
|
||||
if self.persistent_field == self.target:
|
||||
if abs(self.target - self.persistent_field) <= self.tolerance: # short cut
|
||||
return self.check_switch_off
|
||||
return self.start_ramp_to_field
|
||||
|
||||
@ -158,7 +160,7 @@ class Magfield(HasLimits, Drivable):
|
||||
|
||||
def ramp_to_field(self, state):
|
||||
"""ramping, wait for current at persistent field"""
|
||||
if self.persistent_field == self.target: # short cut
|
||||
if abs(self.target - self.persistent_field) <= self.tolerance: # short cut
|
||||
return self.check_switch_off
|
||||
if abs(self.current - self.persistent_field) > self.tolerance:
|
||||
if state.init:
|
||||
@ -196,11 +198,11 @@ class Magfield(HasLimits, Drivable):
|
||||
|
||||
def switch_on(self, state):
|
||||
"""wait for switch heater open"""
|
||||
if self.persistent_field == self.target: # short cut
|
||||
if abs(self.target - self.persistent_field) <= self.tolerance: # short cut
|
||||
return self.check_switch_off
|
||||
if state.now - self.switch_time < self.wait_switch_on:
|
||||
return Retry()
|
||||
state.set_point = self.target
|
||||
self._target_changed = False
|
||||
return self.start_ramp_to_target
|
||||
|
||||
def start_ramp_to_target(self, state):
|
||||
@ -212,8 +214,8 @@ class Magfield(HasLimits, Drivable):
|
||||
|
||||
def ramp_to_target(self, state):
|
||||
"""ramp field to target"""
|
||||
if state.set_point != self.target: # target changed
|
||||
state.set_point = self.target
|
||||
if self._target_changed:
|
||||
self._target_changed = False
|
||||
return self.start_ramp_to_target
|
||||
self.persistent_field = self.value
|
||||
# Remarks: assume there is a ramp limiting feature
|
||||
@ -226,6 +228,9 @@ class Magfield(HasLimits, Drivable):
|
||||
|
||||
def stabilize_field(self, state):
|
||||
"""stabilize field"""
|
||||
if self._target_changed:
|
||||
self._target_changed = False
|
||||
return self.start_ramp_to_target
|
||||
self.persistent_field = self.value
|
||||
if state.now - state.stabilize_start < self.wait_stable_field:
|
||||
if state.init:
|
||||
@ -253,9 +258,8 @@ class Magfield(HasLimits, Drivable):
|
||||
|
||||
def switch_off(self, state):
|
||||
"""wait for switch heater closed"""
|
||||
if self.persistent_field != self.target: # redo
|
||||
return self.start_switch_on
|
||||
if self.mode == Mode.DRIVEN:
|
||||
if self._target_changed or self.mode == Mode.DRIVEN:
|
||||
# target or mode has changed -> redo
|
||||
return self.start_switch_on
|
||||
self.persistent_field = self.value
|
||||
if state.now - self.switch_time < self.wait_switch_off:
|
||||
@ -272,7 +276,8 @@ class Magfield(HasLimits, Drivable):
|
||||
|
||||
def ramp_to_zero(self, state):
|
||||
"""ramp field to zero"""
|
||||
if self.persistent_field != self.target or self.mode == Mode.DRIVEN: # redo
|
||||
if self._target_changed or self.mode == Mode.DRIVEN:
|
||||
# target or mode has changed -> redo
|
||||
return self.start_field_change
|
||||
if abs(self.current) > self.tolerance:
|
||||
if state.init:
|
||||
|
Reference in New Issue
Block a user