diff --git a/SOLARISpanel.cpp b/SOLARISpanel.cpp index 7e68a8c..3d7a502 100644 --- a/SOLARISpanel.cpp +++ b/SOLARISpanel.cpp @@ -1,9 +1,16 @@ #include "SOLARISpanel.h" #include +#include #include #include +#define NCOL 20 // number of column + +std::vector SettingItems = {PHA::CH::TriggerThreshold, PHA::CH::DC_Offset}; + +const std::vector arrayLabel = {"e", "xf", "xn"}; + SOLARISpanel::SOLARISpanel(Digitizer2Gen **digi, unsigned short nDigi, std::vector> mapping, QStringList detType, @@ -11,7 +18,7 @@ SOLARISpanel::SOLARISpanel(Digitizer2Gen **digi, unsigned short nDigi, QWidget *parent) : QWidget(parent){ setWindowTitle("SOLARIS Settings"); - setGeometry(0, 0, 1850, 1000); + setGeometry(0, 0, 1850, 750); printf("%s\n", __func__); @@ -21,97 +28,218 @@ SOLARISpanel::SOLARISpanel(Digitizer2Gen **digi, unsigned short nDigi, this->detType = detType; this->detMaxID = detMaxID; + nDigiMapping = mapping.size(); + for( int i = 0; i < nDigiMapping; i++) nChMapping.push_back(mapping[i].size()); + //Check number of detector type; Array 0-199, Recoil 200-299, other 300- int nDetType = detType.size(); int nDet[nDetType]; for( int k = 0 ; k < nDetType; k++) nDet[k] = 0; - QList detIDList; //consolidated + QList> detIDListTemp; //to be consolidated - for( int i = 0; i < (int) mapping.size() ; i++){ - for( int j = 0; j < (int) mapping[i].size(); j++ ){ + printf("################################# \n"); + for( int i = 0; i < nDigiMapping ; i++){ + for( int j = 0; j < nChMapping[i]; j++ ){ printf("%3d,", mapping[i][j]); - if( mapping[i][j] >= 0 ) detIDList << mapping[i][j]; + QList haha ; + haha << i << mapping[i][j]; + if( mapping[i][j] >= 0 ) detIDListTemp << haha; for( int k = 0 ; k < nDetType; k++){ int lowID = (k == 0 ? 0 : detMaxID[k-1]); if( lowID <= mapping[i][j] && mapping[i][j] < detMaxID[k] ) nDet[k] ++ ; } - if( j % 16 == 0 ) printf("\n"); + if( j % 16 == 15 ) printf("\n"); } printf("------------------ \n"); } //----- consolidate detIDList; - QSet mySet(detIDList.begin(), detIDList.end()); - detIDList = mySet.values(); + QList> detIDList; + detIDList << detIDListTemp[0]; + bool repeated = false; + for( int i = 0; i < detIDListTemp.size(); i++ ){ + repeated = false; + for( int j = 0; j < detIDList.size() ; j++){ + if( detIDList[j] == detIDListTemp[i] ) { + repeated = true; + break; + } + } + if( !repeated ) detIDList << detIDListTemp [i]; + } - for( int i = 0 ; i < detIDList.size(); i++) printf("%d\n", detIDList[i]); + //------------ create Widgets + leDisplay = new QLineEdit***[(int) SettingItems.size()]; + sbSetting = new RSpinBox***[(int) SettingItems.size()]; + for( int k = 0; k < (int) SettingItems.size() ; k ++){ + leDisplay[k] = new QLineEdit**[nDigiMapping]; + sbSetting[k] = new RSpinBox**[nDigiMapping]; + for( int i = 0; i < nDigiMapping; i++){ + sbSetting[k][i] = new RSpinBox*[(int) mapping[i].size()]; + leDisplay[k][i] = new QLineEdit*[(int) mapping[i].size()]; + } + } + //---------- Set Panel QVBoxLayout * mainLayout = new QVBoxLayout(this); this->setLayout(mainLayout); QTabWidget * tabWidget = new QTabWidget(this); mainLayout->addWidget(tabWidget); for( int detTypeID = 0; detTypeID < nDetType; detTypeID ++ ){ - QWidget * tab = new QWidget(this); - tabWidget->addTab(tab, detType[detTypeID]); + QTabWidget * tab2 = new QTabWidget(tabWidget); + tabWidget->addTab(tab2, detType[detTypeID]); - QGridLayout * layout = new QGridLayout(tab); - layout->setAlignment(Qt::AlignLeft|Qt::AlignTop); - layout->setSpacing(0); + for( int SettingID = 0; SettingID < (int) SettingItems.size(); SettingID ++){ - //QLineEdit * leNDet = new QLineEdit(QString::number(nDet[detTypeID]), tab); - //layout->addWidget(leNDet, 0, 0); + QWidget * tab = new QWidget(tab2); + tab2->addTab(tab, QString::fromStdString(SettingItems[SettingID])); - //ranege of detID - int lowID = (detTypeID == 0 ? 0 : detMaxID[detTypeID-1]); + QGridLayout * layout = new QGridLayout(tab); + layout->setAlignment(Qt::AlignLeft|Qt::AlignTop); + layout->setSpacing(0); + + QCheckBox * chkAll = new QCheckBox("Set for all", tab); + layout->addWidget(chkAll, 0, 0); + + //range of detID + int lowID = (detTypeID == 0 ? 0 : detMaxID[detTypeID-1]); + + for(int i = 0; i < detIDList.size(); i++){ + if( detIDList[i][1] >= detMaxID[detTypeID] || lowID > detIDList[i][1] ) continue; + CreateSpinBoxGroup(SettingID, detIDList[i], layout, i/NCOL + 1, i%NCOL); + } - for(int i = 0; i < detIDList.size(); i++){ - if( detIDList[i] < lowID || detIDList[i] > detMaxID[detTypeID]) continue; - CreateSpinBoxGroup(PHA::CH::TriggerThreshold, i, layout, i/20, i%20); } - } - - } SOLARISpanel::~SOLARISpanel(){ } -void SOLARISpanel::CreateSpinBoxGroup(const Reg para, int detID, QGridLayout * &layout, int row, int col){ +void SOLARISpanel::CreateSpinBoxGroup(int SettingID, QList detID, QGridLayout * &layout, int row, int col){ //find all chID = (iDigi << 8 + ch) for detID std::vector chID; - for( int i = 0; i < (int) mapping.size() ; i++){ - for( int j = 0; j < (int) mapping[i].size(); j++ ){ - if( mapping[i][j] == detID ) chID.push_back((i << 8) + j); + for( int i = 0; i < nDigiMapping ; i++){ + for( int j = 0; j < nChMapping[i]; j++ ){ + if( mapping[i][j] == detID[1] ) chID.push_back((i << 8) + j); } } - QGroupBox * groupbox = new QGroupBox("det-" + QString::number(detID), this); - groupbox->setFixedWidth(80); - QVBoxLayout * layout0 = new QVBoxLayout(groupbox); + QGroupBox * groupbox = new QGroupBox("Det-" + QString::number(detID[1]), this); + groupbox->setFixedWidth(100); + QGridLayout * layout0 = new QGridLayout(groupbox); for( int i = 0; i < (int) chID.size(); i ++){ - QLineEdit * leTrigRate = new QLineEdit(this); - leTrigRate->setFixedWidth(50); - layout0->addWidget(leTrigRate); - RSpinBox * sbThre = new RSpinBox(this); - sbThre->setToolTip( "Digi-,Ch-" + QString::number(chID[i])); - sbThre->setToolTipDuration(-1); - sbThre->setFixedWidth(50); - layout0->addWidget(sbThre); + QLabel * lb = new QLabel(arrayLabel[i], this); + layout0->addWidget(lb, 2*i, 0, 2, 1); + + int digiID = (chID[i] >> 8); + int ch = (chID[i] & 0xFF); + + leDisplay[SettingID][digiID][ch] = new QLineEdit(this); + leDisplay[SettingID][digiID][ch]->setFixedWidth(50); + layout0->addWidget(leDisplay[SettingID][digiID][ch], 2*i, 1); + + sbSetting[SettingID][digiID][ch] = new RSpinBox(this); + if( digiID < nDigi ) sbSetting[SettingID][digiID][ch]->setToolTip( "Digi-" + QString::number(digi[digiID]->GetSerialNumber()) + ",Ch-" + QString::number(ch)); + sbSetting[SettingID][digiID][ch]->setToolTipDuration(-1); + sbSetting[SettingID][digiID][ch]->setFixedWidth(50); + layout0->addWidget(sbSetting[SettingID][digiID][ch], 2*i+1, 1); + + RSpinBox * spb = sbSetting[SettingID][digiID][ch]; + + const Reg para = SettingItems[SettingID]; + + connect(spb, &RSpinBox::valueChanged, this, [=](){ + if( !enableSignalSlot ) return; + spb->setStyleSheet("color:blue;"); + }); + + connect(spb, &RSpinBox::returnPressed, this, [=](){ + if( !enableSignalSlot ) return; + //printf("%s %d %d \n", para.GetPara().c_str(), index, spb->value()); + if( spb->decimals() == 0 && spb->singleStep() != 1) { + double step = spb->singleStep(); + double value = spb->value(); + spb->setValue( (std::round(value/step) * step) ); + } + QString msg; + msg = QString::fromStdString(para.GetPara()) + "|DIG:"+ QString::number(digi[digiID]->GetSerialNumber()); + if( para.GetType() == TYPE::CH ) msg += ",CH:" + QString::number(ch); + msg += " = " + QString::number(spb->value()); + if( digi[digiID]->WriteValue(para, std::to_string(spb->value()), ch)){ + SendLogMsg(msg + "|OK."); + spb->setStyleSheet(""); + }else{ + SendLogMsg(msg + "|Fail."); + spb->setStyleSheet("color:red;"); + } + }); + } + if( detID[0] >= nDigi || detID[1] >= digi[detID[0]]->GetNChannels() ) groupbox->setEnabled(false); + layout->addWidget(groupbox, row, col); } -void SOLARISpanel::CreateTab(const Reg para){ +void SOLARISpanel::UpdatePanel(){ -} \ No newline at end of file + enableSignalSlot = false; + + for( int SettingID = 0; SettingID < (int) SettingItems.size() ; SettingID ++){ + for( int DigiID = 0; DigiID < (int) mapping.size(); DigiID ++){ + if( DigiID >= nDigi ) continue;; + + for( int chID = 0; chID < (int) mapping[DigiID].size(); chID++){ + + if( chID >= digi[DigiID]->GetNChannels() ) continue; + if( mapping[DigiID][chID] < 0 ) continue; + + std::string haha = digi[DigiID]->GetSettingValue(SettingItems[SettingID], chID); + sbSetting[SettingID][DigiID][chID]->setValue( atof(haha.c_str())); + + if( SettingItems[SettingID].GetPara() == PHA::CH::TriggerThreshold.GetPara() ){ + std::string haha = digi[DigiID]->GetSettingValue(PHA::CH::SelfTrgRate, chID); + leDisplay[SettingID][DigiID][chID]->setText(QString::fromStdString(haha)); + }else{ + leDisplay[SettingID][DigiID][chID]->setText(QString::fromStdString(haha)); + } + ///printf("====== %d %d %d |%s|\n", SettingID, DigiID, chID, haha.c_str()); + } + } + } + + enableSignalSlot = true; +} + +void SOLARISpanel::UpdateThreshold(){ + + for( int SettingID = 0; SettingID < (int) SettingItems.size() ; SettingID ++){ + if( SettingItems[SettingID].GetPara() != PHA::CH::TriggerThreshold.GetPara() ) continue; + + for( int DigiID = 0; DigiID < (int) mapping.size(); DigiID ++){ + if( DigiID >= nDigi ) continue;; + + for( int chID = 0; chID < (int) mapping[DigiID].size(); chID++){ + + if( chID >= digi[DigiID]->GetNChannels() ) continue; + if( mapping[DigiID][chID] < 0 ) continue; + + std::string haha = digi[DigiID]->GetSettingValue(PHA::CH::SelfTrgRate, chID); + leDisplay[SettingID][DigiID][chID]->setText(QString::fromStdString(haha)); + + ///printf("====== %d %d %d |%s|\n", SettingID, DigiID, chID, haha.c_str()); + } + } + } + +} diff --git a/SOLARISpanel.h b/SOLARISpanel.h index 61160ff..8267899 100644 --- a/SOLARISpanel.h +++ b/SOLARISpanel.h @@ -36,19 +36,32 @@ public: private slots: - void CreateSpinBoxGroup(const Reg para, int detID, QGridLayout * &layout, int row, int col); - void CreateTab(const Reg para); + +public slots: + void UpdatePanel(); + void UpdateThreshold(); signals: + void SendLogMsg(const QString str); private: + void CreateSpinBoxGroup(int SettingID, QList detID, QGridLayout * &layout, int row, int col); Digitizer2Gen ** digi; unsigned short nDigi; std::vector> mapping; QStringList detType; std::vector detMaxID; + + int nDigiMapping; + std::vector nChMapping; + + QLineEdit **** leDisplay; // [SettingID][DigiID][ChID] + RSpinBox **** sbSetting; + + bool enableSignalSlot; + }; #endif \ No newline at end of file diff --git a/digiSettingsPanel.cpp b/digiSettingsPanel.cpp index 48b037c..a6611f1 100644 --- a/digiSettingsPanel.cpp +++ b/digiSettingsPanel.cpp @@ -1604,6 +1604,8 @@ void DigiSettingsPanel::LoadSettings(){ fileDialog.setNameFilter("Data file (*.dat);;Text file (*.txt);;All file (*.*)"); fileDialog.exec(); + if( fileDialog.selectedFiles().size() == 0 ) return; // when no file selected. + QString fileName = fileDialog.selectedFiles().at(0); leSettingFile[ID]->setText(fileName); @@ -1611,11 +1613,11 @@ void DigiSettingsPanel::LoadSettings(){ if( digi[ID]->LoadSettingsFromFile(fileName.toStdString().c_str()) ){ SendLogMsg("Loaded settings file " + fileName + " for Digi-" + QString::number(digi[ID]->GetSerialNumber())); + ShowSettingsToPanel(); }else{ SendLogMsg("Fail to Loaded settings file " + fileName + " for Digi-" + QString::number(digi[ID]->GetSerialNumber())); } - ShowSettingsToPanel(); } void DigiSettingsPanel::SetDefaultPHASettigns(){ diff --git a/mainwindow.cpp b/mainwindow.cpp index fc42e61..0d44636 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -109,6 +109,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ bnSOLSettings->setEnabled(false); connect(bnSOLSettings, SIGNAL(clicked()), this, SLOT(OpenSOLARISpanel())); + QPushButton * bnEventBuilder = new QPushButton("Event Builder", this); + bnEventBuilder->setEnabled(false); + layout1->addWidget(bnProgramSettings, 0, 0); layout1->addWidget(bnNewExp, 0, 1); layout1->addWidget(lExpName, 0, 2); @@ -121,6 +124,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ layout1->addWidget(bnDigiSettings, 2, 1); layout1->addWidget(bnSOLSettings, 2, 2, 1, 2); + layout1->addWidget(bnEventBuilder, 3, 0); + layout1->setColumnStretch(0, 2); layout1->setColumnStretch(1, 2); layout1->setColumnStretch(2, 1); @@ -746,6 +751,7 @@ void MainWindow::OpenDigitizersSettings(){ //^###################################################################### Open SOLARIS setting panel void MainWindow::OpenSOLARISpanel(){ solarisSetting->show(); + solarisSetting->UpdatePanel(); } bool MainWindow::CheckSOLARISpanelOK(){ @@ -840,6 +846,7 @@ bool MainWindow::CheckSOLARISpanelOK(){ //@============= Create SOLAIRS panel solarisSetting = new SOLARISpanel(digi, nDigi, mapping, detType, detMaxID); + connect(solarisSetting, &SOLARISpanel::SendLogMsg, this, &MainWindow::LogMsg); return true; } @@ -998,6 +1005,9 @@ void MainWindow::UpdateScalar(){ influx->WriteData(DatabaseName.toStdString()); influx->ClearDataPointsBuffer(); } + + if( solarisSetting && solarisSetting->isVisible() ) solarisSetting->UpdateThreshold(); + } //^###################################################################### Program Settings diff --git a/scope.cpp b/scope.cpp index 90d39bb..1b49bee 100644 --- a/scope.cpp +++ b/scope.cpp @@ -273,7 +273,7 @@ Scope::Scope(Digitizer2Gen **digi, unsigned int nDigi, ReadDataThread ** readDat plotView->setRenderHints(QPainter::Antialiasing); layout->addWidget(plotView, rowID, 0, 1, 6); - //------------- Ketbinding + //------------- Key binding rowID ++; QLabel * lbhints = new QLabel("Type 'r' to restore view.", this); layout->addWidget(lbhints, rowID, 0, 1, 3);