diff --git a/dummy-webserver b/dummy-webserver index 8e5143d..2545365 100755 --- a/dummy-webserver +++ b/dummy-webserver @@ -1,9 +1,32 @@ #!/usr/bin/env python3 import sys +import argparse import pathlib sys.path.insert(0, str((pathlib.Path(__file__) / '..').resolve())) -import webserver -from dummy import SecopDummyInstrument +from webserver import server +from base import Client +from dummy import DummyGraph, DummyHistory +from secop import SecopInteractor -webserver.instrument = webserver.main(SecopDummyInstrument) + +def parseArgv(argv): + parser = argparse.ArgumentParser( + description="start webserver with dummy history and SECoP interaction", + ) + parser.add_argument("port", + type=str, + default='8888', + nargs='?', + help="port number to serve") + parser.add_argument('-u', + '--uri', + action='store', + help='SECoP uri', + default='localhost:5000') + return parser.parse_args(argv) + + +args = parseArgv(sys.argv[1:]) + +server.run(int(args.port), DummyHistory(args.uri), DummyGraph, Client, single_instrument='dummy', secop=SecopInteractor) diff --git a/dummy.py b/dummy.py index 0d5c056..d662bf4 100644 --- a/dummy.py +++ b/dummy.py @@ -2,12 +2,18 @@ import time import math import io from colors import assign_colors_to_curves -from secop import SecopInstrument, SecopClient -from base import get_abs_time +from secop import SecopClient +from base import get_abs_time, HandlerBase -class DummyGraph: - def __init__(self): +class DummyGraph(HandlerBase): + def __init__(self, server, instrument, device, tags): + super().__init__() # put methods w_... to handlers + self.handlers['graphpoll'] = self.graphpoll + self.server = server + self.instrument = instrument + self.device = device + self.tags = tags self.blocks = [] self.phase = {} self.end_time = 0 @@ -158,11 +164,7 @@ class DummyGraph: return None -class SecopDummyClient(SecopClient, DummyGraph): - def __init__(self, instrument): - SecopClient.__init__(self, instrument) - DummyGraph.__init__(self) - +class SecopDummyClient(SecopClient): def poll(self): messages = super().poll() msg = self.graphpoll() @@ -171,8 +173,9 @@ class SecopDummyClient(SecopClient, DummyGraph): return messages -class SecopDummyInstrument(SecopInstrument): - - def new_client(self): - return self.register(SecopDummyClient(self)) +class DummyHistory: + def __init__(self, stream): + self.stream = stream + def get_streams(self, instrument=None, **kwds): + return {self.stream: {'device': 'dummy'}} diff --git a/secop.py b/secop.py index 723963f..1b22496 100644 --- a/secop.py +++ b/secop.py @@ -29,18 +29,21 @@ class SecopInteractor(SecopClient): self.module_updates = set() self.param_updates = set() self.updates = {} + self.connect() + self.register_callback(None, updateItem=self.updateItem) def add_main_components(self, components): - # todo: treat non Readable classes correctly - components.extend(dict(type='rdlink', name=name + ':value', title=name) - for name in self.modules) + for name, desc in self.modules.items(): + component = dict(type='rdlink', name=f'{name}:value', title=name) + if 'status' in desc['parameters']: + component['statusname'] = f'{name}:status' + components.append(component) self.param_updates.add('value') self.param_updates.add('status') def get_components(self, path): module = self.modules[path] self.module_updates.add(path) # TODO: remove others? - # logging.info('MP %r', path) parameters = dict(module["parameters"]) components = [] for name in SecopInteractor.skip_par: