diff --git a/.gitignore b/.gitignore index 8e86b85..9ac68ee 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ programSettings.txt data +*.txt + *~ *.autosave moc_* diff --git a/ClassData.h b/ClassData.h index 233c9e4..d1d0b07 100644 --- a/ClassData.h +++ b/ClassData.h @@ -34,7 +34,8 @@ class Data{ unsigned short NumEventsDecoded[MaxNChannels]; /// reset at every decode unsigned short NumNonPileUpDecoded[MaxNChannels]; /// reset at every decode - /// store data for event building + /// store data for event building and deduce the trigger rate. + //TODO... make it a circular memory bool IsNotRollOverFakeAgg; unsigned short NumEvents[MaxNChannels]; /// max 65535, reset only clear Data unsigned long long Timestamp[MaxNChannels][MaxNData]; /// 47 bit @@ -68,7 +69,7 @@ class Data{ void PrintStat() const; - void PrintData() const; + void PrintAllData() const; //^================= Saving data void OpenSaveFile(std::string fileNamePrefix); @@ -178,6 +179,7 @@ inline void Data::ClearData(){ inline void Data::ClearBuffer(){ delete buffer; + buffer = nullptr; AllocatedSize = 0; nByte = 0; } @@ -245,7 +247,7 @@ inline void Data::PrintBuffer() const{ } } -inline void Data::PrintData() const{ +inline void Data::PrintAllData() const{ printf("============================= Print Data\n"); for( int ch = 0; ch < MaxNChannels ; ch++){ if( NumEvents[ch] == 0 ) continue; @@ -280,12 +282,8 @@ inline void Data::DecodeBuffer(bool fastDecode, int verbose){ return; } - if( nByte == 0 ) { - return; - } - + if( nByte == 0 ) return; nw = 0; - ClearTriggerRate(); do{ @@ -722,7 +720,6 @@ inline int Data::DecodePSDDualChannelBlock(unsigned int ChannelMask, bool fastDe NumEvents[channel] ++; NumEventsDecoded[channel] ++; TotNumEvents[channel] ++; - } if( NumEvents[channel] >= MaxNData ) ClearData(); diff --git a/ClassDigitizer.cpp b/ClassDigitizer.cpp index 10564e2..e666b90 100644 --- a/ClassDigitizer.cpp +++ b/ClassDigitizer.cpp @@ -288,7 +288,7 @@ int Digitizer::ProgramPHABoard(){ printf("======== program board PHA\n"); ret = CAEN_DGTZ_WriteRegister(handle, Register::DPP::RecordLength_G + 0x7000, 62); - ret = CAEN_DGTZ_WriteRegister(handle, Register::DPP::BoardConfiguration, 0x0F8915); /// has Extra2 + ret = CAEN_DGTZ_WriteRegister(handle, Register::DPP::BoardConfiguration, 0x0F8915); /// has Extra2, dual trace, input and trap-baseline ///ret = CAEN_DGTZ_WriteRegister(handle, Register::DPP::BoardConfiguration, 0x0D8115); /// diable Extra2 //TODO change to write register @@ -369,6 +369,7 @@ void Digitizer::StopACQ(){ printf("\n\e[1m\e[33m====== Acquisition STOPPED for Board %d\e[0m\n", boardID); AcqRun = false; data->ClearTriggerRate(); + data->ClearBuffer(); } unsigned int Digitizer::CalByteForBuffer(){ @@ -906,6 +907,7 @@ void Digitizer::SetPreTriggerDuration(unsigned int ns, int ch) void Digitizer::SetDCOffset(float offsetPrecentage, int ch) { WriteRegister( Register::DPP::ChannelDCOffset, uint( 0xFFFF * (1.0-offsetPrecentage)), ch ); ErrorMsg(__func__);} void Digitizer::SetVetoWidth(uint32_t bit, int ch) { WriteRegister( Register::DPP::VetoWidth, bit, ch); ErrorMsg(__func__);} + void Digitizer::SetTriggerPolarity(bool RiseingIsZero, int ch ){ if( !isConnected ) return; if ( DPPType >= 128 ) return; /// do thing for DPP firmware @@ -926,7 +928,7 @@ void Digitizer::SetDPPAlgorithmControl(uint32_t bit, int ch){ if( ret != 0 ) ErrorMsg(__func__); } -unsigned int Digitizer::ReadBits(Reg address, unsigned int bitLength, unsigned int bitSmallestPos, int ch ){ +unsigned int Digitizer::ReadBits(Register::Reg address, unsigned int bitLength, unsigned int bitSmallestPos, int ch ){ int tempCh = ch; if (ch < 0 && address < 0x8000 ) tempCh = 0; /// take ch-0 uint32_t bit = ReadRegister(address, tempCh); @@ -934,7 +936,7 @@ unsigned int Digitizer::ReadBits(Reg address, unsigned int bitLength, unsigned i return bit; } -void Digitizer::SetBits(Reg address, unsigned int bitValue, unsigned int bitLength, unsigned int bitSmallestPos, int ch){ +void Digitizer::SetBits(Register::Reg address, unsigned int bitValue, unsigned int bitLength, unsigned int bitSmallestPos, int ch){ ///printf("address : 0x%X, value : 0x%X, len : %d, pos : %d, ch : %d \n", address, bitValue, bitLength, bitSmallestPos, ch); uint32_t bit ; uint32_t bitmask = (uint(pow(2, bitLength)-1) << bitSmallestPos); diff --git a/ClassDigitizer.h b/ClassDigitizer.h index ecfbb73..4ee933b 100644 --- a/ClassDigitizer.h +++ b/ClassDigitizer.h @@ -76,7 +76,7 @@ class Digitizer{ void PrintBoard() ; virtual int ProgramBoard() ; /// program a generic board, no program channel - int ProgramPHABoard() ; /// program a default PHA board + int ProgramPHABoard() ; /// program a default PHA board with dual trace //^================ ACQ control void StopACQ(); @@ -138,6 +138,12 @@ class Digitizer{ void SaveSettingToFile (Register::Reg registerAddress, unsigned int value, unsigned short ch = 0); /// also save to memory unsigned int ReadSettingFromFile (Register::Reg registerAddress, unsigned short ch = 0); /// read from setting binary + //============ old methods, that only manipulate digitizer register, not setting in memory + // void SetTriggerPolarity(bool RiseingIsZero, int ch ); + // void SetDPPAlgorithmControl(uint32_t bit, int ch); + // unsigned int ReadBits(Register::Reg address, unsigned int bitLength, unsigned int bitSmallestPos, int ch ); + // void SetBits(Register::Reg address, unsigned int bitValue, unsigned int bitLength, unsigned int bitSmallestPos, int ch); + }; diff --git a/CustomThreads.h b/CustomThreads.h index 914d950..47f6963 100644 --- a/CustomThreads.h +++ b/CustomThreads.h @@ -84,7 +84,7 @@ public: } void Stop() { this->stop = true;} void SetWaitTimeinSec(float sec) {waitTime = sec * 10 ;} - unsigned int GetWaitTimeinSec() const {return waitTime/10;} + float GetWaitTimeinSec() const {return waitTime/10.;} void run(){ unsigned int count = 0; stop = false; @@ -92,12 +92,12 @@ public: usleep(100000); count ++; if( count % waitTime == 0){ - emit updataScalar(); + emit timeUp(); } }while(!stop); } signals: - void updataScalar(); + void timeUp(); private: bool stop; unsigned int waitTime; diff --git a/FSUDAQ.cpp b/FSUDAQ.cpp index b06fdf2..583eae2 100644 --- a/FSUDAQ.cpp +++ b/FSUDAQ.cpp @@ -183,7 +183,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ lbScalarACQStatus = nullptr; scalarThread = new TimingThread(); - connect(scalarThread, &TimingThread::updataScalar, this, &MainWindow::UpdateScalar); + connect(scalarThread, &TimingThread::timeUp, this, &MainWindow::UpdateScalar); } @@ -370,10 +370,15 @@ void MainWindow::OpenDigitizers(){ readDataThread = new ReadDataThread * [nDigi]; for( unsigned int i = 0; i < nDigi; i++){ digi[i] = new Digitizer(portList[i].first, portList[i].second); + //TODO === load settings + digi[i]->Reset(); + digi[i]->ProgramPHABoard(); readDataThread[i] = new ReadDataThread(digi[i], i); connect(readDataThread[i], &ReadDataThread::sendMsg, this, &MainWindow::LogMsg); } + digi[0]->SaveAllSettingsAsText("setting.txt"); + LogMsg(QString("Done. Opened %1 digitizer(s).").arg(nDigi)); WaitForDigitizersOpen(false); @@ -571,6 +576,9 @@ void MainWindow::StartACQ(){ } lbScalarACQStatus->setText("ACQ On"); + bnStartACQ->setEnabled(false); + bnStopACQ->setEnabled(true); + } void MainWindow::StopACQ(){ @@ -597,6 +605,9 @@ void MainWindow::StopACQ(){ } lbScalarACQStatus->setText("ACQ Off"); + + bnStartACQ->setEnabled(true); + bnStopACQ->setEnabled(false); } void MainWindow::AutoRun(){ @@ -707,6 +718,7 @@ void MainWindow::OpenScope(){ scope->show(); }else{ scope->show(); + scope->activateWindow(); } } diff --git a/Scope.cpp b/Scope.cpp index b8e4cf2..8f0654f 100644 --- a/Scope.cpp +++ b/Scope.cpp @@ -50,8 +50,7 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh updateTraceThread = new TimingThread(); updateTraceThread->SetWaitTimeinSec(0.5); - - //connect(updateTraceThread, &UpdateTraceThread::updateTrace, this, &Scope::UpdateScope); + connect(updateTraceThread, &TimingThread::timeUp, this, &Scope::UpdateScope); //*================================== UI int rowID = -1; @@ -86,11 +85,9 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh for( int i = 0; i < digi[ID]->GetNChannels(); i++) cbScopeCh->addItem("Ch-" + QString::number(i)); //---Setup SettingGroup - if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ) { - SetUpPHAPanel(); - }else{ - CleanUpSettingsGroupBox(); - } + CleanUpSettingsGroupBox(); + if( digi[ID]->GetDPPType() == V1730_DPP_PHA_CODE ) SetUpPHAPanel(); + if( digi[ID]->GetDPPType() == V1730_DPP_PSD_CODE ) SetUpPSDPanel(); }); @@ -130,7 +127,6 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh rowID ++; bnScopeStart = new QPushButton("Start", this); layout->addWidget(bnScopeStart, rowID, 0); - bnScopeStart->setEnabled(false); connect(bnScopeStart, &QPushButton::clicked, this, [=](){this->StartScope();}); bnScopeStop = new QPushButton("Stop", this); @@ -150,8 +146,6 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh layout->addWidget(bnClose, rowID, 5); connect(bnClose, &QPushButton::clicked, this, &Scope::close); - - layout->setColumnStretch(0, 1); layout->setColumnStretch(1, 1); layout->setColumnStretch(2, 1); @@ -161,6 +155,9 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh enableSignalSlot = true; + bnScopeStart->setEnabled(true); + bnScopeStop->setEnabled(false); + } @@ -177,11 +174,91 @@ Scope::~Scope(){ //*======================================================= //*======================================================= void Scope::StartScope(){ + if( !digi ) return; + for( unsigned int iDigi = 0; iDigi < nDigi; iDigi ++){ + + digi[iDigi]->GetData()->SetSaveWaveToMemory(true); + + digi[iDigi]->StartACQ(); + + readDataThread[iDigi]->SetScopeMode(true); + readDataThread[iDigi]->SetSaveData(false); + + readDataThread[iDigi]->start(); + + } + + updateTraceThread->start(); + + bnScopeStart->setEnabled(false); + bnScopeStop->setEnabled(true); } void Scope::StopScope(){ + if( !digi ) return; + + updateTraceThread->Stop(); + updateTraceThread->quit(); + updateTraceThread->exit(); + + + for( unsigned int iDigi = 0; iDigi < nDigi; iDigi ++){ + + digi[iDigi]->StopACQ(); + + readDataThread[iDigi]->quit(); + readDataThread[iDigi]->wait(); + } + + bnScopeStart->setEnabled(true); + bnScopeStop->setEnabled(false); + +} + +void Scope::UpdateScope(){ + + printf("---- %s \n", __func__); + + if( !digi ) return; + + int ID = cbScopeDigi->currentIndex(); + int ch = cbScopeCh->currentIndex(); + int ch2ns = digi[ID]->GetCh2ns(); + + Data * data = digi[ID]->GetData(); + + digiMTX[ID].lock(); + leTriggerRate->setText(QString::number(data->TriggerRate[ch])); + + unsigned short index = data->NumEvents[ch]; + unsigned short traceLength = data->Waveform1[ch][index].size(); + + if( data->TriggerRate[ch] > 0 ){ + + printf("--- %d | %d \n", index, traceLength ); + + QVector points; + for( int i = 0; i < (int) (data->Waveform1[ch][index]).size() ; i++ ) points.append(QPointF(ch2ns * i, (data->Waveform1[ch][index])[i])); + dataTrace[0]->replace(points); + + points.clear(); + for( int i = 0; i < (int) (data->Waveform2[ch][index]).size() ; i++ ) points.append(QPointF(ch2ns * i, (data->Waveform2[ch][index])[i])); + dataTrace[1]->replace(points); + + points.clear(); + for( int i = 0; i < (int) (data->DigiWaveform1[ch][index]).size() ; i++ ) points.append(QPointF(ch2ns * i, (data->DigiWaveform1[ch][index])[i] * 1000)); + dataTrace[2]->replace(points); + + points.clear(); + for( int i = 0; i < (int) (data->DigiWaveform2[ch][index]).size() ; i++ ) points.append(QPointF(ch2ns * i, (data->DigiWaveform2[ch][index])[i] * 1000)); + dataTrace[3]->replace(points); + + } + digiMTX[ID].unlock(); + + plot->axes(Qt::Horizontal).first()->setRange(0, ch2ns * traceLength); } @@ -243,8 +320,6 @@ void Scope::SetUpSpinBox(RSpinBox * &sb, QString str, int row, int col, const Re void Scope::CleanUpSettingsGroupBox(){ - printf("-- %s\n", __func__); - QList labelChildren1 = settingGroup->findChildren(); for( int i = 0; i < labelChildren1.size(); i++) delete labelChildren1[i]; @@ -255,12 +330,9 @@ void Scope::CleanUpSettingsGroupBox(){ for( int i = 0; i < labelChildren3.size(); i++) delete labelChildren3[i]; } + void Scope::SetUpPHAPanel(){ - CleanUpSettingsGroupBox(); - - printf("-- %s\n", __func__); - SetUpSpinBox(sbReordLength, "Record Length [ns]", 0, 0, Register::DPP::RecordLength_G); SetUpSpinBox(sbPreTrigger, "Pre Trigger [ns]", 0, 2, Register::DPP::PreTrigger); @@ -275,6 +347,10 @@ void Scope::SetUpPHAPanel(){ SetUpSpinBox(sbDecayTime, "Decay Time [ns]", 2, 4, Register::DPP::PHA::DecayTime); SetUpSpinBox(sbPeakingTime, "Peaking Time [ns]", 2, 6, Register::DPP::PHA::PeakingTime); - } +void Scope::SetUpPSDPanel(){ + + SetUpSpinBox(sbReordLength, "Record Length [ns]", 0, 0, Register::DPP::RecordLength_G); + SetUpSpinBox(sbPreTrigger, "Pre Trigger [ns]", 0, 2, Register::DPP::PreTrigger); +} diff --git a/Scope.h b/Scope.h index e8d6f83..c70effe 100644 --- a/Scope.h +++ b/Scope.h @@ -31,21 +31,22 @@ public: Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataThread, QMainWindow * parent = nullptr); ~Scope(); -public slots: - private slots: void StartScope(); void StopScope(); + void UpdateScope(); + +signals: + +private: + void SetUpComboBox(RComboBox * &cb, QString str, int row, int col, const Register::Reg para); void SetUpSpinBox(RSpinBox * &sb, QString str, int row, int col, const Register::Reg para); void CleanUpSettingsGroupBox(); void SetUpPHAPanel(); - -signals: - -private: + void SetUpPSDPanel(); Digitizer ** digi; unsigned short nDigi; diff --git a/test.cpp b/test.cpp index f915e41..995ae61 100644 --- a/test.cpp +++ b/test.cpp @@ -38,18 +38,19 @@ int main(int argc, char* argv[]){ const float ch2ns = dig[0]->GetCh2ns(); Data * data = dig[0]->GetData(); - data->Allocate80MBMemory(); dig[0]->StartACQ(); - sleep(3); + for( int i = 0; i < 5; i ++ ){ + sleep(1); + dig[0]->ReadData(); + data->DecodeBuffer(false, true); + } - dig[0]->ReadData(); + dig[0]->StopACQ(); - data->SaveBuffer("test"); + data->PrintAllData(); - - /*