mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-21 19:30:03 +02:00
added dbitreorder flag to chip test board gui
This commit is contained in:
parent
b7e17d1320
commit
713e4f6822
@ -22,6 +22,7 @@ class SignalsTab(QtWidgets.QWidget):
|
|||||||
self.plotTab = None
|
self.plotTab = None
|
||||||
self.legend: LegendItem | None = None
|
self.legend: LegendItem | None = None
|
||||||
self.rx_dbitoffset = None
|
self.rx_dbitoffset = None
|
||||||
|
self.rx_dbitreorder = None
|
||||||
self.rx_dbitlist = None
|
self.rx_dbitlist = None
|
||||||
|
|
||||||
def refresh(self):
|
def refresh(self):
|
||||||
@ -29,6 +30,7 @@ class SignalsTab(QtWidgets.QWidget):
|
|||||||
self.updateDigitalBitEnable()
|
self.updateDigitalBitEnable()
|
||||||
self.updateIOOut()
|
self.updateIOOut()
|
||||||
self.getDBitOffset()
|
self.getDBitOffset()
|
||||||
|
self.getDBitReorder()
|
||||||
|
|
||||||
def connect_ui(self):
|
def connect_ui(self):
|
||||||
for i in range(Defines.signals.count):
|
for i in range(Defines.signals.count):
|
||||||
@ -49,6 +51,7 @@ class SignalsTab(QtWidgets.QWidget):
|
|||||||
partial(self.setIOOutRange, Defines.signals.half, Defines.signals.count))
|
partial(self.setIOOutRange, Defines.signals.half, Defines.signals.count))
|
||||||
self.view.lineEditPatIOCtrl.editingFinished.connect(self.setIOOutReg)
|
self.view.lineEditPatIOCtrl.editingFinished.connect(self.setIOOutReg)
|
||||||
self.view.spinBoxDBitOffset.editingFinished.connect(self.setDbitOffset)
|
self.view.spinBoxDBitOffset.editingFinished.connect(self.setDbitOffset)
|
||||||
|
self.view.checkBoxDBitReorder.stateChanged.connect(self.setDbitReorder)
|
||||||
|
|
||||||
def setup_ui(self):
|
def setup_ui(self):
|
||||||
self.plotTab = self.mainWindow.plotTab
|
self.plotTab = self.mainWindow.plotTab
|
||||||
@ -87,60 +90,74 @@ class SignalsTab(QtWidgets.QWidget):
|
|||||||
self.legend.addItem(plot, name)
|
self.legend.addItem(plot, name)
|
||||||
|
|
||||||
@recordOrApplyPedestal
|
@recordOrApplyPedestal
|
||||||
def _processWaveformData(self, data, aSamples, dSamples, rx_dbitlist, isPlottedArray, rx_dbitoffset, romode,
|
def _processWaveformData(self, data, aSamples, dSamples, rx_reorder, rx_dbitlist, isPlottedArray, romode,
|
||||||
nADCEnabled):
|
nADCEnabled):
|
||||||
"""
|
|
||||||
transform raw waveform data into a processed numpy array
|
#transform raw waveform data into a processed numpy array
|
||||||
@param data: raw waveform data
|
#@param data: raw waveform data
|
||||||
"""
|
|
||||||
dbitoffset = rx_dbitoffset
|
start_digital_data = 0
|
||||||
if romode == 2:
|
if romode == 2:
|
||||||
dbitoffset += nADCEnabled * 2 * aSamples
|
start_digital_data += nADCEnabled * 2 * aSamples
|
||||||
digital_array = np.array(np.frombuffer(data, offset=dbitoffset, dtype=np.uint8))
|
digital_array = np.array(np.frombuffer(data, offset=start_digital_data, dtype=np.uint8))
|
||||||
|
if rx_reorder:
|
||||||
|
arr = np.empty((len(rx_dbitlist), dSamples), dtype=np.uint8)
|
||||||
nbitsPerDBit = dSamples
|
nbitsPerDBit = dSamples
|
||||||
if nbitsPerDBit % 8 != 0:
|
if nbitsPerDBit % 8 != 0:
|
||||||
nbitsPerDBit += (8 - (dSamples % 8))
|
nbitsPerDBit += (8 - (dSamples % 8))
|
||||||
offset = 0
|
offset = 0
|
||||||
arr = []
|
for idx, i in enumerate(rx_dbitlist):
|
||||||
for i in rx_dbitlist:
|
|
||||||
# where numbits * numsamples is not a multiple of 8
|
# where numbits * numsamples is not a multiple of 8
|
||||||
if offset % 8 != 0:
|
if offset % 8 != 0:
|
||||||
offset += (8 - (offset % 8))
|
offset += (8 - (offset % 8))
|
||||||
if not isPlottedArray[i]:
|
if not isPlottedArray[i]:
|
||||||
offset += nbitsPerDBit
|
offset += nbitsPerDBit
|
||||||
return None
|
arr[idx, :] = np.nan
|
||||||
waveform = np.zeros(dSamples)
|
continue
|
||||||
for iSample in range(dSamples):
|
for iSample in range(dSamples):
|
||||||
# all samples for digital bit together from slsReceiver
|
# all samples for digital bit together from slsReceiver
|
||||||
index = int(offset / 8)
|
index = int(offset / 8)
|
||||||
iBit = offset % 8
|
iBit = offset % 8
|
||||||
bit = (digital_array[index] >> iBit) & 1
|
bit = (digital_array[index] >> iBit) & 1
|
||||||
waveform[iSample] = bit
|
arr[idx,iSample] = bit
|
||||||
offset += 1
|
offset += 1
|
||||||
arr.append(waveform)
|
return arr
|
||||||
|
else:
|
||||||
return np.array(arr)
|
nbitsPerSample = len(rx_dbitlist) if len(rx_dbitlist) % 8 == 0 else len(rx_dbitlist) + (8 - (len(rx_dbitlist) % 8))
|
||||||
|
arr = np.empty((dSamples, len(rx_dbitlist)), dtype=np.uint8) #store all samples
|
||||||
|
for iSample in range(dSamples):
|
||||||
|
offset = nbitsPerSample * iSample
|
||||||
|
for idx, i in enumerate(rx_dbitlist): #TODO i think ctBitlist is reordered CHECK!!!
|
||||||
|
if not isPlottedArray[i]:
|
||||||
|
offset += 1
|
||||||
|
arr[iSample, idx] = np.nan
|
||||||
|
index = int(offset/8)
|
||||||
|
iBit = idx % 8
|
||||||
|
bit = (digital_array[index] >> iBit) & 1
|
||||||
|
arr[iSample, idx] = bit
|
||||||
|
offset += 1
|
||||||
|
return arr.T.copy()
|
||||||
|
|
||||||
def processWaveformData(self, data, aSamples, dSamples):
|
def processWaveformData(self, data, aSamples, dSamples):
|
||||||
"""
|
|
||||||
view function
|
#view function
|
||||||
plots processed waveform data
|
#plots processed waveform data
|
||||||
data: raw waveform data
|
#data: raw waveform data
|
||||||
dsamples: digital samples
|
#dsamples: digital samples
|
||||||
asamples: analog samples
|
#asamples: analog samples
|
||||||
"""
|
|
||||||
waveforms = {}
|
waveforms = {}
|
||||||
isPlottedArray = {i: getattr(self.view, f"checkBoxBIT{i}Plot").isChecked() for i in self.rx_dbitlist}
|
isPlottedArray = {i: getattr(self.view, f"checkBoxBIT{i}Plot").isChecked() for i in self.rx_dbitlist}
|
||||||
|
|
||||||
digital_array = self._processWaveformData(data, aSamples, dSamples, self.rx_dbitlist, isPlottedArray,
|
digital_array = self._processWaveformData(data, aSamples, dSamples, self.rx_dbitreorder, self.rx_dbitlist, isPlottedArray,
|
||||||
self.rx_dbitoffset, self.mainWindow.romode.value,
|
self.mainWindow.romode.value,
|
||||||
self.mainWindow.nADCEnabled)
|
self.mainWindow.nADCEnabled)
|
||||||
|
|
||||||
irow = 0
|
irow = 0
|
||||||
for idx, i in enumerate(self.rx_dbitlist):
|
for idx, i in enumerate(self.rx_dbitlist): #TODO i think ctBitlist is reordered CHECK!!!
|
||||||
# bits enabled but not plotting
|
# bits enabled but not plotting
|
||||||
waveform = digital_array[idx]
|
waveform = digital_array[idx, :]
|
||||||
if waveform is None:
|
if np.isnan(waveform[0]):
|
||||||
continue
|
continue
|
||||||
self.mainWindow.digitalPlots[i].setData(waveform)
|
self.mainWindow.digitalPlots[i].setData(waveform)
|
||||||
plotName = getattr(self.view, f"labelBIT{i}").text()
|
plotName = getattr(self.view, f"labelBIT{i}").text()
|
||||||
@ -151,8 +168,10 @@ class SignalsTab(QtWidgets.QWidget):
|
|||||||
irow += 1
|
irow += 1
|
||||||
else:
|
else:
|
||||||
self.mainWindow.digitalPlots[i].setY(0)
|
self.mainWindow.digitalPlots[i].setY(0)
|
||||||
|
|
||||||
return waveforms
|
return waveforms
|
||||||
|
|
||||||
|
|
||||||
def initializeAllDigitalPlots(self):
|
def initializeAllDigitalPlots(self):
|
||||||
self.mainWindow.plotDigitalWaveform = pg.plot()
|
self.mainWindow.plotDigitalWaveform = pg.plot()
|
||||||
self.mainWindow.plotDigitalWaveform.addLegend(colCount=Defines.colCount)
|
self.mainWindow.plotDigitalWaveform.addLegend(colCount=Defines.colCount)
|
||||||
@ -360,14 +379,25 @@ class SignalsTab(QtWidgets.QWidget):
|
|||||||
self.view.spinBoxDBitOffset.setValue(self.rx_dbitoffset)
|
self.view.spinBoxDBitOffset.setValue(self.rx_dbitoffset)
|
||||||
self.view.spinBoxDBitOffset.editingFinished.connect(self.setDbitOffset)
|
self.view.spinBoxDBitOffset.editingFinished.connect(self.setDbitOffset)
|
||||||
|
|
||||||
|
def getDBitReorder(self):
|
||||||
|
self.view.checkBoxDBitReorder.stateChanged.disconnect()
|
||||||
|
self.rx_dbitreorder = self.det.rx_dbitreorder
|
||||||
|
self.view.checkBoxDBitReorder.setChecked(self.rx_dbitreorder)
|
||||||
|
self.view.checkBoxDBitReorder.stateChanged.connect(self.setDbitReorder)
|
||||||
|
|
||||||
|
|
||||||
def setDbitOffset(self):
|
def setDbitOffset(self):
|
||||||
self.det.rx_dbitoffset = self.view.spinBoxDBitOffset.value()
|
self.det.rx_dbitoffset = self.view.spinBoxDBitOffset.value()
|
||||||
|
|
||||||
|
def setDbitReorder(self):
|
||||||
|
self.det.rx_dbitreorder = self.view.checkBoxDBitReorder.isChecked()
|
||||||
|
|
||||||
def saveParameters(self) -> list:
|
def saveParameters(self) -> list:
|
||||||
commands = []
|
commands = []
|
||||||
dblist = [str(i) for i in range(Defines.signals.count) if getattr(self.view, f"checkBoxBIT{i}DB").isChecked()]
|
dblist = [str(i) for i in range(Defines.signals.count) if getattr(self.view, f"checkBoxBIT{i}DB").isChecked()]
|
||||||
if len(dblist) > 0:
|
if len(dblist) > 0:
|
||||||
commands.append(f"rx_dbitlist {', '.join(dblist)}")
|
commands.append(f"rx_dbitlist {', '.join(dblist)}")
|
||||||
commands.append(f"rx_dbitoffset {self.view.spinBoxDBitOffset.value()}")
|
commands.append(f"rx_dbitoffset {self.view.spinBoxDBitOffset.value()}")
|
||||||
|
commands.append(f"rx_dbitreorder {self.view.checkBoxDBitReorder.isChecked()}")
|
||||||
commands.append(f"patioctrl {self.view.lineEditPatIOCtrl.text()}")
|
commands.append(f"patioctrl {self.view.lineEditPatIOCtrl.text()}")
|
||||||
return commands
|
return commands
|
||||||
|
@ -6074,6 +6074,33 @@
|
|||||||
<enum>QFrame::Raised</enum>
|
<enum>QFrame::Raised</enum>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_17">
|
<layout class="QGridLayout" name="gridLayout_17">
|
||||||
|
<item row="0" column="4">
|
||||||
|
<widget class="QSpinBox" name="spinBoxDBitOffset">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>150</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>150</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">background-color: rgb(255, 255, 255);</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="0" column="3">
|
<item row="0" column="3">
|
||||||
<widget class="QLabel" name="label_66">
|
<widget class="QLabel" name="label_66">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
@ -6086,6 +6113,31 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="0" column="6">
|
||||||
|
<widget class="QCheckBox" name="checkBoxDBitReorder">
|
||||||
|
<property name="text">
|
||||||
|
<string>DBit Reorder</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label_48">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>50</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>IO Control Register:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="0" column="1">
|
<item row="0" column="1">
|
||||||
<widget class="QLineEdit" name="lineEditPatIOCtrl">
|
<widget class="QLineEdit" name="lineEditPatIOCtrl">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@ -6133,50 +6185,18 @@
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="4">
|
<item row="0" column="5">
|
||||||
<widget class="QSpinBox" name="spinBoxDBitOffset">
|
<spacer name="horizontalSpacer_22">
|
||||||
<property name="minimumSize">
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>150</width>
|
<width>40</width>
|
||||||
<height>32</height>
|
<height>20</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
</spacer>
|
||||||
<size>
|
|
||||||
<width>150</width>
|
|
||||||
<height>32</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>10</pointsize>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="styleSheet">
|
|
||||||
<string notr="true">background-color: rgb(255, 255, 255);</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="label_48">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>50</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>10</pointsize>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>IO Control Register:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -2258,11 +2258,17 @@ void *start_timer(void *arg) {
|
|||||||
int packetsPerFrame = ceil((double)imageSize / (double)dataSize);
|
int packetsPerFrame = ceil((double)imageSize / (double)dataSize);
|
||||||
|
|
||||||
// Generate Data
|
// Generate Data
|
||||||
char imageData[imageSize];
|
char imageData[imageSize]; //
|
||||||
memset(imageData, 0, imageSize);
|
memset(imageData, 0, imageSize);
|
||||||
|
/*
|
||||||
for (int i = 0; i < imageSize; i += sizeof(uint16_t)) {
|
for (int i = 0; i < imageSize; i += sizeof(uint16_t)) {
|
||||||
*((uint16_t *)(imageData + i)) = i;
|
*((uint16_t *)(imageData + i)) = i;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (int i = 0; i < imageSize; i += 2 * sizeof(uint64_t)) {
|
||||||
|
*((uint64_t *)(imageData + i)) = 0xffffffffffffffff;
|
||||||
|
}
|
||||||
|
|
||||||
// Send data
|
// Send data
|
||||||
uint64_t frameNr = 0;
|
uint64_t frameNr = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user