// By ROOT version 5.17/02 on 2008-03-13 06:46:41
 
 
 
#ifndef ROOT_TGDockableFrame
 
#include "TGDockableFrame.h"
 
#endif
 
#ifndef ROOT_TGMenu
 
#include "TGMenu.h"
 
#endif
 
#ifndef ROOT_TGMdiDecorFrame
 
#include "TGMdiDecorFrame.h"
 
#endif
 
#ifndef ROOT_TG3DLine
 
#include "TG3DLine.h"
 
#endif
 
#ifndef ROOT_TGMdiFrame
 
#include "TGMdiFrame.h"
 
#endif
 
#ifndef ROOT_TGMdiMainFrame
 
#include "TGMdiMainFrame.h"
 
#endif
 
//#ifndef ROOT_TGuiBldHintsButton
 
//#include "TGuiBldHintsButton.h"
 
//#endif
 
#ifndef ROOT_TGMdiMenu
 
#include "TGMdiMenu.h"
 
#endif
 
#ifndef ROOT_TGListBox
 
#include "TGListBox.h"
 
#endif
 
#ifndef ROOT_TGNumberEntry
 
#include "TGNumberEntry.h"
 
#endif
 
#ifndef ROOT_TGScrollBar
 
#include "TGScrollBar.h"
 
#endif
 
//#ifndef ROOT_TGuiBldHintsEditor
 
//#include "TGuiBldHintsEditor.h"
 
//#endif
 
#ifndef ROOT_TRootBrowser
 
#include "TRootBrowser.h"
 
#endif
 
#ifndef ROOT_TGFrame
 
#include "TGFrame.h"
 
#endif
 
#ifndef ROOT_TGFileDialog
 
#include "TGFileDialog.h"
 
#endif
 
#ifndef ROOT_TGShutter
 
#include "TGShutter.h"
 
#endif
 
#ifndef ROOT_TGButtonGroup
 
#include "TGButtonGroup.h"
 
#endif
 
#ifndef ROOT_TGCanvas
 
#include "TGCanvas.h"
 
#endif
 
#ifndef ROOT_TGFSContainer
 
#include "TGFSContainer.h"
 
#endif
 
#ifndef ROOT_TGButton
 
#include "TGButton.h"
 
#endif
 
//#ifndef ROOT_TGuiBldEditor
 
//#include "TGuiBldEditor.h"
 
//#endif
 
#ifndef ROOT_TGTextEdit
 
#include "TGTextEdit.h"
 
#endif
 
#ifndef ROOT_TGFSComboBox
 
#include "TGFSComboBox.h"
 
#endif
 
#ifndef ROOT_TGLabel
 
#include "TGLabel.h"
 
#endif
 
#ifndef ROOT_TGView
 
#include "TGView.h"
 
#endif
 
//#ifndef ROOT_TRootGuiBuilder
 
//#include "TRootGuiBuilder.h"
 
//#endif
 
#ifndef ROOT_TGTab
 
#include "TGTab.h"
 
#endif
 
#ifndef ROOT_TGListView
 
#include "TGListView.h"
 
#endif
 
#ifndef ROOT_TGSplitter
 
#include "TGSplitter.h"
 
#endif
 
#ifndef ROOT_TGStatusBar
 
#include "TGStatusBar.h"
 
#endif
 
#ifndef ROOT_TGListTree
 
#include "TGListTree.h"
 
#endif
 
#ifndef ROOT_TGToolTip
 
#include "TGToolTip.h"
 
#endif
 
#ifndef ROOT_TGToolBar
 
#include "TGToolBar.h"
 
#endif
 
#ifndef ROOT_TRootEmbeddedCanvas
 
#include "TRootEmbeddedCanvas.h"
 
#endif
 
#ifndef ROOT_TCanvas
 
#include "TCanvas.h"
 
#endif
 
//#ifndef ROOT_TGuiBldDragManager
 
//#include "TGuiBldDragManager.h"
 
//#endif
 
 
 
#include "Riostream.h"
 
#include "TThread.h"
 
#include "TApplication.h"
 
#include "TROOT.h"
 
#include "TGraph.h"
 
#include "TH1F.h"
 
//#include "daq.h"
 
 
 
TGTextButton   *gTextButton[10];
 
TCanvas        *fCanvas;
 
TGMainFrame    *fMain;
 
TGTextEntry    *gFilename;
 
TGNumberEntry  *gCh;
 
 
 
TGTextEntry    *gTimeDisplay;
 
TGCheckButton  *gDebugButton;
 
 
 
 
 
 
 
    TGNumberEntry  *gMaxEve;
 
TGNumberEntry  *gNeve;
 
TGNumberEntry *gMask; 
 
TGNumberEntry *gRange;
 
TGNumberEntry *gSoftwareTrigger;
 
TGNumberEntry *gTriggerChannel;
 
TGNumberEntry *gSamplingFrequency;
 
TGNumberEntry *gTriggerDelay;
 
 
 
 
 
 
 
 
 
 
 
const char gParNames[30][30]={"Events:","EventNo:","Channel Mask:","Range:", "SwTrg", "TriggerChannel:","Sampling Freq.:","TRG Delay:" }; 
 
 
 
TGNumberFormat::EStyle gParStyle[10] = { 
 
TGNumberFormat::kNESInteger , 
 
TGNumberFormat::kNESInteger, 
 
TGNumberFormat::kNESInteger , 
 
TGNumberFormat::kNESReal, 
 
TGNumberFormat::kNESInteger, 
 
TGNumberFormat::kNESInteger, 
 
TGNumberFormat::kNESInteger, 
 
TGNumberFormat::kNESReal 
 
}; 
 
TGNumberEntry *gParameters[10]; 
 
  
 
 
 
 
 
TRootEmbeddedCanvas *gCanvas;
 
#define MAXCH 32
 
TH1F* gHisto[MAXCH];
 
//daq * gDaq;
 
#define WINDOW_NAME "Praktikum IV MAPMT PET"
 
//----------------------------------------------------
 
int UIRDimming(int state){
 
  switch (state) {
 
  case 0:
 
    gTextButton[0]->SetEnabled(0);
 
    gTextButton[1]->SetEnabled(1);
 
    gTextButton[2]->SetEnabled(0);
 
    
 
    break;
 
 
 
  case 1:
 
    gTextButton[0]->SetEnabled(0);
 
    gTextButton[1]->SetEnabled(0);
 
    gTextButton[2]->SetEnabled(1);
 
      
 
    break;
 
 
 
  case 2:
 
    gTextButton[0]->SetEnabled(1);
 
    gTextButton[1]->SetEnabled(1);
 
    gTextButton[2]->SetEnabled(0);   
 
    break;
 
 
 
  default:
 
    break;
 
  }
 
  return 0;
 
}
 
 
 
int fDebug;
 
void GetDebug(){
 
  if ( gDebugButton->IsOn() ) fDebug=1;
 
  else fDebug=0;
 
}
 
 
 
int GetTime(char *x){
 
   time_t rawtime;
 
    struct tm * timeinfo;
 
    time ( &rawtime );
 
    timeinfo = localtime ( &rawtime );    
 
    sprintf(x,"%s",asctime (timeinfo));
 
    int len=strlen(x);
 
    if (len) x[len-1]=0;
 
    return 0;
 
}
 
void MyTimer(){
 
    char cmd[100];
 
    GetTime(cmd);
 
    if (gTimeDisplay) gTimeDisplay->SetText(cmd);
 
    /* Canvas ni thread safe
 
    if (gCanvas){
 
       gCanvas->GetCanvas()->Modified();
 
       gCanvas->GetCanvas()->Update();
 
    }
 
    */
 
}
 
 
 
//----------------------------------------------------
 
// thread function 
 
int gStop=0;
 
#define BSIZE 10000
 
unsigned int gBuf[BSIZE];
 
void *MyThread(void *ptr)
 
