From 58e7b0084b882050715bc696c02a6457f733323b Mon Sep 17 00:00:00 2001 From: "carina@hades" Date: Mon, 9 Oct 2023 17:18:38 -0400 Subject: [PATCH] kind of finish the QDC setting, next scope --- ClassDigitizer.cpp | 17 +- DigiSettingsPanel.cpp | 630 +++++++++++++++++++++++++++++++++--------- DigiSettingsPanel.h | 4 +- FSUDAQ.cpp | 19 +- README.md | 1 + RegisterAddress.h | 26 +- test.cpp | 8 +- 7 files changed, 543 insertions(+), 162 deletions(-) diff --git a/ClassDigitizer.cpp b/ClassDigitizer.cpp index 2e3cd8e..d04f958 100644 --- a/ClassDigitizer.cpp +++ b/ClassDigitizer.cpp @@ -358,7 +358,7 @@ void Digitizer::StartACQ(){ //return; } - if( DPPType == V1730_DPP_PSD_CODE) bufferSize = 80 * 1024 * 1024; //TODO allocate 80 MB for PSD + if( DPPType == V1730_DPP_PSD_CODE) bufferSize = 160 * 1024 * 1024; //TODO allocate 80 MB for PSD data->AllocateMemory(bufferSize); ret = CAEN_DGTZ_SWStartAcquisition(handle); @@ -511,9 +511,14 @@ void Digitizer::WriteRegister (Reg registerAddress, uint32_t value, int ch, bool if( ret == 0 && isSave2MemAndFile && registerAddress.GetRWType() == RW::ReadWrite) { if( ch < 0 ) { - for(int i = 0; i < NChannel; i++){ - SetSettingToMemory(registerAddress, value, i); - SaveSettingToFile(registerAddress, value, i); + if( registerAddress.GetAddress() < 0x8000 ){ + for(int i = 0; i < NChannel; i++){ + SetSettingToMemory(registerAddress, value, i); + SaveSettingToFile(registerAddress, value, i); + } + }else{ + SetSettingToMemory(registerAddress, value, 0); + SaveSettingToFile(registerAddress, value, 0); } }else{ SetSettingToMemory(registerAddress, value, ch); @@ -536,8 +541,8 @@ uint32_t Digitizer::ReadRegister(Reg registerAddress, unsigned short ch, bool is ret = CAEN_DGTZ_ReadRegister(handle, registerAddress.ActualAddress(ch), &returnData); - //if( ret == 0 && isSave2MemAndFile) { - if( isSave2MemAndFile) { + if( ret == 0 && isSave2MemAndFile) { + //if( isSave2MemAndFile) { SetSettingToMemory(registerAddress, returnData, ch); SaveSettingToFile(registerAddress, returnData, ch); } diff --git a/DigiSettingsPanel.cpp b/DigiSettingsPanel.cpp index 55aa469..bd83d22 100644 --- a/DigiSettingsPanel.cpp +++ b/DigiSettingsPanel.cpp @@ -72,9 +72,9 @@ DigiSettingsPanel::DigiSettingsPanel(Digitizer ** digi, unsigned int nDigi, QStr SetUpInfo( "DPP Type ", digi[ID]->GetDPPString(), infoLayout[ID], 0, 2); SetUpInfo("Link Type ", digi[ID]->GetLinkType() == CAEN_DGTZ_USB ? "USB" : "Optical Link" , infoLayout[ID], 0, 4); - SetUpInfo( "S/N No. ", std::to_string(digi[ID]->GetSerialNumber()), infoLayout[ID], 1, 0); - SetUpInfo( "No. Ch. ", std::to_string(digi[ID]->GetNChannels()), infoLayout[ID], 1, 2); - SetUpInfo("Sampling Rate ", std::to_string((int) digi[ID]->GetTick2ns()) + " ns = " + std::to_string( (int) (1000/digi[ID]->GetTick2ns())) + " MHz" , infoLayout[ID], 1, 4); + SetUpInfo( "S/N No. ", std::to_string(digi[ID]->GetSerialNumber()), infoLayout[ID], 1, 0); + SetUpInfo("No. Input Ch. ", std::to_string(digi[ID]->GetNChannels()), infoLayout[ID], 1, 2); + SetUpInfo("Sampling Rate ", std::to_string((int) digi[ID]->GetTick2ns()) + " ns = " + std::to_string( (1000/digi[ID]->GetTick2ns())) + " MHz" , infoLayout[ID], 1, 4); SetUpInfo("ADC bit ", std::to_string(digi[ID]->GetADCBits()), infoLayout[ID], 2, 0); SetUpInfo("ROC version ", digi[ID]->GetROCVersion(), infoLayout[ID], 2, 2); @@ -284,6 +284,7 @@ DigiSettingsPanel::DigiSettingsPanel(Digitizer ** digi, unsigned int nDigi, QStr if( digi[iDigi]->GetDPPType() == V1730_DPP_PHA_CODE) SetUpChannel_PHA(); if( digi[iDigi]->GetDPPType() == V1730_DPP_PSD_CODE) SetUpChannel_PSD(); + if( digi[iDigi]->GetDPPType() == V1740_DPP_QDC_CODE) SetUpChannel_QDC(); } @@ -399,7 +400,7 @@ void DigiSettingsPanel::SetUpComboBox(RComboBox * &cb, QString label, QGridLayou } -void DigiSettingsPanel::SetUpSpinBox(RSpinBox * &sb, QString label, QGridLayout *gLayout, int row, int col, Reg para, int ch){ +void DigiSettingsPanel::SetUpSpinBox(RSpinBox * &sb, QString label, QGridLayout *gLayout, int row, int col, Reg para, int ch, bool isBoard){ QLabel * lab = new QLabel(label, this); lab->setAlignment(Qt::AlignRight | Qt::AlignCenter); gLayout->addWidget(lab, row, col); @@ -408,7 +409,7 @@ void DigiSettingsPanel::SetUpSpinBox(RSpinBox * &sb, QString label, QGridLayout gLayout->addWidget(sb, row, col + 1); sb->setMinimum(0); - if( ch == -1 ) sb->setMaximum(-1); + if( ch == -1 && !isBoard) sb->setMaximum(-1); if( para.GetPartialStep() == -1 ) { sb->setSingleStep(1); @@ -442,6 +443,7 @@ void DigiSettingsPanel::SetUpSpinBox(RSpinBox * &sb, QString label, QGridLayout sb->setStyleSheet(""); int chID = ch < 0 ? chSelection[ID]->currentData().toInt() : ch; + if( isBoard ) chID = -1; if( para == DPP::ChannelDCOffset ){ digi[ID]->WriteRegister(para, 0xFFFF * (1.0 - sb->value() / 100. ), chID); @@ -466,8 +468,11 @@ void DigiSettingsPanel::SetUpSpinBox(RSpinBox * &sb, QString label, QGridLayout uint32_t bit = para.GetPartialStep() == -1 ? sb->value() : sb->value() / para.GetPartialStep() / digi[ID]->GetTick2ns(); - digi[ID]->WriteRegister(para, bit, chID); - if( para.IsCoupled() == true && chID >= 0 ) digi[ID]->WriteRegister(para, bit, chID%2 == 0 ? chID + 1 : chID - 1); + if( para.IsCoupled() == true && chID >= 0 ) { + digi[ID]->WriteRegister(para, bit, chID%2 == 0 ? chID + 1 : chID - 1); + }else{ + digi[ID]->WriteRegister(para, bit, chID); + } UpdatePanelFromMemory(); emit UpdateOtherPanels(); @@ -1233,7 +1238,11 @@ void DigiSettingsPanel::SetUpChannelMask(unsigned int digiID){ for( int i = 0; i < nChGrp; i++){ bnChEnableMask[digiID][i] = new QPushButton(this); bnChEnableMask[digiID][i]->setFixedSize(QSize(20,20)); - bnChEnableMask[digiID][i]->setToolTip("Ch-" + QString::number(i)); + if( digi[digiID]->GetDPPType() == DPPType::DPP_QDC_CODE ){ + bnChEnableMask[digiID][i]->setToolTip("Ch:" + QString::number(8*i) + "-" + QString::number(8*(i+1)-1)); + }else{ + bnChEnableMask[digiID][i]->setToolTip("Ch:" + QString::number(i)); + } bnChEnableMask[digiID][i]->setToolTipDuration(-1); QLabel * chIDLabel = new QLabel(QString::number(i), this); chIDLabel->setAlignment(Qt::AlignBottom | Qt::AlignHCenter); @@ -1271,7 +1280,7 @@ void DigiSettingsPanel::SetUpChannelMask(unsigned int digiID){ } void DigiSettingsPanel::SetUpACQReadOutTab(){ - SetUpSpinBox(sbAggNum[ID], "Agg. Num. / read ", bdACQLayout[ID], 0, 0, DPP::MaxAggregatePerBlockTransfer); + SetUpSpinBox(sbAggNum[ID], "Agg. Num. / read ", bdACQLayout[ID], 0, 0, DPP::MaxAggregatePerBlockTransfer, -1, true); SetUpComboBox(cbAggOrg[ID], "Aggregate Organization ", bdACQLayout[ID], 1, 0, DPP::AggregateOrganization, 0); SetUpComboBoxBit(cbStartStopMode[ID], "Start/Stop Mode ", bdACQLayout[ID], 2, 0, DPP::Bit_AcquistionControl::ListStartStopMode, @@ -1283,7 +1292,7 @@ void DigiSettingsPanel::SetUpACQReadOutTab(){ SetUpComboBoxBit(cbPLLRefClock[ID], "PLL Ref. Clock ", bdACQLayout[ID], 4, 0, DPP::Bit_AcquistionControl::ListPLLRef, DPP::AcquisitionControl, DPP::Bit_AcquistionControl::PLLRef, 1, 0); - SetUpSpinBox(sbRunDelay[ID], "Run Delay [ns] ", bdACQLayout[ID], 5, 0, DPP::RunStartStopDelay); + SetUpSpinBox(sbRunDelay[ID], "Run Delay [ns] ", bdACQLayout[ID], 5, 0, DPP::RunStartStopDelay, -1, true); {//======================= QGroupBox * readOutGroup = new QGroupBox("Readout Control (VME only)",this); @@ -2366,14 +2375,14 @@ void DigiSettingsPanel::SetUpChannel_PSD(){ void DigiSettingsPanel::SetUpBoard_QDC(){ printf("============== %s \n", __func__); - SetUpCheckBox(chkTraceRecording[ID], "Record Trace ", bdCfgLayout[ID], 1, 0, DPP::BoardConfiguration, DPP::Bit_BoardConfig::RecordTrace); - SetUpCheckBox(chkEnableExtra2[ID], "Enable Extra ", bdCfgLayout[ID], 2, 0, DPP::BoardConfiguration, DPP::Bit_BoardConfig::EnableExtra2); + SetUpCheckBox(chkTraceRecording[ID], "Record Trace ", bdCfgLayout[ID], 1, 1, DPP::BoardConfiguration, DPP::Bit_BoardConfig::RecordTrace); + SetUpCheckBox(chkEnableExtra2[ID], "Enable Extra ", bdCfgLayout[ID], 1, 2, DPP::BoardConfiguration, DPP::Bit_BoardConfig::EnableExtra2); SetUpComboBoxBit(cbAnaProbe1[ID], "Ana. Probe ", bdCfgLayout[ID], 3, 0, DPP::Bit_BoardConfig::ListAnaProbe_QDC, DPP::BoardConfiguration, DPP::Bit_BoardConfig::AnalogProbe1, 1, 0); SetUpComboBoxBit(cbExtTriggerMode[ID], "Ext. Trig. Mode ", bdCfgLayout[ID], 4, 0, DPP::Bit_BoardConfig::ListExtTriggerMode_QDC, DPP::BoardConfiguration, DPP::Bit_BoardConfig::ExtTriggerMode_QDC, 1, 0); - SetUpSpinBox(sbRecordLength_QDC[ID], "Record Length [ns] ", bdCfgLayout[ID], 5, 0, DPP::QDC::RecordLength); - SetUpSpinBox(sbEventPreAgg_QDC[ID], "Event pre Agg. ", bdCfgLayout[ID], 6, 0, DPP::QDC::NumberEventsPerAggregate); + SetUpSpinBox(sbRecordLength_QDC[ID], "Record Length [ns] ", bdCfgLayout[ID], 5, 0, DPP::QDC::RecordLength, -1, true); + SetUpSpinBox(sbEventPreAgg_QDC[ID], "Event pre Agg. ", bdCfgLayout[ID], 6, 0, DPP::QDC::NumberEventsPerAggregate, -1, true); } @@ -2424,6 +2433,14 @@ void DigiSettingsPanel::SetUpChannel_QDC(){ connect(chSelection[ID], &RComboBox::currentIndexChanged, this, [=](){ SyncAllChannelsTab_QDC(); + + int grpID = chSelection[ID]->currentIndex() - 1; + + for( int i = 0; i < 8; i ++){ + lbSubCh[ID][i] ->setText((grpID == -1 ? "Sub-Ch:" : "Ch:" )+ QString::number(grpID < 0 ? i : grpID*8 + i)); + lbSubCh2[ID][i]->setText((grpID == -1 ? "Sub-Ch:" : "Ch:" )+ QString::number(grpID < 0 ? i : grpID*8 + i)); + } + }); } @@ -2435,39 +2452,35 @@ void DigiSettingsPanel::SetUpChannel_QDC(){ inputLayout->setSpacing(2); SetUpSpinBox(sbPreTrigger[ID][numGroup], "Pre-Trigger [ns] : ", inputLayout, 1, 0, DPP::QDC::PreTrigger); - SetUpSpinBox(sbDCOffset[ID][numGroup], "DC Offset [%] : ", inputLayout, 2, 0, DPP::QDC::DCOffset); - SetUpComboBoxBit(cbPolarity[ID][numGroup], "Polarity : ", inputLayout, 2, 2, DPP::QDC::Bit_DPPAlgorithmControl::ListPolarity, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::Polarity); - SetUpComboBoxBit(cbRCCR2Smoothing[ID][numGroup], "Input Smoothing : ", inputLayout, 3, 0, DPP::QDC::Bit_DPPAlgorithmControl::ListInputSmoothingFactor, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::InputSmoothingFactor); + SetUpSpinBox(sbDCOffset[ID][numGroup], "DC Offset [%] : ", inputLayout, 1, 2, DPP::QDC::DCOffset); + SetUpComboBoxBit(cbPolarity[ID][numGroup], "Polarity : ", inputLayout, 2, 0, DPP::QDC::Bit_DPPAlgorithmControl::ListPolarity, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::Polarity); + SetUpComboBoxBit(cbRCCR2Smoothing[ID][numGroup], "Input Smoothing : ", inputLayout, 2, 2, DPP::QDC::Bit_DPPAlgorithmControl::ListInputSmoothingFactor, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::InputSmoothingFactor); - SetUpSpinBox(sbFixedBaseline[ID][numGroup], "Fixed Baseline : ", inputLayout, 4, 0, DPP::QDC::FixedBaseline); - SetUpComboBoxBit(cbBaseLineAvg[ID][numGroup], "Baseline Avg. : ", inputLayout, 4, 2, DPP::QDC::Bit_DPPAlgorithmControl::ListBaselineAvg, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::BaselineAvg); + SetUpSpinBox(sbFixedBaseline[ID][numGroup], "Fixed Baseline : ", inputLayout, 3, 0, DPP::QDC::FixedBaseline); + SetUpComboBoxBit(cbBaseLineAvg[ID][numGroup], "Baseline Avg. : ", inputLayout, 3, 2, DPP::QDC::Bit_DPPAlgorithmControl::ListBaselineAvg, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::BaselineAvg); connect(cbBaseLineAvg[ID][numGroup], &RComboBox::currentIndexChanged, this, [=](){ sbFixedBaseline[ID][numGroup]->setEnabled( cbBaseLineAvg[ID][numGroup]->currentData().toInt() == 0); }); - /// DC offset - QWidget * dcWidget = new QWidget(inputBox); - inputLayout->addWidget(dcWidget, 15, 0, 1, 4); + QGroupBox * dcWidget = new QGroupBox("Fine DC offset [LSB]",inputBox); + inputLayout->addWidget(dcWidget, 4, 0, 1, 4); QGridLayout * dcLayout = new QGridLayout(dcWidget); dcLayout->setSpacing(2); - QLabel * lb1 = new QLabel("DC offset [LSB]", this); - lb1->setAlignment(Qt::AlignRight | Qt::AlignCenter); - dcLayout->addWidget(lb1, 0, 0, 4, 0); - int grpID = chSelection[ID]->currentIndex(); for( int i = 0; i < 8; i ++){ - QLabel * lb = new QLabel(QString::number(grpID < 0 ? i : grpID*8 + i), dcWidget); - dcLayout->addWidget(lb, 1 + i%4, 2*(i/4) ); + lbSubCh[ID][i] = new QLabel("Sub-Ch:" + QString::number(grpID < 0 ? i : grpID*8 + i), dcWidget); + lbSubCh[ID][i]->setAlignment(Qt::AlignRight | Qt::AlignCenter); + dcLayout->addWidget(lbSubCh[ID][i], 1 + i/4, 2*(i%4) ); - sbSubChOffset[ID][8][i] = new RSpinBox(this); - dcLayout->addWidget(lb, 1 + i%4, 2*(i/4) + 1 ); + sbSubChOffset[ID][8][i] = new RSpinBox(inputBox); + dcLayout->addWidget(sbSubChOffset[ID][8][i], 1 + i/4, 2*(i%4) + 1 ); - sbSubChOffset[ID][8][i]->setMinimum(0); + sbSubChOffset[ID][8][i]->setMinimum(-1); sbSubChOffset[ID][8][i]->setMaximum(0xFF); connect(sbSubChOffset[ID][8][i], &RSpinBox::valueChanged, this, [=](){ @@ -2478,18 +2491,20 @@ void DigiSettingsPanel::SetUpChannel_QDC(){ connect(sbSubChOffset[ID][8][i], &RSpinBox::returnPressed, this, [=](){ if( !enableSignalSlot ) return; - int grpID = chSelection[ID]->currentIndex(); + int grpID = chSelection[ID]->currentIndex() - 1; uint32_t value = sbSubChOffset[ID][8][i]->value(); - value = value << (2*(i%4)); - + value = value << (8*(i%4)); + uint32_t mask = 0xFF << (8*(i%4)); + uint32_t orgValue = 0; sbSubChOffset[ID][8][i]->setStyleSheet(""); - //TODO, that will overwrite other subCh if( i < 4 ){ - digi[ID]->WriteRegister(DPP::QDC::DCOffset_LowCh, value, grpID); + orgValue = digi[ID]->GetSettingFromMemory(DPP::QDC::DCOffset_LowCh, grpID); + digi[ID]->WriteRegister(DPP::QDC::DCOffset_LowCh, value + (orgValue & ~mask), grpID); }else{ - digi[ID]->WriteRegister(DPP::QDC::DCOffset_HighCh, value, grpID); + orgValue = digi[ID]->GetSettingFromMemory(DPP::QDC::DCOffset_HighCh, grpID); + digi[ID]->WriteRegister(DPP::QDC::DCOffset_HighCh, value + (orgValue & ~mask), grpID); } UpdatePanelFromMemory(); @@ -2509,34 +2524,32 @@ void DigiSettingsPanel::SetUpChannel_QDC(){ QGridLayout * triggerLayout = new QGridLayout(triggerBox); triggerLayout->setSpacing(2); - SetUpComboBoxBit(cbTrigMode[ID][numGroup], "Trig. Mode : ", triggerLayout, 1, 0, DPP::QDC::Bit_DPPAlgorithmControl::ListTrigMode, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::TriggerMode); - SetUpCheckBox(chkDisableSelfTrigger[ID][numGroup], "Disable Self Trigger ", triggerLayout, 2, 0, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::DisableSelfTrigger); - SetUpCheckBox(chkDisableTriggerHysteresis[ID][numGroup], "Disbale Trig. Hysteresis ", triggerLayout, 3, 0, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::DisableTriggerHysteresis, -1, 2); - SetUpSpinBox(sbTriggerHoldOff[ID][numGroup], "Trig. Holdoff [ns] : ", triggerLayout, 4, 0, DPP::QDC::TriggerHoldOffWidth); - SetUpSpinBox(sbShapedTrigWidth[ID][numGroup], "Trig. Out Width [ns] : ", triggerLayout, 5, 0, DPP::QDC::TRGOUTWidth); + SetUpCheckBox(chkDisableSelfTrigger[ID][numGroup], "Disable Self Trigger ", triggerLayout, 0, 1, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::DisableSelfTrigger); + SetUpCheckBox(chkDisableTriggerHysteresis[ID][numGroup], "Disbale Trig. Hysteresis ", triggerLayout, 2, 1, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::DisableTriggerHysteresis, -1, 2); + SetUpComboBoxBit(cbTrigMode[ID][numGroup], "Trig. Mode : ", triggerLayout, 0, 2, DPP::QDC::Bit_DPPAlgorithmControl::ListTrigMode, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::TriggerMode); + SetUpSpinBox(sbTriggerHoldOff[ID][numGroup], "Trig. Holdoff [ns] : ", triggerLayout, 2, 2, DPP::QDC::TriggerHoldOffWidth); + SetUpSpinBox(sbShapedTrigWidth[ID][numGroup], "Trig. Out Width [ns] : ", triggerLayout, 3, 2, DPP::QDC::TRGOUTWidth); /// Trigger Threshold - QWidget * widget = new QWidget(triggerBox); - triggerLayout->addWidget(widget, 6, 0, 1, 4); + QGroupBox * widget = new QGroupBox("Threshold [LSB]", triggerBox); + triggerLayout->addWidget(widget, 4, 0, 1, 4); QGridLayout * dcLayout = new QGridLayout(widget); dcLayout->setSpacing(2); - QLabel * lb1 = new QLabel("Threshold", this); - lb1->setAlignment(Qt::AlignRight | Qt::AlignCenter); - dcLayout->addWidget(lb1, 0, 0, 4, 0); - int grpID = chSelection[ID]->currentIndex(); for( int i = 0; i < 8; i ++){ - QLabel * lb = new QLabel(QString::number(grpID < 0 ? i : grpID*8 + i), widget); - dcLayout->addWidget(lb, 1 + i%4, 2*(i/4) ); + lbSubCh2[ID][i] = new QLabel("Sub-Ch:" + QString::number(grpID < 0 ? i : grpID*8 + i), widget); + lbSubCh2[ID][i]->setAlignment(Qt::AlignRight | Qt::AlignCenter); + dcLayout->addWidget(lbSubCh2[ID][i], 1 + i/4, 2*(i%4) ); - sbSubChOffset[ID][8][i] = new RSpinBox(this); - dcLayout->addWidget(lb, 1 + i%4, 2*(i/4) + 1 ); + sbSubChThreshold[ID][8][i] = new RSpinBox(triggerBox); + dcLayout->addWidget(sbSubChThreshold[ID][8][i], 1 + i/4, 2*(i%4) + 1 ); - sbSubChThreshold[ID][8][i]->setMinimum(0); - sbSubChThreshold[ID][8][i]->setMaximum(0xFFFF); + sbSubChThreshold[ID][8][i]->setMinimum(-1); + sbSubChThreshold[ID][8][i]->setMaximum(0x1FFF); + sbSubChThreshold[ID][8][i]->setSingleStep(1); connect(sbSubChThreshold[ID][8][i], &RSpinBox::valueChanged, this, [=](){ if( !enableSignalSlot ) return; @@ -2546,7 +2559,7 @@ void DigiSettingsPanel::SetUpChannel_QDC(){ connect(sbSubChThreshold[ID][8][i], &RSpinBox::returnPressed, this, [=](){ if( !enableSignalSlot ) return; - int grpID = chSelection[ID]->currentIndex(); + int grpID = chSelection[ID]->currentIndex() - 1; uint32_t value = sbSubChThreshold[ID][8][i]->value(); @@ -2579,13 +2592,14 @@ void DigiSettingsPanel::SetUpChannel_QDC(){ qdcLayout->setSpacing(2); - SetUpSpinBox(sbShortGate[ID][numGroup], "Gate Width [ns] : ", qdcLayout, 5, 0, DPP::QDC::GateWidth); - SetUpSpinBox(sbGateOffset[ID][numGroup], "Gate Offset [ns] : ", qdcLayout, 6, 0, DPP::QDC::GateOffset); + SetUpSpinBox(sbShortGate[ID][numGroup], "Gate Width [ns] : ", qdcLayout, 0, 0, DPP::QDC::GateWidth); + SetUpSpinBox(sbGateOffset[ID][numGroup], "Gate Offset [ns] : ", qdcLayout, 0, 2, DPP::QDC::GateOffset); - SetUpCheckBox(chkOverthreshold[ID][numGroup], "Enable OverThreshold Width ", qdcLayout, 9, 0, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::OverThresholdWitdhEnable); - SetUpSpinBox(sbOverThresholdWidth[ID][numGroup], "OverThreshold Width [ns] : ", qdcLayout, 9, 2, DPP::QDC::OverThresholdWidth); + SetUpCheckBox(chkOverthreshold[ID][numGroup], "Enable OverThreshold Width ", qdcLayout, 1, 1, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::OverThresholdWitdhEnable); + SetUpSpinBox(sbOverThresholdWidth[ID][numGroup], "OverThreshold Width [ns] : ", qdcLayout, 1, 2, DPP::QDC::OverThresholdWidth); - SetUpComboBoxBit(cbChargeSensitivity[ID][numGroup], "Charge Sen. : ", qdcLayout, 10, 0, DPP::QDC::Bit_DPPAlgorithmControl::ListChargeSensitivity, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::ChargeSensitivity); + SetUpCheckBox(chkChargePedestal[ID][numGroup], "Enable Charge Pedes.", qdcLayout, 2, 1, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::ChargePedestal); + SetUpComboBoxBit(cbChargeSensitivity[ID][numGroup], "Charge Sen. : ", qdcLayout, 2, 2, DPP::QDC::Bit_DPPAlgorithmControl::ListChargeSensitivity, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::ChargeSensitivity); } @@ -2596,9 +2610,11 @@ void DigiSettingsPanel::SetUpChannel_QDC(){ QGridLayout * otherLayout = new QGridLayout(otherBox); otherLayout->setSpacing(2); - SetUpCheckBox(chkTestPule[ID][numGroup], "Int. Test Pulse", otherLayout, 1, 0, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::InternalTestPulse); + SetUpCheckBox(chkTestPule[ID][numGroup], "Int. Test Pulse", otherLayout, 1, 1, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::InternalTestPulse); SetUpComboBoxBit(cbTestPulseRate[ID][numGroup], "Test Pulse Rate : ", otherLayout, 1, 2, DPP::QDC::Bit_DPPAlgorithmControl::ListTestPulseRate, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::TestPulseRate); + SetUpSpinBox(sbNumEventAgg[ID][numGroup], "Event pre Agg. : ", otherLayout, 2, 2, DPP::QDC::NumberEventsPerAggregate); + } {//^================== status @@ -2667,16 +2683,16 @@ void DigiSettingsPanel::SetUpChannel_QDC(){ QLabel * lb6 = new QLabel("Polarity", this); lb6->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb6, 0, 6); QLabel * lb7 = new QLabel("Input Smoothing", this); lb7->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb7, 0, 8); } - SetUpSpinBox(sbDCOffset[ID][ch], "", tabLayout, ch + 1, 3, DPP::QDC::DCOffset, ch); - SetUpSpinBox(sbPreTrigger[ID][ch], "", tabLayout, ch + 1, 5, DPP::QDC::PreTrigger, ch); - SetUpComboBoxBit(cbPolarity[ID][ch], "", tabLayout, ch + 1, 7, DPP::QDC::Bit_DPPAlgorithmControl::ListPolarity, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::Polarity, 1, ch); - SetUpComboBoxBit(cbRCCR2Smoothing[ID][ch], "", tabLayout, ch + 1, 9, DPP::QDC::Bit_DPPAlgorithmControl::ListInputSmoothingFactor, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::InputSmoothingFactor, 1, ch); + SetUpSpinBox(sbDCOffset[ID][ch], "", tabLayout, ch + 1, 1, DPP::QDC::DCOffset, ch); + SetUpSpinBox(sbPreTrigger[ID][ch], "", tabLayout, ch + 1, 3, DPP::QDC::PreTrigger, ch); + SetUpComboBoxBit(cbPolarity[ID][ch], "", tabLayout, ch + 1, 5, DPP::QDC::Bit_DPPAlgorithmControl::ListPolarity, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::Polarity, 1, ch); + SetUpComboBoxBit(cbRCCR2Smoothing[ID][ch], "", tabLayout, ch + 1, 7, DPP::QDC::Bit_DPPAlgorithmControl::ListInputSmoothingFactor, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::InputSmoothingFactor, 1, ch); } if ( i == 1 ){ if( ch == 0 ){ QLabel * lb1 = new QLabel("Fixed Baseline", this); lb1->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb1, 0, 2); - QLabel * lb2 = new QLabel("Baseline Avg. ", this); lb2->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb2, 0, 2); + QLabel * lb2 = new QLabel("Baseline Avg. ", this); lb2->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb2, 0, 4); } SetUpSpinBox(sbFixedBaseline[ID][ch], "", tabLayout, ch + 1, 1, DPP::QDC::FixedBaseline, ch); @@ -2687,13 +2703,15 @@ void DigiSettingsPanel::SetUpChannel_QDC(){ for( int subCh = 0; subCh < 8; subCh ++) { if( ch == 0 ){ - QLabel * lb0 = new QLabel(QString::number(subCh), this); lb0->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb0, 0, subCh+1); + QLabel * lb0 = new QLabel("SubCh-" + QString::number(subCh), this); lb0->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb0, 0, subCh+1); } sbSubChOffset[ID][ch][subCh] = new RSpinBox(this); + sbSubChOffset[ID][ch][subCh]->setFixedWidth(100); tabLayout->addWidget(sbSubChOffset[ID][ch][subCh], ch + 1, subCh + 1); sbSubChOffset[ID][ch][subCh]->setMinimum(0); sbSubChOffset[ID][ch][subCh]->setMaximum(0xFF); + sbSubChOffset[ID][ch][subCh]->setSingleStep(1); connect(sbSubChOffset[ID][ch][subCh], &RSpinBox::valueChanged, this, [=](){ @@ -2705,14 +2723,18 @@ void DigiSettingsPanel::SetUpChannel_QDC(){ if( !enableSignalSlot ) return; uint32_t value = sbSubChOffset[ID][ch][subCh]->value(); - value = value << (2*(i%4)); + uint32_t mask = 0xFF << (8*(subCh%4)); + value = value << (8*(subCh%4)); + uint32_t orgValue = 0; sbSubChOffset[ID][ch][subCh]->setStyleSheet(""); - //TODO, that will overwrite other subCh + if( subCh < 4 ){ - digi[ID]->WriteRegister(DPP::QDC::DCOffset_LowCh, value, ch); + orgValue = digi[ID]->GetSettingFromMemory(DPP::QDC::DCOffset_LowCh, ch); + digi[ID]->WriteRegister(DPP::QDC::DCOffset_LowCh, value + (orgValue & ~mask), ch); }else{ - digi[ID]->WriteRegister(DPP::QDC::DCOffset_HighCh, value, ch); + orgValue = digi[ID]->GetSettingFromMemory(DPP::QDC::DCOffset_HighCh, ch); + digi[ID]->WriteRegister(DPP::QDC::DCOffset_HighCh, value + (orgValue & ~mask), ch); } UpdatePanelFromMemory(); @@ -2720,7 +2742,7 @@ void DigiSettingsPanel::SetUpChannel_QDC(){ return; }); - }/// end of subCh + };/// end of subCh } } @@ -2729,6 +2751,201 @@ void DigiSettingsPanel::SetUpChannel_QDC(){ } + {//^================================== Trigger + + QVBoxLayout *trigLayout = new QVBoxLayout(chTrig); + + QTabWidget * trigTab = new QTabWidget(this); + trigLayout->addWidget(trigTab); + + QStringList tabName = {"Common Settings", "Threshold", "Others"}; + + const int nTab = tabName.count(); + + QWidget ** tabID = new QWidget * [nTab]; + + for( int i = 0; i < nTab; i++){ + tabID [i] = new QWidget(this); + trigTab->addTab(tabID[i], tabName[i]); + + QGridLayout * tabLayout = new QGridLayout(tabID[i]); + tabLayout->setSpacing(2); + tabLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft); + + QLabel * lb0 = new QLabel("Ch.", this); lb0->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb0, 0, 0); + + for( int ch = 0; ch < digi[ID]->GetRegChannels(); ch++){ + QLabel * chid = new QLabel(QString::number(ch), this); + chid->setAlignment(Qt::AlignRight | Qt::AlignCenter); + chid->setFixedWidth(20); + tabLayout->addWidget(chid, ch + 1, 0); + + if( i == 0 ){ + if( ch == 0 ){ + QLabel * lb0 = new QLabel("Trig Mode", this); lb0->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb0, 0, 2); + QLabel * lb3 = new QLabel("Tigger Hold-off [ns]", this); lb3->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb3, 0, 4); + QLabel * lb4 = new QLabel("Local Trig. Valid. ", this); lb4->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb4, 0, 6); + } + + SetUpComboBoxBit(cbTrigMode[ID][ch], "", tabLayout, ch + 1, 1, DPP::QDC::Bit_DPPAlgorithmControl::ListTrigMode, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::TriggerMode, 1, ch); + SetUpSpinBox(sbTriggerHoldOff[ID][ch], "", tabLayout, ch + 1, 3, DPP::QDC::TriggerHoldOffWidth, ch); + SetUpSpinBox(sbShapedTrigWidth[ID][ch], "", tabLayout, ch + 1, 4, DPP::QDC::TRGOUTWidth, ch); + + + } + + if( i == 1 ){ + for( int subCh = 0; subCh < 8; subCh ++) { + if( ch == 0 ){ + QLabel * lb0 = new QLabel("SubCh-" + QString::number(subCh), this); lb0->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb0, 0, subCh+1); + } + + sbSubChThreshold[ID][ch][subCh] = new RSpinBox(this); + sbSubChThreshold[ID][ch][subCh]->setFixedWidth(100); + tabLayout->addWidget(sbSubChThreshold[ID][ch][subCh], ch + 1, subCh + 1); + sbSubChThreshold[ID][ch][subCh]->setMinimum(0); + sbSubChThreshold[ID][ch][subCh]->setMaximum(0xFFF); + sbSubChThreshold[ID][ch][subCh]->setSingleStep(1); + + connect(sbSubChThreshold[ID][ch][subCh], &RSpinBox::valueChanged, this, [=](){ + if( !enableSignalSlot ) return; + sbSubChThreshold[ID][ch][subCh]->setStyleSheet("color : blue;"); + }); + + connect(sbSubChThreshold[ID][ch][subCh], &RSpinBox::returnPressed, this, [=](){ + if( !enableSignalSlot ) return; + + uint32_t value = sbSubChThreshold[ID][ch][subCh]->value(); + sbSubChThreshold[ID][ch][subCh]->setStyleSheet(""); + + switch(subCh){ + case 0: digi[ID]->WriteRegister(DPP::QDC::TriggerThreshold_sub0, value, ch); break; + case 1: digi[ID]->WriteRegister(DPP::QDC::TriggerThreshold_sub1, value, ch); break; + case 2: digi[ID]->WriteRegister(DPP::QDC::TriggerThreshold_sub2, value, ch); break; + case 3: digi[ID]->WriteRegister(DPP::QDC::TriggerThreshold_sub3, value, ch); break; + case 4: digi[ID]->WriteRegister(DPP::QDC::TriggerThreshold_sub4, value, ch); break; + case 5: digi[ID]->WriteRegister(DPP::QDC::TriggerThreshold_sub5, value, ch); break; + case 6: digi[ID]->WriteRegister(DPP::QDC::TriggerThreshold_sub6, value, ch); break; + case 7: digi[ID]->WriteRegister(DPP::QDC::TriggerThreshold_sub7, value, ch); break; + } + + UpdatePanelFromMemory(); + emit UpdateOtherPanels(); + return; + + }); + };/// end of subCh + } + + if( i == 2 ){ + + SetUpCheckBox(chkDisableSelfTrigger[ID][ch], "Disable Self Trigger ", tabLayout, ch+1, 1, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::DisableSelfTrigger, ch); + SetUpCheckBox(chkDisableTriggerHysteresis[ID][ch], "Disbale Trig. Hysteresis ", tabLayout, ch+1, 3, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::DisableTriggerHysteresis, ch, 2); + SetUpSpinBox(sbNumEventAgg[ID][ch], "Event pre Agg. : ", tabLayout, ch+1, 5, DPP::QDC::NumberEventsPerAggregate, ch); + + } + + } + } + } + +{//^================================== QDC + + QVBoxLayout *trapLayout = new QVBoxLayout(chTrap); + + QTabWidget * trapTab = new QTabWidget(this); + trapLayout->addWidget(trapTab); + + QStringList tabName = {"Common Settings", "OverThreshold"}; + + const int nTab = tabName.count(); + + QWidget ** tabID = new QWidget * [nTab]; + + for( int i = 0; i < nTab; i++){ + tabID [i] = new QWidget(this); + trapTab->addTab(tabID[i], tabName[i]); + + QGridLayout * tabLayout = new QGridLayout(tabID[i]); + tabLayout->setSpacing(2); + tabLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft); + + QLabel * lb0 = new QLabel("Ch.", this); lb0->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb0, 0, 0); + + for( int ch = 0; ch < digi[ID]->GetRegChannels(); ch++){ + + QLabel * chid = new QLabel(QString::number(ch), this); + chid->setAlignment(Qt::AlignRight | Qt::AlignCenter); + chid->setFixedWidth(20); + tabLayout->addWidget(chid, ch + 1, 0); + + + if( i == 0 ) { + if( ch == 0 ){ + QLabel * lb1 = new QLabel("Gate Width [ns]", this); lb1->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb1, 0, 2); + QLabel * lb3 = new QLabel("Gate Offset [ns]", this); lb3->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb3, 0, 4); + QLabel * lb2 = new QLabel("Charge Sen.", this); lb2->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb2, 0, 6); + } + + SetUpSpinBox(sbShortGate[ID][ch], "", tabLayout, ch + 1, 1, DPP::QDC::GateWidth, ch); + SetUpSpinBox(sbGateOffset[ID][ch], "", tabLayout, ch + 1, 3, DPP::QDC::GateOffset, ch); + SetUpComboBoxBit(cbChargeSensitivity[ID][ch], "", tabLayout, ch + 1, 5, DPP::QDC::Bit_DPPAlgorithmControl::ListChargeSensitivity, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::ChargeSensitivity, 1, ch); + SetUpCheckBox(chkChargePedestal[ID][ch], "Enable Charge Pedes.", tabLayout, ch + 1, 7, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::ChargePedestal, ch); + } + + if ( i == 1 ){ + if( ch == 0 ){ + QLabel * lb1 = new QLabel("CFD Delay [ns]", this); lb1->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb1, 0, 2); + } + + SetUpCheckBox(chkOverthreshold[ID][ch], "Enable OverThreshold Width ", tabLayout, ch + 1, 1, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::OverThresholdWitdhEnable, ch); + SetUpSpinBox(sbOverThresholdWidth[ID][ch], "", tabLayout, ch + 1, 3, DPP::QDC::OverThresholdWidth, ch); + + } + + } + } + } + +{//^======================================== Others + QVBoxLayout *otherLayout = new QVBoxLayout(chOthers); + + QTabWidget * othersTab = new QTabWidget(this); + otherLayout->addWidget(othersTab); + + QStringList tabName = {"Test Pulse"}; + + const int nTab = tabName.count(); + + QWidget ** tabID = new QWidget * [nTab]; + + for( int i = 0; i < nTab; i++){ + tabID [i] = new QWidget(this); + othersTab->addTab(tabID[i], tabName[i]); + + QGridLayout * tabLayout = new QGridLayout(tabID[i]); + tabLayout->setSpacing(2); + tabLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft); + + QLabel * lb0 = new QLabel("Ch.", this); lb0->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb0, 0, 0); + + for( int ch = 0; ch < digi[ID]->GetRegChannels(); ch++){ + QLabel * chid = new QLabel(QString::number(ch), this); + chid->setAlignment(Qt::AlignRight | Qt::AlignCenter); + chid->setFixedWidth(20); + tabLayout->addWidget(chid, ch + 1, 0); + + if( i == 0 ){ + if( ch == 0 ){ + QLabel * lb3 = new QLabel("Test Pulse Rate", this); lb3->setAlignment(Qt::AlignHCenter); tabLayout->addWidget(lb3, 0, 3); + } + SetUpCheckBox(chkTestPule[ID][ch], "Int. Test Pulse", tabLayout, ch + 1, 1, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::InternalTestPulse, ch); + SetUpComboBoxBit(cbTestPulseRate[ID][ch], "", tabLayout, ch + 1, 2, DPP::QDC::Bit_DPPAlgorithmControl::ListTestPulseRate, DPP::QDC::DPPAlgorithmControl, DPP::QDC::Bit_DPPAlgorithmControl::TestPulseRate, 1, ch); + } + } + } + } + } //&########################################################### @@ -2791,11 +3008,17 @@ void DigiSettingsPanel::UpdateBoardAndChannelsStatus(){ for( int i = 0; i < digi[ID]->GetRegChannels(); i++){ uint32_t chStatus = digi[ID]->ReadRegister(DPP::ChannelStatus_R, i); - bnChStatus[ID][i][0]->setStyleSheet( ( (chStatus >> 2 ) & 0x1 ) ? "background-color: red;" : ""); - bnChStatus[ID][i][1]->setStyleSheet( ( (chStatus >> 3 ) & 0x1 ) ? "background-color: green;" : ""); - bnChStatus[ID][i][2]->setStyleSheet( ( (chStatus >> 8 ) & 0x1 ) ? "background-color: red;" : ""); + if( digi[ID]->GetDPPType() == DPPType::DPP_PHA_CODE || digi[ID]->GetDPPType() == DPPType::DPP_PSD_CODE ){ + bnChStatus[ID][i][0]->setStyleSheet( ( (chStatus >> 2 ) & 0x1 ) ? "background-color: red;" : ""); + bnChStatus[ID][i][1]->setStyleSheet( ( (chStatus >> 3 ) & 0x1 ) ? "background-color: green;" : ""); + bnChStatus[ID][i][2]->setStyleSheet( ( (chStatus >> 8 ) & 0x1 ) ? "background-color: red;" : ""); + leADCTemp[ID][i]->setText( QString::number( digi[ID]->GetSettingFromMemory(DPP::ChannelADCTemperature_R, i) ) ); + } + + if( digi[ID]->GetDPPType() == DPPType::DPP_QDC_CODE ){ + bnChStatus[ID][i][0]->setStyleSheet( ( (chStatus >> 2 ) & 0x1 ) ? "background-color: red;" : ""); + } - leADCTemp[ID][i]->setText( QString::number( digi[ID]->GetSettingFromMemory(DPP::ChannelADCTemperature_R, i) ) ); } } @@ -2803,7 +3026,7 @@ void DigiSettingsPanel::UpdateBoardAndChannelsStatus(){ void DigiSettingsPanel::UpdatePanelFromMemory(){ - printf("============== %s \n", __func__); + printf("============== %s (%d) \n", __func__, digi[ID]->GetSerialNumber()); enableSignalSlot = false; @@ -3009,7 +3232,7 @@ void DigiSettingsPanel::UpdatePanelFromMemory(){ //*======================================== if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE || digi[ID]->GetDPPType() == V1730_DPP_PSD_CODE ){ - for( int i = 0; i < digi[ID]->GetRegChannels(); i++){ + for( int i = 0; i < digi[ID]->GetCoupledChannels(); i++){ uint32_t trigger = digi[ID]->GetSettingFromMemory(DPP::TriggerValidationMask_G, 2*i ); cbMaskLogic[ID][i]->setCurrentIndex( (trigger >> 8 ) & 0x3 ); @@ -3019,7 +3242,7 @@ void DigiSettingsPanel::UpdatePanelFromMemory(){ chkMaskExtTrigger[ID][i]->setChecked( ( trigger >> 30 ) & 0x1 ); chkMaskSWTrigger[ID][i]->setChecked( ( trigger >> 31 ) & 0x1 ); - for( int j = 0; j < digi[ID]->GetRegChannels(); j++){ + for( int j = 0; j < digi[ID]->GetCoupledChannels(); j++){ if( ( trigger >> j ) & 0x1 ) { bnTriggerMask[ID][i][j]->setStyleSheet("background-color: green;"); }else{ @@ -3032,7 +3255,9 @@ void DigiSettingsPanel::UpdatePanelFromMemory(){ //*======================================== QDC only if( digi[ID]->GetDPPType() == V1740_DPP_QDC_CODE ){ uint32_t recordLength = digi[ID]->GetSettingFromMemory(DPP::QDC::RecordLength); - sbRecordLength_QDC[ID]->setValue(recordLength & 0xFFF); + + printf("QDC::RecordLenght: %d = %.0f ns \n", recordLength, (recordLength & 0x1FFF)*DPP::QDC::RecordLength.GetPartialStep() * digi[ID]->GetTick2ns()); + sbRecordLength_QDC[ID]->setValue((recordLength & 0x1FFF)* DPP::QDC::RecordLength.GetPartialStep() * digi[ID]->GetTick2ns()); uint32_t eventPreAgg = digi[ID]->GetSettingFromMemory(DPP::QDC::NumberEventsPerAggregate); sbEventPreAgg_QDC[ID]->setValue(eventPreAgg & 0x3FF); @@ -3110,7 +3335,6 @@ void DigiSettingsPanel::SyncSpinBox(RSpinBox *(&spb)[][MaxRegChannel+1]){ if( ch >= 0 ){ enableSignalSlot = false; spb[ID][nCh]->setValue( spb[ID][ch]->value()); - enableSignalSlot = true; }else{ //check is all SpinBox has same value; int count = 1; @@ -3128,8 +3352,8 @@ void DigiSettingsPanel::SyncSpinBox(RSpinBox *(&spb)[][MaxRegChannel+1]){ }else{ spb[ID][nCh]->setValue(value); } - enableSignalSlot = true; } + enableSignalSlot = true; } @@ -3308,62 +3532,62 @@ void DigiSettingsPanel::UpdateSettings_PHA(){ void DigiSettingsPanel::SyncAllChannelsTab_PSD(){ - SyncSpinBox(sbRecordLength); - SyncSpinBox(sbPreTrigger); - SyncSpinBox(sbThreshold); - SyncSpinBox(sbDCOffset); - SyncSpinBox(sbPSDCutThreshold); - SyncSpinBox(sbChargeZeroSupZero); - SyncSpinBox(sbShapedTrigWidth); - SyncSpinBox(sbTriggerHoldOff); - SyncSpinBox(sbTriggerLatency); - SyncSpinBox(sbShortGate); - SyncSpinBox(sbLongGate); - SyncSpinBox(sbGateOffset); - SyncSpinBox(sbFixedBaseline); - SyncSpinBox(sbCFDDely); - SyncSpinBox(sbNumEventAgg); - SyncSpinBox(sbVetoWidth); - SyncSpinBox(sbPURGAPThreshold); + SyncSpinBox(sbRecordLength); + SyncSpinBox(sbPreTrigger); + SyncSpinBox(sbThreshold); + SyncSpinBox(sbDCOffset); + SyncSpinBox(sbPSDCutThreshold); + SyncSpinBox(sbChargeZeroSupZero); + SyncSpinBox(sbShapedTrigWidth); + SyncSpinBox(sbTriggerHoldOff); + SyncSpinBox(sbTriggerLatency); + SyncSpinBox(sbShortGate); + SyncSpinBox(sbLongGate); + SyncSpinBox(sbGateOffset); + SyncSpinBox(sbFixedBaseline); + SyncSpinBox(sbCFDDely); + SyncSpinBox(sbNumEventAgg); + SyncSpinBox(sbVetoWidth); + SyncSpinBox(sbPURGAPThreshold); - SyncCheckBox(chkBaseLineCal); - SyncCheckBox(chkChargePedestal); - SyncCheckBox(chkDiscardQLong); - SyncCheckBox(chkCutBelow); - SyncCheckBox(chkCutAbove); - SyncCheckBox(chkRejOverRange); - SyncCheckBox(chkDisableOppositePulse); - SyncCheckBox(chkDisableSelfTrigger); - SyncCheckBox(chkRejPileUp); - SyncCheckBox(chkPileUpInGate); - SyncCheckBox(chkDisableTriggerHysteresis); - SyncCheckBox(chkMarkSaturation); - SyncCheckBox(chkResetTimestampByTRGIN); - SyncCheckBox(chkTestPule); + SyncCheckBox(chkBaseLineCal); + SyncCheckBox(chkChargePedestal); + SyncCheckBox(chkDiscardQLong); + SyncCheckBox(chkCutBelow); + SyncCheckBox(chkCutAbove); + SyncCheckBox(chkRejOverRange); + SyncCheckBox(chkDisableOppositePulse); + SyncCheckBox(chkDisableSelfTrigger); + SyncCheckBox(chkRejPileUp); + SyncCheckBox(chkPileUpInGate); + SyncCheckBox(chkDisableTriggerHysteresis); + SyncCheckBox(chkMarkSaturation); + SyncCheckBox(chkResetTimestampByTRGIN); + SyncCheckBox(chkTestPule); - SyncComboBox(cbDynamicRange); - SyncComboBox(cbPolarity); - SyncComboBox(cbChargeSensitivity); - SyncComboBox(cbBaseLineAvg); - SyncComboBox(cbTrigMode); - SyncComboBox(cbLocalTriggerValid); - SyncComboBox(cbAdditionLocalTrigValid); - SyncComboBox(cbDiscriMode); - SyncComboBox(cbLocalShapedTrigger); - SyncComboBox(cbTrigCount); - SyncComboBox(cbTriggerOpt); - SyncComboBox(cbSmoothedChargeIntegration); - SyncComboBox(cbCFDFraction); - SyncComboBox(cbCFDInterpolation); - SyncComboBox(cbTestPulseRate); - SyncComboBox(cbExtra2Option); - SyncComboBox(cbVetoSource); - SyncComboBox(cbVetoMode); - SyncComboBox(cbVetoStep); + SyncComboBox(cbDynamicRange); + SyncComboBox(cbPolarity); + SyncComboBox(cbChargeSensitivity); + SyncComboBox(cbBaseLineAvg); + SyncComboBox(cbTrigMode); + SyncComboBox(cbLocalTriggerValid); + SyncComboBox(cbAdditionLocalTrigValid); + SyncComboBox(cbDiscriMode); + SyncComboBox(cbLocalShapedTrigger); + SyncComboBox(cbTrigCount); + SyncComboBox(cbTriggerOpt); + SyncComboBox(cbSmoothedChargeIntegration); + SyncComboBox(cbCFDFraction); + SyncComboBox(cbCFDInterpolation); + SyncComboBox(cbTestPulseRate); + SyncComboBox(cbExtra2Option); + SyncComboBox(cbVetoSource); + SyncComboBox(cbVetoMode); + SyncComboBox(cbVetoStep); - for( int jj = 0; jj < 16 ; jj++ ){ - sbFixedBaseline[ID][jj]->setEnabled( cbBaseLineAvg[ID][jj]->currentData().toInt() == 0); - } + for( int jj = 0; jj < 16 ; jj++ ){ + sbFixedBaseline[ID][jj]->setEnabled( cbBaseLineAvg[ID][jj]->currentData().toInt() == 0); + } } void DigiSettingsPanel::UpdateSettings_PSD(){ @@ -3450,9 +3674,145 @@ void DigiSettingsPanel::UpdateSettings_PSD(){ void DigiSettingsPanel::SyncAllChannelsTab_QDC(){ + if( !enableSignalSlot ) return; + + SyncSpinBox(sbPreTrigger); + SyncSpinBox(sbDCOffset); + SyncSpinBox(sbTriggerHoldOff); + SyncSpinBox(sbShapedTrigWidth); + SyncSpinBox(sbNumEventAgg); + SyncSpinBox(sbShortGate); + SyncSpinBox(sbGateOffset); + SyncSpinBox(sbOverThresholdWidth); + + SyncCheckBox(chkDisableSelfTrigger); + SyncCheckBox(chkDisableTriggerHysteresis); + SyncCheckBox(chkOverthreshold); + SyncCheckBox(chkChargePedestal); + SyncCheckBox(chkTestPule); + + SyncComboBox(cbPolarity); + SyncComboBox(cbRCCR2Smoothing); + SyncComboBox(cbBaseLineAvg); + SyncComboBox(cbTrigMode); + SyncComboBox(cbChargeSensitivity); + SyncComboBox(cbTestPulseRate); + + //Sync sub-DC-offset + //SYnc Threshold + const int nGrp = digi[ID]->GetRegChannels(); + + int grp = chSelection[ID]->currentData().toInt(); + + for( int subCh = 0; subCh < 8; subCh ++ ){ + if( grp >= 0 ){ + enableSignalSlot = false; + sbSubChOffset[ID][nGrp][subCh]->setValue(sbSubChOffset[ID][grp][subCh]->value()); + sbSubChThreshold[ID][nGrp][subCh]->setValue(sbSubChThreshold[ID][grp][subCh]->value()); + + }else{ + int count0 = 1; + int count1 = 1; + + const int value0 = sbSubChOffset[ID][0][subCh]->value(); + const int value1 = sbSubChThreshold[ID][0][subCh]->value(); + for( int i = 1; i < nGrp; i ++){ + if( sbSubChOffset[ID][i][subCh]->value() == value0 ) count0++; + if( sbSubChThreshold[ID][i][subCh]->value() == value1 ) count1++; + sbSubChOffset[ID][i][subCh]->setEnabled(bnChEnableMask[ID][i]->styleSheet() == "" ? false : true ); + sbSubChThreshold[ID][i][subCh]->setEnabled(bnChEnableMask[ID][i]->styleSheet() == "" ? false : true ); + } + + //printf("%d =? %d , %d, %f\n", count, nCh, value, spb[ID][0]->value()); + enableSignalSlot = false; + if( count0 != nGrp ){ + sbSubChOffset[ID][nGrp][subCh]->setValue(-1); + }else{ + sbSubChOffset[ID][nGrp][subCh]->setValue(value0); + } + if( count1 != nGrp ){ + sbSubChThreshold[ID][nGrp][subCh]->setValue(-1); + }else{ + sbSubChThreshold[ID][nGrp][subCh]->setValue(value1); + } + + } + } + + enableSignalSlot = true; + } void DigiSettingsPanel::UpdateSettings_QDC(){ + enableSignalSlot = false; + + for(int grp = 0; grp < digi[ID]->GetRegChannels(); grp ++){ + + UpdateSpinBox(sbPreTrigger[ID][grp], DPP::QDC::PreTrigger, grp); + UpdateSpinBox(sbDCOffset[ID][grp], DPP::QDC::DCOffset, grp); + UpdateSpinBox(sbTriggerHoldOff[ID][grp], DPP::QDC::TriggerHoldOffWidth, grp); + UpdateSpinBox(sbShapedTrigWidth[ID][grp], DPP::QDC::TRGOUTWidth, grp); + UpdateSpinBox(sbNumEventAgg[ID][grp], DPP::QDC::NumberEventsPerAggregate, grp); + UpdateSpinBox(sbShortGate[ID][grp], DPP::QDC::GateWidth, grp); + UpdateSpinBox(sbGateOffset[ID][grp], DPP::QDC::GateOffset, grp); + UpdateSpinBox(sbOverThresholdWidth[ID][grp], DPP::QDC::OverThresholdWidth, grp); + + uint32_t dpp = digi[ID]->GetSettingFromMemory(DPP::QDC::DPPAlgorithmControl, grp); + + UpdateComboBoxBit(cbPolarity[ID][grp], dpp, DPP::QDC::Bit_DPPAlgorithmControl::Polarity); + UpdateComboBoxBit(cbRCCR2Smoothing[ID][grp], dpp, DPP::QDC::Bit_DPPAlgorithmControl::InputSmoothingFactor); + UpdateComboBoxBit(cbBaseLineAvg[ID][grp], dpp, DPP::QDC::Bit_DPPAlgorithmControl::BaselineAvg); + UpdateComboBoxBit(cbTrigMode[ID][grp], dpp, DPP::QDC::Bit_DPPAlgorithmControl::TriggerMode); + UpdateComboBoxBit(cbChargeSensitivity[ID][grp], dpp, DPP::QDC::Bit_DPPAlgorithmControl::ChargeSensitivity); + UpdateComboBoxBit(cbTestPulseRate[ID][grp], dpp, DPP::QDC::Bit_DPPAlgorithmControl::TestPulseRate); + + chkDisableSelfTrigger[ID][grp]->setChecked( Digitizer::ExtractBits(dpp, DPP::QDC::Bit_DPPAlgorithmControl::DisableSelfTrigger) ); + chkDisableTriggerHysteresis[ID][grp]->setChecked( Digitizer::ExtractBits(dpp, DPP::QDC::Bit_DPPAlgorithmControl::DisableTriggerHysteresis) ); + chkOverthreshold[ID][grp]->setChecked( Digitizer::ExtractBits(dpp, DPP::QDC::Bit_DPPAlgorithmControl::OverThresholdWitdhEnable) ); + chkChargePedestal[ID][grp]->setChecked( Digitizer::ExtractBits(dpp, DPP::QDC::Bit_DPPAlgorithmControl::ChargePedestal)); + chkTestPule[ID][grp]->setChecked( Digitizer::ExtractBits(dpp, DPP::QDC::Bit_DPPAlgorithmControl::InternalTestPulse)); + + + uint32_t dcOffSet_low = digi[ID]->GetSettingFromMemory(DPP::QDC::DCOffset_LowCh, grp); + + + sbSubChOffset[ID][grp][0]->setValue( dcOffSet_low & 0xFF); + sbSubChOffset[ID][grp][1]->setValue((dcOffSet_low >> 8) & 0xFF); + sbSubChOffset[ID][grp][2]->setValue((dcOffSet_low >> 16) & 0xFF); + sbSubChOffset[ID][grp][3]->setValue((dcOffSet_low >> 24) & 0xFF); + + uint32_t dcOffSet_high = digi[ID]->GetSettingFromMemory(DPP::QDC::DCOffset_HighCh, grp); + + sbSubChOffset[ID][grp][4]->setValue( dcOffSet_high & 0xFF); + sbSubChOffset[ID][grp][5]->setValue((dcOffSet_high >> 8) & 0xFF); + sbSubChOffset[ID][grp][6]->setValue((dcOffSet_high >> 16) & 0xFF); + sbSubChOffset[ID][grp][7]->setValue((dcOffSet_high >> 24) & 0xFF); + + uint32_t threshold_0 = digi[ID]->GetSettingFromMemory(DPP::QDC::TriggerThreshold_sub0, grp); + uint32_t threshold_1 = digi[ID]->GetSettingFromMemory(DPP::QDC::TriggerThreshold_sub1, grp); + uint32_t threshold_2 = digi[ID]->GetSettingFromMemory(DPP::QDC::TriggerThreshold_sub2, grp); + uint32_t threshold_3 = digi[ID]->GetSettingFromMemory(DPP::QDC::TriggerThreshold_sub3, grp); + uint32_t threshold_4 = digi[ID]->GetSettingFromMemory(DPP::QDC::TriggerThreshold_sub4, grp); + uint32_t threshold_5 = digi[ID]->GetSettingFromMemory(DPP::QDC::TriggerThreshold_sub5, grp); + uint32_t threshold_6 = digi[ID]->GetSettingFromMemory(DPP::QDC::TriggerThreshold_sub6, grp); + uint32_t threshold_7 = digi[ID]->GetSettingFromMemory(DPP::QDC::TriggerThreshold_sub7, grp); + + sbSubChThreshold[ID][grp][0]->setValue(threshold_0); + sbSubChThreshold[ID][grp][1]->setValue(threshold_1); + sbSubChThreshold[ID][grp][2]->setValue(threshold_2); + sbSubChThreshold[ID][grp][3]->setValue(threshold_3); + sbSubChThreshold[ID][grp][4]->setValue(threshold_4); + sbSubChThreshold[ID][grp][5]->setValue(threshold_5); + sbSubChThreshold[ID][grp][6]->setValue(threshold_6); + sbSubChThreshold[ID][grp][7]->setValue(threshold_7); + + + } + + enableSignalSlot = true; + + SyncAllChannelsTab_QDC(); + } diff --git a/DigiSettingsPanel.h b/DigiSettingsPanel.h index a362965..f5c7548 100644 --- a/DigiSettingsPanel.h +++ b/DigiSettingsPanel.h @@ -38,7 +38,7 @@ private: void SetUpCheckBox(QCheckBox * &chkBox, QString label, QGridLayout *gLayout, int row, int col, Reg para, std::pair bit, int ch = -1, int colSpan = 1); void SetUpComboBoxBit(RComboBox * &cb, QString label, QGridLayout *gLayout, int row, int col, std::vector> items, Reg para, std::pair bit, int colspan = 1, int ch = -1); void SetUpComboBox(RComboBox * &cb, QString label, QGridLayout *gLayout, int row, int col, Reg para, int ch = -1); - void SetUpSpinBox(RSpinBox * &sb, QString label, QGridLayout *gLayout, int row, int col, Reg para, int ch = -1); + void SetUpSpinBox(RSpinBox * &sb, QString label, QGridLayout *gLayout, int row, int col, Reg para, int ch = -1, bool isBoard = false); void CleanUpGroupBox(QGroupBox * & gBox); @@ -284,6 +284,8 @@ private: RSpinBox * sbOverThresholdWidth[MaxNDigitizer][MaxRegChannel + 1]; RSpinBox * sbSubChOffset[MaxNDigitizer][MaxRegChannel + 1][8]; RSpinBox * sbSubChThreshold[MaxNDigitizer][MaxRegChannel + 1][8]; + QLabel * lbSubCh[MaxNDigitizer][8]; + QLabel * lbSubCh2[MaxNDigitizer][8]; //---------------- channel status QPushButton * bnChStatus[MaxNDigitizer][MaxRegChannel][3]; diff --git a/FSUDAQ.cpp b/FSUDAQ.cpp index 02b492c..4ff9161 100644 --- a/FSUDAQ.cpp +++ b/FSUDAQ.cpp @@ -873,8 +873,6 @@ void MainWindow::SetupScalar(){ } } - printf("=================== z \n"); - } void MainWindow::CleanUpScalar(){ @@ -1509,9 +1507,18 @@ void MainWindow::UpdateAllPanels(int panelID){ if(scalar) { for( unsigned int iDigi = 0; iDigi < nDigi; iDigi++){ uint32_t chMask = digi[iDigi]->GetChannelMask(); - for( int i = 0; i < digi[iDigi]->GetNChannels(); i++){ - leTrigger[iDigi][i]->setEnabled( (chMask >> i) & 0x1 ); - leAccept[iDigi][i]->setEnabled( (chMask >> i) & 0x1 ); + for( int ch = 0; ch < digi[iDigi]->GetNChannels(); ch++){ + // leTrigger[iDigi][i]->setEnabled( (chMask >> i) & 0x1 ); + // leAccept[iDigi][i]->setEnabled( (chMask >> i) & 0x1 ); + + if( digi[iDigi]->IsChEqRegCh() ){ + leTrigger[iDigi][ch]->setEnabled( (chMask >> ch) & 0x1 ); + leAccept[iDigi][ch]->setEnabled( (chMask >> ch) & 0x1 ); + }else{ + int grpID = ch/digi[iDigi]->GetRegChannels(); + leTrigger[iDigi][ch]->setEnabled( (chMask >> grpID) & 0x1 ); + leAccept[iDigi][ch]->setEnabled( (chMask >> grpID) & 0x1 ); + } } } } @@ -1576,7 +1583,7 @@ void MainWindow::CheckElog(){ WriteElog("Testing communication.", "Testing communication.", "Other", 0); AppendElog("test append elog."); }else{ - LogMsg("Elog missing inputs. skip."); + LogMsg("Elog missing inputs. skip."); return; } diff --git a/README.md b/README.md index 76d5b86..ee2fe07 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,7 @@ Those file can be compiled using * DC offset issue. When porgram default settings, the DC offset is not the same for all channels. * for PHA firmware, when the trigger average changed, the Events per Agg need to be changed. * Sometimes, the buffer is not in time order, and make the trigger/Accept rate to be nagative. This is nothing to do with the program but the digitizer settings. Recommand reporgram the digitizer. +* in 1740D, QDC, Record Length and Over Threshold WIdth cannot read from digitizer, although the register is correct. # Known Bugs diff --git a/RegisterAddress.h b/RegisterAddress.h index 6786879..e9f98fd 100644 --- a/RegisterAddress.h +++ b/RegisterAddress.h @@ -788,7 +788,7 @@ namespace DPP { namespace QDC { // Register already grouped in channel. and there no control for indiviual channel except the Fine DC offset and threshold, so it is like no group const Reg GateWidth ("GateWidth" , 0x1030, RW::ReadWrite, false, 0xFFF, 1); /// R/W const Reg GateOffset ("GateOfset" , 0x1034, RW::ReadWrite, false, 0xFF, 1); /// R/W - const Reg FixedBaseline ("FixedBaseline" , 0x1038, RW::ReadWrite, false, 0xFFF, 1); /// R/W + const Reg FixedBaseline ("FixedBaseline" , 0x1038, RW::ReadWrite, false, 0xFFF, -1); /// R/W const Reg PreTrigger ("PreTrigger" , 0x103C, RW::ReadWrite, false, 0xFF, 1); /// R/W const Reg DPPAlgorithmControl ("DPPAlgorithmControl" , 0x1040, RW::ReadWrite, false, {}); /// R/W const Reg TriggerHoldOffWidth ("Trigger Hold-off width" , 0x1074, RW::ReadWrite, false, 0xFFFF, 1); /// R/W @@ -796,22 +796,22 @@ namespace DPP { const Reg OverThresholdWidth ("Over Threshold width" , 0x107C, RW::ReadWrite, false, 0xFFFF, 1); /// R/W const Reg GroupStatus_R ("Group Status" , 0x1088, RW::ReadONLY, false, {}); /// R/ const Reg AMCFirmwareRevision_R ("AMC firmware version" , 0x108C, RW::ReadONLY, false, {}); /// R/ - const Reg DCOffset ("DC offset" , 0x1098, RW::ReadWrite, false, 0xFFFF, 1); /// R/W + const Reg DCOffset ("DC offset" , 0x1098, RW::ReadWrite, false, 0xFFFF, -1); /// R/W const Reg ChannelMask ("Channel Group Mask" , 0x10A8, RW::ReadWrite, false, 0xFF, 1); /// R/W - const Reg DCOffset_LowCh ("DC offset for low ch." , 0x10C0, RW::ReadWrite, false, {}); /// R/W - const Reg DCOffset_HighCh ("DC offset for high ch." , 0x10C4, RW::ReadWrite, false, {}); /// R/W - const Reg TriggerThreshold_sub0 ("Trigger Threshold sub0" , 0x10D0, RW::ReadWrite, false, 0xFFF, 1); /// R/W - const Reg TriggerThreshold_sub1 ("Trigger Threshold sub1" , 0x10D4, RW::ReadWrite, false, 0xFFF, 1); /// R/W - const Reg TriggerThreshold_sub2 ("Trigger Threshold sub2" , 0x10D8, RW::ReadWrite, false, 0xFFF, 1); /// R/W - const Reg TriggerThreshold_sub3 ("Trigger Threshold sub3" , 0x10DC, RW::ReadWrite, false, 0xFFF, 1); /// R/W - const Reg TriggerThreshold_sub4 ("Trigger Threshold sub4" , 0x10E0, RW::ReadWrite, false, 0xFFF, 1); /// R/W - const Reg TriggerThreshold_sub5 ("Trigger Threshold sub5" , 0x10E4, RW::ReadWrite, false, 0xFFF, 1); /// R/W - const Reg TriggerThreshold_sub6 ("Trigger Threshold sub6" , 0x10E8, RW::ReadWrite, false, 0xFFF, 1); /// R/W - const Reg TriggerThreshold_sub7 ("Trigger Threshold sub7" , 0x10EC, RW::ReadWrite, false, 0xFFF, 1); /// R/W + const Reg DCOffset_LowCh ("DC offset for low ch." , 0x10C0, RW::ReadWrite, false, 0xFFFFFFFF, -1); /// R/W + const Reg DCOffset_HighCh ("DC offset for high ch." , 0x10C4, RW::ReadWrite, false, 0xFFFFFFFF, -1); /// R/W + const Reg TriggerThreshold_sub0 ("Trigger Threshold sub0" , 0x10D0, RW::ReadWrite, false, 0xFFF, -1); /// R/W + const Reg TriggerThreshold_sub1 ("Trigger Threshold sub1" , 0x10D4, RW::ReadWrite, false, 0xFFF, -1); /// R/W + const Reg TriggerThreshold_sub2 ("Trigger Threshold sub2" , 0x10D8, RW::ReadWrite, false, 0xFFF, -1); /// R/W + const Reg TriggerThreshold_sub3 ("Trigger Threshold sub3" , 0x10DC, RW::ReadWrite, false, 0xFFF, -1); /// R/W + const Reg TriggerThreshold_sub4 ("Trigger Threshold sub4" , 0x10E0, RW::ReadWrite, false, 0xFFF, -1); /// R/W + const Reg TriggerThreshold_sub5 ("Trigger Threshold sub5" , 0x10E4, RW::ReadWrite, false, 0xFFF, -1); /// R/W + const Reg TriggerThreshold_sub6 ("Trigger Threshold sub6" , 0x10E8, RW::ReadWrite, false, 0xFFF, -1); /// R/W + const Reg TriggerThreshold_sub7 ("Trigger Threshold sub7" , 0x10EC, RW::ReadWrite, false, 0xFFF, -1); /// R/W const Reg NumberEventsPerAggregate ("Number of Events per Aggregate", 0x8020, RW::ReadWrite, false, 0x3FF, 1); /// R/W - const Reg RecordLength ("Record Length" , 0x8024, RW::ReadWrite, false, 0xFFF, 1); /// R/W + const Reg RecordLength ("Record Length" , 0x8024, RW::ReadWrite, false, 0x1FFF, 1); /// R/W const Reg GroupEnableMask ("Group Enable Mask" , 0x8120, RW::ReadWrite, false, 0xFF, 1); /// R/W namespace Bit_DPPAlgorithmControl { diff --git a/test.cpp b/test.cpp index c4e33d8..18ba99f 100644 --- a/test.cpp +++ b/test.cpp @@ -37,10 +37,16 @@ int main(int argc, char* argv[]){ printf("OverThreshold %d: 0x%d \n", grp, digi->GetSettingFromMemory(DPP::QDC::OverThresholdWidth, grp)); } + int ret; + //int ret = CAEN_DGTZ_WriteRegister(digi->GetHandle(), 0x8024, 0x60); + + digi->WriteRegister(DPP::QDC::RecordLength, 0x60, -1, true); + unsigned int returnData; - int ret = CAEN_DGTZ_ReadRegister(digi->GetHandle(), 0x8024, &returnData); + ret = CAEN_DGTZ_ReadRegister(digi->GetHandle(), 0x8024, &returnData); printf("ret : %d | 0x%08x\n", ret, returnData); + printf("Record Length: 0x%d \n", digi->GetSettingFromMemory(DPP::QDC::RecordLength, 0)); digi->CloseDigitizer();