Work on client

This commit is contained in:
Elena Arenskötter 2023-11-04 13:51:51 +01:00
parent 4678656e0f
commit e596c12a7b
13 changed files with 707 additions and 294 deletions

BIN
datasheets/MCP3204.pdf Normal file

Binary file not shown.

Binary file not shown.

View File

@ -1,7 +0,0 @@
*** These modified files were found in JOE when it aborted on Tue Aug 9 19:43:11 2022
*** JOE was aborted because the terminal closed
*** File '(Unnamed)'
_registerAcc
spi_write

View File

@ -114,6 +114,9 @@ class PID:
def setOutmax(self,outMax): def setOutmax(self,outMax):
self.outMax = outMax self.outMax = outMax
def setOutmin(self,outMin):
self.outMin = outMin
def getSetpoint(self): def getSetpoint(self):
return self.setpoint return self.setpoint
@ -186,6 +189,9 @@ def run(pid_obj, freq, num):
elif msg[0] == 'set_outmax': elif msg[0] == 'set_outmax':
pid_obj.setOutmax(msg[1]) pid_obj.setOutmax(msg[1])
server.send_string('ACK') server.send_string('ACK')
elif msg[0] == 'set_outmin':
pid_obj.setOutmin(msg[1])
server.send_string('ACK')
elif msg[0] == 'get_setpoint': elif msg[0] == 'get_setpoint':
#out_queue.put(pid_obj.getSetpoint() ) #out_queue.put(pid_obj.getSetpoint() )
server.send_string(str(pid_obj.getSetpoint())) server.send_string(str(pid_obj.getSetpoint()))

View File

@ -86,6 +86,11 @@ def clientthread(conn):
pidclient[tmp[2]].send_string('set_outmax\t%f' % tmp[3]) pidclient[tmp[2]].send_string('set_outmax\t%f' % tmp[3])
pidclient[tmp[2]].recv_string() pidclient[tmp[2]].recv_string()
TCP.send_msg(conn, 'I set maximal output voltage for output {:.0f} to {: f}'.format(tmp[2],tmp[3])) TCP.send_msg(conn, 'I set maximal output voltage for output {:.0f} to {: f}'.format(tmp[2],tmp[3]))
elif tmp[1] == 'SET_OUTMIN':
#out_queue[tmp[2]].put(['set_outmax',tmp[3]])
pidclient[tmp[2]].send_string('set_outmin\t%f' % tmp[3])
pidclient[tmp[2]].recv_string()
TCP.send_msg(conn, 'I set minimal output voltage for output {:.0f} to {: f}'.format(tmp[2],tmp[3]))
elif tmp[1] == 'GET_SETPOINT': elif tmp[1] == 'GET_SETPOINT':
#out_queue[tmp[2]].put(['get_setpoint']) #out_queue[tmp[2]].put(['get_setpoint'])
pidclient[tmp[2]].send_string('get_setpoint') pidclient[tmp[2]].send_string('get_setpoint')

View File