{
 
  TThread::Printf("Start of MyThread %x \n" ,(int *)ptr);
 
 
 
  // odpremo datoteko za pisanje
 
  char fname[128];
 
  sprintf(fname,"%s.dat",gFilename->GetText());
 
  FILE *fp=fopen(fname,"w");
 
  int neve  = (int) gMaxEve->GetNumber();
 
  int hdr[4]={1};
 
  
 
  //if (gDaq) gDaq->fStop=0;
 
  // zajem zeljenega kolicine podatkov
 
  for (int n=0;n<neve;n++){
 
        int nb=0;
 
    /*
 
        if (!gDaq) break; 
 
    nb = gDaq->event(gBuf,BSIZE);
 
    if (gDaq->fStop) break;
 
        */
 
    if (nb<0){
 
      n--; 
 
      continue;
 
    }
 
    
 
    // zapis v datoteko   
 
    hdr[1]=nb+4*sizeof(int);
 
    hdr[2]=time(NULL);
 
    hdr[3]=n;
 
   
 
    fwrite(hdr,   sizeof(int),4 , fp); 
 
    fwrite(gBuf,   sizeof(int),nb, fp);
 
    // napolni histograme
 
    //*****************
 
    unsigned int *data= gBuf;
 
    int evsize=0;
 
    int events=0;  
 
    int ib=1,count=0;
 
    events = data[0];
 
    evsize = data[1]&0xffff;
 
    if (evsize<2){
 
      n--; 
 
      continue;
 
    }
 
    const unsigned int  END_MARKER=0xFAF5;
 
    if (fDebug) printf("nb=%d Event:%d events=%d EvSize:%d\n",nb, n,  events, evsize);
 
    for (int i=0;i<evsize;i++)  {
 
       //if (fDebug) printf("%d\t%08x\n", ib, data[ib]);
 
      
 
       if (data[ib]== END_MARKER) break; 
 
       if (ib%2==0) {
 
          unsigned short word1 =data[ib  ]&0xFFFF;
 
          unsigned short word2 =data[ib+1]&0xFFFF;
 
          unsigned short tdc =  word1;                 
 
          unsigned short ch  =  (word2 >> 1 ) &0x1F;
 
          unsigned short edge =  word2   & 0x1;
 
          unsigned short q    = (word2 >> 8)  &0x1;
 
          unsigned short x    = (word2 >> 9)  &0x1;
 
          TThread::Lock();
 
          if (edge && ch < MAXCH) gHisto[ch]->Fill(tdc);
 
          TThread::UnLock();
 
          if (fDebug) TThread::Printf("%d. [ch=%2d] edge=%d data=%d q=%d x=%d\n",count,ch,edge,tdc, q, x);
 
         
 
          count++;
 
       }
 
       ib++;
 
    }
 
    if (data[evsize+1]!=END_MARKER) printf("Error! END_MARKER not found\n");
 
//***************** 
 
 
 
 
 
 
 
 
 
    
 
   gNeve->SetNumber(n);
 
  }  
 
  fclose(fp);
 
  UIRDimming(2);
 
  TThread::Printf("End of MyThread neve=%d\n",neve);
 
 return 0;
 
}
 
 
 
 
 
int save2ascii(){
 
         if (!gHisto[0]) return 0; 
 
         char fname[128];
 
         sprintf(fname,"%s.txt",gFilename->GetText());
 
         FILE *fp= fopen(fname, "w");    
 
         fprintf(fp, "%s\n",WINDOW_NAME); 
 
         char cmd[128];
 
         GetTime(cmd);
 
         fprintf(fp, "Shranjeno: %s\n\n", cmd );
 
         fprintf(fp, "Kanal hid=")      ;
 
         for (int j=0;j<MAXCH;j++)  fprintf(fp, "%d\t",j);
 
         fprintf(fp, "\n-------------------------------------------------\n");                                   
 
         for (int i=0;i<gHisto[0]->GetNbinsX();i++){
 
           fprintf(fp, "%d\t",i);
 
           for (int j=0;j<MAXCH;j++) fprintf(fp, "%d\t",(int) gHisto[j]->GetBinContent(i+1));
 
           fprintf(fp, "\n");   
 
         }
 
         fclose(fp);
 
         printf("Rezultati meritev so zapisani v datoteki %s\n",fname);
 
         return 0;
 
 }
 
 
 
