Subversion Repositories f9daq

Rev

Rev 33 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. #define USE_DAQ
  2. #define USE_MIKRO
  3.  
  4. // Izberi ustrezni interface v meniju projektnega okna
  5. //  Options->CompilerDefines (dodaj /DSISVME ali /DWIENVME)
  6. #ifdef USE_DAQ
  7. #  define USE_CAMAC
  8. #include "c:\HOME\dino\sipmScan\include\camac.h"
  9. #  ifdef SISVME
  10. #    include "sisvme_dll.h"
  11. #  endif
  12. #  ifdef WIENVME
  13. #    include "wienvme_dll.h"
  14. #  endif
  15. # include "CAENV673A.h"
  16. # include "CAENV462.h"
  17.  
  18. #endif
  19.  
  20. #ifdef USE_MIKRO
  21. #  include "MIKRO.h"
  22. #endif
  23.  
  24. #include <userint.h>
  25. #include <ansi_c.h>
  26. #include <utility.h>
  27. #include <analysis.h>
  28.  
  29. #include "c:\HOME\dino\sipmScan\include\sipmBias_ui.h"
  30.  
  31. #ifdef USE_DAQ
  32. #  define USE_CAMAC
  33. #  include "camac.h"
  34. #  define NDAC 1 // CAEN C221
  35. #    define ASD8 0 // channels
  36. #    define AMPDISSH 1
  37. #    define SIPM 2
  38. #  define CAEN_V673A   0x22220000 // IJS
  39. //#define CAEN_V673A   0x10110000 // FMF
  40. #  define CAEN_V462    0x100300
  41. #endif
  42.  
  43. #ifdef USE_MIKRO
  44. #  define MIKRO_COM 5
  45. #  define MIKRO_X 1
  46. #  define USE_MIKRO_Y
  47. #  define MIKRO_Y 2
  48. #  define USE_MIKRO_Z
  49. #  define MIKRO_Z 3
  50. #  define STEP_TOLERANCE 50
  51. #endif
  52.  
  53. #define MAXCH 512
  54. #define MAX_THREADS 10
  55.  
  56. #define IWAIT 200
  57.  
  58. #define NCH 64
  59. #define POWERSUPPLY 66 // Power supply voltage for SiPM bias
  60.  
  61. static int p1h, pID, rID, tfID;
  62. static int ph_tdc, ph_adc;
  63. static int dtdc[NCH][2][MAXCH];
  64. static int something[NCH][2][MAXCH];
  65.  
  66. static int daq_on;
  67. static int poolHandle = 0;
  68. static int ntics,dummy;
  69.  
  70. /************************************************************/
  71. void wait_loop(unsigned long iloop)
  72.  
  73. {
  74.   int i;
  75.  
  76.   for (i=0;i<iloop;i++);
  77.   return;
  78. }
  79.  
  80. int CVICALLBACK cb_timer (int panel, int control, int event, void *callbackData,
  81.                            int eventData1, int eventData2)
  82. {
  83.   QueueUserEvent (9000, p1h, P1_TIMER);
  84.   return (0);
  85. }
  86.  
  87. int update_plots (void)
  88. {
  89.   int irange, ch;
  90.  
  91.   GetCtrlVal (p1h, P1_PLCH, &ch);
  92.  
  93.   if (ph_tdc>0) DeleteGraphPlot (p1h, P1_TDC, ph_tdc, VAL_DELAYED_DRAW);
  94.   GetCtrlVal (p1h, P1_TDCHL, &irange);
  95.   ph_tdc = PlotY (p1h, P1_TDC, &dtdc[ch][irange], MAXCH, VAL_INTEGER,
  96.                   VAL_VERTICAL_BAR, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);
  97.  
  98.   if (ph_adc>0) DeleteGraphPlot (p1h, P1_ADC, ph_adc, VAL_DELAYED_DRAW);
  99.   GetCtrlVal (p1h, P1_ADCHL, &irange);
  100.   ph_adc = PlotY (p1h, P1_ADC, &something[ch][irange], MAXCH, VAL_INTEGER,
  101.                   VAL_VERTICAL_BAR, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_BLUE);
  102.   return (0);
  103. }
  104.  
  105.  
  106. int module_header(int recid,unsigned long *data,int len){
  107.    data[0] = recid;
  108.    data[1] = (len >0)? len : 0 ;
  109.    return data[1]+2;
  110. }
  111.  
  112. int SetDac(int, double);
  113.  
  114. int CVICALLBACK daq_run(void *functionData)
  115. {
  116.         // ***
  117.         // variable declarations
  118.         int i,j;
  119.         int dtype,ch,rg,adc,cres,bsr;
  120.        
  121.         //unsigned short aa[NCH][4];
  122.         unsigned long tdc[NCH];
  123.         unsigned long step_minutes, end_time_s, cur_time_s;
  124.         int start_hours, start_minutes, start_seconds;
  125.  
  126.         int status,fmax,fcount,fev;
  127.         int popupret;
  128.         int mikroX; // check the position
  129.         int mikroY; // check the position
  130.  
  131.   char dfile[MAX_PATHNAME_LEN],dfile0[MAX_PATHNAME_LEN];
  132.   int supr0,tdcmin,fseed;
  133.   float frac;
  134.   double fracg;
  135.   unsigned short dum16;
  136.   int count;
  137.   int print = 0;
  138.   int timer_out = 0;
  139.   //time_t t,told, tstart;
  140.   int ntrig;  
  141.   int chip, len;
  142.   unsigned long *pdata;
  143.  
  144.   FILE *fp;
  145.   #define  RUNREC_ID 1
  146.   #define  ENDREC_ID 2
  147.   #define  POSREC_ID 3
  148.   #define  EVTREC_ID 4
  149.   #define  THRREC_ID 5
  150.   #define BIASREC_ID 6
  151.  
  152.   typedef struct {
  153.     unsigned long id,len;
  154.     unsigned long fver,time;
  155.     unsigned long thLow, thUp, thStep;
  156.     unsigned long biasLow, biasUp, biasStep;
  157.     unsigned long nev,nch,ped,xy;
  158.     long nx,x0,dx,ny,y0,dy;
  159.     } RUNREC;
  160.         RUNREC runrec;
  161.        
  162.   typedef struct {
  163.     unsigned long id,len;
  164.     unsigned long time;
  165.     } ENDREC;
  166.         ENDREC endrec;
  167.        
  168.   typedef struct {
  169.     unsigned long id,len;
  170.     unsigned long time;
  171.     long ix,x,xset,iy,y,yset;
  172.     } POSREC;
  173.         POSREC posrec;
  174.  
  175.   typedef struct {
  176.     unsigned long id,len;
  177.     unsigned long nev;
  178.     //unsigned short data[NCH];
  179.     } EVTREC;
  180.         EVTREC evtrec;
  181.        
  182.   typedef struct {
  183.         unsigned long id;
  184.         unsigned long len;
  185.         unsigned long threshold;
  186.         } THRREC;
  187.   THRREC thrrec;
  188.  
  189.   typedef struct {
  190.         unsigned long id;
  191.         unsigned long len;
  192.         unsigned long bias;
  193.         } BIASREC;
  194.   BIASREC biasrec;
  195.        
  196.         double thresholdLow;
  197.         double thresholdUp;
  198.         double thresholdStep;
  199.         double biasLow;
  200.         double biasUp;
  201.         double biasStep;
  202.  
  203. #define BSIZE 20000
  204.        
  205.         int maxn = BSIZE-4; // 2 words x 2 headers
  206.         int tdcdata, edge_type, overflow, tdc_num, channel, ev_dat, last_dat, nval_dat;
  207.         // end of declarations
  208.         // ***
  209.        
  210.         runrec.id = RUNREC_ID;
  211.         runrec.len = sizeof(runrec);
  212.         //runrec.fver = 0x10000;
  213.         runrec.nch = NCH;
  214.         GetCtrlVal(p1h, P1_ADCHLSAVE, &runrec.xy);//runrec.xy = 1;
  215.         GetCtrlVal(p1h, P1_DEBUG, &print);
  216.         endrec.id = ENDREC_ID;
  217.         endrec.len = sizeof(endrec);
  218.         posrec.id = POSREC_ID;
  219.         posrec.len = sizeof(posrec);
  220.         evtrec.id = EVTREC_ID;
  221.         evtrec.len = sizeof(evtrec);
  222.         thrrec.id = THRREC_ID;
  223.         thrrec.len = sizeof(thrrec);
  224.         biasrec.id = BIASREC_ID;
  225.         biasrec.len = sizeof(biasrec);
  226.        
  227.        
  228.         cres = 0;
  229.        
  230.         GetCtrlVal (p1h, P1_NEVE, &runrec.nev);
  231.         GetCtrlVal (p1h, P1_PEDESTAL, &runrec.ped);
  232.        
  233.         GetCtrlVal (p1h, P1_NX, &runrec.nx);
  234.         GetCtrlVal (p1h, P1_XSTEP, &runrec.dx);
  235.         GetCtrlVal (p1h, P1_XMIN, &runrec.x0);
  236.         GetCtrlVal (p1h, P1_NY, &runrec.ny);
  237.         GetCtrlVal (p1h, P1_YSTEP, &runrec.dy);
  238.         GetCtrlVal (p1h, P1_YMIN, &runrec.y0);
  239.        
  240.         GetCtrlVal (p1h, P1_NMIN, &step_minutes);
  241.         GetSystemTime(&start_hours, &start_minutes, &start_seconds);
  242.         //cur_time_s = start_hours*3600 + start_minutes*60 + start_seconds;
  243.         time(&cur_time_s);
  244.         end_time_s = cur_time_s + step_minutes*60;
  245.         printf("START:%2d-%2d-%2d (cur_time = %u s, end_time = %u s)\n", start_hours, start_minutes, start_seconds, cur_time_s, end_time_s);
  246.  
  247.         //GetCtrlVal (p1h, P1_DSAVE, &dsave);
  248.   //if (dsave) {
  249.           GetCtrlVal (p1h, P1_DFILE, dfile0);
  250.          
  251.           fev=0;
  252.           fcount=1;
  253.           GetCtrlVal (p1h, P1_NEWF, &fmax);
  254.           fmax*=1000000;//fmax in Mega Bytes
  255.   //}
  256.         GetCtrlVal (p1h, P1_SUPR, &supr0);
  257.         if (supr0) {
  258.           GetCtrlVal (p1h, P1_TDCMIN, &tdcmin);
  259.           GetCtrlVal (p1h, P1_FRAC, &frac);
  260.         }
  261.        
  262.         GetCtrlVal (p1h, P1_SASD8THR, &thresholdLow);
  263.         runrec.thLow = thresholdLow*1000; // mV
  264.         GetCtrlVal (p1h, P1_STHRUP, &thresholdUp);
  265.         runrec.thUp = thresholdUp*1000; // mV
  266.         GetCtrlVal (p1h, P1_STEP, &thresholdStep);
  267.         runrec.thStep = thresholdStep*1000; // mV
  268.        
  269.         GetCtrlVal (p1h, P1_SBIAS, &biasLow);
  270.         GetCtrlVal (p1h, P1_SBIASUP, &biasUp);
  271.         GetCtrlVal (p1h, P1_SBIASSTEP, &biasStep);
  272.         runrec.biasLow  = biasLow*1000;
  273.         runrec.biasUp   = biasUp*1000;
  274.         runrec.biasStep = biasStep*1000;
  275.  
  276. #ifdef USE_DAQ
  277.         V673A_map(0,CAEN_V673A,0);
  278.         V673A_init(0);
  279.  
  280.         V462_map(0,CAEN_V462,0);
  281.         V462_set0(0,1);
  282. #endif
  283.  
  284.   //if (dsave) {
  285.     sprintf(dfile,"%s_file%02d.dat",dfile0,fcount);
  286.  
  287.     fp = fopen (dfile, "wb");
  288.     time (&runrec.time);
  289.     status = fwrite (&runrec, 1, runrec.len, fp);
  290.         //}
  291.         if (supr0) {
  292.           fseed = runrec.time & 0x7fffffff;
  293.           Uniform (1, fseed, &fracg);
  294.         }
  295.  
  296.   // Set SiPM bias voltage
  297.   //SetDac(SIPM, 1.0);
  298.   biasrec.bias = runrec.biasLow;
  299.   while (biasrec.bias <= runrec.biasUp) {
  300.         SetDac(SIPM, biasrec.bias/1000.0 - POWERSUPPLY);
  301.         SetCtrlVal(p1h, P1_SBIAS, biasrec.bias/1000.0);
  302.         status = fwrite(&biasrec, 1, biasrec.len, fp);
  303.         if (print) printf("BIASREC status %d len %d bias %d\n", status, biasrec.len, biasrec.bias);
  304.  
  305.   // Set ASD threshold voltage
  306.   thrrec.threshold = (unsigned long) ceil(thresholdLow*1000); // threshold in mV
  307.   while (thrrec.threshold <= thresholdUp*1000) {
  308.     SetDac(ASD8, thrrec.threshold/1000.0);
  309.         SetCtrlVal(p1h, P1_SASD8THR, thrrec.threshold/1000.0);
  310.     status = fwrite(&thrrec, 1, thrrec.len, fp);
  311.     if (print) printf("THRREC status %d len %d threshold %d\n", status, thrrec.len, thrrec.threshold);
  312.    
  313.   for (posrec.ix=0; posrec.ix<runrec.nx; posrec.ix++) {
  314.                 posrec.xset = runrec.x0 + posrec.ix*runrec.dx;
  315. #ifdef USE_MIKRO
  316.           //printf("MIKRO_MoveTo (1, x);%d\n",posrec.x);
  317.           do {
  318.         MIKRO_MoveTo (MIKRO_X, posrec.xset);
  319.         MIKRO_GetPosition(MIKRO_X, &mikroX);
  320.       } while (abs(posrec.xset - mikroX) > STEP_TOLERANCE);
  321.           //printf("->MIKRO_MoveTo (1, x);%d\n",posrec.xset);
  322. #endif
  323.           //SetCtrlVal (p1h, P1_X, posrec.xset);
  324.           posrec.xset = mikroX; // set the true value
  325.           SetCtrlVal(p1h, P1_X, mikroX);
  326.           SetCtrlVal (p1h, P1_IX, posrec.ix);
  327.           for (posrec.iy=0; posrec.iy<runrec.ny; posrec.iy++) {
  328.       posrec.yset = runrec.y0 + posrec.iy*runrec.dy;
  329. #ifdef USE_MIKRO_Y
  330.       //printf("MIKRO_MoveTo (2, y);%d\n",y);
  331.       do {
  332.         MIKRO_MoveTo (MIKRO_Y, posrec.yset);
  333.         MIKRO_GetPosition(MIKRO_Y, &mikroY);
  334.         } while (abs(posrec.yset - mikroY) > STEP_TOLERANCE);
  335.           //printf("->MIKRO_MoveTo (2, y);%d\n",posrec.yset);
  336. #endif
  337.       //SetCtrlVal (p1h, P1_Y, posrec.yset);
  338.       posrec.yset = mikroY; // set the true value
  339.       SetCtrlVal (p1h, P1_Y, mikroY);
  340.       SetCtrlVal (p1h, P1_IY, posrec.iy);
  341.       //if (dsave) {
  342.       if (fmax && (ftell(fp) > fmax)) {
  343.         fcount+=1;
  344.         sprintf(dfile,"%s_file%02d.dat",dfile0,fcount);
  345.         fclose(fp);
  346.         fp = fopen (dfile, "wb");
  347.       }
  348.          
  349.       time (&posrec.time);
  350.             status = fwrite (&posrec, 1, posrec.len, fp);
  351.             if (print) printf("POSREC status %d len %d\n", status, posrec.len);
  352.                   //}
  353.                  
  354. // clear the plots
  355.       for (j=0;j<NCH;j++) {
  356.        for (i=0;i<MAXCH;i++){
  357.           dtdc[j][0][i]=0;
  358.           dtdc[j][1][i]=0;
  359.         }
  360.       }
  361.  
  362.           evtrec.nev=1;  
  363.       //time(&t);
  364.       //tstart=t;
  365.       if (print) printf("RUN START.\n");
  366.        
  367.       do {
  368.         unsigned long word[BSIZE];
  369.             count=0;
  370.             ntics=0;
  371.             if (print) printf("Event counter: %d\n", evtrec.nev);
  372.            
  373.                 //if (t!=told ) printf("%d in %2.2f min daq::event() %s\n",i, (double)(t-tstart)/60., ctime(&t));
  374.              
  375. #ifdef USE_DAQ
  376. #ifdef CAEN_V673A
  377.  
  378.    
  379.         V462_start0(0);
  380.                 //tmlnk (tout);
  381.         do {  
  382.           ntrig  = V673A_ntrig(0);
  383.         } while (ntrig==0 &&(ntics<2));
  384.         //tmulk();
  385.         //if (timer_out) {
  386.         //   fprintf(stderr,"-----------------> V673a timeout !!!\n");
  387.         //   V673A_clallb(0);
  388.         //   continue;
  389.         //}
  390.      
  391.         if (ntics>=2) {
  392.            fprintf(stderr,"-----------------> V673a timeout !!!\n");
  393.            printf("Timer tics %d\n", ntics);
  394.            ntics = 0;
  395.            evtrec.nev--;
  396.            V673A_clallb(0);
  397.            continue;
  398.           }
  399.  
  400.         if (ntrig>0){
  401.           // chip readout
  402.           for (chip=0;chip<2;chip++){
  403.             if (chip) len = V673A_read1 (0, &word[count+2],maxn-count-2);
  404.             else          len = V673A_read0 (0, &word[count+2],maxn-count-2);
  405.          
  406.             if (len>16*32*4){
  407.               if (print) printf("Length > 2048 per chip!\n");
  408.               chip=2;
  409.               V673A_clallb(0);
  410.               evtrec.nev--;
  411.               continue;
  412.             }
  413.             pdata=&word[count+2];
  414.             for(i=0;i< len;i++){
  415.               tdcdata   =  pdata[i] & 0xFFFF ;
  416.               edge_type = (pdata[i]>>16)&0x1  ;
  417.               overflow  = (pdata[i]>>17)&0x1  ;
  418.               tdc_num   = (pdata[i]>>25)&0x1  ;
  419.               channel   = ((pdata[i]>>18)&0x1F) |tdc_num<<5 ;
  420.               ev_dat    = (pdata[i]>>23)&0x1  ;    
  421.               last_dat  = (pdata[i]>>30)&0x1  ;
  422.               nval_dat  = (pdata[i]>>31)&0x1  ;
  423.               if (ev_dat) {
  424.                 if(print) printf("Event %d\n",tdcdata);
  425.               } else {
  426.                 dtdc[channel][edge_type][tdcdata]++;
  427.              
  428.               if (print) printf
  429.                        ("ch=%d edge=%d ev=%d data=%d last=%d nval=%d\n",channel, edge_type,ev_dat,tdcdata,last_dat,nval_dat);
  430.               }
  431.             }
  432.             if (count+2 < maxn) count+=module_header(0x140+chip,&word[count],len);
  433.                   }
  434.                   if (print) printf("Received triggers: %d \n", ntrig);
  435.         } else {
  436.           if (ntrig==0) {
  437.                 fprintf(stderr,"-----------------> no trigger");
  438.                 break;
  439.           } else {
  440.                 if (print) fprintf(stderr,"-----------------> wrong number of triggers in chips V673a  !!!\n");
  441.           }
  442.           V673A_clallb(0);
  443.           evtrec.nev--;
  444.           continue;
  445.         }
  446.        
  447.         V673A_clallb(0);
  448. #endif
  449. #endif
  450.        
  451.  
  452.         GetCtrlVal(p1h, P1_ADCHLSAVE, &runrec.xy);
  453.         evtrec.len = count*sizeof(unsigned long) + sizeof(evtrec);
  454.         if (print) printf("EVTREC.len = %d bytes.\n", evtrec.len);
  455.        
  456.         status = fwrite (&evtrec, 1, sizeof(evtrec), fp);
  457.         status = fwrite (&word, 1, count*sizeof(unsigned long), fp);
  458.                    
  459.              
  460.             if (!(evtrec.nev%1000)) SetCtrlVal (p1h, P1_CEVE, evtrec.nev);
  461.              
  462.             if (!((evtrec.nev+1)%1000)) {                                                            
  463.             if (fmax && (ftell(fp) > fmax)) {
  464.               time (&endrec.time);
  465.                       status = fwrite (&endrec, 1, endrec.len, fp);
  466.               fcount+=1;
  467.                   sprintf(dfile,"%s_file%02d.dat",dfile0,fcount);
  468.                   fclose(fp);
  469.                   fp = fopen (dfile, "wb");
  470.             }
  471.         }
  472.          
  473.         if(step_minutes > 0) {
  474.                                   GetSystemTime(&start_hours, &start_minutes, &start_seconds);
  475.                                   //cur_time_s = start_hours*3600 + start_minutes*60 + start_seconds;
  476.                                   time(&cur_time_s);
  477.                                   if(cur_time_s >= end_time_s) {
  478.                                           end_time_s = cur_time_s + step_minutes*60;
  479.                                           printf("STEP (nev):%2d-%2d-%2d @ %d\n", start_hours, start_minutes, start_seconds, posrec.xset);
  480.                         break;
  481.                 }
  482.         }
  483.         //told=t;
  484.        
  485.         GetCtrlVal(p1h, P1_DAQ, &daq_on);
  486.          
  487.             } while (evtrec.nev++<runrec.nev && daq_on);
  488.             if (!daq_on) break;
  489.           } // x loop
  490.           if (!daq_on) break;
  491.         } // y loop
  492.         if (!daq_on) break;
  493.         thrrec.threshold += thresholdStep*1000;
  494.         } // threhsold loop
  495.         if (!daq_on) break;
  496.         biasrec.bias += runrec.biasStep;
  497.         } // bias loop
  498.        
  499.         SetDac(SIPM, 0); // safety
  500.        
  501.   //if (dsave) {
  502.     time (&endrec.time);
  503.     status = fwrite (&endrec, 1, endrec.len, fp);
  504.     if (print) printf("ENDREC status %d len %d\n", status, endrec.len);
  505.     fclose(fp);
  506.         //}
  507.         GetSystemTime(&start_hours, &start_minutes, &start_seconds);
  508.         printf("STOP:%2d-%2d-%2d (start_time = %u s, end_time = %u s)\n", start_hours, start_minutes, start_seconds, runrec.time, endrec.time);
  509.         printf("Elapsed time: %u s.\n", endrec.time-runrec.time);
  510.        
  511.     daq_on=0;  
  512.         SetCtrlVal (p1h, P1_DAQ, daq_on);
  513.         SetCtrlVal (p1h, P1_CEVE, evtrec.nev);
  514.         if (print) printf("RUN END. \n\n");
  515.  
  516.         return 0;
  517. }
  518.  
  519.  
  520. int SetDac(int ch, double val){
  521.        
  522.         const unsigned int maxdac=0xFFF;
  523.         const double RANGE = +9.9976; //V
  524.         unsigned int dac;
  525.        
  526.         if ((val > RANGE) || (val < 0)) {
  527.                 printf("DAC value OUT OF RANGE!!!\n");
  528.                 return(-1);
  529.         }
  530.        
  531.         dac = (val/RANGE)*maxdac;
  532.         CSSA_W(NDAC,ch,16,&dac);
  533.         printf("DAC ch %d set to %f V dac=%d\n", ch, val, dac);
  534.         return 0;
  535. }
  536.  
  537. int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  538.                        LPSTR lpszCmdLine, int nCmdShow)
  539. {
  540.   int i,j,status,refon;
  541.   long int xpos, ypos, zpos;
  542.   char dfile[300];
  543.   FILE *fp;
  544.  
  545.   typedef struct {
  546.   unsigned long id,len;
  547.   unsigned long fver,time;
  548.   unsigned long nev,nch,ped,xy;
  549.   long nx,x0,dx,ny,y0,dy;
  550.   } RUNREC;
  551.   RUNREC runrec;
  552.  
  553.   if (InitCVIRTE (hInstance, 0, 0) == 0)
  554.         return -1;      /* out of memory */
  555.  
  556.   SetSleepPolicy(VAL_SLEEP_MORE);
  557.   CmtNewThreadPool (MAX_THREADS, &poolHandle);
  558.  
  559.   SetStdioWindowOptions (1000, 0, 0);
  560.   SetStdioWindowSize (200, 560);
  561.   SetStdioWindowPosition (825, 250);
  562.  
  563. #ifdef USE_DAQ
  564.   VME_START(NULL);
  565. #endif
  566.  
  567. #ifdef USE_MIKRO
  568.   MIKRO_Open (MIKRO_COM);
  569.   MIKRO_Init (MIKRO_X,0);
  570. #ifdef USE_MIKRO_Y
  571.   MIKRO_Init (MIKRO_Y,0);
  572. #endif
  573. #ifdef USE_MIKRO_Z
  574.   MIKRO_Init (MIKRO_Z,0);
  575. #endif
  576. #endif
  577.  
  578.   if ((p1h = LoadPanel (0, "include/sipmBias_ui.uir", P1)) < 0) return -1;
  579.   DisplayPanel (p1h);
  580.   SetCtrlAttribute (p1h, P1_PLCH, ATTR_MAX_VALUE, NCH-1);
  581.  
  582.   GetCtrlVal(p1h, P1_ADCHLSAVE, &runrec.xy);
  583.   SetCtrlVal(p1h, P1_ADCHL, runrec.xy-2);
  584.  
  585.   QueueUserEvent (1000, p1h, P1_RESET);
  586.   //QueueUserEvent (1000, p1h, P1_ASD8THR);
  587.   QueueUserEvent (1000, p1h, P1_AMPDISSHTHR);
  588.   QueueUserEvent (1000, p1h, P1_BIAS);
  589.   do {
  590.     GetUserEvent (1, &pID, &rID);
  591.         switch (rID) {
  592.       case P1_TIMER:
  593.         ntics+=1;
  594.         GetCtrlVal (p1h, P1_REFON, &refon);
  595.                     if (refon) update_plots();
  596.             break;
  597.       case P1_REFRESH:
  598.                 update_plots();
  599.             break;
  600.           case P1_DAQ:
  601.                 GetCtrlVal (p1h, P1_DAQ, &daq_on);
  602.                 if (daq_on) {
  603.                   CmtScheduleThreadPoolFunction (poolHandle, daq_run, (void *)&dummy, &tfID);
  604.                 } else {
  605.           CmtWaitForThreadPoolFunctionCompletion (poolHandle, tfID,
  606.                                                                         OPT_TP_PROCESS_EVENTS_WHILE_WAITING);
  607.               CmtReleaseThreadPoolFunctionID (poolHandle, tfID);
  608.             }
  609.             break;
  610.            
  611.           case P1_ZSET:
  612.             if (!daq_on) {
  613.               GetCtrlVal (p1h, P1_ZSET, &zpos);
  614. #ifdef USE_MIKRO_Z
  615.           MIKRO_MoveTo (MIKRO_Z, zpos);
  616. #endif
  617.         }
  618.             break;
  619.           case P1_REREAD:
  620.             if (!daq_on) {
  621.           status = FileSelectPopup ("", "*.dat", ".dat",
  622.                                     "Choose the previous file",
  623.                                     VAL_LOAD_BUTTON, 0, 0, 1, 0, dfile);
  624.           if (status==1) {
  625.             fp = fopen (dfile, "rb");
  626.                         status = fread (&runrec, 1, sizeof(runrec), fp);
  627.                         fclose(fp);
  628.                         if (runrec.id==1) {
  629.                           SetCtrlVal (p1h, P1_NX, runrec.nx);
  630.                           SetCtrlVal (p1h, P1_XSTEP, runrec.dx);
  631.                           SetCtrlVal (p1h, P1_XMIN, runrec.x0);
  632.                           SetCtrlVal (p1h, P1_NY, runrec.ny);
  633.                           SetCtrlVal (p1h, P1_YSTEP, runrec.dy);
  634.                           SetCtrlVal (p1h, P1_YMIN, runrec.y0);
  635.                           SetCtrlVal (p1h, P1_NEVE, runrec.nev);
  636.             }
  637.               }
  638.         }
  639.             break;
  640.           case P1_MGET:
  641.           #ifdef USE_MIKRO
  642.                 MIKRO_GetPosition(MIKRO_X,&xpos);
  643.                 Delay(0.01);
  644.                 SetCtrlVal (p1h, P1_X, xpos);  
  645.           #ifdef USE_MIKRO_Y   
  646.                 MIKRO_GetPosition(MIKRO_Y,&ypos);
  647.                 Delay(0.01);
  648.                 SetCtrlVal (p1h, P1_Y, ypos);
  649.           #endif
  650.           #ifdef USE_MIKRO_Z   
  651.                 MIKRO_GetPosition(MIKRO_Z,&zpos);
  652.                 Delay(0.01);
  653.                 SetCtrlVal (p1h, P1_Z, zpos);
  654.           #endif
  655.           #endif
  656.                 break;
  657.           case P1_HO:
  658.             if (!daq_on) {
  659.                   SetWaitCursor (1);
  660. #ifdef USE_MIKRO
  661.                   MIKRO_ReferenceMove (MIKRO_X);
  662.                 #ifdef USE_MIKRO_Y     
  663.                   MIKRO_ReferenceMove (MIKRO_Y);
  664.                 #endif
  665.                 #ifdef USE_MIKRO_Z
  666.                   MIKRO_ReferenceMove (MIKRO_Z);
  667.                 #endif
  668. #endif
  669.                   SetWaitCursor (0);
  670.             }
  671.             break;
  672.           case P1_RESET:
  673.         for (j=0;j<NCH;j++) {
  674.           for (i=0;i<MAXCH;i++){
  675.             dtdc[j][0][i]=0;
  676.             dtdc[j][1][i]=0;
  677.            
  678.           }
  679.         }
  680.                 update_plots();
  681.             break;
  682.           case P1_TDCLOG:
  683.             GetCtrlVal (p1h, P1_TDCLOG, &status);
  684.         SetCtrlAttribute (p1h, P1_TDC, ATTR_YMAP_MODE, status);
  685.                 update_plots();
  686.             break;
  687.           case P1_ADCLOG:
  688.             GetCtrlVal (p1h, P1_ADCLOG, &status);
  689.         SetCtrlAttribute (p1h, P1_ADC, ATTR_YMAP_MODE, status);
  690.                 update_plots();
  691.             break;
  692.           case P1_ASD8THR:
  693.             {
  694.               double value;
  695.               GetCtrlVal (p1h, P1_SASD8THR, &value);
  696.               SetDac(ASD8, value);
  697.              
  698.             }
  699.             break;
  700.           case P1_BIAS:
  701.                 {
  702.                   double value;
  703.                   GetCtrlVal (p1h, P1_SBIAS, &value);
  704.                   value -= POWERSUPPLY;
  705.                   SetDac(SIPM, value);
  706.                 }
  707.                 break;
  708.           case P1_AMPDISSHTHR:
  709.             {
  710.               double value;
  711.               GetCtrlVal (p1h, P1_SAMPDISSHTHR, &value);
  712.               SetDac(AMPDISSH, value);
  713.  
  714.             }  
  715.             break;
  716.              
  717.         }
  718.        
  719.   } while ((rID != P1_EXIT)||daq_on);
  720.            
  721.   CmtDiscardThreadPool (poolHandle);
  722.   DiscardPanel (p1h);
  723.  
  724. #ifdef USE_MIKRO
  725.   MIKRO_Close ();
  726. #endif
  727.  
  728. #ifdef USE_DAQ
  729.   VME_STOP();
  730. #endif  
  731.   return 0;
  732.                
  733. }
  734.