@ -2,30 +2,27 @@
# Form implementation generated from reading ui file 'channel.ui' # Form implementation generated from reading ui file 'channel.ui'
# #
# Created by: PyQt5 UI code generator 5.14.1 # Created by: PyQt5 UI code generator 5.10.1
# #
# WARNING! All changes made in this file will be lost! # WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object): class Ui_Form(object):
def setupUi(self, Form): def setupUi(self, Form):
Form.setObjectName("Form") Form.setObjectName("Form")
Form.resize(846, 423) Form.resize(846, 421)
self.gridLayout = QtWidgets.QGridLayout(Form) self.gridLayout = QtWidgets.QGridLayout(Form)
self.gridLayout.setObjectName("gridLayout") self.gridLayout.setObjectName("gridLayout")
spacerItem = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) self.kpBox = QtWidgets.QDoubleSpinBox(Form)
self.gridLayout.addItem(spacerItem, 6, 1, 1, 1) self.kpBox.setMinimum(-99.0)
self.label = QtWidgets.QLabel(Form) self.kpBox.setSingleStep(0.01)
self.label.setObjectName("label") self.kpBox.setProperty("value", 1.0)
self.gridLayout.addWidget(self.label, 1, 0, 1, 1) self.kpBox.setObjectName("kpBox")
self.label_2 = QtWidgets.QLabel(Form) self.gridLayout.addWidget(self.kpBox, 1, 1, 1, 1)
self.label_2.setObjectName("label_2") self.label_4 = QtWidgets.QLabel(Form)
self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1) self.label_4.setObjectName("label_4")
spacerItem1 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) self.gridLayout.addWidget(self.label_4, 0, 0, 1, 1)
self.gridLayout.addItem(spacerItem1, 7, 1, 1, 1)
self.PIDenableButton = QtWidgets.QPushButton(Form) self.PIDenableButton = QtWidgets.QPushButton(Form)
self.PIDenableButton.setStyleSheet("background-color: rgb(255,0,0)") self.PIDenableButton.setStyleSheet("background-color: rgb(255,0,0)")
self.PIDenableButton.setCheckable(True) self.PIDenableButton.setCheckable(True)
@ -37,35 +34,20 @@ class Ui_Form(object):
self.setpointBox.setProperty("value", 22.0) self.setpointBox.setProperty("value", 22.0)
self.setpointBox.setObjectName("setpointBox") self.setpointBox.setObjectName("setpointBox")
self.gridLayout.addWidget(self.setpointBox, 0, 1, 1, 1) self.gridLayout.addWidget(self.setpointBox, 0, 1, 1, 1)
self.label_3 = QtWidgets.QLabel(Form)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 3, 0, 1, 1)
self.label = QtWidgets.QLabel(Form)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
spacerItem = QtWidgets.QSpacerItem(0, 50, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
self.gridLayout.addItem(spacerItem, 6, 1, 1, 1)
self.kdBox = QtWidgets.QDoubleSpinBox(Form) self.kdBox = QtWidgets.QDoubleSpinBox(Form)
self.kdBox.setMinimum(-99.0) self.kdBox.setMinimum(-99.0)
self.kdBox.setSingleStep(0.01) self.kdBox.setSingleStep(0.01)
self.kdBox.setProperty("value", 1.0) self.kdBox.setProperty("value", 1.0)
self.kdBox.setObjectName("kdBox") self.kdBox.setObjectName("kdBox")
self.gridLayout.addWidget(self.kdBox, 3, 1, 1, 1) self.gridLayout.addWidget(self.kdBox, 3, 1, 1, 1)
self.outputBox = QtWidgets.QDoubleSpinBox(Form)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.outputBox.sizePolicy().hasHeightForWidth())
self.outputBox.setSizePolicy(sizePolicy)
self.outputBox.setMaximumSize(QtCore.QSize(100, 16777215))
self.outputBox.setDecimals(3)
self.outputBox.setSingleStep(0.01)
self.outputBox.setObjectName("outputBox")
self.gridLayout.addWidget(self.outputBox, 5, 0, 1, 1)
self.label_4 = QtWidgets.QLabel(Form)
self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 0, 0, 1, 1)
self.kpBox = QtWidgets.QDoubleSpinBox(Form)
self.kpBox.setMinimum(-99.0)
self.kpBox.setSingleStep(0.01)
self.kpBox.setProperty("value", 1.0)
self.kpBox.setObjectName("kpBox")
self.gridLayout.addWidget(self.kpBox, 1, 1, 1, 1)
self.label_3 = QtWidgets.QLabel(Form)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 3, 0, 1, 1)
self.OutputButton = QtWidgets.QPushButton(Form) self.OutputButton = QtWidgets.QPushButton(Form)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
@ -75,6 +57,22 @@ class Ui_Form(object):
self.OutputButton.setMaximumSize(QtCore.QSize(100, 16777215)) self.OutputButton.setMaximumSize(QtCore.QSize(100, 16777215))
self.OutputButton.setObjectName("OutputButton") self.OutputButton.setObjectName("OutputButton")
self.gridLayout.addWidget(self.OutputButton, 5, 1, 1, 1) self.gridLayout.addWidget(self.OutputButton, 5, 1, 1, 1)
self.outputBox = QtWidgets.QDoubleSpinBox(Form)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.outputBox.sizePolicy().hasHeightForWidth())
self.outputBox.setSizePolicy(sizePolicy)
self.outputBox.setMaximumSize(QtCore.QSize(100, 16777215))
self.outputBox.setDecimals(3)
self.outputBox.setMinimum(0.0)
self.outputBox.setMaximum(5.0)
self.outputBox.setSingleStep(0.01)
self.outputBox.setObjectName("outputBox")
self.gridLayout.addWidget(self.outputBox, 5, 0, 1, 1)
self.label_2 = QtWidgets.QLabel(Form)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
self.kiBox = QtWidgets.QDoubleSpinBox(Form) self.kiBox = QtWidgets.QDoubleSpinBox(Form)
self.kiBox.setMinimum(-99.0) self.kiBox.setMinimum(-99.0)
self.kiBox.setSingleStep(0.01) self.kiBox.setSingleStep(0.01)
@ -99,8 +97,59 @@ class Ui_Form(object):
self.widget_4.setObjectName("widget_4") self.widget_4.setObjectName("widget_4")
self.output_layout = QtWidgets.QHBoxLayout(self.widget_4) self.output_layout = QtWidgets.QHBoxLayout(self.widget_4)
self.output_layout.setObjectName("output_layout") self.output_layout.setObjectName("output_layout")
self.gridLayout_2.addWidget(self.widget_4, 1, 0, 1, 2) self.gridLayout_2.addWidget(self.widget_4, 1, 1, 1, 1)
self.groupBox_3 = QtWidgets.QGroupBox(self.widget)
self.groupBox_3.setObjectName("groupBox_3")
self.gridLayout_4 = QtWidgets.QGridLayout(self.groupBox_3)
self.gridLayout_4.setObjectName("gridLayout_4")
self.label_5 = QtWidgets.QLabel(self.groupBox_3)
self.label_5.setObjectName("label_5")
self.gridLayout_4.addWidget(self.label_5, 1, 0, 1, 1)
self.zeroVoltage = QtWidgets.QDoubleSpinBox(self.groupBox_3)
self.zeroVoltage.setMinimum(-5.0)
self.zeroVoltage.setMaximum(5.0)
self.zeroVoltage.setSingleStep(0.1)
self.zeroVoltage.setProperty("value", 1.29)
self.zeroVoltage.setObjectName("zeroVoltage")
self.gridLayout_4.addWidget(self.zeroVoltage, 2, 0, 1, 1)
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.gridLayout_4.addItem(spacerItem1, 3, 0, 1, 1)
self.peltierCheckBox = QtWidgets.QCheckBox(self.groupBox_3)
self.peltierCheckBox.setObjectName("peltierCheckBox")
self.gridLayout_4.addWidget(self.peltierCheckBox, 0, 0, 1, 1)
self.gridLayout_2.addWidget(self.groupBox_3, 1, 0, 1, 1)
self.gridLayout.addWidget(self.widget, 0, 2, 8, 1) self.gridLayout.addWidget(self.widget, 0, 2, 8, 1)
self.groupBox = QtWidgets.QGroupBox(Form)
self.groupBox.setMinimumSize(QtCore.QSize(0, 160))
self.groupBox.setObjectName("groupBox")
self.gridLayout_3 = QtWidgets.QGridLayout(self.groupBox)
self.gridLayout_3.setObjectName("gridLayout_3")
self.doubleSpinBox_3 = QtWidgets.QDoubleSpinBox(self.groupBox)
self.doubleSpinBox_3.setObjectName("doubleSpinBox_3")
self.gridLayout_3.addWidget(self.doubleSpinBox_3, 3, 0, 1, 1)
self.currentBox = QtWidgets.QDoubleSpinBox(self.groupBox)
self.currentBox.setPrefix("")
self.currentBox.setSingleStep(0.1)
self.currentBox.setObjectName("currentBox")
self.gridLayout_3.addWidget(self.currentBox, 0, 0, 1, 1)
self.CurrentButton = QtWidgets.QPushButton(self.groupBox)
self.CurrentButton.setObjectName("CurrentButton")
self.gridLayout_3.addWidget(self.CurrentButton, 0, 1, 1, 1)
self.PhaseButton = QtWidgets.QPushButton(self.groupBox)
self.PhaseButton.setObjectName("PhaseButton")
self.gridLayout_3.addWidget(self.PhaseButton, 3, 1, 1, 1)
self.groupBox_2 = QtWidgets.QGroupBox(self.groupBox)
self.groupBox_2.setObjectName("groupBox_2")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.groupBox_2)
self.horizontalLayout.setObjectName("horizontalLayout")
self.factorBox = QtWidgets.QDoubleSpinBox(self.groupBox_2)
self.factorBox.setObjectName("factorBox")
self.horizontalLayout.addWidget(self.factorBox)
self.FactorButton = QtWidgets.QPushButton(self.groupBox_2)
self.FactorButton.setObjectName("FactorButton")
self.horizontalLayout.addWidget(self.FactorButton)
self.gridLayout_3.addWidget(self.groupBox_2, 1, 0, 1, 2)
self.gridLayout.addWidget(self.groupBox, 7, 0, 1, 2)
self.retranslateUi(Form) self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form) QtCore.QMetaObject.connectSlotsByName(Form)
@ -108,9 +157,22 @@ class Ui_Form(object):
def retranslateUi(self, Form): def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form")) Form.setWindowTitle(_translate("Form", "Form"))
self.label.setText(_translate("Form", "kp"))
self.label_2.setText(_translate("Form", "ki"))
self.PIDenableButton.setText(_translate("Form", "PID enable"))
self.label_4.setText(_translate("Form", "Setpoint (°C)")) self.label_4.setText(_translate("Form", "Setpoint (°C)"))
self.PIDenableButton.setText(_translate("Form", "PID enable"))
self.label_3.setText(_translate("Form", "kd")) self.label_3.setText(_translate("Form", "kd"))
self.label.setText(_translate("Form", "kp"))
self.OutputButton.setText(_translate("Form", "Set output")) self.OutputButton.setText(_translate("Form", "Set output"))
self.outputBox.setSuffix(_translate("Form", " V"))
self.label_2.setText(_translate("Form", "ki"))
self.groupBox_3.setTitle(_translate("Form", "Parameter"))
self.label_5.setText(_translate("Form", "Zero voltage"))
self.zeroVoltage.setSuffix(_translate("Form", " V"))
self.peltierCheckBox.setText(_translate("Form", "Peltier? (allow negativ voltages)"))
self.groupBox.setTitle(_translate("Form", "U-I-Wandler"))
self.doubleSpinBox_3.setSuffix(_translate("Form", " °"))
self.currentBox.setSuffix(_translate("Form", " mA"))
self.CurrentButton.setText(_translate("Form", "Set current"))
self.PhaseButton.setText(_translate("Form", "Set phase"))
self.groupBox_2.setTitle(_translate("Form", "Current-phase factor:"))
self.FactorButton.setText(_translate("Form", "Set factor"))

View File