void MyEventHandler(int i){
 
  static TTimer * tmr = new TTimer(1000, kFALSE);
 
  UIRDimming(i);
 
  TThread *fThread;
 
  switch (i) {
 
  case 0: // Init
 
    //gDaq->init();
 
    break;
 
  case 1: // Start
 
    fThread = new TThread(MyThread,(void*)0);
 
    fThread->Run(); 
 
    tmr->SetCommand("MyTimer()");
 
    tmr->TurnOn();
 
    tmr->Start(1000, kFALSE);   // 1 second single-shot
 
    break;
 
  case 2: // Stop 
 
    //gDaq->fStop=1;
 
    tmr->Stop();
 
    tmr->TurnOff();
 
    break;
 
  case 3: // ReDraw
 
    gCanvas->GetCanvas()->Modified();
 
    gCanvas->GetCanvas()->Update();
 
    break;
 
  case 4: // Clear
 
    for (int j=0;j<MAXCH;j++) if (gHisto[j]) gHisto[j]->Reset();
 
    break;
 
  case 5: // Save
 
    save2ascii();
 
    break;
 
  case 6: // Print
 
    gCanvas->GetCanvas()->SaveAs("zivljenjski_cas_mionov.pdf");
 
    break;
 
  case 7: // exit
 
    gApplication->Terminate(0);
 
    break;
 
  }
 
 
 
}
 
 
 
int Redraw(long val=0){
 
  unsigned int ch= (unsigned int)(gCh->GetNumber());
 
  if (ch<MAXCH && gHisto[ch]) {
 
        gCanvas->GetCanvas()->cd();
 
        gHisto[ch]->Draw();
 
        gCanvas->GetCanvas()->Modified();
 
        gCanvas->GetCanvas()->Update();
 
  } else {
 
    if (gCh->GetNumber()>=MAXCH) gCh->SetNumber(MAXCH-1);
 
    if (gCh->GetNumber()< 0)     gCh->SetNumber(0);
 
  }
 
  return 0;
 
}
 
//----------------------------------------------------
 
 
 
