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: b28739e2813b
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: 1ada80cd6d1a
Choose a head ref
  • 3 commits
  • 6 files changed
  • 1 contributor

Commits on Dec 30, 2014

  1. Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    21c6744 View commit details
  2. Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    9de3a08 View commit details
  3. Copy the full SHA
    1ada80c View commit details
Showing with 168 additions and 151 deletions.
  1. 0 artiq/gui/__init__.py
  2. BIN artiq/gui/icon.png
  3. +154 −0 artiq/gui/scheduler.py
  4. +13 −0 artiq/gui/tools.py
  5. +0 −1 frontend/artiq_client.py
  6. +1 −150 frontend/artiq_gui.py
Empty file added artiq/gui/__init__.py
Empty file.
Binary file added artiq/gui/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
154 changes: 154 additions & 0 deletions artiq/gui/scheduler.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
import time
import asyncio

from gi.repository import Gtk

from artiq.gui.tools import Window
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 e in run_params["unit"], run_params["function"], timeout:
row.append("-" if e is None else str(e))
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 _PeriodicStoreSyncer:
def __init__(self, periodic_store, init):
self.periodic_store = periodic_store
self.periodic_store.clear()
self.order = []
for prid, x in sorted(init.items(), key=lambda e: (e[1][0], e[0])):
self.periodic_store.append(self._convert(prid, x))
self.order.append((x[0], prid))

def _convert(self, prid, x):
next_run, run_params, timeout, period = x
row = [time.strftime("%m/%d %H:%M:%S", time.localtime(next_run)),
prid, run_params["file"]]
for e in run_params["unit"], run_params["function"], timeout:
row.append("-" if e is None else str(e))
row.append(str(period))
return row

def _find_index(self, prid):
for i, e in enumerate(self.periodic_store):
if e[1] == prid:
return i
raise KeyError

def __setitem__(self, prid, x):
try:
i = self._find_index(prid)
except KeyError:
pass
else:
del self.periodic_store[i]
del self.order[i]
ord_el = (x[0], prid)
j = len(self.order)
for i, o in enumerate(self.order):
if o > ord_el:
j = i
break
self.periodic_store.insert(j, self._convert(prid, x))
self.order.insert(j, ord_el)

def __delitem__(self, key):
i = self._find_index(key)
del self.periodic_store[i]
del self.order[i]


class SchedulerWindow(Window):
def __init__(self):
Window.__init__(self, title="Scheduler")
self.set_default_size(720, 570)

vpane = Gtk.VPaned()
vpane.set_position(270)
self.add(vpane)

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)
scroll = Gtk.ScrolledWindow()
scroll.add(tree)
vbox = Gtk.VBox(spacing=6)
label = Gtk.Label("Queue")
vbox.pack_start(label, False, False, 0)
vbox.pack_start(scroll, True, True, 0)

hbox = Gtk.HBox(spacing=6)
button = Gtk.Button("Find")
hbox.pack_start(button, True, True, 0)
button = Gtk.Button("Move up")
hbox.pack_start(button, True, True, 0)
button = Gtk.Button("Move down")
hbox.pack_start(button, True, True, 0)
button = Gtk.Button("Remove")
hbox.pack_start(button, True, True, 0)
vbox.pack_start(hbox, False, False, 0)
vbox.set_border_width(6)
vpane.add1(vbox)

self.periodic_store = Gtk.ListStore(str, int, str, str, str, str, str)
tree = Gtk.TreeView(self.periodic_store)
for i, title in enumerate(["Next run", "PRID", "File", "Unit",
"Function", "Timeout", "Period"]):
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn(title, renderer, text=i)
tree.append_column(column)
scroll = Gtk.ScrolledWindow()
scroll.add(tree)
vbox = Gtk.VBox(spacing=6)
label = Gtk.Label("Periodic schedule")
vbox.pack_start(label, False, False, 0)
vbox.pack_start(scroll, True, True, 0)
vbox.set_border_width(6)
vpane.add2(vbox)

@asyncio.coroutine
def sub_connect(self, host, port):
self.queue_subscriber = Subscriber("queue", self.init_queue_store)
yield from self.queue_subscriber.connect(host, port)
try:
self.periodic_subscriber = Subscriber(
"periodic", self.init_periodic_store)
yield from self.periodic_subscriber.connect(host, port)
except:
yield from self.queue_subscriber.close()
raise

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

def init_queue_store(self, init):
return _QueueStoreSyncer(self.queue_store, init)

def init_periodic_store(self, init):
return _PeriodicStoreSyncer(self.periodic_store, init)
13 changes: 13 additions & 0 deletions artiq/gui/tools.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import os