@ -7,59 +7,33 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>846</width> <width>846</width>
<height>423</height> <height>421</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="6" column="1"> <item row="1" column="1">
<spacer name="verticalSpacer"> <widget class="QDoubleSpinBox" name="kpBox">
<property name="orientation"> <property name="minimum">
<enum>Qt::Vertical</enum> <double>-99.000000000000000</double>
</property> </property>
<property name="sizeType"> <property name="singleStep">
<enum>QSizePolicy::Minimum</enum> <double>0.010000000000000</double>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="value">
<size> <double>1.000000000000000</double>
<width>20</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>kp</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>ki</string> <string>Setpoint (°C)</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="1">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="0"> <item row="4" column="0">
<widget class="QPushButton" name="PIDenableButton"> <widget class="QPushButton" name="PIDenableButton">
<property name="styleSheet"> <property name="styleSheet">
@ -86,6 +60,36 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>kd</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>kp</string>
</property>
</widget>
</item>
<item row="6" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Minimum</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>50</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QDoubleSpinBox" name="kdBox"> <widget class="QDoubleSpinBox" name="kdBox">
<property name="minimum"> <property name="minimum">
@ -99,55 +103,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="0">
<widget class="QDoubleSpinBox" name="outputBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="decimals">
<number>3</number>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Setpoint (°C)</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="kpBox">
<property name="minimum">
<double>-99.000000000000000</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
</property>
<property name="value">
<double>1.000000000000000</double>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>kd</string>
</property>
</widget>
</item>
<item row="5" column="1"> <item row="5" column="1">
<widget class="QPushButton" name="OutputButton"> <widget class="QPushButton" name="OutputButton">
<property name="sizePolicy"> <property name="sizePolicy">
@ -167,6 +122,44 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="0">
<widget class="QDoubleSpinBox" name="outputBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="suffix">
<string> V</string>
</property>
<property name="decimals">
<number>3</number>
</property>
<property name="minimum">
<double>0.000000000000000</double>
</property>
<property name="maximum">
<double>5.000000000000000</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>ki</string>
</property>
</widget>
</item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QDoubleSpinBox" name="kiBox"> <widget class="QDoubleSpinBox" name="kiBox">
<property name="minimum"> <property name="minimum">
@ -193,11 +186,134 @@
<layout class="QHBoxLayout" name="error_layout"/> <layout class="QHBoxLayout" name="error_layout"/>
</widget> </widget>
</item> </item>
<item row="1" column="0" colspan="2"> <item row="1" column="1">
<widget class="QWidget" name="widget_4" native="true"> <widget class="QWidget" name="widget_4" native="true">
<layout class="QHBoxLayout" name="output_layout"/> <layout class="QHBoxLayout" name="output_layout"/>
</widget> </widget>
</item> </item>
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Parameter</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Zero voltage</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QDoubleSpinBox" name="zeroVoltage">
<property name="suffix">
<string> V</string>
</property>
<property name="minimum">
<double>-5.000000000000000</double>
</property>
<property name="maximum">
<double>5.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="value">
<double>1.290000000000000</double>
</property>
</widget>
</item>
<item row="3" column="0">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="peltierCheckBox">
<property name="text">
<string>Peltier? (allow negativ voltages)</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item row="7" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox">
<property name="minimumSize">
<size>
<width>0</width>
<height>160</height>
</size>
</property>
<property name="title">
<string>U-I-Wandler</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="3" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_3">
<property name="suffix">
<string> °</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QDoubleSpinBox" name="currentBox">
<property name="prefix">
<string/>
</property>
<property name="suffix">
<string> mA</string>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="CurrentButton">
<property name="text">
<string>Set current</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="PhaseButton">
<property name="text">
<string>Set phase</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Current-phase factor:</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QDoubleSpinBox" name="factorBox"/>
</item>
<item>
<widget class="QPushButton" name="FactorButton">
<property name="text">
<string>Set factor</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>

View File

@ -10,10 +10,11 @@ import globalvars
from channelInfoWidgetClass import channelInfoWidget from channelInfoWidgetClass import channelInfoWidget
class channelInfo(QObject): class channelInfo(QObject):
def __init__(self, channel_num, temp_field, out_field, enable_field, tabnumber, activTabWidget, parent): def __init__(self, device_num, channel_num, temp_field, out_field, enable_field, tabnumber, activTabWidget, parent):
super(channelInfo,self).__init__(parent) super(channelInfo,self).__init__(parent)
self.widget_obj = channelInfoWidget(self) self.widget_obj = channelInfoWidget(self)
self.channel_num = channel_num self.channel_num = channel_num
self.device_num = device_num
self.temp_field = temp_field self.temp_field = temp_field
self.out_field = out_field self.out_field = out_field
@ -39,11 +40,15 @@ class channelInfo(QObject):
self.widget_obj.PIDenableButton.clicked.connect(self.PIDenableButtonChanged) self.widget_obj.PIDenableButton.clicked.connect(self.PIDenableButtonChanged)
self.widget_obj.OutputButton.clicked.connect(self.OutputButtonChanged) self.widget_obj.OutputButton.clicked.connect(self.OutputButtonChanged)
self.widget_obj.peltierCheckBox.stateChanged.connect(self.heaterTypeChanged)
self.widget_obj.CurrentButton.clicked.connect(self.CurrentButtonChanged)
self.widget_obj.PhaseButton.clicked.connect(self.PhaseButton)
def update(self): def update(self):
if globalvars.conStatus: if globalvars.conStatus[self.device_num]:
TCP.send_cmd(globalvars.sock, 'CMD:\tGET_RUN_VALUES\t'+str(self.channel_num)+'\t') TCP.send_cmd(globalvars.sock[self.device_num], 'CMD:\tGET_RUN_VALUES\t'+str(self.channel_num)+'\t')
msg = TCP.recv_msg(globalvars.sock) msg = TCP.recv_msg(globalvars.sock[self.device_num])
#ans = str2num(msg) #ans = str2num(msg)
try: try:
@ -70,86 +75,114 @@ class channelInfo(QObject):
def setpointChanged(self): def setpointChanged(self):
if globalvars.conStatus: if globalvars.conStatus[self.device_num]:
TCP.send_cmd(globalvars.sock, 'CMD:\tSET_SETPOINT\t'+str(self.channel_num)+'\t'+str(self.widget_obj.setpointBox.value())+'\t') TCP.send_cmd(globalvars.sock[self.device_num], 'CMD:\tSET_SETPOINT\t'+str(self.channel_num)+'\t'+str(self.widget_obj.setpointBox.value())+'\t')
ans = TCP.recv_msg(globalvars.sock) ans = TCP.recv_msg(globalvars.sock[self.device_num])
print(ans) print(ans)
globalvars.settings["ch{0}".format(self.channel_num)]["setpoint"] = self.widget_obj.setpointBox.value() globalvars.settings["ch{0}".format(self.channel_num)]["setpoint"] = self.widget_obj.setpointBox.value()
def kpChanged(self): def kpChanged(self):
if globalvars.conStatus: if globalvars.conStatus[self.device_num]:
TCP.send_cmd(globalvars.sock, 'CMD:\tSET_KP\t'+str(self.channel_num)+'\t'+str(self.widget_obj.kpBox.value())+'\t') TCP.send_cmd(globalvars.sock[self.device_num], 'CMD:\tSET_KP\t'+str(self.channel_num)+'\t'+str(self.widget_obj.kpBox.value())+'\t')
ans = TCP.recv_msg(globalvars.sock) ans = TCP.recv_msg(globalvars.sock[self.device_num])
print(ans) print(ans)
globalvars.settings["ch{0}".format(self.channel_num)]["kp"] = self.widget_obj.kpBox.value()
def kiChanged(self): def kiChanged(self):
if globalvars.conStatus: if globalvars.conStatus[self.device_num]:
TCP.send_cmd(globalvars.sock, 'CMD:\tSET_KI\t'+str(self.channel_num)+'\t'+str(self.widget_obj.kiBox.value())+'\t') TCP.send_cmd(globalvars.sock[self.device_num], 'CMD:\tSET_KI\t'+str(self.channel_num)+'\t'+str(self.widget_obj.kiBox.value())+'\t')
ans = TCP.recv_msg(globalvars.sock) ans = TCP.recv_msg(globalvars.sock[self.device_num])
print(ans) print(ans)
globalvars.settings["ch{0}".format(self.channel_num)]["ki"] = self.widget_obj.kiBox.value()
def kdChanged(self): def kdChanged(self):
if globalvars.conStatus: if globalvars.conStatus[self.device_num]:
TCP.send_cmd(globalvars.sock, 'CMD:\tSET_KD\t'+str(self.channel_num)+'\t'+str(self.widget_obj.kdBox.value())+'\t') TCP.send_cmd(globalvars.sock[self.device_num], 'CMD:\tSET_KD\t'+str(self.channel_num)+'\t'+str(self.widget_obj.kdBox.value())+'\t')
ans = TCP.recv_msg(globalvars.sock) ans = TCP.recv_msg(globalvars.sock[self.device_num])
globalvars.settings["ch{0}".format(self.channel_num)]["kd"] = self.widget_obj.kdBox.value()
print(ans) print(ans)
def PIDenableButtonChanged(self): def PIDenableButtonChanged(self):
if globalvars.conStatus: if globalvars.conStatus[self.device_num]:
if self.widget_obj.PIDenableButton.isChecked(): if self.widget_obj.PIDenableButton.isChecked():
self.widget_obj.PIDenableButton.setStyleSheet("background-color: rgb(0,255,0)") self.widget_obj.PIDenableButton.setStyleSheet("background-color: rgb(0,255,0)")
self.widget_obj.OutputButton.setEnabled(False) self.widget_obj.OutputButton.setEnabled(False)
TCP.send_cmd(globalvars.sock, 'CMD:\tLOCK\t'+str(self.channel_num)+'\t') TCP.send_cmd(globalvars.sock[self.device_num], 'CMD:\tLOCK\t'+str(self.channel_num)+'\t')
ans = TCP.recv_msg(globalvars.sock) ans = TCP.recv_msg(globalvars.sock[self.device_num])
print(ans) print(ans)
self.enable_field.setStyleSheet("background-color: rgb(0,255,0)") self.enable_field.setStyleSheet("background-color: rgb(0,255,0)")
else: else:
self.widget_obj.PIDenableButton.setStyleSheet("background-color: rgb(255,0,0)") self.widget_obj.PIDenableButton.setStyleSheet("background-color: rgb(255,0,0)")
self.widget_obj.OutputButton.setEnabled(True) self.widget_obj.OutputButton.setEnabled(True)
TCP.send_cmd(globalvars.sock, 'CMD:\tIDLE\t'+str(self.channel_num)+'\t') TCP.send_cmd(globalvars.sock[self.device_num], 'CMD:\tIDLE\t'+str(self.channel_num)+'\t')
ans = TCP.recv_msg(globalvars.sock) ans = TCP.recv_msg(globalvars.sock[self.device_num])
print(ans) print(ans)
self.enable_field.setStyleSheet("background-color: rgb(255,0,0)") self.enable_field.setStyleSheet("background-color: rgb(255,0,0)")
else: else:
self.widget_obj.PIDenableButton.setChecked(False) self.widget_obj.PIDenableButton.setChecked(False)
def OutputButtonChanged(self): def OutputButtonChanged(self):
if globalvars.conStatus: if globalvars.conStatus[self.device_num]:
TCP.send_cmd(globalvars.sock, 'CMD:\tSET_VOLTAGE\t'+str(self.channel_num)+'\t'+str(self.widget_obj.outputBox.value())+'\t') setVoltage = self.widget_obj.zeroVoltage.value()/5 * self.widget_obj.outputBox.value() + self.widget_obj.zeroVoltage.value()
ans = TCP.recv_msg(globalvars.sock) #setVoltage = self.widget_obj.outputBox.value()
TCP.send_cmd(globalvars.sock[self.device_num], 'CMD:\tSET_VOLTAGE\t'+str(1)+'\t'+str(setVoltage)+'\t')
ans = TCP.recv_msg(globalvars.sock[self.device_num])
print(ans) print(ans)
def CurrentButtonChanged(self):
if globalvars.conStatus[self.device_num]:
setVoltage = 3*self.widget_obj.currentBox.value()/65
#setVoltage = self.widget_obj.outputBox.value()
TCP.send_cmd(globalvars.sock[self.device_num], 'CMD:\tSET_VOLTAGE\t'+str(0)+'\t'+str(setVoltage)+'\t')
def PhaseButtonChanged(self):
if globalvars.conStatus[self.device_num]:
setVoltage = self.widget_obj.phaseBox.value() * self.widget_obj.factorBox.value() * 3/65
TCP.send_cmd(globalvars.sock[self.device_num], 'CMD:\tSET_VOLTAGE\t'+str(0)+'\t'+str(setVoltage)+'\t')
def heaterTypeChanged(self):
if self.widget_obj.peltierCheckBox.isChecked():
self.widget_obj.outputBox.setMinimum(-5)
TCP.send_cmd(globalvars.sock[self.device_num], 'CMD:\tSET_OUTMAX\t'+str(0)+'\t'+str(3)+'\t')
TCP.send_cmd(globalvars.sock[self.device_num], 'CMD:\tSET_OUTMIN\t'+str(0)+'\t'+str(0)+'\t')
else:
self.widget_obj.outputBox.setMinimum(0)
TCP.send_cmd(globalvars.sock[self.device_num], 'CMD:\tSET_OUTMAX\t'+str(0)+'\t'+str(3)+'\t')
TCP.send_cmd(globalvars.sock[self.device_num], 'CMD:\tSET_OUTMIN\t'+str(0)+'\t'+str(self.widget_obj.zeroVoltage.value())+'\t')
def setEnabled(self, val): def setEnabled(self, val):
self.widget_obj.setEnabled(val) self.widget_obj.setEnabled(val)
def loadSettings(self): def loadSettings(self):
if globalvars.remoteSettings: if globalvars.remoteSettings[self.device_num]:
TCP.send_cmd(globalvars.sock,"CMD:\tGET_SETPOINT\t{0}\t".format(self.channel_num)) TCP.send_cmd(globalvars.sock[self.device_num],"CMD:\tGET_SETPOINT\t{0}\t".format(self.channel_num))
setpoint = float(TCP.recv_msg(globalvars.sock)) setpoint = float(TCP.recv_msg(globalvars.sock[self.device_num]))
self.widget_obj.setpointBox.blockSignals(True) self.widget_obj.setpointBox.blockSignals(True)
self.widget_obj.setpointBox.setValue(setpoint) self.widget_obj.setpointBox.setValue(setpoint)
self.widget_obj.setpointBox.blockSignals(False) self.widget_obj.setpointBox.blockSignals(False)
TCP.send_cmd(globalvars.sock,"CMD:\tGET_KP\t{0}\t".format(self.channel_num)) TCP.send_cmd(globalvars.sock[self.device_num],"CMD:\tGET_KP\t{0}\t".format(self.channel_num))
kp = float(TCP.recv_msg(globalvars.sock)) kp = float(TCP.recv_msg(globalvars.sock[self.device_num]))
self.widget_obj.kpBox.blockSignals(True) self.widget_obj.kpBox.blockSignals(True)
self.widget_obj.kpBox.setValue(kp) self.widget_obj.kpBox.setValue(kp)
self.widget_obj.kpBox.blockSignals(False) self.widget_obj.kpBox.blockSignals(False)
TCP.send_cmd(globalvars.sock,"CMD:\tGET_KI\t{0}\t".format(self.channel_num)) TCP.send_cmd(globalvars.sock[self.device_num],"CMD:\tGET_KI\t{0}\t".format(self.channel_num))
ki = float(TCP.recv_msg(globalvars.sock)) ki = float(TCP.recv_msg(globalvars.sock[self.device_num]))
self.widget_obj.kiBox.blockSignals(True) self.widget_obj.kiBox.blockSignals(True)
self.widget_obj.kiBox.setValue(ki) self.widget_obj.kiBox.setValue(ki)
self.widget_obj.kiBox.blockSignals(False) self.widget_obj.kiBox.blockSignals(False)
TCP.send_cmd(globalvars.sock,"CMD:\tGET_KD\t{0}\t".format(self.channel_num)) TCP.send_cmd(globalvars.sock[self.device_num],"CMD:\tGET_KD\t{0}\t".format(self.channel_num))
kd = float(TCP.recv_msg(globalvars.sock)) kd = float(TCP.recv_msg(globalvars.sock[self.device_num]))
self.widget_obj.kdBox.blockSignals(True) self.widget_obj.kdBox.blockSignals(True)
self.widget_obj.kdBox.setValue(kd) self.widget_obj.kdBox.setValue(kd)
self.widget_obj.kdBox.blockSignals(False) self.widget_obj.kdBox.blockSignals(False)
TCP.send_cmd(globalvars.sock,"CMD:\tGET_PID_STATUS\t{0}\t".format(self.channel_num)) TCP.send_cmd(globalvars.sock[self.device_num],"CMD:\tGET_PID_STATUS\t{0}\t".format(self.channel_num))
enabled = int(TCP.recv_msg(globalvars.sock)) enabled = int(TCP.recv_msg(globalvars.sock[self.device_num]))
print(enabled) print(enabled)
self.widget_obj.PIDenableButton.setChecked(enabled) self.widget_obj.PIDenableButton.setChecked(enabled)
if self.widget_obj.PIDenableButton.isChecked(): if self.widget_obj.PIDenableButton.isChecked():
@ -163,8 +196,11 @@ class channelInfo(QObject):
else: else:
#Set settings from file and trigger sending to server #Set settings from file and trigger sending to server
self.widget_obj.setpointBox.setValue(float(globalvars.settings["ch{0}".format(self.channel_num)]["setpoint"])) self.widget_obj.setpointBox.setValue(float(globalvars.settings["ch{0}".format(self.device_num)]["setpoint"]))
self.widget_obj.kpBox.setValue(float(globalvars.settings["ch{0}".format(self.channel_num)]["kp"])) self.widget_obj.kpBox.setValue(float(globalvars.settings["ch{0}".format(self.device_num)]["kp"]))
self.widget_obj.kiBox.setValue(float(globalvars.settings["ch{0}".format(self.channel_num)]["ki"])) self.widget_obj.kiBox.setValue(float(globalvars.settings["ch{0}".format(self.device_num)]["ki"]))
self.widget_obj.kdBox.setValue(float(globalvars.settings["ch{0}".format(self.channel_num)]["kd"])) self.widget_obj.kdBox.setValue(float(globalvars.settings["ch{0}".format(self.device_num)]["kd"]))
self.widget_obj.PIDenableButton.setChecked(bool(globalvars.settings["ch{0}".format(self.channel_num)]["PIDenabled"])) self.widget_obj.PIDenableButton.setChecked(bool(globalvars.settings["ch{0}".format(self.device_num)]["PIDenabled"]))
self.widget_obj.peltierCheckBox.setChecked(bool(globalvars.settings["ch{0}".format(self.device_num)]["peltier"]))
self.widget_obj.zeroVoltage.setValue(float(globalvars.settings["ch{0}".format(self.device_num)]["zeroVolt"]))

View File

@ -45,25 +45,33 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow):
QMainWindow.__init__(self) QMainWindow.__init__(self)
self.setupUi(self) self.setupUi(self)
self.sock = None
self.address = ''
self.port = 0
self.sock2 = None
self.address2 = ''
self.port2 = 0
self.tcpqueue = queue.Queue(100) self.tcpqueue = queue.Queue(100)
self.channel = [0] self.channel = [0,0]
temp_field = [self.temp_ch0] temp_field = [self.temp_ch0, self.temp_ch1]
out_field = [self.out_ch0] out_field = [self.out_ch0, self.out_ch1]
enable_field = [self.enable_ch0] enable_field = [self.enable_ch0, self.enable_ch1]
#Open json settings file defined in globalvars #Open json settings file defined in globalvars
self.loadSettingsFile(globalvars.settingsFile) self.loadSettingsFile(globalvars.settingsFile)
for ch in range(len(self.channel)): for ch in range(len(self.channel)):
self.channel[ch] = channelInfo(ch,temp_field[ch],out_field[ch],enable_field[ch], ch, self.tabWidget ,self) self.channel[ch] = channelInfo(ch,0,temp_field[ch],out_field[ch],enable_field[ch], ch, self.tabWidget ,self)
self.channel[ch].setEnabled(False) self.channel[ch].setEnabled(False)
self.layout_ch0.addWidget(self.channel[0].widget_obj) self.layout_ch0.addWidget(self.channel[0].widget_obj)
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_0),globalvars.settings["ch0"]["name"]) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_0),globalvars.settings["ch0"]["name"])
#self.layout_ch1.addWidget(self.channel[1].widget_obj) self.layout_ch1.addWidget(self.channel[1].widget_obj)
#self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_1),globalvars.settings["ch1"]["name"]) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_1),globalvars.settings["ch1"]["name"])
#self.layout_ch2.addWidget(self.channel[2].widget_obj) #self.layout_ch2.addWidget(self.channel[2].widget_obj)
#self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2),globalvars.settings["ch2"]["name"]) #self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2),globalvars.settings["ch2"]["name"])
#self.layout_ch3.addWidget(self.channel[3].widget_obj) #self.layout_ch3.addWidget(self.channel[3].widget_obj)
@ -72,14 +80,21 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow):
self.ip_address.setText(globalvars.settings["defaultIP"]) self.ip_address.setText(globalvars.settings["defaultIP"])
self.portField.setText(str(globalvars.settings["defaultPort"])) self.portField.setText(str(globalvars.settings["defaultPort"]))
self.ip_address2.setText(globalvars.settings["defaultIP2"])
self.portField2.setText(str(globalvars.settings["defaultPort2"]))
#Connect radio buttons to functions #Connect radio buttons to functions
self.remoteRadioButton.toggled.connect(lambda:self.settingsSelection(self.remoteRadioButton)) self.remoteRadioButton.toggled.connect(lambda:self.settingsSelection(self.remoteRadioButton))
self.localRadioButton.toggled.connect(lambda:self.settingsSelection(self.localRadioButton)) self.localRadioButton.toggled.connect(lambda:self.settingsSelection(self.localRadioButton))
self.remoteRadioButton2.toggled.connect(lambda:self.settingsSelection2(self.remoteRadioButton2))
self.localRadioButton2.toggled.connect(lambda:self.settingsSelection2(self.localRadioButton2))
# Close event to save settings # Close event to save settings
app.aboutToQuit.connect(self.closeEvent) app.aboutToQuit.connect(self.closeEvent)
# Button functions # Button functions
self.connectButton.clicked.connect(self.connectButtonChange) self.connectButton.clicked.connect(self.connectButtonChange)
self.connectButton2.clicked.connect(self.connectButton2Change)
self.refresh_timer = QTimer() self.refresh_timer = QTimer()
self.refresh_timer.timeout.connect(self.refresh) self.refresh_timer.timeout.connect(self.refresh)
@ -95,7 +110,7 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow):
self.sock.connect((self.address,int(self.port))) self.sock.connect((self.address,int(self.port)))
except Exception as e: except Exception as e:
print("something's wrong with %s:%s. Exception is %s" % (self.address, self.port, e)) print("something's wrong with %s:%s. Exception is %s" % (self.address, self.port, e))
globalvars.conStatus = False globalvars.conStatus[0] = False
self.connectButton.setChecked(False) self.connectButton.setChecked(False)
return return
@ -103,32 +118,75 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow):
data_recv = self.sock.recv(1024) data_recv = self.sock.recv(1024)
print(data_recv.decode()) print(data_recv.decode())
except OSError: except OSError:
globalvars.conStatus = False globalvars.conStatus[0] = False
self.connectButton.setChecked(False) self.connectButton.setChecked(False)
print('\nSocket broken') print('\nSocket broken')
return return
globalvars.conStatus = True globalvars.conStatus[0] = True
globalvars.sock = self.sock globalvars.sock[0] = self.sock
print("connect to "+ self.address) print("connect to "+ self.address)
for ch in range(len(self.channel)):
self.channel[ch].loadSettings() self.channel[0].loadSettings()
self.refresh_timer.start(500) self.refresh_timer.start(500)
else: else:
globalvars.conStatus = False globalvars.conStatus[0] = False
self.refresh_timer.stop() self.refresh_timer.stop()
time.sleep(0.1) time.sleep(0.1)
print("disconnect from "+ self.address) print("disconnect from "+ self.address)
self.sock.close() self.sock.close()
for ch in range(len(self.channel)): self.channel[0].setEnabled(globalvars.conStatus[0])
self.channel[ch].setEnabled(globalvars.conStatus)
self.remoteRadioButton.setEnabled(not globalvars.conStatus) self.remoteRadioButton.setEnabled(not globalvars.conStatus[0])
self.localRadioButton.setEnabled(not globalvars.conStatus) self.localRadioButton.setEnabled(not globalvars.conStatus[0])
def connectButton2Change(self):
if self.connectButton2.isChecked():
#Open connection to server
self.sock2 = socket.socket()
self.address2 = self.ip_address2.text()
self.port2 = self.portField2.text()
try:
self.sock2.connect((self.address2,int(self.port2)))
except Exception as e:
print("something's wrong with %s:%s. Exception is %s" % (self.address, self.port, e))
globalvars.conStatus[1] = False
self.connectButton2.setChecked(False)
return
try:
data_recv = self.sock2.recv(1024)
print(data_recv.decode())
except OSError:
globalvars.conStatus[1] = False
self.connectButton2.setChecked(False)
print('\nSocket broken')
return
globalvars.conStatus[1] = True
globalvars.sock[1] = self.sock2
print("connect to "+ self.address2)
self.channel[1].loadSettings()
self.refresh_timer.start(500)
else:
globalvars.conStatus[1] = False
self.refresh_timer.stop()
time.sleep(0.1)
print("disconnect from "+ self.address2)
self.sock2.close()
self.channel[1].setEnabled(globalvars.conStatus[1])
self.remoteRadioButton.setEnabled(not globalvars.conStatus[1])
self.localRadioButton.setEnabled(not globalvars.conStatus[1])
def refresh(self): def refresh(self):
for ch in range(len(self.channel)): for ch in range(len(self.channel)):
@ -138,22 +196,36 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow):
def settingsSelection(self,b): def settingsSelection(self,b):
if b.objectName() == "remoteRadioButton": if b.objectName() == "remoteRadioButton":
if b.isChecked() == True: if b.isChecked() == True:
globalvars.remoteSettings = True globalvars.remoteSettings[0] = True
else: else:
globalvars.remoteSettings = False globalvars.remoteSettings[0] = False
if b.objectName() == "localRadioButton": if b.objectName() == "localRadioButton":
if b.isChecked() == True: if b.isChecked() == True:
globalvars.remoteSettings = False globalvars.remoteSettings[0] = False
else: else:
globalvars.remoteSettings = True globalvars.remoteSettings[0] = True
def settingsSelection2(self,b):
if b.objectName() == "remoteRadioButton2":
if b.isChecked() == True:
globalvars.remoteSettings[1] = True
else:
globalvars.remoteSettings[1] = False
if b.objectName() == "localRadioButton2":
if b.isChecked() == True:
globalvars.remoteSettings[1] = False
else:
globalvars.remoteSettings[1] = True
def loadSettingsFile(self,path): def loadSettingsFile(self,path):
with open(path) as c: with open(path) as c:
globalvars.settings = json.load(c) globalvars.settings = json.load(c)
def closeEvent(self, event): def closeEvent(self, event):
globalvars.conStatus = False globalvars.conStatus[0] = False
globalvars.conStatus[1] = False
print("Saving settings... ") print("Saving settings... ")
with open(globalvars.settingsFile, 'w') as f: with open(globalvars.settingsFile, 'w') as f:
@ -165,6 +237,6 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow):
if __name__ == '__main__': if __name__ == '__main__':
app = QApplication(sys.argv) app = QApplication(sys.argv)
main = ApplicationWindow() main = ApplicationWindow()
main.setWindowTitle("Tempertur-Controller V1") main.setWindowTitle("Time-Bin-Controller V1")
main.show() main.show()
app.exec_() app.exec_()

