From 2d723ed573d715877ddd8a202cf8c19f4b7fd000 Mon Sep 17 00:00:00 2001
From: TUD278427 <TUD278427@tudelft.net>
Date: Tue, 16 Jun 2020 15:32:27 +0200
Subject: [PATCH] Add RF settings to param viewer, init syntax changed a bit
 now, sorry

---
 .../GUI/param_viewer/param_viewer_GUI_main.py | 121 +++++++++++++++---
 .../param_viewer/param_viewer_GUI_window.py   |  27 ++--
 .../param_viewer/param_viewer_GUI_window.ui   |  22 +++-
 3 files changed, 135 insertions(+), 35 deletions(-)

diff --git a/core_tools/GUI/param_viewer/param_viewer_GUI_main.py b/core_tools/GUI/param_viewer/param_viewer_GUI_main.py
index 96b7074b..7884057d 100644
--- a/core_tools/GUI/param_viewer/param_viewer_GUI_main.py
+++ b/core_tools/GUI/param_viewer/param_viewer_GUI_main.py
@@ -1,22 +1,34 @@
+# -*- coding: utf-8 -*-
 from core_tools.GUI.param_viewer.param_viewer_GUI_window import Ui_MainWindow
 from PyQt5 import QtCore, QtGui, QtWidgets
 from functools import partial
-
+from qcodes import Station
 import numpy as np
 from dataclasses import dataclass
 
 @dataclass
-class gate_data_obj:
-    gate_parameter : any
+class param_data_obj:
+    param_parameter : any
     gui_input_param : any
+    division : any
 
 
 class param_viewer(QtWidgets.QMainWindow, Ui_MainWindow):
     """docstring for virt_gate_matrix_GUI"""
-    def __init__(self, gates_object):
+    def __init__(self, station, gates_object = None):
+        if type(station) is not Station:
+            raise Exception('Syntax changed, to support RF_settings now supply station')
         self.real_gates = list()
         self.virtual_gates = list()
-        self.gates_object = gates_object
+        self.rf_settings = list()
+        self.station = station
+        if gates_object:
+            self.gates_object = gates_object
+        else:
+            try:
+                self.gates_object = self.station.gates
+            except:
+                raise ValueError('Default guess for gates object wrong, please supply manually')    
         self._step_size = 1 #mV
         instance_ready = True
         
@@ -29,22 +41,29 @@ class param_viewer(QtWidgets.QMainWindow, Ui_MainWindow):
         super(QtWidgets.QMainWindow, self).__init__()
         self.setupUi(self)
         
+        # add RF parameters
+        for src_name in self.gates_object.hardware.RF_source_names:
+            inst = getattr(station, src_name)
+            for RFpar in self.gates_object.hardware.RF_params:
+                param = getattr(inst, RFpar)
+                self._add_RFset(param)
+
         # add real gates
-        for gate_name in gates_object.hardware.dac_gate_map.keys():
-            param = getattr(gates_object, gate_name)
+        for gate_name in self.gates_object.hardware.dac_gate_map.keys():
+            param = getattr(self.gates_object, gate_name)
             self._add_gate(param, False)
 
         # add virtual gates
-        for virt_gate_set in gates_object.hardware.virtual_gates:
+        for virt_gate_set in self.gates_object.hardware.virtual_gates:
             for gate_name in virt_gate_set.virtual_gate_names:
-                param = getattr(gates_object, gate_name)
+                param = getattr(self.gates_object, gate_name)
                 self._add_gate(param, True)
 
         self.step_size.valueChanged.connect(partial(self._update_step, self.step_size.value))
         self._finish_gates_GUI()
 
         self.timer = QtCore.QTimer()
-        self.timer.timeout.connect(partial(self._update_gates))
+        self.timer.timeout.connect(partial(self._update_parameters))
         self.timer.start(500)
 
         self.show()
@@ -63,6 +82,54 @@ class param_viewer(QtWidgets.QMainWindow, Ui_MainWindow):
 
         self.step_size.setValue(value)
 
