forked from M-Labs/artiq
gui: experiment submission
This commit is contained in:
parent
a21373841c
commit
e611e17eeb
|
@ -10,6 +10,7 @@ from quamash import QEventLoop, QtGui
|
||||||
from pyqtgraph import dockarea
|
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.gui.explorer import ExplorerDock
|
from artiq.gui.explorer import ExplorerDock
|
||||||
from artiq.gui.parameters import ParametersDock
|
from artiq.gui.parameters import ParametersDock
|
||||||
from artiq.gui.log import LogDock
|
from artiq.gui.log import LogDock
|
||||||
|
@ -43,6 +44,11 @@ def main():
|
||||||
asyncio.set_event_loop(loop)
|
asyncio.set_event_loop(loop)
|
||||||
atexit.register(lambda: loop.close())
|
atexit.register(lambda: loop.close())
|
||||||
|
|
||||||
|
schedule_ctl = AsyncioClient()
|
||||||
|
loop.run_until_complete(schedule_ctl.connect_rpc(
|
||||||
|
args.server, args.port_control, "master_schedule"))
|
||||||
|
atexit.register(lambda: schedule_ctl.close_rpc())
|
||||||
|
|
||||||
win = QtGui.QMainWindow()
|
win = QtGui.QMainWindow()
|
||||||
area = dockarea.DockArea()
|
area = dockarea.DockArea()
|
||||||
win.setCentralWidget(area)
|
win.setCentralWidget(area)
|
||||||
|
@ -52,8 +58,11 @@ def main():
|
||||||
win.resize(1400, 800)
|
win.resize(1400, 800)
|
||||||
win.setWindowTitle("ARTIQ")
|
win.setWindowTitle("ARTIQ")
|
||||||
|
|
||||||
d_explorer = ExplorerDock()
|
d_explorer = ExplorerDock(status_bar, schedule_ctl)
|
||||||
area.addDock(d_explorer, "top")
|
area.addDock(d_explorer, "top")
|
||||||
|
loop.run_until_complete(d_explorer.sub_connect(
|
||||||
|
args.server, args.port_notify))
|
||||||
|
atexit.register(lambda: loop.run_until_complete(d_explorer.sub_close()))
|
||||||
|
|
||||||
d_params = ParametersDock()
|
d_params = ParametersDock()
|
||||||
area.addDock(d_params, "right", d_explorer)
|
area.addDock(d_params, "right", d_explorer)
|
||||||
|
|
|
@ -1,41 +1,104 @@
|
||||||
|
import asyncio
|
||||||
|
|
||||||
from quamash import QtGui, QtCore
|
from quamash import QtGui, QtCore
|
||||||
from pyqtgraph import dockarea
|
from pyqtgraph import dockarea
|
||||||
from pyqtgraph import LayoutWidget
|
from pyqtgraph import LayoutWidget
|
||||||
|
|
||||||
|
from artiq.protocols.sync_struct import Subscriber
|
||||||
|
from artiq.gui.tools import DictSyncModel
|
||||||
|
|
||||||
|
|
||||||
|
class _ExplistModel(DictSyncModel):
|
||||||
|
def __init__(self, parent, init):
|
||||||
|
DictSyncModel.__init__(self,
|
||||||
|
["Experiment"],
|
||||||
|
parent, init)
|
||||||
|
|
||||||
|
def sort_key(self, k, v):
|
||||||
|
return k
|
||||||
|
|
||||||
|
def convert(self, k, v, column):
|
||||||
|
return k
|
||||||
|
|
||||||
|
|
||||||
class ExplorerDock(dockarea.Dock):
|
class ExplorerDock(dockarea.Dock):
|
||||||
def __init__(self):
|
def __init__(self, status_bar, schedule_ctl):
|
||||||
dockarea.Dock.__init__(self, "Explorer", size=(1100, 400))
|
dockarea.Dock.__init__(self, "Explorer", size=(1100, 400))
|
||||||
|
|
||||||
|
self.status_bar = status_bar
|
||||||
|
self.schedule_ctl = schedule_ctl
|
||||||
|
|
||||||
splitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
|
splitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
|
||||||
self.addWidget(splitter)
|
self.addWidget(splitter)
|
||||||
|
|
||||||
grid = LayoutWidget()
|
grid = LayoutWidget()
|
||||||
splitter.addWidget(grid)
|
splitter.addWidget(grid)
|
||||||
|
|
||||||
el = QtGui.QListView()
|
self.el = QtGui.QListView()
|
||||||
grid.addWidget(el, 0, 0, colspan=4)
|
grid.addWidget(self.el, 0, 0, colspan=4)
|
||||||
|
|
||||||
datetime = QtGui.QDateTimeEdit()
|
self.datetime = QtGui.QDateTimeEdit()
|
||||||
datetime.setDisplayFormat("MMM d yyyy hh:mm:ss")
|
self.datetime.setDisplayFormat("MMM d yyyy hh:mm:ss")
|
||||||
datetime.setCalendarPopup(True)
|
self.datetime.setCalendarPopup(True)
|
||||||
datetime.setDate(QtCore.QDate.currentDate())
|
self.datetime.setDate(QtCore.QDate.currentDate())
|
||||||
datetime_en = QtGui.QCheckBox("Set due date:")
|
self.datetime_en = QtGui.QCheckBox("Set due date:")
|
||||||
grid.addWidget(datetime_en, 1, 0)
|
grid.addWidget(self.datetime_en, 1, 0)
|
||||||
grid.addWidget(datetime, 1, 1, colspan=3)
|
grid.addWidget(self.datetime, 1, 1, colspan=3)
|
||||||
|
|
||||||
pipeline = QtGui.QLineEdit()
|
self.pipeline = QtGui.QLineEdit()
|
||||||
pipeline.insert("main")
|
self.pipeline.insert("main")
|
||||||
grid.addLabel("Pipeline:", 2, 0)
|
grid.addLabel("Pipeline:", 2, 0)
|
||||||
grid.addWidget(pipeline, 2, 1)
|
grid.addWidget(self.pipeline, 2, 1)
|
||||||
|
|
||||||
priority = QtGui.QSpinBox()
|
self.priority = QtGui.QSpinBox()
|
||||||
priority.setRange(-99, 99)
|
self.priority.setRange(-99, 99)
|
||||||
grid.addLabel("Priority:", 2, 2)
|
grid.addLabel("Priority:", 2, 2)
|
||||||
grid.addWidget(priority, 2, 3)
|
grid.addWidget(self.priority, 2, 3)
|
||||||
|
|
||||||
submit = QtGui.QPushButton("Submit")
|
submit = QtGui.QPushButton("Submit")
|
||||||
grid.addWidget(submit, 3, 0, colspan=4)
|
grid.addWidget(submit, 3, 0, colspan=4)
|
||||||
|
submit.clicked.connect(self.submit_clicked)
|
||||||
|
|
||||||
placeholder = QtGui.QWidget()
|
placeholder = QtGui.QWidget()
|
||||||
splitter.addWidget(placeholder)
|
splitter.addWidget(placeholder)
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def sub_connect(self, host, port):
|
||||||
|
self.explist_subscriber = Subscriber("explist",
|
||||||
|
self.init_explist_model)
|
||||||
|
yield from self.explist_subscriber.connect(host, port)
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def sub_close(self):
|
||||||
|
yield from self.explist_subscriber.close()
|
||||||
|
|
||||||
|
def init_explist_model(self, init):
|
||||||
|
self.explist_model = _ExplistModel(self.el, init)
|
||||||
|
self.el.setModel(self.explist_model)
|
||||||
|
return self.explist_model
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def submit(self, pipeline_name, file, experiment, arguments,
|
||||||
|
priority, due_date):
|
||||||
|
expid = {
|
||||||
|
"file": file,
|
||||||
|
"experiment": experiment,
|
||||||
|
"arguments": arguments,
|
||||||
|
}
|
||||||
|
rid = yield from self.schedule_ctl.submit(pipeline_name, expid,
|
||||||
|
priority, due_date)
|
||||||
|
self.status_bar.showMessage("Submitted RID {}".format(rid))
|
||||||
|
|
||||||
|
def submit_clicked(self):
|
||||||
|
idx = self.el.selectedIndexes()
|
||||||
|
if idx:
|
||||||
|
row = idx[0].row()
|
||||||
|
key = self.explist_model.row_to_key[row]
|
||||||
|
expinfo = self.explist_model.data[key]
|
||||||
|
if self.datetime_en.isChecked():
|
||||||
|
due_date = self.datetime.dateTime().toMSecsSinceEpoch()/1000
|
||||||
|
else:
|
||||||
|
due_date = None
|
||||||
|
asyncio.async(self.submit(self.pipeline.text(),
|
||||||
|
expinfo["file"], expinfo["experiment"],
|
||||||
|
dict(), self.priority.value(), due_date))
|
||||||
|
|
Loading…
Reference in New Issue