View File

@ -1,6 +1,6 @@
conStatus = False conStatus = [False, False]
sock = 0 sock = [0,0]
settings = 0 settings = 0
remoteSettings = True remoteSettings = [True, True]
settingsFile = './settings.json' settingsFile = './settings.json'

View File

@ -2,14 +2,12 @@
# Form implementation generated from reading ui file 'main_window.ui' # Form implementation generated from reading ui file 'main_window.ui'
# #
# Created by: PyQt5 UI code generator 5.14.1 # Created by: PyQt5 UI code generator 5.10.1
# #
# WARNING! All changes made in this file will be lost! # WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object): class Ui_MainWindow(object):
def setupUi(self, MainWindow): def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow") MainWindow.setObjectName("MainWindow")
@ -25,37 +23,31 @@ class Ui_MainWindow(object):
sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth()) sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth())
self.groupBox.setSizePolicy(sizePolicy) self.groupBox.setSizePolicy(sizePolicy)
self.groupBox.setMinimumSize(QtCore.QSize(220, 0)) self.groupBox.setMinimumSize(QtCore.QSize(220, 0))
self.groupBox.setMaximumSize(QtCore.QSize(157, 16777215)) self.groupBox.setMaximumSize(QtCore.QSize(220, 16777215))
self.groupBox.setObjectName("groupBox") self.groupBox.setObjectName("groupBox")
self.gridLayout_3 = QtWidgets.QGridLayout(self.groupBox) self.gridLayout_3 = QtWidgets.QGridLayout(self.groupBox)
self.gridLayout_3.setObjectName("gridLayout_3") self.gridLayout_3.setObjectName("gridLayout_3")
self.label_5 = QtWidgets.QLabel(self.groupBox)
self.label_5.setObjectName("label_5")
self.gridLayout_3.addWidget(self.label_5, 0, 1, 1, 1)
self.connectButton = QtWidgets.QPushButton(self.groupBox)
self.connectButton.setCheckable(True)
self.connectButton.setObjectName("connectButton")
self.gridLayout_3.addWidget(self.connectButton, 5, 0, 1, 3)
self.localRadioButton = QtWidgets.QRadioButton(self.groupBox)
self.localRadioButton.setObjectName("localRadioButton")
self.gridLayout_3.addWidget(self.localRadioButton, 4, 0, 1, 3)
self.remoteRadioButton = QtWidgets.QRadioButton(self.groupBox)
self.remoteRadioButton.setChecked(True)
self.remoteRadioButton.setObjectName("remoteRadioButton")
self.gridLayout_3.addWidget(self.remoteRadioButton, 3, 0, 1, 3)
self.label = QtWidgets.QLabel(self.groupBox)
self.label.setObjectName("label")
self.gridLayout_3.addWidget(self.label, 0, 0, 1, 1)
self.ip_address = QtWidgets.QLineEdit(self.groupBox) self.ip_address = QtWidgets.QLineEdit(self.groupBox)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0) sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.ip_address.sizePolicy().hasHeightForWidth()) sizePolicy.setHeightForWidth(self.ip_address.sizePolicy().hasHeightForWidth())
self.ip_address.setSizePolicy(sizePolicy) self.ip_address.setSizePolicy(sizePolicy)
self.ip_address.setMinimumSize(QtCore.QSize(130, 0))
self.ip_address.setMaximumSize(QtCore.QSize(16777215, 16777215)) self.ip_address.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.ip_address.setAlignment(QtCore.Qt.AlignCenter) self.ip_address.setAlignment(QtCore.Qt.AlignCenter)
self.ip_address.setObjectName("ip_address") self.ip_address.setObjectName("ip_address")
self.gridLayout_3.addWidget(self.ip_address, 1, 0, 1, 1) self.gridLayout_3.addWidget(self.ip_address, 1, 0, 1, 1)
self.label_5 = QtWidgets.QLabel(self.groupBox)
self.label_5.setObjectName("label_5")
self.gridLayout_3.addWidget(self.label_5, 0, 1, 1, 1)
self.localRadioButton = QtWidgets.QRadioButton(self.groupBox)
self.localRadioButton.setObjectName("localRadioButton")
self.gridLayout_3.addWidget(self.localRadioButton, 4, 0, 1, 3)
self.connectButton = QtWidgets.QPushButton(self.groupBox)
self.connectButton.setCheckable(True)
self.connectButton.setObjectName("connectButton")
self.gridLayout_3.addWidget(self.connectButton, 5, 0, 1, 3)
self.portField = QtWidgets.QLineEdit(self.groupBox) self.portField = QtWidgets.QLineEdit(self.groupBox)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
@ -65,8 +57,13 @@ class Ui_MainWindow(object):
self.portField.setMaximumSize(QtCore.QSize(50, 16777215)) self.portField.setMaximumSize(QtCore.QSize(50, 16777215))
self.portField.setObjectName("portField") self.portField.setObjectName("portField")
self.gridLayout_3.addWidget(self.portField, 1, 1, 1, 2) self.gridLayout_3.addWidget(self.portField, 1, 1, 1, 2)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.label = QtWidgets.QLabel(self.groupBox)
self.gridLayout_3.addItem(spacerItem, 6, 0, 1, 1) self.label.setObjectName("label")
self.gridLayout_3.addWidget(self.label, 0, 0, 1, 1)
self.remoteRadioButton = QtWidgets.QRadioButton(self.groupBox)
self.remoteRadioButton.setChecked(True)
self.remoteRadioButton.setObjectName("remoteRadioButton")
self.gridLayout_3.addWidget(self.remoteRadioButton, 3, 0, 1, 3)
self.gridLayout_2.addWidget(self.groupBox, 0, 0, 1, 1) self.gridLayout_2.addWidget(self.groupBox, 0, 0, 1, 1)
self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget) self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget)
self.groupBox_2.setObjectName("groupBox_2") self.groupBox_2.setObjectName("groupBox_2")
@ -127,9 +124,9 @@ class Ui_MainWindow(object):
self.enable_ch1.setText("") self.enable_ch1.setText("")
self.enable_ch1.setObjectName("enable_ch1") self.enable_ch1.setObjectName("enable_ch1")
self.gridLayout_4.addWidget(self.enable_ch1, 2, 2, 1, 1) self.gridLayout_4.addWidget(self.enable_ch1, 2, 2, 1, 1)
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.gridLayout_4.addItem(spacerItem1, 5, 0, 1, 1) self.gridLayout_4.addItem(spacerItem, 5, 0, 1, 1)
self.gridLayout_2.addWidget(self.groupBox_2, 0, 1, 1, 1) self.gridLayout_2.addWidget(self.groupBox_2, 0, 1, 2, 1)
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget) self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setObjectName("tabWidget") self.tabWidget.setObjectName("tabWidget")
self.tab_0 = QtWidgets.QWidget() self.tab_0 = QtWidgets.QWidget()
@ -152,10 +149,46 @@ class Ui_MainWindow(object):
self.layout_ch3 = QtWidgets.QHBoxLayout(self.tab_3) self.layout_ch3 = QtWidgets.QHBoxLayout(self.tab_3)
self.layout_ch3.setObjectName("layout_ch3") self.layout_ch3.setObjectName("layout_ch3")
self.tabWidget.addTab(self.tab_3, "") self.tabWidget.addTab(self.tab_3, "")
self.gridLayout_2.addWidget(self.tabWidget, 1, 0, 1, 2) self.gridLayout_2.addWidget(self.tabWidget, 3, 0, 1, 2)
self.groupBox_3 = QtWidgets.QGroupBox(self.centralwidget)
self.groupBox_3.setMinimumSize(QtCore.QSize(220, 0))
self.groupBox_3.setMaximumSize(QtCore.QSize(220, 16777215))
self.groupBox_3.setObjectName("groupBox_3")
self.gridLayout = QtWidgets.QGridLayout(self.groupBox_3)
self.gridLayout.setObjectName("gridLayout")
self.label_6 = QtWidgets.QLabel(self.groupBox_3)
self.label_6.setObjectName("label_6")
self.gridLayout.addWidget(self.label_6, 0, 0, 1, 1)
self.label_7 = QtWidgets.QLabel(self.groupBox_3)
self.label_7.setObjectName("label_7")
self.gridLayout.addWidget(self.label_7, 0, 1, 1, 1)
self.localRadioButton2 = QtWidgets.QRadioButton(self.groupBox_3)
self.localRadioButton2.setObjectName("localRadioButton2")
self.gridLayout.addWidget(self.localRadioButton2, 3, 0, 1, 2)
self.remoteRadioButton2 = QtWidgets.QRadioButton(self.groupBox_3)
self.remoteRadioButton2.setChecked(True)
self.remoteRadioButton2.setObjectName("remoteRadioButton2")
self.gridLayout.addWidget(self.remoteRadioButton2, 2, 0, 1, 2)
self.portField2 = QtWidgets.QLineEdit(self.groupBox_3)
self.portField2.setObjectName("portField2")
self.gridLayout.addWidget(self.portField2, 1, 1, 1, 1)
self.ip_address2 = QtWidgets.QLineEdit(self.groupBox_3)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.ip_address2.sizePolicy().hasHeightForWidth())
self.ip_address2.setSizePolicy(sizePolicy)
self.ip_address2.setMinimumSize(QtCore.QSize(130, 0))
self.ip_address2.setObjectName("ip_address2")
self.gridLayout.addWidget(self.ip_address2, 1, 0, 1, 1)
self.connectButton2 = QtWidgets.QPushButton(self.groupBox_3)
self.connectButton2.setCheckable(True)
self.connectButton2.setObjectName("connectButton2")
self.gridLayout.addWidget(self.connectButton2, 4, 0, 1, 2)
self.gridLayout_2.addWidget(self.groupBox_3, 1, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget) MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 881, 22)) self.menubar.setGeometry(QtCore.QRect(0, 0, 881, 21))
self.menubar.setObjectName("menubar") self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar) MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar = QtWidgets.QStatusBar(MainWindow)
@ -169,14 +202,14 @@ class Ui_MainWindow(object):
def retranslateUi(self, MainWindow): def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.groupBox.setTitle(_translate("MainWindow", "Connection setup")) self.groupBox.setTitle(_translate("MainWindow", "Connection 1 setup"))
self.label_5.setText(_translate("MainWindow", "Port:"))
self.connectButton.setText(_translate("MainWindow", "Connect"))
self.localRadioButton.setText(_translate("MainWindow", "use local settings"))
self.remoteRadioButton.setText(_translate("MainWindow", "use remote settings"))
self.label.setText(_translate("MainWindow", "IP:"))
self.ip_address.setText(_translate("MainWindow", "134.96.13.239")) self.ip_address.setText(_translate("MainWindow", "134.96.13.239"))
self.label_5.setText(_translate("MainWindow", "Port:"))
self.localRadioButton.setText(_translate("MainWindow", "use local settings"))
self.connectButton.setText(_translate("MainWindow", "Connect"))
self.portField.setText(_translate("MainWindow", "2000")) self.portField.setText(_translate("MainWindow", "2000"))
self.label.setText(_translate("MainWindow", "IP:"))
self.remoteRadioButton.setText(_translate("MainWindow", "use remote settings"))
self.groupBox_2.setTitle(_translate("MainWindow", "Overview")) self.groupBox_2.setTitle(_translate("MainWindow", "Overview"))
self.label_2.setText(_translate("MainWindow", "temperatures (°C)")) self.label_2.setText(_translate("MainWindow", "temperatures (°C)"))
self.label_3.setText(_translate("MainWindow", "PID enabled")) self.label_3.setText(_translate("MainWindow", "PID enabled"))
@ -185,3 +218,12 @@ class Ui_MainWindow(object):
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_1), _translate("MainWindow", "Channel 1")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_1), _translate("MainWindow", "Channel 1"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Channel 2")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Channel 2"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Channel 3")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Channel 3"))
self.groupBox_3.setTitle(_translate("MainWindow", "Connection 2 setup"))
self.label_6.setText(_translate("MainWindow", "IP:"))
self.label_7.setText(_translate("MainWindow", "Port:"))
self.localRadioButton2.setText(_translate("MainWindow", "use local settings"))
self.remoteRadioButton2.setText(_translate("MainWindow", "use remote settings"))
self.portField2.setText(_translate("MainWindow", "2000"))
self.ip_address2.setText(_translate("MainWindow", "134.96.13.250"))
self.connectButton2.setText(_translate("MainWindow", "Connect"))

