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:
@ -107,21 +107,21 @@ class ProxyClient:
|
|||||||
# caches (module, parameter) = value, timestamp, readerror (internal names!)
|
# caches (module, parameter) = value, timestamp, readerror (internal names!)
|
||||||
self.cache = {}
|
self.cache = {}
|
||||||
|
|
||||||
def register(self, key, obj=None, **kwds):
|
def register_callback(self, key, *args, **kwds):
|
||||||
"""register callback functions
|
"""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:
|
- key might be either:
|
||||||
1) None: general callback (all callbacks)
|
1) None: general callback (all callbacks)
|
||||||
2) <module name>: callbacks related to a module (not called for 'unhandledMessage')
|
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')
|
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:
|
for cbname in self.CALLBACK_NAMES:
|
||||||
cbfunc = kwds.pop(cbname, None)
|
cbfunc = kwds.pop(cbname, None)
|
||||||
if obj and cbfunc is None:
|
|
||||||
cbfunc = getattr(obj, cbname, None)
|
|
||||||
if not cbfunc:
|
if not cbfunc:
|
||||||
continue
|
continue
|
||||||
cbdict = self.callbacks[cbname]
|
cbdict = self.callbacks[cbname]
|
||||||
|
@ -55,7 +55,7 @@ class QSECNode(QObject):
|
|||||||
self.modules = conn.modules
|
self.modules = conn.modules
|
||||||
self.properties = self.conn.properties
|
self.properties = self.conn.properties
|
||||||
self.protocolVersion = conn.secop_version
|
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
|
# 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)
|
return self.conn.getParameter(module, parameter, True)
|
||||||
|
|
||||||
def execCommand(self, module, command, arg):
|
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):
|
def queryCache(self, module):
|
||||||
return {k: Value(*self.conn.cache[(module, k)])
|
return {k: Value(*self.conn.cache[(module, k)])
|
||||||
|
@ -70,10 +70,9 @@ class SecopClient(secop.client.SecopClient):
|
|||||||
self.updateEvent(*key, *self.cache[key])
|
self.updateEvent(*key, *self.cache[key])
|
||||||
|
|
||||||
def descriptiveDataChange(self, module, data):
|
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()
|
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):
|
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)]
|
self.nodes = [SecopClient(uri, logger.getChild('routed%d' % i), self) for i, uri in enumerate(uris)]
|
||||||
# register callbacks
|
# register callbacks
|
||||||
for node in self.nodes:
|
for node in self.nodes:
|
||||||
node.register(None, node)
|
node.register_callback(None, node.updateEvent, node.descriptiveDataChange, node.nodeStateChange)
|
||||||
self.node_by_module = {}
|
self.node_by_module = {}
|
||||||
multievent = MultiEvent()
|
multievent = MultiEvent()
|
||||||
for node in self.nodes:
|
for node in self.nodes:
|
||||||
@ -113,7 +112,7 @@ class Router(secop.protocol.dispatcher.Dispatcher):
|
|||||||
nodes.append(node)
|
nodes.append(node)
|
||||||
else:
|
else:
|
||||||
|
|
||||||
def check_new_node(online, state, self=self, node=node):
|
def nodeStateChange(online, state, self=self, node=node):
|
||||||
if online:
|
if online:
|
||||||
for module in node.modules:
|
for module in node.modules:
|
||||||
self.node_by_module[module] = node
|
self.node_by_module[module] = node
|
||||||
@ -122,7 +121,7 @@ class Router(secop.protocol.dispatcher.Dispatcher):
|
|||||||
return secop.client.UNREGISTER
|
return secop.client.UNREGISTER
|
||||||
return None
|
return None
|
||||||
|
|
||||||
node.register(None, nodeStateChange=check_new_node)
|
node.register_callback(None, nodeStateChange)
|
||||||
logger.warning('can not connect to node %r', node.nodename)
|
logger.warning('can not connect to node %r', node.nodename)
|
||||||
|
|
||||||
def handle_describe(self, conn, specifier, data):
|
def handle_describe(self, conn, specifier, data):
|
||||||
|
@ -61,7 +61,8 @@ class ProxyModule(Module):
|
|||||||
if not self.module:
|
if not self.module:
|
||||||
self.properties['module'] = self.name
|
self.properties['module'] = self.name
|
||||||
self._secnode = self._iodev.secnode
|
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()
|
super().initModule()
|
||||||
|
|
||||||
def descriptiveDataChange(self, module, moddesc):
|
def descriptiveDataChange(self, module, moddesc):
|
||||||
@ -147,7 +148,6 @@ class SecNode(Module):
|
|||||||
|
|
||||||
def earlyInit(self):
|
def earlyInit(self):
|
||||||
self.secnode = SecopClient(self.uri, self.log)
|
self.secnode = SecopClient(self.uri, self.log)
|
||||||
self.secnode.register(None, self) # for nodeStateChange
|
|
||||||
|
|
||||||
def startModule(self, started_callback):
|
def startModule(self, started_callback):
|
||||||
self.secnode.spawn_connect(started_callback)
|
self.secnode.spawn_connect(started_callback)
|
||||||
|
Reference in New Issue
Block a user