rework of the server side
main change: the same server may be used for several instruments - client classes are 'Interactors' dealing with the parameters etc. - methods from history are added to the clients + improvements on the js client side
This commit is contained in:
69
base.py
69
base.py
@ -1,6 +1,6 @@
|
||||
import sys
|
||||
import time
|
||||
import logging
|
||||
import uuid
|
||||
|
||||
ONEYEAR = 366 * 24 * 3600
|
||||
|
||||
@ -35,16 +35,63 @@ class Logger(object):
|
||||
pass
|
||||
|
||||
|
||||
class Instrument:
|
||||
class HandlerBase:
|
||||
def __init__(self):
|
||||
self.clients = {}
|
||||
self.handlers = {k[2:]: getattr(self, k) for k in dir(type(self)) if k.startswith('w_')}
|
||||
|
||||
def remove(self, client):
|
||||
try:
|
||||
del self.clients[client.id]
|
||||
except KeyError:
|
||||
logging.warning('client already removed %s', client.id)
|
||||
|
||||
def register(self, client):
|
||||
self.clients[client.id] = client
|
||||
return client
|
||||
class Client(HandlerBase):
|
||||
def __init__(self, server, streams, instrument_name, device_name):
|
||||
super().__init__()
|
||||
self.id = uuid.uuid4().hex[0:15]
|
||||
self.nodes = {}
|
||||
self.node_map = {}
|
||||
if streams:
|
||||
for uri in streams:
|
||||
urisplit = uri.rsplit('://')
|
||||
kind = urisplit[0] if len(urisplit) == 2 else 'secop'
|
||||
node = server.interactor_classes[kind](uri, self.node_map)
|
||||
self.nodes[uri] = node
|
||||
self.server = server
|
||||
self.instrument_name = instrument_name
|
||||
self.device_name = device_name # do not know if this is needed
|
||||
self.updates = {}
|
||||
|
||||
def poll(self):
|
||||
updates = sum((n.get_updates() for n in self.nodes.values()), start=[])
|
||||
result = [dict(type='update', updates=updates)] if updates else []
|
||||
graph_updates = self.handlers.get('graphpoll', object)()
|
||||
if graph_updates:
|
||||
result.append(graph_updates)
|
||||
return result
|
||||
|
||||
def w_getblock(self, path):
|
||||
path = path.split(',')[-1] # TODO: why this?
|
||||
if path == "main": # TODO: change to "-main-"?
|
||||
components = []
|
||||
for node in self.nodes.values():
|
||||
node.add_main_components(components)
|
||||
return dict(type='draw', path='main', title='modules', components=components)
|
||||
node = self.node_map[path]
|
||||
return dict(type='draw', path=path, title=path, components=node.get_components(path))
|
||||
|
||||
def w_updateblock(self, path):
|
||||
if path == 'main': # TODO: change to "-main-"?
|
||||
for node in self.nodes.values():
|
||||
node.update_main()
|
||||
else:
|
||||
node = self.node_map[path]
|
||||
node.update_params(path)
|
||||
return dict(type='accept-block')
|
||||
|
||||
def w_console(self): # TODO: check if still used
|
||||
return dict(type='accept-console')
|
||||
|
||||
def w_sendcommand(self, command):
|
||||
for node in self.nodes.values():
|
||||
if node.handle_command(command):
|
||||
break
|
||||
return dict(type='accept-command')
|
||||
|
||||
def info(self):
|
||||
return ["na"]
|
||||
|
Reference in New Issue
Block a user