Go to most recent revision | Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 111 | f9daq | 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 |