sea: make sure status is error when reading main value failed

+ cosmetic changes using status codes

Change-Id: Ice49a6d5494d2e2cba76d138f11dffeba9aa349d
This commit is contained in:
2023-11-23 16:17:35 +01:00
parent c4781d3d70
commit 82e9b599ad

View File

@ -39,6 +39,7 @@ from os.path import expanduser, join, exists
from frappy.client import ProxyClient from frappy.client import ProxyClient
from frappy.datatypes import ArrayOf, BoolType, \ from frappy.datatypes import ArrayOf, BoolType, \
EnumType, FloatRange, IntRange, StringType EnumType, FloatRange, IntRange, StringType
from frappy.core import IDLE, BUSY, ERROR
from frappy.errors import ConfigError, HardwareError, secop_error, CommunicationFailedError from frappy.errors import ConfigError, HardwareError, secop_error, CommunicationFailedError
from frappy.lib import generalConfig, mkthread from frappy.lib import generalConfig, mkthread
from frappy.lib.asynconn import AsynConn, ConnectionClosed from frappy.lib.asynconn import AsynConn, ConnectionClosed
@ -641,6 +642,10 @@ class SeaModule(Module):
if upd: if upd:
upd(value, timestamp, readerror) upd(value, timestamp, readerror)
return return
self.announceUpdate(parameter, value, readerror, timestamp)
# self._update(module, parameter, value, timestamp, readerror)
def _update(self, module, parameter, value, timestamp, readerror):
try: try:
pobj = self.parameters[parameter] pobj = self.parameters[parameter]
except KeyError: except KeyError:
@ -667,20 +672,36 @@ class SeaModule(Module):
class SeaReadable(SeaModule, Readable): 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): def update_status(self, value, timestamp, readerror):
if readerror: if readerror:
value = repr(readerror) value = repr(readerror)
if value == '': if value == '':
self.status = (self.Status.IDLE, '') self._status = IDLE, ''
else: else:
self.status = (self.Status.ERROR, value) self._status = ERROR, value
self.read_status()
def read_status(self): 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): def read_value(self):
return self.target return self.target
@ -690,20 +711,13 @@ class SeaWritable(SeaModule, Writable):
self.value = value self.value = value
class SeaDrivable(SeaModule, Drivable): class SeaDrivable(SeaReadable, Drivable):
_sea_status = ''
_is_running = 0 _is_running = 0
def earlyInit(self): def earlyInit(self):
super().earlyInit() super().earlyInit()
self._run_event = threading.Event() self._run_event = threading.Event()
def read_status(self):
return self.status
# def read_target(self):
# return self.target
def write_target(self, value): def write_target(self, value):
self._run_event.clear() self._run_event.clear()
self.io.query(f'run {self.sea_object} {value}') 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') self.log.warn('target changed but is_running stays 0')
return value 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): def update_is_running(self, value, timestamp, readerror):
if not readerror: if not readerror:
self._is_running = value self._is_running = value
self.updateStatus() self.read_status()
if value: if value:
self._run_event.set() self._run_event.set()
def updateStatus(self): def read_status(self):
if self._sea_status: status = super().read_status()
self.status = (self.Status.ERROR, self._sea_status) if self._is_running:
elif self._is_running: if status[0] >= ERROR:
self.status = (self.Status.BUSY, 'driving') return ERROR, 'BUSY + ' + status[1]
else: return BUSY, 'driving'
self.status = (self.Status.IDLE, '') return status
def updateTarget(self, module, parameter, value, timestamp, readerror): def updateTarget(self, module, parameter, value, timestamp, readerror):
if value is not None: if value is not None: