updates from mlz repo

- asynconn: raise * from *
- asynconn: correct handling for timeout in AsynSerial
- add new py35compat
- target unit $

Change-Id: I052185ad3ebb3e3d1e3374f7ece9c7df06223951
This commit is contained in:
2021-11-10 14:37:57 +01:00
parent 41ce909172
commit a7b741eaa4
3 changed files with 90 additions and 35 deletions

View File

@ -29,7 +29,7 @@ from collections import OrderedDict
from secop.datatypes import ArrayOf, BoolType, EnumType, FloatRange, \
IntRange, StatusType, StringType, TextType, TupleOf
from secop.errors import BadValueError, ConfigError, InternalError, \
from secop.errors import BadValueError, ConfigError, \
ProgrammingError, SECoPError, SilentError, secop_error
from secop.lib import formatException, mkthread
from secop.lib.enum import Enum
@ -57,6 +57,7 @@ class HasAccessibles(HasProperties):
merged_properties = {} # dict of dict of merged properties
new_names = [] # list of names of new accessibles
override_values = {} # bare values overriding a parameter and methods overriding a command
for base in reversed(cls.__mro__):
for key, value in base.__dict__.items():
if isinstance(value, Accessible):
@ -66,8 +67,6 @@ class HasAccessibles(HasProperties):
accessibles[key] = value
override_values.pop(key, None)
elif key in accessibles:
# either a bare value overriding a parameter
# or a method overriding a command
override_values[key] = value
for aname, aobj in accessibles.items():
if aname in override_values:
@ -244,12 +243,12 @@ class Module(HasAccessibles):
# reference to the dispatcher (used for sending async updates)
DISPATCHER = None
pollerClass = Poller #: default poller used
def __init__(self, name, logger, cfgdict, srv):
# remember the dispatcher object (for the async callbacks)
self.DISPATCHER = srv.dispatcher
self.omit_unchanged_within = getattr(self.DISPATCHER, 'omit_unchanged_within', 0.1)
self.log = logger
self.name = name
self.valueCallbacks = {}
@ -444,23 +443,20 @@ class Module(HasAccessibles):
pobj = self.parameters[pname]
timestamp = timestamp or time.time()
changed = pobj.value != value
if value is not None:
pobj.value = value # store the value even in case of error
try:
# store the value even in case of error
pobj.value = pobj.datatype(value)
except Exception as e:
if not err: # do not overwrite given error
err = e
if err:
if not isinstance(err, SECoPError):
err = InternalError(err)
err = secop_error(err)
if str(err) == str(pobj.readerror):
return # do call updates for repeated errors
else:
try:
pobj.value = pobj.datatype(value)
except Exception as e:
err = secop_error(e)
if not changed and timestamp < ((pobj.timestamp or 0)
+ self.DISPATCHER.OMIT_UNCHANGED_WITHIN):
# no change within short time -> omit
return
pobj.timestamp = timestamp
elif not changed and timestamp < (pobj.timestamp or 0) + self.omit_unchanged_within:
# no change within short time -> omit
return
pobj.timestamp = timestamp or time.time()
pobj.readerror = err
if pobj.export:
self.DISPATCHER.announce_update(self.name, pname, pobj)
@ -495,15 +491,15 @@ class Module(HasAccessibles):
for pname in self.parameters:
errfunc = getattr(modobj, 'error_update_' + pname, None)
if errfunc:
def errcb(err, p=pname, m=modobj, efunc=errfunc):
def errcb(err, p=pname, efunc=errfunc):
try:
efunc(err)
except Exception as e:
m.announceUpdate(p, err=e)
modobj.announceUpdate(p, err=e)
self.errorCallbacks[pname].append(errcb)
else:
def errcb(err, p=pname, m=modobj):
m.announceUpdate(p, err=err)
def errcb(err, p=pname):
modobj.announceUpdate(p, err=err)
if pname in autoupdate:
self.errorCallbacks[pname].append(errcb)
@ -516,8 +512,8 @@ class Module(HasAccessibles):
efunc(e)
self.valueCallbacks[pname].append(cb)
elif pname in autoupdate:
def cb(value, p=pname, m=modobj):
m.announceUpdate(p, value)
def cb(value, p=pname):
modobj.announceUpdate(p, value)
self.valueCallbacks[pname].append(cb)
def isBusy(self, status=None):