Subversion Repositories f9daq

Rev

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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/mman.h>
  6. #include <sys/ioctl.h>
  7. #include <errno.h>
  8. #include <signal.h>
  9. #include <ctype.h>
  10. #include <time.h>
  11. #include <sys/time.h>
  12.  
  13. #include "wusbxx_dll.h" /* the header of the shared library */
  14. #include "daq.h"
  15.  
  16. #define DEVICE_NAME "/dev/cc32_1"
  17. #define PRRES(X) printf(">>> %s -> %d\n",#X,(X))
  18.  
  19.  
  20.  
  21. /* definiram lokacije enot*/
  22. //#define NTDC 23         /* TDC LeCroy 2277*/
  23. #define NTGG 23          /* CAEN C423 */
  24. #define NSCA 22          /* CAEN C257 */
  25. #define NDIS 21          /* Philips 7106 */
  26.  
  27.  
  28.  
  29. #define END_MARKER 0xFAF5
  30. int ctrlc=0;
  31. int timer_out=0;
  32.  
  33. void SigInt (int sig)
  34. {
  35.     ctrlc = 1;
  36.     timer_out=1;
  37.    
  38. }
  39.  
  40. struct sigaction oact;
  41. void timerast (int signumber)
  42. {
  43.     timer_out = 1;
  44.     printf("->>> TIMEOUT !!!\n");
  45. }
  46.  
  47. void tmlnk (int tout)
  48. {
  49.     timer_out = 0;
  50.     struct sigaction act;
  51.     struct itimerval tdelay;
  52.  
  53.     act.sa_handler = timerast;
  54.     sigemptyset (&act.sa_mask);
  55.     act.sa_flags = 0;
  56.  
  57.     tdelay.it_value.tv_sec = tout / 100;
  58.     tdelay.it_value.tv_usec = 10000 * (tout % 100);
  59.     tdelay.it_interval.tv_sec = 0;
  60.     tdelay.it_interval.tv_usec = 0;
  61.  
  62.     if (sigaction (SIGALRM, &act, &oact) < 0)
  63. {
  64.         perror ("sigaction(tmlnk)");
  65.         exit (EXIT_FAILURE);
  66.     }
  67.     if (setitimer (ITIMER_REAL, &tdelay, NULL) < 0)
  68.     {
  69.         perror ("setitimer(tmlnk)");
  70.         exit (EXIT_FAILURE);
  71.     }
  72. }
  73.  
  74. void tmulk ()
  75. {
  76.     struct itimerval tdelay;
  77.  
  78.     tdelay.it_value.tv_sec = 0;
  79.     tdelay.it_value.tv_usec = 0;
  80.     tdelay.it_interval.tv_sec = 0;
  81.     tdelay.it_interval.tv_usec = 0;
  82.  
  83.     if (setitimer (ITIMER_REAL, &tdelay, NULL) < 0)
  84.     {
  85.         perror ("setitimer(tmulk)");
  86.         exit (EXIT_FAILURE);
  87.     }
  88.     if (sigaction (SIGALRM, &oact, NULL) < 0)
  89.     {
  90.         perror ("sigaction(tmulk)");
  91.         exit (EXIT_FAILURE);
  92.     }
  93. }
  94.  
  95.  
  96.  
  97.  
  98. void CAMAC_status(void)
  99. {
  100.   unsigned short id,fpga,modid,inhibit,lam;
  101.   unsigned short dum;
  102.  
  103.  
  104.   long cres;
  105.   int q,x;  
  106.  
  107.   CSSA_RQX(0,0,0,&cres,&q,&x);
  108.   dum = cres;
  109.   id   = (dum & 0xF000) >> 12;
  110.   fpga = (dum & 0x0F00) >> 8;  
  111.   modid =  (dum & 0x00F0) >> 4;
  112.   q      =  (dum & 0x0008) >> 3;
  113.   x      =  (dum & 0x0004) >> 2;
  114.   inhibit=  (dum & 0x0002) >> 1;
  115.   lam    =  (dum & 0x0001);    
  116.   printf ("CCUSB CSR ID=%x FPGA=%x modID=%x Q=%d X=%d INHIBIT=%d LAM=%d \n",id,fpga,modid, q,x,inhibit,lam);
  117. }
  118.  
  119. int daq::connect(){
  120. /*xxusb_device_type devices[100];
  121. struct usb_device *dev;
  122. dev = devices[0].usbdev;
  123. udev = xxusb_device_open(dev);*/
  124.     WUSBXX_load (NULL);
  125. //    WUSBXX_open ((char *)"CC0126");
  126.     WUSBXX_open ((char *)"CC0130");
  127.     printf("daq::connect()\n");
  128.     return 0;
  129. }
  130.  
  131. int daq::disconnect(){
  132.   /* zakljuci */
  133.  
  134.    printf("daq::disconnect()\n");
  135.   return 0;
  136. }
  137.  
  138. int daq::start(int thr_set,int time_set){
  139.       int q,x;
  140.       // printf("Nastavljam  threshold na %d in cas meritve na %d ms\n",thr_set,time_set);
  141.       long dum;
  142.       /* postavimo zeljeni prag prozenja */
  143.       CSSA_WQX(NDIS,0,17,thr_set,&q,&x);
  144.       CSSA_WQX(NDIS,1,17,0,&q,&x);
  145.        
  146.       /* stevec postavim na nic */
  147.       CSSA_RQX ( NSCA, 0, 9,&dum, &q,&x);
  148.    
  149.       /* nastavim dolzino signala */
  150.       CSSA_WQX(NTGG,0,16,time_set,&q,&x);
  151.       CSSA_RQX(NTGG,0,15,&dum,&q,&x);
  152.        
  153.       usleep(1000*time_set);
  154.       return 0;
  155. }
  156.  
  157.  
  158. int daq::count(){
  159.     int q,x;    
  160.     /* prestejem sunke na posameznem kanalu */    
  161.       for ( int ch=0 ; ch<16 ; ch ++ ) {
  162.         long data=0;
  163.         CSSA_RQX( NSCA, ch, 0, &data, &q,&x);
  164.         CSSA_RQX( NSCA, ch, 0, &data, &q,&x);
  165.                 // CC USB ne precita v redu CAEN C257 scalerja,
  166.                 // kanali so zamaknjeni za 1, ce je klic samo en
  167.                 // vrednost kanala 0 se pristeje h kanalom 8..16, zato ga ne uporabljamo.
  168.                 // vajo izvedemo le s kanali 1..15.
  169.         gData[ch]=data;
  170. //        printf("Kanal:%d Stevilo sunkov: %d \n",ch,data );
  171.       }
  172.       for ( int ch=0 ; ch<16 ; ch ++ ) if (gData[ch]>0) gData[ch]--;
  173.      
  174. return 0;
  175. }    
  176.  
  177.  
  178. int daq::save(){
  179.     /* shrani */
  180.     FILE *fp;
  181.      int ch;
  182.      if ( ( fp = fopen ( "scaler.txt", "w+" ) ) == NULL ) printf ( "ERROR" ) ;
  183.       for ( ch=0; ch<16 ; ch++ ) {  
  184.         fprintf ( fp, "%d\t%d\n", ch, gData[ch] ) ;
  185.       }
  186.     fclose ( fp ) ;
  187.    return 0;
  188. }
  189.  
  190.  
  191. int daq::append(char *filename){       
  192.         /* zapisi v tekstovno datoteko */                        
  193.  
  194.       FILE *fp=fopen ( filename, "a" );
  195.        if ( fp!= NULL ){
  196.          for ( int ch=0; ch<16 ; ch++ ) fprintf ( fp, "%d\t", gData[ch] ) ;
  197.          fprintf ( fp, "\n" ) ;
  198.          fclose ( fp ) ;
  199.            printf("Rezultati meritve so dodani v datoteko %s\n",filename);
  200.        } else {
  201.          printf ( "ERROR" ) ;
  202.        }
  203.      
  204.      return 0;
  205. }
  206.    
  207. int daq::init(){
  208.   printf("DAQ init at 0x%x\n",(unsigned int *) udev);
  209.   if (udev == NULL) connect();
  210.   if (udev == NULL) printf("udev == NULL\n");
  211.   CAMAC_status();
  212.   CCCZ;
  213.   CCCC;
  214.  
  215.   CSET_I;
  216.  
  217.   int q,x;  
  218.   long dum;  
  219.   printf("Pazi na cas meritve. Kaksen je obseg stevca?\n");
  220.   CSSA_RQX( NTGG, 0, 9, &dum,&q, &x);         /* init TGG */
  221.   CSSA_WQX( NTGG, 0,16, 1000,&q, &x);  /* Set preset counting value   */
  222.   CSSA_WQX( NTGG, 0,17, 0x2 ,&q, &x );  /* Set Load&Clock Modes */
  223.   CSSA_WQX( NDIS, 0,16, 0xffff,&q, &x);/* enable all ch. */
  224.   CSSA_RQX( NDIS, 0,26, &dum,&q, &x);
  225.  
  226.   CREM_I;
  227.  
  228.   return 0;
  229. }
  230.  
  231.  
  232.  
  233. daq::daq(){
  234. // intercept routine
  235.   if (signal (SIGINT, SigInt) == SIG_ERR) perror ("sigignore");
  236.    
  237. connect();
  238. init();
  239.  
  240. }
  241.  
  242. daq::~daq(){
  243.  
  244. disconnect();
  245. }
  246.  
  247. #ifdef MAIN
  248. int main (int argc, char **argv){
  249.   int threshold=250;
  250.   int time_set =1000; /* in ms */
  251.   char filename[1024];
  252.   sprintf(filename,"output.txt");
  253.   if (argc>1) threshold = atoi(argv[1]);
  254.   if (argc>2) sprintf(filename ,"%s",argv[2]);
  255.   if (argc>3) time_set  = atoi(argv[3]);
  256.   daq *d= new daq();
  257.   d->init();
  258.   d->start(threshold, time_set); // threshold
  259.  
  260.   d->count();
  261.   d->append(filename);
  262.   delete d;
  263.  
  264. return 0;
  265. }
  266. #endif
  267.