From 82e9b599add62de81c3ccbb117999ebaf3a27436 Mon Sep 17 00:00:00 2001 From: Markus Zolliker Date: Thu, 23 Nov 2023 16:17:35 +0100 Subject: [PATCH] sea: make sure status is error when reading main value failed + cosmetic changes using status codes Change-Id: Ice49a6d5494d2e2cba76d138f11dffeba9aa349d --- frappy_psi/sea.py | 59 +++++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/frappy_psi/sea.py b/frappy_psi/sea.py index 78479ec..47fc1fa 100644 --- a/frappy_psi/sea.py +++ b/frappy_psi/sea.py @@ -39,6 +39,7 @@ from os.path import expanduser, join, exists from frappy.client import ProxyClient from frappy.datatypes import ArrayOf, BoolType, \ EnumType, FloatRange, IntRange, StringType +from frappy.core import IDLE, BUSY, ERROR from frappy.errors import ConfigError, HardwareError, secop_error, CommunicationFailedError from frappy.lib import generalConfig, mkthread from frappy.lib.asynconn import AsynConn, ConnectionClosed @@ -641,6 +642,10 @@ class SeaModule(Module): if upd: upd(value, timestamp, readerror) return + self.announceUpdate(parameter, value, readerror, timestamp) + # self._update(module, parameter, value, timestamp, readerror) + + def _update(self, module, parameter, value, timestamp, readerror): try: pobj = self.parameters[parameter] except KeyError: @@ -667,20 +672,36 @@ class SeaModule(Module): class SeaReadable(SeaModule, Readable): + _readerror = None + _status = IDLE, '' + + def update_value(self, value, timestamp, readerror): + # make sure status is always ERROR when reading value fails + self._readerror = readerror + if readerror: + self.read_status() + self.announceUpdate('value', value, readerror, timestamp) + # self._update(self.name, 'value', value, timestamp, readerror) + else: # order is important + self.value = value + self.read_status() def update_status(self, value, timestamp, readerror): if readerror: value = repr(readerror) if value == '': - self.status = (self.Status.IDLE, '') + self._status = IDLE, '' else: - self.status = (self.Status.ERROR, value) + self._status = ERROR, value + self.read_status() def read_status(self): - return self.status + if self._readerror: + return ERROR, repr(self._readerror) + return self._status -class SeaWritable(SeaModule, Writable): +class SeaWritable(SeaReadable, Writable): def read_value(self): return self.target @@ -690,20 +711,13 @@ class SeaWritable(SeaModule, Writable): self.value = value -class SeaDrivable(SeaModule, Drivable): - _sea_status = '' +class SeaDrivable(SeaReadable, Drivable): _is_running = 0 def earlyInit(self): super().earlyInit() self._run_event = threading.Event() - def read_status(self): - return self.status - - # def read_target(self): - # return self.target - def write_target(self, value): self._run_event.clear() self.io.query(f'run {self.sea_object} {value}') @@ -711,25 +725,20 @@ class SeaDrivable(SeaModule, Drivable): self.log.warn('target changed but is_running stays 0') return value - def update_status(self, value, timestamp, readerror): - if not readerror: - self._sea_status = value - self.updateStatus() - def update_is_running(self, value, timestamp, readerror): if not readerror: self._is_running = value - self.updateStatus() + self.read_status() if value: self._run_event.set() - def updateStatus(self): - if self._sea_status: - self.status = (self.Status.ERROR, self._sea_status) - elif self._is_running: - self.status = (self.Status.BUSY, 'driving') - else: - self.status = (self.Status.IDLE, '') + def read_status(self): + status = super().read_status() + if self._is_running: + if status[0] >= ERROR: + return ERROR, 'BUSY + ' + status[1] + return BUSY, 'driving' + return status def updateTarget(self, module, parameter, value, timestamp, readerror): if value is not None: