Rev 5 | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 5 | f9daq | 1 | #include <stdio.h> | 
        
| 2 | #include <stdlib.h> | 
        ||
| 3 | #include <string.h> | 
        ||
| 4 | #include <unistd.h> | 
        ||
| 5 | #include <sys/mman.h> | 
        ||
| 6 | #include <errno.h> | 
        ||
| 7 | #include <ctype.h> | 
        ||
| 8 | #include <time.h> | 
        ||
| 9 | #include <sys/time.h> | 
        ||
| 10 | #include <sys/stat.h> | 
        ||
| 11 | #include <signal.h> | 
        ||
| 12 | #include <zlib.h> | 
        ||
| 13 | |||
| 14 | #include "CAENV965_DEF.h" | 
        ||
| 15 | #include "VmUsbStack.h" | 
        ||
| 16 | |||
| 17 | #include "vme.h" | 
        ||
| 18 | |||
| 19 | #include "daq.h" | 
        ||
| 20 | |||
| 21 | #define VERSION 1.0 | 
        ||
| 22 | #define TIMEOUT 3 | 
        ||
| 23 | |||
| 24 | |||
| 25 | /* VME modules */ | 
        ||
| 26 | |||
| 27 | #define CAEN_V792      0x340000  // IJS V792 | 
        ||
| 28 | #define CAEN_V792_1    0x530000  // FMF1 V792 | 
        ||
| 29 | #define CAEN_V792_2    0x630000  // FMF2 V792 | 
        ||
| 30 | #define CAEN_V965      0x350000  // IJS  V965 | 
        ||
| 31 | int addr[3]={CAEN_V792,CAEN_V792_1,CAEN_V965 };  | 
        ||
| 32 | int nadc=3;  | 
        ||
| 33 | |||
| 34 | int gPedestal = 255;  | 
        ||
| 35 | |||
| 36 | #define BUFF_L 2048 | 
        ||
| 37 | static int stackwrite[10000];  | 
        ||
| 38 | static int stackdata[10000],stackdump[27000];  | 
        ||
| 39 | |||
| 40 | |||
| 41 | /************************************************/ | 
        ||
| 42 | int weight_while(int num)  | 
        ||
| 43 | { | 
        ||
| 44 | int i, tmp;  | 
        ||
| 45 | |||
| 46 | for ( i =0; i <num; i++ ) tmp = 0;  | 
        ||
| 47 | return 0;  | 
        ||
| 48 | } | 
        ||
| 49 | #define WWHILE weight_while(0) | 
        ||
| 50 | |||
| 51 | #define TRUE 1 | 
        ||
| 52 | #define FALSE 0 | 
        ||
| 53 | |||
| 54 | int timer_out;  | 
        ||
| 55 | struct sigaction oact;  | 
        ||
| 56 | void timerast (int signumber)  | 
        ||
| 57 | { | 
        ||
| 58 | timer_out = TRUE;  | 
        ||
| 59 | fprintf(stderr,"TIMEOUT !!!\n");  | 
        ||
| 60 | } | 
        ||
| 61 | |||
| 62 | void tmlnk (int tout)  | 
        ||
| 63 | { | 
        ||
| 64 | timer_out = FALSE;  | 
        ||
| 65 | struct sigaction act;  | 
        ||
| 66 | struct itimerval tdelay;  | 
        ||
| 67 | |||
| 68 | act.sa_handler = timerast;  | 
        ||
| 69 | sigemptyset (&act.sa_mask);  | 
        ||
| 70 | act.sa_flags = 0;  | 
        ||
| 71 | |||
| 72 | tdelay.it_value.tv_sec = tout / 100;  | 
        ||
| 73 | tdelay.it_value.tv_usec = 10000 * (tout % 100);  | 
        ||
| 74 | tdelay.it_interval.tv_sec = 0;  | 
        ||
| 75 | tdelay.it_interval.tv_usec = 0;  | 
        ||
| 76 | |||
| 77 | if (sigaction (SIGALRM, &act, &oact) < 0)  | 
        ||
| 78 |  { | 
        ||
| 79 | perror ("sigaction(tmlnk)");  | 
        ||
| 80 | exit (EXIT_FAILURE);  | 
        ||
| 81 |  } | 
        ||
| 82 | if (setitimer (ITIMER_REAL, &tdelay, NULL) < 0)  | 
        ||
| 83 |  { | 
        ||
| 84 | perror ("setitimer(tmlnk)");  | 
        ||
| 85 | exit (EXIT_FAILURE);  | 
        ||
| 86 |  } | 
        ||
| 87 | } | 
        ||
| 88 | |||
| 89 | void tmulk ()  | 
        ||
| 90 | { | 
        ||
| 91 | struct itimerval tdelay;  | 
        ||
| 92 | |||
| 93 | tdelay.it_value.tv_sec = 0;  | 
        ||
| 94 | tdelay.it_value.tv_usec = 0;  | 
        ||
| 95 | tdelay.it_interval.tv_sec = 0;  | 
        ||
| 96 | tdelay.it_interval.tv_usec = 0;  | 
        ||
| 97 | |||
| 98 | if (setitimer (ITIMER_REAL, &tdelay, NULL) < 0)  | 
        ||
| 99 |  { | 
        ||
| 100 | perror ("setitimer(tmulk)");  | 
        ||
| 101 | exit (EXIT_FAILURE);  | 
        ||
| 102 |  } | 
        ||
| 103 | if (sigaction (SIGALRM, &oact, NULL) < 0)  | 
        ||
| 104 |  { | 
        ||
| 105 | perror ("sigaction(tmulk)");  | 
        ||
| 106 | exit (EXIT_FAILURE);  | 
        ||
| 107 |  } | 
        ||
| 108 | } | 
        ||
| 109 | |||
| 110 | int fexist( char * path){  | 
        ||
| 111 | struct stat sbuf;  | 
        ||
| 112 | int res;  | 
        ||
| 113 | if(!path || !*path) return 0;  | 
        ||
| 114 | res=stat(path,&sbuf);  | 
        ||
| 115 | if (res){  | 
        ||
| 116 | if (errno==ENOENT) {  | 
        ||
| 117 | return 0;  | 
        ||
| 118 | } else {  | 
        ||
| 119 | return -1;  | 
        ||
| 120 |        } | 
        ||
| 121 |    } | 
        ||
| 122 | return 1;  | 
        ||
| 123 | } | 
        ||
