2023-04-18 13:12:05 -04:00
|
|
|
#include "Scope.h"
|
|
|
|
|
|
|
|
#include <QValueAxis>
|
|
|
|
#include <QRandomGenerator>
|
|
|
|
#include <QGroupBox>
|
|
|
|
#include <QStandardItemModel>
|
|
|
|
#include <QLabel>
|
|
|
|
|
|
|
|
|
|
|
|
Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataThread, QMainWindow * parent) : QMainWindow(parent){
|
|
|
|
|
|
|
|
this->digi = digi;
|
|
|
|
this->nDigi = nDigi;
|
|
|
|
this->readDataThread = readDataThread;
|
|
|
|
|
|
|
|
setWindowTitle("Scope");
|
|
|
|
setGeometry(0, 0, 1000, 800);
|
|
|
|
setWindowFlags( this->windowFlags() & ~Qt::WindowCloseButtonHint );
|
|
|
|
|
|
|
|
enableSignalSlot = false;
|
|
|
|
|
2023-05-26 18:06:37 -04:00
|
|
|
plot = new RChart();
|
2023-04-18 13:12:05 -04:00
|
|
|
for( int i = 0; i < MaxNumberOfTrace; i++) {
|
|
|
|
dataTrace[i] = new QLineSeries();
|
|
|
|
dataTrace[i]->setName("Trace " + QString::number(i));
|
2023-04-20 14:39:59 -04:00
|
|
|
for(int j = 0; j < 100; j ++) dataTrace[i]->append(40*j, QRandomGenerator::global()->bounded(8000) - 4000);
|
2023-04-18 13:12:05 -04:00
|
|
|
plot->addSeries(dataTrace[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
dataTrace[0]->setPen(QPen(Qt::red, 2));
|
|
|
|
dataTrace[1]->setPen(QPen(Qt::blue, 2));
|
|
|
|
dataTrace[2]->setPen(QPen(Qt::darkYellow, 1));
|
|
|
|
dataTrace[3]->setPen(QPen(Qt::darkGreen, 1));
|
|
|
|
|
|
|
|
plot->setAnimationDuration(1); // msec
|
|
|
|
plot->setAnimationOptions(QChart::NoAnimation);
|
|
|
|
plot->createDefaultAxes(); /// this must be after addSeries();
|
|
|
|
/// this must be after createDefaultAxes();
|
|
|
|
QValueAxis * yaxis = qobject_cast<QValueAxis*> (plot->axes(Qt::Vertical).first());
|
|
|
|
QValueAxis * xaxis = qobject_cast<QValueAxis*> (plot->axes(Qt::Horizontal).first());
|
2023-04-20 18:15:30 -04:00
|
|
|
yaxis->setTickCount(7);
|
2023-04-20 13:49:36 -04:00
|
|
|
yaxis->setTickInterval((0x1FFF)/4);
|
|
|
|
yaxis->setRange(-(0x1FFF), 0x1FFF);
|
2023-04-18 13:12:05 -04:00
|
|
|
yaxis->setLabelFormat("%.0f");
|
|
|
|
|
2023-04-20 18:15:30 -04:00
|
|
|
xaxis->setRange(0, 4000);
|
2023-04-18 13:12:05 -04:00
|
|
|
xaxis->setTickCount(11);
|
|
|
|
xaxis->setLabelFormat("%.0f");
|
|
|
|
xaxis->setTitleText("Time [ns]");
|
|
|
|
|
2023-04-19 16:21:14 -04:00
|
|
|
updateTraceThread = new TimingThread();
|
|
|
|
updateTraceThread->SetWaitTimeinSec(0.5);
|
2023-04-19 18:08:20 -04:00
|
|
|
connect(updateTraceThread, &TimingThread::timeUp, this, &Scope::UpdateScope);
|
2023-04-18 13:12:05 -04:00
|
|
|
|
2023-04-21 18:10:12 -04:00
|
|
|
|
|
|
|
sbReordLength = nullptr;
|
|
|
|
sbPreTrigger = nullptr;
|
|
|
|
sbDCOffset = nullptr;
|
|
|
|
cbDynamicRange = nullptr;
|
|
|
|
cbPolarity = nullptr;
|
|
|
|
|
|
|
|
///---- PHA
|
|
|
|
sbInputRiseTime = nullptr;
|
|
|
|
sbTriggerHoldOff = nullptr;
|
|
|
|
sbThreshold = nullptr;
|
|
|
|
cbSmoothingFactor = nullptr;
|
|
|
|
|
|
|
|
sbTrapRiseTime = nullptr;
|
|
|
|
sbTrapFlatTop = nullptr;
|
|
|
|
sbDecayTime = nullptr;
|
|
|
|
sbPeakingTime = nullptr;
|
|
|
|
sbPeakHoldOff = nullptr;
|
|
|
|
|
|
|
|
cbPeakAvg = nullptr;
|
|
|
|
cbBaselineAvg = nullptr;
|
|
|
|
|
2023-04-24 16:37:57 -04:00
|
|
|
cbAnaProbe1 = nullptr;
|
|
|
|
cbAnaProbe2 = nullptr;
|
|
|
|
cbDigiProbe1 = nullptr;
|
|
|
|
cbDigiProbe2 = nullptr;
|
|
|
|
|
2023-04-18 13:12:05 -04:00
|
|
|
//*================================== UI
|
|
|
|
int rowID = -1;
|
|
|
|
|
|
|
|
QWidget * layoutWidget = new QWidget(this);
|
|
|
|
setCentralWidget(layoutWidget);
|
|
|
|
QGridLayout * layout = new QGridLayout(layoutWidget);
|
|
|
|
layoutWidget->setLayout(layout);
|
|
|
|
|
2023-04-19 13:41:43 -04:00
|
|
|
//================ Board & Ch selection
|
2023-04-18 13:12:05 -04:00
|
|
|
rowID ++;
|
|
|
|
cbScopeDigi = new RComboBox(this);
|
|
|
|
cbScopeCh = new RComboBox(this);
|
|
|
|
layout->addWidget(cbScopeDigi, rowID, 0);
|
|
|
|
layout->addWidget(cbScopeCh, rowID, 1);
|
|
|
|
|
2023-04-19 13:41:43 -04:00
|
|
|
for(unsigned int i = 0; i < nDigi; i++){
|
|
|
|
cbScopeDigi->addItem("Digi-" + QString::number(digi[i]->GetSerialNumber()), i);
|
|
|
|
}
|
2023-04-18 13:12:05 -04:00
|
|
|
|
2023-04-19 13:41:43 -04:00
|
|
|
ID = 0;
|
|
|
|
cbScopeDigi->setCurrentIndex(0);
|
|
|
|
for( int i = 0; i < digi[0]->GetNChannels(); i++) cbScopeCh->addItem("Ch-" + QString::number(i));
|
2023-06-20 11:57:39 -04:00
|
|
|
tick2ns = digi[ID]->GetTick2ns();
|
2023-04-19 13:41:43 -04:00
|
|
|
|
2023-04-19 14:46:10 -04:00
|
|
|
connect(cbScopeDigi, &RComboBox::currentIndexChanged, this, [=](int index){
|
2023-04-19 13:41:43 -04:00
|
|
|
if( !enableSignalSlot ) return;
|
|
|
|
ID = index;
|
2023-06-20 11:57:39 -04:00
|
|
|
tick2ns = digi[ID]->GetTick2ns();
|
2023-04-19 13:41:43 -04:00
|
|
|
//---setup cbScopeCh
|
|
|
|
cbScopeCh->clear();
|
|
|
|
for( int i = 0; i < digi[ID]->GetNChannels(); i++) cbScopeCh->addItem("Ch-" + QString::number(i));
|
2023-04-19 14:46:10 -04:00
|
|
|
|
|
|
|
//---Setup SettingGroup
|
2023-04-19 18:08:20 -04:00
|
|
|
CleanUpSettingsGroupBox();
|
|
|
|
if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ) SetUpPHAPanel();
|
|
|
|
if( digi[ID]->GetDPPType() == V1730_DPP_PSD_CODE ) SetUpPSDPanel();
|
2023-04-19 14:46:10 -04:00
|
|
|
|
2023-05-22 17:00:11 -04:00
|
|
|
ReadSettingsFromBoard();
|
2023-05-12 16:06:32 -04:00
|
|
|
|
2023-04-19 13:41:43 -04:00
|
|
|
});
|
|
|
|
|
2023-05-22 17:00:11 -04:00
|
|
|
connect(cbScopeCh, &RComboBox::currentIndexChanged, this, [=](){
|
|
|
|
if( !enableSignalSlot ) return;
|
|
|
|
ReadSettingsFromBoard();
|
|
|
|
});
|
|
|
|
|
2023-05-12 17:06:16 -04:00
|
|
|
|
2023-04-21 18:10:12 -04:00
|
|
|
bnReadSettingsFromBoard = new QPushButton("Refresh Settings", this);
|
|
|
|
layout->addWidget(bnReadSettingsFromBoard, rowID, 2);
|
|
|
|
connect(bnReadSettingsFromBoard, &QPushButton::clicked, this, &Scope::ReadSettingsFromBoard);
|
|
|
|
|
2023-05-16 17:21:40 -04:00
|
|
|
QPushButton * bnClearMemory = new QPushButton("Clear Memory", this);
|
|
|
|
layout->addWidget(bnClearMemory, rowID, 3);
|
|
|
|
connect(bnClearMemory, &QPushButton::clicked, this, [=](){
|
|
|
|
digiMTX[ID].lock();
|
|
|
|
digi[ID]->GetData()->ClearData();
|
|
|
|
digiMTX[ID].unlock();
|
|
|
|
});
|
|
|
|
|
2023-04-19 13:41:43 -04:00
|
|
|
//================ Trace settings
|
|
|
|
rowID ++;
|
|
|
|
{
|
2023-04-19 14:46:10 -04:00
|
|
|
settingGroup = new QGroupBox("Trace Settings",this);
|
2023-04-19 13:41:43 -04:00
|
|
|
layout->addWidget(settingGroup, rowID, 0, 1, 6);
|
|
|
|
|
2023-04-19 14:46:10 -04:00
|
|
|
settingLayout = new QGridLayout(settingGroup);
|
|
|
|
settingLayout->setSpacing(0);
|
2023-04-19 13:41:43 -04:00
|
|
|
|
2023-04-19 14:46:10 -04:00
|
|
|
if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ) SetUpPHAPanel();
|
2023-05-12 17:06:16 -04:00
|
|
|
if( digi[ID]->GetDPPType() == V1730_DPP_PSD_CODE ) SetUpPSDPanel();
|
2023-04-19 13:41:43 -04:00
|
|
|
|
|
|
|
}
|
|
|
|
//================ Plot view
|
2023-04-18 13:12:05 -04:00
|
|
|
rowID ++;
|
2023-05-26 18:06:37 -04:00
|
|
|
plotView = new RChartView(plot, this);
|
2023-04-18 13:12:05 -04:00
|
|
|
layout->addWidget(plotView, rowID, 0, 1, 6);
|
|
|
|
|
2023-05-12 17:06:16 -04:00
|
|
|
|
2023-04-19 13:41:43 -04:00
|
|
|
//================ Key binding
|
|
|
|
rowID ++;
|
|
|
|
QLabel * lbhints = new QLabel("Type 'r' to restore view, '+/-' Zoom in/out, arrow key to pan.", this);
|
|
|
|
layout->addWidget(lbhints, rowID, 0, 1, 4);
|
|
|
|
|
2023-04-20 18:15:30 -04:00
|
|
|
QLabel * lbinfo = new QLabel("Trace updates every " + QString::number(updateTraceThread->GetWaitTimeinSec()) + " sec.", this);
|
2023-04-19 13:41:43 -04:00
|
|
|
lbinfo->setAlignment(Qt::AlignRight);
|
|
|
|
layout->addWidget(lbinfo, rowID, 5);
|
|
|
|
|
|
|
|
rowID ++;
|
|
|
|
//TODO =========== Trace step
|
|
|
|
QLabel * lbinfo2 = new QLabel("Maximum time range is " + QString::number(MaxDisplayTraceDataLength * 8) + " ns due to processing speed.", this);
|
|
|
|
layout->addWidget(lbinfo2, rowID, 0, 1, 5);
|
|
|
|
|
|
|
|
//================ close button
|
2023-04-18 13:12:05 -04:00
|
|
|
rowID ++;
|
|
|
|
bnScopeStart = new QPushButton("Start", this);
|
|
|
|
layout->addWidget(bnScopeStart, rowID, 0);
|
|
|
|
connect(bnScopeStart, &QPushButton::clicked, this, [=](){this->StartScope();});
|
|
|
|
|
|
|
|
bnScopeStop = new QPushButton("Stop", this);
|
|
|
|
layout->addWidget(bnScopeStop, rowID, 1);
|
|
|
|
connect(bnScopeStop, &QPushButton::clicked, this, &Scope::StopScope);
|
|
|
|
|
|
|
|
QLabel * lbTriggerRate = new QLabel("Trigger Rate [Hz] : ", this);
|
|
|
|
lbTriggerRate->setAlignment(Qt::AlignCenter | Qt::AlignRight);
|
|
|
|
layout->addWidget(lbTriggerRate, rowID, 2);
|
|
|
|
|
|
|
|
leTriggerRate = new QLineEdit(this);
|
|
|
|
leTriggerRate->setAlignment(Qt::AlignRight);
|
|
|
|
leTriggerRate->setReadOnly(true);
|
|
|
|
layout->addWidget(leTriggerRate, rowID, 3);
|
|
|
|
|
|
|
|
QPushButton * bnClose = new QPushButton("Close", this);
|
|
|
|
layout->addWidget(bnClose, rowID, 5);
|
|
|
|
connect(bnClose, &QPushButton::clicked, this, &Scope::close);
|
|
|
|
|
2023-04-19 13:41:43 -04:00
|
|
|
layout->setColumnStretch(0, 1);
|
|
|
|
layout->setColumnStretch(1, 1);
|
|
|
|
layout->setColumnStretch(2, 1);
|
|
|
|
layout->setColumnStretch(3, 1);
|
|
|
|
layout->setColumnStretch(4, 1);
|
|
|
|
layout->setColumnStretch(5, 1);
|
|
|
|
|
2023-04-19 18:08:20 -04:00
|
|
|
bnScopeStart->setEnabled(true);
|
|
|
|
bnScopeStop->setEnabled(false);
|
|
|
|
|
2023-05-12 17:06:16 -04:00
|
|
|
UpdatePanelFromMomeory();
|
|
|
|
|
2023-06-01 17:51:00 -04:00
|
|
|
if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ) {
|
|
|
|
QValueAxis * yaxis = qobject_cast<QValueAxis*> (plot->axes(Qt::Vertical).first());
|
|
|
|
yaxis->setRange(-(0x1FFF), 0x1FFF);
|
|
|
|
}
|
|
|
|
if( digi[ID]->GetDPPType() == V1730_DPP_PSD_CODE ) {
|
|
|
|
QValueAxis * yaxis = qobject_cast<QValueAxis*> (plot->axes(Qt::Vertical).first());
|
|
|
|
yaxis->setRange(0, 0x3FFF);
|
|
|
|
}
|
|
|
|
|
2023-04-20 18:15:30 -04:00
|
|
|
enableSignalSlot = true;
|
|
|
|
|
2023-04-18 13:12:05 -04:00
|
|
|
}
|
|
|
|
|
2023-04-19 13:41:43 -04:00
|
|
|
|
2023-04-18 13:12:05 -04:00
|
|
|
Scope::~Scope(){
|
|
|
|
|
|
|
|
updateTraceThread->Stop();
|
|
|
|
updateTraceThread->quit();
|
|
|
|
updateTraceThread->wait();
|
|
|
|
delete updateTraceThread;
|
|
|
|
for( int i = 0; i < MaxNumberOfTrace; i++) delete dataTrace[i];
|
|
|
|
delete plot;
|
|
|
|
}
|
|
|
|
|
2023-04-19 13:41:43 -04:00
|
|
|
//*=======================================================
|
|
|
|
//*=======================================================
|
2023-04-18 13:12:05 -04:00
|
|
|
void Scope::StartScope(){
|
2023-04-19 18:08:20 -04:00
|
|
|
if( !digi ) return;
|
|
|
|
|
2023-04-20 18:15:30 -04:00
|
|
|
//TODO set other channel to be no trace;
|
|
|
|
|
2023-04-19 18:08:20 -04:00
|
|
|
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi ++){
|
|
|
|
|
2023-05-24 16:04:32 -04:00
|
|
|
traceOn[iDigi] = digi[iDigi]->IsRecordTrace(); //remember setting
|
2023-06-09 13:51:02 -04:00
|
|
|
digi[iDigi]->GetData()->ClearData();
|
2023-05-23 17:02:39 -04:00
|
|
|
digi[iDigi]->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::RecordTrace, 1, -1);
|
2023-04-19 18:08:20 -04:00
|
|
|
digi[iDigi]->StartACQ();
|
|
|
|
|
2023-05-22 17:00:11 -04:00
|
|
|
printf("----- readDataThread running ? %d.\n", readDataThread[iDigi]->isRunning());
|
|
|
|
if( readDataThread[iDigi]->isRunning() ){
|
|
|
|
readDataThread[iDigi]->quit();
|
|
|
|
readDataThread[iDigi]->wait();
|
|
|
|
}
|
2023-04-19 18:08:20 -04:00
|
|
|
readDataThread[iDigi]->SetScopeMode(true);
|
|
|
|
readDataThread[iDigi]->SetSaveData(false);
|
|
|
|
readDataThread[iDigi]->start();
|
|
|
|
}
|
|
|
|
|
2023-05-23 17:02:39 -04:00
|
|
|
emit UpdateOtherPanels();
|
|
|
|
|
2023-04-19 18:08:20 -04:00
|
|
|
updateTraceThread->start();
|
2023-04-18 13:12:05 -04:00
|
|
|
|
2023-04-19 18:08:20 -04:00
|
|
|
bnScopeStart->setEnabled(false);
|
|
|
|
bnScopeStop->setEnabled(true);
|
2023-04-18 13:12:05 -04:00
|
|
|
|
2023-04-21 18:10:12 -04:00
|
|
|
EnableControl(false);
|
|
|
|
|
2023-05-16 14:31:19 -04:00
|
|
|
TellACQOnOff(true);
|
|
|
|
|
2023-04-18 13:12:05 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void Scope::StopScope(){
|
2023-04-19 18:08:20 -04:00
|
|
|
if( !digi ) return;
|
|
|
|
|
2023-05-22 17:00:11 -04:00
|
|
|
// printf("------ Scope::%s \n", __func__);
|
2023-04-19 18:08:20 -04:00
|
|
|
updateTraceThread->Stop();
|
|
|
|
updateTraceThread->quit();
|
|
|
|
updateTraceThread->exit();
|
|
|
|
|
|
|
|
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi ++){
|
2023-05-22 17:00:11 -04:00
|
|
|
|
|
|
|
if( readDataThread[iDigi]->isRunning() ){
|
|
|
|
readDataThread[iDigi]->Stop();
|
|
|
|
readDataThread[iDigi]->quit();
|
|
|
|
readDataThread[iDigi]->wait();
|
|
|
|
}
|
2023-05-16 14:31:19 -04:00
|
|
|
digiMTX[iDigi].lock();
|
2023-04-19 18:08:20 -04:00
|
|
|
digi[iDigi]->StopACQ();
|
2023-05-16 14:31:19 -04:00
|
|
|
digiMTX[iDigi].unlock();
|
2023-05-23 17:02:39 -04:00
|
|
|
|
|
|
|
digi[iDigi]->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::RecordTrace, traceOn[iDigi], -1);
|
2023-04-19 18:08:20 -04:00
|
|
|
}
|
|
|
|
|
2023-05-23 17:02:39 -04:00
|
|
|
emit UpdateOtherPanels();
|
|
|
|
|
2023-04-19 18:08:20 -04:00
|
|
|
bnScopeStart->setEnabled(true);
|
|
|
|
bnScopeStop->setEnabled(false);
|
|
|
|
|
2023-04-21 18:10:12 -04:00
|
|
|
EnableControl(true);
|
|
|
|
|
2023-05-16 14:31:19 -04:00
|
|
|
TellACQOnOff(false);
|
|
|
|
|
2023-05-22 17:00:11 -04:00
|
|
|
// printf("----- end of %s\n", __func__);
|
|
|
|
|
2023-04-19 18:08:20 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void Scope::UpdateScope(){
|
|
|
|
|
|
|
|
if( !digi ) return;
|
|
|
|
|
|
|
|
int ch = cbScopeCh->currentIndex();
|
2023-05-24 16:04:32 -04:00
|
|
|
|
|
|
|
if( digi[ID]->GetChannelOnOff(ch) == false) return;
|
|
|
|
|
2023-06-20 11:57:39 -04:00
|
|
|
int tick2ns = digi[ID]->GetTick2ns();
|
2023-05-23 17:02:39 -04:00
|
|
|
int factor = digi[ID]->IsDualTrace_PHA() ? 2 : 1;
|
2023-04-19 18:08:20 -04:00
|
|
|
|
2023-05-22 17:00:11 -04:00
|
|
|
digiMTX[ID].lock();
|
2023-04-19 18:08:20 -04:00
|
|
|
Data * data = digi[ID]->GetData();
|
|
|
|
|
2023-04-20 14:39:59 -04:00
|
|
|
//leTriggerRate->setText(QString::number(data->TriggerRate[ch]) + " [" + QString::number(data->NumEventsDecoded[ch]) + "]");
|
2023-04-19 18:08:20 -04:00
|
|
|
leTriggerRate->setText(QString::number(data->TriggerRate[ch]));
|
|
|
|
|
2023-05-25 18:50:42 -04:00
|
|
|
unsigned short index = data->DataIndex[ch];
|
2023-04-19 18:08:20 -04:00
|
|
|
unsigned short traceLength = data->Waveform1[ch][index].size();
|
|
|
|
|
|
|
|
if( data->TriggerRate[ch] > 0 ){
|
|
|
|
|
2023-04-20 13:49:36 -04:00
|
|
|
//printf("--- %d | %d \n", index, traceLength );
|
2023-04-19 18:08:20 -04:00
|
|
|
|
2023-04-20 18:15:30 -04:00
|
|
|
QVector<QPointF> points[4];
|
2023-05-16 17:21:40 -04:00
|
|
|
if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ) {
|
|
|
|
for( int i = 0; i < (int) (data->Waveform1[ch][index]).size() ; i++ ) {
|
2023-06-20 11:57:39 -04:00
|
|
|
points[0].append(QPointF(tick2ns * i * factor, (data->Waveform1[ch][index])[i]));
|
|
|
|
if( i < (int) data->Waveform2[ch][index].size() ) points[1].append(QPointF(tick2ns * i * factor, (data->Waveform2[ch][index])[i]));
|
|
|
|
if( i < (int) data->DigiWaveform1[ch][index].size() ) points[2].append(QPointF(tick2ns * i * factor, (data->DigiWaveform1[ch][index])[i] * 1000));
|
|
|
|
if( i < (int) data->DigiWaveform2[ch][index].size() ) points[3].append(QPointF(tick2ns * i * factor, (data->DigiWaveform2[ch][index])[i] * 1000 + 500));
|
2023-05-16 17:21:40 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( digi[ID]->GetDPPType() == V1730_DPP_PSD_CODE ) {
|
|
|
|
for( int i = 0; i < (int) (data->DigiWaveform1[ch][index]).size() ; i++ ) {
|
2023-06-20 11:57:39 -04:00
|
|
|
points[0].append(QPointF(tick2ns * i * factor, (data->Waveform1[ch][index])[i]));
|
|
|
|
if( i < (int) data->Waveform2[ch][index].size() ) points[1].append(QPointF(tick2ns * i * factor, (data->Waveform2[ch][index])[i]));
|
|
|
|
if( i < (int) data->DigiWaveform1[ch][index].size() ) points[2].append(QPointF(tick2ns * i, (data->DigiWaveform1[ch][index])[i] * 1000));
|
|
|
|
if( i < (int) data->DigiWaveform2[ch][index].size() ) points[3].append(QPointF(tick2ns * i, (data->DigiWaveform2[ch][index])[i] * 1000 + 500));
|
2023-05-16 17:21:40 -04:00
|
|
|
}
|
2023-04-20 18:15:30 -04:00
|
|
|
}
|
|
|
|
dataTrace[0]->replace(points[0]);
|
|
|
|
dataTrace[1]->replace(points[1]);
|
|
|
|
dataTrace[2]->replace(points[2]);
|
|
|
|
dataTrace[3]->replace(points[3]);
|
2023-04-19 18:08:20 -04:00
|
|
|
}
|
|
|
|
digiMTX[ID].unlock();
|
|
|
|
|
2023-06-20 11:57:39 -04:00
|
|
|
plot->axes(Qt::Horizontal).first()->setRange(0, tick2ns * traceLength * factor);
|
2023-04-18 13:12:05 -04:00
|
|
|
|
2023-05-17 16:16:48 -04:00
|
|
|
emit UpdateScaler();
|
|
|
|
|
2023-04-18 13:12:05 -04:00
|
|
|
}
|
|
|
|
|
2023-04-19 13:41:43 -04:00
|
|
|
//*=======================================================
|
|
|
|
//*=======================================================
|
2023-04-21 18:10:12 -04:00
|
|
|
void Scope::SetUpComboBoxSimple(RComboBox * &cb, QString str, int row, int col){
|
2023-04-19 14:46:10 -04:00
|
|
|
QLabel * lb = new QLabel(str, settingGroup);
|
2023-04-19 13:41:43 -04:00
|
|
|
lb->setAlignment(Qt::AlignRight | Qt::AlignCenter);
|
2023-04-19 14:46:10 -04:00
|
|
|
settingLayout->addWidget(lb, row, col);
|
2023-04-19 13:41:43 -04:00
|
|
|
|
2023-04-19 14:46:10 -04:00
|
|
|
cb = new RComboBox(settingGroup);
|
|
|
|
settingLayout->addWidget(cb, row, col + 1);
|
2023-04-21 18:10:12 -04:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2023-05-01 16:20:16 -04:00
|
|
|
void Scope::SetUpComboBox(RComboBox * &cb, QString str, int row, int col, const Reg para){
|
2023-04-21 18:10:12 -04:00
|
|
|
|
|
|
|
SetUpComboBoxSimple(cb, str, row, col);
|
|
|
|
|
|
|
|
for( int i = 0; i < (int) para.GetComboList().size(); i++){
|
|
|
|
cb->addItem(QString::fromStdString(para.GetComboList()[i].first), para.GetComboList()[i].second);
|
|
|
|
}
|
|
|
|
|
|
|
|
connect(cb, &RComboBox::currentIndexChanged, this , [=](){
|
|
|
|
if( ! enableSignalSlot ) return;
|
|
|
|
|
|
|
|
int ch = cbScopeCh->currentIndex();
|
|
|
|
int value = cb->currentData().toInt();
|
|
|
|
digiMTX[ID].lock();
|
|
|
|
digi[ID]->WriteRegister(para, value, ch);
|
|
|
|
digiMTX[ID].unlock();
|
|
|
|
|
|
|
|
QString msg;
|
|
|
|
msg = QString::fromStdString(para.GetName()) ;
|
|
|
|
msg += "|DIG:"+ QString::number(digi[ID]->GetSerialNumber()) + ",CH:" + (ch == -1 ? "All" : QString::number(ch));
|
|
|
|
msg += " = " + cb->currentText();
|
|
|
|
if( digi[ID]->GetErrorCode() == CAEN_DGTZ_Success ){
|
|
|
|
SendLogMsg(msg + " | OK.");
|
|
|
|
cb->setStyleSheet("");
|
2023-05-23 17:02:39 -04:00
|
|
|
emit UpdateOtherPanels();
|
2023-04-21 18:10:12 -04:00
|
|
|
}else{
|
|
|
|
SendLogMsg(msg + " | Fail.");
|
|
|
|
cb->setStyleSheet("color:red;");
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
2023-04-19 13:41:43 -04:00
|
|
|
}
|
|
|
|
|
2023-05-01 16:20:16 -04:00
|
|
|
void Scope::SetUpSpinBox(RSpinBox * &sb, QString str, int row, int col, const Reg para){
|
2023-05-12 17:06:16 -04:00
|
|
|
|
2023-04-19 14:46:10 -04:00
|
|
|
QLabel * lb = new QLabel(str, settingGroup);
|
2023-04-19 13:41:43 -04:00
|
|
|
lb->setAlignment(Qt::AlignRight | Qt::AlignCenter);
|
2023-04-19 14:46:10 -04:00
|
|
|
settingLayout->addWidget(lb, row, col);
|
2023-04-19 13:41:43 -04:00
|
|
|
|
2023-04-19 14:46:10 -04:00
|
|
|
sb = new RSpinBox(settingGroup);
|
2023-04-19 13:41:43 -04:00
|
|
|
if( para.GetPartialStep() != 0 ){
|
|
|
|
sb->setMinimum(0);
|
2023-06-20 11:57:39 -04:00
|
|
|
sb->setMaximum(para.GetMaxBit() * para.GetPartialStep() * tick2ns);
|
|
|
|
if( para.GetPartialStep() > 0 ) sb->setSingleStep(para.GetPartialStep() * tick2ns);
|
2023-04-19 13:41:43 -04:00
|
|
|
if( para.GetPartialStep() == -1 ) sb->setSingleStep(1);
|
|
|
|
}
|
2023-04-19 14:46:10 -04:00
|
|
|
settingLayout->addWidget(sb, row, col + 1);
|
|
|
|
|
2023-04-19 13:41:43 -04:00
|
|
|
connect(sb, &RSpinBox::valueChanged, this, [=](){
|
|
|
|
if( !enableSignalSlot ) return;
|
|
|
|
sb->setStyleSheet("color:blue");
|
|
|
|
});
|
|
|
|
|
2023-05-12 17:06:16 -04:00
|
|
|
|
2023-04-19 13:41:43 -04:00
|
|
|
connect(sb, &RSpinBox::returnPressed, this, [=](){
|
|
|
|
if( !enableSignalSlot ) return;
|
|
|
|
if( sb->decimals() == 0 && sb->singleStep() != 1) {
|
|
|
|
double step = sb->singleStep();
|
|
|
|
double value = sb->value();
|
|
|
|
sb->setValue( (std::round(value/step)*step));
|
|
|
|
}
|
|
|
|
|
2023-04-20 18:15:30 -04:00
|
|
|
int ch = cbScopeCh->currentIndex();
|
2023-04-19 13:41:43 -04:00
|
|
|
//if( chkSetAllChannel->isChecked() ) ch = -1;
|
2023-04-20 18:15:30 -04:00
|
|
|
QString msg;
|
|
|
|
msg = QString::fromStdString(para.GetName()) + "|DIG:"+ QString::number(digi[ID]->GetSerialNumber()) + ",CH:" + (ch == -1 ? "All" : QString::number(ch));
|
|
|
|
msg += " = " + QString::number(sb->value());
|
|
|
|
|
2023-06-20 11:57:39 -04:00
|
|
|
uint32_t value = sb->value() / tick2ns / abs(para.GetPartialStep());
|
2023-04-20 18:15:30 -04:00
|
|
|
|
2023-05-16 14:31:19 -04:00
|
|
|
if( para == DPP::RecordLength_G){
|
2023-05-23 17:02:39 -04:00
|
|
|
int factor = digi[ID]->IsDualTrace_PHA() ? 2 : 1;
|
2023-04-20 18:15:30 -04:00
|
|
|
value = value * factor;
|
|
|
|
}
|
|
|
|
|
2023-05-01 16:20:16 -04:00
|
|
|
if( para == DPP::ChannelDCOffset ){
|
2023-04-21 18:10:12 -04:00
|
|
|
value = uint16_t((1.0 - sb->value()/100.) * 0xFFFF);
|
|
|
|
}
|
|
|
|
|
2023-05-01 16:20:16 -04:00
|
|
|
if( para == DPP::PHA::TriggerThreshold ){
|
2023-04-24 15:27:05 -04:00
|
|
|
value = sb->value();
|
|
|
|
}
|
|
|
|
|
2023-04-21 18:10:12 -04:00
|
|
|
msg += " | 0x" + QString::number(value, 16);
|
|
|
|
|
2023-04-20 18:15:30 -04:00
|
|
|
digiMTX[ID].lock();
|
|
|
|
digi[ID]->WriteRegister(para, value, ch);
|
|
|
|
digiMTX[ID].unlock();
|
|
|
|
if( digi[ID]->GetErrorCode() == CAEN_DGTZ_Success ){
|
2023-04-21 18:10:12 -04:00
|
|
|
SendLogMsg(msg + " | OK.");
|
2023-04-20 18:15:30 -04:00
|
|
|
sb->setStyleSheet("");
|
2023-05-23 17:02:39 -04:00
|
|
|
emit UpdateOtherPanels();
|
2023-04-20 18:15:30 -04:00
|
|
|
}else{
|
2023-04-21 18:10:12 -04:00
|
|
|
SendLogMsg(msg + " | Fail.");
|
2023-04-20 18:15:30 -04:00
|
|
|
sb->setStyleSheet("color:red;");
|
|
|
|
}
|
2023-04-19 13:41:43 -04:00
|
|
|
});
|
2023-04-19 14:46:10 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void Scope::CleanUpSettingsGroupBox(){
|
|
|
|
|
|
|
|
QList<QLabel *> labelChildren1 = settingGroup->findChildren<QLabel *>();
|
|
|
|
for( int i = 0; i < labelChildren1.size(); i++) delete labelChildren1[i];
|
|
|
|
|
|
|
|
QList<RComboBox *> labelChildren2 = settingGroup->findChildren<RComboBox *>();
|
|
|
|
for( int i = 0; i < labelChildren2.size(); i++) delete labelChildren2[i];
|
|
|
|
|
|
|
|
QList<RSpinBox *> labelChildren3 = settingGroup->findChildren<RSpinBox *>();
|
|
|
|
for( int i = 0; i < labelChildren3.size(); i++) delete labelChildren3[i];
|
2023-04-19 13:41:43 -04:00
|
|
|
|
|
|
|
}
|
2023-04-19 14:46:10 -04:00
|
|
|
|
2023-04-24 15:27:05 -04:00
|
|
|
void Scope::SetUpPHAPanel(){
|
2023-04-21 18:10:12 -04:00
|
|
|
printf("--- %s \n", __func__);
|
2023-04-19 14:46:10 -04:00
|
|
|
|
2023-04-24 15:27:05 -04:00
|
|
|
enableSignalSlot = false;
|
2023-04-20 18:15:30 -04:00
|
|
|
|
2023-04-24 15:27:05 -04:00
|
|
|
int rowID = 0;
|
2023-05-01 16:20:16 -04:00
|
|
|
SetUpSpinBox(sbReordLength, "Record Length [ns] ", rowID, 0, DPP::RecordLength_G);
|
|
|
|
SetUpSpinBox(sbPreTrigger, "Pre Trigger [ns] ", rowID, 2, DPP::PreTrigger);
|
|
|
|
SetUpSpinBox(sbDCOffset, "DC offset [%] ", rowID, 4, DPP::ChannelDCOffset);
|
2023-04-24 15:27:05 -04:00
|
|
|
sbDCOffset->setDecimals(2);
|
2023-05-01 16:20:16 -04:00
|
|
|
SetUpComboBox(cbDynamicRange, "Dynamic Range ", rowID, 6, DPP::InputDynamicRange);
|
2023-04-19 14:46:10 -04:00
|
|
|
|
2023-04-24 15:27:05 -04:00
|
|
|
rowID ++; //=============================================================
|
2023-05-01 16:20:16 -04:00
|
|
|
SetUpSpinBox(sbInputRiseTime, "Input Rise Time [ns] ", rowID, 0, DPP::PHA::InputRiseTime);
|
|
|
|
SetUpSpinBox(sbThreshold, "Threshold [LSB] ", rowID, 2, DPP::PHA::TriggerThreshold);
|
|
|
|
SetUpSpinBox(sbTriggerHoldOff,"Trigger HoldOff [ns] ", rowID, 4, DPP::PHA::TriggerHoldOffWidth);
|
|
|
|
SetUpComboBox(cbSmoothingFactor, "Smooth Factor ", rowID, 6, DPP::PHA::RCCR2SmoothingFactor);
|
2023-04-24 15:27:05 -04:00
|
|
|
|
|
|
|
rowID ++; //=============================================================
|
2023-05-01 16:20:16 -04:00
|
|
|
SetUpSpinBox(sbTrapRiseTime, "Trap. Rise Time [ns] ", rowID, 0, DPP::PHA::TrapezoidRiseTime);
|
|
|
|
SetUpSpinBox(sbTrapFlatTop, "Trap. FlatTop [ns] ", rowID, 2, DPP::PHA::TrapezoidFlatTop);
|
|
|
|
SetUpSpinBox(sbDecayTime, "Decay Time [ns] ", rowID, 4, DPP::PHA::DecayTime);
|
|
|
|
SetUpSpinBox(sbPeakingTime, "Peaking Time [ns] ", rowID, 6, DPP::PHA::PeakingTime);
|
2023-04-24 15:27:05 -04:00
|
|
|
|
|
|
|
rowID ++; //=============================================================
|
|
|
|
SetUpComboBoxSimple(cbPolarity, "Polarity ", rowID, 0);
|
2023-04-21 18:10:12 -04:00
|
|
|
cbPolarity->addItem("Positive", 0);
|
|
|
|
cbPolarity->addItem("Negative", 1);
|
2023-04-24 15:27:05 -04:00
|
|
|
connect(cbPolarity, &RComboBox::currentIndexChanged, this, [=](){
|
|
|
|
if( !enableSignalSlot ) return;
|
2023-05-09 12:16:08 -04:00
|
|
|
digi[ID]->SetBits(DPP::DPPAlgorithmControl, DPP::Bit_DPPAlgorithmControl_PHA::Polarity, cbPolarity->currentData().toInt(), cbScopeCh->currentIndex());
|
2023-04-24 15:27:05 -04:00
|
|
|
});
|
2023-04-21 18:10:12 -04:00
|
|
|
|
2023-04-24 15:27:05 -04:00
|
|
|
SetUpComboBoxSimple(cbBaselineAvg, "Baseline Avg. ", rowID, 2);
|
2023-04-21 18:10:12 -04:00
|
|
|
cbBaselineAvg->addItem("Not evaluated", 0);
|
|
|
|
cbBaselineAvg->addItem("16 sample", 1);
|
|
|
|
cbBaselineAvg->addItem("64 sample", 2);
|
|
|
|
cbBaselineAvg->addItem("256 sample", 3);
|
|
|
|
cbBaselineAvg->addItem("1024 sample", 4);
|
|
|
|
cbBaselineAvg->addItem("4096 sample", 5);
|
|
|
|
cbBaselineAvg->addItem("16384 sample", 6);
|
2023-04-24 15:27:05 -04:00
|
|
|
connect(cbBaselineAvg, &RComboBox::currentIndexChanged, this, [=](){
|
|
|
|
if( !enableSignalSlot ) return;
|
2023-05-09 12:16:08 -04:00
|
|
|
digi[ID]->SetBits(DPP::DPPAlgorithmControl, DPP::Bit_DPPAlgorithmControl_PHA::BaselineAvg, cbBaselineAvg->currentData().toInt(), cbScopeCh->currentIndex());
|
2023-04-24 15:27:05 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
SetUpComboBoxSimple(cbPeakAvg, "Peak Avg. ", rowID, 4);
|
|
|
|
cbPeakAvg->addItem("1 sample", 0);
|
|
|
|
cbPeakAvg->addItem("4 sample", 1);
|
|
|
|
cbPeakAvg->addItem("16 sample", 2);
|
|
|
|
cbPeakAvg->addItem("64 sample", 3);
|
|
|
|
connect(cbPeakAvg, &RComboBox::currentIndexChanged, this, [=](){
|
|
|
|
if( !enableSignalSlot ) return;
|
2023-05-09 12:16:08 -04:00
|
|
|
digi[ID]->SetBits(DPP::DPPAlgorithmControl, DPP::Bit_DPPAlgorithmControl_PHA::PeakMean, cbPeakAvg->currentData().toInt(), cbScopeCh->currentIndex());
|
2023-04-24 15:27:05 -04:00
|
|
|
});
|
|
|
|
|
2023-05-01 16:20:16 -04:00
|
|
|
SetUpSpinBox(sbPeakHoldOff, "Peak HoldOff [ns] ", rowID, 6, DPP::PHA::PeakHoldOff);
|
2023-04-24 15:27:05 -04:00
|
|
|
|
|
|
|
|
|
|
|
rowID ++; //=============================================================
|
|
|
|
SetUpComboBoxSimple(cbAnaProbe1, "Ana. Probe 1 ", rowID, 0);
|
2023-05-15 17:18:53 -04:00
|
|
|
for( int i = 0; i < (int) DPP::Bit_BoardConfig::ListAnaProbe1_PHA.size(); i++){
|
|
|
|
cbAnaProbe1->addItem(QString::fromStdString(DPP::Bit_BoardConfig::ListAnaProbe1_PHA[i].first), DPP::Bit_BoardConfig::ListAnaProbe1_PHA[i].second);
|
|
|
|
}
|
2023-04-24 15:27:05 -04:00
|
|
|
connect(cbAnaProbe1, &RComboBox::currentIndexChanged, this, [=](){
|
|
|
|
if( !enableSignalSlot ) return;
|
2023-05-01 16:20:16 -04:00
|
|
|
digi[ID]->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::AnalogProbe1, cbAnaProbe1->currentData().toInt(), cbScopeCh->currentIndex());
|
2023-04-24 15:27:05 -04:00
|
|
|
dataTrace[0]->setName(cbAnaProbe1->currentText());
|
|
|
|
});
|
|
|
|
|
|
|
|
SetUpComboBoxSimple(cbAnaProbe2, "Ana. Probe 2 ", rowID, 2);
|
2023-05-15 17:18:53 -04:00
|
|
|
for( int i = 0; i < (int) DPP::Bit_BoardConfig::ListAnaProbe2_PHA.size(); i++){
|
|
|
|
cbAnaProbe2->addItem(QString::fromStdString(DPP::Bit_BoardConfig::ListAnaProbe2_PHA[i].first), DPP::Bit_BoardConfig::ListAnaProbe2_PHA[i].second);
|
|
|
|
}
|
2023-04-24 15:27:05 -04:00
|
|
|
connect(cbAnaProbe2, &RComboBox::currentIndexChanged, this, [=](){
|
|
|
|
if( !enableSignalSlot ) return;
|
2023-05-01 16:20:16 -04:00
|
|
|
digi[ID]->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::AnalogProbe2, cbAnaProbe2->currentData().toInt(), cbScopeCh->currentIndex());
|
2023-04-24 15:27:05 -04:00
|
|
|
dataTrace[1]->setName(cbAnaProbe2->currentText());
|
|
|
|
});
|
|
|
|
|
|
|
|
SetUpComboBoxSimple(cbDigiProbe1, "Digi. Probe 1 ", rowID, 4);
|
2023-05-15 17:18:53 -04:00
|
|
|
for( int i = 0; i < (int) DPP::Bit_BoardConfig::ListDigiProbe1_PHA.size(); i++){
|
|
|
|
cbDigiProbe1->addItem(QString::fromStdString(DPP::Bit_BoardConfig::ListDigiProbe1_PHA[i].first), DPP::Bit_BoardConfig::ListDigiProbe1_PHA[i].second);
|
|
|
|
}
|
2023-04-24 15:27:05 -04:00
|
|
|
connect(cbDigiProbe1, &RComboBox::currentIndexChanged, this, [=](){
|
|
|
|
if( !enableSignalSlot ) return;
|
2023-05-16 17:21:40 -04:00
|
|
|
digi[ID]->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::DigiProbel1_PHA, cbDigiProbe1->currentData().toInt(), cbScopeCh->currentIndex());
|
2023-05-15 17:18:53 -04:00
|
|
|
dataTrace[2]->setName(cbDigiProbe1->currentText());
|
2023-04-24 15:27:05 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
SetUpComboBoxSimple(cbDigiProbe2, "Digi. Probe 2 ", rowID, 6);
|
2023-05-15 17:18:53 -04:00
|
|
|
for( int i = 0; i < (int) DPP::Bit_BoardConfig::ListDigiProbe2_PHA.size(); i++){
|
|
|
|
cbDigiProbe2->addItem(QString::fromStdString(DPP::Bit_BoardConfig::ListDigiProbe2_PHA[i].first), DPP::Bit_BoardConfig::ListDigiProbe2_PHA[i].second);
|
|
|
|
}
|
2023-04-24 15:27:05 -04:00
|
|
|
dataTrace[3]->setName(cbDigiProbe2->currentText());
|
|
|
|
cbDigiProbe2->setEnabled(false);
|
|
|
|
|
|
|
|
enableSignalSlot = true;
|
2023-04-19 14:46:10 -04:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2023-04-19 18:08:20 -04:00
|
|
|
void Scope::SetUpPSDPanel(){
|
|
|
|
|
2023-05-12 17:06:16 -04:00
|
|
|
enableSignalSlot = false;
|
|
|
|
printf("==== %s \n", __func__);
|
|
|
|
|
2023-04-24 15:27:05 -04:00
|
|
|
int rowID = 0;
|
2023-05-01 16:20:16 -04:00
|
|
|
SetUpSpinBox(sbReordLength, "Record Length [ns] ", rowID, 0, DPP::RecordLength_G);
|
|
|
|
SetUpSpinBox(sbPreTrigger, "Pre Trigger [ns] ", rowID, 2, DPP::PreTrigger);
|
|
|
|
SetUpSpinBox(sbDCOffset, "DC offset [%] ", rowID, 4, DPP::ChannelDCOffset);
|
2023-04-24 15:27:05 -04:00
|
|
|
sbDCOffset->setDecimals(2);
|
2023-05-01 16:20:16 -04:00
|
|
|
SetUpComboBox(cbDynamicRange, "Dynamic Range ", rowID, 6, DPP::InputDynamicRange);
|
2023-04-24 15:27:05 -04:00
|
|
|
|
2023-05-12 17:06:16 -04:00
|
|
|
|
2023-04-24 15:27:05 -04:00
|
|
|
rowID ++; //=============================================================
|
|
|
|
SetUpComboBoxSimple(cbPolarity, "Polarity ", rowID, 0);
|
|
|
|
cbPolarity->addItem("Positive", 0);
|
|
|
|
cbPolarity->addItem("Negative", 1);
|
|
|
|
connect(cbPolarity, &RComboBox::currentIndexChanged, this, [=](){
|
|
|
|
if( !enableSignalSlot ) return;
|
2023-05-09 12:16:08 -04:00
|
|
|
digi[ID]->SetBits(DPP::DPPAlgorithmControl, DPP::Bit_DPPAlgorithmControl_PHA::Polarity, cbPolarity->currentData().toInt(), cbScopeCh->currentIndex());
|
2023-04-24 15:27:05 -04:00
|
|
|
});
|
2023-05-12 16:06:32 -04:00
|
|
|
|
|
|
|
SetUpSpinBox(sbShortGate, "Short Gate [ns] ", rowID, 2, DPP::PSD::ShortGateWidth);
|
|
|
|
SetUpSpinBox(sbLongGate, "Long Gate [ns] ", rowID, 4, DPP::PSD::LongGateWidth);
|
|
|
|
SetUpSpinBox(sbGateOffset, "Gate Offset [ns] ", rowID, 6, DPP::PSD::GateOffset);
|
|
|
|
|
2023-05-15 17:18:53 -04:00
|
|
|
rowID ++; //=============================================================
|
|
|
|
SetUpComboBoxSimple(cbAnaProbe1, "Ana. Probe ", rowID, 0);
|
|
|
|
for( int i = 0; i < (int) DPP::Bit_BoardConfig::ListAnaProbe_PSD.size(); i++){
|
|
|
|
cbAnaProbe1->addItem(QString::fromStdString(DPP::Bit_BoardConfig::ListAnaProbe_PSD[i].first), DPP::Bit_BoardConfig::ListAnaProbe_PSD[i].second);
|
|
|
|
}
|
|
|
|
connect(cbAnaProbe1, &RComboBox::currentIndexChanged, this, [=](){
|
|
|
|
if( !enableSignalSlot ) return;
|
|
|
|
digi[ID]->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::AnaProbe_PSD, cbAnaProbe1->currentData().toInt(), cbScopeCh->currentIndex());
|
2023-05-16 17:21:40 -04:00
|
|
|
//dataTrace[0]->setName(cbAnaProbe1->currentText());
|
|
|
|
|
|
|
|
switch( cbAnaProbe1->currentIndex() ){
|
|
|
|
case 0 : dataTrace[0]->setName("input"); dataTrace[1]->setName("N/A"); break;
|
|
|
|
case 1 : dataTrace[0]->setName("CFD"); dataTrace[1]->setName("N/A"); break;
|
|
|
|
case 2 : dataTrace[0]->setName("baseline"); dataTrace[1]->setName("input"); break;
|
|
|
|
case 3 : dataTrace[0]->setName("baseline"); dataTrace[1]->setName("CFD"); break;
|
|
|
|
case 4 : dataTrace[0]->setName("CFD"); dataTrace[1]->setName("input"); break;
|
|
|
|
}
|
|
|
|
|
2023-05-15 17:18:53 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
SetUpComboBoxSimple(cbDigiProbe1, "Digi. Probe 1 ", rowID, 4);
|
|
|
|
for( int i = 0; i < (int) DPP::Bit_BoardConfig::ListDigiProbe1_PSD.size(); i++){
|
|
|
|
cbDigiProbe1->addItem(QString::fromStdString(DPP::Bit_BoardConfig::ListDigiProbe1_PSD[i].first), DPP::Bit_BoardConfig::ListDigiProbe1_PSD[i].second);
|
|
|
|
}
|
|
|
|
connect(cbDigiProbe1, &RComboBox::currentIndexChanged, this, [=](){
|
|
|
|
if( !enableSignalSlot ) return;
|
2023-05-16 17:21:40 -04:00
|
|
|
digi[ID]->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::DigiProbel1_PSD, cbDigiProbe1->currentData().toInt(), cbScopeCh->currentIndex());
|
2023-05-15 17:18:53 -04:00
|
|
|
dataTrace[2]->setName(cbDigiProbe1->currentText());
|
|
|
|
});
|
|
|
|
|
|
|
|
SetUpComboBoxSimple(cbDigiProbe2, "Digi. Probe 2 ", rowID, 6);
|
|
|
|
for( int i = 0; i < (int) DPP::Bit_BoardConfig::ListDigiProbe2_PSD.size(); i++){
|
|
|
|
cbDigiProbe2->addItem(QString::fromStdString(DPP::Bit_BoardConfig::ListDigiProbe2_PSD[i].first), DPP::Bit_BoardConfig::ListDigiProbe2_PSD[i].second);
|
|
|
|
}
|
|
|
|
connect(cbDigiProbe2, &RComboBox::currentIndexChanged, this, [=](){
|
|
|
|
if( !enableSignalSlot ) return;
|
2023-05-16 17:21:40 -04:00
|
|
|
digi[ID]->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::DigiProbel1_PSD, cbDigiProbe1->currentData().toInt(), cbScopeCh->currentIndex());
|
2023-05-15 17:18:53 -04:00
|
|
|
dataTrace[3]->setName(cbDigiProbe2->currentText());
|
|
|
|
});
|
|
|
|
|
2023-05-12 17:06:16 -04:00
|
|
|
enableSignalSlot = true;
|
2023-04-21 18:10:12 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void Scope::EnableControl(bool enable){
|
|
|
|
|
|
|
|
if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ){
|
|
|
|
|
|
|
|
sbPreTrigger->setEnabled(enable);
|
|
|
|
sbTrapRiseTime->setEnabled(enable);
|
|
|
|
sbTrapFlatTop->setEnabled(enable);
|
|
|
|
sbDecayTime->setEnabled(enable);
|
|
|
|
|
|
|
|
sbInputRiseTime->setEnabled(enable);
|
2023-04-24 15:27:05 -04:00
|
|
|
cbSmoothingFactor->setEnabled(enable);
|
2023-04-21 18:10:12 -04:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2023-04-19 18:08:20 -04:00
|
|
|
}
|
2023-04-20 18:15:30 -04:00
|
|
|
|
|
|
|
//*=======================================================
|
|
|
|
//*=======================================================
|
|
|
|
|
2023-05-01 16:20:16 -04:00
|
|
|
void Scope::UpdateComobox(RComboBox * &cb, const Reg para){
|
2023-04-21 18:10:12 -04:00
|
|
|
int ch = cbScopeCh->currentIndex();
|
|
|
|
|
|
|
|
enableSignalSlot = false;
|
|
|
|
int haha = digi[ID]->GetSettingFromMemory(para, ch);
|
|
|
|
|
|
|
|
for( int i = 0; i < cb->count(); i++){
|
|
|
|
int kaka = cb->itemData(i).toInt();
|
|
|
|
if( kaka == haha ){
|
|
|
|
cb->setCurrentIndex(i);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-04-24 15:27:05 -04:00
|
|
|
//enableSignalSlot = true;
|
2023-04-21 18:10:12 -04:00
|
|
|
}
|
|
|
|
|
2023-05-01 16:20:16 -04:00
|
|
|
void Scope::UpdateSpinBox(RSpinBox * &sb, const Reg para){
|
2023-04-20 18:15:30 -04:00
|
|
|
int ch = cbScopeCh->currentIndex();
|
|
|
|
|
2023-04-21 18:10:12 -04:00
|
|
|
enableSignalSlot = false;
|
2023-04-20 18:15:30 -04:00
|
|
|
unsigned int haha = digi[ID]->GetSettingFromMemory(para, ch);
|
2023-05-16 14:31:19 -04:00
|
|
|
|
2023-06-20 11:57:39 -04:00
|
|
|
if( para.GetPartialStep() > 0 ) sb->setValue(haha * para.GetPartialStep() * tick2ns);
|
2023-04-20 18:15:30 -04:00
|
|
|
if( para.GetPartialStep() == -1 ) sb->setValue(haha);
|
2023-04-24 15:27:05 -04:00
|
|
|
//enableSignalSlot = true;
|
2023-04-20 18:15:30 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Scope::UpdatePanelFromMomeory(){
|
|
|
|
|
2023-04-24 15:27:05 -04:00
|
|
|
enableSignalSlot = false;
|
2023-05-12 17:06:16 -04:00
|
|
|
printf("==== %s \n", __func__);
|
2023-04-20 18:15:30 -04:00
|
|
|
|
2023-05-12 17:06:16 -04:00
|
|
|
int ch = cbScopeCh->currentIndex();
|
2023-04-20 18:15:30 -04:00
|
|
|
|
2023-05-01 16:20:16 -04:00
|
|
|
unsigned int haha = digi[ID]->GetSettingFromMemory(DPP::RecordLength_G, ch);
|
2023-06-20 11:57:39 -04:00
|
|
|
sbReordLength->setValue(haha * DPP::RecordLength_G.GetPartialStep() * tick2ns);
|
2023-04-20 18:15:30 -04:00
|
|
|
|
2023-05-16 14:31:19 -04:00
|
|
|
// if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ){
|
|
|
|
// int factor = digi[ID]->IsDualTrace() ? 2 : 1; // if dual trace,
|
2023-06-20 11:57:39 -04:00
|
|
|
// sbReordLength->setValue(haha * DPP::RecordLength_G.GetPartialStep() * tick2ns / factor);
|
2023-05-16 14:31:19 -04:00
|
|
|
// }else{
|
|
|
|
// }
|
2023-04-20 18:15:30 -04:00
|
|
|
|
2023-05-01 16:20:16 -04:00
|
|
|
haha = digi[ID]->GetSettingFromMemory(DPP::ChannelDCOffset, ch);
|
2023-04-20 18:15:30 -04:00
|
|
|
sbDCOffset->setValue((1.0 - haha * 1.0 / 0xFFFF) * 100 );
|
|
|
|
|
2023-05-01 16:20:16 -04:00
|
|
|
UpdateComobox(cbDynamicRange, DPP::InputDynamicRange);
|
2023-05-12 17:06:16 -04:00
|
|
|
UpdateSpinBox(sbPreTrigger, DPP::PreTrigger);
|
|
|
|
|
|
|
|
if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ) UpdatePHAPanel();
|
|
|
|
if( digi[ID]->GetDPPType() == V1730_DPP_PSD_CODE ) UpdatePSDPanel();
|
|
|
|
|
2023-05-24 16:04:32 -04:00
|
|
|
settingGroup->setEnabled(digi[ID]->GetChannelOnOff(ch));
|
|
|
|
|
2023-05-12 17:06:16 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void Scope::UpdatePHAPanel(){
|
|
|
|
enableSignalSlot = false;
|
|
|
|
|
|
|
|
int ch = cbScopeCh->currentIndex();
|
2023-04-21 18:10:12 -04:00
|
|
|
|
2023-05-01 16:20:16 -04:00
|
|
|
uint32_t DPPAlg = digi[ID]->GetSettingFromMemory(DPP::DPPAlgorithmControl, ch);
|
2023-05-09 12:16:08 -04:00
|
|
|
if( Digitizer::ExtractBits(DPPAlg, DPP::Bit_DPPAlgorithmControl_PHA::Polarity) ){
|
2023-04-24 15:27:05 -04:00
|
|
|
cbPolarity->setCurrentIndex(1);
|
|
|
|
}else{
|
|
|
|
cbPolarity->setCurrentIndex(0);
|
|
|
|
}
|
|
|
|
|
2023-05-12 17:06:16 -04:00
|
|
|
UpdateSpinBox(sbInputRiseTime, DPP::PHA::InputRiseTime);
|
|
|
|
UpdateSpinBox(sbThreshold, DPP::PHA::TriggerThreshold);
|
|
|
|
UpdateSpinBox(sbTriggerHoldOff, DPP::PHA::TriggerHoldOffWidth);
|
|
|
|
|
|
|
|
UpdateSpinBox(sbTrapRiseTime, DPP::PHA::TrapezoidRiseTime);
|
|
|
|
UpdateSpinBox(sbTrapFlatTop, DPP::PHA::TrapezoidFlatTop);
|
|
|
|
UpdateSpinBox(sbDecayTime, DPP::PHA::DecayTime);
|
|
|
|
UpdateSpinBox(sbPeakingTime, DPP::PHA::PeakingTime);
|
|
|
|
|
|
|
|
UpdateComobox(cbSmoothingFactor, DPP::PHA::RCCR2SmoothingFactor);
|
|
|
|
|
|
|
|
int temp = Digitizer::ExtractBits(DPPAlg, DPP::Bit_DPPAlgorithmControl_PHA::BaselineAvg);
|
|
|
|
for(int i = 0; i < cbBaselineAvg->count(); i++){
|
|
|
|
if( cbBaselineAvg->itemData(i).toInt() == temp) {
|
|
|
|
cbBaselineAvg->setCurrentIndex(i);
|
|
|
|
break;
|
2023-04-24 15:27:05 -04:00
|
|
|
}
|
2023-05-12 17:06:16 -04:00
|
|
|
}
|
2023-04-24 15:27:05 -04:00
|
|
|
|
2023-05-12 17:06:16 -04:00
|
|
|
temp = Digitizer::ExtractBits(DPPAlg, DPP::Bit_DPPAlgorithmControl_PHA::PeakMean);
|
|
|
|
for(int i = 0; i < cbPeakAvg->count(); i++){
|
|
|
|
if( cbPeakAvg->itemData(i).toInt() == temp) {
|
|
|
|
cbPeakAvg->setCurrentIndex(i);
|
|
|
|
break;
|
2023-04-24 15:27:05 -04:00
|
|
|
}
|
2023-05-12 17:06:16 -04:00
|
|
|
}
|
2023-04-24 15:27:05 -04:00
|
|
|
|
2023-05-12 17:06:16 -04:00
|
|
|
uint32_t BdCfg = digi[ID]->GetSettingFromMemory(DPP::BoardConfiguration);
|
2023-04-24 15:27:05 -04:00
|
|
|
|
2023-05-12 17:06:16 -04:00
|
|
|
temp = Digitizer::ExtractBits(BdCfg, DPP::Bit_BoardConfig::AnalogProbe1);
|
|
|
|
for(int i = 0; i < cbAnaProbe1->count(); i++){
|
|
|
|
if( cbAnaProbe1->itemData(i).toInt() == temp) {
|
|
|
|
cbAnaProbe1->setCurrentIndex(i);
|
|
|
|
dataTrace[0]->setName(cbAnaProbe1->currentText());
|
|
|
|
break;
|
2023-04-24 15:27:05 -04:00
|
|
|
}
|
2023-05-12 17:06:16 -04:00
|
|
|
}
|
|
|
|
temp = Digitizer::ExtractBits(BdCfg, DPP::Bit_BoardConfig::AnalogProbe2);
|
|
|
|
for(int i = 0; i < cbAnaProbe2->count(); i++){
|
|
|
|
if( cbAnaProbe2->itemData(i).toInt() == temp) {
|
|
|
|
cbAnaProbe2->setCurrentIndex(i);
|
|
|
|
dataTrace[1]->setName(cbAnaProbe2->currentText());
|
|
|
|
break;
|
2023-04-24 15:27:05 -04:00
|
|
|
}
|
2023-05-12 17:06:16 -04:00
|
|
|
}
|
2023-05-16 17:21:40 -04:00
|
|
|
temp = Digitizer::ExtractBits(BdCfg, DPP::Bit_BoardConfig::DigiProbel1_PHA);
|
2023-05-12 17:06:16 -04:00
|
|
|
for(int i = 0; i < cbDigiProbe1->count(); i++){
|
|
|
|
if( cbDigiProbe1->itemData(i).toInt() == temp) {
|
|
|
|
cbDigiProbe1->setCurrentIndex(i);
|
|
|
|
dataTrace[2]->setName(cbDigiProbe1->currentText());
|
|
|
|
break;
|
2023-04-24 15:27:05 -04:00
|
|
|
}
|
2023-05-12 17:06:16 -04:00
|
|
|
}
|
2023-04-24 15:27:05 -04:00
|
|
|
|
2023-05-12 17:06:16 -04:00
|
|
|
enableSignalSlot = true;
|
|
|
|
}
|
2023-04-24 15:27:05 -04:00
|
|
|
|
2023-05-12 17:06:16 -04:00
|
|
|
void Scope::UpdatePSDPanel(){
|
|
|
|
enableSignalSlot = false;
|
|
|
|
|
|
|
|
printf("==== %s \n", __func__);
|
|
|
|
|
2023-05-15 17:18:53 -04:00
|
|
|
int ch = cbScopeCh->currentIndex();
|
2023-05-12 17:06:16 -04:00
|
|
|
|
2023-05-15 17:18:53 -04:00
|
|
|
uint32_t DPPAlg = digi[ID]->GetSettingFromMemory(DPP::DPPAlgorithmControl, ch);
|
|
|
|
if( Digitizer::ExtractBits(DPPAlg, DPP::Bit_DPPAlgorithmControl_PSD::Polarity) ){
|
|
|
|
cbPolarity->setCurrentIndex(1);
|
|
|
|
}else{
|
|
|
|
cbPolarity->setCurrentIndex(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
UpdateSpinBox(sbShortGate, DPP::PSD::ShortGateWidth);
|
|
|
|
UpdateSpinBox(sbLongGate, DPP::PSD::LongGateWidth);
|
|
|
|
UpdateSpinBox(sbGateOffset, DPP::PSD::GateOffset);
|
2023-05-12 17:06:16 -04:00
|
|
|
|
2023-05-15 17:18:53 -04:00
|
|
|
uint32_t BdCfg = digi[ID]->GetSettingFromMemory(DPP::BoardConfiguration, ch);
|
2023-05-12 17:06:16 -04:00
|
|
|
|
2023-05-15 17:18:53 -04:00
|
|
|
int temp = Digitizer::ExtractBits(BdCfg, DPP::Bit_BoardConfig::AnaProbe_PSD);
|
|
|
|
for( int i = 0; i < cbAnaProbe1->count(); i++){
|
|
|
|
if( cbAnaProbe1->itemData(i).toInt() == temp ) {
|
|
|
|
cbAnaProbe1->setCurrentIndex(i);
|
|
|
|
dataTrace[0]->setName(cbAnaProbe1->currentText());
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2023-05-16 17:21:40 -04:00
|
|
|
temp = Digitizer::ExtractBits(BdCfg, DPP::Bit_BoardConfig::DigiProbel1_PSD);
|
2023-05-15 17:18:53 -04:00
|
|
|
for( int i = 0; i < cbDigiProbe1->count(); i++){
|
|
|
|
if( cbDigiProbe1->itemData(i).toInt() == temp ) {
|
|
|
|
cbDigiProbe1->setCurrentIndex(i);
|
|
|
|
dataTrace[2]->setName(cbDigiProbe1->currentText());
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2023-05-16 17:21:40 -04:00
|
|
|
temp = Digitizer::ExtractBits(BdCfg, DPP::Bit_BoardConfig::DigiProbel2_PSD);
|
2023-05-15 17:18:53 -04:00
|
|
|
for( int i = 0; i < cbDigiProbe2->count(); i++){
|
|
|
|
if( cbDigiProbe2->itemData(i).toInt() == temp ) {
|
|
|
|
cbDigiProbe2->setCurrentIndex(i);
|
|
|
|
dataTrace[3]->setName(cbDigiProbe2->currentText());
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2023-04-20 18:15:30 -04:00
|
|
|
|
2023-04-24 15:27:05 -04:00
|
|
|
enableSignalSlot = true;
|
2023-04-20 18:15:30 -04:00
|
|
|
}
|
2023-04-21 18:10:12 -04:00
|
|
|
|
|
|
|
void Scope::ReadSettingsFromBoard(){
|
|
|
|
|
|
|
|
int ch = cbScopeCh->currentIndex();
|
|
|
|
|
2023-05-01 16:20:16 -04:00
|
|
|
digi[ID]->ReadRegister(DPP::RecordLength_G, ch);
|
|
|
|
digi[ID]->ReadRegister(DPP::PreTrigger, ch);
|
|
|
|
digi[ID]->ReadRegister(DPP::ChannelDCOffset, ch);
|
|
|
|
digi[ID]->ReadRegister(DPP::InputDynamicRange, ch);
|
|
|
|
digi[ID]->ReadRegister(DPP::BoardConfiguration, ch);
|
|
|
|
digi[ID]->ReadRegister(DPP::DPPAlgorithmControl, ch);
|
2023-04-21 18:10:12 -04:00
|
|
|
|
|
|
|
if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ){
|
|
|
|
|
2023-05-01 16:20:16 -04:00
|
|
|
digi[ID]->ReadRegister(DPP::PHA::InputRiseTime, ch);
|
|
|
|
digi[ID]->ReadRegister(DPP::PHA::TriggerThreshold, ch);
|
|
|
|
digi[ID]->ReadRegister(DPP::PHA::TriggerHoldOffWidth, ch);
|
|
|
|
digi[ID]->ReadRegister(DPP::PHA::TrapezoidRiseTime, ch);
|
|
|
|
digi[ID]->ReadRegister(DPP::PHA::TrapezoidFlatTop, ch);
|
|
|
|
digi[ID]->ReadRegister(DPP::PHA::DecayTime, ch);
|
|
|
|
digi[ID]->ReadRegister(DPP::PHA::PeakingTime, ch);
|
2023-04-21 18:10:12 -04:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2023-05-12 17:06:16 -04:00
|
|
|
if( digi[ID]->GetDPPType() == V1730_DPP_PSD_CODE){
|
|
|
|
|
|
|
|
digi[ID]->ReadRegister(DPP::PSD::ShortGateWidth);
|
|
|
|
digi[ID]->ReadRegister(DPP::PSD::LongGateWidth);
|
|
|
|
digi[ID]->ReadRegister(DPP::PSD::GateOffset);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2023-04-21 18:10:12 -04:00
|
|
|
UpdatePanelFromMomeory();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|