from gi.repository import Gtk


data_dir = os.path.abspath(os.path.dirname(__file__))

class Window(Gtk.Window):
def __init__(self, *args, **kwargs):
Gtk.Window.__init__(self, *args, **kwargs)
self.set_wmclass("ARTIQ GUI", "ARTIQ GUI")
self.set_icon_from_file(os.path.join(data_dir, "icon.png"))
self.set_border_width(6)
1 change: 0 additions & 1 deletion frontend/artiq_client.py
Original file line number Diff line number Diff line change
@@ -2,7 +2,6 @@

import argparse
import time
import sys
import asyncio

from prettytable import PrettyTable
151 changes: 1 addition & 150 deletions frontend/artiq_gui.py
Original file line number Diff line number Diff line change
@@ -2,160 +2,11 @@

import argparse
import asyncio
import time

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 e in run_params["unit"], run_params["function"], timeout:
row.append("-" if e is None else str(e))
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 PeriodicStoreSyncer:
def __init__(self, periodic_store, init):
self.periodic_store = periodic_store
self.periodic_store.clear()
self.order = []
for prid, x in sorted(init.items(), key=lambda e: (e[1][0], e[0])):
self.periodic_store.append(self._convert(prid, x))
self.order.append((x[0], prid))

def _convert(self, prid, x):
next_run, run_params, timeout, period = x
row = [time.strftime("%m/%d %H:%M:%S", time.localtime(next_run)),
prid, run_params["file"]]
for e in run_params["unit"], run_params["function"], timeout:
row.append("-" if e is None else str(e))
row.append(str(period))
return row

def _find_index(self, prid):
for i, e in enumerate(self.periodic_store):
if e[1] == prid:
return i
raise KeyError

def __setitem__(self, prid, x):
try:
i = self._find_index(prid)
except KeyError:
pass
else:
del self.periodic_store[i]
del self.order[i]
ord_el = (x[0], prid)
j = len(self.order)
for i, o in enumerate(self.order):
if o > ord_el:
j = i
break
self.periodic_store.insert(j, self._convert(prid, x))
self.order.insert(j, ord_el)

def __delitem__(self, key):
i = self._find_index(key)
del self.periodic_store[i]
del self.order[i]


class SchedulerWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Scheduler")
self.set_border_width(6)
self.set_default_size(720, 570)

vpane = Gtk.VPaned()
vpane.set_position(270)
self.add(vpane)

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)
scroll = Gtk.ScrolledWindow()
scroll.add(tree)
vbox = Gtk.VBox(spacing=6)
label = Gtk.Label("Queue")
vbox.pack_start(label, False, False, 0)
vbox.pack_start(scroll, True, True, 0)

hbox = Gtk.HBox(spacing=6)
button = Gtk.Button("Find")
hbox.pack_start(button, True, True, 0)
button = Gtk.Button("Move up")
hbox.pack_start(button, True, True, 0)
button = Gtk.Button("Move down")
hbox.pack_start(button, True, True, 0)
button = Gtk.Button("Remove")
hbox.pack_start(button, True, True, 0)
vbox.pack_start(hbox, False, False, 0)
vbox.set_border_width(6)
vpane.add1(vbox)

self.periodic_store = Gtk.ListStore(str, int, str, str, str, str, str)
tree = Gtk.TreeView(self.periodic_store)
for i, title in enumerate(["Next run", "PRID", "File", "Unit",
"Function", "Timeout", "Period"]):
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn(title, renderer, text=i)
tree.append_column(column)
scroll = Gtk.ScrolledWindow()
scroll.add(tree)
vbox = Gtk.VBox(spacing=6)
label = Gtk.Label("Periodic schedule")
vbox.pack_start(label, False, False, 0)
vbox.pack_start(scroll, True, True, 0)
vbox.set_border_width(6)
vpane.add2(vbox)

@asyncio.coroutine
def sub_connect(self, host, port):
self.queue_subscriber = Subscriber("queue", self.init_queue_store)
yield from self.queue_subscriber.connect(host, port)
try:
self.periodic_subscriber = Subscriber(
"periodic", self.init_periodic_store)
yield from self.periodic_subscriber.connect(host, port)
except:
yield from self.queue_subscriber.close()
raise

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

def init_queue_store(self, init):
return QueueStoreSyncer(self.queue_store, init)

def init_periodic_store(self, init):
return PeriodicStoreSyncer(self.periodic_store, init)
from artiq.gui.scheduler import SchedulerWindow


def _get_args():