+    def _add_RFset(self, parameter):
+        '''
+        add a new gate.
+
+        Args:
+            parameter (QCoDeS parameter object) : parameter to add.
+            virtual (bool) : True in case this is a virtual gate.
+        '''
+
+        i = len(self.rf_settings)
+        layout = self.layout_RF
+        
+        name = parameter.full_name
+        unit = parameter.unit
+        step_size = 0.5
+        division = 1
+        
+        if parameter.name[0:10] == 'frequency':
+            division = 1e6
+            step_size = 0.1
+            unit = f'M{unit}'
+
+        _translate = QtCore.QCoreApplication.translate
+
+        set_name = QtWidgets.QLabel(self.RFsettings)
+        set_name.setObjectName(name)
+        set_name.setMinimumSize(QtCore.QSize(100, 0))
+        set_name.setText(_translate("MainWindow", name))
+        layout.addWidget(set_name, i, 0, 1, 1)
+
+        set_input = QtWidgets.QDoubleSpinBox(self.RFsettings)
+        set_input.setObjectName(name + "_input")
+        set_input.setMinimumSize(QtCore.QSize(100, 0))
+        
+        # TODO collect boundaries out of the harware
+        set_input.setRange(-1e9,1e9)
+        set_input.valueChanged.connect(partial(self._set_set, parameter, set_input.value,division))
+        set_input.setKeyboardTracking(False)
+        set_input.setSingleStep(step_size)
+        
+        layout.addWidget(set_input, i, 1, 1, 1)
+
+        set_unit = QtWidgets.QLabel(self.RFsettings)
+        set_unit.setObjectName(name + "_unit")
+        set_unit.setText(_translate("MainWindow", unit))
+        layout.addWidget(set_unit, i, 2, 1, 1)
+        self.rf_settings.append(param_data_obj(parameter,  set_input, division))
+
     def _add_gate(self, parameter, virtual):
         '''
         add a new gate.
@@ -93,6 +160,7 @@ class param_viewer(QtWidgets.QMainWindow, Ui_MainWindow):
         voltage_input = QtWidgets.QDoubleSpinBox(self.virtualgates)
         voltage_input.setObjectName( name + "_input")
         voltage_input.setMinimumSize(QtCore.QSize(100, 0))
+        
         # TODO collect boundaries out of the harware
         voltage_input.setRange(-4000,4000.0)
         voltage_input.valueChanged.connect(partial(self._set_gate, parameter, voltage_input.value))
@@ -104,15 +172,22 @@ class param_viewer(QtWidgets.QMainWindow, Ui_MainWindow):
         gate_unit.setText(_translate("MainWindow", unit))
         layout.addWidget(gate_unit, i, 2, 1, 1)
         if virtual == False:
-            self.real_gates.append(gate_data_obj(parameter,  voltage_input))
+            self.real_gates.append(param_data_obj(parameter,  voltage_input, 1))
         else:
-            self.virtual_gates.append(gate_data_obj(parameter,  voltage_input))
+            self.virtual_gates.append(param_data_obj(parameter,  voltage_input, 1))
 
     def _set_gate(self, gate, value):
         # TODO add support if out of range.
         gate.set(value())
 
+    def _set_set(self, setting, value, division):
+        # TODO add support if out of range.
+        setting.set(value()*division)
+        self.gates_object.hardware.RF_settings[setting.full_name] = value()*division
+        self.gates_object.hardware.sync_data()
+
     def _finish_gates_GUI(self):
+        # MAKE THIS INTO A FOR LOOP
         i = len(self.real_gates) + 1
 
         spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
@@ -128,24 +203,34 @@ class param_viewer(QtWidgets.QMainWindow, Ui_MainWindow):
 
         spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
         self.layout_virtual.addItem(spacerItem1, 0, 3, 1, 1)
+        
+        i = len(self.rf_settings) + 1
+
+        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.layout_RF.addItem(spacerItem, i, 0, 1, 1)
+
+        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.layout_RF.addItem(spacerItem1, 0, 3, 1, 1)
 
-    def _update_gates(self):
+    def _update_parameters(self):
         '''
         updates the values of all the gates in the parameterviewer periodically
         '''
         idx = self.tab_menu.currentIndex() 
 
         if idx == 0:
-            gates = self.real_gates
+            params = self.real_gates
         elif idx == 1:
-            gates = self.virtual_gates
+            params = self.virtual_gates
+        elif idx == 2:
+            params = self.rf_settings
         else:
             return
 
-        for gate in gates:
+        for param in params:
             # do not update when a user clicks on it.
-            if not gate.gui_input_param.hasFocus():
-                gate.gui_input_param.setValue(gate.gate_parameter())
+            if not param.gui_input_param.hasFocus():
+                param.gui_input_param.setValue(param.param_parameter()/param.division)
 
         
 
diff --git a/core_tools/GUI/param_viewer/param_viewer_GUI_window.py b/core_tools/GUI/param_viewer/param_viewer_GUI_window.py
index 55feec47..c8b51163 100644
--- a/core_tools/GUI/param_viewer/param_viewer_GUI_window.py
+++ b/core_tools/GUI/param_viewer/param_viewer_GUI_window.py
@@ -2,14 +2,12 @@
 
 # Form implementation generated from reading ui file 'param_viewer_GUI_window.ui'
 #
-# Created by: PyQt5 UI code generator 5.13.1
+# Created by: PyQt5 UI code generator 5.9.2
 #
 # WARNING! All changes made in this file will be lost!
 
-
 from PyQt5 import QtCore, QtGui, QtWidgets
 
-
 class Ui_MainWindow(object):
     def setupUi(self, MainWindow):
         MainWindow.setObjectName("MainWindow")
@@ -28,7 +26,7 @@ class Ui_MainWindow(object):
         self.scrollArea.setWidgetResizable(True)
         self.scrollArea.setObjectName("scrollArea")
         self.scrollAreaWidgetContents = QtWidgets.QWidget()
-        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 758, 491))
+        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 756, 495))
         self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
         self.gridLayout_6 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents)
         self.gridLayout_6.setObjectName("gridLayout_6")
@@ -46,6 +44,15 @@ class Ui_MainWindow(object):
         self.layout_virtual.setObjectName("layout_virtual")
         self.gridLayout_5.addLayout(self.layout_virtual, 0, 0, 1, 1)
         self.tab_menu.addTab(self.virtualgates, "")
+        self.RFsettings = QtWidgets.QWidget()
+        self.RFsettings.setObjectName("RFsettings")
+        self.layoutWidget = QtWidgets.QWidget(self.RFsettings)
+        self.layoutWidget.setGeometry(QtCore.QRect(10, 10, 761, 501))
+        self.layoutWidget.setObjectName("layoutWidget")
+        self.layout_RF = QtWidgets.QGridLayout(self.layoutWidget)
+        self.layout_RF.setContentsMargins(0, 0, 0, 0)
+        self.layout_RF.setObjectName("layout_RF")
+        self.tab_menu.addTab(self.RFsettings, "")
         self.settings = QtWidgets.QWidget()
         self.settings.setObjectName("settings")
         self.gridLayout_3 = QtWidgets.QGridLayout(self.settings)
@@ -80,7 +87,7 @@ class Ui_MainWindow(object):
         self.gridLayout.addWidget(self.tab_menu, 0, 0, 1, 1)
         MainWindow.setCentralWidget(self.centralwidget)
         self.menubar = QtWidgets.QMenuBar(MainWindow)
-        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 20))
+        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
         self.menubar.setObjectName("menubar")
         MainWindow.setMenuBar(self.menubar)
         self.statusbar = QtWidgets.QStatusBar(MainWindow)
@@ -96,16 +103,8 @@ class Ui_MainWindow(object):
         MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
         self.tab_menu.setTabText(self.tab_menu.indexOf(self.realgates), _translate("MainWindow", "Normal gates"))
         self.tab_menu.setTabText(self.tab_menu.indexOf(self.virtualgates), _translate("MainWindow", "Virtual Gates"))
+        self.tab_menu.setTabText(self.tab_menu.indexOf(self.RFsettings), _translate("MainWindow", "RF Settings"))
         self.label.setText(_translate("MainWindow", "Voltage step"))
         self.label_2.setText(_translate("MainWindow", "mV"))
         self.tab_menu.setTabText(self.tab_menu.indexOf(self.settings), _translate("MainWindow", "Settings"))
 
-
-if __name__ == "__main__":
-    import sys
-    app = QtWidgets.QApplication(sys.argv)
-    MainWindow = QtWidgets.QMainWindow()
-    ui = Ui_MainWindow()
-    ui.setupUi(MainWindow)
-    MainWindow.show()
-    sys.exit(app.exec_())
diff --git a/core_tools/GUI/param_viewer/param_viewer_GUI_window.ui b/core_tools/GUI/param_viewer/param_viewer_GUI_window.ui
index 22832334..152d0b71 100644
--- a/core_tools/GUI/param_viewer/param_viewer_GUI_window.ui
+++ b/core_tools/GUI/param_viewer/param_viewer_GUI_window.ui
@@ -35,8 +35,8 @@
             <rect>
              <x>0</x>
              <y>0</y>
-             <width>758</width>
-             <height>491</height>
+             <width>756</width>
+             <height>495</height>
             </rect>
            </property>
            <layout class="QGridLayout" name="gridLayout_6">
@@ -59,6 +59,22 @@
         </item>
        </layout>
       </widget>
+      <widget class="QWidget" name="RFsettings">
+       <attribute name="title">
+        <string>RF Settings</string>
+       </attribute>
+       <widget class="QWidget" name="layoutWidget">
+        <property name="geometry">
+         <rect>
+          <x>10</x>
+          <y>10</y>
+          <width>761</width>
+          <height>501</height>
+         </rect>
+        </property>
+        <layout class="QGridLayout" name="layout_RF"/>
+       </widget>
+      </widget>
       <widget class="QWidget" name="settings">
        <attribute name="title">
         <string>Settings</string>
@@ -154,7 +170,7 @@
      <x>0</x>
      <y>0</y>
      <width>800</width>
-     <height>20</height>
+     <height>21</height>
     </rect>
    </property>
   </widget>
-- 
GitLab