gui: send monitor requests to core device

This commit is contained in:
Sebastien Bourdeauducq 2015-06-05 14:52:41 +08:00
parent a6a476593e
commit 9f9079589e
6 changed files with 131 additions and 24 deletions

View File

@ -11,10 +11,12 @@ from pyqtgraph import dockarea
from artiq.protocols.file_db import FlatFileDB from artiq.protocols.file_db import FlatFileDB
from artiq.protocols.pc_rpc import AsyncioClient from artiq.protocols.pc_rpc import AsyncioClient
from artiq.protocols.sync_struct import Subscriber
from artiq.gui.explorer import ExplorerDock from artiq.gui.explorer import ExplorerDock
from artiq.gui.moninj import MonInjTTLDock, MonInjDDSDock
from artiq.gui.parameters import ParametersDock from artiq.gui.parameters import ParametersDock
from artiq.gui.log import LogDock
from artiq.gui.schedule import ScheduleDock from artiq.gui.schedule import ScheduleDock
from artiq.gui.log import LogDock
def get_argparser(): def get_argparser():
@ -59,26 +61,41 @@ def main():
win.setWindowTitle("ARTIQ") win.setWindowTitle("ARTIQ")
d_explorer = ExplorerDock(status_bar, schedule_ctl) d_explorer = ExplorerDock(status_bar, schedule_ctl)
area.addDock(d_explorer, "top")
loop.run_until_complete(d_explorer.sub_connect( loop.run_until_complete(d_explorer.sub_connect(
args.server, args.port_notify)) args.server, args.port_notify))
atexit.register(lambda: loop.run_until_complete(d_explorer.sub_close())) atexit.register(lambda: loop.run_until_complete(d_explorer.sub_close()))
d_ttl = MonInjTTLDock()
loop.run_until_complete(d_ttl.start())
atexit.register(lambda: loop.run_until_complete(d_ttl.stop()))
d_dds = MonInjDDSDock()
devices_sub = Subscriber("devices",
[d_ttl.init_devices, d_dds.init_devices])
loop.run_until_complete(
devices_sub.connect(args.server, args.port_notify))
atexit.register(
lambda: loop.run_until_complete(devices_sub.close()))
area.addDock(d_dds, "top")
area.addDock(d_ttl, "above", d_dds)
area.addDock(d_explorer, "above", d_ttl)
d_params = ParametersDock() d_params = ParametersDock()
area.addDock(d_params, "right", d_explorer) area.addDock(d_params, "right", d_explorer)
loop.run_until_complete(d_params.sub_connect( loop.run_until_complete(d_params.sub_connect(
args.server, args.port_notify)) args.server, args.port_notify))
atexit.register(lambda: loop.run_until_complete(d_params.sub_close())) atexit.register(lambda: loop.run_until_complete(d_params.sub_close()))
d_log = LogDock()
area.addDock(d_log, "bottom")
d_schedule = ScheduleDock(schedule_ctl) d_schedule = ScheduleDock(schedule_ctl)
area.addDock(d_schedule, "above", d_log)
loop.run_until_complete(d_schedule.sub_connect( loop.run_until_complete(d_schedule.sub_connect(
args.server, args.port_notify)) args.server, args.port_notify))
atexit.register(lambda: loop.run_until_complete(d_schedule.sub_close())) atexit.register(lambda: loop.run_until_complete(d_schedule.sub_close()))
d_log = LogDock()
area.addDock(d_log, "bottom")
area.addDock(d_schedule, "above", d_log)
win.show() win.show()
loop.run_forever() loop.run_forever()

View File

@ -23,7 +23,7 @@ class _ExplistModel(DictSyncModel):
class ExplorerDock(dockarea.Dock): class ExplorerDock(dockarea.Dock):
def __init__(self, status_bar, schedule_ctl): def __init__(self, status_bar, schedule_ctl):
dockarea.Dock.__init__(self, "Explorer", size=(1100, 400)) dockarea.Dock.__init__(self, "Explorer", size=(1500, 500))
self.status_bar = status_bar self.status_bar = status_bar
self.schedule_ctl = schedule_ctl self.schedule_ctl = schedule_ctl

89
artiq/gui/moninj.py Normal file
View File

