diff --git a/Makefile b/Makefile index 3e1b571..9f96a60 100644 --- a/Makefile +++ b/Makefile @@ -51,7 +51,7 @@ pixieDAQ.o : pixieDict.cxx pixieDAQ.cpp pixieDAQ.h mainSettings.o : mainSettings.cpp mainSettings.h @echo "--------- creating mainSettings.o" - $(CC) $(CFLAGS) mainSettings.cpp $(ROOT_FLAG) + $(CC) $(CFLAGS) $(PIXIE_LIB_PATH) Pixie16Class.o mainSettings.cpp $(ROOT_FLAG) diff --git a/Pixie16.config b/Pixie16.config index db56e99..bd30c18 100644 --- a/Pixie16.config +++ b/Pixie16.config @@ -23,14 +23,14 @@ F 25 0 /usr/opt/Pixie16/pixie16_revf_general_16b250m_35921_201 F 25 1 /usr/opt/Pixie16/pixie16_revf_general_16b250m_35921_2017-01-09/firmware/fippixie16_revfgeneral_16b250m_r36563.bin F 25 2 /usr/opt/Pixie16/pixie16_revf_general_16b250m_35921_2017-01-09/dsp/Pixie16DSP_revfgeneral_16b250m_r35921.ldr F 25 3 /usr/opt/Pixie16/pixie16_revf_general_16b250m_35921_2017-01-09/dsp/Pixie16DSP_revfgeneral_16b250m_r35921.var -F 25 4 /home/ryan/Pixie16/ryan/test_ryan.set +F 25 4 test_ryan.set #250MHz 12-bit F 12 0 /usr/opt/Pixie16/pixie16_revf_general_12b250m_41847_2019-05-18/firmware/syspixie16_revfgeneral_adc250mhz_r33339.bin F 12 1 /usr/opt/Pixie16/pixie16_revf_general_12b250m_41847_2019-05-18/firmware/fippixie16_revfgeneral_12b250m_r42081.bin F 12 2 /usr/opt/Pixie16/pixie16_revf_general_12b250m_41847_2019-05-18/dsp/Pixie16DSP_revfgeneral_12b250m_r41847.ldr F 12 3 /usr/opt/Pixie16/pixie16_revf_general_12b250m_41847_2019-05-18/dsp/Pixie16DSP_revfgeneral_12b250m_r41847.var -F 12 4 /home/ryan/Pixie16/ryan/test_ryan.set +F 12 4 test_ryan.set ######################################################################################################################## #120 space buffer limit diff --git a/Pixie16Class.cpp b/Pixie16Class.cpp index 71f69f7..5f0b6ab 100644 --- a/Pixie16Class.cpp +++ b/Pixie16Class.cpp @@ -170,6 +170,12 @@ void Pixie16::LoadConfigFile(bool verbose, std::string fileName){ DSPCodeFile = new char* [NumModules]; DSPParFile = new char* [NumModules]; DSPVarFile = new char* [NumModules]; + + ModRev = new unsigned short [NumModules]; + ModSerNum = new unsigned int [NumModules]; + ModADCBits = new unsigned short [NumModules]; + ModADCMSPS = new unsigned short [NumModules]; + numChannels = new unsigned short [NumModules]; OfflineMode = 0; BootPattern = 0x7F; @@ -255,23 +261,20 @@ void Pixie16::CheckHardware(){ void Pixie16::GetDigitizerInfo(unsigned short modID){ - unsigned short ModRev; - unsigned int ModSerNum; - unsigned short ModADCBits; - unsigned short ModADCMSPS; - unsigned short numChannels; - retval = Pixie16ReadModuleInfo(modID, &ModRev, &ModSerNum, &ModADCBits, &ModADCMSPS, &numChannels); + + //retval = Pixie16ReadModuleInfo(modID, &ModRev, &ModSerNum, &ModADCBits, &ModADCMSPS, &numChannels); + retval = Pixie16ReadModuleInfo(modID, &ModRev[modID], &ModSerNum[modID], &ModADCBits[modID], &ModADCMSPS[modID], &numChannels[modID]); if( CheckError("Pixie16ReadModuleInfo") < 0 ) return ; printf("------------ Module-%d \n", modID); - printf(" Revision : %d \n", ModRev); - printf(" Serial Num : %d \n", ModSerNum); - printf(" ADC Bits : %d \n", ModADCBits); - printf("ADC sampling rate : %d \n", ModADCMSPS); - printf(" # channels : %d \n", numChannels); + printf(" Revision : %d \n", ModRev[modID]); + printf(" Serial Num : %d \n", ModSerNum[modID]); + printf(" ADC Bits : %d \n", ModADCBits[modID]); + printf("ADC sampling rate : %d \n", ModADCMSPS[modID]); + printf(" # channels : %d \n", numChannels[modID]); - ch2ns[modID] = 1000/ModADCMSPS; + ch2ns[modID] = 1000/ModADCMSPS[modID]; } diff --git a/Pixie16Class.h b/Pixie16Class.h index 2e6aaff..fbbc290 100644 --- a/Pixie16Class.h +++ b/Pixie16Class.h @@ -50,8 +50,6 @@ private: unsigned short * PXISlotMap; unsigned short OfflineMode; - unsigned short * ch2ns; - char ** ComFPGAConfigFile; char ** SPFPGAConfigFile; char ** TrigFPGAConfigFile; @@ -59,6 +57,14 @@ private: char ** DSPParFile; char ** DSPVarFile; + + unsigned short * ModRev; + unsigned int * ModSerNum; + unsigned short * ModADCBits; + unsigned short * ModADCMSPS; + unsigned short * numChannels; + unsigned short * ch2ns; + unsigned short BootPattern ; int retval; @@ -111,6 +117,12 @@ public: ///========================= Setting + unsigned int GetNumModule() {return NumModules;} + unsigned int GetDigitizerSerialNumber(unsigned short modID) { return ModSerNum[modID];} + unsigned short GetDigitizerRev(unsigned short modID) { return ModRev[modID];} + unsigned short GetDigitizerADCBits(unsigned short modID) { return ModADCBits[modID];} + unsigned short GetDigitizerNumChannel(unsigned short modID) { return numChannels[modID];} + unsigned int GetDigitizerSetting(std::string parName, unsigned short modID, bool verbose = false); void PrintDigitizerSettings(unsigned short modID); diff --git a/mainSettings.cpp b/mainSettings.cpp index 23f8d8b..a767bb6 100644 --- a/mainSettings.cpp +++ b/mainSettings.cpp @@ -5,19 +5,100 @@ #include #include #include +#include +#include +#include +#include #include "mainSettings.h" -MainSettings::MainSettings(const TGWindow *p, UInt_t w, UInt_t h){ +MainSettings::MainSettings(const TGWindow *p, UInt_t w, UInt_t h, Pixie16 * pixie){ + + this->pixie = pixie; - /// Create a main frame fMain = new TGMainFrame(p,w,h); + fMain->SetWindowName("Pixie16 Channel Settings "); + fMain->Connect("CloseWindow()", "MainSettings", this, "CloseWindow()"); - /// Set a name to the main frame - fMain->SetWindowName("Pixie16 Main Settings"); + + ///Module choose + TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain, w, 50 ); + fMain->AddFrame(hframe, new TGLayoutHints(kLHintsCenterX, 2,2,2,2)); + + TGLabel * lb1 = new TGLabel(hframe, "Module ID : "); + //lb1->SetWidth(50); lb1->ChangeOptions( kFixedSize); + hframe->AddFrame(lb1, new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 5, 5, 3, 4)); - /// Map main frame + TGNumberEntry * modIDEntry = new TGNumberEntry(hframe, 0, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); + modIDEntry->SetWidth(50); + modIDEntry->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, pixie->GetNumModule()-1); + hframe->AddFrame(modIDEntry, new TGLayoutHints(kLHintsCenterX , 5, 5, 3, 4)); + + ///Show Setting + TGVerticalFrame *hframeSettings = new TGVerticalFrame(fMain, w, 600 ); + fMain->AddFrame(hframeSettings, new TGLayoutHints(kLHintsCenterX, 2,2,2,2)); + + int modID = modIDEntry->GetNumber(); + int maxCh = pixie->GetDigitizerNumChannel(modID); + + + //int numItems = 3; + //TString labelText[numItems] = {"CH", "ON/off", "Gain"}; + //TGLabel ** labelItems = new TGLabel * [numItems]; + //TGVerticalFrame ** hframeItems = new TGVerticalFrame * [numItems]; + // + //for( int j = 0; i < numItems; j++){ + // + // hframeItems[j] = new TGVerticalFrame(hframeSettings, 100, 600); + // hframeSettings->AddFrame(hframeItems[j], new TGLayoutHints(kLHintsCenterX, 2,2,2,2)); + // + // + // + // + // + //} + + // + //for( int i = 0; i < 3; i++){ + // labelItems[i] = new TGLabel(hframeLabel, Form("%s", labelText[i].Data())); + // hframeLabel->AddFrame(labelItems[i],new TGLayoutHints(kLHintsCenterX, 2,2,2,2) ); + //} + + + TGHorizontalFrame ** hframeCh = new TGHorizontalFrame * [maxCh]; + TGLabel ** lbCh = new TGLabel * [maxCh]; + TGComboBox ** cbOnOff = new TGComboBox * [maxCh]; + TGComboBox ** cbGain = new TGComboBox * [maxCh]; + + for( int i = 0; i < maxCh ; i ++){ + hframeCh[i] = new TGHorizontalFrame(hframeSettings, w, 600 ); + hframeSettings->AddFrame(hframeCh[i], new TGLayoutHints(kLHintsCenterX, 2,2,2,2)); + + lbCh[i] = new TGLabel(hframeCh[i] , Form("%02d", i)); + hframeCh[i]->AddFrame(lbCh[i], new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 5, 5, 3, 4)); + + cbOnOff[i] = new TGComboBox(hframeCh[i], i); + cbOnOff[i]->AddEntry("ON", 1); + cbOnOff[i]->AddEntry("off", 2); + cbOnOff[i]->Resize(50, 20); + pixie->GetChannelOnOff(modID, i) ? cbOnOff[i]->Select(1) : cbOnOff[i]->Select(2); + hframeCh[i]->AddFrame(cbOnOff[i], new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 5, 5, 3, 4)); + + cbGain[i] = new TGComboBox(hframeCh[i], i); + cbGain[i]->AddEntry("x1", 1); + cbGain[i]->AddEntry("x1/4", 2); + cbGain[i]->Resize(50, 20); + pixie->GetChannelGain(modID, i) ? cbGain[i]->Select(1) : cbGain[i]->Select(2); + hframeCh[i]->AddFrame(cbGain[i], new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 5, 5, 3, 4)); + + + //TGNumberEntry * modIDEntry = new TGNumberEntry(hframe, 0, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); + + } + + fMain->MapSubwindows(); + fMain->Resize(fMain->GetDefaultSize()); fMain->MapWindow(); } diff --git a/mainSettings.h b/mainSettings.h index b386e98..de45f3a 100644 --- a/mainSettings.h +++ b/mainSettings.h @@ -3,17 +3,24 @@ #include +#include "Pixie16Class.h" + class TGWindow; class TGMainFrame; class MainSettings{ private: TGMainFrame * fMain; + + Pixie16 * pixie; public: - MainSettings(const TGWindow *p, UInt_t w, UInt_t h); + MainSettings(const TGWindow *p, UInt_t w, UInt_t h, Pixie16 * pixie); virtual ~MainSettings(); + + void CloseWindow() { printf("close window\n"); delete this; } + }; diff --git a/pixieDAQ.cpp b/pixieDAQ.cpp index 5074f97..b417a6e 100644 --- a/pixieDAQ.cpp +++ b/pixieDAQ.cpp @@ -5,11 +5,25 @@ #include #include #include +#include +#include +#include #include #include #include "pixieDAQ.h" +enum MenuIdentifiers{ + + M_FILE_OPEN, + M_EXIT, + M_MAIN_CH_SETTINGS, + M_CH_SETTING, + M_DIGITIZER_SETTINGS, + M_DIGITIZER_INFOS + +}; + MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) { openPixie(); @@ -17,21 +31,65 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) { /// Create a main frame fMain = new TGMainFrame(p,w,h); ///fMain->SetWMPosition(500, 500); //does not work + fMain->Connect("CloseWindow()", "MainWindow", this, "GoodBye()"); + + ///menu + fMenuBar = new TGMenuBar(fMain, 1, 1, kHorizontalFrame); + fMain->AddFrame(fMenuBar, new TGLayoutHints(kLHintsTop | kLHintsExpandX)); + + fMenuFile = new TGPopupMenu(gClient->GetRoot()); + fMenuFile->AddEntry("&Open...", M_FILE_OPEN); + fMenuFile->AddSeparator(); + fMenuFile->AddEntry("E&xit", M_EXIT); + + fMenuFile->Connect("Activated(Int_t)", "MainWindow", this, "HandleMenu(Int_t)"); + fMenuBar->AddPopup("&File", fMenuFile, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0)); + + fMenuSettings = new TGPopupMenu(gClient->GetRoot()); + fMenuSettings->AddEntry("&Main Ch Settings", M_MAIN_CH_SETTINGS); + fMenuSettings->AddEntry("&Channel Setting", M_CH_SETTING); + fMenuSettings->AddSeparator(); + fMenuSettings->AddEntry("Digitizer &Settings", M_DIGITIZER_SETTINGS); + fMenuSettings->AddEntry("Digitizer &Info", M_DIGITIZER_INFOS); + + fMenuSettings->Connect("Activated(Int_t)", "MainWindow", this, "HandleMenu(Int_t)"); + fMenuBar->AddPopup("&Settings", fMenuSettings, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0)); + + + /// Create a horizontal frame widget with buttons + TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain,200,40); + + TGLabel * lb1 = new TGLabel(hframe, "Module ID :"); + hframe->AddFrame(lb1, new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 5, 5, 3, 4)); + + modIDEntry = new TGNumberEntry(hframe, 0, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); + modIDEntry->SetWidth(50); + modIDEntry->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, pixie->GetNumModule()-1); + hframe->AddFrame(modIDEntry, new TGLayoutHints(kLHintsCenterX , 5, 5, 3, 4)); + + TGLabel * lb2 = new TGLabel(hframe, "Ch :"); + hframe->AddFrame(lb2, new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 5, 5, 3, 4)); + + chEntry = new TGNumberEntry(hframe, 0, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); + chEntry->SetWidth(50); + chEntry->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, pixie->GetDigitizerNumChannel(0)); + hframe->AddFrame(chEntry, new TGLayoutHints(kLHintsCenterX , 5, 5, 3, 4)); + + TGTextButton *bGetADCTrace = new TGTextButton(hframe,"&Get ADC Trace"); + bGetADCTrace->Connect("Clicked()","MainWindow",this,"getADCTrace()"); + hframe->AddFrame(bGetADCTrace, new TGLayoutHints(kLHintsCenterX, 5,5,3,4)); + + + fMain->AddFrame(hframe, new TGLayoutHints(kLHintsCenterX,2,2,2,2)); + + /// Create canvas widget fEcanvas = new TRootEmbeddedCanvas("Ecanvas",fMain,800,400); fMain->AddFrame(fEcanvas, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1)); - /// Create a horizontal frame widget with buttons - TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain,200,40); - TGTextButton *draw = new TGTextButton(hframe,"&Draw"); - draw->Connect("Clicked()","MainWindow",this,"getADCTrace()"); - hframe->AddFrame(draw, new TGLayoutHints(kLHintsCenterX, 5,5,3,4)); - TGTextButton *exit = new TGTextButton(hframe,"&Exit"); - exit->Connect("Clicked()", "MainWindow", this, "GoodBye()"); - - hframe->AddFrame(exit, new TGLayoutHints(kLHintsCenterX,5,5,3,4)); - fMain->AddFrame(hframe, new TGLayoutHints(kLHintsCenterX,2,2,2,2)); + //===== TODO add msg box + /// Set a name to the main frame fMain->SetWindowName("Pixie16 DAQ"); @@ -45,7 +103,6 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) { /// Map main frame fMain->MapWindow(); - ///================ pixie ///printf("Removing Pixie16Msg.log \n"); ///remove( "Pixie16Msg.log"); @@ -60,6 +117,28 @@ MainWindow::~MainWindow() { /// Clean up used widgets: frames, buttons, layout hints fMain->Cleanup(); delete fMain; + delete fMenuBar; + delete fMenuFile; + delete fMenuSettings; +} + + +void MainWindow::HandleMenu(Int_t id){ + switch(id){ + + case M_FILE_OPEN:{ + + }break; + + case M_EXIT: GoodBye(); break; + + case M_MAIN_CH_SETTINGS: { + mainSettings = new MainSettings(gClient->GetRoot(), 600, 600, pixie); + }break; + + + } + } void MainWindow::openPixie(){ @@ -76,20 +155,14 @@ void MainWindow::openPixie(){ } void MainWindow::getADCTrace() { - /// Draws function graphics in randomly chosen interval - ///TF1 *f1 = new TF1("f1","sin(x)/x",0,gRandom->Rndm()*10); - ///f1->SetLineWidth(3); - ///f1->Draw(); - - mainSettings = new MainSettings(gClient->GetRoot(), 800, 600); - printf("--------- get ADCTrace \n"); - int ch = 6; - pixie->CaptureADCTrace(0, ch); + int modID = modIDEntry->GetNumber(); + int ch = chEntry->GetNumber(); + pixie->CaptureADCTrace(modID, ch); unsigned short * haha = pixie->GetADCTrace(); - double dt = pixie->GetChannelSetting("XDT", 0, ch); + double dt = pixie->GetChannelSetting("XDT", modID, ch); TGraph * gTrace = new TGraph(); @@ -106,6 +179,7 @@ void MainWindow::getADCTrace() { } + void MainWindow::GoodBye(){ pixie->CloseDigitizers(); diff --git a/pixieDAQ.h b/pixieDAQ.h index c72e5f1..e6d7882 100644 --- a/pixieDAQ.h +++ b/pixieDAQ.h @@ -1,32 +1,50 @@ #include #include +#include +#include +#include +#include + #include "Pixie16Class.h" #include "mainSettings.h" class TGWindow; class TGMainFrame; class TRootEmbeddedCanvas; +class TGNumberEntry; class MainWindow { RQ_OBJECT("MainWindow") private: TGMainFrame *fMain; TRootEmbeddedCanvas *fEcanvas; - + + TGMenuBar *fMenuBar; + TGPopupMenu *fMenuFile, *fMenuSettings; + + TGNumberEntry * modIDEntry, *chEntry; + Pixie16 * pixie; MainSettings * mainSettings; + public: MainWindow(const TGWindow *p, UInt_t w, UInt_t h); virtual ~MainWindow(); + + void HandleMenu(Int_t id); + + void openPixie(); void getADCTrace(); void openMainSettings(); + + void GoodBye();