View File

@ -31,55 +31,14 @@
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>157</width> <width>220</width>
<height>16777215</height> <height>16777215</height>
</size> </size>
</property> </property>
<property name="title"> <property name="title">
<string>Connection setup</string> <string>Connection 1 setup</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_3"> <layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="1">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Port:</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="3">
<widget class="QPushButton" name="connectButton">
<property name="text">
<string>Connect</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="0" colspan="3">
<widget class="QRadioButton" name="localRadioButton">
<property name="text">
<string>use local settings</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="3">
<widget class="QRadioButton" name="remoteRadioButton">
<property name="text">
<string>use remote settings</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>IP:</string>
</property>
</widget>
</item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLineEdit" name="ip_address"> <widget class="QLineEdit" name="ip_address">
<property name="sizePolicy"> <property name="sizePolicy">
@ -88,6 +47,12 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="minimumSize">
<size>
<width>130</width>
<height>0</height>
</size>
</property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>16777215</width> <width>16777215</width>
@ -102,6 +67,30 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Port:</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="3">
<widget class="QRadioButton" name="localRadioButton">
<property name="text">
<string>use local settings</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="3">
<widget class="QPushButton" name="connectButton">
<property name="text">
<string>Connect</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2"> <item row="1" column="1" colspan="2">
<widget class="QLineEdit" name="portField"> <widget class="QLineEdit" name="portField">
<property name="sizePolicy"> <property name="sizePolicy">
@ -121,23 +110,27 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="0"> <item row="0" column="0">
<spacer name="verticalSpacer"> <widget class="QLabel" name="label">
<property name="orientation"> <property name="text">
<enum>Qt::Vertical</enum> <string>IP:</string>
</property> </property>
<property name="sizeHint" stdset="0"> </widget>
<size> </item>
<width>20</width> <item row="3" column="0" colspan="3">
<height>40</height> <widget class="QRadioButton" name="remoteRadioButton">
</size> <property name="text">
<string>use remote settings</string>
</property> </property>
</spacer> <property name="checked">
<bool>true</bool>
</property>
</widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1" rowspan="2">
<widget class="QGroupBox" name="groupBox_2"> <widget class="QGroupBox" name="groupBox_2">
<property name="title"> <property name="title">
<string>Overview</string> <string>Overview</string>
@ -250,7 +243,7 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="1" column="0" colspan="2"> <item row="3" column="0" colspan="2">
<widget class="QTabWidget" name="tabWidget"> <widget class="QTabWidget" name="tabWidget">
<property name="currentIndex"> <property name="currentIndex">
<number>0</number> <number>0</number>
@ -281,6 +274,94 @@
</widget> </widget>
</widget> </widget>
</item> </item>
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox_3">
<property name="minimumSize">
<size>
<width>220</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>220</width>
<height>16777215</height>
</size>
</property>
<property name="title">
<string>Connection 2 setup</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>IP:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Port:</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QRadioButton" name="localRadioButton2">
<property name="text">
<string>use local settings</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QRadioButton" name="remoteRadioButton2">
<property name="text">
<string>use remote settings</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="portField2">
<property name="text">
<string>2000</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLineEdit" name="ip_address2">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>130</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>134.96.13.250</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QPushButton" name="connectButton2">
<property name="text">
<string>Connect</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QMenuBar" name="menubar"> <widget class="QMenuBar" name="menubar">
@ -289,7 +370,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>881</width> <width>881</width>
<height>22</height> <height>21</height>
</rect> </rect>
</property> </property>
</widget> </widget>