| 124 | |||
| 125 | |||
| 126 | |||
| 127 | |||
| 128 | int daq::init(){  | 
        ||
| 129 | |||
| 130 | xxusb_register_write(udev,1,0x0); // Stop DAQ mode  | 
        ||
| 131 | while (xxusb_usbfifo_read(udev,(int *) stackdump,BUFF_L,100)>0);  | 
        ||
| 132 | |||
| 133 | |||
| 134 | int rate=1000;  | 
        ||
| 135 | int i=80000000/rate-40; // 80 MHz  | 
        ||
| 136 | if (i<72) i=72;  | 
        ||
| 137 |         // Set DGG channel A as a pulser, output on O1, | 
        ||
| 138 |         //     with delay =500 x 12.5ns, | 
        ||
| 139 |         //     and width =  500 x 12.5ns, | 
        ||
| 140 |         //     not latching or inverting | 
        ||
| 141 |   //  VME_DGG(udev,0,6,0,24000,6000,0,0); | 
        ||
| 142 | VME_DGG(udev,0,6,0,i,40,0,0);  | 
        ||
| 143 |         // Set DGG channel B to trigger on NIM1, output on O2, | 
        ||
| 144 |         //     with delay =200 x 12.5ns, | 
        ||
| 145 |         //     and width =  200 x 12.5ns, | 
        ||
| 146 |         //     not latching or inverting | 
        ||
| 147 | VME_DGG(udev,1,1,1,0,10,0,1);  | 
        ||
| 148 | |||
| 149 | |||
| 150 | // INIT stackdata | 
        ||
| 151 | int fPedestal=gPedestal;  | 
        ||
| 152 | printf("CAEN V965 Pedestal set to %d\n", fPedestal);  | 
        ||
| 153 | if (fInit != NULL ) delete fInit;  | 
        ||
| 154 | fInit=new VmUsbStack();  | 
        ||
| 155 | |||
| 156 | for (int i=0;i<nadc;i++){  | 
        ||
| 157 | fInit->WriteA24D16( addr[i] + CAENV965_CRN , 0x0);  | 
        ||
| 158 | fInit->WriteA24D16( addr[i] + CAENV965_GEO , i);  | 
        ||
| 159 | fInit->ReadA24D16(addr[i] + CAENV965_GEO);  | 
        ||
| 160 | for (int j=0;j<32;j++){  | 
        ||
| 161 | fInit->WriteA24D16(addr[i] + CAENV965_THM + 0x02*j, fThreshold[j+i*32]); // threshold/kill for 32 channels  | 
        ||
| 162 |     } | 
        ||
| 163 | fInit->WriteA24D16( addr[i] + CAENV965_BS1, 0x80 ); // soft reset  | 
        ||
| 164 | fInit->WriteA24D16( addr[i] + CAENV965_BC1, 0x80 ); // soft reset  | 
        ||
| 165 | fInit->WriteA24D16( addr[i] + CAENV965_PED, fPedestal ); // pedestal  | 
        ||
| 166 | fInit->WriteA24D16( addr[i] + CAENV965_BS2,0x5000);  | 
        ||
| 167 | fInit->WriteA24D16( addr[i] + CAENV965_BS2,0x4); // clear module  | 
        ||
| 168 | fInit->WriteA24D16( addr[i] + CAENV965_BC2,0x4);  | 
        ||
| 169 |         } | 
        ||
| 170 | fInit->Marker(0xFAFC);  | 
        ||
| 171 | |||
| 172 | //      fInit->Print();  | 
        ||
| 173 | |||
| 174 | |||
| 175 |         // READOUT stackdata | 
        ||
| 176 | if (fStack != NULL ) delete fStack;  | 
        ||
| 177 | fStack=new VmUsbStack();  | 
        ||
| 178 | fStack->Marker(0xFFAB);  | 
        ||
| 179 |         //fStack->ConditionalRead(addr[i] + CAENV965_SR1,0x1);        // TRG wait : loop until bit 0 is on | 
        ||
| 180 |         // fStack->RepeatRead( CMD_A24, CMD_D32, addr[i] + CAENV965_OB,34,0);  // repead read | 
        ||
| 181 |         //fStack->ConditionalRead(addr[i] + CAENV965_OB ,0x4000000) ; // loop until bit 26 is on, read data  | 
        ||
| 182 | for (int j=0;j<36;j++) fStack->ReadA24D32(addr[0] + CAENV965_OB);  | 
        ||
| 183 | for (int j=0;j<36;j++) fStack->ReadA24D32(addr[1] + CAENV965_OB);  | 
        ||
| 184 | for (int j=0;j<8;j++) fStack->ReadA24D32(addr[2] + CAENV965_OB);// 4 channels connected  | 
        ||
| 185 | fStack->Marker(0xFAFB);  | 
        ||
| 186 | |||
| 187 | for (int i=0;i<nadc;i++){  | 
        ||
| 188 | fStack->WriteA24D16(addr[i] + CAENV965_BS2,0x4); // clear module  | 
        ||
| 189 | fStack->WriteA24D16(addr[i] + CAENV965_BC2,0x4);  | 
        ||
| 190 |         } | 
        ||
| 191 | |||
| 192 |         //fStack->Print(); | 
        ||
| 193 | |||
| 194 | VME_LED_settings(udev, 0,0,0,0); // Set Yellow LED to light with with USB out buffer not empty  | 
        ||
| 195 | VME_LED_settings(udev, 1,1,0,0); // Set Red LED to light with NIM1  | 
        ||
| 196 | VME_LED_settings(udev,2,0,0,0); // Set Green LED to light when stack is not empty  | 
        ||
| 197 | |||
| 198 |  Uint32_t  vmereg; | 
        ||
| 199 | VME_register_read(udev,0x00,&vmereg);  | 
        ||
| 200 | printf("VMUSB Firmware ID -> 0x%08X\n",vmereg);  | 
        ||
| 201 | |||
| 202 | VME_register_read(udev,0x04,&vmereg);  | 
        ||
| 203 | printf("VMUSB Global Mode -> 0x%08X\n",vmereg);  | 
        ||
| 204 | |||
| 205 | vmereg=(vmereg&0xF000)|0x0004;  | 
        ||
| 206 | VME_register_write(udev,0x04,vmereg);  | 
        ||
| 207 | VME_register_write(udev,0x08,0x00000080);  | 
        ||
| 208 | VME_register_write(udev,0x28,0x0);  | 
        ||
| 209 | VME_register_write(udev,0x2C,0x0);  | 
        ||
| 210 | VME_register_write(udev,0x30,0x0);  | 
        ||
| 211 | VME_register_write(udev,0x34,0x0);  | 
        ||
| 212 | VME_register_write(udev,0x3C,0x000);  | 
        ||
| 213 | |||
| 214 | int nb = fInit->Get(10000,stackdata);  | 
        ||
| 215 | int ret= xxusb_stack_execute(udev,(Uint32_t *)stackdata);  | 
        ||
| 216 | printf("Init::%d ret=%d\n",nb,ret);  | 
        ||
| 217 | if (ret>0) for (int i=0;i<ret/2;i++) printf ("stackdata=0x%08X\n",stackdata[i]);  | 
        ||
| 218 | |||
| 219 | int nb0= fStack->Get(10000,&stackwrite[0]);  | 
        ||
| 220 | if (nb0>768) {  | 
        ||
| 221 | fprintf(stderr,"nb0=%d > 768 error xxusb_stack_write\n", nb0);  | 
        ||
| 222 | exit(-1);  | 
        ||
| 223 |  } | 
        ||
| 224 | nb =xxusb_stack_write(udev,0x2,(Uint32_t *) stackwrite);  | 
        ||
| 225 | nb0=xxusb_stack_read(udev,0x2,(Uint32_t *) stackdata);  | 
        ||
| 226 | for (int i=0;i<stackwrite[0]+1;i++){  | 
        ||
| 227 | if (stackdata[i]!=stackwrite[i]) printf("%d %d init err %x %x\n",nb,nb0,stackwrite[i], stackdata[i]);  | 
        ||
| 228 |  } | 
        ||
| 229 | |||
| 230 | if (fMode==2) xxusb_register_write(udev,1,0x1); // Start DAQ mode  | 
        ||
| 231 | |||
| 232 | printf("daq::init() \n");  | 
        ||
| 233 | return 0;  | 
        ||
| 234 | } | 
        ||