int gui(){
 
 
 
  for (int i=0;i<MAXCH;i++){
 
    char hname[50];
 
    sprintf(hname,"TDC Ch. %d;TDC;N",i);
 
    char hn[50];
 
    sprintf(hn,"ch%d",i);
 
    gHisto[i]   = new TH1F(hn,hname,128,-0.5,1024*8-0.5);
 
  }  
 
  //gDaq= new daq();
 
  fMain = new TGMainFrame(0,800,800);
 
  TGHorizontalFrame *fH=new TGHorizontalFrame(fMain,800,400);
 
  //------------------------------------------------------------
 
  TGLayoutHints *f0= new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2);
 
  TGLayoutHints *layout2= new TGLayoutHints(kLHintsLeft | kLHintsTop,20,20,20,20);
 
  // gumbi
 
  
 
  int nbut=8;
 
  const char *names[10]={"Init","Start","Stop","Refresh","Clear","Export to ASCII", "Print" , "Exit"};
 
  for (int i=0;i<nbut;i++){
 
    
 
    gTextButton[i]= new TGTextButton(fH, names[i]);
 
    gTextButton[i]->SetTextJustify(36);
 
    gTextButton[i]->SetMargins(0,0,0,0);
 
    gTextButton[i]->SetWrapLength(-1);
 
    gTextButton[i]->ChangeOptions(gTextButton[i]->GetOptions() | kFixedWidth); // | kFixedSize
 
    gTextButton[i]->Resize(100,gTextButton[i]->GetDefaultHeight());
 
  
 
    fH->AddFrame(gTextButton[i], f0);
 
    char cmd[50];
 
    sprintf(cmd,"MyEventHandler(=%d)",i);
 
    TQObject::Connect(gTextButton[i],"Clicked()",0,0,cmd);
 
  }
 
 
 
  gDebugButton =  new TGCheckButton( fH,"Debug");
 
  gDebugButton->Resize(50,22);
 
  TQObject::Connect(gDebugButton,"Clicked()", 0, 0 , "GetDebug()");
 
  gDebugButton->SetState(kButtonDown);
 
  fH->AddFrame(gDebugButton, f0);
 
 
 
  fMain->AddFrame(fH    , f0);
 
  
 
  TGHorizontalFrame *fH1=new TGHorizontalFrame(fMain,800,400);
 
  //---------------------------------------------------------
 
  // ura
 
  TGLabel *lab1;
 
  fH=new TGHorizontalFrame(fH1,800,200);
 
  lab1 = new TGLabel( fH ,"Ura:");
 
  fH->AddFrame(lab1, f0);
 
  gTimeDisplay =  new TGTextEntry( fH,"");
 
  gTimeDisplay->Resize(200,22);
 
  fH->AddFrame(gTimeDisplay, f0);
 
  fH1->AddFrame(fH    , f0);
 
  //---------------------------------------------------------
 
  // inputi
 
  fH=new TGHorizontalFrame(fH1,800,200);
 
  lab1 = new TGLabel( fH ,"Filename:");
 
  fH->AddFrame(lab1, f0);
 
  gFilename =  new TGTextEntry( fH,"tmp");
 
  gFilename->Resize(200,22);
 
  fH->AddFrame(gFilename, f0);
 
  fH1->AddFrame(fH    , f0);
 
  //---------------------------------------------------------
 
  fH=new TGHorizontalFrame(fH1,800,200);
 
  lab1 = new TGLabel( fH ,"Events:");
 
  fH->AddFrame(lab1, f0);
 
  gMaxEve =  new TGNumberEntry( fH,10000);
 
  gMaxEve->Resize(100,22);
 
  fH->AddFrame(gMaxEve, f0);
 
  fH1->AddFrame(fH    , f0);
 
  //---------------------------------------------------------
 
  fH=new TGHorizontalFrame(fH1,800,200);
 
  lab1 = new TGLabel( fH ,"Event no:");
 
  fH->AddFrame(lab1, f0);
 
  gNeve =  new TGNumberEntry( fH,0);
 
  gNeve->Resize(100,22);
 
  fH->AddFrame(gNeve, f0);
 
  fH1->AddFrame(fH    , f0);
 
  //---------------------------------------------------------
 
  fMain->AddFrame(fH1    , f0);
 
  TGVerticalFrame *fV=new TGVerticalFrame(fMain,800,200);
 
  nbut = 8;
 
  for (int i=0;i<nbut;i++){
 
          fH=new TGHorizontalFrame(fV,800,200);
 
      lab1 = new TGLabel( fH ,gParNames[i]);
 
          lab1->Resize(100,22);
 
      fH->AddFrame(lab1, f0);
 
      gParameters[i] =  new TGNumberEntry( fH,0,5,i, gParStyle[i] );
 
      gParameters[i]->Resize(100,22);
 
      fH->AddFrame(gParameters[i] , f0);
 
      fV->AddFrame(fH    , f0);
 
  }       
 
  fMain->AddFrame(fV    , f0);
 
  //---------------------------------------------------------
 
  // canvas
 
  fH=new TGHorizontalFrame(fMain,800,200);
 
  gCanvas = new TRootEmbeddedCanvas ("gCanvas",fH,800,400);
 
  fH->AddFrame(gCanvas, f0);
 
  fMain->AddFrame(fH   , f0);
 
  //------------------------------------------------------------ 
 
  fH=new TGHorizontalFrame(fMain,800,200);
 
  lab1 = new TGLabel( fH ,"Ch. Number(0..3):");
 
  fH->AddFrame(lab1, f0);
 
  gCh =  new TGNumberEntry( fH,0);
 
  fH->AddFrame(gCh, f0);
 
  TQObject::Connect(gCh,"ValueSet(Long_t)",0,0,"Redraw(Long_t )"); 
 
  
 
  fMain->AddFrame(fH    , f0);
 
  //------------------------------------------------------------
 
  fMain->SetWindowName(WINDOW_NAME);
 
  fMain->MapSubwindows();
 
  fMain->Resize(fMain->GetDefaultSize());
 
  fMain->MapWindow();
 
  Redraw();
 
  GetDebug();
 
  return 0;
 
}