Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: m-labs/artiq
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 939236a1b517
Choose a base ref
...
head repository: m-labs/artiq
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 9aa7155502d8
Choose a head ref
  • 4 commits
  • 6 files changed
  • 1 contributor

Commits on Jan 29, 2015

  1. Copy the full SHA
    cba0011 View commit details
  2. Copy the full SHA
    26b1282 View commit details
  3. Copy the full SHA
    e7dac4a View commit details
  4. Copy the full SHA
    9aa7155 View commit details
Showing with 125 additions and 30 deletions.
  1. +4 −1 artiq/frontend/artiq_gui.py
  2. +5 −2 artiq/frontend/artiq_master.py
  3. +93 −26 artiq/gui/explorer.py
  4. +7 −1 artiq/gui/tools.py
  5. +4 −0 artiq/language/db.py
  6. +12 −0 examples/explist.pyon
5 changes: 4 additions & 1 deletion artiq/frontend/artiq_gui.py
Original file line number Diff line number Diff line change
@@ -75,7 +75,10 @@ def exit(*args):
exit,
schedule_ctl,
repository)
loop.run_until_complete(explorer_win.load_controls())
loop.run_until_complete(explorer_win.sub_connect(
args.server, args.port_notify))
atexit.register(
lambda: loop.run_until_complete(explorer_win.sub_close()))
scheduler_win.show_all()
parameters_win.show_all()
explorer_win.show_all()
7 changes: 5 additions & 2 deletions artiq/frontend/artiq_master.py
Original file line number Diff line number Diff line change
@@ -38,6 +38,7 @@ def main():
pdb.hooks.append(simplephist)
rtr = RTResults()
repository = Repository()
explist = FlatFileDB("explist.pyon")

loop = asyncio.get_event_loop()
atexit.register(lambda: loop.close())
@@ -56,7 +57,8 @@ def main():
"master_ddb": ddb,
"master_pdb": pdb,
"master_schedule": scheduler,
"master_repository": repository
"master_repository": repository,
"master_explist": explist
})
loop.run_until_complete(server_control.start(
args.bind, args.port_control))
@@ -68,7 +70,8 @@ def main():
"devices": ddb.data,
"parameters": pdb.data,
"parameters_simplehist": simplephist.history,
"rt_results": rtr.groups
"rt_results": rtr.groups,
"explist": explist.data
})
loop.run_until_complete(server_notify.start(
args.bind, args.port_notify))
119 changes: 93 additions & 26 deletions artiq/gui/explorer.py
Original file line number Diff line number Diff line change
@@ -2,7 +2,16 @@

from gi.repository import Gtk

from artiq.gui.tools import Window, getitem
from artiq.gui.tools import Window, getitem, DictSyncer
from artiq.protocols.sync_struct import Subscriber


class _ExplistStoreSyncer(DictSyncer):
def order_key(self, kv_pair):
return kv_pair[0]

def convert(self, name, value):
return [name]


class ExplorerWindow(Window):
@@ -22,53 +31,111 @@ def __init__(self, exit_fn, schedule_ctl, repository, layout_dict=dict()):
menubar = Gtk.MenuBar()
topvbox.pack_start(menubar, False, False, 0)

windows = Gtk.MenuItem("Windows")
windows_menu = Gtk.Menu()
top_menuitem = Gtk.MenuItem("Windows")
menu = Gtk.Menu()
menuitem = Gtk.MenuItem("Scheduler")
windows_menu.append(menuitem)
menu.append(menuitem)
menuitem = Gtk.MenuItem("Parameters")
windows_menu.append(menuitem)
windows_menu.append(Gtk.SeparatorMenuItem())
menu.append(menuitem)
menu.append(Gtk.SeparatorMenuItem())
menuitem = Gtk.MenuItem("Quit")
menuitem.connect("activate", exit_fn)
windows_menu.append(menuitem)
windows.set_submenu(windows_menu)
menubar.append(windows)
menu.append(menuitem)
top_menuitem.set_submenu(menu)
menubar.append(top_menuitem)

top_menuitem = Gtk.MenuItem("Registry")
menu = Gtk.Menu()
menuitem = Gtk.MenuItem("Run selected")
menuitem.connect("activate", self.run)
menu.append(menuitem)
menu.append(Gtk.SeparatorMenuItem())
menuitem = Gtk.MenuItem("Add experiment")
menu.append(menuitem)
menuitem = Gtk.MenuItem("Remove experiment")
menu.append(menuitem)
top_menuitem.set_submenu(menu)
menubar.append(top_menuitem)

self.pane = Gtk.HPaned(
position=getitem(layout_dict, "pane_position", 180))
topvbox.pack_start(self.pane, True, True, 0)

