Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 326 | f9daq | 1 | #include <stdlib.h> |
| 2 | #include <stdio.h> |
||
| 3 | #include <stdint.h> |
||
| 4 | #include <string.h> |
||
| 5 | #include <unistd.h> |
||
| 6 | #include <ctype.h> |
||
| 7 | #include <zlib.h> |
||
| 8 | #include <vector> |
||
| 9 | #include <sys/time.h> |
||
| 10 | #include <sys/stat.h> |
||
| 11 | #include <signal.h> |
||
| 12 | #include <string> |
||
| 13 | #include "vme.h" |
||
| 14 | #include "dataio.h" |
||
| 15 | #include "SA02_DEF.h" |
||
| 16 | #include "sa02lib.h" |
||
| 17 | #include "H2D.h" |
||
| 18 | |||
| 19 | #define TRUE 1 |
||
| 20 | #define FALSE 0 |
||
| 21 | #define TIMEOUT 3 |
||
| 22 | |||
| 23 | |||
| 24 | RUNINFO runinfo; |
||
| 25 | EVTREC evtrec; |
||
| 26 | |||
| 27 | //const int mux_map[4]={ 1,3,0,2}; |
||
| 28 | const int mux_map[4]= { 2,0,3,1}; |
||
| 29 | |||
| 30 | int verbose=0; |
||
| 31 | int timer_out; |
||
| 32 | struct sigaction oact; |
||
| 33 | int bltreadout=0; |
||
| 34 | int ctrl_c=0; |
||
| 35 | |||
| 36 | void SigInt (int sig) { |
||
| 37 | ctrl_c = 1; |
||
| 38 | timer_out=TRUE; |
||
| 39 | sa02TimerOut = TRUE; |
||
| 40 | } |
||
| 41 | |||
| 42 | void sa02Timerast (int signumber) { |
||
| 43 | timer_out = TRUE; |
||
| 44 | sa02TimerOut = TRUE; |
||
| 45 | sa02Printf("->>> TIMEOUT !!!\n"); |
||
| 46 | } |
||
| 47 | |||
| 48 | void tmlnk (int tout) { |
||
| 49 | timer_out = FALSE; |
||
| 50 | struct sigaction act; |
||
| 51 | struct itimerval tdelay; |
||
| 52 | |||
| 53 | act.sa_handler = sa02Timerast; |
||
| 54 | sigemptyset (&act.sa_mask); |
||
| 55 | act.sa_flags = 0; |
||
| 56 | tdelay.it_value.tv_sec = tout / 100; |
||
| 57 | tdelay.it_value.tv_usec = 10000 * (tout % 100); |
||
| 58 | tdelay.it_interval.tv_sec = 0; |
||
| 59 | tdelay.it_interval.tv_usec = 0; |
||
| 60 | if (sigaction (SIGALRM, &act, &oact) < 0) { |
||
| 61 | perror ("sigaction(tmlnk)"); |
||
| 62 | exit (EXIT_FAILURE); |
||
| 63 | } |
||
| 64 | if (setitimer (ITIMER_REAL, &tdelay, NULL) < 0) { |
||
| 65 | perror ("setitimer(tmlnk)"); |
||
| 66 | exit (EXIT_FAILURE); |
||
| 67 | } |
||
| 68 | } |
||
| 69 | |||
| 70 | void tmulk () { |
||
| 71 | struct itimerval tdelay; |
||
| 72 | |||
| 73 | tdelay.it_value.tv_sec = 0; |
||
| 74 | tdelay.it_value.tv_usec = 0; |
||
| 75 | tdelay.it_interval.tv_sec = 0; |
||
| 76 | tdelay.it_interval.tv_usec = 0; |
||
| 77 | if (setitimer (ITIMER_REAL, &tdelay, NULL) < 0) { |
||
| 78 | perror ("setitimer(tmulk)"); |
||
| 79 | exit (EXIT_FAILURE); |
||
| 80 | } |
||
| 81 | if (sigaction (SIGALRM, &oact, NULL) < 0) { |
||
| 82 | perror ("sigaction(tmulk)"); |
||
| 83 | exit (EXIT_FAILURE); |
||
| 84 | } |
||
| 85 | } |
||
| 86 | |||
| 87 | void sa02Tmlnk (int tout) { |
||
| 88 | sa02TimerOut = FALSE; |
||
| 89 | tmlnk (tout); |
||
| 90 | // ResetTimer (p1h, P1_DAQ_TIMEOUT); |
||
| 91 | } |
||
| 92 | |||
| 93 | void sa02Tmulk () { |
||
| 94 | tmulk(); |
||
| 95 | } |
||
| 96 | |||
| 97 | int help() { |
||
| 98 | printf ("*********************************************************************************:\n"); |
||
| 99 | printf ("Usage: Performs single/multiple read or write access to SA02 via Belle PTS multipurpose IO board:\n\n"); |
||
| 100 | printf ("Arguments: \n"); |
||
| 101 | printf ("-i input parameter filename // can be specified multiple times \n"); |
||
| 102 | printf ("-v verbosity \n"); |
||
| 103 | printf ("-g bltreadout \n"); |
||
| 104 | printf ("-o output filename \n"); |
||
| 105 | printf ("-f output filename - append data to file\n"); |
||
| 106 | printf ("-w write command (FE TP DLY0 MUX MUXASIC VTH0 VTH1 TPLVL0 TPLVL1 GREG CREG CMON TMON0 TMON1 DMON) \n"); |
||
| 107 | printf ("-a vme base address 0x32100000 \n"); |
||
| 108 | printf ("-c asic chip number (0..3) \n"); |
||
| 109 | printf ("-x asic channel number (0..36) \n"); |
||
| 110 | printf ("-t sleep time bewteen events (sec) \n"); |
||
| 111 | printf ("-d data\n"); |
||
| 112 | printf ("-b dataoff - scan over the asic channels instead of the parameter, data step is the channel step, chip and channel are initial chip and channel. Should apper after -p or-w\n"); |
||
| 113 | printf ("-s data step or in case of -b the channel step \n"); |
||
| 114 | printf ("-r number of readouts for each event\n"); |
||
| 115 | printf ("-n number of events\n"); |
||
| 116 | printf ("-h <command> at each event execute external command after readouts are done"); |
||
| 117 | printf ("-q set status register bit TPENB of the CAEN1495 IO before event loop\n"); |
||
| 118 | printf ("-e send software trigger before reading the data\n"); |
||
| 119 | printf ("-p asicparameter ( PHASECMPS GAIN SHAPINGTIME COMPARATOR VRDRIVE MONITOR ID)\n"); |
||
| 120 | printf ("-p asicparameter ( DECAYTIME OFFSET FINEADJ_UNIPOL FINEADJ_DIFF TPENB KILL)\n\n"); |
||
| 121 | printf ("-u value ... send test SEU software trigger \n"); |
||
| 122 | printf ("-z value ... finish the execution of the program in <value> s \n"); |
||
| 123 | printf ("-m fixeddata : test fixed data, if error occurs, abort \n"); |
||
| 124 | printf ("-l board number \n"); |
||
| 125 | printf ("*********************************************************************************:\n"); |
||
| 126 | printf ("Examples:\n\n"); |
||
| 127 | printf ("Threshold scan:\n"); |
||
| 128 | printf ("100 events TMON0 reading and 10 readings of the data for each event:\n"); |
||
| 129 | printf ("./sa02_ctrl -a 0x32100000 -w TMON0 -n 100 -r 10 -t 10000 -v 1\n\n"); |
||
| 130 | printf ("scan 9 points TPLVL0 inital data 111 stepsize 11, send 1 test pulse, read data :\n"); |
||
| 131 | printf ("./sa02_ctrl -a 0x32100000 -w TPLVL0 -d 111 -s 11 -n 9 -e 1 -r 1 -v 1\n\n"); |
||
| 132 | printf ("Initialize the board from input.param, Read 10000 events of data. the result is saved in the output.dat\n"); |
||
| 133 | printf ("./sa02_ctrl -a 0x32100000 -i input.param -n 10000 -r 1 -o output.dat \n\n"); |
||
| 134 | printf ("Initialize the board from input.param, Read 10000 events of data. scan TPENB from 0 to 144 channels, send test pulse before the data acquisition,\n "); |
||
| 135 | printf ("set TPENB to b after the acquisition, the result is saved in the output.dat\n"); |
||
| 136 | printf ("./sa02_ctrl -a 0x32100000 -i input.param -p TPENB -d 1 -b 0 -s 1 -n 144 -c 0 -x 0 -e 1 -r 10000 -o output.dat \n\n"); |
||
| 137 | return 0; |
||
| 138 | } |
||
| 139 | |||
| 140 | int module_header(int recid,uint32_t *data,int len) { |
||
| 141 | data[0] = recid; |
||
| 142 | data[1] = (len >0)? len : 0 ; |
||
| 143 | return data[1]+2; |
||
| 144 | } |
||
| 145 | |||
| 146 | //------------------------------------------------------------------------- |
||
| 147 | int PrintData(uint32_t *rdata, int count) { |
||
| 148 | for (int j=0; j<count; j++) { |
||
| 149 | uint32_t recid = rdata[j++]; |
||
| 150 | uint32_t len = rdata[j++]; |
||
| 151 | printf(" recid=0x%0x len=%d pos=%d(maxpos %d) val=",recid, len, j, count); |
||
| 152 | if (len>2) printf("\n"); |
||
| 153 | for (uint32_t i=0; i<len; i++) { |
||
| 154 | if (j< count) printf("0x%0x\t", rdata[j]); |
||
| 155 | if (i%4==3) printf("\n"); |
||
| 156 | j++; |
||
| 157 | } |
||
| 158 | printf("\n"); |
||
| 159 | if (len) j--; |
||
| 160 | } |
||
| 161 | return 0; |
||
| 162 | } |
||
| 163 | |||
| 164 | //------------------------------------------------------------------------- |
||
| 165 | int main( int argc , char ** argv) { |
||
| 166 | // intercept routine |
||
| 167 | if (signal (SIGINT, SigInt) == SIG_ERR) { |
||
| 168 | perror ("sigignore"); |
||
| 169 | } |
||
| 170 | |||
| 171 | uint32_t fixeddata =0; |
||
| 172 | int testfixeddata =0; |
||
| 173 | uint32_t data =0; |
||
| 174 | uint32_t dataoff =0; |
||
| 175 | uint32_t address =0; |
||
| 176 | uint32_t cmd =0; |
||
| 177 | uint32_t chip =0; |
||
| 178 | uint32_t asicpar =0; |
||
| 179 | uint32_t asicshft=0; |
||
| 180 | uint32_t dstep =0; |
||
| 181 | uint32_t sendswtrg =0; |
||
| 182 | uint32_t tpenb =0; |
||
| 183 | uint32_t sendseutrg =0; |
||
| 184 | |||
| 185 | int aborttimeout =0; |
||
| 186 | int append =0; |
||
| 187 | int remap =0; |
||
| 188 | int dt0 =0; |
||
| 189 | int neve =0; |
||
| 190 | int towrite =0; |
||
| 191 | int toread =0; |
||
| 192 | int ch =0; |
||
| 193 | int output =0; |
||
| 194 | int externalcmd =0; |
||
| 195 | int getstatus =0; |
||
| 196 | int writeevent =1; |
||
| 197 | int c; |
||
| 198 | |||
| 199 | char filename[0xFF]=""; |
||
| 200 | char externalcommand[0xFF]=""; |
||
| 201 | int sa02BoardMask = 0xF; |
||
| 202 | opterr = 0; |
||
| 203 | std::vector<std::pair<std::string,uint32_t> > inputfiles; |
||
| 204 | while ((c = getopt (argc, argv, "a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:p:q:r:s:t:u:v:z:x:w:y:")) != -1) |
||
| 205 | switch (c) { |
||
| 206 | case 'i': |
||
| 207 | inputfiles.push_back(make_pair(std::string(optarg), sa02BoardMask)); |
||
| 208 | break; // input file |
||
| 209 | case 'f': |
||
| 210 | append=1; // append the data to the file filename |
||
| 211 | case 'o': |
||
| 212 | sprintf(filename,"%s", optarg ); |
||
| 213 | break; // output |
||
| 214 | case 'z': |
||
| 215 | aborttimeout=atoi (optarg); // abort timeout in s |
||
| 216 | break; |
||
| 217 | case 'h': |
||
| 218 | sprintf(externalcommand,"%s", optarg ); |
||
| 219 | externalcmd=1; |
||
| 220 | break; // output |
||
| 221 | case 'm': |
||
| 222 | fixeddata = strtoul (optarg,NULL,0); |
||
| 223 | testfixeddata=1; |
||
| 224 | break; // address |
||
| 225 | case 'a': |
||
| 226 | address = strtoul (optarg,NULL,0); |
||
| 227 | break; // address |
||
| 228 | case 'r': |
||
| 229 | toread = strtoul (optarg,NULL,0); |
||
| 230 | break; // number of readings per event |
||
| 231 | case 'v': |
||
| 232 | verbose = strtoul (optarg,NULL,0); |
||
| 233 | break; // verbosity |
||
| 234 | case 't': |
||
| 235 | dt0 = strtoul (optarg,NULL,0); |
||
| 236 | break; // sec sleep between events |
||
| 237 | case 's': |
||
| 238 | dstep = strtoul (optarg,NULL,0); |
||
| 239 | break; // step size in data or channel increase |
||
| 240 | case 'g': |
||
| 241 | bltreadout = strtoul (optarg,NULL,0); |
||
| 242 | break; // bltreadout |
||
| 243 | case 'l': |
||
| 244 | sa02BoardMask = strtoul (optarg,NULL,0); |
||
| 245 | if ( sa02BoardMask > 0xF) { |
||
| 246 | printf("Error! Board Mask 0..15 . Set to 0."); |
||
| 247 | sa02BoardMask = 0xF; |
||
| 248 | } |
||
| 249 | break; // board mask |
||
| 250 | case 'j': |
||
| 251 | sa02BoardType = strtoul (optarg,NULL,0); |
||
| 252 | if ( sa02BoardType > 3) { |
||
| 253 | printf("Error! Board type sa02 0 / sa03 1 / FEB1_0 2 / FEB1_1 3 . Set to 3"); |
||
| 254 | sa02BoardType = 3; |
||
| 255 | } |
||
| 256 | break; // board number |
||
| 257 | case 'n': |
||
| 258 | neve = atoi (optarg); |
||
| 259 | break; // number of events or number of scan points |
||
| 260 | case 'e': |
||
| 261 | sendswtrg = strtoul (optarg,NULL,0); |
||
| 262 | break; // send sotware trigger before reading out the data |
||
| 263 | case 'u': |
||
| 264 | sendseutrg = strtoul (optarg,NULL,0); |
||
| 265 | break; // send software SEU trigger before reading out the data |
||
| 266 | case 'w': |
||
| 267 | towrite=1; |
||
| 268 | if (strcmp(optarg,"MUXASIC")==0) remap=1; |
||
| 269 | cmd =sa02GetCmdCode(optarg); |
||
| 270 | break; // write command |
||
| 271 | case 'p': |
||
| 272 | towrite=2; |
||
| 273 | cmd = sa02GetAsicCode(optarg, &asicpar, &asicshft); |
||
| 274 | break; // asic parameter |
||
| 275 | case 'b': |
||
| 276 | towrite=3; |
||
| 277 | dataoff = strtoul (optarg,NULL,0); |
||
| 278 | break; // scan channels instead of parameter; the value is the off value of the channel |
||
| 279 | case 'c': |
||
| 280 | chip = strtoul (optarg,NULL,0); |
||
| 281 | break; // chip number or initial channel number in the case of -b option |
||
| 282 | case 'x': |
||
| 283 | ch = strtoul (optarg,NULL,0); |
||
| 284 | break; // channel number or initial channel in the case of -b option |
||
| 285 | case 'd': |
||
| 286 | data = strtoul (optarg,NULL,0); |
||
| 287 | if (remap) { |
||
| 288 | data = mux_map[data]; |
||
| 289 | printf("MUX %d\n",data); |
||
| 290 | } |
||
| 291 | break; // data or initial data in the case of scan |
||
| 292 | case 'q': |
||
| 293 | tpenb = strtoul (optarg,NULL,0); |
||
| 294 | break; // set TPENB bit of the CAEN1495 IO |
||
| 295 | case 'y': |
||
| 296 | writeevent = strtoul (optarg,NULL,0); |
||
| 297 | break; // write event data |
||
| 298 | case 'k': |
||
| 299 | getstatus = strtoul (optarg,NULL,0); |
||
| 300 | break; // print board status |
||
| 301 | case '?': |
||
| 302 | if (optopt == 'c') |
||
| 303 | fprintf (stderr, "Option -%c requires an argument.\n", optopt); |
||
| 304 | else if (isprint (optopt)) |
||
| 305 | fprintf (stderr, "Unknown option `-%c'.\n", optopt); |
||
| 306 | else |
||
| 307 | fprintf (stderr, |
||
| 308 | "Unknown option character `\\x%x'.\n", |
||
| 309 | optopt); |
||
| 310 | return 1; |
||
| 311 | default: |
||
| 312 | abort (); |
||
| 313 | } |
||
| 314 | |||
| 315 | for (int i=optind; i<argc; i++) data = strtoul (argv[i],NULL,0); |
||
| 316 | |||
| 317 | if (argc <2) { |
||
| 318 | help(); |
||
| 319 | exit(-1); |
||
| 320 | } |
||
| 321 | |||
| 322 | // printf ("[neve=%d] a=0x%08x cmd= 0x%08x Data 0x%0x ",neve,address, cmd,data); |
||
| 323 | |||
| 324 | //VME_START(CAEN_V1718); |
||
| 325 | VME_START(ZYNQ_XILLINUX); |
||
| 326 | int daqmode =3; |
||
| 327 | int trglen = 1000; |
||
| 328 | Sa02DaqMode (daqmode); |
||
| 329 | Sa02SelectTriggerWithMaskAndLength (sendswtrg, sa02BoardMask , trglen); |
||
| 330 | |||
| 331 | for (unsigned int i=0; i<inputfiles.size(); i++) { |
||
| 332 | |||
| 333 | sa02LoadParametersFromFile(inputfiles[i].first.c_str(), inputfiles[i].second); |
||
| 334 | } |
||
| 335 | |||
| 336 | if (getstatus){ |
||
| 337 | char saddress[0xFF]; |
||
| 338 | double sdata[20]; |
||
| 339 | for (int board=0;board<4;board++){ |
||
| 340 | if (sa02BoardMask &(1<<board)) { |
||
| 341 | printf("sa02Status => board %d\n",board); |
||
| 342 | sa02Status(board, saddress,sdata); |
||
| 343 | } |
||
| 344 | } |
||
| 345 | } |
||
| 346 | if (sendseutrg) Sa02SEUTrigger(); |
||
| 347 | #define MAXSIZE 10000 |
||
| 348 | int maxsize = MAXSIZE; |
||
| 349 | uint32_t *rdata = new uint32_t[maxsize]; |
||
| 350 | FILE * fp=NULL; |
||
| 351 | // uint32_t hdr[10]; |
||
| 352 | int nbtotal=0; |
||
| 353 | if (strlen(filename)>0) { |
||
| 354 | if (verbose) printf("Data in the file:%s\n", filename); |
||
| 355 | if (append) fp=fopen(filename,"ab"); |
||
| 356 | else fp=fopen(filename,"wb"); |
||
| 357 | output=1; |
||
| 358 | // run header |
||
| 359 | runinfo.id= RUNINFO_ID; // run record ID |
||
| 360 | runinfo.len= sizeof(runinfo); |
||
| 361 | runinfo.cmd= cmd; |
||
| 362 | runinfo.x0 = data; |
||
| 363 | runinfo.dx = dstep; |
||
| 364 | runinfo.nx = neve; |
||
| 365 | runinfo.chip= chip; |
||
| 366 | runinfo.ch = ch; |
||
| 367 | runinfo.neve= toread; |
||
| 368 | runinfo.writemode= towrite; |
||
| 369 | sa02Printf("RUNINFO x0=%d nx=%d dx=%d\n", runinfo.x0,runinfo.dx,runinfo.nx); |
||
| 370 | nbtotal+=fwrite(&runinfo, 1,sizeof(runinfo),fp); //gzip |
||
| 371 | } else { |
||
| 372 | if (verbose) printf("Data are not written to the file!\n"); |
||
| 373 | } |
||
| 374 | |||
| 375 | // hdr[0]= 0x1; // event record ID |
||
| 376 | if (!neve & (towrite || toread) ) neve=1; |
||
| 377 | |||
| 378 | time_t t,told,tstart; |
||
| 379 | time(&t); |
||
| 380 | tstart=t; |
||
| 381 | int ncount=0; |
||
| 382 | int nerrors=0; |
||
| 383 | int readerror=0; |
||
| 384 | uint32_t response[2]= {0,0}; |
||
| 385 | |||
| 386 | Sa02TestPulseEnable(address, tpenb); |
||
| 387 | /////////////////////////////////////////////////////////////// |
||
| 388 | int h2=0; |
||
| 389 | if(neve>1) { |
||
| 390 | H2DInit(h2, "h2d","Sa02 Chip Scan", 144, 0,1,neve,data, dstep); |
||
| 391 | H2DSetTitleX(h2,"channel"); |
||
| 392 | H2DSetTitleY(h2,"Scan"); |
||
| 393 | } |
||
| 394 | for (int i=0; i<neve; i++) { |
||
| 395 | int nb = sizeof(uint32_t); |
||
| 396 | int count=0; |
||
| 397 | switch (towrite) { |
||
| 398 | case 1: { |
||
| 399 | rdata[count+2]= data; |
||
| 400 | rdata[count+3]= sa02Cmd(address,cmd, data, chip, ch , 2, response); |
||
| 401 | count+=module_header(cmd,&rdata[count],2 ); |
||
| 402 | break; |
||
| 403 | } |
||
| 404 | case 2: { |
||
| 405 | uint32_t datal = asicpar & (data << asicshft); |
||
| 406 | rdata[count+2] = data; |
||
| 407 | rdata[count+3] = sa02AsicWrite(address, cmd, datal, chip, ch, asicpar,asicshft); |
||
| 408 | count+=module_header(cmd ,&rdata[count],2); // recid cmd |
||
| 409 | break; |
||
| 410 | } |
||
| 411 | case 3: { |
||
| 412 | rdata[count+2] = chip*36+ch; |
||
| 413 | rdata[count+3] = sa02AsicWrite(address, cmd, data, chip, ch, asicpar,asicshft); // switch on the channel |
||
| 414 | count+=module_header(cmd ,&rdata[count],2); // recid cmd |
||
| 415 | break; |
||
| 416 | } |
||
| 417 | } |
||
| 418 | // const int dsize = ( FEB_DATA_STOP - FEB_DATA_START) / FEB_DATA_INC; |
||
| 419 | const int dsize = 144*4; |
||
| 420 | |||
| 421 | Sa02SetNeve(toread); |
||
| 422 | sa02Reset(); |
||
| 423 | |||
| 424 | for ( int j=0; j< toread; j++) { |
||
| 425 | int eventerror = 0; |
||
| 426 | if ((count+2+dsize) >= maxsize) { |
||
| 427 | int oldsize = maxsize; |
||
| 428 | maxsize*=2; |
||
| 429 | printf("Increasing data buffer to %d elements\n", maxsize); |
||
| 430 | uint32_t *tmpdata = rdata; |
||
| 431 | rdata = new uint32_t[maxsize]; |
||
| 432 | //memcpy(tmpdata,rdata, oldsize*sizeof(uint32_t)); |
||
| 433 | for (int ki=0; ki<oldsize; ki++) rdata[ki]=tmpdata[ki]; |
||
| 434 | delete tmpdata; |
||
| 435 | } |
||
| 436 | Sa02TestPulseEnable(address, tpenb); |
||
| 437 | if (sendswtrg) Sa02SoftwareTrigger(); |
||
| 438 | nb = sa02Read(sa02BoardMask, &rdata[count+2] ); |
||
| 439 | if (neve>1) { |
||
| 440 | for (int ich=0; ich<144*4; ich++){ |
||
| 441 | int xch = (143 - ich%144) + ich/144*144; |
||
| 442 | H2DFillBin(h2, xch,i,rdata[count+2+ich]); |
||
| 443 | } |
||
| 444 | } |
||
| 445 | if (testfixeddata && nb>0) { |
||
| 446 | int len = nb / sizeof(uint32_t); |
||
| 447 | for (int ir=0; ir<len; ir++) { |
||
| 448 | if ( rdata[count+2+ir]!=fixeddata ) { |
||
| 449 | time(&t); |
||
| 450 | printf("INSERT INTO fixederror VALUES ( '%d', '%d','%d','%d','0x%08x','0x%08x' ) \n", int(t), int(t-tstart), i*toread+j, ir, rdata[count+2+ir], fixeddata ); |
||
| 451 | eventerror++; |
||
| 452 | } |
||
| 453 | } |
||
| 454 | } |
||
| 455 | if (eventerror) { |
||
| 456 | readerror++; |
||
| 457 | if (readerror==3) { |
||
| 458 | ctrl_c = 1; |
||
| 459 | system("date >> firmware.lock"); |
||
| 460 | } |
||
| 461 | } else { |
||
| 462 | readerror= 0; |
||
| 463 | } |
||
| 464 | if (nb>=0) count+=module_header(0x3,&rdata[count],nb/sizeof(uint32_t)); // recid 0x3 |
||
| 465 | if (ctrl_c) break; |
||
| 466 | if (timer_out) j--; |
||
| 467 | time(&t); |
||
| 468 | if (t!=told ) printf("%d events in %2.2f min (%d s) TIMEOUTS=%d %s",ncount, (double)(t-tstart)/60.,int(t-tstart), nerrors, ctime(&t)); |
||
| 469 | if (aborttimeout && (t-tstart)>aborttimeout) { |
||
| 470 | printf("Abort timeout reached ....\n"); |
||
| 471 | ctrl_c=1; |
||
| 472 | break; |
||
| 473 | } |
||
| 474 | told=t; |
||
| 475 | if (nb<0) { |
||
| 476 | nerrors++; |
||
| 477 | j--; |
||
| 478 | } else ncount++; |
||
| 479 | } |
||
| 480 | if (externalcmd) { |
||
| 481 | char ecmd[256]; |
||
| 482 | sprintf(ecmd,"%s %u %u %u %u",externalcommand,(unsigned int) tstart,data, rdata[2], rdata[3]); |
||
| 483 | if (verbose) printf("Executing external command %s\n",ecmd); |
||
| 484 | system(ecmd); |
||
| 485 | } |
||
| 486 | if (output && writeevent) { |
||
| 487 | evtrec.id=EVTREC_ID; |
||
| 488 | evtrec.len=count*sizeof(uint32_t)+ sizeof(evtrec); |
||
| 489 | evtrec.time=time(NULL); |
||
| 490 | evtrec.nev=i; |
||
| 491 | nb = fwrite( &evtrec, 1, sizeof(evtrec),fp); //gzip |
||
| 492 | if (count) nb+=fwrite(&rdata[0],1,count*sizeof(uint32_t),fp); //gzip |
||
| 493 | if (nb!= (int) evtrec.len) printf("Error writing! %d!=%d\n",nb,evtrec.len); |
||
| 494 | nbtotal+= nb; |
||
| 495 | } |
||
| 496 | if (verbose==1) { |
||
| 497 | printf("[%d/%d] %u \t", i,count, (unsigned int) time(NULL)); |
||
| 498 | PrintData(rdata,count); |
||
| 499 | } |
||
| 500 | if (dt0) sleep(dt0); |
||
| 501 | if (towrite ==3) { |
||
| 502 | sa02AsicWrite(address, cmd, dataoff, chip, ch, asicpar, asicshft); |
||
| 503 | ch += dstep; |
||
| 504 | if (ch>35) { |
||
| 505 | ch-=36; |
||
| 506 | chip++; |
||
| 507 | } |
||
| 508 | } else { |
||
| 509 | data += dstep; |
||
| 510 | } |
||
| 511 | if (ctrl_c) { |
||
| 512 | if (!testfixeddata) printf("Ctrl+C Program interrupted ....\n"); |
||
| 513 | break; |
||
| 514 | } |
||
| 515 | } |
||
| 516 | if (output) { |
||
| 517 | if (neve>1) H2DWrite2File(h2,fp); |
||
| 518 | fclose(fp); |
||
| 519 | } |
||
| 520 | if (verbose>1) { |
||
| 521 | printf("%d bytes written to file %s\n", nbtotal, filename); |
||
| 522 | } |
||
| 523 | VME_STOP(); |
||
| 524 | time(&t); |
||
| 525 | if (toread && !testfixeddata) printf("%d events in %2.2f min (%d s) TIMEOUTS=%d %s",ncount, (double)(t-tstart)/60.,int(t-tstart), nerrors, ctime(&t)); |
||
| 526 | return 0; |
||
| 527 | } |