diff --git a/frappy_psi/phytron.py b/frappy_psi/phytron.py index cdbc024..ea0b08f 100644 --- a/frappy_psi/phytron.py +++ b/frappy_psi/phytron.py @@ -168,10 +168,9 @@ class Motor(HasOffset, HasStates, PersistentMixin, HasIO, Drivable): def write_target(self, value): self.read_alive_time() if self._reset_needed: - self.status = ERROR, 'reset needed after power up (probably position lost)' + if not self.status[1].startswith('reset needed'): + self.status = ERROR, 'reset needed after ' + self.status[1] raise HardwareError(self.status[1]) - if self.status[0] == ERROR: - raise HardwareError('need reset') self.saveParameters() if self.backlash: # drive first to target + backlash @@ -191,6 +190,7 @@ class Motor(HasOffset, HasStates, PersistentMixin, HasIO, Drivable): sysstatus = sysstatus[2:4] if self.axis == 'X' else sysstatus[6:8] status = self.STATUS_MAP.get(sysstatus) or (ERROR, f'unknown error {sysstatus}') if status[0] == ERROR: + self._reset_needed = True return status return super().read_status() # status from state machine @@ -212,6 +212,7 @@ class Motor(HasOffset, HasStates, PersistentMixin, HasIO, Drivable): self.value, e1, e2) self.get('S') # stop self.saveParameters() + self._reset_needed = True raise HardwareError('encoder lag error') @status_code(BUSY) @@ -242,6 +243,7 @@ class Motor(HasOffset, HasStates, PersistentMixin, HasIO, Drivable): if sm.mismatch_count > 2: self.log.error('encoder mismatch: abs(%g - %g) < %g', enc, pos, self.encoder_tolerance) + self._reset_needed = True raise HardwareError('encoder does not match pos') sm.mismatch_count += 1 return Retry @@ -255,7 +257,7 @@ class Motor(HasOffset, HasStates, PersistentMixin, HasIO, Drivable): def reset_error(self): """Reset error, set position to encoder""" self.read_value() - if self.status[0] == ERROR or self._reset_needed: + if self._reset_needed: newenc = enc = self.read_encoder() pos = self.value if abs(enc - pos) > self.encoder_tolerance or self.encoder_mode == 'NO':