diff --git a/pyctbgui/pyctbgui/services/ADC.py b/pyctbgui/pyctbgui/services/ADC.py index f470fc917..d9fabaccd 100644 --- a/pyctbgui/pyctbgui/services/ADC.py +++ b/pyctbgui/pyctbgui/services/ADC.py @@ -14,6 +14,8 @@ from pyctbgui.utils.defines import Defines import pyctbgui.utils.pixelmap as pm from pyctbgui.utils.recordOrApplyPedestal import recordOrApplyPedestal +from slsdet import detectorType + if typing.TYPE_CHECKING: from pyctbgui.services import AcquisitionTab, PlotTab @@ -30,6 +32,7 @@ class AdcTab(QtWidgets.QWidget): self.acquisitionTab: AcquisitionTab | None = None self.legend: LegendItem | None = None self.logger = logging.getLogger('AdcTab') + self.tengiga = True def setup_ui(self): self.plotTab = self.mainWindow.plotTab @@ -42,6 +45,12 @@ class AdcTab(QtWidgets.QWidget): self.legend.clear() # subscribe to toggle legend self.plotTab.subscribeToggleLegend(self.updateLegend) + + if self.det.type == detectorType.XILINX_CHIPTESTBOARD: + self.view.checkBoxADC0_15Inv.setDisabled(True) + self.view.checkBoxADC16_31Inv.setDisabled(True) + self.view.lineEditADCInversion.setDisabled(True) + self.view.labelADCInversion.setDisabled(True) def initializeAllAnalogPlots(self): self.mainWindow.plotAnalogWaveform = pg.plot() @@ -67,7 +76,8 @@ class AdcTab(QtWidgets.QWidget): def connect_ui(self): for i in range(Defines.adc.count): - getattr(self.view, f"checkBoxADC{i}Inv").stateChanged.connect(partial(self.setADCInv, i)) + if self.det.type == detectorType.CHIPTESTBOARD: + getattr(self.view, f"checkBoxADC{i}Inv").stateChanged.connect(partial(self.setADCInv, i)) getattr(self.view, f"checkBoxADC{i}En").stateChanged.connect(partial(self.setADCEnable, i)) getattr(self.view, f"checkBoxADC{i}Plot").stateChanged.connect(partial(self.setADCEnablePlot, i)) getattr(self.view, f"pushButtonADC{i}").clicked.connect(partial(self.selectADCColor, i)) @@ -77,15 +87,17 @@ class AdcTab(QtWidgets.QWidget): self.view.checkBoxADC0_15Plot.stateChanged.connect(partial(self.setADCEnablePlotRange, 0, Defines.adc.half)) self.view.checkBoxADC16_31Plot.stateChanged.connect( partial(self.setADCEnablePlotRange, Defines.adc.half, Defines.adc.count)) - self.view.checkBoxADC0_15Inv.stateChanged.connect(partial(self.setADCInvRange, 0, Defines.adc.half)) - self.view.checkBoxADC16_31Inv.stateChanged.connect( - partial(self.setADCInvRange, Defines.adc.half, Defines.adc.count)) - self.view.lineEditADCInversion.editingFinished.connect(self.setADCInvReg) self.view.lineEditADCEnable.editingFinished.connect(self.setADCEnableReg) + if self.det.type == detectorType.CHIPTESTBOARD: + self.view.checkBoxADC0_15Inv.stateChanged.connect(partial(self.setADCInvRange, 0, Defines.adc.half)) + self.view.checkBoxADC16_31Inv.stateChanged.connect( + partial(self.setADCInvRange, Defines.adc.half, Defines.adc.count)) + self.view.lineEditADCInversion.editingFinished.connect(self.setADCInvReg) def refresh(self): self.updateADCNames() - self.updateADCInv() + if self.det.type == detectorType.CHIPTESTBOARD: + self.updateADCInv() self.updateADCEnable() # ADCs Tab functions @@ -196,9 +208,11 @@ class AdcTab(QtWidgets.QWidget): return decoder.decode(analog_array, pm.moench04_analog()) def getADCEnableReg(self): - retval = self.det.adcenable - if self.det.tengiga: - retval = self.det.adcenable10g + if self.det.type == detectorType.CHIPTESTBOARD: + self.tengiga = self.det.tengiga + retval = self.det.adcenable10g + if not self.tengiga: + retval = self.det.adcenable self.view.lineEditADCEnable.editingFinished.disconnect() self.view.lineEditADCEnable.setText("0x{:08x}".format(retval)) self.view.lineEditADCEnable.editingFinished.connect(self.setADCEnableReg) @@ -207,8 +221,8 @@ class AdcTab(QtWidgets.QWidget): def setADCEnableReg(self): self.view.lineEditADCEnable.editingFinished.disconnect() try: - mask = int(self.mainWindow.lineEditADCEnable.text(), 16) - if self.det.tengiga: + mask = int(self.view.lineEditADCEnable.text(), 16) + if self.tengiga: self.det.adcenable10g = mask else: self.det.adcenable = mask @@ -239,7 +253,7 @@ class AdcTab(QtWidgets.QWidget): def setADCEnable(self, i): checkBox = getattr(self.view, f"checkBoxADC{i}En") try: - if self.det.tengiga: + if self.tengiga: enableMask = manipulate_bit(checkBox.isChecked(), self.det.adcenable10g, i) self.det.adcenable10g = enableMask else: @@ -265,7 +279,7 @@ class AdcTab(QtWidgets.QWidget): for i in range(start_nr, end_nr): mask = manipulate_bit(checkBox.isChecked(), mask, i) try: - if self.det.tengiga: + if self.tengiga: self.det.adcenable10g = mask else: self.det.adcenable = mask @@ -344,7 +358,7 @@ class AdcTab(QtWidgets.QWidget): def setADCInvReg(self): self.view.lineEditADCInversion.editingFinished.disconnect() try: - self.det.adcinvert = int(self.mainWindow.lineEditADCInversion.text(), 16) + self.det.adcinvert = int(self.view.lineEditADCInversion.text(), 16) except Exception as e: QtWidgets.QMessageBox.warning(self.mainWindow, "ADC Inversion Fail", str(e), QtWidgets.QMessageBox.Ok) pass @@ -395,7 +409,12 @@ class AdcTab(QtWidgets.QWidget): self.updateADCInv() def saveParameters(self) -> list[str]: - return [ - f"adcenable {self.view.lineEditADCEnable.text()}", - f"adcinvert {self.view.lineEditADCInversion.text()}", - ] + if self.det.type == detectorType.CHIPTESTBOARD: + return [ + f"adcenable {self.view.lineEditADCEnable.text()}", + f"adcinvert {self.view.lineEditADCInversion.text()}", + ] + else: + return [ + f"adcenable {self.view.lineEditADCEnable.text()}" + ] diff --git a/pyctbgui/pyctbgui/services/Acquisition.py b/pyctbgui/pyctbgui/services/Acquisition.py index d87cad767..e931a1835 100644 --- a/pyctbgui/pyctbgui/services/Acquisition.py +++ b/pyctbgui/pyctbgui/services/Acquisition.py @@ -7,7 +7,7 @@ import zmq from PyQt5 import QtWidgets, uic import logging -from slsdet import readoutMode, runStatus +from slsdet import readoutMode, runStatus, detectorType from pyctbgui.utils.defines import Defines from pyctbgui.utils.numpyWriter.npy_writer import NumpyFileManager from pyctbgui.utils.numpyWriter.npz_writer import NpzFileWriter @@ -49,20 +49,37 @@ class AcquisitionTab(QtWidgets.QWidget): self.adcTab = self.mainWindow.adcTab self.plotTab = self.mainWindow.plotTab self.toggleStartButton(False) + if self.det.type == detectorType.XILINX_CHIPTESTBOARD: + self.view.labelRunF.setDisabled(True) + self.view.labelADCF.setDisabled(True) + self.view.labelADCPhase.setDisabled(True) + self.view.labelADCPipeline.setDisabled(True) + self.view.labelDBITF.setDisabled(True) + self.view.labelDBITPhase.setDisabled(True) + self.view.labelDBITPipeline.setDisabled(True) + self.view.spinBoxRunF.setDisabled(True) + self.view.spinBoxADCF.setDisabled(True) + self.view.spinBoxADCPhase.setDisabled(True) + self.view.spinBoxADCPipeline.setDisabled(True) + self.view.spinBoxDBITF.setDisabled(True) + self.view.spinBoxDBITPhase.setDisabled(True) + self.view.spinBoxDBITPipeline.setDisabled(True) def connect_ui(self): # For Acquistions Tab self.view.comboBoxROMode.currentIndexChanged.connect(self.setReadOut) - self.view.spinBoxRunF.editingFinished.connect(self.setRunFrequency) self.view.spinBoxTransceiver.editingFinished.connect(self.setTransceiver) self.view.spinBoxAnalog.editingFinished.connect(self.setAnalog) self.view.spinBoxDigital.editingFinished.connect(self.setDigital) - self.view.spinBoxADCF.editingFinished.connect(self.setADCFrequency) - self.view.spinBoxADCPhase.editingFinished.connect(self.setADCPhase) - self.view.spinBoxADCPipeline.editingFinished.connect(self.setADCPipeline) - self.view.spinBoxDBITF.editingFinished.connect(self.setDBITFrequency) - self.view.spinBoxDBITPhase.editingFinished.connect(self.setDBITPhase) - self.view.spinBoxDBITPipeline.editingFinished.connect(self.setDBITPipeline) + + if self.det.type == detectorType.CHIPTESTBOARD: + self.view.spinBoxRunF.editingFinished.connect(self.setRunFrequency) + self.view.spinBoxADCF.editingFinished.connect(self.setADCFrequency) + self.view.spinBoxADCPhase.editingFinished.connect(self.setADCPhase) + self.view.spinBoxADCPipeline.editingFinished.connect(self.setADCPipeline) + self.view.spinBoxDBITF.editingFinished.connect(self.setDBITFrequency) + self.view.spinBoxDBITPhase.editingFinished.connect(self.setDBITPhase) + self.view.spinBoxDBITPipeline.editingFinished.connect(self.setDBITPipeline) self.view.checkBoxFileWriteRaw.stateChanged.connect(self.setFileWrite) self.view.checkBoxFileWriteNumpy.stateChanged.connect(self.setFileWriteNumpy) @@ -77,16 +94,19 @@ class AcquisitionTab(QtWidgets.QWidget): def refresh(self): self.getReadout() - self.getRunFrequency() self.getTransceiver() self.getAnalog() self.getDigital() - self.getADCFrequency() - self.getADCPhase() - self.getADCPipeline() - self.getDBITFrequency() - self.getDBITPhase() - self.getDBITPipeline() + + if self.det.type == detectorType.CHIPTESTBOARD: + self.getRunFrequency() + self.getADCFrequency() + self.getADCPhase() + self.getADCPipeline() + self.getDBITFrequency() + self.getDBITPhase() + self.getDBITPipeline() + self.getFileWrite() self.getFileName() self.getFilePath() @@ -697,23 +717,39 @@ class AcquisitionTab(QtWidgets.QWidget): self.socket.subscribe("") def saveParameters(self) -> list[str]: - return [ - f'romode {self.view.comboBoxROMode.currentText().lower()}', - f'runclk {self.view.spinBoxRunF.value()}', - f'adcclk {self.view.spinBoxADCF.value()}', - f'adcphase {self.view.spinBoxADCPhase.value()}', - f'adcpipeline {self.view.spinBoxADCPipeline.value()}', - f'dbitclk {self.view.spinBoxDBITF.value()}', - f'dbitphase {self.view.spinBoxDBITPhase.value()}', - f'dbitpipeline {self.view.spinBoxDBITPipeline.value()}', - f'fwrite {int(self.view.checkBoxFileWriteRaw.isChecked())}', - f'fname {self.view.lineEditFileName.text()}', - f'fpath {self.view.lineEditFilePath.text()}', - f'findex {self.view.spinBoxAcquisitionIndex.value()}', - f'frames {self.view.spinBoxFrames.value()}', - f'triggers {self.view.spinBoxTriggers.value()}', - f'period {self.view.spinBoxPeriod.value()} {self.view.comboBoxPeriod.currentText().lower()}', - f'asamples {self.view.spinBoxAnalog.value()}', - f'dsamples {self.view.spinBoxDigital.value()}', - f'tsamples {self.view.spinBoxTransceiver.value()}', - ] + if self.det.type == detectorType.CHIPTESTBOARD: + return [ + f'romode {self.view.comboBoxROMode.currentText().lower()}', + f'runclk {self.view.spinBoxRunF.value()}', + f'adcclk {self.view.spinBoxADCF.value()}', + f'adcphase {self.view.spinBoxADCPhase.value()}', + f'adcpipeline {self.view.spinBoxADCPipeline.value()}', + f'dbitclk {self.view.spinBoxDBITF.value()}', + f'dbitphase {self.view.spinBoxDBITPhase.value()}', + f'dbitpipeline {self.view.spinBoxDBITPipeline.value()}', + f'fwrite {int(self.view.checkBoxFileWriteRaw.isChecked())}', + f'fname {self.view.lineEditFileName.text()}', + f'fpath {self.view.lineEditFilePath.text()}', + f'findex {self.view.spinBoxAcquisitionIndex.value()}', + f'frames {self.view.spinBoxFrames.value()}', + f'triggers {self.view.spinBoxTriggers.value()}', + f'period {self.view.spinBoxPeriod.value()} {self.view.comboBoxPeriod.currentText().lower()}', + f'asamples {self.view.spinBoxAnalog.value()}', + f'dsamples {self.view.spinBoxDigital.value()}', + f'tsamples {self.view.spinBoxTransceiver.value()}', + ] + else: + return [ + f'romode {self.view.comboBoxROMode.currentText().lower()}', + f'fwrite {int(self.view.checkBoxFileWriteRaw.isChecked())}', + f'fname {self.view.lineEditFileName.text()}', + f'fpath {self.view.lineEditFilePath.text()}', + f'findex {self.view.spinBoxAcquisitionIndex.value()}', + f'frames {self.view.spinBoxFrames.value()}', + f'triggers {self.view.spinBoxTriggers.value()}', + f'period {self.view.spinBoxPeriod.value()} {self.view.comboBoxPeriod.currentText().lower()}', + f'asamples {self.view.spinBoxAnalog.value()}', + f'dsamples {self.view.spinBoxDigital.value()}', + f'tsamples {self.view.spinBoxTransceiver.value()}', + ] + diff --git a/pyctbgui/pyctbgui/services/DACs.py b/pyctbgui/pyctbgui/services/DACs.py index 1bd7ab721..c626a8613 100644 --- a/pyctbgui/pyctbgui/services/DACs.py +++ b/pyctbgui/pyctbgui/services/DACs.py @@ -4,7 +4,7 @@ from pathlib import Path from PyQt5 import QtWidgets, uic from pyctbgui.utils.defines import Defines -from slsdet import dacIndex +from slsdet import dacIndex, detectorType class DacTab(QtWidgets.QWidget): @@ -19,7 +19,14 @@ class DacTab(QtWidgets.QWidget): dac = getattr(dacIndex, f"DAC_{i}") getattr(self.view, f"spinBoxDAC{i}").setValue(self.det.getDAC(dac)[0]) - if self.det.highvoltage == 0: + if self.det.type == detectorType.XILINX_CHIPTESTBOARD: + self.view.checkBoxHighVoltage.setDisabled(True) + self.view.spinBoxHighVoltage.setDisabled(True) + self.view.labelHighVoltage.setDisabled(True) + self.view.labelADCVppDacName.setDisabled(True) + self.view.labelADCVpp.setDisabled(True) + self.view.comboBoxADCVpp.setDisabled(True) + elif self.det.highvoltage == 0: self.view.spinBoxHighVoltage.setDisabled(True) self.view.checkBoxHighVoltage.setChecked(False) @@ -30,9 +37,11 @@ class DacTab(QtWidgets.QWidget): getattr(self.view, f"checkBoxDAC{i}").stateChanged.connect(partial(self.setDACTristate, i)) getattr(self.view, f"checkBoxDAC{i}mV").stateChanged.connect(partial(self.getDAC, i)) - self.view.comboBoxADCVpp.currentIndexChanged.connect(self.setADCVpp) - self.view.spinBoxHighVoltage.editingFinished.connect(self.setHighVoltage) - self.view.checkBoxHighVoltage.stateChanged.connect(self.setHighVoltage) + if self.view.comboBoxADCVpp.isEnabled(): + self.view.comboBoxADCVpp.currentIndexChanged.connect(self.setADCVpp) + if self.view.checkBoxHighVoltage.isEnabled(): + self.view.spinBoxHighVoltage.editingFinished.connect(self.setHighVoltage) + self.view.checkBoxHighVoltage.stateChanged.connect(self.setHighVoltage) def refresh(self): self.updateDACNames() @@ -40,8 +49,10 @@ class DacTab(QtWidgets.QWidget): self.getDACTristate(i) self.getDAC(i) - self.getADCVpp() - self.getHighVoltage() + if self.view.comboBoxADCVpp.isEnabled(): + self.getADCVpp() + if self.view.checkBoxHighVoltage.isEnabled(): + self.getHighVoltage() def updateDACNames(self): for i, name in enumerate(self.det.getDacNames()): @@ -165,6 +176,8 @@ class DacTab(QtWidgets.QWidget): unit = " mV" if inMV else "" commands.append(f"dac {i} {value}{unit}") - commands.append(f"adcvpp {self.view.comboBoxADCVpp.currentText()} mV") - commands.append(f"highvoltage {self.view.spinBoxHighVoltage.value()}") + if self.view.comboBoxADCVpp.isEnabled(): + commands.append(f"adcvpp {self.view.comboBoxADCVpp.currentText()} mV") + if self.view.checkBoxHighVoltage.isEnabled(): + commands.append(f"highvoltage {self.view.spinBoxHighVoltage.value()}") return commands diff --git a/pyctbgui/pyctbgui/services/PowerSupplies.py b/pyctbgui/pyctbgui/services/PowerSupplies.py index ec8d2f5dd..e5b402101 100644 --- a/pyctbgui/pyctbgui/services/PowerSupplies.py +++ b/pyctbgui/pyctbgui/services/PowerSupplies.py @@ -4,7 +4,7 @@ from pathlib import Path from PyQt5 import QtWidgets, uic from pyctbgui.utils.defines import Defines -from slsdet import dacIndex +from slsdet import dacIndex, detectorType class PowerSuppliesTab(QtWidgets.QWidget): @@ -18,7 +18,8 @@ class PowerSuppliesTab(QtWidgets.QWidget): self.updateVoltageNames() for i in Defines.powerSupplies: self.getVoltage(i) - self.getCurrent(i) + if self.det.type == detectorType.CHIPTESTBOARD: + self.getCurrent(i) def connect_ui(self): for i in Defines.powerSupplies: @@ -38,6 +39,12 @@ class PowerSuppliesTab(QtWidgets.QWidget): 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) + def updateVoltageNames(self): retval = self.det.getPowerNames() @@ -56,7 +63,10 @@ class PowerSuppliesTab(QtWidgets.QWidget): spinBox.editingFinished.disconnect() checkBox.stateChanged.disconnect() - retval = self.det.getMeasuredPower(voltageIndex)[0] + 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) @@ -68,8 +78,9 @@ class PowerSuppliesTab(QtWidgets.QWidget): spinBox.editingFinished.connect(partial(self.setVoltage, i)) checkBox.stateChanged.connect(partial(self.setVoltage, i)) - - self.getVChip() + + if self.det.type == detectorType.CHIPTESTBOARD: + self.getVChip() # TODO: handle multiple events when pressing enter (twice) @@ -91,7 +102,8 @@ class PowerSuppliesTab(QtWidgets.QWidget): # 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) - self.getCurrent(i) + if self.det.type == detectorType.CHIPTESTBOARD: + self.getCurrent(i) def getCurrent(self, i): label = getattr(self.view, f"labelI{i}") diff --git a/pyctbgui/pyctbgui/services/SlowADCs.py b/pyctbgui/pyctbgui/services/SlowADCs.py index 4b73b18f0..92876286e 100644 --- a/pyctbgui/pyctbgui/services/SlowADCs.py +++ b/pyctbgui/pyctbgui/services/SlowADCs.py @@ -4,7 +4,7 @@ from pathlib import Path from PyQt5 import uic, QtWidgets from pyctbgui.utils.defines import Defines -from slsdet import dacIndex +from slsdet import dacIndex, detectorType class SlowAdcTab(QtWidgets.QWidget): @@ -17,7 +17,8 @@ class SlowAdcTab(QtWidgets.QWidget): self.det = None def setup_ui(self): - pass + if self.det.type == detectorType.XILINX_CHIPTESTBOARD: + self.view.pushButtonTemp.setDisabled(True) def connect_ui(self): for i in range(Defines.slowAdc.count): @@ -28,7 +29,8 @@ class SlowAdcTab(QtWidgets.QWidget): self.updateSlowAdcNames() for i in range(Defines.slowAdc.count): self.updateSlowAdc(i) - self.updateTemperature() + if self.det.type == detectorType.CHIPTESTBOARD: + self.updateTemperature() def updateSlowAdcNames(self): for i, name in enumerate(self.mainWindow.det.getSlowADCNames()): diff --git a/pyctbgui/pyctbgui/ui/Dacs.ui b/pyctbgui/pyctbgui/ui/Dacs.ui index 940f93c7d..64cfd4b57 100644 --- a/pyctbgui/pyctbgui/ui/Dacs.ui +++ b/pyctbgui/pyctbgui/ui/Dacs.ui @@ -817,7 +817,7 @@ Only pressing enter on spinbox will set DAC (with this condition). - + ADC_VPP diff --git a/pyctbgui/pyctbgui/ui/acquisition.ui b/pyctbgui/pyctbgui/ui/acquisition.ui index 5b9fa58fd..c2d15dff6 100644 --- a/pyctbgui/pyctbgui/ui/acquisition.ui +++ b/pyctbgui/pyctbgui/ui/acquisition.ui @@ -118,7 +118,7 @@ - + Run Clock Frequency (MHz): @@ -218,7 +218,7 @@ - + 200 @@ -231,7 +231,7 @@ - + 0 @@ -278,7 +278,7 @@ - + DBIT Pipeline: @@ -338,21 +338,21 @@ - + ADC Pipeline: - + ADC Clock Phase (a.u.): - + DBIT Clock Phase (a.u.): diff --git a/pyctbgui/pyctbgui/ui/adc.ui b/pyctbgui/pyctbgui/ui/adc.ui index c1fabe266..2a03d9c16 100644 --- a/pyctbgui/pyctbgui/ui/adc.ui +++ b/pyctbgui/pyctbgui/ui/adc.ui @@ -19,7 +19,7 @@ Form - + 0 @@ -3142,7 +3142,7 @@ - + 10 @@ -3188,7 +3188,7 @@ - + 10 diff --git a/pyctbgui/pyctbgui/ui/slowAdcs.ui b/pyctbgui/pyctbgui/ui/slowAdcs.ui index 546a30e53..a5aef5b31 100644 --- a/pyctbgui/pyctbgui/ui/slowAdcs.ui +++ b/pyctbgui/pyctbgui/ui/slowAdcs.ui @@ -19,7 +19,7 @@ Form - + 0 diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c index 1b10b088e..8353f70c9 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c @@ -1056,7 +1056,7 @@ int getPower(enum DACINDEX ind) { // dac powered off if (dacValues[ind] == LTC2620_D_GetPowerDownValue()) { - LOG(logWARNING, ("Power V%s powered down\n", powerNames[pwrIndex])); + LOG(logWARNING, ("Power V%s is powered down\n", powerNames[pwrIndex])); return LTC2620_D_GetPowerDownValue(); }