From 8ba54cefc1595d9d9f2e8c69510f05009742514e Mon Sep 17 00:00:00 2001 From: "Ryan@SOLARIS-DAQ" Date: Wed, 22 Mar 2023 18:16:26 -0400 Subject: [PATCH] I am not sure what I did today... fell not good... --- SOLARISpanel.cpp | 186 ++++++++++++++++++++++++++++++++++-------- SOLARISpanel.h | 7 +- digiSettingsPanel.cpp | 2 - mainwindow.cpp | 53 ++++++------ 4 files changed, 187 insertions(+), 61 deletions(-) diff --git a/SOLARISpanel.cpp b/SOLARISpanel.cpp index 8b85957..7610539 100644 --- a/SOLARISpanel.cpp +++ b/SOLARISpanel.cpp @@ -125,9 +125,16 @@ SOLARISpanel::SOLARISpanel(Digitizer2Gen **digi, unsigned short nDigi, } } //---------- Set Panel - QVBoxLayout * mainLayout = new QVBoxLayout(this); this->setLayout(mainLayout); - QTabWidget * tabWidget = new QTabWidget(this); mainLayout->addWidget(tabWidget); + QGridLayout * mainLayout = new QGridLayout(this); this->setLayout(mainLayout); + QPushButton * bnRefresh = new QPushButton("Refresh Settings", this); + connect(bnRefresh, &QPushButton::clicked, this, &SOLARISpanel::UpdatePanel ); + mainLayout->addWidget(bnRefresh, 0, 0); + + QLabel * info = new QLabel("Only simple trigger is avalible. For complex trigger scheme, please use the setting panel.", this); + mainLayout->addWidget(info, 0, 1, 1, 4); + + QTabWidget * tabWidget = new QTabWidget(this); mainLayout->addWidget(tabWidget, 1, 0, 1, 5); for( int detTypeID = 0; detTypeID < nDetType; detTypeID ++ ){ QTabWidget * tab2 = new QTabWidget(tabWidget); @@ -147,6 +154,8 @@ SOLARISpanel::SOLARISpanel(Digitizer2Gen **digi, unsigned short nDigi, layout->setAlignment(Qt::AlignLeft|Qt::AlignTop); layout->setSpacing(0); + //TODO======= coincident Time window + //TODO======= check all chkAll = new QCheckBox("Set for all", tab); layout->addWidget(chkAll, 0, 0); @@ -215,6 +224,16 @@ SOLARISpanel::~SOLARISpanel(){ } +int SOLARISpanel::FindDetTypID(QList detIDListElement){ + for( int i = 0; i < (int) detType.size(); i++){ + int lowID = (i == 0) ? 0 : detMaxID[i-1]; + if( lowID <= detIDListElement[0] && detIDListElement[0] < detMaxID[i]) { + return i; + } + } + return -1; +} + void SOLARISpanel::CreateDetGroup(int SettingID, QList detID, QGridLayout * &layout, int row, int col){ QGroupBox * groupbox = new QGroupBox("Det-" + QString::number(detID[0]), this); @@ -256,6 +275,7 @@ void SOLARISpanel::CreateDetGroup(int SettingID, QList detID, QGridLayout * chkOnOff[SettingID][digiID][chID]->setEnabled(false); } + ///========================= for SpinBox RSpinBox * spb = sbSetting[SettingID][digiID][chID]; const Reg para = SettingItems[SettingID]; @@ -285,19 +305,20 @@ void SOLARISpanel::CreateDetGroup(int SettingID, QList detID, QGridLayout * } }); - - connect(chkOnOff[SettingID][digiID][chID], &QCheckBox::stateChanged, this, [=](){ + ///===================== for the OnOff CheckBox + connect(chkOnOff[SettingID][digiID][chID], &QCheckBox::stateChanged, this, [=](int state){ if( !enableSignalSlot ) return; - bool haha = chkOnOff[SettingID][digiID][chID]->isChecked(); + digi[digiID]->WriteValue(PHA::CH::ChannelEnable, state ? "True" : "False", chID); + + enableSignalSlot = false; + for( int i = 0; i < (int) detType.size(); i++){ + leDisplay[i][digiID][chID]->setEnabled(state); + sbSetting[i][digiID][chID]->setEnabled(state); + chkOnOff[i][digiID][chID]->setChecked(state); + } + enableSignalSlot = true; - if( haha ) { - digi[digiID]->WriteValue(PHA::CH::ChannelEnable, "True", chID); - }else{ - digi[digiID]->WriteValue(PHA::CH::ChannelEnable, "False", chID); - } - leDisplay[SettingID][digiID][chID]->setEnabled(haha); - sbSetting[SettingID][digiID][chID]->setEnabled(haha); }); layout0->setColumnStretch(0, 1); @@ -306,32 +327,75 @@ void SOLARISpanel::CreateDetGroup(int SettingID, QList detID, QGridLayout * } - int detTypeID = 0; - for( int i = 0; i < (int) detType.size(); i++){ - int lowID = (i == 0) ? 0 : detMaxID[i-1]; - if( lowID <= detID[0] && detID[0] < detMaxID[i]) { - detTypeID = i; - break; - } - } + //=================== The Trigger depnds on 5 settings (at least) + // EventTriggerSource, WaveTriggerSource, CoincidentMask, AntiCoincidentMask + // 1, EventTriggerSource has 8 settings, ITLA, ITLB, GlobalTriggerSource, TRGIN, SWTrigger, ChSelfTrigger, Ch64Trigger, Disabled + // 2, WaveTriggerSource has 8 settings, always set to be equal EventTriggerSource + // 3, CoincidentMak has 6 Settings, Disabled, Ch64Trigger, TRGIN, GloableTriggerSource, ITLA, ITLB + // 4, AntiCoincidentMask has 6 Settings, always disabled + // 5, ChannelTriggerMask is a 64-bit + // 6, CoincidenceLengthT in ns, set to be 100 ns. + int detTypeID = FindDetTypID(detID); if( SettingItems[SettingID].GetPara() == PHA::CH::TriggerThreshold.GetPara()){ - cbTrigger[detTypeID][detID[0]] = new RComboBox(this); - cbTrigger[detTypeID][detID[0]]->addItem("Non-Trigger", 0x0); - cbTrigger[detTypeID][detID[0]]->addItem("Self Trigger", -1); - cbTrigger[detTypeID][detID[0]]->addItem("Trigger all", 0x7); - cbTrigger[detTypeID][detID[0]]->addItem("Trigger (e)", 0x1); - cbTrigger[detTypeID][detID[0]]->addItem("Trigger (xf)", 0x2); - cbTrigger[detTypeID][detID[0]]->addItem("Trigger (xn)", 0x4); - cbTrigger[detTypeID][detID[0]]->addItem("Trigger 011", 0x3); - cbTrigger[detTypeID][detID[0]]->addItem("Trigger 110", 0x6); - cbTrigger[detTypeID][detID[0]]->addItem("Trigger 101", 0x5); - cbTrigger[detTypeID][detID[0]]->addItem("Oops....", -999); + cbTrigger[detTypeID][detID[0]] = new RComboBox(this); + cbTrigger[detTypeID][detID[0]]->addItem("Self Trigger", "ChSelfTrigger"); /// no coincident + cbTrigger[detTypeID][detID[0]]->addItem("Trigger e", 0x1); // Self-trigger and coincient Ch64Trigger + cbTrigger[detTypeID][detID[0]]->addItem("Ext. Trigger", "TRGIN"); // with coincident with TRGIN. + cbTrigger[detTypeID][detID[0]]->addItem("Disabled", "Disabled"); // no Trigger, no coincident, basically channel still alive, but no recording + cbTrigger[detTypeID][detID[0]]->addItem("Others", -999); // other settings + layout0->addWidget(cbTrigger[detTypeID][detID[0]], 8, 0, 1, 3); + + connect(cbTrigger[detTypeID][detID[0]], &RComboBox::currentIndexChanged, this , [=](int index){ + if( !enableSignalSlot) return; + + for( int i = 1; i < detID.size(); i++){ + + int digiID = (detID[i] >> 8 ); + int chID = (detID[i] & 0xFF); + + digi[digiID]->WriteValue(PHA::CH::AntiCoincidenceMask, "Disabled", chID); + + switch(index){ + case 0 : { /// Self Trigger + digi[digiID]->WriteValue(PHA::CH::EventTriggerSource, "ChSelfTrigger", chID); + digi[digiID]->WriteValue(PHA::CH::WaveTriggerSource, "ChSelfTrigger", chID); + digi[digiID]->WriteValue(PHA::CH::CoincidenceMask, "Disabled", chID); + }; break; + case 1 : { // trigger by energy + digi[digiID]->WriteValue(PHA::CH::EventTriggerSource, "ChSelfTrigger", chID); + digi[digiID]->WriteValue(PHA::CH::WaveTriggerSource, "ChSelfTrigger", chID); + + if( i > 1 ) { + digi[digiID]->WriteValue(PHA::CH::CoincidenceMask, "Ch64Trigger", chID); + digi[digiID]->WriteValue(PHA::CH::CoincidenceLength, "100", chID); + + //Form the trigger bit + unsigned long mask = 1 << (detID[1] & 0xFF ); // trigger by energy + QString maskStr = "0x"+QString::number(mask, 16); + digi[digiID]->WriteValue(PHA::CH::ChannelsTriggerMask, maskStr.toStdString() , chID); + } + }; break; + case 2 : { /// TRGIN, when the whole board is trigger by TRG-IN + digi[digiID]->WriteValue(PHA::CH::EventTriggerSource, "TRGIN", chID); + digi[digiID]->WriteValue(PHA::CH::WaveTriggerSource, "TRGIN", chID); + digi[digiID]->WriteValue(PHA::CH::CoincidenceMask, "TRGIN", chID); + + digi[digiID]->WriteValue(PHA::CH::CoincidenceLength, "100", chID); + }; break; + case 3 : { /// disbaled + digi[digiID]->WriteValue(PHA::CH::EventTriggerSource, "Disabled", chID); + digi[digiID]->WriteValue(PHA::CH::WaveTriggerSource, "Disabled", chID); + digi[digiID]->WriteValue(PHA::CH::CoincidenceMask, "Disabled", chID); + }; break; + } + } + + }); + } - layout->addWidget(groupbox, row, col); - } @@ -370,19 +434,73 @@ void SOLARISpanel::UpdatePanel(){ //if( detIDList[k].size() <= 2) continue; std::vector triggerMap; std::vector coincidentMask; + std::vector antiCoincidentMask; std::vector eventTriggerSource; + std::vector waveTriggerSource; for( int h = 1; h < detIDList[k].size(); h++){ int digiID = detIDList[k][h] >> 8; int chID = (detIDList[k][h] & 0xFF); - triggerMap.push_back(std::stoul(digi[digiID]->GetSettingValue(PHA::CH::ChannelsTriggerMask, chID).c_str())); + bool ok; + triggerMap.push_back( QString::fromStdString(digi[digiID]->GetSettingValue(PHA::CH::ChannelsTriggerMask, chID)).toULong(&ok, 16)); coincidentMask.push_back(digi[digiID]->GetSettingValue(PHA::CH::CoincidenceMask, chID)); + antiCoincidentMask.push_back(digi[digiID]->GetSettingValue(PHA::CH::AntiCoincidenceMask, chID)); eventTriggerSource.push_back(digi[digiID]->GetSettingValue(PHA::CH::EventTriggerSource, chID)); + waveTriggerSource.push_back(digi[digiID]->GetSettingValue(PHA::CH::WaveTriggerSource, chID)); } //====== only acceptable condition is eventTriggerSource are all ChSelfTrigger // and coincidentMask for e, xf, xn, are at least one for Ch64Trigger + // and waveTriggerSource are all ChSelfTrigger + int detTypeID = FindDetTypID(detIDList[k]); + //Check the 0-index + bool isAcceptableSetting = true; + + if( eventTriggerSource[0] != waveTriggerSource[0] || coincidentMask[0] != antiCoincidentMask[0] ) isAcceptableSetting = false; + + //check 0-index settings + if( isAcceptableSetting ){ + if( eventTriggerSource[0] == "ChSelfTrigger" && coincidentMask[0] == "Disabled") { + cbTrigger[detTypeID][detIDList[k][0]]->setCurrentText("Self Trigger"); + }else if( eventTriggerSource[0] == "Disabled" && coincidentMask[0] == "Disabled" ) { + cbTrigger[detTypeID][detIDList[k][0]]->setCurrentText("Disabled"); + }else if( eventTriggerSource[0] == "TRGIN" && coincidentMask[0] == "TRGIN") { + cbTrigger[detTypeID][detIDList[k][0]]->setCurrentText("Ext. Trigger"); + }else if( eventTriggerSource[0] == "ChSelfTrigger" && coincidentMask[0] == "Ch64Trigger") { + //Check trigger map + //TODO; + for( int p = 0; p < (int) triggerMap.size(); p ++ ){ + printf("ch-%d, trigger : 0x%s \n", detIDList[k][p+1] & 0xFF, QString::number(triggerMap[p], 16).toStdString().c_str() ); + } + cbTrigger[detTypeID][detIDList[k][0]]->setCurrentText("Trigger e"); + }else{ + isAcceptableSetting = false; + } + } + + if( isAcceptableSetting ){ + //Check if eventTriggerSource or coincidentMask compare to the 0-index + for( int h = 2; h < detIDList[k].size(); h++){ + if( eventTriggerSource[h-1] != eventTriggerSource[0]){ + isAcceptableSetting = false; + break; + } + if( waveTriggerSource[h-1] != waveTriggerSource[0]){ + isAcceptableSetting = false; + break; + } + if( coincidentMask[h-1] != coincidentMask[0]){ + isAcceptableSetting = false; + break; + } + if( antiCoincidentMask[h-1] != antiCoincidentMask[0]){ + isAcceptableSetting = false; + break; + } + } + } + if( !isAcceptableSetting ) cbTrigger[detTypeID][detIDList[k][0]]->setCurrentText("Others"); } enableSignalSlot = true; diff --git a/SOLARISpanel.h b/SOLARISpanel.h index 319d52b..1b8c235 100644 --- a/SOLARISpanel.h +++ b/SOLARISpanel.h @@ -42,7 +42,10 @@ public slots: void UpdateThreshold(); signals: - + + //TODO + void UpdateSettingsPanel(); + void UpdateScopePanel(); void SendLogMsg(const QString str); private: @@ -56,6 +59,8 @@ private: std::vector detMaxID; QList> detIDList; // 1-D array of { detID, (Digi << 8 ) + ch} + int FindDetTypID(QList detIDListElement); + int nDigiMapping; /// mapping.size() std::vector nChMapping; /// mapping[i].size(), NON -1 diff --git a/digiSettingsPanel.cpp b/digiSettingsPanel.cpp index a6611f1..3afe46c 100644 --- a/digiSettingsPanel.cpp +++ b/digiSettingsPanel.cpp @@ -761,10 +761,8 @@ DigiSettingsPanel::DigiSettingsPanel(Digitizer2Gen ** digi, unsigned short nDigi layout->addWidget(chADCToVolts[iDigi][ch], 1 + ch/2, ch%2*12 + 11); } - } - {//@============== input tab inputTab[iDigi] = new QTabWidget(tab); chTabWidget->addTab(inputTab[iDigi], "Input"); diff --git a/mainwindow.cpp b/mainwindow.cpp index 12d73cd..1f10fd4 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -64,6 +64,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ scalarThread = new ScalarThread(); connect(scalarThread, &ScalarThread::updataScalar, this, &MainWindow::UpdateScalar); + solarisSetting = nullptr; + } QWidget * mainLayoutWidget = new QWidget(this); @@ -254,15 +256,27 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ MainWindow::~MainWindow(){ - //---- may be no need to delete as thay are child of this - //delete bnProgramSettings; - //delete bnOpenDigitizers; - //delete bnCloseDigitizers; - //delete bnDigiSettings; - //delete bnNewExp; - //delete logInfo; printf("- %s\n", __func__); + printf("-------- remove %s\n", DAQLockFile); + remove(DAQLockFile); + + printf("-------- delete Solaris panel\n"); + if( solarisSetting != NULL ) { + delete solarisSetting; + solarisSetting = nullptr; + } + printf("-------- delete scope\n"); + if( scope != NULL ) { + delete scope; + scope = nullptr; + } + printf("-------- delete digiSetting\n"); + if( digiSetting != NULL ) { + delete digiSetting; + digiSetting = nullptr; + } + printf("-------- Delete readData Thread\n"); if( digi ){ for( int i = 0; i < nDigi ; i++){ @@ -271,22 +285,12 @@ MainWindow::~MainWindow(){ if( readDataThread[i]->isRunning()) StopACQ(); } } - CloseDigitizers(); + CloseDigitizers(); // SOlaris panel, digiSetting, scope are also deleted. printf("-------- Delete scalar Thread\n"); DeleteTriggerLineEdit(); delete scalarThread; - //---- need manually delete - printf("-------- delete scope\n"); - if( scope != NULL ) delete scope; - - printf("-------- delete digiSetting\n"); - if( digiSetting != NULL ) delete digiSetting; - - printf("-------- delete Solaris panel\n"); - if( solarisSetting != NULL ) delete solarisSetting; - printf("-------- delete influx\n"); if( influx != NULL ) { influx->ClearDataPointsBuffer(); @@ -295,7 +299,7 @@ MainWindow::~MainWindow(){ delete influx; } - remove(DAQLockFile); + printf("--- end of %s\n", __func__); } @@ -646,6 +650,12 @@ void MainWindow::CloseDigitizers(){ digiSetting = NULL; } + if( solarisSetting ){ + solarisSetting->close(); + delete solarisSetting; + solarisSetting = NULL; + } + for( int i = 0; i < nDigi; i++){ if( digi[i] == NULL) return; digi[i]->CloseDigitizer(); @@ -667,11 +677,6 @@ void MainWindow::CloseDigitizers(){ digi = NULL; readDataThread = NULL; - if( solarisSetting ){ - solarisSetting->close(); - delete solarisSetting; - solarisSetting = NULL; - } bnOpenDigitizers->setEnabled(true); bnOpenDigitizers->setFocus();