FSUDAQ_Qt6/FSUDAQ.cpp

1803 lines
56 KiB
C++
Raw Normal View History

2023-04-18 13:12:05 -04:00
#include "FSUDAQ.h"
2023-04-11 11:13:23 -04:00
#include <QWidget>
2023-04-14 16:12:52 -04:00
#include <QVBoxLayout>
#include <QGroupBox>
#include <QDateTime>
#include <QLabel>
#include <QScrollBar>
#include <QCoreApplication>
#include <QDialog>
#include <QFileDialog>
2023-04-17 15:17:25 -04:00
#include <QScrollArea>
2023-05-25 14:20:55 -04:00
#include <QProcess>
#include <QMessageBox>
2023-04-11 11:13:23 -04:00
#include "analyzers/SplitPoleAnalyzer.h"
#include "analyzers/EncoreAnalyzer.h"
2023-10-16 16:07:14 -04:00
#include "analyzers/RAISOR.h"
std::vector<std::string> onlineAnalyzerList = {"Splie-Pole", "Encore", "RAISOR"};
2023-06-12 16:32:01 -04:00
2023-04-11 11:13:23 -04:00
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
setWindowTitle("FSU DAQ");
setGeometry(500, 100, 1100, 600);
2023-04-11 11:13:23 -04:00
2023-04-14 16:12:52 -04:00
digi = nullptr;
nDigi = 0;
2023-05-16 14:31:19 -04:00
scalar = nullptr;
2023-04-18 13:12:05 -04:00
scope = nullptr;
2023-04-24 16:37:57 -04:00
digiSettings = nullptr;
canvas = nullptr;
2023-05-26 18:06:37 -04:00
onlineAnalyzer = nullptr;
runTimer = new QTimer();
breakAutoRepeat = true;
needManualComment = true;
runRecord = nullptr;
model = nullptr;
2023-08-14 11:26:52 -04:00
influx = nullptr;
2023-10-19 14:29:28 -04:00
2023-04-14 16:12:52 -04:00
QWidget * mainLayoutWidget = new QWidget(this);
setCentralWidget(mainLayoutWidget);
QVBoxLayout * layoutMain = new QVBoxLayout(mainLayoutWidget);
mainLayoutWidget->setLayout(layoutMain);
{//^=======================
QGroupBox * box = new QGroupBox("Digitizer(s)", mainLayoutWidget);
layoutMain->addWidget(box);
QGridLayout * layout = new QGridLayout(box);
cbOpenDigitizers = new RComboBox(this);
cbOpenDigitizers->addItem("Open Digitizers ... ", 0);
cbOpenDigitizers->addItem("Open Digitizers w/o load Settings", 1);
cbOpenDigitizers->addItem("Open Digitizers + load Settings", 2);
layout->addWidget(cbOpenDigitizers, 0, 0);
connect(cbOpenDigitizers, &RComboBox::currentIndexChanged, this, &MainWindow::OpenDigitizers);
// bnOpenDigitizers = new QPushButton("Open Digitizers", this);
// layout->addWidget(bnOpenDigitizers, 0, 0);
// connect(bnOpenDigitizers, &QPushButton::clicked, this, &MainWindow::OpenDigitizers);
2023-04-14 16:12:52 -04:00
2023-04-17 15:17:25 -04:00
bnCloseDigitizers = new QPushButton("Close Digitizers", this);
layout->addWidget(bnCloseDigitizers, 1, 0);
2023-04-17 15:17:25 -04:00
connect(bnCloseDigitizers, &QPushButton::clicked, this, &MainWindow::CloseDigitizers);
2023-04-14 16:12:52 -04:00
2023-04-17 15:17:25 -04:00
bnDigiSettings = new QPushButton("Digitizers Settings", this);
layout->addWidget(bnDigiSettings, 0, 1);
2023-04-24 16:37:57 -04:00
connect(bnDigiSettings, &QPushButton::clicked, this, &MainWindow::OpenDigiSettings);
2023-04-14 16:12:52 -04:00
bnOpenScope = new QPushButton("Open Scope", this);
layout->addWidget(bnOpenScope, 1, 1);
connect(bnOpenScope, &QPushButton::clicked, this, &MainWindow::OpenScope);
2023-08-28 15:02:56 -04:00
cbAnalyzer = new RComboBox(this);
layout->addWidget(cbAnalyzer, 0, 2);
cbAnalyzer->addItem("Choose Online Analyzer", -1);
2023-10-16 16:07:14 -04:00
for( int i = 0; i < (int) onlineAnalyzerList.size() ; i++) cbAnalyzer->addItem(onlineAnalyzerList[i].c_str(), i);
2023-08-28 15:02:56 -04:00
connect(cbAnalyzer, &RComboBox::currentIndexChanged, this, &MainWindow::OpenAnalyzer);
bnCanvas = new QPushButton("Online 1D Histograms", this);
layout->addWidget(bnCanvas, 1, 2);
connect(bnCanvas, &QPushButton::clicked, this, &MainWindow::OpenCanvas);
bnSync = new QPushButton("Sync Boards", this);
layout->addWidget(bnSync);
connect(bnSync, &QPushButton::clicked, this, &MainWindow::SetSyncMode);
2023-04-14 16:12:52 -04:00
}
{//^====================== influx and Elog
2023-05-25 14:20:55 -04:00
QGroupBox * otherBox = new QGroupBox("Database and Elog", mainLayoutWidget);
layoutMain->addWidget(otherBox);
QGridLayout * layout = new QGridLayout(otherBox);
2023-05-25 14:20:55 -04:00
layout->setVerticalSpacing(1);
2023-05-25 14:20:55 -04:00
int rowID = 0;
bnLock = new QPushButton("Unlock", this);
bnLock->setChecked(true);
layout->addWidget(bnLock, rowID, 0);
QLabel * lbInfluxIP = new QLabel("Influx IP : ", this);
lbInfluxIP->setAlignment(Qt::AlignRight | Qt::AlignCenter);
2023-05-25 14:20:55 -04:00
layout->addWidget(lbInfluxIP, rowID, 1);
leInfluxIP = new QLineEdit(this);
leInfluxIP->setReadOnly(true);
2023-05-25 14:20:55 -04:00
layout->addWidget(leInfluxIP, rowID, 2);
QLabel * lbDatabaseName = new QLabel("Database Name : ", this);
lbDatabaseName->setAlignment(Qt::AlignRight | Qt::AlignCenter);
2023-05-25 14:20:55 -04:00
layout->addWidget(lbDatabaseName, rowID, 3);
leDatabaseName = new QLineEdit(this);
leDatabaseName->setReadOnly(true);
2023-05-25 14:20:55 -04:00
layout->addWidget(leDatabaseName, rowID, 4);
2023-05-25 14:20:55 -04:00
rowID ++;
QLabel * lbElogIP = new QLabel("Elog IP : ", this);
lbElogIP->setAlignment(Qt::AlignRight | Qt::AlignCenter);
2023-05-25 14:20:55 -04:00
layout->addWidget(lbElogIP, rowID, 1);
leElogIP = new QLineEdit(this);
leElogIP->setReadOnly(true);
2023-05-25 14:20:55 -04:00
layout->addWidget(leElogIP, rowID, 2);
2023-05-25 14:20:55 -04:00
QLabel * lbElogName = new QLabel("Elog Name : ", this);
lbElogName->setAlignment(Qt::AlignRight | Qt::AlignCenter);
layout->addWidget(lbElogName, rowID, 3);
leElogName = new QLineEdit(this);
leElogName->setReadOnly(true);
layout->addWidget(leElogName, rowID, 4);
connect(bnLock, &QPushButton::clicked, this, [=](){
if( leInfluxIP->isReadOnly() ){
bnLock->setText("Lock and Set");
leInfluxIP->setReadOnly(false);
leDatabaseName->setReadOnly(false);
leElogIP->setReadOnly(false);
2023-05-25 14:20:55 -04:00
leElogName->setReadOnly(false);
leInfluxIP->setEnabled(true);
leDatabaseName->setEnabled(true);
leElogIP->setEnabled(true);
leElogName->setEnabled(true);
leInfluxIP->setStyleSheet("color : blue;");
leDatabaseName->setStyleSheet("color : blue;");
leElogIP->setStyleSheet("color : blue;");
2023-05-25 14:20:55 -04:00
leElogName->setStyleSheet("color : blue;");
}else{
bnLock->setText("Unlock");
leInfluxIP->setReadOnly(true);
leDatabaseName->setReadOnly(true);
leElogIP->setReadOnly(true);
2023-05-25 14:20:55 -04:00
leElogName->setReadOnly(true);
leInfluxIP->setStyleSheet("");
leDatabaseName->setStyleSheet("");
leElogIP->setStyleSheet("");
2023-05-25 14:20:55 -04:00
leElogName->setStyleSheet("");
influxIP = leInfluxIP->text();
dataBaseName = leDatabaseName->text();
elogIP = leElogIP->text();
2023-05-25 14:20:55 -04:00
elogName = leElogName->text();
SaveProgramSettings();
SetUpInflux();
2023-05-25 14:20:55 -04:00
if( elogName != "" ) CheckElog();
}
});
}
2023-04-14 16:12:52 -04:00
{//^====================== ACQ control
QGroupBox * box = new QGroupBox("ACQ Control", mainLayoutWidget);
layoutMain->addWidget(box);
QGridLayout * layout = new QGridLayout(box);
int rowID = 0;
2023-04-18 13:12:05 -04:00
//------------------------------------------
2023-04-14 16:12:52 -04:00
QLabel * lbDataPath = new QLabel("Data Path : ", this);
lbDataPath->setAlignment(Qt::AlignRight | Qt::AlignCenter);
leDataPath = new QLineEdit(this);
2023-04-17 15:17:25 -04:00
leDataPath->setReadOnly(true);
2023-04-14 16:12:52 -04:00
QPushButton * bnSetDataPath = new QPushButton("Set Path", this);
connect(bnSetDataPath, &QPushButton::clicked, this, &MainWindow::OpenDataPath);
QPushButton * bnOpenRecord = new QPushButton("Open Record", this);
connect(bnOpenRecord, &QPushButton::clicked, this, &MainWindow::OpenRecord);
2023-04-14 16:12:52 -04:00
layout->addWidget(lbDataPath, rowID, 0);
layout->addWidget(leDataPath, rowID, 1, 1, 5);
layout->addWidget(bnSetDataPath, rowID, 6);
layout->addWidget(bnOpenRecord, rowID, 7);
2023-04-14 16:12:52 -04:00
2023-04-18 13:12:05 -04:00
//------------------------------------------
2023-04-14 16:12:52 -04:00
rowID ++;
QLabel * lbPrefix = new QLabel("Prefix : ", this);
lbPrefix->setAlignment(Qt::AlignRight | Qt::AlignCenter);
lePrefix = new QLineEdit(this);
2023-04-18 13:12:05 -04:00
lePrefix->setAlignment(Qt::AlignHCenter);
connect(lePrefix, &QLineEdit::textChanged, this, [=](){
lePrefix->setStyleSheet("color:blue;");
});
connect(lePrefix, &QLineEdit::returnPressed, this, &MainWindow::SaveLastRunFile);
2023-04-14 16:12:52 -04:00
QLabel * lbRunID = new QLabel("Run No. :", this);
lbRunID->setAlignment(Qt::AlignRight | Qt::AlignCenter);
2023-04-17 14:09:21 -04:00
leRunID = new QLineEdit(this);
2023-04-17 15:17:25 -04:00
leRunID->setReadOnly(true);
2023-04-18 13:12:05 -04:00
leRunID->setAlignment(Qt::AlignHCenter);
2023-04-14 16:12:52 -04:00
2023-04-18 13:12:05 -04:00
chkSaveData = new QCheckBox("Save Data", this);
connect( chkSaveData, &QCheckBox::stateChanged, this, [=](int state){
cbAutoRun->setEnabled(state);
if( state == 0 ) cbAutoRun->setCurrentIndex(0);
});
cbAutoRun = new RComboBox(this);
2023-04-18 13:12:05 -04:00
cbAutoRun->addItem("Single Infinite", 0);
cbAutoRun->addItem("Single 1 min", 1);
2023-04-18 13:12:05 -04:00
cbAutoRun->addItem("Single 30 mins", 30);
cbAutoRun->addItem("Single 60 mins", 60);
cbAutoRun->addItem("Single 120 mins", 120);
cbAutoRun->addItem("Repeat 1 mins", -1);
2023-04-18 13:12:05 -04:00
cbAutoRun->addItem("Repeat 60 mins", -60);
cbAutoRun->addItem("Repeat 120 mins", -120);
2023-04-18 13:12:05 -04:00
cbAutoRun->setEnabled(false);
bnStartACQ = new QPushButton("Start ACQ", this);
connect( bnStartACQ, &QPushButton::clicked, this, &MainWindow::AutoRun);
2023-04-18 13:12:05 -04:00
bnStopACQ = new QPushButton("Stop ACQ", this);
connect( bnStopACQ, &QPushButton::clicked, this, [=](){
2023-10-19 14:29:28 -04:00
if( runTimer->isActive() ){
runTimer->stop();
runTimer->disconnect(runTimerConnection);
}else{
breakAutoRepeat = true;
runTimer->disconnect(runTimerConnection);
}
needManualComment = true;
StopACQ();
2023-10-19 15:32:44 -04:00
});
2023-04-14 16:12:52 -04:00
layout->addWidget(lbPrefix, rowID, 0);
layout->addWidget(lePrefix, rowID, 1);
layout->addWidget(lbRunID, rowID, 2);
layout->addWidget(leRunID, rowID, 3);
2023-04-18 13:12:05 -04:00
layout->addWidget(chkSaveData, rowID, 4);
layout->addWidget(cbAutoRun, rowID, 5);
layout->addWidget(bnStartACQ, rowID, 6);
layout->addWidget(bnStopACQ, rowID, 7);
2023-04-14 16:12:52 -04:00
2023-04-18 13:12:05 -04:00
//------------------------------------------
2023-04-14 16:12:52 -04:00
rowID ++;
QLabel * lbComment = new QLabel("Run Comment : ", this);
lbComment->setAlignment(Qt::AlignRight | Qt::AlignCenter);
leComment = new QLineEdit(this);
2023-05-17 16:16:48 -04:00
leComment->setReadOnly(true);
2023-04-14 16:12:52 -04:00
2023-04-18 13:12:05 -04:00
bnOpenScaler = new QPushButton("Scalar", this);
connect(bnOpenScaler, &QPushButton::clicked, this, &MainWindow::OpenScalar);
2023-04-14 16:12:52 -04:00
layout->addWidget(lbComment, rowID, 0);
2023-04-18 13:12:05 -04:00
layout->addWidget(leComment, rowID, 1, 1, 6);
layout->addWidget(bnOpenScaler, rowID, 7);
2023-04-14 16:12:52 -04:00
layout->setColumnStretch(0, 1);
layout->setColumnStretch(1, 2);
layout->setColumnStretch(2, 1);
2023-04-18 13:12:05 -04:00
layout->setColumnStretch(3, 1);
layout->setColumnStretch(4, 1);
layout->setColumnStretch(5, 1);
layout->setColumnStretch(6, 3);
layout->setColumnStretch(7, 3);
2023-04-14 16:12:52 -04:00
}
{//^===================== Log Msg
logMsgHTMLMode = true;
QGroupBox * box3 = new QGroupBox("Log Message", mainLayoutWidget);
layoutMain->addWidget(box3);
layoutMain->setStretchFactor(box3, 1);
QVBoxLayout * layout3 = new QVBoxLayout(box3);
logInfo = new QPlainTextEdit(this);
logInfo->setReadOnly(true);
2023-04-14 16:12:52 -04:00
QFont font;
font.setFamily("Courier New");
logInfo->setFont(font);
layout3->addWidget(logInfo);
}
LogMsg("<font style=\"color: blue;\"><b>Welcome to FSU DAQ.</b></font>");
2023-04-11 11:13:23 -04:00
2023-04-17 14:09:21 -04:00
rawDataPath = "";
prefix = "temp";
runID = 0;
elogID = 0;
2023-05-25 14:20:55 -04:00
elogName = "";
elogUser = "";
elogPWD = "";
influxIP = "";
dataBaseName = "";
2023-04-17 14:09:21 -04:00
programSettingsFilePath = QDir::current().absolutePath() + "/programSettings.txt";
LoadProgramSettings();
//=========== disable widget
WaitForDigitizersOpen(true);
SetUpInflux();
2023-05-24 16:04:32 -04:00
2023-05-25 14:20:55 -04:00
CheckElog();
2023-04-11 11:13:23 -04:00
}
MainWindow::~MainWindow(){
2023-10-12 16:27:56 -04:00
if( scalar ) {
scalarThread->Stop();
scalarThread->quit();
scalarThread->exit();
CleanUpScalar();
2023-10-13 18:02:19 -04:00
//don't need to delete scalar, it is managed by this
2023-10-12 16:27:56 -04:00
}
2023-04-14 16:12:52 -04:00
if( digi ) CloseDigitizers();
2023-04-17 14:09:21 -04:00
SaveProgramSettings();
2023-04-18 13:12:05 -04:00
if( scope ) delete scope;
2023-04-19 16:21:14 -04:00
2023-10-12 16:27:56 -04:00
if( histThread){
histThread->Stop();
histThread->quit();
histThread->wait();
delete histThread;
}
if( canvas ) delete canvas;
2023-05-26 18:06:37 -04:00
if( onlineAnalyzer ) delete onlineAnalyzer;
2023-06-01 17:51:00 -04:00
if( digiSettings ) delete digiSettings;
2023-04-18 13:12:05 -04:00
2023-05-24 16:04:32 -04:00
delete influx;
2023-08-17 12:50:45 -04:00
printf("-------- remove %s\n", DAQLockFile);
remove(DAQLockFile);
2023-04-17 14:09:21 -04:00
}
//***************************************************************
//***************************************************************
2023-04-17 15:17:25 -04:00
void MainWindow::OpenDataPath(){
QFileDialog fileDialog(this);
fileDialog.setFileMode(QFileDialog::Directory);
int result = fileDialog.exec();
//qDebug() << fileDialog.selectedFiles();
if( result > 0 ) {
leDataPath->setText(fileDialog.selectedFiles().at(0));
2023-05-25 14:20:55 -04:00
rawDataPath = leDataPath->text();
bnStartACQ->setEnabled(true);
bnStartACQ->setStyleSheet("background-color: green;");
2023-04-17 15:17:25 -04:00
}else{
leDataPath->clear();
2023-05-25 14:20:55 -04:00
rawDataPath = "";
bnStartACQ->setEnabled(false);
bnStartACQ->setStyleSheet("");
2023-04-17 15:17:25 -04:00
}
SaveProgramSettings();
2023-10-19 14:29:28 -04:00
LoadLastRunFile();
2023-08-14 11:26:52 -04:00
2023-04-17 15:17:25 -04:00
}
2023-04-17 14:09:21 -04:00
void MainWindow::OpenRecord(){
QString filePath = leDataPath->text() + "/RunTimeStamp.dat";
if( runRecord == nullptr ){
runRecord = new QMainWindow(this);
runRecord->setGeometry(0,0, 500, 500);
runRecord->setWindowTitle("Run Record");
QWidget * widget = new QWidget(runRecord);
runRecord->setCentralWidget(widget);
QVBoxLayout * layout = new QVBoxLayout(widget);
widget->setLayout(layout);
QLabel * lbFilePath = new QLabel(widget);
lbFilePath->setText(filePath);
layout->addWidget(lbFilePath);
tableView = new QTableView(widget);
layout->addWidget(tableView);
model = new QStandardItemModel(runRecord);
tableView->setModel(model);
}
UpdateRecord();
runRecord->show();
}
void MainWindow::UpdateRecord(){
if( !runRecord ) return;
QString filePath = leDataPath->text() + "/RunTimeStamp.dat";
model->clear();
if (!filePath.isEmpty()) {
QFile file(filePath);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream stream(&file);
while (!stream.atEnd()) {
QString line = stream.readLine();
QStringList fields = line.split('|');
QList<QStandardItem*> items;
for (const QString& field : fields) {
items.append(new QStandardItem(field));
}
model->appendRow(items);
}
file.close();
tableView->resizeColumnsToContents();
}
}
tableView->scrollToBottom();
}
2023-04-17 14:09:21 -04:00
void MainWindow::LoadProgramSettings(){
LogMsg("Loading <b>" + programSettingsFilePath + "</b> for Program Settings.");
QFile file(programSettingsFilePath);
if( !file.open(QIODevice::Text | QIODevice::ReadOnly) ) {
LogMsg("<b>" + programSettingsFilePath + "</b> not found.");
}else{
QTextStream in(&file);
QString line = in.readLine();
int count = 0;
while( !line.isNull()){
if( line.left(6) == "//----") break;
if( count == 0 ) rawDataPath = line;
if( count == 1 ) influxIP = line;
if( count == 2 ) dataBaseName = line;
if( count == 3 ) elogIP = line;
2023-05-25 14:20:55 -04:00
if( count == 4 ) elogName = line;
if( count == 5 ) elogUser = line;
if( count == 6 ) elogPWD = line;
2023-04-17 14:09:21 -04:00
count ++;
line = in.readLine();
}
//looking for the lastRun.sh for
leDataPath->setText(rawDataPath);
leInfluxIP->setText(influxIP);
leDatabaseName->setText(dataBaseName);
leElogIP->setText(elogIP);
2023-05-25 14:20:55 -04:00
leElogName->setText(elogName);
logMsgHTMLMode = false;
LogMsg("Raw Data Path : " + rawDataPath);
LogMsg(" Influx IP : " + influxIP);
LogMsg("Database Name : " + dataBaseName);
LogMsg(" Elog IP : " + elogIP);
LogMsg(" Elog Name : " + elogName);
LogMsg(" Elog User : " + elogUser);
LogMsg(" Elog PWD : " + elogPWD);
logMsgHTMLMode = true;
2023-04-18 13:12:05 -04:00
//check is rawDataPath exist, if not, create one
QDir rawDataDir;
if( !rawDataDir.exists(rawDataPath ) ) {
if( rawDataDir.mkdir(rawDataPath) ){
LogMsg("Created folder <b>" + rawDataPath + "</b> for storing root files.");
}else{
LogMsg("<font style=\"color:red;\"><b>" + rawDataPath + "</b> cannot be created. Access right problem? </font>" );
}
}else{
LogMsg("<b>" + rawDataPath + "</b> already exist." );
}
2023-04-17 14:09:21 -04:00
LoadLastRunFile();
}
}
void MainWindow::SaveProgramSettings(){
rawDataPath = leDataPath->text();
QFile file(programSettingsFilePath);
file.open(QIODevice::Text | QIODevice::WriteOnly);
file.write((rawDataPath+"\n").toStdString().c_str());
file.write((influxIP+"\n").toStdString().c_str());
file.write((dataBaseName+"\n").toStdString().c_str());
file.write((elogIP+"\n").toStdString().c_str());
2023-05-25 14:20:55 -04:00
file.write((elogName+"\n").toStdString().c_str());
file.write((elogUser+"\n").toStdString().c_str());
file.write((elogPWD+"\n").toStdString().c_str());
file.write("//------------end of file.\n");
2023-04-17 14:09:21 -04:00
file.close();
LogMsg("Saved program settings to <b>"+ programSettingsFilePath + "<b>.");
}
void MainWindow::LoadLastRunFile(){
QFile file(rawDataPath + "/lastRun.sh");
if( !file.open(QIODevice::Text | QIODevice::ReadOnly) ) {
LogMsg("<b>" + rawDataPath + "/lastRun.sh</b> not found.");
runID = 0;
prefix = "temp";
leRunID->setText(QString::number(runID));
lePrefix->setText(prefix);
}else{
QTextStream in(&file);
QString line = in.readLine();
int count = 0;
while( !line.isNull()){
int index = line.indexOf("=");
QString haha = line.mid(index+1).remove(" ");
//qDebug() << haha;
switch (count){
case 0 : prefix = haha; break;
case 1 : runID = haha.toInt(); break;
case 2 : elogID = haha.toInt(); break;
}
count ++;
line = in.readLine();
}
lePrefix->setText(prefix);
lePrefix->setStyleSheet("");
2023-04-17 14:09:21 -04:00
leRunID->setText(QString::number(runID));
}
}
void MainWindow::SaveLastRunFile(){
QFile file(rawDataPath + "/lastRun.sh");
prefix = lePrefix->text();
lePrefix->setStyleSheet("");
2023-04-17 14:09:21 -04:00
file.open(QIODevice::Text | QIODevice::WriteOnly);
2023-04-17 14:09:21 -04:00
file.write(("prefix=" + prefix + "\n").toStdString().c_str());
file.write(("runID=" + QString::number(runID) + "\n").toStdString().c_str());
file.write(("elogID=" + QString::number(elogID) + "\n").toStdString().c_str());
file.write("//------------end of file.");
file.close();
LogMsg("Saved program settings to <b>"+ rawDataPath + "/lastRun.sh<b>.");
2023-04-14 16:12:52 -04:00
}
//***************************************************************
//***************************************************************
void MainWindow::OpenDigitizers(){
if( cbOpenDigitizers->currentIndex() == 0 ) return;
2023-04-14 16:12:52 -04:00
//sereach for digitizers
2023-08-14 11:44:58 -04:00
LogMsg("Searching digitizers via optical link or USB .....Please wait");
2023-04-14 16:12:52 -04:00
logMsgHTMLMode = false;
nDigi = 0;
std::vector<std::pair<int, int>> portList; //boardID, portID
for(int port = 0; port < MaxNPorts; port++){
for( int board = 0; board < MaxNBoards; board ++){ /// max number of iasy chain
Digitizer dig;
2023-04-14 16:12:52 -04:00
dig.OpenDigitizer(board, port);
if( dig.IsConnected() ){
nDigi++;
portList.push_back(std::pair(board, port));
LogMsg(QString("... Found at port: %1, board: %2. SN: %3 %4").arg(port).arg(board).arg(dig.GetSerialNumber(), 3, 10, QChar(' ')).arg(dig.GetDPPString().c_str()));
}//else{
//LogMsg(QString("... Nothing at port: %1, board: %2.").arg(port).arg(board));
//}
dig.CloseDigitizer();
QCoreApplication::processEvents(); //to prevent Qt said application not responding.
2023-04-14 16:12:52 -04:00
}
}
logMsgHTMLMode = true;
if( nDigi == 0 ) {
LogMsg(QString("Done seraching. No digitizer found."));
return;
}else{
if( cbOpenDigitizers->currentIndex() == 1 ) {
LogMsg(QString("Done seraching. Found %1 digitizer(s). Opening digitizer(s)....").arg(nDigi));
}else{
LogMsg(QString("Done seraching. Found %1 digitizer(s). Opening digitizer(s) and load settings....").arg(nDigi));
}
}
2023-04-14 16:12:52 -04:00
digi = new Digitizer * [nDigi];
readDataThread = new ReadDataThread * [nDigi];
2023-04-14 16:12:52 -04:00
for( unsigned int i = 0; i < nDigi; i++){
digi[i] = new Digitizer(portList[i].first, portList[i].second);
2023-05-12 16:06:32 -04:00
//digi[i]->Reset();
///============== load settings
QString fileName = rawDataPath + "/Digi-" + QString::number(digi[i]->GetSerialNumber()) + "_" + QString::fromStdString(digi[i]->GetData()->DPPTypeStr) + ".bin";
QFile file(fileName);
if( !file.open(QIODevice::Text | QIODevice::ReadOnly) ) {
2023-05-09 12:16:08 -04:00
if( digi[i]->GetDPPType() == V1730_DPP_PHA_CODE ) {
//digi[i]->ProgramBoard_PHA();
2023-05-12 16:06:32 -04:00
//LogMsg("<b>" + fileName + "</b> not found. Program predefined PHA settings.");
LogMsg("<b>" + fileName + "</b> not found.");
2023-05-09 12:16:08 -04:00
}
if( digi[i]->GetDPPType() == V1730_DPP_PSD_CODE ){
//digi[i]->ProgramBoard_PSD();
//LogMsg("<b>" + fileName + "</b> not found. Program predefined PSD settings.");
LogMsg("<b>" + fileName + "</b> not found.");
}
if( digi[i]->GetDPPType() == V1740_DPP_QDC_CODE ){
//digi[i]->ProgramBoard_QDC();
2023-05-12 16:06:32 -04:00
//LogMsg("<b>" + fileName + "</b> not found. Program predefined PSD settings.");
LogMsg("<b>" + fileName + "</b> not found.");
2023-05-09 12:16:08 -04:00
}
}else{
LogMsg("Found <b>" + fileName + "</b> for digitizer settings.");
if( cbOpenDigitizers->currentIndex() == 2 ) {
if( digi[i]->LoadSettingBinaryToMemory(fileName.toStdString().c_str()) == 0 ){
LogMsg("Loaded settings file <b>" + fileName + "</b> for Digi-" + QString::number(digi[i]->GetSerialNumber()));
digi[i]->ProgramSettingsToBoard();
}else{
LogMsg("Fail to Loaded settings file " + fileName + " for Digi-" + QString::number(digi[i]->GetSerialNumber()));
}
}
}
2023-05-12 16:06:32 -04:00
digi[i]->ReadAllSettingsFromBoard(true);
2023-04-14 16:12:52 -04:00
readDataThread[i] = new ReadDataThread(digi[i], i);
connect(readDataThread[i], &ReadDataThread::sendMsg, this, &MainWindow::LogMsg);
QCoreApplication::processEvents(); //to prevent Qt said application not responding.
2023-04-14 16:12:52 -04:00
}
canvas = new SingleSpectra(digi, nDigi, rawDataPath);
2023-05-19 16:23:04 -04:00
histThread = new TimingThread(this);
2023-05-19 16:49:01 -04:00
histThread->SetWaitTimeinSec(0.5);
2023-05-19 16:23:04 -04:00
connect(histThread, &TimingThread::timeUp, this, [=](){
if( canvas == nullptr && !canvas->IsFillHistograms()) return;
canvas->FillHistograms();
2023-05-19 16:23:04 -04:00
});
2023-04-14 16:12:52 -04:00
LogMsg(QString("Done. Opened %1 digitizer(s).").arg(nDigi));
WaitForDigitizersOpen(false);
bnStartACQ->setStyleSheet("background-color: green;");
2023-05-12 16:06:32 -04:00
bnStopACQ->setEnabled(false);
bnStopACQ->setStyleSheet("");
bnSync->setEnabled( nDigi >= 1 );
2023-06-01 17:51:00 -04:00
if( rawDataPath == "" ) {
chkSaveData->setChecked(false);
chkSaveData->setEnabled(false);
}
2023-05-25 14:20:55 -04:00
2023-04-17 15:17:25 -04:00
SetupScalar();
cbOpenDigitizers->setCurrentIndex(0);
}
2023-04-14 16:12:52 -04:00
void MainWindow::CloseDigitizers(){
2023-10-12 16:27:56 -04:00
LogMsg("MainWindow::Closing Digitizer(s)....");
2023-04-14 16:12:52 -04:00
2023-10-12 16:27:56 -04:00
scalarThread->Stop();
scalarThread->quit();
scalarThread->exit();
2023-04-17 15:17:25 -04:00
CleanUpScalar();
2023-04-24 16:37:57 -04:00
if( scope ) {
scope->close();
delete scope;
scope = nullptr;
}
2023-10-12 16:27:56 -04:00
if( histThread){
histThread->Stop();
histThread->quit();
histThread->wait();
delete histThread;
histThread = nullptr;
}
2023-06-01 17:51:00 -04:00
if( canvas ){
canvas->close();
delete canvas;
canvas = nullptr;
}
2023-04-24 16:37:57 -04:00
if( digiSettings ){
digiSettings->close();
delete digiSettings;
digiSettings = nullptr;
}
2023-04-18 13:12:05 -04:00
if( digi == nullptr ) return;
2023-04-14 16:12:52 -04:00
for(unsigned int i = 0; i < nDigi; i ++){
2023-10-12 16:27:56 -04:00
readDataThread[i]->Stop();
readDataThread[i]->quit();
readDataThread[i]->wait();
2023-04-14 16:12:52 -04:00
delete readDataThread[i];
2023-10-12 16:27:56 -04:00
printf(" readDataThread[%d] is deleted.\n", i);
2023-04-14 16:12:52 -04:00
}
delete [] readDataThread;
readDataThread = nullptr;
2023-10-12 16:27:56 -04:00
for(unsigned int i = 0; i < nDigi; i ++){
digi[i]->CloseDigitizer();
delete digi[i];
}
delete [] digi;
digi = nullptr;
2023-04-14 16:12:52 -04:00
LogMsg("Done. Closed " + QString::number(nDigi) + " Digitizer(s).");
nDigi = 0;
2023-04-17 15:17:25 -04:00
WaitForDigitizersOpen(true);
bnStartACQ->setStyleSheet("");
bnStopACQ->setStyleSheet("");
2023-10-12 16:27:56 -04:00
printf("End of MainWindow::%s\n", __func__);
}
void MainWindow::WaitForDigitizersOpen(bool onOff){
// bnOpenDigitizers->setEnabled(onOff);
cbOpenDigitizers->setEnabled(onOff);
bnCloseDigitizers->setEnabled(!onOff);
bnOpenScope->setEnabled(!onOff);
bnDigiSettings->setEnabled(!onOff);
bnOpenScaler->setEnabled(!onOff);
bnStartACQ->setEnabled(!onOff);
bnStopACQ->setEnabled(!onOff);
bnStopACQ->setStyleSheet("");
chkSaveData->setEnabled(!onOff);
2023-05-19 16:49:01 -04:00
bnCanvas->setEnabled(!onOff);
2023-08-28 15:02:56 -04:00
cbAnalyzer->setEnabled(!onOff);
cbAutoRun->setEnabled(chkSaveData->isChecked());
bnSync->setEnabled(false);
2023-04-14 16:12:52 -04:00
}
//***************************************************************
//***************************************************************
2023-04-17 15:17:25 -04:00
void MainWindow::SetupScalar(){
2023-04-14 16:12:52 -04:00
// printf("%s\n", __func__);
scalar = new QMainWindow(this);
scalar->setWindowTitle("Scalar");
QScrollArea * scopeScroll = new QScrollArea(scalar);
scalar->setCentralWidget(scopeScroll);
scopeScroll->setWidgetResizable(true);
scopeScroll->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
QWidget * layoutWidget = new QWidget(scalar);
scopeScroll->setWidget(layoutWidget);
scalarLayout = new QGridLayout(layoutWidget);
scalarLayout->setSpacing(0);
scalarLayout->setAlignment(Qt::AlignTop);
leTrigger = nullptr;
leAccept = nullptr;
lbLastUpdateTime = nullptr;
lbScalarACQStatus = nullptr;
2023-10-12 16:27:56 -04:00
scalarThread = new TimingThread(scalar);
connect(scalarThread, &TimingThread::timeUp, this, &MainWindow::UpdateScalar);
2023-10-04 18:03:42 -04:00
unsigned short maxNChannel = 0;
for( unsigned int k = 0; k < nDigi; k ++ ){
2023-10-09 17:46:32 -04:00
if( digi[k]->GetNumInputCh() > maxNChannel ) maxNChannel = digi[k]->GetNumInputCh();
2023-10-04 18:03:42 -04:00
}
scalar->setGeometry(0, 0, 10 + nDigi * 200, 110 + maxNChannel * 20);
2023-04-14 16:12:52 -04:00
2023-04-17 15:17:25 -04:00
if( lbLastUpdateTime == nullptr ){
lbLastUpdateTime = new QLabel("Last update : NA", scalar);
lbScalarACQStatus = new QLabel("ACQ status", scalar);
}
2023-10-19 15:32:44 -04:00
lbLastUpdateTime->setAlignment(Qt::AlignRight);
2023-04-17 15:17:25 -04:00
scalarLayout->removeWidget(lbLastUpdateTime);
2023-10-19 15:32:44 -04:00
scalarLayout->addWidget(lbLastUpdateTime, 0, 0, 1, 1 + nDigi);
2023-04-17 15:17:25 -04:00
lbScalarACQStatus->setAlignment(Qt::AlignCenter);
scalarLayout->removeWidget(lbScalarACQStatus);
2023-10-19 15:32:44 -04:00
scalarLayout->addWidget(lbScalarACQStatus, 0, 1 + nDigi);
2023-04-17 15:17:25 -04:00
int rowID = 3;
2023-04-18 13:12:05 -04:00
///==== create the header row
2023-10-04 18:03:42 -04:00
for( int ch = 0; ch < maxNChannel; ch++){
2023-04-17 15:17:25 -04:00
2023-04-18 13:12:05 -04:00
if( ch == 0 ){
QLabel * lbCH_H = new QLabel("Ch", scalar);
scalarLayout->addWidget(lbCH_H, rowID, 0);
}
2023-04-17 15:17:25 -04:00
2023-04-18 13:12:05 -04:00
rowID ++;
QLabel * lbCH = new QLabel(QString::number(ch), scalar);
lbCH->setAlignment(Qt::AlignCenter);
scalarLayout->addWidget(lbCH, rowID, 0);
2023-04-17 15:17:25 -04:00
}
///===== create the trigger and accept
leTrigger = new QLineEdit**[nDigi];
leAccept = new QLineEdit**[nDigi];
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi++){
rowID = 2;
2023-10-09 17:46:32 -04:00
leTrigger[iDigi] = new QLineEdit *[digi[iDigi]->GetNumInputCh()];
leAccept[iDigi] = new QLineEdit *[digi[iDigi]->GetNumInputCh()];
uint32_t chMask = digi[iDigi]->GetRegChannelMask();
for( int ch = 0; ch < digi[iDigi]->GetNumInputCh(); ch++){
2023-04-17 15:17:25 -04:00
2023-04-18 13:12:05 -04:00
if( ch == 0 ){
2023-10-19 15:32:44 -04:00
QWidget * hBox = new QWidget(scalar);
QHBoxLayout * hBoxLayout = new QHBoxLayout(hBox);
scalarLayout->addWidget(hBox, rowID, 2*iDigi+1, 1, 2);
2023-04-18 13:12:05 -04:00
QLabel * lbDigi = new QLabel("Digi-" + QString::number(digi[iDigi]->GetSerialNumber()), scalar);
2023-10-19 15:32:44 -04:00
lbDigi->setAlignment(Qt::AlignRight | Qt::AlignCenter);
hBoxLayout->addWidget(lbDigi);
runStatus[iDigi] = new QPushButton("", scalar);
runStatus[iDigi]->setEnabled(false);
runStatus[iDigi]->setFixedSize(QSize(20,20));
runStatus[iDigi]->setToolTip("ACQ RUN On/OFF");
runStatus[iDigi]->setToolTipDuration(-1);
hBoxLayout->addWidget(runStatus[iDigi]);
2023-04-18 13:12:05 -04:00
rowID ++;
QLabel * lbA = new QLabel("Trig. [Hz]", scalar);
lbA->setAlignment(Qt::AlignCenter);
scalarLayout->addWidget(lbA, rowID, 2*iDigi+1);
QLabel * lbB = new QLabel("Accp. [Hz]", scalar);
lbB->setAlignment(Qt::AlignCenter);
scalarLayout->addWidget(lbB, rowID, 2*iDigi+2);
}
rowID ++;
2023-04-17 15:17:25 -04:00
leTrigger[iDigi][ch] = new QLineEdit(scalar);
leTrigger[iDigi][ch]->setReadOnly(true);
leTrigger[iDigi][ch]->setAlignment(Qt::AlignRight);
scalarLayout->addWidget(leTrigger[iDigi][ch], rowID, 2*iDigi+1);
leAccept[iDigi][ch] = new QLineEdit(scalar);
leAccept[iDigi][ch]->setReadOnly(true);
leAccept[iDigi][ch]->setAlignment(Qt::AlignRight);
leAccept[iDigi][ch]->setStyleSheet("background-color: #F0F0F0;");
2023-05-24 16:04:32 -04:00
2023-10-09 17:46:32 -04:00
if( digi[iDigi]->IsInputChEqRegCh() ){
leTrigger[iDigi][ch]->setEnabled( (chMask >> ch) & 0x1 );
leAccept[iDigi][ch]->setEnabled( (chMask >> ch) & 0x1 );
}else{
2023-10-09 17:46:32 -04:00
int grpID = ch/digi[iDigi]->GetNumRegChannels();
leTrigger[iDigi][ch]->setEnabled( (chMask >> grpID) & 0x1 );
leAccept[iDigi][ch]->setEnabled( (chMask >> grpID) & 0x1 );
}
2023-05-24 16:04:32 -04:00
2023-04-17 15:17:25 -04:00
scalarLayout->addWidget(leAccept[iDigi][ch], rowID, 2*iDigi+2);
}
2023-04-14 16:12:52 -04:00
}
2023-04-14 16:12:52 -04:00
}
2023-04-17 15:17:25 -04:00
void MainWindow::CleanUpScalar(){
2023-05-15 17:18:53 -04:00
if( scalar == nullptr) return;
2023-04-17 15:17:25 -04:00
scalar->close();
if( leTrigger == nullptr ) return;
for( unsigned int i = 0; i < nDigi; i++){
2023-10-09 17:46:32 -04:00
for( int ch = 0; ch < digi[i]->GetNumInputCh(); ch ++){
2023-04-17 15:17:25 -04:00
delete leTrigger[i][ch];
delete leAccept[i][ch];
}
delete [] leTrigger[i];
delete [] leAccept[i];
}
delete [] leTrigger;
leTrigger = nullptr;
leAccept = nullptr;
2023-04-18 13:12:05 -04:00
//Clean up QLabel
QList<QLabel *> labelChildren = scalar->findChildren<QLabel *>();
for( int i = 0; i < labelChildren.size(); i++) delete labelChildren[i];
2023-04-17 15:17:25 -04:00
printf("---- end of %s \n", __func__);
}
void MainWindow::OpenScalar(){
scalar->show();
}
void MainWindow::UpdateScalar(){
2023-04-19 16:21:14 -04:00
if( digi == nullptr ) return;
2023-05-17 16:16:48 -04:00
if( scalar == nullptr ) return;
2023-05-24 16:04:32 -04:00
//if( !scalar->isVisible() ) return;
2023-04-19 16:21:14 -04:00
// digi[0]->GetData()->PrintAllData();
2023-04-19 16:21:14 -04:00
lbLastUpdateTime->setText("Last update: " + QDateTime::currentDateTime().toString("MM.dd hh:mm:ss"));
//printf("----------------------\n");
2023-05-25 14:20:55 -04:00
uint64_t totalFileSize = 0;
2023-04-19 16:21:14 -04:00
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi++){
digiMTX[iDigi].lock();
2023-05-25 14:20:55 -04:00
2023-10-19 15:32:44 -04:00
uint32_t acqStatus = digi[iDigi]->ReadRegister(DPP::AcquisitionStatus_R);
if( ( acqStatus >> 2 ) & 0x1 ){
runStatus[iDigi]->setStyleSheet("background-color : green;");
}else{
runStatus[iDigi]->setStyleSheet("");
}
// printf("### %d ", iDigi);
// digi[iDigi]->GetData()->PrintAllData(true, 10);
2023-05-25 14:20:55 -04:00
if( chkSaveData->isChecked() ) totalFileSize += digi[iDigi]->GetData()->GetTotalFileSize();
2023-10-09 17:46:32 -04:00
for( int i = 0; i < digi[iDigi]->GetNumInputCh(); i++){
QString a = "";
QString b = "";
2023-10-09 17:46:32 -04:00
if( digi[iDigi]->GetInputChannelOnOff(i) == true ) {
2023-05-24 16:04:32 -04:00
//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);
2023-05-24 16:04:32 -04:00
if( influx && a != "inf" ){
influx->AddDataPoint("Rate,Bd="+std::to_string(digi[iDigi]->GetSerialNumber()) + ",Ch=" + QString::number(i).rightJustified(2, '0').toStdString() + " value=" + a.toStdString());
2023-05-24 16:04:32 -04:00
}
}
2023-04-19 16:21:14 -04:00
}
digiMTX[iDigi].unlock();
2023-04-19 16:21:14 -04:00
}
2023-04-17 15:17:25 -04:00
2023-05-24 16:04:32 -04:00
if( influx ){
if( chkSaveData->isChecked() ) {
influx->AddDataPoint("RunID value=" + std::to_string(runID));
influx->AddDataPoint("FileSize value=" + std::to_string(totalFileSize));
}
2023-10-19 15:32:44 -04:00
//influx->PrintDataPoints();
influx->WriteData(dataBaseName.toStdString());
2023-05-24 16:04:32 -04:00
influx->ClearDataPointsBuffer();
}
2023-04-17 15:17:25 -04:00
}
//***************************************************************
//***************************************************************
2023-04-14 16:12:52 -04:00
void MainWindow::StartACQ(){
if( digi == nullptr ) return;
2023-04-19 16:21:14 -04:00
bool commentResult = true;
if( chkSaveData->isChecked()) commentResult = CommentDialog(true);
2023-04-19 16:21:14 -04:00
if( commentResult == false) return;
2023-04-18 13:12:05 -04:00
2023-05-19 16:23:04 -04:00
if( chkSaveData->isChecked() ) {
LogMsg("<font style=\"color: orange;\">===================== <b>Start a new Run-" + QString::number(runID) + "</b></font>");
2023-06-01 17:51:00 -04:00
WriteRunTimestamp(true);
2023-05-19 16:23:04 -04:00
}else{
LogMsg("<font style=\"color: orange;\">===================== <b>Start a non-save Run</b></font>");
2023-05-19 16:23:04 -04:00
}
2023-05-17 16:16:48 -04:00
2023-06-30 15:35:21 -04:00
//assume master board is the 0-th board
for( int i = (int) nDigi-1; i >= 0 ; i--){
2023-05-16 14:31:19 -04:00
if( chkSaveData->isChecked() ) {
2023-05-17 16:16:48 -04:00
if( digi[i]->GetData()->OpenSaveFile((rawDataPath + "/" + prefix + "_" + QString::number(runID).rightJustified(3, '0')).toStdString()) == false ) {
LogMsg("Cannot open save file : " + QString::fromStdString(digi[i]->GetData()->GetOutFileName() ) + ". Probably read-only?");
continue;
};
2023-05-16 14:31:19 -04:00
}
2023-05-17 16:16:48 -04:00
readDataThread[i]->SetSaveData(chkSaveData->isChecked());
LogMsg("Digi-" + QString::number(digi[i]->GetSerialNumber()) + " is starting ACQ." );
2023-05-23 11:19:43 -04:00
digi[i]->WriteRegister(DPP::SoftwareClear_W, 1);
digi[i]->GetData()->ClearData();
2023-06-30 15:35:21 -04:00
digi[i]->StartACQ();
2023-04-14 16:12:52 -04:00
readDataThread[i]->start();
}
2023-10-19 14:29:28 -04:00
if( chkSaveData->isChecked() ) SaveLastRunFile();
2023-06-30 15:35:21 -04:00
// printf("------------ wait for 2 sec \n");
// usleep(1000*1000);
// printf("------------ Go! \n");
// for( unsigned int i = 0; i < nDigi; i++) readDataThread[i]->go();
2023-04-19 16:21:14 -04:00
scalarThread->start();
2023-04-14 16:12:52 -04:00
2023-04-19 16:21:14 -04:00
if( !scalar->isVisible() ) {
scalar->show();
}else{
scalar->activateWindow();
}
lbScalarACQStatus->setText("<font style=\"color: green;\"><b>ACQ On</b></font>");
2023-04-17 14:09:21 -04:00
if( canvas != nullptr ) histThread->start();
2023-05-19 16:23:04 -04:00
bnStartACQ->setEnabled(false);
bnStartACQ->setStyleSheet("");
bnStopACQ->setEnabled(true);
bnStopACQ->setStyleSheet("background-color: red;");
2023-05-16 14:31:19 -04:00
bnOpenScope->setEnabled(false);
cbAutoRun->setEnabled(false);
2023-05-25 14:20:55 -04:00
if( digiSettings ) digiSettings->setEnabled(false);
2023-05-30 10:08:39 -04:00
if( onlineAnalyzer ) onlineAnalyzer->StartThread();
2023-05-25 14:20:55 -04:00
{//^=== elog and database
2023-08-17 12:50:45 -04:00
if( influx ){
2023-05-25 14:20:55 -04:00
influx->AddDataPoint("RunID value=" + std::to_string(runID));
2023-10-19 15:32:44 -04:00
if( elogName != "" ) influx->AddDataPoint("SavingData,ExpName=" + elogName.toStdString() + " value=1");
2023-05-25 14:20:55 -04:00
influx->WriteData(dataBaseName.toStdString());
influx->ClearDataPointsBuffer();
}
if( elogID > 0 && chkSaveData->isChecked() ){
QString msg = "================================= Run-" + QString::number(runID).rightJustified(3, '0') + "<p>"
+ QDateTime::currentDateTime().toString("MM.dd hh:mm:ss") + "<p>"
+ startComment + "<p>"
"---------------------------------<p>";
WriteElog(msg, "Run Log", "Run", runID);
}
}
2023-04-14 16:12:52 -04:00
}
void MainWindow::StopACQ(){
if( digi == nullptr ) return;
bool commentResult = true;
2023-05-25 14:20:55 -04:00
if( chkSaveData->isChecked() ) commentResult = CommentDialog(false);
if( commentResult == false) return;
2023-05-19 16:23:04 -04:00
if( chkSaveData->isChecked() ) {
LogMsg("===================== Stop Run-" + QString::number(runID));
2023-06-01 17:51:00 -04:00
WriteRunTimestamp(false);
2023-05-19 16:23:04 -04:00
}else{
LogMsg("===================== Stop a non-save Run");
}
2023-05-17 16:16:48 -04:00
2023-04-14 16:12:52 -04:00
for( unsigned int i = 0; i < nDigi; i++){
2023-10-12 16:27:56 -04:00
readDataThread[i]->Stop();
readDataThread[i]->quit();
readDataThread[i]->wait();
digiMTX[i].lock();
digi[i]->StopACQ();
digiMTX[i].unlock();
if( chkSaveData->isChecked() ) digi[i]->GetData()->CloseSaveFile();
LogMsg("Digi-" + QString::number(digi[i]->GetSerialNumber()) + " ACQ is stopped." );
2023-04-14 16:12:52 -04:00
}
2023-04-19 16:21:14 -04:00
if( scalarThread->isRunning()){
scalarThread->Stop();
scalarThread->quit();
scalarThread->wait();
}
2023-05-19 16:23:04 -04:00
2023-05-30 10:08:39 -04:00
if( onlineAnalyzer ) onlineAnalyzer->StopThread();
if( canvas && histThread->isRunning()){
2023-05-19 16:23:04 -04:00
histThread->Stop();
histThread->quit();
histThread->wait();
canvas->ClearInternalDataCount();
2023-05-19 16:23:04 -04:00
}
2023-04-14 16:12:52 -04:00
2023-04-19 16:21:14 -04:00
lbScalarACQStatus->setText("<font style=\"color: red;\"><b>ACQ Off</b></font>");
bnStartACQ->setEnabled(true);
bnStartACQ->setStyleSheet("background-color: green;");
bnStopACQ->setEnabled(false);
bnStopACQ->setStyleSheet("");
2023-05-16 14:31:19 -04:00
bnOpenScope->setEnabled(true);
cbAutoRun->setEnabled(true);
2023-05-25 14:20:55 -04:00
2023-10-19 15:32:44 -04:00
if( scalar ){
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi ++){
uint32_t acqStatus = digi[iDigi]->ReadRegister(DPP::AcquisitionStatus_R);
if( ( acqStatus >> 2 ) & 0x1 ){
runStatus[iDigi]->setStyleSheet("background-color : green;");
}else{
runStatus[iDigi]->setStyleSheet("");
}
}
}
if( digiSettings ) digiSettings->setEnabled(true);
2023-05-25 14:20:55 -04:00
{//^=== elog and database
2023-10-19 15:32:44 -04:00
if( influx && elogName != "" ) {
2023-05-25 14:20:55 -04:00
influx->AddDataPoint("SavingData,ExpName=" + elogName.toStdString() + " value=0");
influx->WriteData(dataBaseName.toStdString());
influx->ClearDataPointsBuffer();
}
if( elogID > 0 && chkSaveData->isChecked()){
QString msg = QDateTime::currentDateTime().toString("MM.dd hh:mm:ss") + "<p>" + stopComment + "<p>";
uint64_t totalFileSize = 0;
for(unsigned int i = 0 ; i < nDigi; i++){
uint64_t fileSize = digi[i]->GetData()->GetTotalFileSize();
totalFileSize += fileSize;
msg += "Digi-" + QString::number(digi[i]->GetSerialNumber()) + " Size : " + QString::number(fileSize/1024./1024., 'f', 2) + " MB<p>";
}
msg += "..... Total File Size : " + QString::number(totalFileSize/1024./1024., 'f', 2) + "MB<p>" +
"=================================<p>";
AppendElog(msg);
}
}
2023-04-14 16:12:52 -04:00
}
2023-04-11 11:13:23 -04:00
void MainWindow::AutoRun(){ //TODO
2023-04-18 13:12:05 -04:00
runTimer->disconnect(runTimerConnection);
if( chkSaveData->isChecked() == false){
StartACQ();
return;
}
if( cbAutoRun->currentData().toInt() == 0 ){
StartACQ();
//disconnect(runTimer, runTimerConnection);
//runTimer->disconnect(runTimerConnection);
return;
}else{ // auto run
needManualComment = true;
StartACQ();
runTimerConnection = connect( runTimer, &QTimer::timeout, this, [=](){
needManualComment = false;
LogMsg("Time Up, Stopping ACQ...");
StopACQ();
if( cbAutoRun->currentData().toInt() < 0 ){
bnStartACQ->setEnabled(false);
bnStartACQ->setStyleSheet("");
bnStopACQ->setEnabled(true);
bnStopACQ->setStyleSheet("background-color : red;");
LogMsg("Wait for 10 sec for next Run ...." );
QElapsedTimer elapsedTimer;
elapsedTimer.invalidate();
elapsedTimer.start();
while( elapsedTimer.elapsed() < 10000) {
if( breakAutoRepeat ) {
LogMsg("Break Auto repeat.");
bnStartACQ->setEnabled(true);
bnStartACQ->setStyleSheet("background-color : green");
bnStopACQ->setEnabled(false);
bnStopACQ->setStyleSheet("");
return;
}
QCoreApplication::processEvents();
}
needManualComment = false;
StartACQ();
runTimer->setSingleShot(true);
runTimer->start(qAbs( cbAutoRun->currentData().toInt() * 60 * 1000));
}
});
}
int timeMiliSec = cbAutoRun->currentData().toInt() * 60 * 1000;
runTimer->setSingleShot(true);
runTimer->start(qAbs(timeMiliSec));
if( timeMiliSec ) breakAutoRepeat = false;
// ///=========== single run
// if ( timeMiliSec > 0 ){
// runTimer->setSingleShot(true);
// runTimer->start(timeMiliSec);
// }
// ///=========== infinite repeat run
// if ( timeMiliSec < 0 ){
// runTimer->setSingleShot(false);
// runTimer->start(qAbs(timeMiliSec));
// }
}
void MainWindow::SetSyncMode(){
2023-06-30 15:35:21 -04:00
QDialog dialog;
dialog.setWindowTitle("Board Synchronization");
QVBoxLayout * layout = new QVBoxLayout(&dialog);
QLabel * lbInfo1 = new QLabel("This will reset 0x8100 and 0x811C \nMaster must be the 1st board.\n (could be 100 ticks offset)", &dialog);
2023-06-30 15:35:21 -04:00
lbInfo1->setStyleSheet("color : red;");
QPushButton * bnNoSync = new QPushButton("No Sync");
QPushButton * bnMethod1 = new QPushButton("Software TRG-OUT --> TRG-IN ");
QPushButton * bnMethod2 = new QPushButton("Software TRG-OUT --> S-IN ");
2023-10-19 14:29:28 -04:00
QPushButton * bnMethod3 = new QPushButton("External --> 1st S-IN,\nTRG-OUT --> S-IN ");
QPushButton * bnMethod4 = new QPushButton("External All S-IN ");
2023-06-30 15:35:21 -04:00
layout->addWidget(lbInfo1, 0);
layout->addWidget( bnNoSync, 2);
layout->addWidget(bnMethod1, 3);
layout->addWidget(bnMethod2, 4);
layout->addWidget(bnMethod3, 5);
2023-10-19 14:29:28 -04:00
layout->addWidget(bnMethod4, 6);
2023-06-30 15:35:21 -04:00
bnNoSync->setFixedHeight(40);
bnMethod1->setFixedHeight(40);
bnMethod2->setFixedHeight(40);
bnMethod3->setFixedHeight(40);
2023-10-19 14:29:28 -04:00
bnMethod4->setFixedHeight(40);
2023-06-30 15:35:21 -04:00
2023-10-19 14:29:28 -04:00
connect(bnNoSync, &QPushButton::clicked, [&](){ /// No Sync
2023-10-20 16:17:50 -04:00
LogMsg("Set No Sync across digitizers.");
LogMsg("Software start ACQ, internal clock.");
2023-06-30 15:35:21 -04:00
for(unsigned int i = 0; i < nDigi; i++){
digi[i]->WriteRegister(DPP::AcquisitionControl, 0);
digi[i]->WriteRegister(DPP::FrontPanelIOControl, 0);
}
2023-10-11 18:28:19 -04:00
if( digiSettings && digiSettings->isVisible() ) digiSettings->UpdatePanelFromMemory();
2023-06-30 15:35:21 -04:00
dialog.accept();
});
2023-10-19 14:29:28 -04:00
connect(bnMethod1, &QPushButton::clicked, [&](){ /// Software TRG-OUT --> TRG-IN
2023-10-20 16:17:50 -04:00
LogMsg("Set Software TRG-OUT -> TRG-IN");
LogMsg("Set master saftware ACQ, internal clock.");
LogMsg("Set slaves TRG-IN, external clock");
2023-06-30 15:35:21 -04:00
digi[0]->WriteRegister(DPP::AcquisitionControl, 0);
digi[0]->WriteRegister(DPP::FrontPanelIOControl, 0x10000); //RUN
for(unsigned int i = 1; i < nDigi; i++){
2023-10-11 18:28:19 -04:00
digi[i]->WriteRegister(DPP::AcquisitionControl, 0x42);
2023-06-30 15:35:21 -04:00
digi[i]->WriteRegister(DPP::FrontPanelIOControl, 0x10000); // S-IN
}
2023-10-11 18:28:19 -04:00
if( digiSettings && digiSettings->isVisible() ) digiSettings->UpdatePanelFromMemory();
2023-06-30 15:35:21 -04:00
dialog.accept();
});
2023-10-19 14:29:28 -04:00
connect(bnMethod2, &QPushButton::clicked, [&](){ /// Software TRG-OUT --> S-IN
2023-10-20 16:17:50 -04:00
LogMsg("Set Software TRG-OUT -> S-IN");
LogMsg("Set master saftware ACQ, internal clock.");
LogMsg("Set slaves S-IN, external clock");
2023-06-30 15:35:21 -04:00
digi[0]->WriteRegister(DPP::AcquisitionControl, 0);
digi[0]->WriteRegister(DPP::FrontPanelIOControl, 0x10000); //RUN
for(unsigned int i = 1; i < nDigi; i++){
2023-10-11 18:28:19 -04:00
digi[i]->WriteRegister(DPP::AcquisitionControl, 0x41);
2023-06-30 15:35:21 -04:00
digi[i]->WriteRegister(DPP::FrontPanelIOControl, 0x30000); // S-IN
}
2023-10-11 18:28:19 -04:00
if( digiSettings && digiSettings->isVisible() ) digiSettings->UpdatePanelFromMemory();
2023-06-30 15:35:21 -04:00
dialog.accept();
});
2023-10-19 14:29:28 -04:00
connect(bnMethod3, &QPushButton::clicked, [&](){ ///External TRG-OUT --> S-IN
2023-10-20 16:17:50 -04:00
LogMsg("Set master External -> S-IN, slave TRG-OUT -> S-IN");
LogMsg("Set master external S-IN, internal clock.");
LogMsg("Set slaves S-IN, external clock");
2023-10-19 14:29:28 -04:00
digi[0]->WriteRegister(DPP::AcquisitionControl, 0x01);
2023-06-30 15:35:21 -04:00
for(unsigned int i = 0; i < nDigi; i++){
2023-10-11 18:28:19 -04:00
digi[i]->WriteRegister(DPP::AcquisitionControl, 0x41);
2023-06-30 15:35:21 -04:00
digi[i]->WriteRegister(DPP::FrontPanelIOControl, 0x30000); // S-IN
}
2023-10-11 18:28:19 -04:00
if( digiSettings && digiSettings->isVisible() ) digiSettings->UpdatePanelFromMemory();
2023-06-30 15:35:21 -04:00
dialog.accept();
});
2023-10-19 14:29:28 -04:00
connect(bnMethod4, &QPushButton::clicked, [&](){ /// External All S-IN
2023-10-20 16:17:50 -04:00
LogMsg("Set all External -> S-IN");
LogMsg("Set master internal clock, slaves external clock");
2023-10-19 14:29:28 -04:00
digi[0]->WriteRegister(DPP::AcquisitionControl, 0x01);
for(unsigned int i = 1; i < nDigi; i++){
digi[i]->WriteRegister(DPP::AcquisitionControl, 0x41);
}
if( digiSettings && digiSettings->isVisible() ) digiSettings->UpdatePanelFromMemory();
dialog.accept();
});
2023-06-30 15:35:21 -04:00
dialog.exec();
2023-04-18 13:12:05 -04:00
}
bool MainWindow::CommentDialog(bool isStartRun){
if( isStartRun ) runID ++;
QString runIDStr = QString::number(runID).rightJustified(3, '0');
int result = QDialog::Rejected ;
QLineEdit *lineEdit = new QLineEdit(this);
if( needManualComment ) {
QDialog * dOpen = new QDialog(this);
if( isStartRun ) {
dOpen->setWindowTitle("Start Run Comment");
}else{
dOpen->setWindowTitle("Stop Run Comment");
}
dOpen->setWindowFlags(Qt::Dialog | Qt::WindowTitleHint | Qt::CustomizeWindowHint);
dOpen->setMinimumWidth(600);
connect(dOpen, &QDialog::finished, dOpen, &QDialog::deleteLater);
QGridLayout * vlayout = new QGridLayout(dOpen);
QLabel *label = new QLabel("Enter Run comment for <font style=\"color : red;\">Run-" + runIDStr + "</font> : ", dOpen);
QPushButton *button1 = new QPushButton("OK", dOpen);
QPushButton *button2 = new QPushButton("Cancel", dOpen);
vlayout->addWidget(label, 0, 0, 1, 2);
vlayout->addWidget(lineEdit, 1, 0, 1, 2);
vlayout->addWidget(button1, 2, 0);
vlayout->addWidget(button2, 2, 1);
connect(button1, &QPushButton::clicked, dOpen, &QDialog::accept);
connect(button2, &QPushButton::clicked, dOpen, &QDialog::reject);
result = dOpen->exec();
2023-04-18 13:12:05 -04:00
}else{
if( isStartRun ){
lineEdit->setText("Auto Start, repeat every " + QString::number(qAbs(cbAutoRun->currentData().toInt())) + " mins.");
}else{
lineEdit->setText("Auto Stop, after " + QString::number(qAbs(cbAutoRun->currentData().toInt())) + " mins.");
}
result = QDialog::Accepted;
2023-04-18 13:12:05 -04:00
}
if(result == QDialog::Accepted ){
if( isStartRun ){
startComment = lineEdit->text();
if( startComment == "") startComment = "No commet was typed.";
if( needManualComment ){
int minute = cbAutoRun->currentData().toInt();
if( minute > 0 ) {
startComment += ", single run of " + QString::number(minute) + " mins.";
}else{
startComment += ", repeat run of " + QString::number(qAbs(minute)) + " mins.";
}
}
2023-04-18 13:12:05 -04:00
startComment = "Start Comment: " + startComment;
leComment->setText(startComment);
2023-05-17 16:16:48 -04:00
leRunID->setText(QString::number(runID));
2023-04-18 13:12:05 -04:00
}else{
stopComment = lineEdit->text();
if( stopComment == "") stopComment = "No commet was typed.";
stopComment = "Stop Comment: " + stopComment;
leComment->setText(stopComment);
}
}else{
if( isStartRun ){
LogMsg("Start Run aborted. ");
runID --;
leRunID->setText(QString::number(runID));
}else{
LogMsg("Stop Run cancelled. ");
}
return false;
}
return true;
}
void MainWindow::WriteRunTimestamp(bool isStartRun){
QFile file(rawDataPath + "/RunTimeStamp.dat");
QString dateTime = QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss");
if( file.open(QIODevice::Text | QIODevice::WriteOnly | QIODevice::Append) ){
if( isStartRun ){
file.write(("Start Run | " + QString::number(runID) + " | " + dateTime + " | " + startComment + "\n").toStdString().c_str());
}else{
file.write((" Stop Run | " + QString::number(runID) + " | " + dateTime + " | " + stopComment + "\n").toStdString().c_str());
}
file.close();
}
QFile fileCSV(rawDataPath + "/RunTimeStamp.csv");
if( fileCSV.open(QIODevice::Text | QIODevice::WriteOnly | QIODevice::Append) ){
QTextStream out(&fileCSV);
if( isStartRun){
out << QString::number(runID) + "," + dateTime + "," + startComment;
}else{
out << "," + dateTime + "," + stopComment + "\n";
}
fileCSV.close();
}
UpdateRecord();
2023-04-18 13:12:05 -04:00
}
//***************************************************************
//***************************************************************
void MainWindow::OpenScope(){
if( scope == nullptr ) {
scope = new Scope(digi, nDigi, readDataThread);
2023-04-20 18:15:30 -04:00
connect(scope, &Scope::SendLogMsg, this, &MainWindow::LogMsg);
2023-05-16 14:31:19 -04:00
connect(scope, &Scope::CloseWindow, this, [=](){
bnStartACQ->setEnabled(true);
bnStartACQ->setStyleSheet("background-color: green;");
2023-05-16 14:31:19 -04:00
bnStopACQ->setEnabled(false);
bnStopACQ->setStyleSheet("");
2023-05-16 14:31:19 -04:00
});
2023-05-17 16:16:48 -04:00
connect(scope, &Scope::TellACQOnOff, this, [=](bool onOff){
2023-05-19 16:49:01 -04:00
if( scope ) {
if( onOff ) {
lbScalarACQStatus->setText("<font style=\"color: green;\"><b>ACQ On</b></font>");
if( influx ) influx->AddDataPoint("SavingData,ExpName=" + elogName.toStdString() + " value=1");
2023-05-19 16:49:01 -04:00
}else{
lbScalarACQStatus->setText("<font style=\"color: red;\"><b>ACQ Off</b></font>");
if( influx ) influx->AddDataPoint("SavingData,ExpName=" + elogName.toStdString() + " value=0");
}
if( influx ){
influx->WriteData(dataBaseName.toStdString());
influx->ClearDataPointsBuffer();
2023-05-19 16:49:01 -04:00
}
}
if( digiSettings ) digiSettings->setEnabled(!onOff);
2023-05-19 16:49:01 -04:00
if( canvas ){
if( onOff) {
2023-05-19 16:49:01 -04:00
histThread->start();
}else{
if( histThread->isRunning()){
histThread->Stop();
histThread->quit();
histThread->wait();
canvas->ClearInternalDataCount();
2023-05-19 16:49:01 -04:00
}
}
2023-05-17 16:16:48 -04:00
}
});
connect(scope, &Scope::UpdateScaler, this, &MainWindow::UpdateScalar);
connect(scope, &Scope::UpdateOtherPanels, this, [=](){ UpdateAllPanels(1); });
2023-04-18 13:12:05 -04:00
scope->show();
}else{
scope->show();
scope->activateWindow();
2023-04-18 13:12:05 -04:00
}
2023-05-16 14:31:19 -04:00
bnStartACQ->setEnabled(false);
bnStartACQ->setStyleSheet("");
2023-05-16 14:31:19 -04:00
bnStopACQ->setEnabled(false);
bnStopACQ->setStyleSheet("");
2023-05-23 14:52:23 -04:00
chkSaveData->setChecked(false);
2023-04-18 13:12:05 -04:00
}
2023-04-24 16:37:57 -04:00
//***************************************************************
//***************************************************************
void MainWindow::OpenDigiSettings(){
2023-04-18 13:12:05 -04:00
2023-04-24 16:37:57 -04:00
if( digiSettings == nullptr ) {
digiSettings = new DigiSettingsPanel(digi, nDigi, rawDataPath);
2023-04-24 16:37:57 -04:00
//connect(scope, &Scope::SendLogMsg, this, &MainWindow::LogMsg);
connect(digiSettings, &DigiSettingsPanel::UpdateOtherPanels, this, [=](){ UpdateAllPanels(2); });
2023-04-24 16:37:57 -04:00
digiSettings->show();
}else{
digiSettings->show();
digiSettings->activateWindow();
}
}
2023-04-18 13:12:05 -04:00
//***************************************************************
//***************************************************************
void MainWindow::OpenCanvas(){
if( canvas == nullptr ) {
canvas = new SingleSpectra(digi, nDigi, rawDataPath);
canvas->show();
}else{
canvas->show();
canvas->activateWindow();
}
2023-05-26 18:06:37 -04:00
}
//***************************************************************
//***************************************************************
void MainWindow::OpenAnalyzer(){
2023-08-28 15:02:56 -04:00
int id = cbAnalyzer->currentData().toInt();
if( id < 0 ) return;
2023-05-26 18:06:37 -04:00
if( onlineAnalyzer == nullptr ) {
2023-06-12 16:32:01 -04:00
//onlineAnalyzer = new Analyzer(digi, nDigi);
2023-08-28 15:02:56 -04:00
if( id == 0 ) onlineAnalyzer = new SplitPole(digi, nDigi);
if( id == 1 ) onlineAnalyzer = new Encore(digi, nDigi);
2023-10-16 16:07:14 -04:00
if( id == 2 ) onlineAnalyzer = new RAISOR(digi, nDigi);
2023-08-28 15:02:56 -04:00
if( id >= 0 ) onlineAnalyzer->show();
2023-05-26 18:06:37 -04:00
}else{
2023-08-28 15:02:56 -04:00
delete onlineAnalyzer;
if( id == 0 ) onlineAnalyzer = new SplitPole(digi, nDigi);
if( id == 1 ) onlineAnalyzer = new Encore(digi, nDigi);
2023-10-16 16:07:14 -04:00
if( id == 2 ) onlineAnalyzer = new RAISOR(digi, nDigi);
2023-08-28 15:02:56 -04:00
if( id >= 0 ){
onlineAnalyzer->show();
onlineAnalyzer->activateWindow();
}
2023-05-26 18:06:37 -04:00
}
2023-08-28 15:02:56 -04:00
cbAnalyzer->setCurrentIndex(0);
}
//***************************************************************
//***************************************************************
void MainWindow::UpdateAllPanels(int panelID){
//panelID is the source panel that call
// scope = 1;
// digiSetting = 2;
if( panelID == 1 ){ // from scope
if( digiSettings && digiSettings->isVisible() ) digiSettings->UpdatePanelFromMemory();
}
if( panelID == 2 ){
if(scope && scope->isVisible() ) scope->UpdatePanelFromMomeory();
2023-05-24 16:04:32 -04:00
if(scalar) {
for( unsigned int iDigi = 0; iDigi < nDigi; iDigi++){
2023-10-09 17:46:32 -04:00
uint32_t chMask = digi[iDigi]->GetRegChannelMask();
2023-10-11 18:28:19 -04:00
uint32_t subChMask = 0;
2023-10-09 17:46:32 -04:00
for( int ch = 0; ch < digi[iDigi]->GetNumInputCh(); ch++){
// leTrigger[iDigi][i]->setEnabled( (chMask >> i) & 0x1 );
// leAccept[iDigi][i]->setEnabled( (chMask >> i) & 0x1 );
2023-10-09 17:46:32 -04:00
if( digi[iDigi]->IsInputChEqRegCh() ){
leTrigger[iDigi][ch]->setEnabled( (chMask >> ch) & 0x1 );
leAccept[iDigi][ch]->setEnabled( (chMask >> ch) & 0x1 );
}else{
2023-10-09 17:46:32 -04:00
int grpID = ch/digi[iDigi]->GetNumRegChannels();
leTrigger[iDigi][ch]->setEnabled( (chMask >> grpID) & 0x1 );
leAccept[iDigi][ch]->setEnabled( (chMask >> grpID) & 0x1 );
2023-10-11 18:28:19 -04:00
if( (chMask >> grpID ) & 0x1 ){
int subCh = ch%digi[iDigi]->GetNumRegChannels();
if( subCh == 0 ) subChMask = digi[iDigi]->GetSettingFromMemory(DPP::QDC::SubChannelMask, grpID);
leTrigger[iDigi][ch]->setEnabled( (subChMask >> subCh) & 0x1 );
leAccept[iDigi][ch]->setEnabled( (subChMask >> subCh) & 0x1 );
}
}
2023-10-11 18:28:19 -04:00
2023-05-24 16:04:32 -04:00
}
}
}
}
}
//***************************************************************
//***************************************************************
void MainWindow::SetUpInflux(){
if( influxIP == "" ) return;
if( influx ) {
delete influx;
influx = nullptr;
}
influx = new InfluxDB(influxIP.toStdString(), false);
if( influx->TestingConnection() ){
LogMsg("<font style=\"color : green;\"> InfluxDB URL (<b>"+ influxIP + "</b>) is Valid </font>");
//==== chck database exist
//LogMsg("List of database:");
std::vector<std::string> databaseList = influx->GetDatabaseList();
bool foundDatabase = false;
for( int i = 0; i < (int) databaseList.size(); i++){
if( databaseList[i] == dataBaseName.toStdString() ) foundDatabase = true;
//LogMsg(QString::number(i) + "|" + QString::fromStdString(databaseList[i]));
}
if( foundDatabase ){
LogMsg("<font style=\"color : green;\"> Database <b>" + dataBaseName + "</b> found.");
influx->AddDataPoint("ProgramStart value=1");
influx->WriteData(dataBaseName.toStdString());
influx->ClearDataPointsBuffer();
if( influx->IsWriteOK() ){
LogMsg("<font style=\"color : green;\">test write database OK.</font>");
}else{
LogMsg("<font style=\"color : red;\">test write database FAIL.</font>");
}
}else{
LogMsg("<font style=\"color : red;\"> Database <b>" + dataBaseName + "</b> NOT found.");
delete influx;
influx = nullptr;
}
}else{
LogMsg("<font style=\"color : red;\"> InfluxDB URL (<b>"+ influxIP + "</b>) is NOT Valid </font>");
delete influx;
influx = nullptr;
}
2023-05-25 14:20:55 -04:00
if( influx == nullptr ){
leInfluxIP->setEnabled(false);
leDatabaseName->setEnabled(false);
}
}
void MainWindow::CheckElog(){
if( elogIP != "" && elogName != "" && elogUser != "" && elogPWD != "" ){
WriteElog("Testing communication.", "Testing communication.", "Other", 0);
AppendElog("test append elog.");
}else{
LogMsg("<font style=\"color : red;\">Elog missing inputs. skip.</font>");
return;
2023-05-25 14:20:55 -04:00
}
if( elogID >= 0 ) {
LogMsg("Elog testing OK.");
return;
}
//QMessageBox::information(nullptr, "Information", "Elog write Fail.\nPlease set the elog User and PWD in the programSettings.txt.\nline 6 = user.\nline 7 = pwd.");
LogMsg("Elog testing Fail");
if( elogIP == "" ) LogMsg("no elog IP");
if( elogName == "" ) LogMsg("no elog Name");
if( elogUser == "" ) LogMsg("no elog User name. Please set it in the programSettings.txt, line 6.");
if( elogPWD == "" ) LogMsg("no elog User pwd. Please set it in the programSettings.txt, line 7.");
if( elogID < 0 ) LogMsg("Possible elog IP, Name, User name, or pwd incorrect");
leElogIP->setEnabled(false);
leElogName->setEnabled(false);
}
void MainWindow::WriteElog(QString htmlText, QString subject, QString category, int runNumber){
//if( elogID < 0 ) return;
if( elogName == "" ) return;
if( elogUser == "" ) return;
if( elogPWD == "" ) return;
QStringList arg;
arg << "-h" << elogIP << "-p" << "8080" << "-l" << elogName << "-u" << elogUser << elogPWD << "-a" << "Author=FSUDAQ";
if( runNumber > 0 ) arg << "-a" << "RunNo=" + QString::number(runNumber);
if( category != "" ) arg << "-a" << "Category=" + category;
arg << "-a" << "Subject=" + subject
<< "-n " << "2" << htmlText ;
QProcess elogBash(this);
elogBash.start("elog", arg);
elogBash.waitForFinished();
QString output = QString::fromUtf8(elogBash.readAllStandardOutput());
QRegularExpression regex("ID=(\\d+)");
QRegularExpressionMatch match = regex.match(output);
if (match.hasMatch()) {
QString id = match.captured(1);
elogID = id.toInt();
} else {
elogID = -1;
}
}
void MainWindow::AppendElog(QString appendHtmlText){
if( elogID < 1 ) return;
if( elogName == "" ) return;
QProcess elogBash(this);
QStringList arg;
arg << "-h" << elogIP << "-p" << "8080" << "-l" << elogName << "-u" << elogUser << elogPWD << "-w" << QString::number(elogID);
//retrevie the elog
elogBash.start("elog", arg);
elogBash.waitForFinished();
QString output = QString::fromUtf8(elogBash.readAllStandardOutput());
//qDebug() << output;
QString separator = "========================================";
int index = output.indexOf(separator);
if( index != -1){
QString originalHtml = output.mid(index + separator.length());
arg.clear();
arg << "-h" << elogIP << "-p" << "8080" << "-l" << elogName << "-u" << elogUser << elogPWD << "-e" << QString::number(elogID)
<< "-n" << "2" << originalHtml + "<br>" + appendHtmlText;
elogBash.start("elog", arg);
elogBash.waitForFinished();
output = QString::fromUtf8(elogBash.readAllStandardOutput());
index = output.indexOf("ID=");
if( index != -1 ){
elogID = output.mid(index+3).toInt();
}else{
elogID = -1;
}
}else{
elogID = -1;
}
}
2023-04-14 16:12:52 -04:00
//***************************************************************
//***************************************************************
void MainWindow::LogMsg(QString msg){
QString outputStr = QStringLiteral("[%1] %2").arg(QDateTime::currentDateTime().toString("MM.dd hh:mm:ss"), msg);
if( logMsgHTMLMode ){
logInfo->appendHtml(outputStr);
}else{
logInfo->appendPlainText(outputStr);
}
QScrollBar *v = logInfo->verticalScrollBar();
v->setValue(v->maximum());
2023-05-30 13:57:45 -04:00
//qDebug() << outputStr;
2023-04-14 16:12:52 -04:00
logInfo->repaint();
2023-04-11 11:13:23 -04:00
}