Subversion Repositories f9daq

Rev

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

  1. #include <formatio.h>
  2. #include <cvirte.h>
  3. #include <userint.h>
  4. #include "AitGui.h"
  5. #include "XYSCAN.h"
  6.  
  7. #include <stdbool.h>
  8. #include "AitInterface.h"
  9. #include "AitMduManager_DEF.h"
  10.  
  11. #include "H1D.h"
  12. #include "H2D.h"
  13. #include "H3D.h"
  14.  
  15. static int node[3];
  16. typedef unsigned short ushort;
  17. typedef unsigned int uint;
  18.  
  19. static int ait;
  20. static int xyscan;
  21. //#define MIKRO
  22.  
  23. #ifdef MIKRO
  24. #include "MIKRO.h"
  25. #endif
  26.  
  27. #define uSMC_USB
  28. #ifdef uSMC_USB
  29. #  include "uSMC.h"
  30. #  define uSMC_SERIAL_X "0000000000004925"
  31. #  define uSMC_SERIAL_Y "0000000000006030"
  32. #  define uSMC_SERIAL_Z "0000000000002894"
  33. const char serials[3][16]= {uSMC_SERIAL_X,uSMC_SERIAL_Y,uSMC_SERIAL_Z};
  34. #endif /* uSMC_USB */
  35.  
  36. static int daq_on;
  37. static int plothandle[4]= {0,0,0, 0};
  38. static int tfID;
  39. static int controlID;
  40. static int verbose;
  41.  
  42. #define MAX_THREADS 10
  43.  
  44. static CmtThreadPoolHandle poolHandle = 0;
  45.  
  46.  
  47. /*
  48.  
  49. x: 140000 280000
  50.  
  51. */
  52.  
  53. //**************************** missing declarations in the library
  54. char strbuf[0xFF];
  55.  
  56. int gLog=0;
  57.  
  58. int printf(const char *format, ...) {
  59.   va_list aptr;
  60.   int ret;
  61.   FILE *flog;
  62.  
  63.   va_start(aptr, format);
  64.   ret = vsprintf(strbuf, format, aptr);
  65.   va_end(aptr);
  66.   SetCtrlVal(ait,AIT_STDIO,strbuf);
  67.  
  68.   if (gLog) {
  69.     flog = fopen ("stdio.log", "a");
  70.     fprintf (flog, "%s", strbuf);
  71.     fclose (flog);
  72.   }
  73.   return(ret);
  74. }
  75.  
  76.  
  77.  
  78. static int timeout=0;    
  79. int CVICALLBACK SetTimeoutCB (int panel, int control, int event,
  80.                                                                                                                         void *callbackData, int eventData1, int eventData2) {
  81.         switch (event) {
  82.                 case EVENT_TIMER_TICK:
  83.                         timeout=1;
  84.                         printf("#### Timeout\n");
  85.                         break;
  86.         }
  87.         return 0;
  88. }
  89.  
  90.  
  91.  
  92. static void start_timer (double tout) {
  93.         timeout = 0;
  94.   SetCtrlAttribute (ait, AIT_TIMER, ATTR_INTERVAL, tout);
  95.   SetCtrlAttribute (ait, AIT_TIMER, ATTR_ENABLED, 1);
  96. }
  97.  
  98. static void stop_timer ( void ) {
  99.   SetCtrlAttribute (ait, AIT_TIMER, ATTR_ENABLED, 0);
  100.   //DRSSetTimeout();
  101. }
  102.  
  103.  
  104.  
  105. void CVICALLBACK EndOfThread ( CmtThreadPoolHandle poolhandle,
  106.                                CmtThreadFunctionID functionID, unsigned int event,
  107.                                int value, void *callbackData  ) {
  108.  
  109.   daq_on=0;
  110.   //SetDimming(0);
  111.   printf("End of Thread \n");
  112.   return ;
  113.  
  114. }
  115.  
  116. int AitInit() {
  117.   InitializeConnection();
  118.   return 0;
  119. }
  120.  
  121.  
  122. int AitValidEvent() {
  123.  
  124.   return 1;
  125. };
  126.  
  127. int AitToFile(FILE *fp, int n) {
  128.         const int bsize=10000 ;
  129.         unsigned short a[bsize] ;
  130.         unsigned short buffer[2]={0x1};
  131.         buffer[1] = (unsigned short)(n*CHANNELS*2);  
  132.         for (int eventNum = 0; eventNum < n; eventNum++) {
  133.                
  134.     for (int channel = 0; channel < CHANNELS; channel++) {
  135.                         int index = channel+ CHANNELS * eventNum;
  136.                         if (index<bsize)
  137.         a[index] = ExtractAdcData(eventNum, channel);
  138.                 }
  139.         }
  140.         fwrite(buffer, 2*sizeof(short),1,fp);
  141.         return fwrite(a, 1,buffer[1],fp);
  142. };
  143.  
  144. int AitFillHistograms(int events) {
  145.   ushort rawAdcData = 0;
  146.   ushort adcData = 0;
  147.   int channelReceived = 0;
  148.   int channelExpected = 0;
  149.   bool includeSaturated = 0; // cbIncludeSaturated.Checked;
  150.   ushort max[CHANNELS];
  151.   ushort min[CHANNELS];
  152.   ushort average[CHANNELS];
  153.   int  total[CHANNELS];
  154.   for (int i = 0; i < CHANNELS; i++) {
  155.     min[i] = 0xFFFF;
  156.     max[i] = 0;
  157.     total[i] = 0;
  158.   }
  159.  
  160.   double threshold, xysumcut;
  161.   GetCtrlVal (ait, AIT_ADCTHRESHOLD, &threshold);
  162.   GetCtrlVal (ait, AIT_XYCUT, &xysumcut);
  163.  
  164.   for (int eventNum = 0; eventNum < events; eventNum++) {
  165.  
  166.     int sum = 0;
  167.     double a[4]= {0,0,0,0} ;
  168.     for (int channel = 0; channel < CHANNELS; channel++) {
  169.  
  170.       rawAdcData = ExtractAdcData(eventNum, channel);
  171.       if (addChannelNum == true) {
  172.         channelReceived = (rawAdcData >> 12) & 0xF;
  173.         channelExpected = (channel & 0xF);
  174.         if (channelReceived != channelExpected) {
  175.  
  176.           AddMessage("ERROR in Event %d : Expected channel %d, received %d -ANALYSIS STOPPED", eventNum, channelExpected, channelReceived);
  177.  
  178.           //EnableRegisterScanTimer(true);
  179.           return eventNum;
  180.         }
  181.       }
  182.       adcData = (ushort)(rawAdcData & 0x0FFF);    // remove channel number
  183.       //if ((includeSaturated == true) || ((includeSaturated == false) && (adcData < (ADCMAX - 2))))
  184.  
  185.       if (adcData>threshold) H1D_Fill(channel, adcData,1);
  186.       a[channel]=adcData;
  187.       total[channel] = total[channel] + adcData;
  188.       if (adcData > max[channel])
  189.         max[channel] = adcData;
  190.       else if (adcData < min[channel])
  191.         min[channel] = adcData;
  192.  
  193.       sum += adcData;
  194.     }
  195.     if (sum>threshold) {
  196.       H1D_Fill(10, sum, 1 );
  197.       double x = a[0]/(a[0]+a[1]);
  198.       double y = a[2]/(a[2]+a[3]);
  199.       if (sum>xysumcut) H2D_Fill(0, x, y , 1 );
  200.     }
  201.     histogramTotalEvents++;
  202.   }
  203.   //tbAdcStatistics.Clear();
  204.   for (int channel = 0; channel < CHANNELS; channel++) {
  205.     average[channel] = (ushort)(total[channel] / events);
  206.  
  207.     if (verbose) AddMessage(" {channel:%d}  : {min:0x%d}  {max:0x%d}  {max-min:%d}  {average:%d}\n", channel + 1, min[channel], max[channel], max[channel] - min[channel], average[channel]);
  208.     //if (channel < (CHANNELS - 1))
  209.     //    tbAdcStatistics.AppendText(Environment.NewLine);
  210.  
  211.   }
  212.   //SetTextboxToTop(tbAdcStatistics);
  213.   return 1;
  214. };
  215.  
  216.  
  217. int CVICALLBACK RefreshGraphs (int panel, int control, int event,
  218.                                void *callbackData, int eventData1, int eventData2) {
  219.   switch (event) {
  220.     case EVENT_TIMER_TICK:
  221. //      if (!daq_on ) return 0;
  222.     case EVENT_COMMIT: {
  223.                        
  224.       int ch=0;
  225.                         int logy=0;
  226.                         int updateplots=0;
  227.       GetCtrlVal(ait,AIT_CH, &ch);
  228.                         GetCtrlVal(ait,AIT_LOGY, &logy);
  229.                   GetCtrlVal(ait,AIT_UPDATEPLOTS, &updateplots);
  230.                         if (!updateplots) return 0;
  231.                         if (logy){
  232.                                 SetCtrlAttribute (ait, AIT_GRAPH, ATTR_YMAP_MODE, VAL_LOG);
  233.                           SetCtrlAttribute (ait, AIT_GRAPHSUM, ATTR_YMAP_MODE, VAL_LOG);
  234.                        
  235.                         } else {
  236.                                 SetCtrlAttribute (ait, AIT_GRAPH, ATTR_YMAP_MODE, VAL_LINEAR);
  237.                           SetCtrlAttribute (ait, AIT_GRAPHSUM, ATTR_YMAP_MODE, VAL_LINEAR);
  238.                        
  239.                         }
  240.       H1D_Draw(ch,ait,AIT_GRAPH,&plothandle[0]);
  241.       H1D_Draw(10,ait,AIT_GRAPHSUM,&plothandle[1]);
  242.       H2D_Draw(0,ait,AIT_GRAPHXY,&plothandle[2]);
  243.                        
  244.  
  245.     }
  246.  
  247.    
  248.     break;
  249.  
  250.   }
  251.   return 0;
  252. }
  253.  
  254.  
  255.  
  256. int CVICALLBACK daq(void *functionData) {
  257.  
  258.  
  259.   int neve;
  260.   char filename[0xff];
  261.         char fname[0xff];  
  262.         char pname[0xff];
  263.  
  264.  
  265.  
  266.   int pfreq;
  267.   int enabledoutput;
  268.   int neveold = 0;
  269.   double rate;
  270.   int *args =  (int *) functionData;
  271.  
  272.   GetCtrlVal(ait, AIT_FILENAME, fname );
  273.         GetCtrlVal(ait, AIT_PATHNAME, pname );
  274.         sprintf(filename,"%s/%s", pname, fname);
  275.  
  276.   GetCtrlVal(ait,AIT_NEVE, &neve);
  277.   GetCtrlVal(ait,AIT_DEBUG, &verbose);
  278.   GetCtrlVal(ait,AIT_PFREQ, &pfreq);
  279.   GetCtrlVal(ait,AIT_ENABLEDOUTPUT, &enabledoutput);
  280.  
  281.        
  282.         int range=0;
  283.         int nch = range;
  284.         GetCtrlVal(ait,AIT_MAX, &range);  
  285.         if (range>512) nch = 512;
  286.  
  287.                
  288.   for (int i=0; i<4; i++) {
  289.     char name[0xFF];
  290.     sprintf(name,"adc%d", i);
  291.                
  292.     H1D_Init(i, name,name, range, 0 , range);
  293.     H1D_SetTitleX(0,"ADC");
  294.     H1D_SetTitleY(0,"N");
  295.   }
  296.   H1D_Init(10, "adcsum","adcsum", range, 0 , 4*range);
  297.   H1D_SetTitleX(0,"ADC");
  298.   H1D_SetTitleY(0,"N");
  299.  
  300.   H2D_Init(0, "cog","Center of gravity", 256, 0 ,1, 256, 0 ,1);
  301.   H2D_SetTitleX(0,"x");
  302.   H2D_SetTitleY(0,"y");
  303.  
  304.  
  305.  
  306.   FILE *fp= NULL;
  307.  
  308.   if (enabledoutput) {
  309.     if (args[0]) fp =  fopen(filename,"wb");
  310.     else         fp =  fopen(filename,"ab");
  311.   }
  312.  
  313.  
  314.  
  315.  
  316.  
  317.   time_t t=0,told=0, tstart=0;
  318.  
  319.   if (!AitInit()) {
  320.                
  321.                
  322.                 ReadRegisters();
  323.                
  324.  
  325.       // Update UI
  326.       int csrDetector = ReadSD4Register(ADDR_CSR_DETECTOR);
  327.  
  328.       int  value = ((GetBit(csrDetector, BIT_CSR_DET_ADCGAIN2) ? 1 : 0) << 1) |
  329.                    ((GetBit(csrDetector, BIT_CSR_DET_ADCGAIN1) ? 1 : 0) << 0);
  330.       SetCtrlVal (ait, AIT_GETADCGAIN, value);
  331.       double valued = GetThreshold();
  332.       SetCtrlVal (ait, AIT_GETADCTHRESHOLD, valued);
  333.       valued = GetIntegrationTime();
  334.       SetCtrlVal (ait, AIT_GETADCINTEGRATIONTIME, valued);
  335.       valued = GetHvVoltage(ADDR_HV_VMON);
  336.       SetCtrlVal (ait, AIT_BIASMON, valued);
  337.                        
  338.                         value =
  339.                         ((GetBit(csrDetector, BIT_CSR_DET_SUMGAIN4) ? 1 : 0) << 3) |
  340.                         ((GetBit(csrDetector, BIT_CSR_DET_SUMGAIN3) ? 1 : 0) << 2) |
  341.                         ((GetBit(csrDetector, BIT_CSR_DET_SUMGAIN2) ? 1 : 0) << 1) |
  342.                         ((GetBit(csrDetector, BIT_CSR_DET_SUMGAIN1) ? 1 : 0) << 0);
  343.       SetCtrlVal (ait, AIT_GETADCSUMGAIN, value);
  344.                        
  345.  
  346.                
  347.     RefreshGraphs (ait, 0 , EVENT_COMMIT ,NULL, 0, 0 );
  348.    
  349.     daq_on=1;
  350.                 //RefreshGraphs (ait, 0 , EVENT_TIMER_TICK ,NULL, 0, 0 );    
  351.     time(&tstart);
  352.     told=tstart;
  353.     int i=0;
  354.     for (i=0; i<neve; i++) {
  355.       start_timer(1);// 1 s timeout
  356.       // Set ADC reset
  357.       ResetAdc(true);
  358.       // Clear ADC reset
  359.       ResetAdc(false);
  360.       int eventsAcquired = Acquire(pfreq);
  361.                         stop_timer();
  362.                         if (!daq_on) break;
  363.                         if (timeout) {
  364.                            i--;
  365.                                  printf("INFO Timeout\n");
  366.                                  continue;
  367.                         }
  368.       int isvalid =1;
  369.       if (eventsAcquired < 1) {
  370.         printf("Acquired events %d\n", eventsAcquired);
  371.         isvalid = 0;
  372.       } else {
  373.         AitFillHistograms(eventsAcquired);
  374.         if (verbose) ShowEvent(1);
  375.       }
  376.  
  377.       int nb =  ( isvalid && fp ) ? AitToFile( fp , pfreq ) : 0;
  378.       SetCtrlVal(ait,AIT_CEVE,i);
  379.       if (!isvalid) i--;
  380.      
  381.       time(&t);
  382.       if (t!=told ) {
  383.         rate =  (i-neveold);
  384.         printf("%d events in %2.2f min (%d s) Rate %f Hz %s   ",i+1, (double)(t-tstart)/60.,(t-tstart), rate , ctime(&t));
  385.         neveold = i;
  386.                                 RefreshGraphs (ait, 0 , EVENT_COMMIT ,NULL, 0, 0 );  
  387.         double daqBlocksize = GetAdcEventSize() * pfreq * 2.0;
  388.         double daqTimeMs = BlockTransferTime();
  389.         double daqTransferRate = daqBlocksize / daqTimeMs;
  390.         SetCtrlVal(ait,AIT_DAQBLOCKSIZE, daqBlocksize);
  391.         SetCtrlVal(ait,AIT_DAQTIMEMS,daqTimeMs);
  392.         SetCtrlVal(ait,AIT_DAQTRANSFERRATE,daqTransferRate);
  393.       }
  394.       told=t;
  395.  
  396.  
  397.  
  398.     }
  399.     time(&t);
  400.     printf("%d events in %2.2f min (%d s) %s",i+1, (double)(t-tstart)/60.,t-tstart, ctime(&t));
  401.  
  402.   }
  403.  
  404.   if (fp) fclose(fp);
  405.  
  406.  
  407.         RefreshGraphs (ait, 0 , EVENT_TIMER_TICK ,NULL, 0, 0 );
  408.   return 0;
  409.  
  410. }
  411.  
  412.  
  413. int CVICALLBACK scan(void *functionData) {
  414.  
  415.         int dx[3]={0,0,0};
  416.         int nx[3]={0,0,0};
  417.         int x0[3]={0,0,0};
  418.         int ix[3]={0,0,0};
  419.         int idx[3]={0,0,0};  
  420.         unsigned short size;
  421.         unsigned short posrec={0x2};   
  422.         unsigned short runbuf={0x3};
  423.        
  424.         int  n[3];
  425.         char filename[0xFF];
  426.         char fname[0xff];  
  427.         char pname[0xff];
  428.         int enabledoutput;
  429.        
  430.         FILE *fp;
  431.         GetCtrlVal(ait, AIT_FILENAME, fname );
  432.         GetCtrlVal(ait, AIT_PATHNAME, pname );
  433.         sprintf(filename,"%s/%s", pname, fname);
  434.        
  435.         GetCtrlVal(ait,AIT_ENABLEDOUTPUT, &enabledoutput);
  436.         int fsize;
  437.         if ( GetFileInfo(filename,&fsize) ) {
  438.                  MessagePopup ("Warning", "File exist. Remove it first or choose another file");
  439.            return 0;
  440.         }        
  441.         GetCtrlVal(xyscan, SCAN_STEPX, &dx[0]);
  442.         GetCtrlVal(xyscan, SCAN_STEPY, &dx[1]);
  443.         GetCtrlVal(xyscan, SCAN_NSTEPSX, &nx[0]);
  444.         GetCtrlVal(xyscan, SCAN_NSTEPSY, &nx[1]);
  445.         GetCtrlVal(xyscan, SCAN_STARTX, &x0[0]);
  446.         GetCtrlVal(xyscan, SCAN_STARTY, &x0[1]);
  447.  
  448.        
  449.         if (enabledoutput) {
  450.                                 fp =  fopen(filename,"ab");
  451.                                 if (fp) {
  452.                                          size=36;
  453.                                          fwrite(&runbuf, sizeof(unsigned short),1 ,fp);
  454.                                          fwrite(&size  , sizeof(unsigned short),1 ,fp);
  455.                                          fwrite(x0    , 1,4*3 ,fp);
  456.                                          fwrite(dx    , 1,4*3 ,fp);
  457.                                          fwrite(nx    , 1,4*3 ,fp);
  458.                                          fclose(fp);
  459.                                 }    
  460.         }      
  461.        
  462.   for (int j=0; j<nx[1]; j++) {
  463.                        
  464.          SetCtrlVal (xyscan, SCAN_IY, j);
  465.          ix[1]= x0[1]+j*dx[1];
  466. #ifdef MIKRO
  467.                 MIKRO_MoveTo(2,ix[1]);
  468.                 MIKRO_GetPosition(2,&n[1]);
  469.             SetCtrlVal (xyscan, SCAN_YP, n[1]);
  470. #endif
  471. #ifdef uSMC_USB
  472.                 uSMC_MoveTo(node[1],ix[1]);
  473.                 uSMC_GetPosition(node[1],&n[1]);
  474.             SetCtrlVal (xyscan, SCAN_YP, n[1]);
  475. #endif
  476.                
  477.                        
  478.                        
  479.          for (int i=0; i<nx[0]; i++) {
  480.                 SetCtrlVal (xyscan, SCAN_IX, i);  
  481.                 ix[0]= x0[0]+i*dx[0];
  482. #ifdef MIKRO
  483.                     MIKRO_MoveTo(1,ix[0]);
  484.                         MIKRO_GetPosition(1,&n[0]);
  485.                         SetCtrlVal (xyscan, SCAN_XP, n[0]);
  486. #endif         
  487. #ifdef uSMC_USB
  488.                     uSMC_MoveTo(node[0],ix[0]);
  489.                         uSMC_GetPosition(node[0],&n[0]);
  490.                         SetCtrlVal (xyscan, SCAN_XP, n[0]);
  491. #endif                 
  492.        
  493.                         if (enabledoutput) {
  494.                                 fp =  fopen(filename,"ab");
  495.                                 if (fp) {
  496.                                          time_t mtime;
  497.                                          idx[0]=i;
  498.                                          idx[1]=j;
  499.                                          size=24+sizeof(mtime);
  500.                                          fwrite(&posrec, sizeof(unsigned short),1 ,fp);
  501.                                          fwrite(&size  , sizeof(unsigned short),1 ,fp);
  502.                                          fwrite(n     , 1,4*3 ,fp);
  503.                                          fwrite(idx    , 1,4*3 ,fp);
  504.                                          time(&mtime);  
  505.                                          fwrite(&mtime  , sizeof(time_t),1 ,fp);
  506.                                          fclose(fp);
  507.                                 }    
  508.                         }      
  509.                                
  510.  
  511.                         int newfile=0;
  512.                         daq(&newfile);
  513.                         if (!daq_on) break;
  514.                 }
  515.                 if (!daq_on) break;
  516.         }
  517.  
  518.         return 0;
  519. }
  520.  
  521.  
  522. int main (int argc, char *argv[]) {
  523.  
  524.   if (InitCVIRTE (0, argv, 0) == 0)
  525.     return -1;  /* out of memory */
  526.   if ((ait = LoadPanel (0, "AitGui.uir", AIT)) < 0)
  527.     return -1;
  528.   if ((xyscan = LoadPanel (0, "XYSCAN.uir", SCAN)) < 0)
  529.     return -1;
  530.   SetStdioPort (CVI_STDIO_WINDOW);
  531.   SetSleepPolicy(VAL_SLEEP_MORE);
  532.   CmtNewThreadPool (MAX_THREADS,  &poolHandle);
  533.   DisplayPanel (ait);
  534.   DisplayPanel (xyscan);
  535.   AitInit();
  536.        
  537.                
  538. #ifdef MIKRO
  539.         short port;
  540.     GetCtrlVal(xyscan, SCAN_PORT, &port);
  541.         if (MIKRO_Open (port)) MessagePopup ("Error", "Mikro Port Not found !\n Change in the GUI") ;
  542.         MIKRO_Init(1,0);
  543.         MIKRO_Init(2,0);
  544. #endif
  545. #ifdef uSMC_USB
  546.   if (uSMC_Open()) MessagePopup("SMC Error","SMC Open Failed");
  547.   for (int i=0; i<3; i++) {
  548.     node[i]=uSMC_FindSerial(serials[i])+1;
  549.     uSMC_Init(node[i],1);
  550.   }
  551. #endif /* uSMC_USB */  
  552.        
  553.        
  554.   RunUserInterface ();
  555.        
  556. #ifdef MIKRO    
  557.         MIKRO_Close ();
  558. #endif
  559. #ifdef uSMC_USB
  560.   for (int i=0; i<3; i++) uSMC_PowerOff(node[i]);
  561.   uSMC_Close();
  562. #endif /* uSMC_USB */  
  563.   DiscardPanel (ait);
  564.   DiscardPanel (xyscan);
  565.   return 0;
  566. }
  567.  
  568. int CVICALLBACK StopCB (int panel, int control, int event,
  569.                         void *callbackData, int eventData1, int eventData2) {
  570.   switch (event) {
  571.     case EVENT_COMMIT:
  572.       daq_on=0;
  573.       break;
  574.   }
  575.   return 0;
  576. }
  577.  
  578.  
  579. int CVICALLBACK StartCB (int panel, int control, int event,
  580.                          void *callbackData, int eventData1, int eventData2) {
  581.   ThreadFunctionPtr mythread = NULL;
  582.   switch (event) {
  583.  
  584.     case EVENT_COMMIT:
  585.  
  586.       controlID= control;
  587.       if (panel == ait && control == AIT_START) {
  588.         mythread = daq;
  589.        
  590.       }
  591.                         if (panel == xyscan && control == SCAN_SCAN)   mythread = scan;  
  592.       if (mythread!=NULL) {
  593.         printf("New Thread panel=%d button=%d\n", panel, control);
  594.  
  595.         // SetDimming(1);
  596.  
  597.        
  598.         CmtScheduleThreadPoolFunctionAdv (poolHandle, mythread, &controlID,
  599.                                           DEFAULT_THREAD_PRIORITY,
  600.                                           EndOfThread,
  601.                                           EVENT_TP_THREAD_FUNCTION_END,
  602.                                           NULL, RUN_IN_SCHEDULED_THREAD,
  603.                                           &tfID);
  604.       }
  605.       break;
  606.   }
  607.   return 0;
  608. }
  609.  
  610.  
  611.  
  612. int CVICALLBACK ExitCB (int panel, int control, int event,
  613.                         void *callbackData, int eventData1, int eventData2) {
  614.   switch (event) {
  615.     case EVENT_COMMIT:
  616.       QuitUserInterface (0);
  617.       break;
  618.   }
  619.   return 0;
  620. }
  621.  
  622. int CVICALLBACK ReadCB (int panel, int control, int event,
  623.                         void *callbackData, int eventData1, int eventData2) {
  624.   switch (event) {
  625.     case EVENT_COMMIT:
  626.  
  627.  
  628.  
  629.       ReadRegisters();
  630.       break;
  631.   }
  632.   return 0;
  633. }
  634.  
  635. int CVICALLBACK ChangeChannelCB (int panel, int control, int event,
  636.                                  void *callbackData, int eventData1, int eventData2) {
  637.   int ch=0;
  638.   switch (event) {
  639.     case EVENT_COMMIT:
  640.  
  641.       int logy=0;
  642.       GetCtrlVal(ait,AIT_CH, &ch);
  643.                         GetCtrlVal(ait,AIT_LOGY, &logy);
  644.                         if (logy){
  645.                                 SetCtrlAttribute (ait, AIT_GRAPH, ATTR_YMAP_MODE, VAL_LOG);
  646.                           SetCtrlAttribute (ait, AIT_GRAPHSUM, ATTR_YMAP_MODE, VAL_LOG);
  647.                        
  648.                         } else {
  649.                                 SetCtrlAttribute (ait, AIT_GRAPH, ATTR_YMAP_MODE, VAL_LINEAR);
  650.                           SetCtrlAttribute (ait, AIT_GRAPHSUM, ATTR_YMAP_MODE, VAL_LINEAR);
  651.                        
  652.                         }
  653.       H1D_Draw(ch,ait,AIT_GRAPH,&plothandle[0]);
  654.       break;
  655.   }
  656.   return 0;
  657. }
  658.  
  659.  
  660.  
  661.  
  662.  
  663. int CVICALLBACK InitCB (int panel, int control, int event,
  664.                         void *callbackData, int eventData1, int eventData2) {
  665.   switch (event) {
  666.     case EVENT_COMMIT:
  667.       AitInit();
  668.       break;
  669.   }
  670.   return 0;
  671. }
  672.  
  673. int CVICALLBACK QuickCB (int panel, int control, int event,
  674.                          void *callbackData, int eventData1, int eventData2) {
  675.   switch (event) {
  676.     case EVENT_COMMIT:
  677.       switch (control) {
  678.         case AIT_QUICKSETUP_1:
  679.           QuickSetupContinuous();
  680.                                         SetCtrlVal(ait,AIT_TRGTYPE, 0);
  681.           break;
  682.         case AIT_QUICKSETUP_2:
  683.           QuickSetupDiscriminator();
  684.                                         SetCtrlVal(ait,AIT_TRGTYPE, 2);
  685.           break;
  686.         case AIT_QUICKSETUP_3:
  687.           QuickSetupTriggerOff();
  688.                             break;
  689.  
  690.  
  691.       }
  692.                         float bias = GetHvVoltage(ADDR_HV_VMON);
  693.       SetCtrlVal (panel, AIT_BIASMON, bias);
  694.                         double  value = GetIntegrationTime();
  695.       SetCtrlVal (panel, AIT_GETADCINTEGRATIONTIME, value);
  696.                         value = GetThreshold();
  697.       SetCtrlVal (panel, AIT_GETADCTHRESHOLD, value);
  698.                         int csrDetector = ReadSD4Register(ADDR_CSR_DETECTOR);
  699.  
  700.       int ivalue = ((GetBit(csrDetector, BIT_CSR_DET_ADCGAIN2) ? 1 : 0) << 1) |
  701.               ((GetBit(csrDetector, BIT_CSR_DET_ADCGAIN1) ? 1 : 0) << 0);
  702.       SetCtrlVal (panel, AIT_GETADCGAIN, ivalue);
  703.                         ivalue =
  704.                         ((GetBit(csrDetector, BIT_CSR_DET_SUMGAIN4) ? 1 : 0) << 3) |
  705.                         ((GetBit(csrDetector, BIT_CSR_DET_SUMGAIN3) ? 1 : 0) << 2) |
  706.                         ((GetBit(csrDetector, BIT_CSR_DET_SUMGAIN2) ? 1 : 0) << 1) |
  707.                         ((GetBit(csrDetector, BIT_CSR_DET_SUMGAIN1) ? 1 : 0) << 0);
  708.       SetCtrlVal (panel, AIT_GETADCSUMGAIN, ivalue);
  709.       break;
  710.   }
  711.   return 0;
  712. }
  713.  
  714.  
  715.  
  716. int CVICALLBACK MoveStageCB (int panel, int control, int event,
  717.                              void *callbackData, int eventData1, int eventData2) {
  718.   int axis=0, step=1000, direction=1;
  719.   switch (event) {
  720.     case EVENT_COMMIT:
  721.  
  722.       if (panel == xyscan) {
  723.         switch (control) {
  724.           case SCAN_BR :
  725.             axis = 1;
  726.             direction = 1;
  727.             GetCtrlVal(panel, SCAN_STEPX, &step);
  728.             break;
  729.           case SCAN_BL :
  730.             axis = 1;
  731.             direction = -1;
  732.             GetCtrlVal(panel, SCAN_STEPX, &step);
  733.             break;
  734.           case SCAN_BU :
  735.             axis = 2;
  736.             direction = 1;
  737.             GetCtrlVal(panel, SCAN_STEPY, &step);
  738.             break;
  739.           case SCAN_BD :
  740.             axis = 2;
  741.             direction = -1;
  742.             GetCtrlVal(panel, SCAN_STEPY, &step);
  743.             break;
  744.                   case SCAN_BF :
  745.             axis = 3;
  746.             direction = 1;
  747.             GetCtrlVal(panel, SCAN_STEPZ, &step);
  748.             break;
  749.           case SCAN_BB :
  750.             axis = 3;
  751.             direction = -1;
  752.             GetCtrlVal(panel, SCAN_STEPZ, &step);
  753.             break;     
  754.         }
  755. #ifdef MIKRO
  756.         {
  757.           int n=0;
  758.           MIKRO_MoveFor(axis,  direction*step );
  759.           MIKRO_GetPosition(axis,&n);
  760.           if (axis == 1) SetCtrlVal (panel, SCAN_XP, n);
  761.           if (axis == 2) SetCtrlVal (panel, SCAN_YP, n);
  762.                   if (axis == 3) SetCtrlVal (panel, SCAN_ZP, n);  
  763.         }
  764. #endif // MIKRO  
  765.                
  766. #ifdef uSMC_USB
  767.         {
  768.           int n=0;
  769.           uSMC_MoveFor(node[axis-1],  direction*step );
  770.           uSMC_GetPosition(node[axis-1],&n);
  771.           if (axis == 1) SetCtrlVal (panel, SCAN_XP, n);
  772.           if (axis == 2) SetCtrlVal (panel, SCAN_YP, n);
  773.                   if (axis == 3) SetCtrlVal (panel, SCAN_ZP, n);
  774.         }
  775. #endif // MIKRO                
  776.       }
  777.  
  778.       break;
  779.   }
  780.   return 0;
  781. }
  782.  
  783.  
  784.  
  785.  
  786.  
  787. int CVICALLBACK GoXCB (int panel, int control, int event,
  788.                        void *callbackData, int eventData1, int eventData2) {
  789.   int n2;
  790.   switch (event) {
  791.     case EVENT_COMMIT:
  792.       GetCtrlVal (panel, SCAN_XG, &n2);
  793. #ifdef MIKRO
  794.       MIKRO_MoveTo(1,n2);
  795.       MIKRO_GetPosition(1,&n2);
  796. #endif
  797. #ifdef uSMC_USB  
  798.       uSMC_MoveTo(node[0],n2);
  799.       uSMC_GetPosition(node[0],&n2);
  800. #endif   
  801.          
  802.       SetCtrlVal (panel, SCAN_XP, n2);
  803.       break;
  804.   }
  805.   return 0;
  806. }
  807.  
  808. int CVICALLBACK GoYCB (int panel, int control, int event,
  809.                        void *callbackData, int eventData1, int eventData2) {
  810.   int n2;
  811.   switch (event) {
  812.     case EVENT_COMMIT:
  813.       GetCtrlVal (panel, SCAN_YG, &n2);
  814. #ifdef MIKRO
  815.       MIKRO_MoveTo(2,n2);
  816.       MIKRO_GetPosition(2,&n2);
  817.  
  818. #endif
  819. #ifdef uSMC_USB  
  820.       uSMC_MoveTo(node[1],n2);
  821.       uSMC_GetPosition(node[1],&n2);
  822. #endif           
  823.       SetCtrlVal (panel, SCAN_YP, n2);
  824.       break;
  825.   }
  826.   return 0;
  827. }
  828.  
  829. int CVICALLBACK GoZCB (int panel, int control, int event,
  830.                        void *callbackData, int eventData1, int eventData2) {
  831.   int n2;
  832.   switch (event) {
  833.     case EVENT_COMMIT:
  834.       GetCtrlVal (panel, SCAN_ZG, &n2);
  835. #ifdef MIKRO
  836.       MIKRO_MoveTo(3,n2);
  837.       MIKRO_GetPosition(3,&n2);
  838.  
  839. #endif
  840. #ifdef uSMC_USB  
  841.       uSMC_MoveTo(node[2],n2);
  842.       uSMC_GetPosition(node[2],&n2);
  843. #endif           
  844.       SetCtrlVal (panel, SCAN_ZP, n2);
  845.       break;
  846.   }
  847.   return 0;
  848. }
  849.  
  850.  
  851. int CVICALLBACK GetCurrentPositionCB (int panel, int control, int event,
  852.                                       void *callbackData, int eventData1, int eventData2) {
  853.  
  854.   int n[3];
  855.   switch (event) {
  856.     case EVENT_COMMIT: {
  857. #ifdef MIKRO
  858.       MIKRO_GetPosition(1,&n[0]);
  859.       SetCtrlVal (panel, SCAN_XP, n[0]);
  860.       MIKRO_GetPosition(2,&n[1]);
  861.       SetCtrlVal (panel, SCAN_YP, n[1]);
  862.           MIKRO_GetPosition(3,&n[2]);
  863.       SetCtrlVal (panel, SCAN_ZP, n[2]);
  864. #endif
  865. #ifdef uSMC_USB  
  866.       uSMC_GetPosition(node[0],&n[0]);
  867.       SetCtrlVal (panel, SCAN_XP, n[0]);
  868.       uSMC_GetPosition(node[1],&n[1]);
  869.       SetCtrlVal (panel, SCAN_YP, n[1]);
  870.           uSMC_GetPosition(node[2],&n[2]);
  871.       SetCtrlVal (panel, SCAN_ZP, n[2]);
  872. #endif           
  873.       break;
  874.     }
  875.   }
  876.   return 0;
  877. }
  878.  
  879. int CVICALLBACK HomeCB (int panel, int control, int event,
  880.                         void *callbackData, int eventData1, int eventData2) {
  881.   switch (event) {
  882.     case EVENT_COMMIT:
  883. #ifdef MIKRO
  884.       MIKRO_ReferenceMove(1);
  885.       MIKRO_ReferenceMove(2);
  886.       GetCurrentPositionCB(panel, control, event, NULL, 0, 0);
  887. #endif
  888. #ifdef uSMC_USB
  889.         //SetCtrlVal(panel,P1_STAGELED,1);
  890.         for (int i=0; i<3; i++) uSMC_ReferenceMove(node[i]);
  891.                 GetCurrentPositionCB(panel, control, event, NULL, 0, 0);
  892.         //SetCtrlVal(panel,P1_STAGELED,0);
  893. #endif /* uSMC_USB */    
  894.       break;
  895.   }
  896.   return 0;
  897. }
  898.  
  899. int CVICALLBACK SetBiasCB (int panel, int control, int event,
  900.                            void *callbackData, int eventData1, int eventData2) {
  901.   double bias=0;
  902.   switch (event) {
  903.     case EVENT_COMMIT:
  904.       GetCtrlVal (panel, AIT_BIAS, &bias);
  905.       SetHvVoltage(ADDR_HV_CTRL, bias);
  906.       bias = GetHvVoltage(ADDR_HV_VMON);
  907.       SetCtrlVal (panel, AIT_BIASMON, bias);
  908.       break;
  909.   }
  910.   return 0;
  911. }
  912.  
  913. int CVICALLBACK SetHvOnCB (int panel, int control, int event,
  914.                            void *callbackData, int eventData1, int eventData2) {
  915.   int state=0;
  916.   double bias;
  917.   switch (event) {
  918.     case EVENT_COMMIT:
  919.       GetCtrlVal (panel, control, &state);
  920.       if (state) SetHvOn(true);
  921.       else SetHvOn(false);
  922.       bias = GetHvVoltage(ADDR_HV_VMON);
  923.       SetCtrlVal (panel, AIT_BIASMON, bias);
  924.       break;
  925.   }
  926.   return 0;
  927. }
  928.  
  929. int CVICALLBACK SetAdcIntegrationTimeCB (int panel, int control, int event,
  930.     void *callbackData, int eventData1, int eventData2) {
  931.  
  932.   switch (event) {
  933.     case EVENT_COMMIT: {
  934.       double value;
  935.       GetCtrlVal (panel, AIT_ADCINTEGRATIONTIME, &value);
  936.       SetIntegrationTime(value);
  937.       value = GetIntegrationTime();
  938.       SetCtrlVal (panel, AIT_GETADCINTEGRATIONTIME, value);
  939.     }
  940.     break;
  941.   }
  942.   return 0;
  943. }
  944.  
  945. int CVICALLBACK SetAdcThresholdCB (int panel, int control, int event,
  946.                                    void *callbackData, int eventData1, int eventData2) {
  947.   switch (event) {
  948.     case EVENT_COMMIT: {
  949.       double value;
  950.       GetCtrlVal (panel, AIT_ADCTHRESHOLD, &value);
  951.       SetThreshold(value);
  952.       value = GetThreshold();
  953.       SetCtrlVal (panel, AIT_GETADCTHRESHOLD, value);
  954.     }
  955.     break;
  956.   }
  957.   return 0;
  958. }
  959.  
  960. int CVICALLBACK SetAdcGainCB (int panel, int control, int event,
  961.                               void *callbackData, int eventData1, int eventData2) {
  962.   switch (event) {
  963.     case EVENT_COMMIT: {
  964.       int value;
  965.       GetCtrlVal (panel, AIT_ADCGAIN, &value);
  966.       SetAdcGain(value);
  967.       int csrDetector = ReadSD4Register(ADDR_CSR_DETECTOR);
  968.  
  969.       value = ((GetBit(csrDetector, BIT_CSR_DET_ADCGAIN2) ? 1 : 0) << 1) |
  970.               ((GetBit(csrDetector, BIT_CSR_DET_ADCGAIN1) ? 1 : 0) << 0);
  971.       SetCtrlVal (panel, AIT_GETADCGAIN, value);
  972.     }
  973.     break;
  974.   }
  975.   return 0;
  976. }
  977.  
  978. int CVICALLBACK SetAdcSumGainCB (int panel, int control, int event,
  979.                                                                                                                                  void *callbackData, int eventData1, int eventData2) {
  980.         switch (event) {
  981.                 case EVENT_COMMIT:{
  982.       int value;
  983.       GetCtrlVal (panel, AIT_ADCSUMGAIN, &value);
  984.       SetSumGain(value);
  985.       int csrDetector = ReadSD4Register(ADDR_CSR_DETECTOR);
  986.                         value =
  987.                         ((GetBit(csrDetector, BIT_CSR_DET_SUMGAIN4) ? 1 : 0) << 3) |
  988.                         ((GetBit(csrDetector, BIT_CSR_DET_SUMGAIN3) ? 1 : 0) << 2) |
  989.                         ((GetBit(csrDetector, BIT_CSR_DET_SUMGAIN2) ? 1 : 0) << 1) |
  990.                         ((GetBit(csrDetector, BIT_CSR_DET_SUMGAIN1) ? 1 : 0) << 0);
  991.       SetCtrlVal (panel, AIT_GETADCSUMGAIN, value);
  992.     }
  993.  
  994.                         break;
  995.         }
  996.         return 0;
  997. }
  998.  
  999. int CVICALLBACK SetDiscriminatorTypeCB (int panel, int control, int event,
  1000.                                                                                                                                                                 void *callbackData, int eventData1, int eventData2) {
  1001.         switch (event) {
  1002.                 case EVENT_COMMIT:{
  1003.                                 int trgtype;
  1004.                         GetCtrlVal(ait,AIT_TRGTYPE, &trgtype);
  1005.             EnableTrigger(trgtype);
  1006.                 }              
  1007.                         break;
  1008.         }
  1009.         return 0;
  1010. }
  1011.  
  1012. int CVICALLBACK ResetCB (int panel, int control, int event,
  1013.                                                                                                  void *callbackData, int eventData1, int eventData2) {
  1014.         switch (event) {
  1015.                 case EVENT_COMMIT:
  1016.                         ReconfigureDevice() ;
  1017.                         ReconnectDevice();
  1018.                         //ResetDevice() ;
  1019.                         break;
  1020.         }
  1021.         return 0;
  1022. }
  1023.  
  1024. int CVICALLBACK OpenScanCB (int panel, int control, int event,
  1025.                                                                                                                 void *callbackData, int eventData1, int eventData2) {
  1026.         switch (event) {
  1027.                 case EVENT_COMMIT:
  1028.                         DisplayPanel (xyscan);
  1029.                         break;
  1030.         }
  1031.         return 0;
  1032. }
  1033.  
  1034. int CVICALLBACK OpenMainCB (int panel, int control, int event,
  1035.                                                                                                                 void *callbackData, int eventData1, int eventData2) {
  1036.         switch (event) {
  1037.                 case EVENT_COMMIT:
  1038.                         DisplayPanel (ait);  
  1039.                         break;
  1040.         }
  1041.         return 0;
  1042. }
  1043.