diff --git a/FSUDAQ.cpp b/FSUDAQ.cpp
index a8ad4a8..ba03401 100644
--- a/FSUDAQ.cpp
+++ b/FSUDAQ.cpp
@@ -33,6 +33,7 @@ FSUDAQ::FSUDAQ(QWidget *parent) : QMainWindow(parent){
nDigi = 0;
scalar = nullptr;
+ scalarUpdateTimeMilliSec = 1000;
scope = nullptr;
digiSettings = nullptr;
singleHistograms = nullptr;
@@ -301,18 +302,18 @@ FSUDAQ::FSUDAQ(QWidget *parent) : QMainWindow(parent){
CheckElog();
-
LogMsg("====== FSU DAQ is ready. ======");
-
}
FSUDAQ::~FSUDAQ(){
DebugPrint("%s", "FSUDAQ");
if( scalar ) {
- scalarThread->Stop();
- scalarThread->quit();
- scalarThread->exit();
+ scalarTimer->stop();
+ if( scalarThread->isRunning() ){
+ scalarThread->quit();
+ scalarThread->exit();
+ }
CleanUpScalar();
//don't need to delete scalar, it is managed by this
}
@@ -761,10 +762,12 @@ void FSUDAQ::CloseDigitizers(){
scope = nullptr;
}
- scalarThread->Stop();
- scalarThread->quit();
- scalarThread->exit();
- CleanUpScalar();
+ scalarTimer->stop();
+ if( scalarThread->isRunning() ){
+ scalarThread->quit();
+ scalarThread->exit();
+ }
+ if( scalar ) CleanUpScalar();
if( onlineAnalyzer ){
onlineAnalyzer->close();
@@ -867,9 +870,18 @@ void FSUDAQ::SetupScalar(){
lbScalarACQStatus = nullptr;
lbTotalFileSize = nullptr;
- scalarThread = new TimingThread(scalar);
- scalarThread->SetWaitTimeinSec(1.0);
- connect(scalarThread, &TimingThread::timeUp, this, &FSUDAQ::UpdateScalar);
+ // scalarThread = new TimingThread(scalar);
+ // scalarThread->SetWaitTimeinSec(1.0);
+ // connect(scalarThread, &TimingThread::timeUp, this, &FSUDAQ::UpdateScalar);
+
+ scalarThread = new QThread(this);
+ scalarWorker = new ScalarWorker(this);
+ scalarWorker->moveToThread(scalarThread);
+
+ scalarTimer = new QTimer(this);
+ connect( scalarTimer, &QTimer::timeout, scalarWorker, &ScalarWorker::UpdateScalar);
+
+ scalarThread->start();
unsigned short maxNChannel = 0;
for( unsigned int k = 0; k < nDigi; k ++ ){
@@ -1024,87 +1036,6 @@ void FSUDAQ::OpenScalar(){
scalar->show();
}
-void FSUDAQ::UpdateScalar(){
- DebugPrint("%s", "FSUDAQ");
-
- // printf("================== FSUDAQ::%s\n", __func__);
-
- if( digi == nullptr ) return;
- if( scalar == nullptr ) return;
- //if( !scalar->isVisible() ) return;
-
- // digi[0]->GetData()->PrintAllData();
-
- // lbLastUpdateTime->setText("Last update: " + QDateTime::currentDateTime().toString("MM.dd hh:mm:ss"));
- lbLastUpdateTime->setText(QDateTime::currentDateTime().toString("MM/dd hh:mm:ss"));
- scalarCount ++;
-
- uint64_t totalFileSize = 0;
- for( unsigned int iDigi = 0; iDigi < nDigi; iDigi++){
- // printf("======== digi-%d\n", iDigi);
- if( digi[iDigi]->IsBoardDisabled() ) continue;
-
- uint32_t acqStatus = digi[iDigi]->GetACQStatusFromMemory();
- //printf("Digi-%d : acq on/off ? : %d \n", digi[iDigi]->GetSerialNumber(), (acqStatus >> 2) & 0x1 );
- if( ( acqStatus >> 2 ) & 0x1 ){
- if( runStatus[iDigi]->styleSheet() == "") runStatus[iDigi]->setStyleSheet("background-color : green;");
- }else{
- if( runStatus[iDigi]->styleSheet() != "") runStatus[iDigi]->setStyleSheet("");
- }
-
- if(digiSettings && digiSettings->isVisible() && digiSettings->GetTabID() == iDigi) digiSettings->UpdateACQStatus(acqStatus);
-
- // digiMTX[iDigi].lock();
-
- QString blockCountStr = QString::number(digi[iDigi]->GetData()->AggCount);
- blockCountStr += "/" + QString::number(readDataThread[iDigi]->GetReadCount());
- readDataThread[iDigi]->SetReadCountZero();
- lbAggCount[iDigi]->setText(blockCountStr);
- lbFileSize[iDigi]->setText(QString::number(digi[iDigi]->GetData()->GetTotalFileSize()/1024./1024., 'f', 3) + " MB");
-
- digi[iDigi]->GetData()->CalTriggerRate(); //this will reset NumEventDecode & AggCount
- if( chkSaveData->isChecked() ) totalFileSize += digi[iDigi]->GetData()->GetTotalFileSize();
- for( int i = 0; i < digi[iDigi]->GetNumInputCh(); i++){
- QString a = "";
- QString b = "";
-
- if( digi[iDigi]->GetInputChannelOnOff(i) == true ) {
- // printf(" %3d %2d | %7.2f %7.2f \n", digi[iDigi]->GetSerialNumber(), i, digi[iDigi]->GetData()->TriggerRate[i], digi[iDigi]->GetData()->NonPileUpRate[i]);
- QString a = QString::number(digi[iDigi]->GetData()->TriggerRate[i], 'f', 2);
- QString b = QString::number(digi[iDigi]->GetData()->NonPileUpRate[i], 'f', 2);
- leTrigger[iDigi][i]->setText(a);
- leAccept[iDigi][i]->setText(b);
-
- if( influx && chkInflux->isChecked() && a != "inf" ){
- influx->AddDataPoint("TrigRate,Bd="+std::to_string(digi[iDigi]->GetSerialNumber()) + ",Ch=" + QString::number(i).rightJustified(2, '0').toStdString() + " value=" + a.toStdString());
- }
-
- }
- }
-
- // digiMTX[iDigi].unlock();
- // printf("============= end of FSUDAQ::%s\n", __func__);
-
- }
-
- lbTotalFileSize->setText("Total Data Size : " + QString::number(totalFileSize/1024./1024., 'f', 3) + " MB");
-
- repaint();
- scalar->repaint();
-
- if( influx && chkInflux->isChecked() && scalarCount >= 3){
- if( chkSaveData->isChecked() ) {
- influx->AddDataPoint("RunID value=" + std::to_string(runID));
- influx->AddDataPoint("FileSize value=" + std::to_string(totalFileSize));
- }
- //nflux->PrintDataPoints();
- influx->WriteData(dataBaseName.toStdString());
- influx->ClearDataPointsBuffer();
- scalarCount = 0;
- }
-
-}
-
//***************************************************************
//***************************************************************
void FSUDAQ::StartACQ(){
@@ -1149,7 +1080,7 @@ void FSUDAQ::StartACQ(){
// printf("------------ Go! \n");
// for( unsigned int i = 0; i < nDigi; i++) readDataThread[i]->go();
- scalarThread->start();
+ if( scalar ) scalarTimer->start(scalarUpdateTimeMilliSec);
if( !scalar->isVisible() ) {
scalar->show();
@@ -1158,7 +1089,7 @@ void FSUDAQ::StartACQ(){
}
lbScalarACQStatus->setText("ACQ On");
- if( singleHistograms != nullptr ) singleHistograms->startWork();
+ if( singleHistograms ) singleHistograms->startWork();
bnStartACQ->setEnabled(false);
bnStartACQ->setStyleSheet("");
@@ -1226,11 +1157,7 @@ void FSUDAQ::StopACQ(){
digi[i]->ReadACQStatus();
}
- if( scalarThread->isRunning()){
- scalarThread->Stop();
- scalarThread->quit();
- scalarThread->wait();
- }
+ if( scalar ) scalarTimer->stop();
if( onlineAnalyzer ) onlineAnalyzer->StopThread();
if( singleHistograms ) singleHistograms->stopWork();
@@ -1738,8 +1665,7 @@ void FSUDAQ::OpenScope(){
});
- connect(scope, &Scope::UpdateScaler, this, &FSUDAQ::UpdateScalar);
-
+ if( scalar ) connect(scope, &Scope::UpdateScaler, scalarWorker, &ScalarWorker::UpdateScalar);
connect(scope, &Scope::UpdateOtherPanels, this, [=](){ UpdateAllPanels(1); });
scope->show();
@@ -1796,7 +1722,6 @@ void FSUDAQ::OpenAnalyzer(){
if( id < 0 ) return;
if( onlineAnalyzer == nullptr ) {
- //onlineAnalyzer = new Analyzer(digi, nDigi);
if( id == 0 ) onlineAnalyzer = new CoincidentAnalyzer(digi, nDigi, rawDataPath);
if( id == 1 ) onlineAnalyzer = new SplitPole(digi, nDigi);
if( id == 2 ) onlineAnalyzer = new Encore(digi, nDigi);
diff --git a/FSUDAQ.h b/FSUDAQ.h
index 90423ec..9899361 100644
--- a/FSUDAQ.h
+++ b/FSUDAQ.h
@@ -20,6 +20,8 @@
#include "ClassInfluxDB.h"
#include "analyzers/Analyser.h"
+class ScalarWorker; //Forward declaration
+
//^#===================================================== FSUDAQ
class FSUDAQ : public QMainWindow{
Q_OBJECT
@@ -64,7 +66,7 @@ private slots:
void SetupScalar();
void CleanUpScalar();
void OpenScalar();
- void UpdateScalar();
+ // void UpdateScalar();
void StartACQ();
void StopACQ();
@@ -92,7 +94,8 @@ private slots:
void SetAndLockInfluxElog();
-private:
+// private:
+public:
Digitizer ** digi;
unsigned int nDigi;
@@ -168,7 +171,11 @@ private:
//@----- Scalar
QMainWindow * scalar;
QGridLayout * scalarLayout;
- TimingThread * scalarThread;
+ QThread * scalarThread;
+ ScalarWorker * scalarWorker;
+ QTimer * scalarTimer;
+
+ // TimingThread * scalarThread;
QLineEdit *** leTrigger; // need to delete manually
QLineEdit *** leAccept; // need to delete manually
QPushButton * runStatus[MaxNDigitizer];
@@ -178,6 +185,8 @@ private:
QLabel * lbFileSize[MaxNDigitizer];
QLabel * lbTotalFileSize;
+ unsigned short scalarUpdateTimeMilliSec;
+
//@----- Run Record
QMainWindow * runRecord;
QStandardItemModel *model;
@@ -194,7 +203,6 @@ private:
//@----- SingleSpectra
SingleSpectra * singleHistograms;
- // TimingThread * histThread;
//@----- Analyzer
Analyzer * onlineAnalyzer;
@@ -202,5 +210,103 @@ private:
};
+//^======================== Scalar Worker
+
+class ScalarWorker : public QObject{
+ Q_OBJECT
+public:
+ ScalarWorker(FSUDAQ * parent): SS(parent){}
+
+public slots:
+ void UpdateScalar(){
+
+ DebugPrint("%s", "FSUDAQ");
+
+ // printf("================== FSUDAQ::%s\n", __func__);
+
+ if( SS->digi == nullptr ) return;
+ if( SS->scalar == nullptr ) return;
+ //if( !scalar->isVisible() ) return;
+
+ // digi[0]->GetData()->PrintAllData();
+
+ // lbLastUpdateTime->setText("Last update: " + QDateTime::currentDateTime().toString("MM.dd hh:mm:ss"));
+ SS->lbLastUpdateTime->setText(QDateTime::currentDateTime().toString("MM/dd hh:mm:ss"));
+ SS->scalarCount ++;
+
+ uint64_t totalFileSize = 0;
+ for( unsigned int iDigi = 0; iDigi < SS->nDigi; iDigi++){
+ // printf("======== digi-%d\n", iDigi);
+ if( SS->digi[iDigi]->IsBoardDisabled() ) continue;
+
+ uint32_t acqStatus = SS->digi[iDigi]->GetACQStatusFromMemory();
+ //printf("Digi-%d : acq on/off ? : %d \n", digi[iDigi]->GetSerialNumber(), (acqStatus >> 2) & 0x1 );
+ if( ( acqStatus >> 2 ) & 0x1 ){
+ if( SS->runStatus[iDigi]->styleSheet() == "") SS->runStatus[iDigi]->setStyleSheet("background-color : green;");
+ }else{
+ if( SS->runStatus[iDigi]->styleSheet() != "") SS->runStatus[iDigi]->setStyleSheet("");
+ }
+
+ if(SS->digiSettings && SS->digiSettings->isVisible() && SS->digiSettings->GetTabID() == iDigi) SS->digiSettings->UpdateACQStatus(acqStatus);
+
+ // digiMTX[iDigi].lock();
+
+ QString blockCountStr = QString::number(SS->digi[iDigi]->GetData()->AggCount);
+ blockCountStr += "/" + QString::number(SS->readDataThread[iDigi]->GetReadCount());
+ SS->readDataThread[iDigi]->SetReadCountZero();
+ SS->lbAggCount[iDigi]->setText(blockCountStr);
+ SS->lbFileSize[iDigi]->setText(QString::number(SS->digi[iDigi]->GetData()->GetTotalFileSize()/1024./1024., 'f', 3) + " MB");
+
+ SS->digi[iDigi]->GetData()->CalTriggerRate(); //this will reset NumEventDecode & AggCount
+ if( SS->chkSaveData->isChecked() ) totalFileSize += SS->digi[iDigi]->GetData()->GetTotalFileSize();
+ for( int i = 0; i < SS->digi[iDigi]->GetNumInputCh(); i++){
+ QString a = "";
+ QString b = "";
+
+ if( SS->digi[iDigi]->GetInputChannelOnOff(i) == true ) {
+ // printf(" %3d %2d | %7.2f %7.2f \n", digi[iDigi]->GetSerialNumber(), i, digi[iDigi]->GetData()->TriggerRate[i], digi[iDigi]->GetData()->NonPileUpRate[i]);
+ QString a = QString::number(SS->digi[iDigi]->GetData()->TriggerRate[i], 'f', 2);
+ QString b = QString::number(SS->digi[iDigi]->GetData()->NonPileUpRate[i], 'f', 2);
+ SS->leTrigger[iDigi][i]->setText(a);
+ SS->leAccept[iDigi][i]->setText(b);
+
+ if( SS->influx && SS->chkInflux->isChecked() && a != "inf" ){
+ SS->influx->AddDataPoint("TrigRate,Bd="+std::to_string(SS->digi[iDigi]->GetSerialNumber()) + ",Ch=" + QString::number(i).rightJustified(2, '0').toStdString() + " value=" + a.toStdString());
+ }
+
+ }
+ }
+
+ // digiMTX[iDigi].unlock();
+ // printf("============= end of FSUDAQ::%s\n", __func__);
+
+ }
+
+ SS->lbTotalFileSize->setText("Total Data Size : " + QString::number(totalFileSize/1024./1024., 'f', 3) + " MB");
+
+ SS->repaint();
+ SS->scalar->repaint();
+
+ if( SS->influx && SS->chkInflux->isChecked() && SS->scalarCount >= 3){
+ if( SS->chkSaveData->isChecked() ) {
+ SS->influx->AddDataPoint("RunID value=" + std::to_string(SS->runID));
+ SS->influx->AddDataPoint("FileSize value=" + std::to_string(totalFileSize));
+ }
+ //nflux->PrintDataPoints();
+ SS->influx->WriteData(SS->dataBaseName.toStdString());
+ SS->influx->ClearDataPointsBuffer();
+ SS->scalarCount = 0;
+ }
+
+ emit workDone();
+ }
+
+signals:
+ void workDone();
+
+private:
+ FSUDAQ * SS;
+};
+
#endif // MAINWINDOW_H
\ No newline at end of file