Subversion Repositories f9daq

Rev

Blame | Last modification | View Log | RSS feed

  1. // You can try to increase the font size in $(ROOTSYS)/etc/system.rootrc or in your own custom ~/.rootrc
  2. #include <TApplication.h>
  3. #include <TGClient.h>
  4. #include <TCanvas.h>
  5. #include <TF1.h>
  6. #include <TRandom.h>
  7. #include <TGButton.h>
  8. #include <TRootEmbeddedCanvas.h>
  9. #include <TGSimpleTableInterface.h>
  10. #include <TGTable.h>
  11. #include <TGLabel.h>
  12. #include <TGFrame.h>
  13. #include <TGNumberEntry.h>
  14. #include <TGLayout.h>
  15. #include <TGStatusBar.h>
  16. #include <TGTableLayout.h>
  17. #include <TGTextEntry.h>
  18. #include <TGComboBox.h>
  19. #include <TGButton.h>
  20. #include <TGTab.h>
  21. #include <TTimer.h>
  22. #include <TColor.h>
  23. #include <TH2F.h>
  24. #include <TFile.h>
  25. #include <TStyle.h>
  26.  
  27. #include "Feb_Gui.h"
  28. #include <stdint.h>
  29. #include "dataio.h"
  30. #include "sa02lib.h"
  31.  
  32. #include <sys/time.h>
  33. #include <sys/stat.h>
  34. #include <signal.h>
  35.  
  36.  
  37. #define TRUE 1
  38. #define FALSE 0
  39. #define TIMEOUT 3
  40. int timer_out;
  41. struct sigaction oact;
  42.  
  43.  
  44. int ctrl_c=0;
  45.  
  46. void
  47. set_plot_style()
  48. {
  49.     const Int_t NRGBs = 5;
  50.     const Int_t NCont = 255;
  51.  
  52.     Double_t stops[NRGBs] = { 0.00, 0.34, 0.61, 0.84, 1.00 };
  53.     Double_t red[NRGBs]   = { 0.00, 0.00, 0.87, 1.00, 0.51 };
  54.     Double_t green[NRGBs] = { 0.00, 0.81, 1.00, 0.20, 0.00 };
  55.     Double_t blue[NRGBs]  = { 0.51, 1.00, 0.12, 0.00, 0.00 };
  56.     TColor::CreateGradientColorTable(NRGBs, stops, red, green, blue, NCont);
  57.     gStyle->SetNumberContours(NCont);
  58. }
  59.  
  60. void sa02Timerast (int signumber)
  61. {
  62.     timer_out = TRUE;
  63.     sa02TimerOut = TRUE;
  64.     sa02Printf("->>> TIMEOUT !!!\n");
  65.     ctrl_c = 1;
  66.  
  67. }
  68.  
  69.  
  70. void tmlnk (int tout)
  71. {
  72.     timer_out = FALSE;
  73.     struct sigaction act;
  74.     struct itimerval tdelay;
  75.  
  76.     act.sa_handler = sa02Timerast;
  77.     sigemptyset (&act.sa_mask);
  78.     act.sa_flags = 0;
  79.  
  80.     tdelay.it_value.tv_sec = tout / 100;
  81.     tdelay.it_value.tv_usec = 10000 * (tout % 100);
  82.     tdelay.it_interval.tv_sec = 0;
  83.     tdelay.it_interval.tv_usec = 0;
  84.  
  85.     if (sigaction (SIGALRM, &act, &oact) < 0)
  86.     {
  87.         perror ("sigaction(tmlnk)");
  88.         exit (EXIT_FAILURE);
  89.     }
  90.     if (setitimer (ITIMER_REAL, &tdelay, NULL) < 0)
  91.     {
  92.         perror ("setitimer(tmlnk)");
  93.         exit (EXIT_FAILURE);
  94.     }
  95. }
  96.  
  97. void tmulk ()
  98. {
  99.     struct itimerval tdelay;
  100.  
  101.     tdelay.it_value.tv_sec = 0;
  102.     tdelay.it_value.tv_usec = 0;
  103.     tdelay.it_interval.tv_sec = 0;
  104.     tdelay.it_interval.tv_usec = 0;
  105.  
  106.     if (setitimer (ITIMER_REAL, &tdelay, NULL) < 0)
  107.     {
  108.         perror ("setitimer(tmulk)");
  109.         exit (EXIT_FAILURE);
  110.     }
  111.     if (sigaction (SIGALRM, &oact, NULL) < 0)
  112.     {
  113.         perror ("sigaction(tmulk)");
  114.         exit (EXIT_FAILURE);
  115.     }
  116. }
  117.  
  118.  
  119. int GetTime(char *x)
  120. {
  121.     time_t rawtime;
  122.     struct tm * timeinfo;
  123.     time ( &rawtime );
  124.     timeinfo = localtime ( &rawtime );
  125.     sprintf(x,"%s",asctime (timeinfo));
  126.     int len=strlen(x);
  127.     if (len) x[len-1]=0;
  128.     return 0;
  129. }
  130.  
  131.  
  132.  
  133.  
  134. void sa02Tmlnk (int tout)
  135. {
  136.     sa02TimerOut = FALSE;
  137.     tmlnk (tout);
  138.     //  ResetTimer (p1h, P1_DAQ_TIMEOUT);
  139. }
  140.  
  141. void sa02Tmulk ()
  142. {
  143.     tmulk();
  144. }
  145.  
  146.  
  147. void FebMainFrame::GuiTimer()
  148. {
  149.     char cmd[100];
  150.     GetTime(cmd);
  151.     fStatusBar->SetText(cmd,0);
  152.     /* Canvas ni thread safe
  153.     if (gCanvas){
  154.        gCanvas->GetCanvas()->Modified();
  155.        gCanvas->GetCanvas()->Update();
  156.     }
  157.     */
  158. }
  159.  
  160.  
  161.  
  162. int FebMainFrame::FillHistogram(float y, unsigned int  *rdata)
  163. {
  164.  
  165.  
  166.     for (int ich=0; ich<144*4; ich++){
  167.           int xch = (143 - ich%144) + ich/144*144;
  168.           //fHisto->Fill(xch,y,rdata[2+ich]);
  169.           fHisto->Fill(xch,y,ich%144);
  170.     }
  171.  
  172.     return 0;
  173. }
  174.  
  175. //----------------------------------------------------
  176.  
  177. void FebMainFrame::StartDaq(int mode)
  178. {
  179.  
  180.     int daqmode =(fDaqMode)? (int ) fDaqMode->GetSelected(): 0;  
  181.     const char *sdaqmode= (fDaqMode)? fDaqMode->GetSelectedEntry()->GetTitle(): NULL;
  182.  
  183.     int tpenb = fTpEnb->IsOn();
  184.     unsigned int addr= (fAddress)? fAddress->GetNumber() : 0;
  185.     sa02BoardType= (fBoardType)? fBoardType->GetNumber() : 0;
  186.     unsigned int boardnumber= (fBoardNumber)? fBoardNumber->GetNumber(): 0;
  187.     int sa02BoardMask =  (1<< boardnumber);
  188.     const char * fname = (fFilename)? fFilename->GetText(): NULL;
  189.     unsigned int neve= (fNeve)? fNeve->GetNumber(): 0;
  190.     unsigned int nx  = (fNx)? fNx->GetNumber(): 0;
  191.     unsigned int x0  = (fX0)? fX0->GetNumber(): 0;
  192.     unsigned int dx  = (fDx)? fDx->GetNumber(): 0;
  193.     unsigned int chip   = (fAsicChip)? fAsicChip->GetNumber(): 0;
  194.     unsigned int channel= (fAsicChannel)? fAsicChannel->GetNumber(): 0;
  195.  
  196.     unsigned int trgtype = (fTriggerType)? (int ) fTriggerType->GetSelected(): 0;
  197.     unsigned int trglen = (fTrgLen)? fTrgLen->GetNumber(): 0;
  198.     unsigned int data   = (fData)? fData->GetNumber(): 0;
  199.     unsigned int offset = (fOffset)? fOffset->GetNumber(): 0;
  200.  
  201.  
  202.     TGTextLBEntry *fp = (fFPGACmd)? (TGTextLBEntry *)fFPGACmd->GetSelectedEntry(): NULL;
  203.     const char *cmd= (fp)? fp->GetTitle(): NULL;
  204.  
  205.     int icmd =  (strlen(cmd))?sa02GetCmdCode((char *) cmd) : 0;
  206.     TGTextLBEntry *febout = (fFEBOut1)? (TGTextLBEntry *)fFEBOut1->GetSelectedEntry(): NULL;
  207.     const char *sfebout= (febout)? febout->GetTitle(): NULL;
  208.     int sindex = (fFEBOut1)? (int ) fFEBOut1->GetSelected(): 0;
  209.     sindex--;
  210.     int vmeinterface= (fVmeInterface)? (int ) fVmeInterface->GetSelected(): 0;
  211.  
  212.  
  213.     if (mode<3){
  214.       printf("Interface %d\t address 0x%0x\t", vmeinterface, addr);
  215.       printf("board type %d\t", sa02BoardType);
  216.       printf("number %d tpenb %d\n", boardnumber, tpenb);
  217.     }
  218.    
  219.    
  220.     uint32_t response[2]= {0,0};
  221.  
  222.    
  223.     if (vmeinterface == ZYNQ_XILLINUX) addr =0;
  224.     sa02SetAddress(addr);
  225.     VME_START(vmeinterface);
  226.  
  227.     switch (mode) {
  228.     case 1:{
  229.         printf("FEB cmd %s\t", cmd);
  230.         printf("x0 %d\t", x0);
  231.         printf("chip %d\t", chip);
  232.         printf("channel %d\n", channel);
  233.         sa02Cmd(boardnumber, icmd, x0, chip, channel,1,response);
  234.         break;
  235.     }
  236.     case 2: {
  237.         char serial[255];
  238.         double sdata[20];
  239.         sa02Status( boardnumber, serial,sdata);
  240.         if (fStatusBar)  fStatusBar->SetText(serial,2);
  241.         break;
  242.     }
  243.     case 3:{
  244.         printf("Selecting NIM Output %s index= %d\n", sfebout, sindex);
  245.         if (sindex>=0) Sa02SetPtsOutput(sindex);
  246.         break;
  247.     }
  248.     case 4:{
  249.         printf("TrgType %d\n", trgtype);
  250.         printf("TrgLen %d\n", trglen);
  251.         uint32_t r = Sa02SelectTriggerWithMaskAndLength (trgtype, sa02BoardMask , trglen);
  252.         printf("In 0x%08x Out 0x%08x\n",  trgtype | (sa02BoardMask << 4) | (trglen << 16) ,r);
  253.         break;
  254.     }
  255.     case 5:{
  256.         const char * fparam = (fParamFile)? fParamFile->GetText(): NULL;
  257.         printf("ASIC Parameter File %s\n", fparam);
  258.         sa02LoadParametersFromFile( fparam , sa02BoardMask );
  259.         break;
  260.     }
  261.     case 6:{
  262.         printf("Read addr 0x%04x\t", offset);
  263.         VME_A32D32_R(addr+offset,&data);
  264.         printf("data 0x%08x\n", data);
  265.         break;
  266.     }
  267.     case 7:{
  268.         printf("Write to addr 0x%04x\t", offset);
  269.         printf("data 0x%08x\n", data);
  270.         VME_A32D32_W(addr+offset,data);
  271.         break;
  272.     }
  273.  
  274.     case 0:{
  275.       printf("scan FEB cmd %s\t", cmd);
  276.       printf("chip %d\t", chip);
  277.       printf("channel %d\n", channel);
  278.       printf("neve %d\t", neve);
  279.       printf("x0 %d\t", x0);
  280.       printf("dx %d\t", dx);
  281.       printf("nx %d\n", nx);
  282.       printf("output filename %s\n", fname);
  283.  
  284.       gStyle->SetOptStat(0);
  285.       TCanvas *c = (fEcanvas)? fEcanvas->GetCanvas(): NULL;
  286.       if (fHisto) delete fHisto;
  287.  
  288.       fHisto = new TH2F(cmd,cmd,144,-0.5,143.5,nx,x0-dx*0.5, x0+(nx-0.5)*dx);
  289.       if (c){
  290.         c->cd();
  291.         fHisto->Draw("colz");
  292.         c->Modified();
  293.         c->Update();
  294.       }
  295.       ctrl_c = 0;
  296.       int maxsize = 144*10;
  297.       uint32_t rdata[maxsize];
  298.  
  299.       printf("Start daqmode=%d %s\n", daqmode,sdaqmode);
  300.       Sa02DaqMode (daqmode);
  301.      
  302.       time_t t,told;
  303.       time(&t);
  304.       told = t;
  305.       for (int ix=0; ix<nx; ix++){
  306.         uint32_t data = ix*dx+x0;
  307.         for (int board=0; board<4; board++){
  308.            sa02Cmd(board, icmd, data, chip, channel,1,response);
  309.            Sa02TestPulseEnable(board, tpenb); // Enable/disable test pulse
  310.         }
  311.         printf(".");
  312.         Sa02SetNeve(neve);
  313.         sa02Reset();
  314.        
  315.         int nb=0;
  316.         do {
  317.           if (trgtype == 1) Sa02SoftwareTrigger();
  318.           nb=1;
  319.           //nb  = sa02Read(sa02BoardMask, rdata );
  320.         }
  321.         while  ( nb==0 && !ctrl_c);
  322.         if (ctrl_c) break;
  323.         FillHistogram(data,rdata);
  324.         time(&t);
  325.         if (t!=told){
  326.          if (c){ c->Modified(); c->Update(); }
  327.          told=t;
  328.         }
  329.        
  330.                
  331.       }
  332.       if (c){ c->Modified(); c->Update(); }
  333.       printf("End\n");
  334.  
  335.       TFile *rootfile= new TFile(fname,"RECREATE");
  336.       fHisto->Write();
  337.       rootfile->Write();
  338.       rootfile->ls();
  339.       rootfile->Close();
  340.       delete rootfile;
  341.  
  342.  
  343.       break;
  344.     }
  345.   }
  346.  
  347.  
  348.   VME_STOP();
  349.    
  350.    //if (ctrl_c) gApplication->Terminate();
  351. }
  352.  
  353. void FebMainFrame::CanvasPrint()
  354. {
  355.     printf("Print\n");
  356.     if (fEcanvas)
  357.     {
  358.         TCanvas *c = fEcanvas->GetCanvas();
  359.         if (c) c->SaveAs("sa02_gui.pdf");
  360.         else
  361.         {
  362.             printf("canvas does not exist....!\n");
  363.         }
  364.     }
  365.  
  366. }
  367.  
  368. void FebMainFrame::Table( TGCompositeFrame *p, UInt_t w, UInt_t h )
  369. {
  370.  
  371.     // Create an array to hold a bunch of numbers
  372.     Int_t i = 0, j = 0;
  373.     UInt_t nrows = 6, ncolumns = 5;
  374.     Double_t** data = new Double_t*[nrows];
  375.     for (i = 0; i < nrows; i++)
  376.     {
  377.         data[i] = new Double_t[ncolumns];
  378.         for (j = 0; j < ncolumns; j++)
  379.         {
  380.             data[i][j] = 10 * i + j;
  381.         }
  382.     }
  383.  
  384.  
  385.     // Create an interface
  386.     TGSimpleTableInterface *iface = new TGSimpleTableInterface(data, w, h);
  387.  
  388.     // Create the table
  389.     TGTable *table = new TGTable(p, 999, iface);
  390.  
  391.     // Add the table to the main frame
  392.     p->AddFrame(table, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
  393.  
  394.     //Update data
  395.     data[5][1] = 3.01;
  396.     //update the table view
  397.     table->Update();
  398.  
  399.  
  400. //   return mainframe;
  401.  
  402. }
  403.  
  404.  
  405. /*
  406.  
  407. class MyTable : public TGMainFrame {
  408. private:
  409. TGTextEntry *fTEItem[12];
  410. ...
  411. MyTable::MyTable(const TGWindow *p, UInt_t w, UInt_t h)
  412. : TGMainFrame(p, w, h){
  413. Int_t ncols = 3, nrows = 0;
  414. fLMMatrix = new TGMatrixLayout(this, nrows, ncols);
  415. this->SetLayoutManager(fLMMatrix);
  416. fLO1 = new TGLayoutHints(kLHintsExpandX, 2, 2, 2, 2);
  417. char text[10];
  418. for(Int_t i=0; i < 12; i++){
  419. fTEItem[i] = new TGTextEntry
  420. (this, fTBItem[i] = new TGTextBuffer(100));
  421. sprintf(text,"Entry %i", i+1);
  422. fTBItem[i]->AddText(0,text);
  423. fTEItem[i]->Resize(120, fTEItem[i]->GetDefaultHeight());
  424. this->AddFrame(fTEItem[i], fLO1);
  425. }
  426.  
  427. */
  428.  
  429.  
  430.  
  431.  
  432. TGFrame * TGLabeledWidget(TGFrame *main, const char* text, TGFrame *widget, TGLayoutHints *layout)
  433. {
  434.     TGHorizontalFrame *fH=new TGHorizontalFrame(main, 200,40);
  435.     widget->ReparentWindow(fH);
  436.     fH->AddFrame(new TGLabel( fH ,text), layout);
  437.     widget->Resize(150,widget->GetDefaultHeight());
  438.     fH->AddFrame(widget, layout);
  439.  
  440.     return fH;
  441. }
  442.  
  443.  
  444. void FebMainFrame::ScanFrame( TGCompositeFrame  *p,UInt_t w,UInt_t h)
  445. {
  446.  
  447. // Creates widgets of the example
  448.     fEcanvas = new TRootEmbeddedCanvas ("Ecanvas",p,600,400);
  449.     p->AddFrame(fEcanvas, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
  450.     TGHorizontalFrame *hframe=new TGHorizontalFrame(p, 200,40);
  451.  
  452.     TGTextButton *start = new TGTextButton(hframe,"&Start");
  453.     start->Connect("Clicked()","FebMainFrame",this,"StartDaq(=0)");
  454.     start->ChangeOptions(start->GetOptions() | kFixedWidth); // | kFixedSize
  455.     start->SetWrapLength(-1);
  456.  
  457.     start->Resize(80,start->GetDefaultHeight());
  458.     hframe->AddFrame(start, new TGLayoutHints(kLHintsCenterX,5,5,3,4));
  459.  
  460.  
  461.     TGTextButton *stop = new TGTextButton(hframe,"&Stop");
  462.     stop->Connect("Clicked()","FebMainFrame",this,"StopDaq()");
  463.     stop->ChangeOptions(stop->GetOptions() | kFixedWidth); // | kFixedSize
  464.     stop->SetWrapLength(-1);
  465.     stop->Resize(80,stop->GetDefaultHeight());
  466.     hframe->AddFrame(stop, new TGLayoutHints(kLHintsCenterX,5,5,3,4));
  467.  
  468.     TGTextButton *single = new TGTextButton(hframe,"&Single Cmd");
  469.     single->Connect("Clicked()","FebMainFrame",this,"StartDaq(=1)");
  470.     single->ChangeOptions(single->GetOptions() | kFixedWidth); // | kFixedSize
  471.     single->Resize(80,single->GetDefaultHeight());
  472.     hframe->AddFrame(single, new TGLayoutHints(kLHintsCenterX,5,5,3,4));
  473.  
  474.     TGTextButton *status = new TGTextButton(hframe,"&Status");
  475.     status->Connect("Clicked()","FebMainFrame",this,"StartDaq(=2)");
  476.     status->ChangeOptions(status->GetOptions() | kFixedWidth); // | kFixedSize
  477.     status->Resize(80,status->GetDefaultHeight());
  478.     hframe->AddFrame(status, new TGLayoutHints(kLHintsCenterX,5,5,3,4));
  479.  
  480.     TGTextButton *febout = new TGTextButton(hframe,"&Set Out1");
  481.     febout->Connect("Clicked()","FebMainFrame",this,"StartDaq(=3)");
  482.     febout->ChangeOptions(febout->GetOptions() | kFixedWidth); // | kFixedSize
  483.     febout->Resize(80,febout->GetDefaultHeight());
  484.     hframe->AddFrame(febout, new TGLayoutHints(kLHintsCenterX,5,5,3,4));
  485.  
  486.     TGTextButton *settrg = new TGTextButton(hframe,"&Set Trigger");
  487.     settrg->Connect("Clicked()","FebMainFrame",this,"StartDaq(=4)");
  488.     settrg->ChangeOptions(settrg->GetOptions() | kFixedWidth); // | kFixedSize
  489.     settrg->Resize(80,settrg->GetDefaultHeight());
  490.     hframe->AddFrame(settrg, new TGLayoutHints(kLHintsCenterX,5,5,3,4));
  491.  
  492.     TGTextButton *loadpar = new TGTextButton(hframe,"&Load Pars");
  493.     loadpar->Connect("Clicked()","FebMainFrame",this,"StartDaq(=5)");
  494.     loadpar->ChangeOptions(loadpar->GetOptions() | kFixedWidth); // | kFixedSize
  495.     loadpar->Resize(80,loadpar->GetDefaultHeight());
  496.     hframe->AddFrame(loadpar, new TGLayoutHints(kLHintsCenterX,5,5,3,4));
  497.  
  498.  
  499.     TGTextButton *print = new TGTextButton(hframe,"&Print");
  500.     print->Connect("Clicked()","FebMainFrame",this,"CanvasPrint()");
  501.     print->ChangeOptions(print->GetOptions() | kFixedWidth); // | kFixedSize
  502.     print->Resize(80,print->GetDefaultHeight());
  503.     hframe->AddFrame(print, new TGLayoutHints(kLHintsCenterX,5,5,3,4));
  504.  
  505.  
  506.     p->AddFrame(hframe,new TGLayoutHints(kLHintsCenterX,2,2,2,2));
  507.  
  508.     //TGGroupFrame *trg=new TGGroupFrame(p, "Trigger Parameters");
  509.     const Int_t ncols = 2, nrows = 13;
  510.     TGGroupFrame *matrika=new TGGroupFrame(p, "Run Parameters");
  511.     TGTableLayout *fLMMatrix = new TGTableLayout(matrika, (nrows+1)/2, ncols*2);
  512.     matrika->SetLayoutManager(fLMMatrix);
  513.  
  514.     TGNumberEntry *gEntry[nrows];
  515.     char name[0xff]="";
  516.  
  517.     char labels[nrows][20]= {
  518. "FEB Out1","DAQ Mode","Trigger Type","Trigger Length",
  519. "FPGA Command", "Initial Value", "Step size","Number of steps",
  520. "Number of events",
  521. "Asic Chip","Asic Channel",
  522. "Filename","ASIC Parameters"
  523.     };
  524.     int  initial_values[nrows]= {0,0,0,1000,0,400,10,40,100,0,0,0};
  525.     const char sfebout[55][64]={
  526. "Digital Feb0","Digital Feb1","Digital Feb2","Digital Feb3",   
  527. "Error 0",      "Error  1",     "Error 2",      "Error 3",     
  528. "BellePtsTrigger",      "Veto", "write_t",      "read_t",      
  529. "dataBufFul",   "hwe",  "softtrigger",  "hardtrigger",  "reset_t",
  530. "DATA_FRAME0",  "DATA_FRAME1",  "DATA_FRAME1",  "DATA_FRAME1", 
  531. "RX_FRAME0",    "RX_FRAME1",    "RX_FRAME2",    "RX_FRAME3",   
  532. "TX_FRAME0",    "TX_FRAME1",    "TX_FRAME2",    "TX_FRAME3",   
  533. "DATA_CLK0",    "DATA_CLK1",    "DATA_CLK2",    "DATA_CLK3",   
  534. "RX_CLK0",      "RX_CLK1",      "RX_CLK2",      "RX_CLK3",     
  535. "TX_CLK0",      "TX_CLK1",      "TX_CLK2",      "TX_CLK3",     
  536. "DATA_DATA0",   "DATA_DATA1",   "DATA_DATA2",   "DATA_DATA3",  
  537. "RX_DATA0",     "RX_DATA1",     "RX_DATA2",     "RX_DATA3",    
  538. "TX_DATA0",     "TX_DATA1",     "TX_DATA2",     "TX_DATA3",    
  539. "lclk", "outTrigger"
  540. };
  541.  
  542.  
  543.     const char fpgastr[18][10]= {  "FE","TP","DLY0","MUX","MUXASIC",
  544.       "VTH0","VTH1","TPLVL0","TPLVL1","GREG","CREG",
  545.       "CMON","TMON0","TMON1", "ADC_READ", "ADC_RESET","DMON"};
  546.  
  547.     for (int i=0; i<nrows; i++)
  548.     {
  549.         sprintf(name,"%s %d",name,i);
  550.         TGLabel *label = new TGLabel( matrika ,labels[i]);
  551.         int dx = i/((nrows+1)/2)*2;
  552.         int dy = i%((nrows+1)/2);
  553.         //label->Resize(100+i*10,label->GetDefaultHeight());
  554.         matrika->AddFrame(label,new TGTableLayoutHints(dx,dx+1,dy,dy+1,kLHintsLeft| kLHintsCenterY,2,2,0,0));
  555.         switch (i)
  556.         {
  557.  
  558.         case 1:{
  559.           // combo box layout hints
  560.           TGLayoutHints *fLcombo = new TGLayoutHints(kLHintsTop | kLHintsLeft,5,5,5,5);
  561.           // combo box widget
  562.           fDaqMode = new TGComboBox(matrika,100);
  563.           fDaqMode->AddEntry("Event Mode", 0);
  564.           fDaqMode->AddEntry("Scaler Mode", 1);
  565.           fDaqMode->AddEntry("Test Mode - Nresponse frames", 2);
  566.           fDaqMode->AddEntry("Test Mode - channel address", 3);
  567.           fDaqMode->Resize(100, 20);
  568.           // Entry3 is selected as current
  569.           fDaqMode->Select(1);
  570.           matrika->AddFrame(fDaqMode,  new TGTableLayoutHints(dx+1,dx+2,dy,dy+1,kLHintsLeft| kLHintsCenterY,2,2,2,2));
  571.           break;
  572.         }
  573.  
  574.         case 4:
  575.         {
  576.             // combo box layout hints
  577.             TGLayoutHints *fLcombo = new TGLayoutHints(kLHintsTop | kLHintsLeft,5,5,5,5);
  578.             // combo box widget
  579.             fFPGACmd = new TGComboBox(matrika,100);
  580.             for (int k = 0; k < 17; k++) fFPGACmd->AddEntry(fpgastr[k], k+1);
  581.             fFPGACmd->Resize(100, 20);
  582.             // Entry3 is selected as current
  583.             fFPGACmd->Select(7);
  584.             matrika->AddFrame(fFPGACmd,  new TGTableLayoutHints(dx+1,dx+2,dy,dy+1,kLHintsLeft| kLHintsCenterY,2,2,2,2));
  585.             break;
  586.         }
  587.         case 2:
  588.         {
  589.             // combo box layout hints
  590.             TGLayoutHints *fLcombo = new TGLayoutHints(kLHintsTop | kLHintsLeft,5,5,5,5);
  591.             // combo box widget
  592.             fTriggerType = new TGComboBox(matrika,100);
  593.             fTriggerType->AddEntry("Software", 1);
  594.             fTriggerType->AddEntry("External", 2);
  595.             fTriggerType->AddEntry("Internal", 3);
  596.             fTriggerType->Resize(100, 20);
  597.             // Entry3 is selected as current
  598.             fTriggerType->Select(3);
  599.             matrika->AddFrame(fTriggerType,  new TGTableLayoutHints(dx+1,dx+2,dy,dy+1,kLHintsLeft| kLHintsCenterY,2,2,2,2));
  600.             break;
  601.         }
  602.         case 0:
  603.         {
  604.             // combo box layout hints
  605.             TGLayoutHints *fLcombo = new TGLayoutHints(kLHintsTop | kLHintsLeft,5,5,5,5);
  606.             // combo box widget
  607.             fFEBOut1 = new TGComboBox(matrika,100);
  608.             for (int k = 0; k < 55; k++) fFEBOut1->AddEntry(sfebout[k], k+1);
  609.             fFEBOut1->Resize(100, 20);
  610.             // Entry3 is selected as current
  611.             fFEBOut1->Select(1);
  612.             matrika->AddFrame(fFEBOut1,  new TGTableLayoutHints(dx+1,dx+2,dy,dy+1,kLHintsLeft| kLHintsCenterY,2,2,2,2));
  613.             break;
  614.         }
  615.         case nrows-2:
  616.         {
  617.             fFilename =  new TGTextEntry( matrika,"feb.root");
  618.             fFilename->Resize(200,fFilename->GetDefaultHeight());
  619.             matrika->AddFrame( fFilename, new TGTableLayoutHints(dx+1,dx+2,dy,dy+1,kLHintsLeft| kLHintsCenterY,2,2,2,2));
  620.             break;
  621.         }
  622.         case nrows-1:
  623.         {
  624.             fParamFile =  new TGTextEntry( matrika,"../parameters/feb1_0-default.param");
  625.             fParamFile->Resize(200,fParamFile->GetDefaultHeight());
  626.             matrika->AddFrame( fParamFile, new TGTableLayoutHints(dx+1,dx+2,dy,dy+1,kLHintsLeft| kLHintsCenterY,2,2,2,2));
  627.             break;
  628.         }
  629.         default:
  630.             gEntry[i]= new TGNumberEntry( matrika,initial_values[i]);
  631.             gEntry[i]->Resize(50,gEntry[i]->GetDefaultHeight());
  632.             gEntry[i]->SetFormat(TGNumberFormat::kNESInteger,TGNumberFormat::kNEANonNegative);
  633.             matrika->AddFrame(gEntry[i],new TGTableLayoutHints(dx+1,dx+2,dy,dy+1,kLHintsLeft| kLHintsCenterY,2,2,2,2));
  634.             break;
  635.         }
  636.  
  637.  
  638.     }
  639.     p->AddFrame(matrika,new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX  | kLHintsExpandY,2,2,2,2));
  640.  
  641.  
  642.  
  643.  
  644.     fTrgLen     =gEntry[3];
  645.     fX0         =gEntry[5];
  646.     fDx         =gEntry[6];
  647.     fNx         =gEntry[7];
  648.     fNeve       =gEntry[8];
  649.     fAsicChip   =gEntry[9];
  650.     fAsicChannel=gEntry[10];
  651.  
  652. }
  653.  
  654.  
  655. void FebMainFrame::ScanXYFrame( TGCompositeFrame *p,UInt_t w,UInt_t h)
  656. {
  657.  
  658.  
  659. }
  660.  
  661. void FebMainFrame::LowLevelFrame( TGCompositeFrame *p,UInt_t w,UInt_t h)
  662. {
  663.  
  664.  TGLayoutHints *f0 = new TGLayoutHints(kLHintsLeft| kLHintsTop,5,5,3,4);
  665. TGHorizontalFrame *hframe=new TGHorizontalFrame(p, 200,40);
  666.  
  667.  
  668.  
  669.  hframe->AddFrame( TGLabeledWidget(hframe, "Offset",fOffset =   new TGNumberEntry( hframe ,0         ) , f0));
  670.     fOffset->SetFormat(TGNumberFormat::kNESHex);
  671.     fOffset->SetNumber(0x0FFC);
  672.  
  673.     TGTextButton *read = new TGTextButton(hframe,"&Read");
  674.     read->Connect("Clicked()","FebMainFrame",this,"StartDaq(=6)");
  675.     read->ChangeOptions(read->GetOptions() | kFixedWidth); // | kFixedSize
  676.     read->SetWrapLength(-1);
  677.     read->Resize(80,read->GetDefaultHeight());
  678.     hframe->AddFrame(read, new TGLayoutHints(kLHintsCenterX,5,5,3,4));
  679.  
  680.     hframe->AddFrame( TGLabeledWidget(hframe, "Data",     fData     =   new TGNumberEntry( hframe ,0         ) , f0));
  681.     fData->SetFormat(TGNumberFormat::kNESHex);
  682.     fData->SetNumber(0xFAF5);
  683.  
  684.     TGTextButton *write = new TGTextButton(hframe,"&Write");
  685.     write->Connect("Clicked()","FebMainFrame",this,"StartDaq(=7)");
  686.     write->ChangeOptions(write->GetOptions() | kFixedWidth); // | kFixedSize
  687.     write->SetWrapLength(-1);
  688.  
  689.     write->Resize(80,write->GetDefaultHeight());
  690.     hframe->AddFrame(write, new TGLayoutHints(kLHintsCenterX,5,5,3,4));
  691.    
  692.  
  693.     p->AddFrame(hframe,new TGLayoutHints(kLHintsCenterX,2,2,2,2));
  694.  
  695.  
  696.  
  697.  
  698.  
  699. }
  700.  
  701.  
  702. void FebMainFrame::SettingsFrame( TGCompositeFrame *p,UInt_t w,UInt_t h)
  703. {
  704.     Table(p, 6 ,5 );
  705. }
  706.  
  707.  
  708.  
  709. FebMainFrame::FebMainFrame( TGWindow *p,UInt_t w,UInt_t h) : TGMainFrame(p,w,h)
  710. {
  711.     TGLayoutHints *f0 = new TGLayoutHints(kLHintsLeft| kLHintsTop,5,5,3,4);
  712.  
  713.     TGHorizontalFrame *topframe=new TGHorizontalFrame(this, 200,40);
  714.  
  715.     topframe->AddFrame( TGLabeledWidget(topframe, "Interface",     fVmeInterface     =   new TGComboBox( topframe ,0         ) , f0));
  716.  
  717.     fVmeInterface->AddEntry("CAEN_V1718", 0);
  718.     fVmeInterface->AddEntry("WIENER_VMEMM", 1);
  719.     fVmeInterface->AddEntry("WIENER_VMUSB", 2);
  720.     fVmeInterface->AddEntry("ZYNQ_XILLINUX", 3);
  721.     fVmeInterface->Select(3);      
  722.     fVmeInterface->Resize(120, 20);
  723.  
  724.  
  725.     topframe->AddFrame( TGLabeledWidget(topframe, "VMEAddr",     fAddress     =   new TGNumberEntry( topframe ,0         ) , f0));
  726.     topframe->AddFrame( TGLabeledWidget(topframe, "Board No",fBoardNumber =   new TGNumberEntry( topframe ,0         ) , f0));
  727.     fBoardNumber->Resize(50,fBoardNumber->GetDefaultHeight());
  728.    
  729.     topframe->AddFrame( TGLabeledWidget(topframe, "Type",  fBoardType   =   new TGNumberEntry( topframe ,2         ) , f0));
  730.     fAddress->SetFormat(TGNumberFormat::kNESHex);
  731.     fAddress->SetNumber(0x26000000);
  732.     fAddress->Resize(100,fAddress->GetDefaultHeight());
  733.     fBoardNumber->SetFormat(TGNumberFormat::kNESInteger,TGNumberFormat::kNEANonNegative);
  734.     fBoardType->SetFormat(TGNumberFormat::kNESInteger,TGNumberFormat::kNEANonNegative);
  735.     fBoardType->Resize(50,fBoardType->GetDefaultHeight());
  736.    
  737.     fTpEnb = new TGCheckButton(topframe,"TpEnb",1);
  738.     fTpEnb->SetToolTipText("Enable or disable test pulse generation");
  739.  
  740.     topframe->AddFrame(  fTpEnb , f0 );
  741.  
  742.  
  743.     TGTextButton *exit = new TGTextButton(topframe,"&Exit", "gApplication->Terminate()");
  744.     exit->ChangeOptions(exit->GetOptions() | kFixedWidth); // | kFixedSize
  745.     exit->Resize(80,exit->GetDefaultHeight());
  746.     topframe->AddFrame(exit, new TGLayoutHints(kLHintsCenterX,5,5,3,4));
  747.  
  748.  
  749.  
  750.     AddFrame(topframe, f0);
  751.  
  752. // tab widget
  753.     TGTab *fTab = new TGTab(this,w,h);
  754.  
  755.     // container of "Tab1"
  756.     TGCompositeFrame * fCompositeFrame0 = fTab->AddTab("Threshold Scan");
  757.     fCompositeFrame0->SetLayoutManager(new TGVerticalLayout(fCompositeFrame0));
  758.     ScanFrame(fCompositeFrame0 ,w,h);
  759.  
  760.     // container of "Tab2"
  761.     TGCompositeFrame *fCompositeFrame1 =  fTab->AddTab("Low Level");
  762.     fCompositeFrame1->SetLayoutManager(new TGVerticalLayout(fCompositeFrame1));
  763.     LowLevelFrame(fCompositeFrame1 ,w,h);
  764.  
  765.     // container of "Tab3"
  766.     TGCompositeFrame *fCompositeFrame2 =  fTab->AddTab("XY Scan");
  767.     fCompositeFrame2->SetLayoutManager(new TGVerticalLayout(fCompositeFrame2));
  768.     ScanXYFrame(fCompositeFrame2 ,w,h);
  769.  
  770.     // container of "Tab4"
  771.     TGCompositeFrame *fCompositeFrame3 =  fTab->AddTab("ASIC Parameters");
  772.     fCompositeFrame3->SetLayoutManager(new TGVerticalLayout(fCompositeFrame3));
  773.     SettingsFrame(fCompositeFrame3 ,w,h);
  774.  
  775.     fTab->SetTab(0);
  776.     fTab->Resize(fTab->GetDefaultSize());
  777.  
  778.     AddFrame(fTab, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
  779.     //fTab->MoveResize(2,8,486,328);
  780.  
  781.     // status bar
  782.     Int_t parts[] = {33, 10, 10, 47};
  783.     fStatusBar = new TGStatusBar(this,50,10,kHorizontalFrame);
  784.     fStatusBar->SetParts(parts,4);
  785.     AddFrame(fStatusBar,new TGLayoutHints(kLHintsBottom | kLHintsLeft | kLHintsExpandX,0,0,2,0));
  786. // fill status bar fields with information; selected is the object
  787. // below the cursor; atext contains pixel coordinates info
  788.     /*
  789.     fStatusBar->SetText(selected->GetTitle(),0);
  790.     fStatusBar->SetText(selected->GetName(),1);
  791.     fStatusBar->SetText(atext,2);
  792.     StatusBar->SetText(selected->GetObjectInfo(px,py),3);
  793.  
  794.        TGStatusBar *fStatusBar = new TGStatusBar(this, 3,w,24);
  795.        fStatusBar->SetName("fStatusBar");
  796.  
  797.  
  798.        AddFrame(fStatusBar, new TGLayoutHints(kLHintsBottom| kLHintsLeft | kLHintsExpandX));
  799.  
  800.     */
  801.     //fStatusBar1332->MoveResize(0,344,480,24);
  802.  
  803.  
  804. // Sets window name and shows the main frame
  805.     SetWindowName("ARICH FEB User Interface");
  806.     MapSubwindows();
  807.     Resize(GetDefaultSize());
  808.     MapWindow();
  809.  
  810.     fTimer = new TTimer(1000, kFALSE);
  811.     fTimer->Connect("Timeout()", "FebMainFrame", this, "GuiTimer()");
  812.     fTimer->TurnOn();
  813.     fTimer->Start(1000, kFALSE);   // 1 second single-shot if kTRUE
  814.  
  815. // intercept routine
  816.     if (signal (SIGINT, sa02Timerast) == SIG_ERR)
  817.     {
  818.         perror ("sigignore");
  819.     }
  820.     fHisto=NULL;
  821.     set_plot_style();
  822. }
  823.