| 235 | |||
| 236 | int daq::connect(){  | 
        ||
| 237 | VME_START(NULL);  | 
        ||
| 238 | printf("daq::connect()\n");  | 
        ||
| 239 | return 0;  | 
        ||
| 240 | } | 
        ||
| 241 | |||
| 242 | int daq::disconnect(){  | 
        ||
| 243 |   /* zakljuci */ | 
        ||
| 244 | VME_STOP();  | 
        ||
| 245 | printf("daq::disconnect()\n");  | 
        ||
| 246 | return 0;  | 
        ||
| 247 | } | 
        ||
| 248 | |||
| 249 | int daq:: clear(){  | 
        ||
| 250 | return 0;  | 
        ||
| 251 | } | 
        ||
| 252 | |||
| 253 | inline int module_header(int recid,Uint32_t *data,int len){  | 
        ||
| 254 | data[0] = recid;  | 
        ||
| 255 | data[1] = (len >0)? len : 0 ;  | 
        ||
| 256 | return data[1]+2;  | 
        ||
| 257 | } | 
        ||
| 258 | |||
| 259 | |||
| 260 | int daq::event(unsigned int *data, int maxn, int *ctr, int print){  | 
        ||
| 261 | int tout=200; /* 1/100 of a second */  | 
        ||
| 262 | const int lsize=sizeof(unsigned Uint32_t);  | 
        ||
| 263 | |||
| 264 | |||
| 265 | ctr[0]++;  | 
        ||
| 266 | ctr[1]++;  | 
        ||
| 267 | |||
| 268 | int count=0;  | 
        ||
| 269 | |||
| 270 | switch (fMode){  | 
        ||
| 271 | case 0:// normal calls  | 
        ||
| 272 |                  { | 
        ||
| 273 | unsigned short clr= 0x4;  | 
        ||
| 274 | unsigned int status=0;  | 
        ||
| 275 |                          Uint32_t mdata; | 
        ||
| 276 | |||
| 277 | for (int i=0;i<2;i++){  | 
        ||
| 278 |                                  // wait for trg | 
        ||
| 279 | tmlnk (tout);  | 
        ||
| 280 | do VME_A24D16_R( addr[i] + CAENV965_SR1, &status); while ( (status&0x1)==0 && timer_out==0 );  | 
        ||
| 281 | tmulk();  | 
        ||
| 282 |                                  // readout data | 
        ||
| 283 | if (timer_out) return 0;  | 
        ||
| 284 | int len=0;  | 
        ||
| 285 | |||
| 286 | do {  | 
        ||
| 287 | VME_A24D32_R(addr[i] + CAENV965_OB, &mdata);  | 
        ||
| 288 | mdata=data[count++];  | 
        ||
| 289 |                                          len++; | 
        ||
| 290 | } while ( (mdata & 0x4000000)==0 && timer_out==0) ; // bit 26 EOB or not valid datum  | 
        ||
| 291 |                                  // clear | 
        ||
| 292 | VME_A24D16_W( addr[i] + CAENV965_BS2, &clr);  | 
        ||
| 293 | VME_A24D16_W( addr[i] + CAENV965_BC2, &clr);  | 
        ||
| 294 | |||
| 295 | if (count+2<maxn) {  | 
        ||
| 296 | if (print) printf("V965 %3d\n",len);  | 
        ||
| 297 | count+=module_header(0x130+i,&data[count],len);  | 
        ||
| 298 | ctr[2]++;  | 
        ||
| 299 | ctr[3]+=len;  | 
        ||
| 300 |                                  } | 
        ||
| 301 | |||
| 302 | timer_out=0;  | 
        ||
| 303 |                          } | 
        ||
| 304 |                  } | 
        ||
| 305 | break;  | 
        ||
| 306 | case 1:// stack execute  | 
        ||
| 307 |                  { | 
        ||
| 308 | fStack->Get(10000,(int *)data);  | 
        ||
| 309 | int ret=xxusb_stack_execute(udev,(Uint32_t *) data); //The first element of the array is the number of bytes.  | 
        ||
| 310 | if (ret< 0 ) {  | 
        ||
| 311 | printf ("xxusb_stack_execute error err=%d\n",ret); \  | 
        ||
| 312 | count = 0;  | 
        ||
| 313 | } else count= ret/lsize;  | 
        ||
| 314 | |||
| 315 |                  } | 
        ||
| 316 | break;  | 
        ||
| 317 | case 2:// stack load  | 
        ||
| 318 |                  { | 
        ||
| 319 | int ret=xxusb_usbfifo_read(udev,(int *) data,BUFF_L,100);  | 
        ||
| 320 | if (ret< 0 ) {  | 
        ||
| 321 | if (ret!=-110) {  | 
        ||
| 322 | printf ("xxusb_usbfifo_read error err=%d\n",ret);  | 
        ||
| 323 | end();  | 
        ||
| 324 | init();  | 
        ||
| 325 |                                  }      | 
        ||
| 326 | count = 0;  | 
        ||
| 327 | } else {  | 
        ||
| 328 | if (0 && print && ret>0) {  | 
        ||
| 329 | for (int i=0;i<100;i++) {  | 
        ||
| 330 | printf ("%4d fifodata=0x%08X\n",i, data[i]);  | 
        ||
| 331 | if (data[i]==0xFAFB) break;  | 
        ||
| 332 |                                          } | 
        ||
| 333 |                                          /* | 
        ||
| 334 | |||
| 335 | |||
| 336 |    1 fifodata=0x00000049 | 
        ||
| 337 |    2 fifodata=0x0000FFAB | 
        ||
| 338 |    3 fifodata=0x00002000 | 
        ||
| 339 |    4 fifodata=0x00000200 | 
        ||
| 340 |    5 fifodata=0x00004141 | 
        ||
| 341 |    6 fifodata=0x00000000 | 
        ||
| 342 |    7 fifodata=0x00004057 | 
        ||
| 343 |    8 fifodata=0x00000010 | 
        ||
| 344 |    9 fifodata=0x00004052 | 
        ||
| 345 |   10 fifodata=0x00000001 | 
        ||
| 346 |   11 fifodata=0x0000405C | 
        ||
| 347 |   12 fifodata=0x00000011 | 
        ||
| 348 |   13 fifodata=0x0000405D | 
        ||
| 349 |   14 fifodata=0x00000002 | 
        ||
| 350 |   15 fifodata=0x0000405E | 
        ||
| 351 |   16 fifodata=0x00000012 | 
        ||
| 352 |   17 fifodata=0x0000401C | 
        ||
| 353 |   18 fifodata=0x00000003 | 
        ||
| 354 |   19 fifodata=0x0000402F | 
        ||
| 355 |   20 fifodata=0x00000013 | 
        ||
| 356 |   21 fifodata=0x00004024 | 
        ||
| 357 |   22 fifodata=0x00000004 | 
        ||
| 358 |   23 fifodata=0x00004076 | 
        ||
| 359 |   24 fifodata=0x00000014 | 
        ||
| 360 |   25 fifodata=0x0000412F | 
        ||
| 361 |   26 fifodata=0x00000005 | 
        ||
| 362 |   27 fifodata=0x0000404C | 
        ||
| 363 |   28 fifodata=0x00000015 | 
        ||
| 364 |   29 fifodata=0x00004132 | 
        ||
| 365 |   30 fifodata=0x00000006 | 
        ||
| 366 |   31 fifodata=0x00004044 | 
        ||
| 367 |   32 fifodata=0x00000016 | 
        ||
| 368 |   33 fifodata=0x0000404A | 
        ||
| 369 |   34 fifodata=0x00000007 | 
        ||
| 370 |   35 fifodata=0x0000409B | 
        ||
| 371 |   36 fifodata=0x00000017 | 
        ||
| 372 |   37 fifodata=0x000040F1 | 
        ||
| 373 |   38 fifodata=0x00000008 | 
        ||
| 374 |   39 fifodata=0x00004087 | 
        ||
| 375 |   40 fifodata=0x00000018 | 
        ||
| 376 |   41 fifodata=0x00004173 | 
        ||
| 377 |   42 fifodata=0x00000009 | 
        ||
| 378 |   43 fifodata=0x0000404C | 
        ||
| 379 |   44 fifodata=0x00000019 | 
        ||
| 380 |   45 fifodata=0x0000406C | 
        ||
| 381 |   46 fifodata=0x0000000A | 
        ||
| 382 |   47 fifodata=0x00004070 | 
        ||
| 383 |   48 fifodata=0x0000001A | 
        ||
| 384 |   49 fifodata=0x0000406E | 
        ||
| 385 |   50 fifodata=0x0000000B | 
        ||
| 386 |   51 fifodata=0x00004014 | 
        ||
| 387 |   52 fifodata=0x0000001B | 
        ||
| 388 |   53 fifodata=0x000040B7 | 
        ||
| 389 |   54 fifodata=0x0000000C | 
        ||
| 390 |   55 fifodata=0x000040A9 | 
        ||
| 391 |   56 fifodata=0x0000001C | 
        ||
| 392 |   57 fifodata=0x00004048 | 
        ||
| 393 |   58 fifodata=0x0000000D | 
        ||
| 394 |   59 fifodata=0x00004118 | 
        ||
| 395 |   60 fifodata=0x0000001D | 
        ||
| 396 |   61 fifodata=0x0000409D | 
        ||
| 397 |   62 fifodata=0x0000000E | 
        ||
| 398 |   63 fifodata=0x0000405B | 
        ||
| 399 |   64 fifodata=0x0000001E | 
        ||
| 400 |   65 fifodata=0x00004285 | 
        ||
| 401 |   66 fifodata=0x0000000F | 
        ||
| 402 |   67 fifodata=0x00004159 | 
        ||
| 403 |   68 fifodata=0x0000001F | 
        ||
| 404 |   69 fifodata=0x00000035 | 
        ||
| 405 |   70 fifodata=0x00000400 | 
        ||
| 406 |   71 fifodata=0x00000035 | 
        ||
| 407 |   72 fifodata=0x00000600 | 
        ||
| 408 |   73 fifodata=0x00000035 | 
        ||
| 409 |   74 fifodata=0x0000FAFB | 
        ||
| 410 | |||
| 411 | |||
| 412 |                                          */ | 
        ||
| 413 |                                  } | 
        ||
| 414 | if (print) printf("------------------ret=%d data[0]=%d\n",ret,(int)data[0]);  | 
        ||
| 415 | count= ret/lsize;  | 
        ||
| 416 | ctr[2]+=data[0];  | 
        ||
| 417 | ctr[3]+=count;  | 
        ||
| 418 |                          } | 
        ||
| 419 |                  } | 
        ||
| 420 | break;  | 
        ||
| 421 |          } | 
        ||
| 422 | return count*lsize;  | 
        ||
| 423 | } | 
        ||