@ -0,0 +1,89 @@
import asyncio
import logging
import socket
import struct
from quamash import QtGui
from pyqtgraph import dockarea
from artiq.tools import TaskObject
logger = logging.getLogger(__name__)
class _DeviceManager:
def __init__(self, init):
self.comm = None
if "comm" in init:
self.comm = init["comm"]
def __setitem__(self, k, v):
if k == "comm":
self.comm = v
def get_core_addr(self):
if self.comm is None:
return None
try:
return self.comm["arguments"]["host"]
except KeyError:
return None
class MonInjTTLDock(dockarea.Dock, TaskObject):
def __init__(self):
dockarea.Dock.__init__(self, "TTL", size=(1500, 500))
self.dm = _DeviceManager(dict())
self.transport = None
@asyncio.coroutine
def start(self):
loop = asyncio.get_event_loop()
yield from loop.create_datagram_endpoint(lambda: self, family=socket.AF_INET)
TaskObject.start(self)
@asyncio.coroutine
def stop(self):
yield from TaskObject.stop(self)
if self.transport is not None:
self.transport.close()
self.transport = None
def connection_made(self, transport):
self.transport = transport
def datagram_received(self, data, addr):
levels, oe = struct.unpack(">QQ", data)
print("Received:", hex(levels), hex(oe))
def error_received(self, exc):
logger.warning("datagram endpoint error")
def connection_lost(self, exc):
self.transport = None
@asyncio.coroutine
def _do(self):
while True:
yield from asyncio.sleep(0.2)
ca = self.dm.get_core_addr()
if ca is None:
logger.warning("could not find core device address")
elif self.transport is None:
logger.warning("datagram endpoint not available")
else:
# MONINJ_REQ_MONITOR
self.transport.sendto(b"\x01", (ca, 3250))
def init_devices(self, d):
self.dm = _DeviceManager(d)
return self.dm
class MonInjDDSDock(dockarea.Dock):
def __init__(self):
dockarea.Dock.__init__(self, "DDS", size=(1500, 500))
def init_devices(self, d):
return d

View File

@ -26,7 +26,7 @@ class ParametersModel(DictSyncModel):
class ParametersDock(dockarea.Dock): class ParametersDock(dockarea.Dock):
def __init__(self): def __init__(self):
dockarea.Dock.__init__(self, "Parameters", size=(500, 300)) dockarea.Dock.__init__(self, "Parameters", size=(400, 300))
self.table = QtGui.QTableView() self.table = QtGui.QTableView()
self.table.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) self.table.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)

View File

@ -4,7 +4,8 @@ from enum import Enum
from time import time from time import time
from artiq.master.worker import Worker from artiq.master.worker import Worker
from artiq.tools import asyncio_wait_or_cancel, asyncio_queue_peek, WaitSet from artiq.tools import (asyncio_wait_or_cancel, asyncio_queue_peek,
TaskObject, WaitSet)
from artiq.protocols.sync_struct import Notifier from artiq.protocols.sync_struct import Notifier
@ -149,21 +150,6 @@ class RunPool:
del self.runs[rid] del self.runs[rid]
class TaskObject:
def start(self):
self.task = asyncio.async(self._do())
@asyncio.coroutine
def stop(self):
self.task.cancel()
yield from asyncio.wait([self.task])
del self.task
@asyncio.coroutine
def _do(self):
raise NotImplementedError
class PrepareStage(TaskObject): class PrepareStage(TaskObject):
def __init__(self, flush_tracker, delete_cb, pool, outq): def __init__(self, flush_tracker, delete_cb, pool, outq):
self.flush_tracker = flush_tracker self.flush_tracker = flush_tracker

View File

@ -130,6 +130,21 @@ def asyncio_queue_peek(q):
raise asyncio.QueueEmpty raise asyncio.QueueEmpty
class TaskObject:
def start(self):
self.task = asyncio.async(self._do())
@asyncio.coroutine
def stop(self):
self.task.cancel()
yield from asyncio.wait([self.task])
del self.task
@asyncio.coroutine
def _do(self):
raise NotImplementedError
class WaitSet: class WaitSet:
def __init__(self): def __init__(self):
self._s = set() self._s = set()