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:
parent
199ff0419a
commit
4ed8cf5901
@ -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]
|
||||
|
@ -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)])
|
||||
|
@ -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):
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user