| 424 | |||
| 425 | int daq::end(){  | 
        ||
| 426 | |||
| 427 | xxusb_register_write(udev,1,0x0); // Stop DAQ mode  | 
        ||
| 428 | while (xxusb_usbfifo_read(udev,(int *) stackdata,BUFF_L,30)>0);  | 
        ||
| 429 | printf("daq::end()\n");  | 
        ||
| 430 | return 0;  | 
        ||
| 431 | } | 
        ||
| 432 | |||
| 433 | daq::daq(){  | 
        ||
| 434 | fMode = 2;  | 
        ||
| 435 | fPedestal=255;  | 
        ||
| 436 | for (int i=0;i<128;i++){  | 
        ||
| 437 | if (i<72) fThreshold.push_back(0);  | 
        ||
| 438 | else fThreshold.push_back(0x1<<8); // samo 4 kanali na zadnjem modulu so enablani  | 
        ||
| 439 |   } | 
        ||
| 440 | fThresholdEnable=0;  | 
        ||
| 441 | fStop=0;  | 
        ||
| 442 | fInit=NULL;  | 
        ||
| 443 | fStack=NULL;  | 
        ||
| 444 | connect();  | 
        ||
| 445 | } | 
        ||
| 446 | |||
| 447 | daq::~daq(){  | 
        ||
| 448 | disconnect();  | 
        ||
| 449 | } | 
        ||
