import sys import socket from streams import EventStream from nicoscache import NicosStream from secop import ScanStream, ScanReply, TrySecopConnect, send_fake_udp from seinflux import SEHistory from servicemanager import FrappyManager USAGE = """ Usage: start server python feeder.py [] add a SECoP connection: python feeder.py + uri [device] [instrument] """ def main(dbname=None): # egen = EventStream(ScanReply(), ScanStream(), n=NicosStream('localhost:14002')) egen = EventStream(ScanReply(), ScanStream()) db = SEHistory(dbname, access='write') db.enable_write_access() host = socket.gethostname().split('.')[0] fm = FrappyManager() fm.get_info() # create map to get instrument from internal stream uri insmap = db.instrument_by_stream for ins, ports in fm.info.items(): for p in ports.values(): insmap[f'{host}:{p}'] = ins cfginfo = {} for ins, procs in fm.get_procs(cfginfo=cfginfo).items(): for service in procs: if service in procs: port = fm.info.get(ins, {}).get(service, {}) if port: uri = f'{host}:{port}' print('CREATE', uri, ins, cfginfo.get((ins, service))) TrySecopConnect(uri) db.set_instrument(uri, ins) event_map = {'value': db.add_float, 'error': db.add_error, 'stream': db.add_stream} try: while 1: for kind, *args in egen.get_events(): event_map[kind](*args) db.flush() finally: for kind, *args in egen.finish(): event_map[kind](*args) db.disconnect() if len(sys.argv) == 2: main(sys.argv[1]) elif len(sys.argv) > 2: if sys.argv[1] == '+': send_fake_udp(*sys.argv[2:]) else: print(USAGE) else: main()