Subversion Repositories f9daq

Rev

Rev 341 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/* Program l2d.c za testiranje povrsinske obcutljivosti

Avtor: Samo Korpar
Verzija:
  1.00 3.5.2007
    -
*/


#define USE_DAQ
#define USE_MIKRO

// Izberi ustrezni interface v meniju projektnega okna
//  Options->CompilerDefines (dodaj /DSISVME ali /DWIENVME)

#ifdef USE_DAQ
#  define USE_CAMAC
#  include "camac.h"
//#  ifdef SISVME
//#    include "sisvme_dll.h"
//#  endif
#  ifdef WIENVME
#    include "wienvme_dll.h"
#  endif
#  define VME_START(NODE) WIENVME_VME_START((NODE))
#  define VME_STOP() WIENVME_VME_STOP()
#  include "CAENV965.h"
#endif

#ifdef USE_MIKRO
#  include "MIKRO.h"
#endif

#include <userint.h>
#include <ansi_c.h>
#include <utility.h>
#include <analysis.h>

#include "l2d_ui.h"

#ifdef USE_DAQ
//#  define VTDC_ADDR 0x330000
#  define VADC_ADDR 0x350000
//#  define VTDC 0
#  define VADC 1
//#  define IO1_ADDR 0x100200
//#  define NTDCP 20
#  define NTDCJ 20
#  define NGL 23
#endif

#ifdef USE_MIKRO
#  define MIKRO_COM 3
#endif

#define MAXCH 0x1000
#define MAX_THREADS 10

#define IWAIT 2000

#  define NCH 2
static int p1h, pID, rID, tfID;
static int ph_tdc, ph_adc;
static int dtdc[NCH][2][MAXCH];
static int dadc[NCH][2][MAXCH];
static int daq_on;
static int poolHandle = 0;
static int ntics,dummy;
//              0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
static int tdcmap[16]= { 0, 1, 2, 3, 4, 5, 6, 7,99,99,99,99,99,99,99,99};
static int adcmap[16]= {99,99,99,99,99,99,99,99, 0, 1, 2, 3, 4, 5, 6, 7};
static int ctdcmap[16]= { 0, 1, 2, 3, 4, 5, 6, 7,99,99,99,99,99,99,99,99};

/************************************************************/
void wait_loop(unsigned long iloop)

{
  int i;

  for (i=0; i<iloop; i++);
  return;
}

int CVICALLBACK cb_timer (int panel, int control, int event, void *callbackData,
                          int eventData1, int eventData2) {
  QueueUserEvent (9000, p1h, P1_TIMER);
  return (0);
}

int update_plots (void) {
  int irange, ch;

  GetCtrlVal (p1h, P1_PLCH, &ch);

  if (ph_tdc>0) DeleteGraphPlot (p1h, P1_TDC, ph_tdc, VAL_DELAYED_DRAW);
  GetCtrlVal (p1h, P1_TDCHL, &irange);
  ph_tdc = PlotY (p1h, P1_TDC, &dtdc[ch][irange], MAXCH, VAL_INTEGER,
                  VAL_VERTICAL_BAR, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);

  if (ph_adc>0) DeleteGraphPlot (p1h, P1_ADC, ph_adc, VAL_DELAYED_DRAW);
  GetCtrlVal (p1h, P1_ADCHL, &irange);
  ph_adc = PlotY (p1h, P1_ADC, &dadc[ch][irange], MAXCH, VAL_INTEGER,
                  VAL_VERTICAL_BAR, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_BLUE);
  return (0);
}

int CVICALLBACK daq_run(void *functionData) {
  int i,j;
  int ndat,dtype,ch,rg,adc,cres;
  unsigned long a,b,ec1,ec2;
  unsigned long data[100];
  unsigned short aa[NCH][4];

  int dsave,status,fmax,fcount,fev;
  char dfile[MAX_PATHNAME_LEN],dfile0[MAX_PATHNAME_LEN];
  int supr0,tdcmin,fseed,esave;
  float frac;
  double fracg;

  FILE *fp=NULL;
#define RUNREC_ID 1
#define ENDREC_ID 2
#define POSREC_ID 3
#define EVTREC_ID 4

  typedef struct {
    unsigned long id,len;
    unsigned long fver,time;
    unsigned long nev,nch,ped,xy;
    long nx,x0,dx,ny,y0,dy;
  } RUNREC;
  RUNREC runrec;

  typedef struct {
    unsigned long id,len;
    unsigned long time;
  } ENDREC;
  ENDREC endrec;

  typedef struct {
    unsigned long id,len;
    unsigned long time;
    long ix,x,xset,iy,y,yset;
  } POSREC;
  POSREC posrec;

  typedef struct {
    unsigned long id,len;
    unsigned long nev;
    unsigned short data[NCH*2];
  } EVTREC;
  EVTREC evtrec;

  runrec.id = RUNREC_ID;
  runrec.len = sizeof(runrec);
  runrec.fver = 0x10000;
  runrec.nch = NCH;
  runrec.xy = 1;
  endrec.id = ENDREC_ID;
  endrec.len = sizeof(endrec);
  posrec.id = POSREC_ID;
  posrec.len = sizeof(posrec);
  evtrec.id = EVTREC_ID;
  evtrec.len = sizeof(evtrec);

  cres = 0;

  GetCtrlVal (p1h, P1_NEVE, &runrec.nev);
  GetCtrlVal (p1h, P1_PEDESTAL, &runrec.ped);

  GetCtrlVal (p1h, P1_NX, &runrec.nx);
  GetCtrlVal (p1h, P1_XSTEP, &runrec.dx);
  GetCtrlVal (p1h, P1_XMIN, &runrec.x0);
  GetCtrlVal (p1h, P1_NY, &runrec.ny);
  GetCtrlVal (p1h, P1_YSTEP, &runrec.dy);
  GetCtrlVal (p1h, P1_YMIN, &runrec.y0);

  GetCtrlVal (p1h, P1_DSAVE, &dsave);
  if (dsave) {
    GetCtrlVal (p1h, P1_DFILE, dfile0);

    fev=0;
    fcount=1;
    GetCtrlVal (p1h, P1_NEWF, &fmax);
  }
  GetCtrlVal (p1h, P1_SUPR, &supr0);
  if (supr0) {
    GetCtrlVal (p1h, P1_TDCMIN, &tdcmin);
    GetCtrlVal (p1h, P1_FRAC, &frac);
  }

#ifdef USE_DAQ
//  V965_map (VTDC, VTDC_ADDR, 1);
//  V965_init (VTDC, pedestal);

  V965_map (VADC, VADC_ADDR, 1);
  V965_init (VADC, runrec.ped);

#  ifdef USE_CAMAC
  BZ(&cres);
  CCCZ(&cres);
  CCCC(&cres);
  CREM_I(&cres);
  CSSA_R(NGL,0,25,&cres);
  Delay(0.01);
#    ifdef NTDCJ
  CSSA_R(NTDCJ,0,9,&cres);
  printf("CSSA_R(NTDCJ,0,9,&cres)=0x%0x\n", cres);
  CSSA_R(NTDCJ,0,26,&cres);
  printf("CSSA_R(NTDCJ,0,26,&cres)=0x%0x\n", cres);
#    endif
#    ifdef NTDCP
  CSSA_R(NTDCP,0,9,&cres);
  CSSA_R(NTDCP,0,11,&cres);
  CSSA_R(NTDCP,0,26,&cres);
  printf("CSSA_R(NTDCP,0,26,&cres)=0x%0x\n", cres);
#    endif
#  endif
#endif

  if (dsave) {
    sprintf(dfile,"%s_file%02d.dat",dfile0,fcount);
    fp = fopen (dfile, "wb");
    time (&runrec.time);
    status = fwrite (&runrec, 1, runrec.len, fp);
    if (supr0) {
      fseed = runrec.time & 0x7fffffff;
      Uniform (1, fseed, &fracg);
    }
  }

  for (posrec.ix=0; posrec.ix<runrec.nx; posrec.ix++) {
    posrec.xset=runrec.x0+posrec.ix*runrec.dx;
#ifdef USE_MIKRO
//      printf("MIKRO_MoveTo (1, x);%d\n",x);
    MIKRO_MoveTo (1, posrec.xset);
//    printf("->MIKRO_MoveTo (1, x);%d\n",x);
#endif

    SetCtrlVal (p1h, P1_X, posrec.xset);
    SetCtrlVal (p1h, P1_IX, posrec.ix);
    for (posrec.iy=0; posrec.iy<runrec.ny; posrec.iy++) {

      posrec.yset=runrec.y0+posrec.iy*runrec.dy;
#ifdef USE_MIKRO
//        printf("MIKRO_MoveTo (2, y);%d\n",y);
      MIKRO_MoveTo (2, posrec.yset);
//      printf("->MIKRO_MoveTo (2, y);%d\n",y);
#endif

      SetCtrlVal (p1h, P1_Y, posrec.yset);
      SetCtrlVal (p1h, P1_IY, posrec.iy);

      if (dsave) {
        time (&posrec.time);
        status = fwrite (&posrec, 1, posrec.len, fp);
      }

// clear the plots
      for (j=0; j<NCH; j++) {
        for (i=0; i<MAXCH; i++) {
          dtdc[j][0][i]=0;
          dtdc[j][1][i]=0;
          dadc[j][0][i]=0;
          dadc[j][1][i]=0;
        }
      }

      evtrec.nev=1;
      do {
        for (j=0; j<NCH; j++)
          for (i=0; i<4; i++)
            aa[j][i]=0;
//          if((neve%1000)==0) printf("Events %ld\n",neve);

#ifdef USE_DAQ
        ndat = 0;
//          a = 0x0001;
//          VME_A24D16_W(IO1_ADDR + 0x000008, &a);   //poslje laserski sunek

        ntics=0;
#  ifdef USE_CAMAC
        CSSA_R(NGL,0,10,&cres);
//          do {
//            wait_loop(IWAIT);
//            Delay(0.1);
#    ifdef NTDCJ
//        CSSA_R(NTDCJ,0,8,&cres);
#    endif
#    ifdef NTDCP
//        CSSA_R(NTDCP,0,8,&cres);
#    endif
//        if (!(cres&0x8000)) printf("CSSA_R(NTDCJ,0,8,&cres)=0x%0x\n", cres) ;
//          } while ((!(cres&0x8000))&&(ntics<2)&&daq_on);
#  endif
//          wait_loop(2000);
        while((!(V965_status(VADC)&0x1))&&(ntics<2)&&daq_on);
        if (!daq_on) break;
        if (ntics>=2) {
          ndat=V965_read (VADC, &data[0]);
          continue;
        } else {
#  ifdef USE_CAMAC
#    ifdef NTDCJ
          wait_loop(20000);
//          ntics=0;
//          do {
//            wait_loop(IWAIT);
            CSSA_R(NTDCJ,0,8,&cres);
//            if (!(cres&0x8000)) printf("CSSA_R(NTDCJ,0,8,&cres)=0x%0x\n", cres) ;
//          } while ((!(cres&0x8000))&&(ntics<2)&&daq_on);
//          if (!daq_on) break;
//          if (ntics>=2) {
          if (!(cres&0x8000)) {
            CSSA_R(NGL,0,25,&cres);
            ndat=V965_read (VADC, &data[0]);
            CSSA_R(NTDCJ,0,9,&cres);
            CSSA_R(NTDCJ,0,26,&cres);
            continue;
          }
#    endif
#  endif
        }
        /*
                ndat=V965_read (VTDC, &data[0]);
                for (i=0; i<ndat; i++) {
                  dtype=(data[i]>>25)&0x3;
                if (dtype==0) {
                  ch=tdcmap[(data[i]>>17)&0xf];
                  if (ch<NCH) {
                    rg=(data[i]>>16)&0x1;
                    adc=data[i]&0xfff;
                    aa[ch][rg]=adc;
                    dtdc[ch][rg][adc]+=1;
                      }
                  }
                  }
        */

        for (i=0; i<NCH; i++) {
            wait_loop(IWAIT);
#  ifdef USE_CAMAC
#    ifdef NTDCJ
          CSSA_R(NTDCJ,ctdcmap[i],0,&adc);
#    endif
#    ifdef NTDCP
          CSSA_R(NTDCP,ctdcmap[i],0,&adc);
#    endif
#  endif
//        printf("TDC=0x%04X\n",adc);
//          adc=adc&0xfff;
          if (adc&0x1000) adc=0xfff; else adc&=0xfff;
          aa[i][0]=adc;
          dtdc[i][0][adc]+=1;
        }

        ndat=V965_read (VADC, &data[0]);
        for (i=0; i<ndat; i++) {
          dtype=(data[i]>>25)&0x3;
          if (dtype==0) {
            ch=adcmap[(data[i]>>17)&0xf];
            if (ch<NCH) {
              rg=(data[i]>>16)&0x1;
              adc=data[i]&0xfff;
              aa[ch][rg+2]=adc;
              dadc[ch][rg][adc]+=1;
            }
          }
        }

#  ifdef USE_CAMAC
        wait_loop(IWAIT);
#    ifdef NTDCJ
        CSSA_R(NTDCJ,0,9,&cres);
#    endif
#    ifdef NTDCP
        CSSA_R(NTDCP,0,9,&cres);
        CSSA_R(NTDCP,0,26,&cres);
        // printf("2 CSSA_R(NTDCP,0,26,&cres)=0x%0x\n", cres);
#    endif
//         Delay(0.001);
//          wait_loop(IWAIT);
//          CSSA_R(NGL,0,10,&cres);
#  endif

#else /* generate test data */
        if (!daq_on) break;
        for (i=0; i<NCH; i++) {
          adc=100+evtrec.nev%200;
          dtdc[i][1][adc]+=1;
          dadc[i][1][adc]+=1;
          aa[i][0]=adc;
          aa[i][2]=adc;
          adc=200+evtrec.nev%400;
          dtdc[i][0][adc]+=1;
          dadc[i][0][adc]+=1;
          aa[i][1]=adc;
          aa[i][3]=adc;
        }
#endif
        esave=dsave;
        if (supr0 && esave) {
          Uniform (1, -1, &fracg);
          if (fracg > frac) {
            esave=0;
            for (i=0; i<NCH; i++) {
              if ((aa[i][0] >= tdcmin) && (aa[i][0] < 4000)) esave=1;
            }
          }
        }
        if (esave) {
//          time (&evtrec.time);
          for (i=0; i<NCH; i++) {
            evtrec.data[i] = aa[i][0];
            evtrec.data[i+NCH] = aa[i][2];
          }
          status = fwrite (&evtrec, 1, evtrec.len, fp);
        }

        if (!(evtrec.nev%1000)) SetCtrlVal (p1h, P1_CEVE, evtrec.nev);
      } while (evtrec.nev++<runrec.nev);
      if (!daq_on) break;
    }
    if (!daq_on) break;
  }

  if (dsave) {
    time (&endrec.time);
    status = fwrite (&endrec, 1, endrec.len, fp);
    fclose(fp);
  }

  daq_on=0;
  SetCtrlVal (p1h, P1_DAQ, daq_on);
  SetCtrlVal (p1h, P1_CEVE, evtrec.nev);

  return 0;
}