listvbox = Gtk.VBox(spacing=6)
self.pane.pack1(listvbox)
self.list_store = Gtk.ListStore(str)
self.list_tree = Gtk.TreeView(self.list_store)
explistvbox = Gtk.VBox(spacing=6)
self.pane.pack1(explistvbox)
self.explist_store = Gtk.ListStore(str)
self.explist_tree = Gtk.TreeView(self.explist_store)
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn("Registered experiments", renderer, text=0)
self.explist_tree.append_column(column)
self.explist_tree.connect("row-activated", self.explist_row_activated)
self.explist_tree.set_activate_on_single_click(True)
scroll = Gtk.ScrolledWindow()
scroll.add(self.list_tree)
listvbox.pack_start(scroll, True, True, 0)
scroll.add(self.explist_tree)
explistvbox.pack_start(scroll, True, True, 0)
button = Gtk.Button("Run")
button.connect("clicked", self.run)
listvbox.pack_start(button, False, False, 0)
explistvbox.pack_start(button, False, False, 0)

self.pane_contents = Gtk.Label("")
self.pane.pack2(self.pane_contents)

def get_layout_dict(self):
r = Window.get_layout_dict(self)
r["pane_position"] = self.pane.get_position()
return r

@asyncio.coroutine
def load_controls(self):
gui_mod_data = yield from self.repository.get_data(
"flopping_f_simulation_gui.py")
def sub_connect(self, host, port):
self.explist_subscriber = Subscriber("explist",
self.init_explist_store)
yield from self.explist_subscriber.connect(host, port)

@asyncio.coroutine
def sub_close(self):
yield from self.explist_subscriber.close()

def set_pane_contents(self, widget):
self.pane_contents.destroy()
self.pane_contents = widget
self.pane.pack2(self.pane_contents)
self.pane_contents.show_all()

def init_explist_store(self, init):
self.explist_syncer = _ExplistStoreSyncer(self.explist_store, init,
keep_data=True)
return self.explist_syncer

def explist_row_activated(self, widget, index, column):
self.controls = None
name = self.explist_store[index][0]
gui_file = self.explist_syncer.data[name]["gui_file"]
if gui_file is None:
self.set_pane_contents(Gtk.Label("No GUI controls"))
else:
asyncio.Task(self.load_gui_file(gui_file))

@asyncio.coroutine
def load_gui_file(self, gui_file):
gui_mod_data = yield from self.repository.get_data(gui_file)
gui_mod = dict()
exec(gui_mod_data, gui_mod)
self.controls = gui_mod["Controls"]()
yield from self.controls.build(self.repository.get_data)
self.pane.pack2(self.controls.get_top_widget())
self.set_pane_contents(self.controls.get_top_widget())

def run(self, widget):
run_params = {
"file": "flopping_f_simulation.py",
"unit": None,
"arguments": self.controls.get_arguments()
}
asyncio.Task(self.schedule_ctl.run_queued(run_params, None))
store, selected = self.explist_tree.get_selection().get_selected()
if selected is not None:
name = store[selected][0]
data = self.explist_syncer.data[name]
if self.controls is None:
arguments = {}
else:
arguments = self.controls.get_arguments()
run_params = {
"file": data["file"],
"unit": data["unit"],
"arguments": arguments
}
asyncio.Task(self.schedule_ctl.run_queued(run_params, None))
8 changes: 7 additions & 1 deletion artiq/gui/tools.py
Original file line number Diff line number Diff line change
@@ -79,7 +79,9 @@ def convert(self, x):


class DictSyncer:
def __init__(self, store, init):
def __init__(self, store, init, keep_data=False):
if keep_data:
self.data = init
self.store = store
self.store.clear()
self.order = []
@@ -94,6 +96,8 @@ def _find_index(self, key):
raise KeyError

def __setitem__(self, key, value):
if hasattr(self, "data"):
data[key] = value
try:
i = self._find_index(key)
except KeyError:
@@ -111,6 +115,8 @@ def __setitem__(self, key, value):
self.order.insert(j, (key, ord_el))

def __delitem__(self, key):
if hasattr(self, "data"):
del self.data[key]
i = self._find_index(key)
del self.store[i]
del self.order[i]
4 changes: 4 additions & 0 deletions artiq/language/db.py
Original file line number Diff line number Diff line change
@@ -68,6 +68,10 @@ class AutoDB:
class DBKeys:
pass

@staticmethod
def realtime_results():
return dict()

def __init__(self, dbh=None, **kwargs):
self.dbh = dbh

12 changes: 12 additions & 0 deletions examples/explist.pyon
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"Flopping F simulation": {
"file": "flopping_f_simulation.py",
"unit": null,
"gui_file": "flopping_f_simulation_gui.py"
},
"RTIO skew": {
"file": "rtio_skew.py",
"unit": null,
"gui_file": null
}
}