| 450 | |||
| 451 | #ifdef MAIN | 
        ||
| 452 | /* ------------------- CatchSig ----------------- */ | 
        ||
| 453 | int ctrlcflag=0;  | 
        ||
| 454 | |||
| 455 | void SigInt (int sig)  | 
        ||
| 456 | { | 
        ||
| 457 | ctrlcflag = 1;  | 
        ||
| 458 | timer_out=1;  | 
        ||
| 459 | } | 
        ||
| 460 | |||
| 461 | int main (int argc, char **argv){  | 
        ||
| 462 |    // intercept routine | 
        ||
| 463 | if (signal (SIGINT, SigInt) == SIG_ERR) {  | 
        ||
| 464 | perror ("sigignore");  | 
        ||
| 465 |    } | 
        ||
| 466 | |||
| 467 |    // print welcome message | 
        ||
| 468 | time_t t,told, tstart, tstop;  | 
        ||
| 469 | time(&t);  | 
        ||
| 470 | fprintf(stdout,"#############################################\n");  | 
        ||
| 471 | fprintf(stdout,"Program %s version %2.1f\n",argv[0], VERSION);  | 
        ||
| 472 | fprintf(stdout,"Compiled on %s %s\n",__DATE__, __TIME__);  | 
        ||
| 473 | fprintf(stdout,"Runtime %s \n",ctime(&t));  | 
        ||
| 474 | fprintf(stdout,"#############################################\n");  | 
        ||
| 475 | |||
| 476 | |||
| 477 | int neve=-1;  | 
        ||
| 478 | char cfname[100]="test.dat";  | 
        ||
| 479 | char *fname=cfname;  | 
        ||
| 480 | char *fpedname=NULL;  | 
        ||
| 481 | |||
| 482 | #define BSIZE 10000 | 
        ||
| 483 | Uint32_t data[10000];  | 
        ||
| 484 | |||
| 485 | |||
| 486 | daq *d= new daq();  | 
        ||
| 487 | int c;  | 
        ||
| 488 | |||
| 489 | while ((c = getopt (argc, argv, "p:n:t:o:")) != -1)  | 
        ||
| 490 | switch (c)  | 
        ||
| 491 |       { | 
        ||
| 492 | case 'o':  | 
        ||
| 493 | sprintf(fname ,"%s", optarg);  | 
        ||
| 494 | if (fexist(fname)==1){  | 
        ||
| 495 | fprintf(stdout,"Error !\n");  | 
        ||
| 496 | fprintf(stdout,"File %s already exist. Appending ....\n",fname);  | 
        ||
| 497 |           //fprintf(stdout,"Remove the file and restart !!!\n"); | 
        ||
| 498 |           //exit(0); | 
        ||
| 499 |         } | 
        ||
| 500 | break; // input file  | 
        ||
| 501 | case 'n':  | 
        ||
| 502 | neve = atoi(optarg); // negative argument time ( in s )limited event loop  | 
        ||
| 503 | break;  | 
        ||
| 504 | case 't':  | 
        ||
| 505 |         { | 
        ||
| 506 | |||
| 507 | sprintf(fpedname ,"%s", optarg);  | 
        ||
| 508 | FILE *fped=fopen(fpedname,"r");  | 
        ||
| 509 | int j=0;  | 
        ||
| 510 | int ndim=400;  | 
        ||
| 511 | char line[ndim];  | 
        ||
| 512 | int val=0;  | 
        ||
| 513 | while (fgets(line,ndim,fped)!=NULL){  | 
        ||
| 514 | sscanf(line,"%d",&val);  | 
        ||
| 515 | d->fThreshold[j++]=val;  | 
        ||
| 516 |           } | 
        ||
| 517 | d->fThresholdEnable=1;  | 
        ||
| 518 |           //fclose(fped); | 
        ||
| 519 | fclose(fped);  | 
        ||
| 520 | break;  | 
        ||
| 521 |         } | 
        ||
| 522 | case 'p':  | 
        ||
| 523 | gPedestal = atoi(optarg); // injected charge to the qdc  | 
        ||
| 524 | break;  | 
        ||
| 525 |       } | 
        ||
| 526 | |||
| 527 | if (argc==1) {  | 
        ||
| 528 | fprintf(stdout,"Usage: %s -o [filename] -n [number of events] -t [thresholdfile] -p <qdc inject charge>\n negative number of events = acq time in seconds\n",argv[0]);  | 
        ||
| 529 | exit(-1);  | 
        ||
| 530 |   } | 
        ||
| 531 |   //FILE *fp=fopen(fname,"a"); | 
        ||
| 532 | gzFile fp=gzopen(fname,"a");  | 
        ||
| 533 | |||
| 534 | d->init();  | 
        ||
| 535 | d->clear();  | 
        ||
| 536 | |||
| 537 | int hdr[4]={2}; // recid od run 11 naprej  | 
        ||
| 538 | int i=0;  | 
        ||
| 539 | int ntotal=0;  | 
        ||
| 540 | int counters[30]={0,0,0,0,0, 0,0,0,0,0,0,0};  | 
        ||
| 541 | char names[10][20]={"TRG","CAEN V965"};  | 
        ||
| 542 | time(&t);  | 
        ||
| 543 | tstart=t;  | 
        ||
| 544 | tstop=tstart+360000;  | 
        ||
| 545 | if (neve<-1) {  | 
        ||
| 546 | tstop=tstart-neve;  | 
        ||
| 547 | neve=-1;  | 
        ||
| 548 |   } | 
        ||
| 549 | for (i=0;i!=neve && !ctrlcflag && t<tstop;i++){  | 
        ||
| 550 | time(&t);  | 
        ||
| 551 | if (t!=told ) printf("%d in %2.2f min daq::event() %s\n",i, (double)(t-tstart)/60., ctime(&t));  | 
        ||
| 552 | int nb=d->event(data,BSIZE, counters,t!=told);  | 
        ||
| 553 | if (nb>0){  | 
        ||
| 554 |       // zapis v datoteko    | 
        ||
| 555 | hdr[1]=nb+4*sizeof(int);  | 
        ||
| 556 | hdr[2]=time(NULL);  | 
        ||
| 557 | hdr[3]=i;  | 
        ||
| 558 | |||
| 559 |       //fwrite(hdr,   sizeof(int),4 , fp);  | 
        ||
| 560 | gzwrite(fp, hdr, sizeof(int)*4); //gzip  | 
        ||
| 561 |      // recid=1 do runa 10.  ntotal += fwrite(data,   sizeof(int),nb, fp); | 
        ||
| 562 |       //ntotal += fwrite(data, 1,nb, fp); | 
        ||
| 563 | ntotal += gzwrite(fp, data, nb);  | 
        ||
| 564 | told=t;  | 
        ||
| 565 | } else i--;  | 
        ||
| 566 |   } | 
        ||
| 567 | |||
| 568 | d->end();  | 
        ||
| 569 |   delete d; | 
        ||
| 570 | printf("Number of Events: %d\n",i);  | 
        ||
| 571 | if (ctrlcflag) printf("User Program termination CTRL-C\n");  | 
        ||
| 572 | if (t>tstop ) printf("Timeout termination tstart# t>tstop: %d# %d >%d\n",(int)t, (int)tstart, (int) tstop);  | 
        ||
| 573 | |||
| 574 | |||
| 575 |   //fclose(fp);   | 
        ||
| 576 | gzclose(fp);  | 
        ||
| 577 | fprintf(stdout,"%d bytes written to %s\nCounts:\n", (int) (ntotal*sizeof(int)),fname);  | 
        ||
| 578 | for (i=0;i<2;i++) fprintf(stdout,"%s\t%d\t%d\n",names[i],counters[2*i],counters[2*i+1]) ;  | 
        ||
| 579 | |||
| 580 | |||
| 581 | return 0;  | 
        ||
| 582 | } | 
        ||
| 583 | #endif |