From 7b42ab6d1b36a668d3041d09047c476ea44ebdb6 Mon Sep 17 00:00:00 2001 From: "Ryan@WorkStation" Date: Thu, 23 Feb 2023 12:24:39 -0500 Subject: [PATCH] add settings in digitizer class --- .gitignore | 1 + ClassDigitizer2Gen.cpp | 161 ++++++++++++++++++++++++++++------------- ClassDigitizer2Gen.h | 22 ++++-- DigiParameters.h | 13 ++++ mainwindow.cpp | 8 ++ test.cpp | 4 +- 6 files changed, 148 insertions(+), 61 deletions(-) diff --git a/.gitignore b/.gitignore index 3338506..378a66f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ test windowID screenshot.* *settings*.txt +*settings*.dat *~ *.autosave diff --git a/ClassDigitizer2Gen.cpp b/ClassDigitizer2Gen.cpp index 57850ad..e535142 100644 --- a/ClassDigitizer2Gen.cpp +++ b/ClassDigitizer2Gen.cpp @@ -45,6 +45,10 @@ void Digitizer2Gen::Initialization(){ acqON = false; + boardSettings = DIGIPARA::DIG::AllSettings; + for( int ch = 0; ch < MaxNumberOfChannel ; ch ++) chSettings[ch] = DIGIPARA::CH::AllSettings; + for( int index = 0 ; index < 4; index ++) VGASetting[index] = DIGIPARA::VGA::VGAGain; + } void Digitizer2Gen::SetDummy(unsigned short sn){ @@ -103,6 +107,11 @@ std::string Digitizer2Gen::ReadValue(const char * parameter, bool verbose){ return retValue; } +std::string Digitizer2Gen::ReadValue(Reg ¶, int ch_index, bool verbose){ + para.SetValue( ReadValue(para.GetFullPara(ch_index).c_str(), verbose) ); + return para.GetValue(); +} + std::string Digitizer2Gen::ReadDigValue(std::string shortPara, bool verbose){ std::string haha = "/par/" + shortPara; return ReadValue(haha.c_str(), verbose); @@ -113,25 +122,36 @@ std::string Digitizer2Gen::ReadChValue(std::string ch, std::string shortPara, bo return ReadValue(haha.c_str(), verbose); } -void Digitizer2Gen::WriteValue(const char * parameter, std::string value){ - if( !isConnected ) return; +bool Digitizer2Gen::WriteValue(const char * parameter, std::string value){ + if( !isConnected ) return false; printf(" %s|%-45s|%s|\n", __func__, parameter, value.c_str()); ret = CAEN_FELib_SetValue(handle, parameter, value.c_str()); if (ret != CAEN_FELib_Success) { printf("|%s||%s|\n", parameter, value.c_str()); ErrorMsg(__func__); - return; + return false; + } + return true; +} + +bool Digitizer2Gen::WriteValue(Reg ¶, std::string value, int ch_index){ + + if( WriteValue(para.GetFullPara(ch_index).c_str(), value)){ + para.SetValue(value); + return true; + }else{ + return false; } } -void Digitizer2Gen::WriteDigValue(std::string shortPara, std::string value){ +bool Digitizer2Gen::WriteDigValue(std::string shortPara, std::string value){ std::string haha = "/par/" + shortPara; - WriteValue(haha.c_str(), value); + return WriteValue(haha.c_str(), value); } -void Digitizer2Gen::WriteChValue(std::string ch, std::string shortPara, std::string value){ +bool Digitizer2Gen::WriteChValue(std::string ch, std::string shortPara, std::string value){ std::string haha = "/ch/" + ch + "/par/" + shortPara; - WriteValue(haha.c_str(), value); + return WriteValue(haha.c_str(), value); } void Digitizer2Gen::SendCommand(const char * parameter){ @@ -687,24 +707,6 @@ void Digitizer2Gen::ProgramPHA(bool testPulse){ } -void Digitizer2Gen::ReadDigitizerSettings(){ - - ReadValue("/ch/4/par/ChRecordLengthS" , true); - ReadValue("/ch/4/par/ChPreTriggerS" , true); - ReadValue("/ch/4/par/WaveResolution" , true); - ReadValue("/ch/4/par/WaveAnalogProbe0" , true); - ReadValue("/ch/4/par/WaveAnalogProbe1" , true); - ReadValue("/ch/4/par/WaveDigitalProbe0", true); - ReadValue("/ch/4/par/WaveDigitalProbe1", true); - ReadValue("/ch/4/par/WaveDigitalProbe2", true); - ReadValue("/ch/4/par/WaveDigitalProbe3", true); - - ReadValue("/ch/4/par/ChannelsTriggerMask", true); - - ReadValue("/ch/0/par/ChannelsTriggerMask", true); - -} - std::string Digitizer2Gen::ErrorMsg(const char * funcName){ printf("======== %s | %s\n",__func__, funcName); char msg[1024]; @@ -719,49 +721,77 @@ std::string Digitizer2Gen::ErrorMsg(const char * funcName){ return msg; } -void Digitizer2Gen::SaveSettingsToFile(const char * saveFileName){ - printf("Saving settings....\n"); +//^===================================================== Settings +void Digitizer2Gen::ReadAllSettings(){ + for(int i = 0; i < (int) boardSettings.size(); i++){ + if( boardSettings[i].ReadWrite() == RW::WriteOnly) continue; + ReadValue(boardSettings[i]); + } + + for(int i = 0; i < 4 ; i ++) ReadValue(VGASetting[i], i); + + for(int ch = 0; ch < nChannels ; ch++ ){ + for( int i = 0; i < (int) chSettings[ch].size(); i++){ + if( chSettings[ch][i].ReadWrite() == RW::WriteOnly) continue; + ReadValue(chSettings[ch][i], i); + } + } +} + +bool Digitizer2Gen::SaveSettingsToFile(const char * saveFileName){ + //printf("Saving settings....\n"); FILE * saveFile = fopen(saveFileName, "w"); if( saveFile ){ - std::string para, value; - for(int i = 0; i < (int) DIGIPARA::DIG::AllSettings.size(); i++){ - if( DIGIPARA::DIG::AllSettings[i].ReadWrite() == RW::WriteOnly) continue; - para = DIGIPARA::DIG::AllSettings[i].GetFullPara(); - value = ReadValue(para.c_str()); - fprintf(saveFile, "%-45s|%d|%s\n", para.c_str(), DIGIPARA::DIG::AllSettings[i].ReadWrite(), value.c_str()); + for(int i = 0; i < (int) boardSettings.size(); i++){ + if( boardSettings[i].ReadWrite() == RW::WriteOnly) continue; + ReadValue(boardSettings[i]); + fprintf(saveFile, "%-45s|%d|%4d|%s\n", boardSettings[i].GetFullPara().c_str(), + boardSettings[i].ReadWrite(), + 8000 + i, + boardSettings[i].GetValue().c_str()); } for(int i = 0; i < 4 ; i ++){ - para = DIGIPARA::VGA::VGAGain.GetFullPara(i); - value = ReadValue(para.c_str()); - fprintf(saveFile, "%-45s|%d|%s\n", para.c_str(), DIGIPARA::DIG::AllSettings[i].ReadWrite(), value.c_str()); + ReadValue(VGASetting[i], i); + fprintf(saveFile, "%-45s|%d|%4d|%s\n", VGASetting[i].GetFullPara(i).c_str(), + VGASetting[i].ReadWrite(), + 9000 + i, + VGASetting[i].GetValue().c_str()); } for(int ch = 0; ch < nChannels ; ch++ ){ - for( int i = 0; i < (int) DIGIPARA::CH::AllSettings.size(); i++){ - if( DIGIPARA::CH::AllSettings[i].ReadWrite() == RW::WriteOnly) continue; - para = DIGIPARA::CH::AllSettings[i].GetFullPara(ch); - value = ReadValue(para.c_str()); - fprintf(saveFile, "%-45s|%d|%s\n",para.c_str(), DIGIPARA::DIG::AllSettings[i].ReadWrite(),value.c_str()); + for( int i = 0; i < (int) chSettings[ch].size(); i++){ + if( chSettings[ch][i].ReadWrite() == RW::WriteOnly) continue; + ReadValue(chSettings[ch][i], i); + fprintf(saveFile, "%-45s|%d|%4d|%s\n", chSettings[ch][i].GetFullPara(ch).c_str(), + chSettings[ch][i].ReadWrite(), + ch*100 + i, + chSettings[ch][i].GetValue().c_str()); } } fclose(saveFile); - printf("Saved setting files to %s\n", saveFileName); + //printf("Saved setting files to %s\n", saveFileName); + return true; }else{ - printf("Save file accessing error."); + //printf("Save file accessing error."); } + + return false; } -void Digitizer2Gen::LoadSettingsFromFile(const char * loadFileName){ +bool Digitizer2Gen::LoadSettingsFromFile(const char * loadFileName){ FILE * loadFile = fopen(loadFileName, "r"); - char * para = new char[100]; - char * readWrite = new char[100]; - char * value = new char[100]; + if( loadFile ){ + char * para = new char[100]; + char * readWrite = new char[100]; + char * idStr = new char[100]; + char * value = new char[100]; + char line[100]; while(fgets(line, sizeof(line), loadFile) != NULL){ @@ -780,20 +810,47 @@ void Digitizer2Gen::LoadSettingsFromFile(const char * loadFileName){ if( count == 0 ) std::strcpy(para, token); if( count == 1 ) std::strcpy(readWrite, token); - if( count == 2 ) std::strcpy(value, token); - if( count > 2) break; + if( count == 2 ) std::strcpy(idStr, token); + if( count == 3 ) std::strcpy(value, token); + if( count > 3) break; count ++; token = std::strtok(nullptr, "|"); } - //printf("%s|%s|%s|\n", para, readWrite, value); + int id = atoi(idStr); + if( id < 8000){ // channel + int ch = id / 100; + int index = id - ch * 100; + chSettings[ch][index].SetValue(value); + //printf("-------id : %d, ch: %d, index : %d\n", id, ch, index); + //printf("%s|%d|%d|%s|\n", chSettings[ch][index].GetFullPara(ch).c_str(), + // chSettings[ch][index].ReadWrite(), id, + // chSettings[ch][index].GetValue().c_str()); + }else if ( 8000 <= id && id < 9000){ // board + boardSettings[id - 8000].SetValue(value); + //printf("%s|%d|%d|%s\n", boardSettings[id-8000].GetFullPara().c_str(), + // boardSettings[id-8000].ReadWrite(), id, + // boardSettings[id-8000].GetValue().c_str()); + }else{ // vga + VGASetting[id - 9000].SetValue(value); + } + //printf("%s|%s|%d|%s|\n", para, readWrite, id, value); if( std::strcmp(readWrite, "2") == 0 ) WriteValue(para, value); - } + + + delete [] para; + delete [] readWrite; + delete [] idStr; + delete [] value; + + return true; }else{ - printf("Fail to load file %s\n", loadFileName); + //printf("Fail to load file %s\n", loadFileName); } + + return false; } diff --git a/ClassDigitizer2Gen.h b/ClassDigitizer2Gen.h index 9330760..757d218 100644 --- a/ClassDigitizer2Gen.h +++ b/ClassDigitizer2Gen.h @@ -61,7 +61,12 @@ class Digitizer2Gen { uint64_t FinishedOutFilesSize; bool acqON; - + + //all read and read/write settings + std::vector boardSettings; + std::vector chSettings[MaxNumberOfChannel]; + Reg VGASetting[4]; + public: Digitizer2Gen(); ~Digitizer2Gen(); @@ -78,11 +83,13 @@ class Digitizer2Gen { int GetRet() const {return ret;}; std::string ReadValue(const char * parameter, bool verbose = false); + std::string ReadValue(Reg ¶, int ch_index = -1, bool verbose = false); std::string ReadDigValue(std::string shortPara, bool verbose = false); std::string ReadChValue(std::string ch, std::string shortPara, bool verbose = false); - void WriteValue(const char * parameter, std::string value); - void WriteDigValue(std::string shortPara, std::string value); - void WriteChValue(std::string ch, std::string shortPara, std::string value); + bool WriteValue(const char * parameter, std::string value); + bool WriteValue(Reg ¶, std::string value, int ch_index = -1); + bool WriteDigValue(std::string shortPara, std::string value); + bool WriteChValue(std::string ch, std::string shortPara, std::string value); void SendCommand(const char * parameter); void SendCommand(std::string shortPara); @@ -109,7 +116,6 @@ class Digitizer2Gen { void Reset(); void ProgramPHA(bool testPulse = false); - void ReadDigitizerSettings(); unsigned short GetNChannels() const {return nChannels;} unsigned short GetCh2ns() const {return ch2ns;} @@ -122,8 +128,10 @@ class Digitizer2Gen { unsigned int GetFileSize() const {return outFileSize;} uint64_t GetTotalFilesSize() const {return FinishedOutFilesSize + outFileSize;} - void SaveSettingsToFile(const char * saveFileName); // text file - void LoadSettingsFromFile(const char * loadFileName); + void ReadAllSettings(); // read settings from digitier and save to memory + bool SaveSettingsToFile(const char * saveFileName); // ReadAllSettings + text file + bool LoadSettingsFromFile(const char * loadFileName); // Load settings, write to digitizer and save to memory + //void PrintAllSetting(); }; diff --git a/DigiParameters.h b/DigiParameters.h index 7415f91..ee4ec1b 100644 --- a/DigiParameters.h +++ b/DigiParameters.h @@ -2,6 +2,7 @@ #define DIGITIZER_PARAMETER_H #include +#include #include enum TYPE {CH, DIG, LVDS, VGA}; @@ -11,19 +12,31 @@ enum RW { ReadOnly, WriteOnly, ReadWrite}; class Reg { private: std::string name; + std::string value; TYPE type; RW readWrite; // true for read/write, false for read-only bool isCmd; public: + Reg(){ + this->name = ""; + this->readWrite = RW::ReadWrite; + this->type = TYPE::CH; + this->isCmd = false; + this->value = ""; + } Reg(std::string para, RW readwrite, TYPE type = TYPE::CH, bool isCmd = false){ this->name = para; this->readWrite = readwrite; this->type = type; this->isCmd = isCmd; + this->value = ""; } ~Reg(){}; + void SetValue(std::string sv) { this->value = sv;} + std::string GetValue() const { return value;} + std::string GetPara() const {return name;} std::string GetFullPara(int ch_index = -1) const { switch (type){ diff --git a/mainwindow.cpp b/mainwindow.cpp index c6fa6ab..f46b4fa 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -492,6 +492,14 @@ void MainWindow::OpenDigitizers(){ //connect(readDataThread[i], &ReadDataThread::checkFileSize, this, &MainWindow::CheckOutFileSize); //connect(readDataThread[i], &ReadDataThread::endOfLastData, this, &MainWindow::CheckOutFileSize); + //*------ search for settings_XXXX.dat + QString settingFile = analysisPath + "/settings_" + QString::number(digi[i]->GetSerialNumber()) + ".dat"; + if( digi[i]->LoadSettingsFromFile( settingFile.toStdString().c_str() ) ){ + LogMsg("Found setting file " + settingFile + " and loaded."); + }else{ + LogMsg("Unable to found setting file " + settingFile + ". "); + } + SetUpScalar(); bnOpenScalar->setEnabled(true); diff --git a/test.cpp b/test.cpp index 3e0fa9b..5138e17 100644 --- a/test.cpp +++ b/test.cpp @@ -94,11 +94,11 @@ int main(int argc, char* argv[]){ //printf("--------%s \n", digi->ReadChValue("0..63", "WaveAnalogprobe0", true).c_str()); - //digi->SaveSettingsToFile("settings.txt"); + //digi->SaveSettingsToFile(("settings_" + std::to_string(digi->GetSerialNumber()) + ".dat").c_str()); printf("===================================\n"); - digi->LoadSettingsFromFile("settings.txt"); + digi->LoadSettingsFromFile("settings_21245.dat"); //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());