simplify callbacks

on Module, use one single callback list 'paramsCallback' instead of
'valueCallbacks', 'errorCallbacks'. Redesign the mechanism to
avoid most of the closures.

Change-Id: Ie7f68f6bf97ab3f3cd961faa20b0e77730e5b37d
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/33118
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
This commit is contained in:
2024-02-26 16:42:39 +01:00
parent af28511403
commit 6e7be6b4c7
5 changed files with 228 additions and 92 deletions

View File

@ -27,7 +27,7 @@ import numpy as np
from scipy.interpolate import splev, splrep # pylint: disable=import-error
from frappy.core import Attached, BoolType, Parameter, Readable, StringType, \
FloatRange
FloatRange, nopoll
def linear(x):
@ -195,35 +195,40 @@ class Sensor(Readable):
if self.description == '_':
self.description = f'{self.rawsensor!r} calibrated with curve {self.calib!r}'
def doPoll(self):
self.read_status()
def write_calib(self, value):
self._calib = CalCurve(value)
return value
def update_value(self, value):
def _get_value(self, rawvalue):
if self.abs:
value = abs(float(value))
self.value = self._calib(value)
self._value_error = None
rawvalue = abs(float(rawvalue))
return self._calib(rawvalue)
def error_update_value(self, err):
if self.abs and str(err) == 'R_UNDER': # hack: ignore R_UNDER from ls370
self._value_error = None
return None
self._value_error = repr(err)
raise err
def _get_status(self, rawstatus):
return rawstatus if self._value_error is None else (self.Status.ERROR, self._value_error)
def update_status(self, value):
if self._value_error is None:
self.status = value
def update_value(self, rawvalue, err=None):
if err:
if self.abs and str(err) == 'R_UNDER': # hack: ignore R_UNDER from ls370
self._value_error = None
return
err = repr(err)
else:
self.status = self.Status.ERROR, self._value_error
try:
self.value = self._get_value(rawvalue)
except Exception as e:
err = repr(e)
if err != self._value_error:
self._value_error = err
self.status = self._get_status(self.rawsensor.status)
def update_status(self, rawstatus):
self.status = self._get_status(rawstatus)
@nopoll
def read_value(self):
return self._calib(self.rawsensor.read_value())
return self._get_value(self.rawsensor.read_value())
@nopoll
def read_status(self):
self.update_status(self.rawsensor.status)
return self.status
return self._get_status(self.rawsensor.read_status())