int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       LPSTR lpszCmdLine, int nCmdShow) {
  int i,j,status,refon;
  long int zpos;
  char dfile[300];
  FILE *fp;

  typedef struct {
    unsigned long id,len;
    unsigned long fver,time;
    unsigned long nev,nch,ped,xy;
    long nx,x0,dx,ny,y0,dy;
  } RUNREC;
  RUNREC runrec;

  if (InitCVIRTE (hInstance, 0, 0) == 0)
    return -1;  /* out of memory */

  SetSleepPolicy(VAL_SLEEP_MORE);
  CmtNewThreadPool (MAX_THREADS, &poolHandle);

  SetStdioWindowOptions (1000, 0, 0);
  SetStdioWindowSize (150, 600);
  SetStdioWindowPosition (825, 20);

#ifdef USE_DAQ
  VME_START(NULL);
#endif

#ifdef USE_MIKRO
  MIKRO_Open (MIKRO_COM);
  MIKRO_Init (1,0);
  MIKRO_Init (2,0);
  MIKRO_Init (3,0);
#endif

  if ((p1h = LoadPanel (0, "l2d_ui.uir", P1)) < 0) return -1;
  DisplayPanel (p1h);
  SetCtrlAttribute (p1h, P1_PLCH, ATTR_MAX_VALUE, NCH-1);

  QueueUserEvent (1000, p1h, P1_RESET);

  do {
    GetUserEvent (1, &pID, &rID);
    switch (rID) {
      case P1_TIMER:
        ntics+=1;
        GetCtrlVal (p1h, P1_REFON, &refon);
        if (refon) update_plots();
        break;
      case P1_REFRESH:
        update_plots();
        break;
      case P1_DAQ:
        GetCtrlVal (p1h, P1_DAQ, &daq_on);
        if (daq_on) {
          CmtScheduleThreadPoolFunction (poolHandle, daq_run, (void *)&dummy, &tfID);
        } else {
          CmtWaitForThreadPoolFunctionCompletion (poolHandle, tfID,
                                                  OPT_TP_PROCESS_EVENTS_WHILE_WAITING);
          CmtReleaseThreadPoolFunctionID (poolHandle, tfID);
        }
        break;
      case P1_ZSET:
        if (!daq_on) {
          GetCtrlVal (p1h, P1_ZSET, &zpos);
#ifdef USE_MIKRO
          MIKRO_MoveTo (3, zpos);
#endif
        }
        break;
      case P1_REREAD:
        if (!daq_on) {
          status = FileSelectPopup ("", "*.dat", ".dat",
                                    "Izberi datoteko s podatki",
                                    VAL_LOAD_BUTTON, 0, 0, 1, 0, dfile);
          if (status==1) {
            fp = fopen (dfile, "rb");
            status = fread (&runrec, 1, sizeof(runrec), fp);
            fclose(fp);
            if (runrec.id==1) {
              SetCtrlVal (p1h, P1_NX, runrec.nx);
              SetCtrlVal (p1h, P1_XSTEP, runrec.dx);
              SetCtrlVal (p1h, P1_XMIN, runrec.x0);
              SetCtrlVal (p1h, P1_NY, runrec.ny);
              SetCtrlVal (p1h, P1_YSTEP, runrec.dy);
              SetCtrlVal (p1h, P1_YMIN, runrec.y0);
              SetCtrlVal (p1h, P1_NEVE, runrec.nev);
            }
          }
        }
        break;
      case P1_HO:
        if (!daq_on) {
          SetWaitCursor (1);
#ifdef USE_MIKRO
          MIKRO_ReferenceMove (1);
          MIKRO_ReferenceMove (2);
          MIKRO_ReferenceMove (3);
#endif
          SetWaitCursor (0);
        }
        break;
      case P1_RESET:
        for (j=0; j<NCH; j++) {
          for (i=0; i<MAXCH; i++) {
            dtdc[j][0][i]=0;
            dtdc[j][1][i]=0;
            dadc[j][0][i]=0;
            dadc[j][1][i]=0;
          }
        }
        update_plots();
        break;
      case P1_TDCLOG:
        GetCtrlVal (p1h, P1_TDCLOG, &status);
        SetCtrlAttribute (p1h, P1_TDC, ATTR_YMAP_MODE, status);
        update_plots();
        break;
      case P1_ADCLOG:
        GetCtrlVal (p1h, P1_ADCLOG, &status);
        SetCtrlAttribute (p1h, P1_ADC, ATTR_YMAP_MODE, status);
        update_plots();
        break;
    }

  } while ((rID != P1_EXIT)||daq_on);

  CmtDiscardThreadPool (poolHandle);
  DiscardPanel (p1h);

#ifdef USE_MIKRO
  MIKRO_Close ();
#endif

#ifdef USE_DAQ
  VME_STOP();
#endif
  return 0;

}