fix pyctbgui powerindex (#1433)
Build and Deploy on local RHEL9 / build (push) Successful in 2m4s
Build on RHEL9 docker image / build (push) Successful in 3m32s
Build on RHEL8 docker image / build (push) Successful in 4m50s
Build and Deploy on local RHEL8 / build (push) Successful in 4m50s
Run Simulator Tests on local RHEL9 / build (push) Successful in 14m43s
Run Simulator Tests on local RHEL8 / build (push) Successful in 17m6s

* fix pyctbgui powerindex

* detangled power enable and power dac values

* displaybox for vchip

---------

Co-authored-by: Martin Mueller <martin.mueller@psi.ch>
Co-authored-by: Dhanya Thattil <dhanya.thattil@psi.ch>
This commit is contained in:
Martin Mueller
2026-04-17 09:25:40 +02:00
committed by GitHub
parent 78edfe3b55
commit 326df1de97
3 changed files with 107 additions and 128 deletions
+86 -90
View File
@@ -4,7 +4,7 @@ from pathlib import Path
from PyQt5 import QtWidgets, uic
from pyctbgui.utils.defines import Defines
from slsdet import dacIndex, detectorType
from slsdet import powerIndex, detectorType
class PowerSuppliesTab(QtWidgets.QWidget):
@@ -16,120 +16,116 @@ class PowerSuppliesTab(QtWidgets.QWidget):
def refresh(self):
self.updateVoltageNames()
if self.det.type == detectorType.CHIPTESTBOARD:
self.getVChip()
for i in Defines.powerSupplies:
self.getVoltage(i)
if self.det.type == detectorType.CHIPTESTBOARD:
self.getCurrent(i)
self.update(i)
def update(self, i):
self.getPowerEnable(i)
self.getVoltage(i)
if self.det.type == detectorType.CHIPTESTBOARD:
self.getMeasuredVoltage(i)
self.getMeasuredCurrent(i)
def connect_ui(self):
for i in Defines.powerSupplies:
spinBox = getattr(self.view, f"spinBoxV{i}")
checkBox = getattr(self.view, f"checkBoxV{i}")
spinBox.editingFinished.connect(partial(self.setVoltage, i))
checkBox.stateChanged.connect(partial(self.setVoltage, i))
checkBox.stateChanged.connect(partial(self.setPowerEnable, i))
self.view.pushButtonPowerOff.clicked.connect(self.powerOff)
def setup_ui(self):
for i in Defines.powerSupplies:
dac = getattr(dacIndex, f"V_POWER_{i}")
spinBox = getattr(self.view, f"spinBoxV{i}")
checkBox = getattr(self.view, f"checkBoxV{i}")
retval = self.det.getPower(dac)[0]
spinBox.setValue(retval)
if retval == 0:
checkBox.setChecked(False)
spinBox.setDisabled(True)
if self.det.type == detectorType.XILINX_CHIPTESTBOARD:
label = getattr(self.view, f"labelI{i}")
label.setDisabled(True)
if self.det.type == detectorType.XILINX_CHIPTESTBOARD:
self.view.spinBoxVChip.setDisabled(True)
self.view.labelVChip.setDisabled(True)
for i in Defines.powerSupplies:
labelV = getattr(self.view, f"labelV{i}")
labelV.setDisabled(True)
labelI = getattr(self.view, f"labelI{i}")
labelI.setDisabled(True)
def updateVoltageNames(self):
retval = self.det.getPowerNames()
getattr(self.view, "checkBoxVA").setText(retval[0])
getattr(self.view, "checkBoxVB").setText(retval[1])
getattr(self.view, "checkBoxVC").setText(retval[2])
getattr(self.view, "checkBoxVD").setText(retval[3])
getattr(self.view, "checkBoxVIO").setText(retval[4])
for i in Defines.powerSupplies:
checkBox = getattr(self.view, f"checkBoxV{i}")
dac = getattr(powerIndex, f"V_POWER_{i}")
retval = self.det.getPowerName(dac)
checkBox.setText(retval)
def getVoltage(self, i):
spinBox = getattr(self.view, f"spinBoxV{i}")
checkBox = getattr(self.view, f"checkBoxV{i}")
voltageIndex = getattr(dacIndex, f"V_POWER_{i}")
def getMeasuredVoltage(self, i):
label = getattr(self.view, f"labelV{i}")
spinBox.editingFinished.disconnect()
checkBox.stateChanged.disconnect()
if self.det.type == detectorType.XILINX_CHIPTESTBOARD:
retval = self.det.getPower(voltageIndex)[0]
else:
retval = self.det.getMeasuredPower(voltageIndex)[0]
# spinBox.setValue(retval)
if retval > 1:
checkBox.setChecked(True)
if checkBox.isChecked():
spinBox.setEnabled(True)
else:
spinBox.setDisabled(True)
voltageIndex = getattr(powerIndex, f"V_POWER_{i}")
retval = self.det.getMeasuredPower(voltageIndex)
label.setText(f'{str(retval)} mV')
spinBox.editingFinished.connect(partial(self.setVoltage, i))
checkBox.stateChanged.connect(partial(self.setVoltage, i))
if self.det.type == detectorType.CHIPTESTBOARD:
self.getVChip()
# TODO: handle multiple events when pressing enter (twice)
def setVoltage(self, i):
checkBox = getattr(self.view, f"checkBoxV{i}")
spinBox = getattr(self.view, f"spinBoxV{i}")
voltageIndex = getattr(dacIndex, f"V_POWER_{i}")
spinBox.editingFinished.disconnect()
value = 0
if checkBox.isChecked():
value = spinBox.value()
try:
self.det.setPower(voltageIndex, value)
except Exception as e:
QtWidgets.QMessageBox.warning(self.mainWindow, "Voltage Fail", str(e), QtWidgets.QMessageBox.Ok)
pass
# TODO: (properly) disconnecting and connecting to handle multiple events (out of focus and pressing enter).
spinBox.editingFinished.connect(partial(self.setVoltage, i))
self.getVoltage(i)
if self.det.type == detectorType.CHIPTESTBOARD:
self.getCurrent(i)
def getCurrent(self, i):
def getMeasuredCurrent(self, i):
label = getattr(self.view, f"labelI{i}")
currentIndex = getattr(dacIndex, f"I_POWER_{i}")
retval = self.det.getMeasuredCurrent(currentIndex)[0]
currentIndex = getattr(powerIndex, f"I_POWER_{i}")
retval = self.det.getMeasuredCurrent(currentIndex)
label.setText(f'{str(retval)} mA')
def getVChip(self):
self.view.spinBoxVChip.setValue(self.det.getPower(dacIndex.V_POWER_CHIP)[0])
self.view.labelVChip.setText(f"{str(self.det.getPowerDAC(powerIndex.V_POWER_CHIP))} mV")
def getVoltage(self, i):
spinBox = getattr(self.view, f"spinBoxV{i}")
spinBox.editingFinished.disconnect()
voltageIndex = getattr(powerIndex, f"V_POWER_{i}")
spinBox.setValue(self.det.getPowerDAC(voltageIndex))
spinBox.editingFinished.connect(partial(self.setVoltage, i))
def setVoltage(self, i):
spinBox = getattr(self.view, f"spinBoxV{i}")
spinBox.editingFinished.disconnect()
voltageIndex = getattr(powerIndex, f"V_POWER_{i}")
try:
self.det.setPowerDAC(voltageIndex, spinBox.value())
except Exception as e:
QtWidgets.QMessageBox.warning(self.mainWindow, "Voltage Fail", str(e), QtWidgets.QMessageBox.Ok)
pass
spinBox.editingFinished.connect(partial(self.setVoltage, i))
self.update(i)
if self.det.type == detectorType.CHIPTESTBOARD:
self.getVChip()
def getPowerEnable(self, i):
checkBox = getattr(self.view, f"checkBoxV{i}")
checkBox.stateChanged.disconnect()
voltageIndex = getattr(powerIndex, f"V_POWER_{i}")
retval = self.det.isPowerEnabled(voltageIndex)
checkBox.setChecked(retval)
checkBox.stateChanged.connect(partial(self.setPowerEnable, i))
def setPowerEnable(self, i):
checkBox = getattr(self.view, f"checkBoxV{i}")
checkBox.stateChanged.disconnect()
voltageIndex = getattr(powerIndex, f"V_POWER_{i}")
try:
self.det.setPowerEnabled([voltageIndex], checkBox.isChecked())
except Exception as e:
QtWidgets.QMessageBox.warning(self.mainWindow, "Voltage Fail", str(e), QtWidgets.QMessageBox.Ok)
pass
checkBox.stateChanged.connect(partial(self.setPowerEnable, i))
self.update(i)
if self.det.type == detectorType.CHIPTESTBOARD:
self.getVChip()
def powerOff(self):
for i in Defines.powerSupplies:
# set all voltages to 0
checkBox = getattr(self.view, f"checkBoxV{i}")
checkBox.stateChanged.disconnect()
checkBox.setChecked(False)
checkBox.stateChanged.connect(partial(self.setVoltage, i))
self.setVoltage(i)
voltageIndices = [getattr(powerIndex, f"V_POWER_{i}") for i in Defines.powerSupplies]
try:
self.det.setPowerEnabled(voltageIndices, False)
except Exception as e:
QtWidgets.QMessageBox.warning(self.mainWindow, "Power Off Fail", str(e), QtWidgets.QMessageBox.Ok)
pass
finally:
self.refresh()
def saveParameters(self) -> list:
commands = []
for i in Defines.powerSupplies:
enabled = getattr(self.view, f"checkBoxV{i}").isChecked()
if enabled:
value = getattr(self.view, f"spinBoxV{i}").value()
commands.append(f"v_{i.lower()} {value}")
else:
commands.append(f"v_{i.lower()} 0")
commands.append(f"power v_{i.lower()} {enabled}")
value = getattr(self.view, f"spinBoxV{i}").value()
commands.append(f"powerdac v_{i.lower()} {value}")
return commands
+15 -33
View File
@@ -53,7 +53,7 @@
<string> mV</string>
</property>
<property name="maximum">
<number>2468</number>
<number>5000</number>
</property>
</widget>
</item>
@@ -100,7 +100,7 @@
<number>0</number>
</property>
<property name="maximum">
<number>2468</number>
<number>5000</number>
</property>
<property name="value">
<number>0</number>
@@ -212,35 +212,7 @@ QPushButton:disabled{background-color: grey;}</string>
<string> mV</string>
</property>
<property name="maximum">
<number>2468</number>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QSpinBox" name="spinBoxVChip">
<property name="minimumSize">
<size>
<width>0</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>150</width>
<height>32</height>
</size>
</property>
<property name="toolTip">
<string>Only accepts value range (1200 - 2468)</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="suffix">
<string> mV</string>
</property>
<property name="maximum">
<number>2468</number>
<number>5000</number>
</property>
</widget>
</item>
@@ -372,7 +344,7 @@ QPushButton:disabled{background-color: grey;}</string>
<string> mV</string>
</property>
<property name="maximum">
<number>2468</number>
<number>5000</number>
</property>
</widget>
</item>
@@ -455,7 +427,7 @@ QPushButton:disabled{background-color: grey;}</string>
<string> mV</string>
</property>
<property name="maximum">
<number>2468</number>
<number>5000</number>
</property>
</widget>
</item>
@@ -475,6 +447,16 @@ QPushButton:disabled{background-color: grey;}</string>
</property>
</spacer>
</item>
<item row="5" column="1">
<widget class="QLabel" name="labelVChip">
<property name="text">
<string>0 mV</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
+6 -5
View File
@@ -10,6 +10,7 @@ runStatus = slsDetectorDefs.runStatus
timingMode = slsDetectorDefs.timingMode
speedLevel = slsDetectorDefs.speedLevel
dacIndex = slsDetectorDefs.dacIndex
powerIndex = slsDetectorDefs.powerIndex
detectorType = slsDetectorDefs.detectorType
streamingInterface = slsDetectorDefs.streamingInterface
@@ -4107,7 +4108,7 @@ class Detector(CppDetectorApi):
:setter: Not implemented
"""
return self.getMeasuredCurrent(dacIndex.I_POWER_A)
return self.getMeasuredCurrent(powerIndex.I_POWER_A)
@property
@element
@@ -4116,7 +4117,7 @@ class Detector(CppDetectorApi):
:setter: Not implemented
"""
return self.getMeasuredCurrent(dacIndex.I_POWER_B)
return self.getMeasuredCurrent(powerIndex.I_POWER_B)
@property
@element
@@ -4125,7 +4126,7 @@ class Detector(CppDetectorApi):
:setter: Not implemented
"""
return self.getMeasuredCurrent(dacIndex.I_POWER_C)
return self.getMeasuredCurrent(powerIndex.I_POWER_C)
@property
@element
@@ -4134,7 +4135,7 @@ class Detector(CppDetectorApi):
:setter: Not implemented
"""
return self.getMeasuredCurrent(dacIndex.I_POWER_D)
return self.getMeasuredCurrent(powerIndex.I_POWER_D)
@property
@element
@@ -4143,7 +4144,7 @@ class Detector(CppDetectorApi):
:setter: Not implemented
"""
return self.getMeasuredCurrent(dacIndex.I_POWER_IO)
return self.getMeasuredCurrent(powerIndex.I_POWER_IO)
@property
def clkphase(self):