From 255b00f6783fedff17626ec83658668f5b8f544a Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Mon, 29 Dec 2014 12:48:14 +0800 Subject: [PATCH] gui: queue display --- frontend/artiq_client.py | 2 +- frontend/artiq_gui.py | 96 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 1 deletion(-) create mode 100755 frontend/artiq_gui.py diff --git a/frontend/artiq_client.py b/frontend/artiq_client.py index 961e86d54..8a64774aa 100755 --- a/frontend/artiq_client.py +++ b/frontend/artiq_client.py @@ -13,7 +13,7 @@ from artiq.management.tools import clear_screen def _get_args(): - parser = argparse.ArgumentParser(description="ARTIQ client") + parser = argparse.ArgumentParser(description="ARTIQ CLI client") parser.add_argument( "-s", "--server", default="::1", help="hostname or IP of the master to connect to") diff --git a/frontend/artiq_gui.py b/frontend/artiq_gui.py new file mode 100755 index 000000000..d185d91e3 --- /dev/null +++ b/frontend/artiq_gui.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 + +import argparse +import asyncio + +import gbulb +from gi.repository import Gtk + +from artiq.management.sync_struct import Subscriber + + +class QueueStoreSyncer: + def __init__(self, queue_store, init): + self.queue_store = queue_store + self.queue_store.clear() + for x in init: + self.append(x) + + def _convert(self, x): + rid, run_params, timeout = x + row = [rid, run_params["file"]] + for x in run_params["unit"], run_params["function"], timeout: + row.append("-" if x is None else str(x)) + return row + + def append(self, x): + self.queue_store.append(self._convert(x)) + + def insert(self, i, x): + self.queue_store.insert(i, self._convert(x)) + + def __delitem__(self, key): + del self.queue_store[key] + + +class SchedulerWindow(Gtk.Window): + def __init__(self): + Gtk.Window.__init__(self, title="Scheduler") + + self.queue_store = Gtk.ListStore(int, str, str, str, str) + tree = Gtk.TreeView(self.queue_store) + for i, title in enumerate(["RID", "File", "Unit", + "Function", "Timeout"]): + renderer = Gtk.CellRendererText() + column = Gtk.TreeViewColumn(title, renderer, text=i) + tree.append_column(column) + self.add(tree) + + @asyncio.coroutine + def sub_connect(self, host, port): + self.subscriber = Subscriber(self.init_queue_store) + yield from self.subscriber.connect(host, port) + + @asyncio.coroutine + def sub_close(self): + yield from self.subscriber.close() + + def init_queue_store(self, init): + return QueueStoreSyncer(self.queue_store, init) + + +def _get_args(): + parser = argparse.ArgumentParser(description="ARTIQ GUI client") + parser.add_argument( + "-s", "--server", default="::1", + help="hostname or IP of the master to connect to") + parser.add_argument( + "--port-schedule-control", default=8888, type=int, + help="TCP port to connect to for schedule control") + parser.add_argument( + "--port-schedule-notify", default=8887, type=int, + help="TCP port to connect to for schedule notifications") + return parser.parse_args() + + +def main(): + args = _get_args() + + asyncio.set_event_loop_policy(gbulb.GtkEventLoopPolicy()) + loop = asyncio.get_event_loop() + try: + win = SchedulerWindow() + win.connect("delete-event", Gtk.main_quit) + win.show_all() + + loop.run_until_complete(win.sub_connect(args.server, + args.port_schedule_notify)) + try: + loop.run_forever() + finally: + loop.run_until_complete(win.sub_close()) + finally: + loop.close() + +if __name__ == "__main__": + main()