diff --git a/artiq/frontend/artiq_gui.py b/artiq/frontend/artiq_gui.py index 64beba3bb..dcbf1b54e 100755 --- a/artiq/frontend/artiq_gui.py +++ b/artiq/frontend/artiq_gui.py @@ -43,11 +43,15 @@ def main(): loop = asyncio.get_event_loop() atexit.register(lambda: loop.close()) - # share the schedule control connection + # share the schedule control and repository connections 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()) + repository = AsyncioClient() + loop.run_until_complete(repository.connect_rpc( + args.server, args.port_control, "master_repository")) + atexit.register(lambda: repository.close_rpc()) scheduler_win = lmgr.create_window(SchedulerWindow, "scheduler", @@ -65,7 +69,9 @@ def main(): explorer_win = lmgr.create_window(ExplorerWindow, "explorer", - schedule_ctl) + schedule_ctl, + repository) + loop.run_until_complete(explorer_win.load_controls()) scheduler_win.show_all() parameters_win.show_all() explorer_win.show_all() diff --git a/artiq/frontend/artiq_master.py b/artiq/frontend/artiq_master.py index a44fcd913..f6cf333e1 100755 --- a/artiq/frontend/artiq_master.py +++ b/artiq/frontend/artiq_master.py @@ -9,6 +9,7 @@ from artiq.protocols.sync_struct import Publisher from artiq.protocols.file_db import FlatFileDB, SimpleHistory from artiq.master.scheduler import Scheduler from artiq.master.rt_results import RTResults +from artiq.master.repository import Repository def get_argparser(): @@ -33,6 +34,7 @@ def main(): simplephist = SimpleHistory(30) pdb.hooks.append(simplephist) rtr = RTResults() + repository = Repository() loop = asyncio.get_event_loop() atexit.register(lambda: loop.close()) @@ -48,9 +50,10 @@ def main(): atexit.register(lambda: loop.run_until_complete(scheduler.stop())) server_control = Server({ - "master_schedule": scheduler, "master_ddb": ddb, - "master_pdb": pdb + "master_pdb": pdb, + "master_schedule": scheduler, + "master_repository": repository }) loop.run_until_complete(server_control.start( args.bind, args.port_control)) diff --git a/artiq/gui/explorer.py b/artiq/gui/explorer.py index 943b61cf1..03ae5a521 100644 --- a/artiq/gui/explorer.py +++ b/artiq/gui/explorer.py @@ -5,68 +5,10 @@ from gi.repository import Gtk from artiq.gui.tools import Window, getitem -_test_description = """ - - - - - - 1000 - 2000 - 1500 - 1 - 10 - - - True - False - - - True - False - Simulated flopping frequency - - - False - True - 0 - - - - - True - True - number - adjustment1 - - - False - True - 1 - - - - -""" - - -class _ExperimentControls: - def __init__(self): - self.builder = Gtk.Builder() - self.builder.add_from_string(_test_description) - - def get_top_widget(self): - return self.builder.get_object("top") - - def get_arguments(self): - return { - "F0": self.builder.get_object("adjustment1").get_value() - } - - class ExplorerWindow(Window): - def __init__(self, schedule_ctl, layout_dict=dict()): + def __init__(self, schedule_ctl, repository, layout_dict=dict()): self.schedule_ctl = schedule_ctl + self.repository = repository Window.__init__(self, title="Explorer", @@ -106,14 +48,21 @@ class ExplorerWindow(Window): button.connect("clicked", self.run) listvbox.pack_start(button, False, False, 0) - self.controls = _ExperimentControls() - self.pane.pack2(self.controls.get_top_widget()) - 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") + 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()) + def run(self, widget): run_params = { "file": "flopping_f_simulation.py", diff --git a/artiq/master/repository.py b/artiq/master/repository.py new file mode 100644 index 000000000..dae6b3e1e --- /dev/null +++ b/artiq/master/repository.py @@ -0,0 +1,4 @@ +class Repository: + def get_data(self, filename): + with open(filename) as f: + return f.read() diff --git a/examples/flopping_f_simulation_gui.glade b/examples/flopping_f_simulation_gui.glade new file mode 100644 index 000000000..4ea33ba35 --- /dev/null +++ b/examples/flopping_f_simulation_gui.glade @@ -0,0 +1,41 @@ + + + + + + 1000 + 2000 + 1500 + 1 + 10 + + + True + False + + + True + False + Simulated flopping frequency + + + False + True + 0 + + + + + True + True + number + F0 + + + False + True + 1 + + + + diff --git a/examples/flopping_f_simulation_gui.py b/examples/flopping_f_simulation_gui.py new file mode 100644 index 000000000..bead9230a --- /dev/null +++ b/examples/flopping_f_simulation_gui.py @@ -0,0 +1,19 @@ +import asyncio + +from gi.repository import Gtk + + +class Controls: + @asyncio.coroutine + def build(self, get_data): + self.builder = Gtk.Builder() + data = yield from get_data("flopping_f_simulation_gui.glade") + self.builder.add_from_string(data) + + def get_top_widget(self): + return self.builder.get_object("top") + + def get_arguments(self): + return { + "F0": self.builder.get_object("F0").get_value() + }