diff --git a/HVGUI.py b/HVGUI.py index ff7124c..e8a6037 100755 --- a/HVGUI.py +++ b/HVGUI.py @@ -2,8 +2,200 @@ 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()) \ No newline at end of file diff --git a/HVLibrary.py b/HVLibrary.py index 6c7a7c4..3663829 100755 --- a/HVLibrary.py +++ b/HVLibrary.py @@ -29,9 +29,9 @@ def get_value(pv_name : str, show : bool = False): return value -def set_value(pv_name : str, value): +def set_value(pv_name : str, value) -> None: pv = epics.PV(hostName + ":" + pv_name, connection_timeout=0.1) - return pv.put(value) + pv.put(value) #======= general @@ -88,7 +88,7 @@ class Channel: def GetStatus(self) -> str: return get_value(self.bdCh + "Status") - def GetPowerOnOff(self) -> str: + def GetPowerOnOff(self) -> int: return get_value(self.bdCh + "Pw") def GetPowerOnOption(self) -> str: @@ -122,14 +122,14 @@ class Channel: def SetMaxVoltage(self, volt: float): set_value(self.bdCh + "SVMax", volt) - def GetPowerOnOff(self, onOff : bool): # off = 0, on = 1 - return get_value(self.bdCh + "Pw", onOff) + def SetPowerOnOff(self, onOff): # off = 0, on = 1 + set_value(self.bdCh + "Pw", onOff) - def GetPowerOnOption(self, disEn : bool): #disable = 0, enable = 1, if enable, restart will restore in same condition - return get_value(self.bdCh + "POn", disEn) + def SetPowerOnOption(self, disEn : bool): #disable = 0, enable = 1, if enable, restart will restore in same condition + set_value(self.bdCh + "POn", disEn) - def GetPowerDownOptionWhenTrip(self, killRamp) : # kill = 0, Ramp = 1 - return get_value(self.bdCh + "PDwn", killRamp) + def SetPowerDownOptionWhenTrip(self, killRamp) : # kill = 0, Ramp = 1 + set_value(self.bdCh + "PDwn", killRamp) #################################################### @@ -158,3 +158,9 @@ class Board: def GetTemp(self) -> float: return get_value(self.id + ":" + 'Temp') + + def GetPV(self, PV_Name : str): + pvList = [] + for i in range(48): + pvList.append('solarisHV:' + self.id + ":" + f"{i:03d}" + ":" + PV_Name) + return epics.caget_many(pvList) diff --git a/test.py b/test.py index 18ce8dc..c2fc236 100755 --- a/test.py +++ b/test.py @@ -2,17 +2,74 @@ import HVLibrary as hv -#set_value('03:000:' + Ch_PV_List[1], 5) -#hv.get_value('03:000:' + hv.Ch_PV_List[1]) -#hv.get_value('03:000:' + hv.Ch_PV_List[0]) +# hv.get_value('03:000:' + hv.Ch_PV_List[1]) +# hv.get_value('03:000:' + hv.Ch_PV_List[0]) # index = 14 # hv.get_value('03:000:' + hv.Ch_PV_List[index], True) # cf = hv.get_CtrlField('03:000:' + hv.Ch_PV_List[index]) # print(cf) -bd = hv.Board(3) +# bd = [] -print( bd.GetTemp()) +# for k in range(2): +# bd.append(hv.Board(3 + k)) -print( bd.Channel[0].GetName() ) \ No newline at end of file +# print( bd[0].GetTemp()) +# print( bd[0].Channel[15].GetName() ) + +# bd[0].Channel[15].SetPowerOnOff(1) + +# print(bd[0].Channel[15].GetPowerOnOff()) + +# print(bd[0].Channel[15].GetVMon()) + +# print(bd[0].Channel[15].GetPowerOnOff()) +# for k in range(2): +# print("==========================") +# for i in range(bd[k].numCh): +# print("{:.2f}".format(bd[k].Channel[i].GetVMon())) + + +# hv.set_value('03:015:Pw', 1) + +# haha = hv.get_value('03:015:Status') +# print(haha) + +# haha = hv.get_value('03:015:Pw') +# print(haha) + +# haha = hv.get_value('03:015:V0Set') +# print(haha) + +# haha = hv.get_value('03:015:VMon') +# print(haha) + + +# haha = hv.get_value('03:BdStatus') +# print(haha) + +# hv.epics.caput('solarisHV:03:015:Pw', 1) + +# hv.epics.cainfo('solarisHV:03:015:Pw') + + +# m1 = hv.epics.caget('solarisHV:03:015:Pw', use_monitor= False) +# print(m1) + +# m1 = hv.epics.caget('solarisHV:03:015:VMon') +# print(m1) + + +# m1 = hv.epics.caget('solarisHV:03:015:Pw') +# print(m1) + +# hv.epics.camonitor('solarisHV:03:015:Pw') + +pvList = [] +for i in range(48): + pvList.append('solarisHV:03:' + f"{i:03d}" + ":VMon") + +haha = hv.epics.caget_many(pvList) + +print(haha) \ No newline at end of file