some buttons is working at the scope
This commit is contained in:
parent
fb02434c55
commit
898ddfa63c
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -3,6 +3,7 @@
|
|||
SOLARIS_DAQ
|
||||
*.sol
|
||||
programSettings.txt
|
||||
test
|
||||
|
||||
*~
|
||||
*.autosave
|
||||
|
|
66
.vscode/settings.json
vendored
66
.vscode/settings.json
vendored
|
@ -2,7 +2,71 @@
|
|||
"files.associations": {
|
||||
"script.C": "cpp",
|
||||
"SOLARIS_Qt6_DAQ.pro": "makefile",
|
||||
"qlineseries": "cpp"
|
||||
"qlineseries": "cpp",
|
||||
"cctype": "cpp",
|
||||
"clocale": "cpp",
|
||||
"cmath": "cpp",
|
||||
"cstdarg": "cpp",
|
||||
"cstddef": "cpp",
|
||||
"cstdio": "cpp",
|
||||
"cstdlib": "cpp",
|
||||
"cstring": "cpp",
|
||||
"ctime": "cpp",
|
||||
"cwchar": "cpp",
|
||||
"cwctype": "cpp",
|
||||
"array": "cpp",
|
||||
"atomic": "cpp",
|
||||
"bit": "cpp",
|
||||
"*.tcc": "cpp",
|
||||
"chrono": "cpp",
|
||||
"codecvt": "cpp",
|
||||
"compare": "cpp",
|
||||
"concepts": "cpp",
|
||||
"condition_variable": "cpp",
|
||||
"cstdint": "cpp",
|
||||
"deque": "cpp",
|
||||
"list": "cpp",
|
||||
"map": "cpp",
|
||||
"string": "cpp",
|
||||
"unordered_map": "cpp",
|
||||
"unordered_set": "cpp",
|
||||
"vector": "cpp",
|
||||
"exception": "cpp",
|
||||
"algorithm": "cpp",
|
||||
"functional": "cpp",
|
||||
"iterator": "cpp",
|
||||
"memory": "cpp",
|
||||
"memory_resource": "cpp",
|
||||
"numeric": "cpp",
|
||||
"optional": "cpp",
|
||||
"random": "cpp",
|
||||
"ratio": "cpp",
|
||||
"string_view": "cpp",
|
||||
"system_error": "cpp",
|
||||
"tuple": "cpp",
|
||||
"type_traits": "cpp",
|
||||
"utility": "cpp",
|
||||
"future": "cpp",
|
||||
"initializer_list": "cpp",
|
||||
"iomanip": "cpp",
|
||||
"iosfwd": "cpp",
|
||||
"iostream": "cpp",
|
||||
"istream": "cpp",
|
||||
"limits": "cpp",
|
||||
"mutex": "cpp",
|
||||
"new": "cpp",
|
||||
"numbers": "cpp",
|
||||
"ostream": "cpp",
|
||||
"semaphore": "cpp",
|
||||
"span": "cpp",
|
||||
"sstream": "cpp",
|
||||
"stdexcept": "cpp",
|
||||
"stop_token": "cpp",
|
||||
"streambuf": "cpp",
|
||||
"thread": "cpp",
|
||||
"cinttypes": "cpp",
|
||||
"typeinfo": "cpp",
|
||||
"variant": "cpp"
|
||||
},
|
||||
|
||||
"better-comments.multilineComments": true,
|
||||
|
|
|
@ -97,6 +97,11 @@ std::string Digitizer2Gen::ReadValue(const char * parameter, bool verbose){
|
|||
return retValue;
|
||||
}
|
||||
|
||||
std::string Digitizer2Gen::ReadChValue(std::string ch, std::string shortPara, bool verbose){
|
||||
std::string haha = "/ch/" + ch + "/par/" + shortPara;
|
||||
return ReadValue(haha.c_str(), verbose);
|
||||
}
|
||||
|
||||
void Digitizer2Gen::WriteValue(const char * parameter, std::string value){
|
||||
if( !isConnected ) return;
|
||||
printf(" %s| %-45s : %s\n", __func__, parameter, value.c_str());
|
||||
|
@ -107,6 +112,11 @@ void Digitizer2Gen::WriteValue(const char * parameter, std::string value){
|
|||
}
|
||||
}
|
||||
|
||||
void Digitizer2Gen::WriteChValue(std::string ch, std::string shortPara, std::string value){
|
||||
std::string haha = "/ch/" + ch + "/par/" + shortPara;
|
||||
WriteValue(haha.c_str(), value);
|
||||
}
|
||||
|
||||
void Digitizer2Gen::SendCommand(const char * parameter){
|
||||
if( !isConnected ) return;
|
||||
printf("Send Command : %s \n", parameter);
|
||||
|
|
|
@ -72,7 +72,9 @@ class Digitizer2Gen {
|
|||
int CloseDigitizer();
|
||||
|
||||
std::string ReadValue(const char * parameter, bool verbose = false);
|
||||
std::string ReadChValue(std::string ch, std::string shortPara, bool verbose = false);
|
||||
void WriteValue(const char * parameter, std::string value);
|
||||
void WriteChValue(std::string ch, std::string shortPara, std::string value);
|
||||
void SendCommand(const char * parameter);
|
||||
|
||||
uint64_t GetHandle(const char * parameter);
|
||||
|
|
187
mainwindow.cpp
187
mainwindow.cpp
|
@ -170,8 +170,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
|
|||
|
||||
if( OpenProgramSettings() ) OpenExpSettings();
|
||||
|
||||
bnOpenScope->setEnabled(true);
|
||||
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow(){
|
||||
|
@ -333,44 +331,91 @@ void MainWindow::CloseDigitizers(){
|
|||
//^###################################################################### Open Scope
|
||||
void MainWindow::OpenScope(){
|
||||
|
||||
|
||||
cbScopeDigi->clear(); ///thsi will also trigger QComboBox::currentIndexChanged
|
||||
cbScopeCh->clear();
|
||||
if( digi ) {
|
||||
|
||||
|
||||
for( int i = 0 ; i < nDigi; i++) {
|
||||
cbScopeDigi->addItem("Digi-" + QString::number(digi[i]->GetSerialNumber()), i);
|
||||
}
|
||||
|
||||
//*---- set digitizer to take full trace; since in scope mode, no data saving, speed would be fast (How fast?)
|
||||
//* when the input rate is faster than trigger rate, Digitizer will stop data taking.
|
||||
|
||||
//*---- get digi setting
|
||||
int iDigi = cbScopeDigi->currentIndex();
|
||||
int ch = cbScopeCh->currentIndex();
|
||||
|
||||
if( digi[iDigi]->IsDummy() ) return;
|
||||
|
||||
int index;
|
||||
std::string ans;
|
||||
|
||||
std::vector<std::string> haha = {"WaveAnalogProbe0", "WaveAnalogProbe1"};
|
||||
|
||||
for( int i = 0 ; i < 2; i++){
|
||||
ans = digi[iDigi]->ReadChValue(std::to_string(ch), haha[i]);
|
||||
index = cbAnaProbe[i]->findData(QString::fromStdString(ans));
|
||||
cbAnaProbe[i]->setCurrentIndex(index);
|
||||
}
|
||||
|
||||
haha.clear();
|
||||
haha = {"WaveDigitalProbe0", "WaveDigitalProbe1", "WaveDigitalProbe2", "WaveDigitalProbe3"};
|
||||
|
||||
for( int i = 0 ; i < 4; i++){
|
||||
ans = digi[iDigi]->ReadChValue(std::to_string(ch), haha[i]);
|
||||
index = cbDigProbe[i]->findData(QString::fromStdString(ans));
|
||||
cbDigProbe[i]->setCurrentIndex(index);
|
||||
}
|
||||
|
||||
ans = digi[iDigi]->ReadChValue(std::to_string(ch), "ChRecordLengthT");
|
||||
sbRL->setValue(atoi(ans.c_str()));
|
||||
|
||||
ans = digi[iDigi]->ReadChValue(std::to_string(ch), "ChPreTriggerT");
|
||||
sbPT->setValue(atoi(ans.c_str()));
|
||||
|
||||
//TODO ===== Reset and ProgramPHA should be removed
|
||||
digi[iDigi]->Reset();
|
||||
digi[iDigi]->ProgramPHA(false);
|
||||
|
||||
digi[iDigi]->WriteValue("/ch/0..63/par/ChEnable", "false");
|
||||
digi[iDigi]->WriteValue(("/ch/" + std::to_string(ch) + "/par/ChEnable").c_str(), "true");
|
||||
|
||||
digi[iDigi]->WriteChValue("0..63", "ChEnable", "false");
|
||||
digi[iDigi]->WriteChValue(std::to_string(ch), "ChEnable", "true");
|
||||
digi[iDigi]->SetPHADataFormat(0);
|
||||
|
||||
digi[iDigi]->StartACQ();
|
||||
StartScope();
|
||||
|
||||
readDataThread[iDigi]->SetScopeRun(true);
|
||||
readDataThread[iDigi]->start();
|
||||
|
||||
updateTraceThread->start();
|
||||
bnStartACQ->setEnabled(false);
|
||||
bnStopACQ->setEnabled(false);
|
||||
|
||||
|
||||
}
|
||||
|
||||
scope->show();
|
||||
|
||||
}
|
||||
|
||||
void MainWindow::StartScope(){
|
||||
|
||||
if( !digi ) return;
|
||||
|
||||
//*---- set digitizer to take full trace; since in scope mode, no data saving, speed would be fast (How fast?)
|
||||
//* when the input rate is faster than trigger rate, Digitizer will stop data taking.
|
||||
|
||||
int iDigi = cbScopeDigi->currentIndex();
|
||||
|
||||
digi[iDigi]->StartACQ();
|
||||
|
||||
readDataThread[iDigi]->SetScopeRun(true);
|
||||
readDataThread[iDigi]->start();
|
||||
|
||||
updateTraceThread->start();
|
||||
|
||||
bnScopeStart->setEnabled(false);
|
||||
bnScopeStop->setEnabled(true);
|
||||
|
||||
sbRL->setEnabled(false);
|
||||
|
||||
allowChange = true;
|
||||
|
||||
}
|
||||
|
||||
void MainWindow::StopScope(){
|
||||
|
||||
updateTraceThread->Stop();
|
||||
|
@ -380,7 +425,9 @@ void MainWindow::StopScope(){
|
|||
if(digi){
|
||||
for(int i = 0; i < nDigi; i++){
|
||||
if( digi[i]->IsDummy() ) continue;
|
||||
digiMTX.lock();
|
||||
digi[i]->StopACQ();
|
||||
digiMTX.unlock();
|
||||
|
||||
readDataThread[i]->quit();
|
||||
readDataThread[i]->wait();
|
||||
|
@ -389,6 +436,11 @@ void MainWindow::StopScope(){
|
|||
bnStopACQ->setEnabled(true);
|
||||
}
|
||||
|
||||
bnScopeStart->setEnabled(true);
|
||||
bnScopeStop->setEnabled(false);
|
||||
|
||||
sbRL->setEnabled(true);
|
||||
|
||||
}
|
||||
|
||||
void MainWindow::UpdateScope(){
|
||||
|
@ -448,6 +500,17 @@ void MainWindow::ProbeChange(QComboBox * cb[], const int size ){
|
|||
}
|
||||
}
|
||||
|
||||
digiMTX.lock();
|
||||
if( size == 2) {// analog probes
|
||||
dataTrace->setName(cb[0]->currentText());
|
||||
}
|
||||
if( size == 4){ // digitial probes
|
||||
|
||||
}
|
||||
|
||||
digiMTX.unlock();
|
||||
|
||||
|
||||
}
|
||||
|
||||
void MainWindow::SetUpPlot(){ //@--- this function run at start up
|
||||
|
@ -456,10 +519,13 @@ void MainWindow::SetUpPlot(){ //@--- this function run at start up
|
|||
scope->setGeometry(0, 0, 1000, 800);
|
||||
scope->setWindowFlags( scope->windowFlags() & ~Qt::WindowCloseButtonHint );
|
||||
|
||||
allowChange = false;
|
||||
|
||||
plot = new QChart();
|
||||
dataTrace = new QLineSeries();
|
||||
dataTrace->setName("data");
|
||||
dataTrace->setName("Analog Trace 1");
|
||||
for(int i = 0; i < 100; i ++) dataTrace->append(i, QRandomGenerator::global()->bounded(10));
|
||||
|
||||
plot->addSeries(dataTrace);
|
||||
plot->createDefaultAxes(); /// this must be after addSeries();
|
||||
plot->axes(Qt::Vertical).first()->setRange(-1, 11); /// this must be after createDefaultAxes();
|
||||
|
@ -491,6 +557,7 @@ void MainWindow::SetUpPlot(){ //@--- this function run at start up
|
|||
});
|
||||
|
||||
//------------ Probe selection
|
||||
rowID ++;
|
||||
cbAnaProbe[0] = new QComboBox(scope);
|
||||
cbAnaProbe[0]->addItem("ADC Input", "ADCInput");
|
||||
cbAnaProbe[0]->addItem("Time Filter", "TimeFiler");
|
||||
|
@ -504,20 +571,22 @@ void MainWindow::SetUpPlot(){ //@--- this function run at start up
|
|||
connect(cbAnaProbe[0], &QComboBox::currentIndexChanged, this, [=](){ this->ProbeChange(cbAnaProbe, 2);});
|
||||
connect(cbAnaProbe[1], &QComboBox::currentIndexChanged, this, [=](){ this->ProbeChange(cbAnaProbe, 2);});
|
||||
|
||||
//connect(cbAnaProbe[0], &QComboBox::currentIndexChanged, this, [=](){
|
||||
// int iDigi = cbScopeDigi->currentIndex();
|
||||
// int ch = cbScopeCh->currentIndex();
|
||||
// char str[200] = ("/ch/" + std::to_string(ch) + "/par/WaveAnalogProbe0").c_str();
|
||||
// digi[iDigi]->WriteValue(str, (cbAnaProbe[0]->currentData()).toString().toStdString());
|
||||
//});
|
||||
|
||||
cbAnaProbe[0]->setCurrentIndex(1); ///trigger the AnaProbeChange
|
||||
cbAnaProbe[0]->setCurrentIndex(0);
|
||||
cbAnaProbe[1]->setCurrentIndex(4);
|
||||
|
||||
connect(cbAnaProbe[0], &QComboBox::currentIndexChanged, this, [=](){
|
||||
int iDigi = cbScopeDigi->currentIndex();
|
||||
int ch = cbScopeCh->currentIndex();
|
||||
digiMTX.lock();
|
||||
digi[iDigi]->WriteChValue(std::to_string(ch), "WaveAnalogProbe0", (cbAnaProbe[0]->currentData()).toString().toStdString());
|
||||
digiMTX.unlock();
|
||||
});
|
||||
|
||||
|
||||
cbDigProbe[0] = new QComboBox(scope);
|
||||
cbDigProbe[0]->addItem("Trigger", "Trigger");
|
||||
cbDigProbe[0]->addItem("Time Filter Armed", "TimeFilerArmed");
|
||||
cbDigProbe[0]->addItem("Time Filter Armed", "TimeFilterArmed");
|
||||
cbDigProbe[0]->addItem("ReTrigger Guard", "ReTriggerGaurd");
|
||||
cbDigProbe[0]->addItem("Trap. basline Freeze", "EnergyFilterBaselineFreeze");
|
||||
cbDigProbe[0]->addItem("Peaking", "EnergyFilterPeaking");
|
||||
|
@ -550,29 +619,77 @@ void MainWindow::SetUpPlot(){ //@--- this function run at start up
|
|||
cbDigProbe[2]->setCurrentIndex(5);
|
||||
cbDigProbe[3]->setCurrentIndex(6);
|
||||
|
||||
layout->addWidget(cbAnaProbe[0], rowID, 2);
|
||||
layout->addWidget(cbAnaProbe[1], rowID, 3);
|
||||
layout->addWidget(cbAnaProbe[0], rowID, 0);
|
||||
layout->addWidget(cbAnaProbe[1], rowID, 1);
|
||||
|
||||
layout->addWidget(cbDigProbe[0], rowID, 2);
|
||||
layout->addWidget(cbDigProbe[1], rowID, 3);
|
||||
layout->addWidget(cbDigProbe[2], rowID, 4);
|
||||
layout->addWidget(cbDigProbe[3], rowID, 5);
|
||||
|
||||
//------------ wave settings
|
||||
rowID ++;
|
||||
layout->addWidget(cbDigProbe[0], rowID, 0);
|
||||
layout->addWidget(cbDigProbe[1], rowID, 1);
|
||||
layout->addWidget(cbDigProbe[2], rowID, 2);
|
||||
layout->addWidget(cbDigProbe[3], rowID, 3);
|
||||
QLabel * lbRL = new QLabel("Record Lenght [ns]",scope);
|
||||
layout->addWidget(lbRL, rowID, 0);
|
||||
sbRL = new QSpinBox(scope);
|
||||
sbRL->setMinimum(32);
|
||||
sbRL->setMaximum(648000);
|
||||
sbRL->setSingleStep(8);
|
||||
layout->addWidget(sbRL, rowID, 1);
|
||||
|
||||
connect(sbRL, &QSpinBox::valueChanged, this, [=](){
|
||||
if( !allowChange ) return;
|
||||
int iDigi = cbScopeDigi->currentIndex();
|
||||
digiMTX.lock();
|
||||
//StopScope();
|
||||
digi[iDigi]->WriteChValue(std::to_string(cbScopeCh->currentIndex()),
|
||||
"ChRecordLengthT",
|
||||
std::to_string(sbRL->value()));
|
||||
//StartScope();
|
||||
digiMTX.unlock();
|
||||
|
||||
plot->axes(Qt::Horizontal).first()->setRange(0, sbRL->value()/8);
|
||||
|
||||
});
|
||||
|
||||
QLabel * lbPT = new QLabel("Pre Trigger [ns]",scope);
|
||||
layout->addWidget(lbPT, rowID, 2);
|
||||
sbPT = new QSpinBox(scope);
|
||||
sbPT->setMinimum(32);
|
||||
sbPT->setMaximum(32000);
|
||||
sbPT->setSingleStep(8);
|
||||
layout->addWidget(sbPT, rowID, 3);
|
||||
|
||||
QLabel * lbDCOffset = new QLabel("DC offset [%]",scope);
|
||||
layout->addWidget(lbDCOffset, rowID, 4);
|
||||
QSpinBox * sbDCOffset = new QSpinBox(scope);
|
||||
sbDCOffset->setMinimum(0);
|
||||
sbDCOffset->setMaximum(100);
|
||||
sbDCOffset->setSingleStep(1);
|
||||
layout->addWidget(sbDCOffset, rowID, 5);
|
||||
|
||||
|
||||
|
||||
|
||||
//------------ plot view
|
||||
rowID ++;
|
||||
QChartView * plotView = new QChartView(plot);
|
||||
plotView->setRenderHints(QPainter::Antialiasing);
|
||||
layout->addWidget(plotView, rowID, 0, 1, 4);
|
||||
layout->addWidget(plotView, rowID, 0, 1, 6);
|
||||
|
||||
//------------ close button
|
||||
rowID ++;
|
||||
QPushButton * bnStop = new QPushButton("Stop", scope);
|
||||
layout->addWidget(bnStop, rowID, 2);
|
||||
connect(bnStop, &QPushButton::clicked, this, &MainWindow::StopScope);
|
||||
bnScopeStart = new QPushButton("Start", scope);
|
||||
layout->addWidget(bnScopeStart, rowID, 0);
|
||||
bnScopeStart->setEnabled(false);
|
||||
connect(bnScopeStart, &QPushButton::clicked, this, &MainWindow::StartScope);
|
||||
|
||||
bnScopeStop = new QPushButton("Stop", scope);
|
||||
layout->addWidget(bnScopeStop, rowID, 1);
|
||||
connect(bnScopeStop, &QPushButton::clicked, this, &MainWindow::StopScope);
|
||||
|
||||
QPushButton * bnClose = new QPushButton("Close", scope);
|
||||
layout->addWidget(bnClose, rowID, 3);
|
||||
layout->addWidget(bnClose, rowID, 5);
|
||||
connect(bnClose, &QPushButton::clicked, this, &MainWindow::StopScope);
|
||||
connect(bnClose, &QPushButton::clicked, scope, &QMainWindow::close);
|
||||
|
||||
|
|
|
@ -114,6 +114,7 @@ private slots:
|
|||
void CloseDigitizers();
|
||||
|
||||
void OpenScope();
|
||||
void StartScope();
|
||||
void StopScope();
|
||||
void SetUpPlot();
|
||||
void UpdateScope();
|
||||
|
@ -155,6 +156,11 @@ private:
|
|||
QComboBox * cbScopeCh;
|
||||
QComboBox * cbAnaProbe[2];
|
||||
QComboBox * cbDigProbe[4];
|
||||
QSpinBox * sbRL; // record length
|
||||
QSpinBox * sbPT; // pre trigger
|
||||
QPushButton * bnScopeStart;
|
||||
QPushButton * bnScopeStop;
|
||||
bool allowChange;
|
||||
void ProbeChange(QComboBox * cb[], const int size);
|
||||
|
||||
//@------ ACQ things
|
||||
|
|
28
makeTest.sh
Normal file
28
makeTest.sh
Normal file
|
@ -0,0 +1,28 @@
|
|||
CC="g++"
|
||||
COPTS="-fPIC -DLINUX -O2 -std=c++17 -lpthread"
|
||||
CAENLIBS="-lCAEN_FELib"
|
||||
CURLLIBS="-lcurl"
|
||||
|
||||
OBJS="ClassDigitizer2Gen.o influxdb.o"
|
||||
|
||||
#
|
||||
#ALL = test
|
||||
#
|
||||
################################################################
|
||||
|
||||
#
|
||||
#test : test.cpp ClassDigitizer2Gen.o influxdb.o
|
||||
# $(CC) $(COPTS) $(OBJS) -o test test.cpp $(CAENLIBS) $(CURLLIBS)
|
||||
#
|
||||
#ClassDigitizer2Gen.o : ClassDigitizer2Gen.cpp ClassDigitizer2Gen.h Event.h
|
||||
# $(CC) $(COPTS) -c ClassDigitizer2Gen.cpp $(CAENLIBS)
|
||||
#
|
||||
#influxdb.o : influxdb.cpp influxdb.h
|
||||
# $(CC) $(COPTS) -c influxdb.cpp $(CURLLIBS)
|
||||
|
||||
|
||||
|
||||
|
||||
${CC} ${COPTS} -c influxdb.cpp ${CURLLIBS}
|
||||
${CC} ${COPTS} -c ClassDigitizer2Gen.cpp ${CAENLIBS}
|
||||
${CC} ${COPTS} ${OBJS} -o test test.cpp ${CAENLIBS} ${CURLLIBS}
|
9
test.cpp
9
test.cpp
|
@ -92,6 +92,8 @@ int main(int argc, char* argv[]){
|
|||
digi->Reset();
|
||||
digi->ProgramPHA(false);
|
||||
|
||||
printf("--------%s \n", digi->ReadChValue(0, "WaveAnalogprobe0", true).c_str());
|
||||
|
||||
//printf("%s \n", digi->ReadValue("/ch/0/par/ChRealtimeMonitor").c_str());
|
||||
//printf("%s \n", digi->ReadValue("/ch/0/par/Energy_Nbit").c_str());
|
||||
//printf("%s \n", digi->ReadValue("/par/MaxRawDataSize").c_str());
|
||||
|
@ -119,7 +121,8 @@ int main(int argc, char* argv[]){
|
|||
parHandle = digi->GetParentHandle(parHandle); printf("%lu|%lX\n", parHandle, parHandle);
|
||||
printf("%s\n", digi->GetPath(parHandle).c_str());
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
digi->ReadDigitizerSettings();
|
||||
|
||||
digi->SetPHADataFormat(1);
|
||||
|
@ -156,6 +159,10 @@ int main(int argc, char* argv[]){
|
|||
(t1.tv_nsec-t0.tv_nsec + t1.tv_sec*1e+9 - t0.tv_sec*1e+9)*1.0/1e9);
|
||||
|
||||
digi->CloseOutFile();
|
||||
|
||||
*/
|
||||
|
||||
|
||||
digi->CloseDigitizer();
|
||||
|
||||
delete digi;
|
||||
|
|
Loading…
Reference in New Issue
Block a user