View File

@ -1 +1 @@
{"defaultIP": "134.96.13.250", "defaultPort": 2000, "ch0": {"name": "Encoder", "setpoint": 26.62, "kp": 12.0, "ki": 4.0, "kd": 0, "PIDenabled": 0, "channelEnabled": 1}, "ch1": {"name": "Decoder", "setpoint": 26.62, "kp": 12.0, "ki": 4.0, "kd": 0, "PIDenabled": 0, "channelEnabled": 1}, "ch2": {"name": "Channel 3", "setpoint": 34.05, "kp": 0.0, "ki": 0.0, "kd": 0.0, "PIDenabled": 0, "channelEnabled": 1}, "ch3": {"name": "Channel 4", "setpoint": 21.5, "kp": 0.0, "ki": 0.0, "kd": 0.0, "PIDenabled": 0, "channelEnabled": 1}} {"defaultIP": "134.96.13.250", "defaultPort": 2000, "defaultIP2": "134.96.13.250", "defaultPort2": 2000, "ch0": {"name": "Encoder", "setpoint": 26.62, "kp": 12.0, "ki": 4.0, "kd": 0, "PIDenabled": 0, "channelEnabled": 1, "peltier": 0, "zeroVolt": 1.29}, "ch1": {"name": "Decoder", "setpoint": 26.62, "kp": 12.0, "ki": 4.0, "kd": 0, "PIDenabled": 0, "channelEnabled": 1, "peltier": 0, "zeroVolt": 1.29}, "ch2": {"name": "Channel 3", "setpoint": 34.05, "kp": 0.0, "ki": 0.0, "kd": 0.0, "PIDenabled": 0, "channelEnabled": 1}, "ch3": {"name": "Channel 4", "setpoint": 21.5, "kp": 0.0, "ki": 0.0, "kd": 0.0, "PIDenabled": 0, "channelEnabled": 1}}