From 408740f854bf2ac767e7dc960d2acc4abc2817bd Mon Sep 17 00:00:00 2001 From: "carina@hades" Date: Tue, 18 Oct 2022 17:23:29 -0400 Subject: [PATCH] basic settings are done. next, focus on data ACQ for multiple board --- ClassData.h | 6 +++++- FSUDAQ.cpp | 18 ++++++++++++++---- FSUDAQ.h | 3 ++- boardSetting.cpp | 27 ++++++++++++++++++++++++--- boardSetting.h | 10 +++++++++- channelSettingPHA.cpp | 11 ++++++++++- channelSettingPHA.h | 2 +- programSetting.cpp | 23 ++++++++++++++++++++++- programSetting.h | 3 +++ 9 files changed, 90 insertions(+), 13 deletions(-) diff --git a/ClassData.h b/ClassData.h index a25af18..b6c4e54 100644 --- a/ClassData.h +++ b/ClassData.h @@ -55,6 +55,7 @@ class Data{ void ClearTriggerRate(); void SaveBuffer(const char * fileName); + unsigned int GetPresentFileSize() {return presentFileSizeByte;} void PrintBuffer(); //Incorrect void DecodeBuffer(bool fastDecode, int verbose = 0); @@ -78,6 +79,7 @@ class Data{ int DecodePHADualChannelBlock(unsigned int ChannelMask, bool fastDecode, int verbose); int DecodePSDDualChannelBlock(unsigned int ChannelMask, bool fastDecode, int verbose); + unsigned int presentFileSizeByte; unsigned short saveFileIndex; }; @@ -157,7 +159,9 @@ inline void Data::SaveBuffer(const char * fileName){ } fwrite(buffer, nByte, 1, haha); - + + presentFileSizeByte = ftell(haha); + fclose(haha); } diff --git a/FSUDAQ.cpp b/FSUDAQ.cpp index 6865f3a..758700e 100644 --- a/FSUDAQ.cpp +++ b/FSUDAQ.cpp @@ -212,7 +212,7 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) { /// setup thread //saveDataThread = new TThread("hahaha", SaveData, (void *) 1); - fillHistThread = new TThread("kakaka", FillHistogram, (void *) 1); + fillHistThread = new TThread("kakaka", RunThread, (void *) 1); boardSetting = NULL; channelSettingPHA = NULL; @@ -571,6 +571,14 @@ void MainWindow::OpenChannelSetting(Int_t boardID){ } } +//TODO, should merge into LogMsg. +void MainWindow::UpdateChannelSetting(){ + if( digi == NULL ) return; + + if( channelSettingPHA != NULL ) channelSettingPHA->ChangeCh(); + if( channelSettingPSD != NULL ) channelSettingPSD->ChangeCh(); +} + void MainWindow::LogMsg(char * msg){ time_t now = time(0); @@ -708,7 +716,7 @@ void MainWindow::FitTrace(){ } //TODO use the ptr to tell which board, and each digitizer has an indivual thread for savign data and filling hists. -void * MainWindow::FillHistogram(void * ptr){ +void * MainWindow::RunThread(void * ptr){ printf("=== %s\n", __func__); if( digi == NULL ) return 0; @@ -722,13 +730,14 @@ void * MainWindow::FillHistogram(void * ptr){ uint32_t CurrentTime = 0; uint32_t ElapsedTime = 0; - TString dataFileName = dataPrefix->GetText(); + TString dataFileName = ProgramSetting::DataSavingPath + dataPrefix->GetText(); dataFileName += Form("_run%03d_%03d", (int) runIDEntry->GetNumber(), (int) digi[boardID]->GetSerialNumber()); printf("|%s|\n", dataFileName.Data()); Data * data = digi[boardID]->GetData(); - data->AllocateMemory(); + unsigned int bufferSize = digi[boardID]->CalByteForBuffer(); + data->AllocateMemory(bufferSize); while(digi[boardID]->IsRunning()){ @@ -746,6 +755,7 @@ void * MainWindow::FillHistogram(void * ptr){ if( cbMode->GetSelected() == Mode_DataRun ){ // Rate graph? data->SaveBuffer(dataFileName.Data()); + LogMsg((char *) Form("File Size : %.2f MB", data->GetPresentFileSize() / 1024./1024. ); }else{ diff --git a/FSUDAQ.h b/FSUDAQ.h index 3c6c2d7..ad7c140 100644 --- a/FSUDAQ.h +++ b/FSUDAQ.h @@ -88,7 +88,7 @@ public: void StartRun(); void StopRun(); - static void * FillHistogram(void * ptr); /// thread + static void * RunThread(void * ptr); /// thread void PlotSingleTrace(); void FitTrace(); @@ -96,6 +96,7 @@ public: void Oscilloscope(); void OpenChannelSetting(Int_t); + void UpdateChannelSetting(); void LogMsg(char * ); void GoodBye(); diff --git a/boardSetting.cpp b/boardSetting.cpp index 8d90394..46ea4e0 100644 --- a/boardSetting.cpp +++ b/boardSetting.cpp @@ -360,6 +360,13 @@ BoardSetting::BoardSetting(const TGWindow *p, UInt_t w, UInt_t h, Digitizer ** d cbFanCtrl->Resize(100, 20); cbFanCtrl->Connect("Changed()", "BoardSetting", this, "SetFanSpeedControl()"); + TGVerticalFrame * vBdCfga_haha = new TGVerticalFrame(hframeBdCfg3); hframeBdCfg3->AddFrame(vBdCfga_haha, new TGLayoutHints( kLHintsLeft, 5, 5, 10, 0) ); + + TGLabel * lbBufferSize = new TGLabel(vBdCfga_haha, "Buffer Size [MByte]", kHorizontalFrame); vBdCfga_haha->AddFrame(lbBufferSize, kaka); + txtBufferSize = new TGTextEntry(vBdCfga_haha, ""); vBdCfga_haha->AddFrame(txtBufferSize); + txtBufferSize->SetEnabled(false); + txtBufferSize->Resize(100, 20); + } {///========== ACQ control @@ -905,6 +912,8 @@ void BoardSetting::ChangeBoard(){ cbAggOrg->Select( digi[boardID]->GetSettingFromMemory(Register::DPP::AggregateOrganization) , false); numAggBLT->SetNumber( digi[boardID]->GetSettingFromMemory(Register::DPP::MaxAggregatePerBlockTransfer) , false); + FillBufferSizeTextBox(); + if( digi[boardID]->GetNChannel() == 8 ){ ///FAN Speed control only for desktop version cbFanCtrl->SetEnabled(true); @@ -1139,6 +1148,10 @@ void BoardSetting::Haha(Int_t boardID){ /// this is for sending signal to mainwi Emit("Haha(Int_t)", boardID); } +void BoardSetting::TellChannelSettingtoUpdate(){ + Emit("TellChannelSettingtoUpdate()"); +} + void BoardSetting::ResetSettingToDefault(){ /// same for PHA and PSD printf("=== %s\n", __func__); @@ -1218,6 +1231,7 @@ void BoardSetting::SetAggregateOrganization(){ /// same for PHA and PSD int boardID = boardIDEntry->GetNumber(); digi[boardID]->WriteRegister(Register::DPP::AggregateOrganization, cbAggOrg->GetSelected()); + FillBufferSizeTextBox(); } void BoardSetting::SetReadOutAggregate(){ /// same for PHA and PSD @@ -1226,6 +1240,8 @@ void BoardSetting::SetReadOutAggregate(){ /// same for PHA and PSD if( digi == NULL ) return; int boardID = boardIDEntry->GetNumber(); digi[boardID]->WriteRegister(Register::DPP::MaxAggregatePerBlockTransfer, (unsigned int) numAggBLT->GetNumber()); + + FillBufferSizeTextBox(); } @@ -1487,7 +1503,7 @@ void BoardSetting::SaveSettingFile(){ const char *filetypes[] = { "Setting File", "*.bin", 0, 0}; - + static TString dir("."); TGFileInfo fi; fi.fFileTypes = filetypes; @@ -1504,10 +1520,15 @@ void BoardSetting::SaveSettingFile(){ if( digi == NULL ) { }else{ - int boardID = boardIDEntry->GetNumber(); digi[boardID]->OpenSettingBinary( fi.fFilename ); - } } + +void BoardSetting::FillBufferSizeTextBox(){ + if( digi == NULL ) return; + int boardID = boardIDEntry->GetNumber(); + uint32_t buffer = digi[boardID]->CalByteForBuffer(); + txtBufferSize->SetText(Form("%.2f", buffer/1024./1024.)); +} diff --git a/boardSetting.h b/boardSetting.h index 88539e5..38d6a3c 100644 --- a/boardSetting.h +++ b/boardSetting.h @@ -52,6 +52,8 @@ class BoardSetting{ TGNumberEntry * numAggBLT; /// number of Agg pre Block transfer TGComboBox * cbFanCtrl; + TGTextEntry * txtBufferSize; + /// ACQ control TGComboBox * cbAcqMode; TGCheckButton * bAcqArm; @@ -177,11 +179,17 @@ class BoardSetting{ ///==== Others void LogMsg(TString msg); // *SIGNAL* - void Haha(Int_t boardID); // *SIGNAL* + /// Haha is for sending signal to mainwindow to open channel setting for the board + void Haha(Int_t boardID); // *SIGNAL* + /// this send signal to MainWindows, and tell channel setting to update + //TODO to merge to LogMsg + void TellChannelSettingtoUpdate(); // *SIGNAL* void ReadData(); void ProgramDefaultBoard(); void ProgramBoardFromFile(); void SaveSettingFile(); + + void FillBufferSizeTextBox(); }; #endif diff --git a/channelSettingPHA.cpp b/channelSettingPHA.cpp index 5137534..c9d591b 100644 --- a/channelSettingPHA.cpp +++ b/channelSettingPHA.cpp @@ -23,7 +23,7 @@ ChannelSettingPHA::ChannelSettingPHA(const TGWindow *p, UInt_t w, UInt_t h, Digi fMain->SetWindowName("Channel Settings PHA"); fMain->Connect("CloseWindow()", "ChannelSettingPHA", this, "CloseWindow()"); - TGLayoutHints * layoutHintsR = new TGLayoutHints(kLHintsRight, 5,5,3,2); /// left, right, top, bottom + TGLayoutHints * layoutHintsR = new TGLayoutHints(kLHintsRight, 5,5,3,3); /// left, right, top, bottom TGLayoutHints * layoutHints = new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 5,5,0,0); /// left, right, top, bottom TGVerticalFrame * vframe = new TGVerticalFrame(fMain); @@ -118,6 +118,11 @@ ChannelSettingPHA::ChannelSettingPHA(const TGWindow *p, UInt_t w, UInt_t h, Digi numEventAgg->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, 511); numEventAgg->Connect("Modified()", "ChannelSettingPHA", this, "SetEventAggregate()"); + TGLabel * lbBuffer = new TGLabel(vfInput1, "Buffer Size [MByte]"); vfInput1->AddFrame(lbBuffer, layoutHintsR); + eBuffer = new TGTextEntry(vfInput2,""); vfInput2->AddFrame(eBuffer, layoutHints); + eBuffer->Resize(width, 20); + eBuffer->SetEnabled(false); + ///const uint32_t ChannelDCOffset = 0x1098; /// R/W TGLabel * lbDCOffset = new TGLabel(vfInput1, "DC offset [%]"); vfInput1->AddFrame(lbDCOffset, layoutHintsR); numDCOffset = new TGNumberEntry(vfInput2, 20, 0, 0, TGNumberFormat::kNESRealTwo, TGNumberFormat::kNEANonNegative); vfInput2->AddFrame(numDCOffset, layoutHints); @@ -680,6 +685,10 @@ void ChannelSettingPHA::SetEventAggregate() { short ch = chIDEntry->GetNumber(); unsigned int temp = numEventAgg->GetNumber(); if( digi != NULL ) digi[boardID]->WriteRegister(Register::DPP::NumberEventsPerAggregate_G, temp , ch); + + uint32_t buffer = digi[boardID]->CalByteForBuffer(); + eBuffer->SetText(Form("%.2f", buffer/1024./1024.)); + } diff --git a/channelSettingPHA.h b/channelSettingPHA.h index dff4919..c200171 100644 --- a/channelSettingPHA.h +++ b/channelSettingPHA.h @@ -28,7 +28,7 @@ class ChannelSettingPHA{ TGNumberEntry * numRecordLength; TGNumberEntry * numPreTrigger; TGNumberEntry * numEventAgg; - + TGTextEntry * eBuffer ; TGNumberEntry * numTriggerThreshold; TGNumberEntry * numTriggerHoldOff; diff --git a/programSetting.cpp b/programSetting.cpp index a5ea67c..d84501c 100644 --- a/programSetting.cpp +++ b/programSetting.cpp @@ -11,6 +11,7 @@ std::string ProgramSetting::IP = "http://fsunuc.physics.fsu.edu/influx/"; std::string ProgramSetting::databaseName = "testing"; +std::string ProgramSetting::DataSavingPath = "/home/catrina/FSUDAQ/"; ProgramSetting::ProgramSetting(const TGWindow *p){ fMain = new TGMainFrame(p, 600, 400); @@ -20,7 +21,7 @@ ProgramSetting::ProgramSetting(const TGWindow *p){ TGVerticalFrame * vframe = new TGVerticalFrame(fMain); fMain->AddFrame(vframe); {///============== Database - TGGroupFrame * gfDatabase = new TGGroupFrame(vframe, "Database Setting", kHorizontalFrame); vframe->AddFrame(gfDatabase, new TGLayoutHints(kLHintsExpandY, 5, 5, 5, 5)); + TGGroupFrame * gfDatabase = new TGGroupFrame(vframe, "Database Setting", kHorizontalFrame); vframe->AddFrame(gfDatabase, new TGLayoutHints(kLHintsExpandY | kLHintsExpandX , 5, 5, 5, 5)); TGVerticalFrame * vfDB = new TGVerticalFrame(gfDatabase); gfDatabase->AddFrame(vfDB); @@ -37,6 +38,18 @@ ProgramSetting::ProgramSetting(const TGWindow *p){ } + {///============== Data Saving Path + TGGroupFrame * gfData = new TGGroupFrame(vframe, "Data Storage", kHorizontalFrame); vframe->AddFrame(gfData, new TGLayoutHints(kLHintsExpandY | kLHintsExpandY , 5, 5, 5, 5)); + + TGVerticalFrame * vfData = new TGVerticalFrame(gfData); gfData->AddFrame(vfData); + + 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); + } + {///============== Read Time event building @@ -65,3 +78,11 @@ void ProgramSetting::SetDataBase(){ printf("Name: %s\n", databaseName.c_str()); } + +void ProgramSetting::SetDataPath(){ + + DataSavingPath = txtDataPath->GetText(); + + printf("DataSavingPath : %s\n", DataSavingPath.c_str()); + +} diff --git a/programSetting.h b/programSetting.h index 87b735e..9b8eaba 100644 --- a/programSetting.h +++ b/programSetting.h @@ -22,6 +22,7 @@ class ProgramSetting{ TGTextEntry * txtIP; TGTextEntry * txtDBName; + TGTextEntry * txtDataPath; public: ProgramSetting(const TGWindow *p); @@ -31,8 +32,10 @@ class ProgramSetting{ static std::string IP; static std::string databaseName; + static std::string DataSavingPath; void SetDataBase(); + void SetDataPath(); }; #endif