change to secop.client.ProxyClient.register_callback

the code for calling register_callback is more readable and more
explicit now

Change-Id: I7a6a236d7f50b1ad391c1d49e3fb48f2580aa875
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/22564
Tested-by: JenkinsCodeReview <bjoern_pedersen@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
This commit is contained in:
zolliker 2020-03-02 10:59:56 +01:00
parent 199ff0419a
commit 4ed8cf5901
4 changed files with 18 additions and 16 deletions

View File

@ -107,21 +107,21 @@ class ProxyClient:
# caches (module, parameter) = value, timestamp, readerror (internal names!)
self.cache = {}
def register(self, key, obj=None, **kwds):
def register_callback(self, key, *args, **kwds):
"""register callback functions
- kwds each key must be a valid callback name defined in self.CALLBACK_NAMES
- kwds values are the callback functions
- if obj is not None, use its methods named from the callback name, if not given in kwds
- key might be either:
1) None: general callback (all callbacks)
2) <module name>: callbacks related to a module (not called for 'unhandledMessage')
3) (<module name>, <parameter name>): callback for specified parameter (only called for 'updateEvent')
- all the following arguments are callback functions. The callback name may be
given by the keyword, or, for non-keyworded arguments it is taken from the
__name__ attribute of the function
"""
for cbfunc in args:
kwds[cbfunc.__name__] = cbfunc
for cbname in self.CALLBACK_NAMES:
cbfunc = kwds.pop(cbname, None)
if obj and cbfunc is None:
cbfunc = getattr(obj, cbname, None)
if not cbfunc:
continue
cbdict = self.callbacks[cbname]

View File

@ -55,7 +55,7 @@ class QSECNode(QObject):
self.modules = conn.modules
self.properties = self.conn.properties
self.protocolVersion = conn.secop_version
conn.register(None, self) # generic callback
conn.register_callback(None, self.updateEvent, self.nodeStateChange, self.unhandledMessage)
# provide methods from old baseclient for making other gui code work
@ -81,7 +81,10 @@ class QSECNode(QObject):
return self.conn.getParameter(module, parameter, True)
def execCommand(self, module, command, arg):
return self.conn.execCommand(module, command, arg)
try:
return self.conn.execCommand(module, command, arg)
except Exception as e:
return 'ERROR: %r' % e, {}
def queryCache(self, module):
return {k: Value(*self.conn.cache[(module, k)])

View File

@ -70,10 +70,9 @@ class SecopClient(secop.client.SecopClient):
self.updateEvent(*key, *self.cache[key])
def descriptiveDataChange(self, module, data):
print('CHANGE', self.nodename)
if module is None:
self.log.error('descriptive data for node %r has changed', self.nodename)
self.dispatcher.restart()
#if module is None:
# self.log.error('descriptive data for node %r has changed', self.nodename)
class Router(secop.protocol.dispatcher.Dispatcher):
@ -99,7 +98,7 @@ class Router(secop.protocol.dispatcher.Dispatcher):
self.nodes = [SecopClient(uri, logger.getChild('routed%d' % i), self) for i, uri in enumerate(uris)]
# register callbacks
for node in self.nodes:
node.register(None, node)
node.register_callback(None, node.updateEvent, node.descriptiveDataChange, node.nodeStateChange)
self.node_by_module = {}
multievent = MultiEvent()
for node in self.nodes:
@ -113,7 +112,7 @@ class Router(secop.protocol.dispatcher.Dispatcher):
nodes.append(node)
else:
def check_new_node(online, state, self=self, node=node):
def nodeStateChange(online, state, self=self, node=node):
if online:
for module in node.modules:
self.node_by_module[module] = node
@ -122,7 +121,7 @@ class Router(secop.protocol.dispatcher.Dispatcher):
return secop.client.UNREGISTER
return None
node.register(None, nodeStateChange=check_new_node)
node.register_callback(None, nodeStateChange)
logger.warning('can not connect to node %r', node.nodename)
def handle_describe(self, conn, specifier, data):

View File

@ -61,7 +61,8 @@ class ProxyModule(Module):
if not self.module:
self.properties['module'] = self.name
self._secnode = self._iodev.secnode
self._secnode.register(self.module, self)
self._secnode.register_callback(self.module, self.updateEvent,
self.descriptiveDataChange, self.nodeStateChange)
super().initModule()
def descriptiveDataChange(self, module, moddesc):
@ -147,7 +148,6 @@ class SecNode(Module):
def earlyInit(self):
self.secnode = SecopClient(self.uri, self.log)
self.secnode.register(None, self) # for nodeStateChange
def startModule(self, started_callback):
self.secnode.spawn_connect(started_callback)