From c7858024a7fce559896c2fe9036983ff4db609ce Mon Sep 17 00:00:00 2001 From: "carina@hades" Date: Wed, 26 Oct 2022 18:38:55 -0400 Subject: [PATCH] added FSUDAQ.sh for saving program settings. use gDummy for TGraph Draw range. --- .gitignore | 2 + ClassData.h | 3 +- FSUDAQ.cpp | 142 ++++++++++++++++++++++++------------- FSUDAQ.h | 5 +- channelSettingPHA.cpp | 5 ++ programSetting.cpp | 160 ++++++++++++++++++++++++++++++++++-------- programSetting.h | 16 ++++- 7 files changed, 250 insertions(+), 83 deletions(-) diff --git a/.gitignore b/.gitignore index 6d25fe7..3f04ec3 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,5 @@ test FSUDAQ test_indep EventBuilder + +FSUDAQ.sh diff --git a/ClassData.h b/ClassData.h index 69c1253..22ef3d8 100644 --- a/ClassData.h +++ b/ClassData.h @@ -437,8 +437,7 @@ inline int Data::DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDe bool isTrigger0 = (( word >> 15 ) & 0x1 ); bool dp0 = (( word >> 14 ) & 0x1 ); unsigned short wave0 = ( word & 0x3FFF); - if( wave0 >= 0x3FF0 ) wave0 = 0; - + if( SaveWaveToMemory){ if( hasDualTrace ){ tempWaveform1.push_back(wave1); diff --git a/FSUDAQ.cpp b/FSUDAQ.cpp index c3b8238..6300f31 100644 --- a/FSUDAQ.cpp +++ b/FSUDAQ.cpp @@ -46,6 +46,7 @@ Double_t traceFunc(Double_t *x, Double_t *par){ TH1F * hEnergy[MaxNBoards][MaxNChannels] = {NULL}; TH1F * hChannel[MaxNBoards] = {NULL}; +TGraph * gDummy = NULL; /// this is a dummy TGraph to set the plot range TGraph * gAnaTrace1 = NULL ; TGraph * gAnaTrace2 = NULL ; TGraph * gDigiTrace1 = NULL ; @@ -56,6 +57,8 @@ Pixel_t red, blue, green; unsigned short nDigi; Digitizer ** digi = NULL; +unsigned short lastRunID; + ///============ static members TGTextEdit * MainWindow::teLog = NULL; TRootEmbeddedCanvas * MainWindow::fEcanvas = NULL; @@ -98,7 +101,7 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) { gClient->GetColorByName("red", red); gClient->GetColorByName("blue", blue); gClient->GetColorByName("green", green); - + /// Create a main frame fMain = new TGMainFrame(p,w,h); ///fMain->SetWMPosition(500, 500); //does not work @@ -177,11 +180,13 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) { TGHorizontalFrame *hfg1 = new TGHorizontalFrame(vframe); vframe->AddFrame(hfg1 ,new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0)); TGLabel * lbDataPath = new TGLabel(hfg1, "Save Data Prefix"); hfg1->AddFrame(lbDataPath, uniLayoutHints); - dataPrefix = new TGTextEntry(hfg1, "ExpName"); hfg1->AddFrame(dataPrefix,uniLayoutHints); + dataPrefix = new TGTextEntry(hfg1, ProgramSetting::ExpName.c_str()); hfg1->AddFrame(dataPrefix,uniLayoutHints); + dataPrefix->SetEnabled(false); dataPrefix->Resize(100, 20); TGLabel * lbRunNum = new TGLabel(hfg1, "Run"); hfg1->AddFrame(lbRunNum, uniLayoutHints); runIDEntry = new TGNumberEntry(hfg1, 0, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); hfg1->AddFrame(runIDEntry, uniLayoutHints); + runIDEntry->SetNumber(lastRunID, false); runIDEntry->SetWidth(50); } @@ -255,6 +260,11 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) { //HandleMenu(M_CH_SETTING_PSD); //HandleMenu(M_REGISTER_SETTING); //HandleMenu(M_TRIGGER_SUMMARY); + //HandleMenu(M_PROGRAM_SETTINGS); + + gDummy = new TGraph(); + gDummy->SetPoint(0, 0, -1000); /// the lower left corner + gDummy->GetXaxis()->SetTitle("[ns]"); gAnaTrace1 = new TGraph(); gAnaTrace1->SetName("Analog Trace 1"); @@ -305,6 +315,7 @@ MainWindow::~MainWindow() { delete programSetting; delete fillHistThread; + /// Clean up used widgets: frames, buttons, layout hints fMain->Cleanup(); @@ -371,8 +382,8 @@ void MainWindow::HandleMenu(Int_t id){ ///========================= Program setting case M_PROGRAM_SETTINGS:{ programSetting = new ProgramSetting(gClient->GetRoot()); - - LogMsg((char*) Form("database : %s, name : %s ", ProgramSetting::IP.c_str(), ProgramSetting::databaseName.c_str() )); + programSetting->Connect("SetSetting()", "MainWindow", this, "UpdateExpName()"); + ///LogMsg((char*) Form("database : %s, name : %s ", ProgramSetting::databaseIP.c_str(), ProgramSetting::databaseName.c_str() )); }break; @@ -523,6 +534,11 @@ void MainWindow::GoodBye(){ } +void MainWindow::UpdateExpName(){ + dataPrefix->SetText(ProgramSetting::ExpName.c_str()); + runIDEntry->SetNumber(lastRunID); +} + void MainWindow::StartRun(){ LogMsg(Form("%s",__func__)); if( digi == NULL) return; @@ -562,16 +578,12 @@ void MainWindow::StopRun(){ LogMsg(Form("%s",__func__)); if( digi == NULL) return; - for( int i = 0; i < nDigi; i++){ - digi[i]->StopACQ(); - } - + for( int i = 0; i < nDigi; i++) digi[i]->StopACQ(); + fillHistThread->Join(); - for( int i = 0; i < nDigi; i++){ - ///===== clear data; - digi[i]->GetData()->ClearTriggerRate(); - } + ///===== clear data; + for( int i = 0; i < nDigi; i++) digi[i]->GetData()->ClearTriggerRate(); bStartRun->SetEnabled(true); bStopRun->SetEnabled(false); @@ -580,13 +592,17 @@ void MainWindow::StopRun(){ bPlotSingleTrace->SetEnabled(true); bFitTrace->SetEnabled(true); cbMode->SetEnabled(true); - + if( triggerSummary != NULL ) triggerSummary->CloseWindow(); if( cbMode->GetSelected() == Mode_DataRun ){ int runID = runIDEntry->GetNumber(); + lastRunID = runID; runIDEntry->SetNumber(runID +1); + + ProgramSetting::SaveProgramSetting(); } + } void MainWindow::OpenChannelSetting(Int_t boardID){ @@ -651,7 +667,16 @@ void MainWindow::PlotSingleTrace(){ Data * data = digi[boardID]->GetData(); int ch2ns = (int) digi[boardID]->GetCh2ns(); - + + fEcanvas->GetCanvas()->cd(); + uint32_t rl = digi[boardID]->GetSettingFromMemory(Register::DPP::RecordLength_G, chID); + printf("Record Length = %u \n", rl); + gDummy->SetPoint(1, 0, 0x3FFF); + gDummy->SetPoint(2, 8.*rl*ch2ns, 0x3FFF); + gDummy->Draw("AL"); + gDummy->GetXaxis()->SetRangeUser(0, 8*rl*ch2ns); + gDummy->GetYaxis()->SetRangeUser(-1000, 0x3FFF); + digi[boardID]->StartACQ(); int count = 0; @@ -672,7 +697,7 @@ void MainWindow::PlotSingleTrace(){ for( int i = 0; i < traceLength ; i++) { gAnaTrace1->SetPoint(i, i*ch2ns*(1+isDualTrace), (data->Waveform1[chID][0])[i]); - if( isDualTrace) gAnaTrace2->SetPoint(i, i*ch2ns*(1+isDualTrace), (data->Waveform2[chID][0])[i]); + } if( traceLength <= gAnaTrace1->GetN() ){ for( int i = gAnaTrace1->GetN() -1 ; i >= traceLength ; i--){ @@ -686,16 +711,21 @@ void MainWindow::PlotSingleTrace(){ gAnaTrace1->ComputeRange(xmin, ymin, xmax, ymax); for( int i = 0; i < traceLength ; i++) { gDigiTrace1->SetPoint(i, i*ch2ns*(1+isDualTrace), (ymax-ymin)*(data->DigiWaveform1[chID][0])[i] + ymin); + if( isDualTrace) { + short haha = (data->Waveform2[chID][0])[i]; + if( haha > 0x1FFF ) haha -= 0x3FFF; + gAnaTrace2->SetPoint(i, i*ch2ns*(1+isDualTrace), haha); + //gAnaTrace2->SetPoint(i, i*ch2ns*(1+isDualTrace), (data->Waveform2[chID][0])[i] ); + } } } data->ClearData(); fEcanvas->GetCanvas()->cd(); - gAnaTrace1->GetYaxis()->SetRangeUser(0, 0x3FFF); - gAnaTrace1->Draw("APL"); - gAnaTrace2->Draw("L"); - gDigiTrace1->Draw("L"); + gAnaTrace1->Draw("same L"); + gAnaTrace2->Draw("same L"); + gDigiTrace1->Draw("same L"); fEcanvas->GetCanvas()->Update(); break; @@ -817,40 +847,56 @@ void * MainWindow::RunThread(void * ptr){ data->DecodeBuffer(false, 0); } } + + if( CurrentTime == 0 ){ + fEcanvas->GetCanvas()->cd(); + + uint32_t rl = digi[boardID]->GetSettingFromMemory(Register::DPP::RecordLength_G, ch); + printf("Record Length = %u \n", rl); + gDummy->SetPoint(1, 0, 0x3FFF); + gDummy->SetPoint(2, 8.*rl*ch2ns, 0x3FFF); + gDummy->Draw("AL"); + gDummy->GetXaxis()->SetRangeUser(0, 8*rl*ch2ns); + gDummy->GetYaxis()->SetRangeUser(-1000, 0x3FFF); + } if( cbMode->GetSelected() != Mode_DataRun){ - + fEcanvas->GetCanvas()->cd(); - + + /// use the last trace + if( cbMode->GetSelected() == Mode_Oscilloscope && hasTrace){ + + unsigned short nData = data->NumEvents[ch]; + traceLength = (data->Waveform1[ch][nData-1]).size(); + if( traceLength > 0 ){ + for( int i = 0; i < traceLength; i++) { + gAnaTrace1->SetPoint(i, i*ch2ns*(1+isDualTrace), (data->Waveform1[ch][nData-1])[i]); + if( isDualTrace) { + short haha = (data->Waveform2[ch][nData-1])[i]; + if( haha > 0x1FFF ) haha -= 0x3FFF; + gAnaTrace2->SetPoint(i, i*ch2ns*(1+isDualTrace), haha ); + } + } + + if( traceLength <= gAnaTrace1->GetN() ){ + for( int i = gAnaTrace1->GetN() -1 ; i >= traceLength ; i--){ + gAnaTrace1->RemovePoint(i); + if( isDualTrace) gAnaTrace2->RemovePoint(i); + } + } + gAnaTrace1->Draw("same L"); + ///this causes warning + ///gAnaTrace1->GetYaxis();//->SetRangeUser(0, 0x3FFF); + gAnaTrace2->Draw("same L"); + } + } + CurrentTime = get_time(); ElapsedTime = CurrentTime - PreviousTime; /// milliseconds - if( ElapsedTime > 500 ){ - - /// use the last trace - if( cbMode->GetSelected() == Mode_Oscilloscope && hasTrace){ - - unsigned short nData = data->NumEvents[ch]; - traceLength = (data->Waveform1[ch][nData-1]).size(); - if( traceLength > 0 ){ - for( int i = 0; i < traceLength; i++) { - gAnaTrace1->SetPoint(i, i*ch2ns*(1+isDualTrace), (data->Waveform1[ch][nData-1])[i]); - if( isDualTrace) gAnaTrace2->SetPoint(i, i*ch2ns*(1+isDualTrace), (data->Waveform2[ch][nData-1])[i]); - } - - if( traceLength <= gAnaTrace1->GetN() ){ - for( int i = gAnaTrace1->GetN() -1 ; i >= traceLength ; i--){ - gAnaTrace1->RemovePoint(i); - if( isDualTrace) gAnaTrace2->RemovePoint(i); - } - } - gAnaTrace1->Draw("AL"); - ///this causes warning - gAnaTrace1->GetYaxis()->SetRangeUser(0, 0x3FFF); - gAnaTrace2->Draw("same L"); - } - } - + + if( ElapsedTime > 200 ){ ///Fill Channel Count for( int i = 0 ; i < digi[boardID]->GetNChannel(); i++){ @@ -882,6 +928,8 @@ void * MainWindow::RunThread(void * ptr){ int main(int argc, char **argv) { printf(" Welcome to FSU DQ \n"); + ProgramSetting::LoadProgramSetting(); + TApplication theApp("App",&argc,argv); new MainWindow(gClient->GetRoot(),800,800); theApp.Run(); diff --git a/FSUDAQ.h b/FSUDAQ.h index 76fa9ac..6d764a0 100644 --- a/FSUDAQ.h +++ b/FSUDAQ.h @@ -74,7 +74,9 @@ public: void OpenDigitizers(); void ChangeBoard(); void LoadSettingFromFile(); - + + void UpdateExpName(); + void StartRun(); void StopRun(); @@ -90,4 +92,5 @@ public: void LogMsg(char * ); void GoodBye(); + }; diff --git a/channelSettingPHA.cpp b/channelSettingPHA.cpp index c906be2..4f45c08 100644 --- a/channelSettingPHA.cpp +++ b/channelSettingPHA.cpp @@ -229,30 +229,35 @@ ChannelSettingPHA::ChannelSettingPHA(const TGWindow *p, UInt_t w, UInt_t h, int TGLabel * lbTrapRiseTime = new TGLabel(vfTrap1, "Rise time [ns]"); vfTrap1->AddFrame(lbTrapRiseTime, layoutHintsR); numTrapRiseTime = new TGNumberEntry(vfTrap2, 96, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); vfTrap2->AddFrame(numTrapRiseTime, layoutHints); numTrapRiseTime->Resize(width, 20); + numTrapRiseTime->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, 0xFFF * 4 * ch2ns); numTrapRiseTime->Connect("Modified()", "ChannelSettingPHA", this, "SetTrapRiseTime()"); ///const uint32_t TrapezoidFlatTop = 0x1060; /// R/W OK TGLabel * lbTrapFlatTop = new TGLabel(vfTrap1, "Flat Top [ns]"); vfTrap1->AddFrame(lbTrapFlatTop, layoutHintsR); numTrapFlatTop = new TGNumberEntry(vfTrap2, 96, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); vfTrap2->AddFrame(numTrapFlatTop, layoutHints); numTrapFlatTop->Resize(width, 20); + numTrapFlatTop->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, 0xFFF * 4 * ch2ns); numTrapFlatTop->Connect("Modified()", "ChannelSettingPHA", this, "SetTrapFlatTop()"); ///const uint32_t DecayTime = 0x1068; /// R/W OK TGLabel * lbDecay = new TGLabel(vfTrap1, "Decay [ns]"); vfTrap1->AddFrame(lbDecay, layoutHintsR); numDecay = new TGNumberEntry(vfTrap2, 96, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); vfTrap2->AddFrame(numDecay, layoutHints); numDecay->Resize(width, 20); + numDecay->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, 0xFFFF * 4 * ch2ns); numDecay->Connect("Modified()", "ChannelSettingPHA", this, "SetDecay()"); ///const uint32_t PeakingTime = 0x1064; /// R/W OK TGLabel * lbPeaking = new TGLabel(vfTrap1, "Peaking [ns]"); vfTrap1->AddFrame(lbPeaking, layoutHintsR); numPeaking = new TGNumberEntry(vfTrap2, 96, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); vfTrap2->AddFrame(numPeaking, layoutHints); numPeaking->Resize(width, 20); + numPeaking->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, 0xFFF * 4 * ch2ns); numPeaking->Connect("Modified()", "ChannelSettingPHA", this, "SetPeaking()"); ///const uint32_t PeakHoldOff = 0x1078; /// R/W OK TGLabel * lbPeakHoldOff = new TGLabel(vfTrap1, "Peaking Holdoff [ns]"); vfTrap1->AddFrame(lbPeakHoldOff, layoutHintsR); numPeakHoldOff = new TGNumberEntry(vfTrap2, 96, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); vfTrap2->AddFrame(numPeakHoldOff, layoutHints); numPeakHoldOff->Resize(width, 20); + numPeakHoldOff->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, 0x3FF * 4 * ch2ns); numPeakHoldOff->Connect("Modified()", "ChannelSettingPHA", this, "SetPeakHoldOff()"); /// DPP1 bit[13:12] diff --git a/programSetting.cpp b/programSetting.cpp index baf3b91..84defed 100644 --- a/programSetting.cpp +++ b/programSetting.cpp @@ -7,47 +7,76 @@ #include #include +#include +#include + #include "programSetting.h" -std::string ProgramSetting::IP = "http://fsunuc.physics.fsu.edu/influx/"; +std::string ProgramSetting::databaseIP = "http://fsunuc.physics.fsu.edu/influx/"; std::string ProgramSetting::databaseName = "testing"; std::string ProgramSetting::DataSavingPath = "/home/catrina/FSUDAQ/"; +std::string ProgramSetting::ExpName = "Test"; +std::string ProgramSetting::ElogIP = "128.186.111.127"; + +const std::string ProgramSetting::settingFileName = "FSUDAQ.sh"; + +///this is declared at FSUDAQ.cpp +extern unsigned short lastRunID; ProgramSetting::ProgramSetting(const TGWindow *p){ fMain = new TGMainFrame(p, 600, 400); fMain->SetWindowName("Program Setting"); fMain->Connect("CloseWindow()", "ProgramSetting", this, "CloseWindow()"); + TGLayoutHints * haha = new TGLayoutHints(kLHintsRight | kLHintsCenterY, 5,5,5,2); + TGLayoutHints * kaka = new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5,5,0,0); + TGVerticalFrame * vframe = new TGVerticalFrame(fMain); fMain->AddFrame(vframe); - {///============== Database - TGGroupFrame * gfDatabase = new TGGroupFrame(vframe, "Database Setting", kHorizontalFrame); vframe->AddFrame(gfDatabase, new TGLayoutHints(kLHintsExpandY | kLHintsExpandX , 5, 5, 5, 5)); + {///============== Data Saving Path + TGGroupFrame * gfData = new TGGroupFrame(vframe, "Data Storage", kHorizontalFrame); vframe->AddFrame(gfData, new TGLayoutHints(kLHintsNormal, 5, 5, 5, 5)); - TGVerticalFrame * vfDB = new TGVerticalFrame(gfDatabase); gfDatabase->AddFrame(vfDB); + TGHorizontalFrame * hfData = new TGHorizontalFrame(gfData); gfData->AddFrame(hfData, new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0)); + + TGVerticalFrame * vfLabel = new TGVerticalFrame(hfData, 200); hfData->AddFrame(vfLabel ); + TGVerticalFrame * vfTxt = new TGVerticalFrame(hfData); hfData->AddFrame(vfTxt); - TGHorizontalFrame * hfDB1 = new TGHorizontalFrame(vfDB); vfDB->AddFrame(hfDB1); - TGLabel * lbIP = new TGLabel(hfDB1, "IP :"); hfDB1->AddFrame(lbIP, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5,5,3,3)); - txtIP = new TGTextEntry(hfDB1, IP.c_str()); hfDB1->AddFrame(txtIP, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5,5,3,3)); - txtIP->Resize(300, 20); - txtIP->Connect("ReturnPressed()", "ProgramSetting", this, "SetDataBase()"); + TGLabel * lbExpName = new TGLabel(vfLabel, "ExpName :"); vfLabel->AddFrame(lbExpName, haha); + TGLabel * lbDataPath = new TGLabel(vfLabel, "Data Absolute Path :"); vfLabel->AddFrame(lbDataPath, haha); - TGHorizontalFrame * hfDB2 = new TGHorizontalFrame(vfDB); vfDB->AddFrame(hfDB2); - TGLabel * lbDBName = new TGLabel(hfDB2, "DB Name :"); hfDB2->AddFrame(lbDBName, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5,5,3,3)); - txtDBName = new TGTextEntry(hfDB2, databaseName.c_str()); hfDB2->AddFrame(txtDBName, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5,5,3,3)); - txtDBName->Connect("ReturnPressed()", "ProgramSetting", this, "SetDataBase()"); + txtExpName = new TGTextEntry(vfTxt, ExpName.c_str()); vfTxt->AddFrame(txtExpName, kaka); + txtExpName->Connect("ReturnPressed()", "ProgramSetting", this, "SetSetting()"); + txtExpName->Resize(300, 20); + + txtDataPath = new TGTextEntry(vfTxt, DataSavingPath.c_str()); vfTxt->AddFrame(txtDataPath, kaka); + txtDataPath->Connect("ReturnPressed()", "ProgramSetting", this, "SetSetting()"); + txtDataPath->Resize(300, 20); } - - {///============== Data Saving Path - TGGroupFrame * gfData = new TGGroupFrame(vframe, "Data Storage", kHorizontalFrame); vframe->AddFrame(gfData, new TGLayoutHints(kLHintsExpandY | kLHintsExpandY , 5, 5, 5, 5)); + + {///============== Database & Elog + TGGroupFrame * gfDatabase = new TGGroupFrame(vframe, "Database & Elog Setting", kHorizontalFrame); vframe->AddFrame(gfDatabase, new TGLayoutHints(kLHintsExpandX, 5, 5, 5, 5)); - TGVerticalFrame * vfData = new TGVerticalFrame(gfData); gfData->AddFrame(vfData); + TGHorizontalFrame * hfDB1 = new TGHorizontalFrame(gfDatabase); gfDatabase->AddFrame(hfDB1, new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0)); - TGHorizontalFrame * hfData = new TGHorizontalFrame(vfData); vfData->AddFrame(hfData); - TGLabel * lbDataPath = new TGLabel(hfData, "Data Absolute Path :"); hfData->AddFrame(lbDataPath, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5,5,3,3)); - txtDataPath = new TGTextEntry(hfData, DataSavingPath.c_str()); hfData->AddFrame(txtDataPath, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5,5,3,3)); - txtDataPath->Connect("ReturnPressed()", "ProgramSetting", this, "SetDataPath()"); - txtDataPath->Resize(300, 20); + TGVerticalFrame * vfLabel = new TGVerticalFrame(hfDB1, 200); hfDB1->AddFrame(vfLabel); + TGVerticalFrame * vfTxt = new TGVerticalFrame(hfDB1); hfDB1->AddFrame(vfTxt); + + TGLabel * lbIP = new TGLabel(vfLabel, "IP :"); vfLabel->AddFrame(lbIP, haha); + TGLabel * lbDBName = new TGLabel(vfLabel, "DB Name :"); vfLabel->AddFrame(lbDBName, haha); + TGLabel * lbElogIP = new TGLabel(vfLabel, "Elog IP :"); vfLabel->AddFrame(lbElogIP, haha); + + txtIP = new TGTextEntry(vfTxt, databaseIP.c_str()); vfTxt->AddFrame(txtIP, kaka); + txtIP->Resize(300, 20); + txtIP->Connect("ReturnPressed()", "ProgramSetting", this, "SetSetting()"); + + txtDBName = new TGTextEntry(vfTxt, databaseName.c_str()); vfTxt->AddFrame(txtDBName, kaka); + txtDBName->Resize(300, 20); + txtDBName->Connect("ReturnPressed()", "ProgramSetting", this, "SetSetting()"); + + txtElogIP = new TGTextEntry(vfTxt, ElogIP.c_str()); vfTxt->AddFrame(txtElogIP, kaka); + txtElogIP->Resize(300, 20); + txtElogIP->Connect("ReturnPressed()", "ProgramSetting", this, "SetSetting()"); } {///============== Read Time event building @@ -65,25 +94,96 @@ ProgramSetting::~ProgramSetting(){ delete txtIP; delete txtDBName; delete txtDataPath; + delete txtExpName; + delete txtElogIP; fMain->Cleanup(); delete fMain; } -void ProgramSetting::SetDataBase(){ +void ProgramSetting::SetSetting(){ - IP = txtIP->GetText(); + DataSavingPath = txtDataPath->GetText(); + ExpName = txtExpName->GetText(); + + databaseIP = txtIP->GetText(); databaseName = txtDBName->GetText(); - printf("IP: %s\n", IP.c_str()); - printf("Name: %s\n", databaseName.c_str()); + ElogIP = txtElogIP->GetText(); + + PrintSettings(); + + SaveProgramSetting(); + + Emit("SetSetting()"); } -void ProgramSetting::SetDataPath(){ +void ProgramSetting::PrintSettings(){ - DataSavingPath = txtDataPath->GetText(); - - printf("DataSavingPath : %s\n", DataSavingPath.c_str()); + printf("Data Saving Path : %s\n", DataSavingPath.c_str()); + printf(" ExpName : %s\n", ExpName.c_str()); + printf(" IP : %s\n", databaseIP.c_str()); + printf(" Name : %s\n", databaseName.c_str()); + printf(" Elog IP : %s\n", ElogIP.c_str()); + printf(" last run ID : %d\n", lastRunID); } + +void ProgramSetting::LoadProgramSetting(){ + + std::ifstream fileIn; + fileIn.open(ProgramSetting::settingFileName.c_str(), std::ios::in); + + if( fileIn ){ + std::string line; + int lineNum = 0; + size_t pos = 0; + while (fileIn.good() ){ + std::getline(fileIn, line); + lineNum ++; + pos = line.find("="); + if( pos > 1 ){ + pos += 2; + ///printf("%d | %s , %d \n", lineNum, line.c_str(), pos); + switch ( lineNum ){ + case 1: ProgramSetting::ExpName = line.substr(pos); break; + case 2: ProgramSetting::DataSavingPath = line.substr(pos); break; + case 3: ProgramSetting::databaseIP = line.substr(pos); break; + case 4: ProgramSetting::databaseName = line.substr(pos); break; + case 5: ProgramSetting::ElogIP = line.substr(pos); break; + case 6: lastRunID = std::atoi(line.substr(pos).c_str()); break; + } + } + } + + fileIn.close(); + }else{ + printf("%s | Cannot open file : %s.\n", __func__, ProgramSetting::settingFileName.c_str()); + printf("Creating One with default setting"); + SaveProgramSetting(); + } + + PrintSettings(); +} + +void ProgramSetting::SaveProgramSetting(){ + + printf("+++++++ %s \n", __func__); + + FILE * fileOut = fopen(ProgramSetting::settingFileName.c_str(), "w"); + if( fileOut != NULL ){ + + fputs( ("ExpName = " + ProgramSetting::ExpName + "\n").c_str(), fileOut); + fputs( ("DataPath = " + ProgramSetting::DataSavingPath + "\n").c_str(), fileOut); + fputs( ("DatabaseIP = " + ProgramSetting::databaseIP + "\n").c_str(), fileOut); + fputs( ("DatabaseName = " + ProgramSetting::databaseName + "\n").c_str(), fileOut); + fputs( ("ElogIP = " + ProgramSetting::ElogIP + "\n").c_str(), fileOut); + fputs( ("lastRunID = " + std::to_string(lastRunID) + "\n").c_str(), fileOut); + + fclose(fileOut); + }else{ + printf("%s | Cannot open file : %s.\n", __func__, ProgramSetting::settingFileName.c_str()); + } + +} diff --git a/programSetting.h b/programSetting.h index 9b8eaba..d6643ea 100644 --- a/programSetting.h +++ b/programSetting.h @@ -23,6 +23,8 @@ class ProgramSetting{ TGTextEntry * txtIP; TGTextEntry * txtDBName; TGTextEntry * txtDataPath; + TGTextEntry * txtExpName; + TGTextEntry * txtElogIP; public: ProgramSetting(const TGWindow *p); @@ -30,12 +32,20 @@ class ProgramSetting{ void CloseWindow() { delete this;} - static std::string IP; + static std::string databaseIP; static std::string databaseName; static std::string DataSavingPath; + static std::string ExpName; + static std::string ElogIP; - void SetDataBase(); - void SetDataPath(); + const static std::string settingFileName; // fixed as FSUDAQ.sh + + void SetSetting(); // *SIGNAL* + + static void PrintSettings(); + static void LoadProgramSetting(); + static void SaveProgramSetting(); + }; #endif