#!/usr/bin/python3 import HVLibrary as hv import sys from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QCheckBox, QLineEdit, QLabel, QVBoxLayout, QWidget, QTabWidget, QGridLayout, QMessageBox, QFileDialog, QProgressBar from PyQt6.QtCore import Qt, QThread, QTimer, QObject, pyqtSignal from functools import partial ColStrList = ["Name", "Ch", 'On/Off', "Set V [V]", "Set I [uA]", "Out V [V]", "Out I [uA]"] nMod = 2 nChPerMod = [48, 48] updateTime = 3 #sec bd = [] for k in range(nMod): bd.append(hv.Board(3 + k)) V0SetList = [] I0SetList = [] OnOffList = [] outVList = [] outIList = [] for k in range(nMod): V0SetList.append(bd[k].GetPV('V0Set')) I0SetList.append(bd[k].GetPV('I0Set')) OnOffList.append(bd[k].GetPV('Pw')) outVList.append(bd[k].GetPV('VMon')) outIList.append(bd[k].GetPV('IMon')) class MyWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Iseg Controller") self.setGeometry(100, 100, 500, 200) widget = QWidget() layout = QVBoxLayout() widget.setLayout(layout) self.setCentralWidget(widget) self.txtName = [[QLineEdit() for _ in range(rows)] for rows in nChPerMod] self.txtV = [[QLineEdit() for _ in range(rows)] for rows in nChPerMod] self.txtI = [[QLineEdit() for _ in range(rows)] for rows in nChPerMod] self.txtVOut = [[QLineEdit() for _ in range(rows)] for rows in nChPerMod] self.txtIOut = [[QLineEdit() for _ in range(rows)] for rows in nChPerMod] self.chkON = [[QCheckBox() for _ in range(rows)] for rows in nChPerMod] self.timer = QTimer(self) self.timer.timeout.connect(self.updateTimer) self.timer.start(updateTime*1000) self.time = 0 #=========== set tab self.tabWidget = QTabWidget(self) layout.addWidget(self.tabWidget) for k in range(0, nMod): tab = QWidget(self) layout_tab = QGridLayout() layout_tab.setAlignment(Qt.AlignmentFlag.AlignTop) tab.setLayout(layout_tab) for index, lb in enumerate(ColStrList): qlb = QLabel(lb, tab) layout_tab.addWidget(qlb, 0, index) for i in range(nChPerMod[k]) : for j, lb in enumerate(ColStrList) : #------------ name if j == 0: layout_tab.addWidget(self.txtName[k][i], 1+i, j) #------------ Ch if j == 1: qlb = QLabel(str(i), tab) layout_tab.addWidget(qlb, 1+i, j, alignment=Qt.AlignmentFlag.AlignCenter) #------------ On/Off if j == 2: self.chkON[k][i].setChecked( OnOffList[k][i] == 1) layout_tab.addWidget(self.chkON[k][i], 1+i, j, alignment=Qt.AlignmentFlag.AlignCenter) self.chkON[k][i].clicked.connect(partial(self.SetOnOff, k, i)) # #------------ V set if j == 3: self.txtV[k][i].setText(str(V0SetList[k][i])) self.txtV[k][i].setAlignment(Qt.AlignmentFlag.AlignRight) layout_tab.addWidget(self.txtV[k][i], 1+i, j) self.txtV[k][i].returnPressed.connect(partial(self.SetHV, k, i) ) self.txtV[k][i].returnPressed.connect(partial(self.UnSetTextColor, self.txtV[k][i])) self.txtV[k][i].textChanged.connect(partial(self.TextChange, self.txtV[k][i])) # #------------ I set if j == 4: self.txtI[k][i].setText(str(I0SetList[k][i])) self.txtI[k][i].setAlignment(Qt.AlignmentFlag.AlignRight) layout_tab.addWidget(self.txtI[k][i], 1+i, j) self.txtI[k][i].returnPressed.connect(partial(self.SetI, k, i) ) self.txtI[k][i].returnPressed.connect(partial(self.UnSetTextColor, self.txtI[k][i])) self.txtI[k][i].textChanged.connect(partial(self.TextChange, self.txtI[k][i])) # #------------ V out if j == 5: self.txtVOut[k][i].setText("{:.2f}".format(outVList[k][i])) self.txtVOut[k][i].setAlignment(Qt.AlignmentFlag.AlignRight) layout_tab.addWidget(self.txtVOut[k][i], 1+i, j) self.txtVOut[k][i].setReadOnly(True) self.txtVOut[k][i].setStyleSheet("background-color: lightgrey; color: black;") # #------------ I out if j == 6: self.txtIOut[k][i].setText("{:.2f}".format(outIList[k][i])) self.txtIOut[k][i].setAlignment(Qt.AlignmentFlag.AlignRight) layout_tab.addWidget(self.txtIOut[k][i], 1+i, j) self.txtIOut[k][i].setReadOnly(True) self.txtIOut[k][i].setStyleSheet("background-color: lightgrey; color: black;") self.tabWidget.addTab(tab, "Mod-" + str(k)) #================================= def UnSetTextColor(self, qLineEdit : QLineEdit): qLineEdit.setStyleSheet("") def TextChange(self, qLineEdit : QLineEdit): qLineEdit.setStyleSheet("color : darkgreen;") #--------------------------------- def SetOnOff(self, mod, ch): state = self.chkON[mod][ch].checkState() if state == Qt.CheckState.Checked: bd[mod].Channel[ch].SetPowerOnOff(1) else: bd[mod].Channel[ch].SetPowerOnOff(0) value = bd[mod].Channel[ch].GetPowerOnOff() OnOffList[mod][ch] = value print("mod : " + str(mod) + ", ch : " + str(ch) + " | " + str(state) + " | " + str(value)) self.chkON[mod][ch].setChecked(value == 1) #--------------------------------- def SetHV(self, mod, ch): value = float(self.txtV[mod][ch].text()) print("mod : " + str(mod) + ", ch : " + str(ch) + " | " + str(value)) bd[mod].Channel[ch].SetV0Set(value) newValue = bd[mod].Channel[ch].GetV0Set() V0SetList[mod][ch] = newValue self.txtV[mod][ch].setText("{:.1f}".format(newValue)) #--------------------------------- def SetI(self, mod, ch): value = float(self.txtI[mod][ch].text()) print("mod : " + str(mod) + ", ch : " + str(ch) + " | " + str(value)) bd[mod].Channel[ch].SetI0Set(value) newValue = bd[mod].Channel[ch].GetI0Set() I0SetList[mod][ch] = newValue self.txtI[mod][ch].setText("{:.1f}".format(newValue)) #--------------------------------- def updateTimer(self): self.time += 1 print(f'Time: {self.time}') # outVList = mpod.GetAllOutputHV() # outIList = mpod.GetAllLC() # # print(outVList) for k in range(2): outVList.append(bd[k].GetPV('VMon')) outIList.append(bd[k].GetPV('IMon')) # if self.chkDB.checkState() == Qt.CheckState.Checked: # points = [] for k in range(0, nMod): for i in range(bd[k].numCh) : self.txtVOut[k][i].setText("{:.2f}".format(outVList[k][i])) self.txtIOut[k][i].setText("{:.2f}".format(outIList[k][i])) # if self.chkDB.checkState() == Qt.CheckState.Checked: # points.append(Point("Voltage").tag("Ch",int(chList[i] + 100 * k)).field("value",float(outVList[i]))) # points.append(Point("LeakageCurrent").tag("Ch",int(chList[i] + 100 * k)).field("value",float(outIList[i]))) # if self.chkDB.checkState() == Qt.CheckState.Checked: # write_api.write(bucket=bucket, org=org, record=points) if __name__ == "__main__": app = QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec())