diff --git a/artiq/dashboard/moninj.py b/artiq/dashboard/moninj.py
index 5bc1d1407..cd9c2ffbd 100644
--- a/artiq/dashboard/moninj.py
+++ b/artiq/dashboard/moninj.py
@@ -184,14 +184,11 @@ class _DDSModel:
class _DDSWidget(QtWidgets.QFrame):
- def __init__(self, dm, title, bus_channel=0, channel=0, dds_model=None):
- self.dm = dm
- self.bus_channel = bus_channel
- self.channel = channel
- self.dds_name = title
- self.cur_frequency = 0
- self.dds_model = dds_model
+ apply_changes = QtCore.pyqtSignal()
+ off_clicked = QtCore.pyqtSignal()
+ set_clicked = QtCore.pyqtSignal()
+ def __init__(self, title, is_urukul):
QtWidgets.QFrame.__init__(self)
self.setFrameShape(QtWidgets.QFrame.Box)
@@ -253,7 +250,7 @@ class _DDSWidget(QtWidgets.QFrame):
set_grid.addWidget(set_btn, 0, 1, 1, 1)
# for urukuls also allow switching off RF
- if self.dds_model.is_urukul:
+ if is_urukul:
off_btn = QtWidgets.QToolButton()
off_btn.setText("Off")
off_btn.setToolTip("Switch off the output")
@@ -280,55 +277,73 @@ class _DDSWidget(QtWidgets.QFrame):
set_btn.clicked.connect(self.set_clicked)
apply.clicked.connect(self.apply_changes)
- if self.dds_model.is_urukul:
+ if is_urukul:
off_btn.clicked.connect(self.off_clicked)
off_btn.setToolTip(textwrap.dedent(
"""Note: If TTL RTIO sw for the channel is switched high,
this button will not disable the channel.
Use the TTL override instead."""))
- self.value_edit.returnPressed.connect(lambda: self.apply_changes(None))
- self.value_edit.escapePressedConnect(self.cancel_changes)
- cancel.clicked.connect(self.cancel_changes)
+ self.value_edit.returnPressed.connect(self.apply_changes)
- self.refresh_display()
+ def cancel_changes(cancel):
+ self.set_page(0)
+ self.value_edit.escapePressedConnect(cancel_changes)
+ cancel.clicked.connect(cancel_changes)
- def set_clicked(self, set):
- self.data_stack.setCurrentIndex(1)
- self.button_stack.setCurrentIndex(1)
- self.value_edit.setText("{:.7f}".format(self.cur_frequency / 1e6))
+ def set_page(self, page):
+ self.data_stack.setCurrentIndex(page)
+ self.button_stack.setCurrentIndex(page)
+
+ def get_value(self):
+ return float(self.value_edit.text())
+
+ def set_edit_value(self, value):
+ self.value_edit.setText("{:.7f}".format(value))
+
+ def set_value(self, value):
+ self.value_label.setText("{:.7f}".format(value))
+ self.set_edit_value(value)
+
+ def start_edit(self):
self.value_edit.setFocus()
self.value_edit.selectAll()
- def off_clicked(self, set):
- self.dm.dds_channel_toggle(self.dds_name, self.dds_model, sw=False)
- def apply_changes(self, apply):
- self.data_stack.setCurrentIndex(0)
- self.button_stack.setCurrentIndex(0)
- frequency = float(self.value_edit.text()) * 1e6
- self.dm.dds_set_frequency(self.dds_name, self.dds_model, frequency)
-
- def cancel_changes(self, cancel):
- self.data_stack.setCurrentIndex(0)
- self.button_stack.setCurrentIndex(0)
+class _DDSHandler:
+ def __init__(self, dm, title, bus_channel=0, channel=0, dds_model=None):
+ self.dm = dm
+ self.bus_channel = bus_channel
+ self.channel = channel
+ self.cur_frequency = 0
+ self.dds_name = title
+ self.dds_model = dds_model
+ self.widget = _DDSWidget(title, dds_model.is_urukul)
+ self.widget.apply_changes.connect(self.apply_changes)
+ self.widget.off_clicked.connect(self.off_clicked)
+ self.widget.set_clicked.connect(self.set_clicked)
+ self.refresh_display()
def refresh_display(self):
self.cur_frequency = self.dds_model.cur_frequency
- self.value_label.setText("{:.7f}".format(self.cur_frequency / 1e6))
- self.value_edit.setText("{:.7f}".format(self.cur_frequency / 1e6))
+ self.widget.set_value(self.cur_frequency / 1e6)
+
+ def apply_changes(self):
+ self.widget.set_page(0)
+ frequency = self.widget.get_value() * 1e6
+ self.dm.dds_set_frequency(self.dds_name, self.dds_model, frequency)
+
+ def set_clicked(self):
+ self.widget.set_page(1)
+ self.widget.set_edit_value(self.cur_frequency / 1e6)
+ self.widget.start_edit()
+
+ def off_clicked(self):
+ self.dm.dds_channel_toggle(self.dds_name, self.dds_model, sw=False)
def sort_key(self):
return (self.bus_channel, self.channel)
-class _DDSHandler:
- def __init__(self, *args, **kw):
- self.widget = _DDSWidget(*args, **kw)
-
- def __getattr__(self, attr):
- return getattr(self.widget, attr)
-
-
class _DACWidget(QtWidgets.QFrame):
def __init__(self, dm, spi_channel, channel, title):
QtWidgets.QFrame.__init__(self)