From d492f7326f3b82d30c57b4e5b52c0b7d69edf4c6 Mon Sep 17 00:00:00 2001 From: l_samenv Date: Tue, 7 May 2024 10:25:02 +0200 Subject: [PATCH] frappy_psi.parmod: make async --- frappy_psi/parmod.py | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/frappy_psi/parmod.py b/frappy_psi/parmod.py index 1b6fe3c..f27d2b5 100644 --- a/frappy_psi/parmod.py +++ b/frappy_psi/parmod.py @@ -59,8 +59,12 @@ class Driv(Drivable): read = Attached(description='. for read') write = Attached(description='. for read') unit = Property('main unit', StringType()) + __error = None + __status = None def setProperty(self, key, value): + # split properties read/write (including .) + # into read/write (modules) and read_param/write_param (parameters) if key in ('read', 'write'): value, param = value.split('.') setattr(self, f'{key}_param', param) @@ -73,9 +77,24 @@ class Driv(Drivable): super().checkProperties() def registerUpdates(self): - self.read.addCallback(self.read_param, self.announceUpdate, 'value') + if self.read_param == 'value': + try: + self.read.addCallback('status', self.updateReadStatus) + except KeyError: + pass # may be not needed: value is present but not status + self.read.addCallback(self.read_param, self.updateValue) self.write.addCallback(self.write_param, self.announceUpdate, 'target') + def updateReadStatus(self, status, err=None): + self.__status = status + self.read_status() + + def updateValue(self, value, err=None): + self.announceUpdate('value', value, err) + if err != self.__error: + self.__error = err + self.read_status() + def startModule(self, start_events): start_events.queue(self.registerUpdates) super().startModule(start_events) @@ -88,8 +107,13 @@ class Driv(Drivable): def read_target(self): return getattr(self.write, f'read_{self.write_param}')() + @nopoll def read_status(self): - return IDLE, '' + if self.__status: + if self.__status[0] < ERROR and self.__error: + return ERROR, repr(self.__error) + return self.__status + return (ERROR, repr(self.__error)) if self.__error else (IDLE, '') def write_target(self, target): return getattr(self.write, f'write_{self.write_param}')(target) @@ -103,19 +127,6 @@ class Converging(HasConvergence, Driv): self.parameters['tolerance'].setProperty('unit', self.unit) super().checkProperties() - #def update_value(self, value): - # print('UV', value) - # self.value = value - - #def error_update_value(self, err): - # raise err - - #def update_target(self, value): - # self.target = value - - #def error_update_target(self, err): - # raise err - def write_target(self, target): self.convergence_start() return super().write_target(target)