frappy_psi.parmod: make async

This commit is contained in:
l_samenv 2024-05-07 10:25:02 +02:00
parent 7929c37027
commit d492f7326f

View File

@ -59,8 +59,12 @@ class Driv(Drivable):
read = Attached(description='<module>.<parameter> for read')
write = Attached(description='<module>.<parameter> for read')
unit = Property('main unit', StringType())
__error = None
__status = None
def setProperty(self, key, value):
# split properties read/write (including .<param>)
# 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)