00001
00002 #include <sys/types.h>
00003 #include <errno.h>
00004 #include <assert.h>
00005
00006 #include <rtsLog.h>
00007 #include <rtsSystems.h>
00008
00009
00010
00011 #include <SFS/sfs_index.h>
00012 #include <DAQ_READER/daqReader.h>
00013 #include <DAQ_READER/daq_dta.h>
00014
00015
00016 #include "daq_bsmd.h"
00017
00018 const char *daq_bsmd::help_string = "BSMD\n\
00019 adc returns bsmd_t;\n\
00020 raw returns raw data\n" ;
00021
00022 class daq_det_bsmd_factory : public daq_det_factory
00023 {
00024 public:
00025 daq_det_bsmd_factory() {
00026 daq_det_factory::det_factories[BSMD_ID] = this ;
00027 }
00028
00029 daq_det *create() {
00030 return new daq_bsmd ;
00031 }
00032 } ;
00033
00034 static daq_det_bsmd_factory bsmd_factory ;
00035
00036 static const struct bsmd_old_to_new_map_t {
00037 char new_sec ;
00038 char new_rdo ;
00039 } bsmd_old_to_new_map[13] = {
00040 { 0, 0 },
00041 { 1, 1 },
00042 { 1, 2 },
00043 { 1, 3 },
00044 { 1, 4 },
00045 { 1, 5 },
00046 { 1, 6 },
00047 { 2, 1 },
00048 { 2, 2 },
00049 { 2, 3 },
00050 { 2, 4 },
00051 { 2, 5 },
00052 { 2, 6 }
00053
00054 } ;
00055
00056
00057
00058 daq_bsmd::daq_bsmd(daqReader *rts_caller)
00059 {
00060 rts_id = BSMD_ID ;
00061 name = rts2name(rts_id) ;
00062 sfs_name = "bsmd" ;
00063 caller = rts_caller ;
00064 t_data = 0 ;
00065
00066 if(caller) caller->insert(this, rts_id) ;
00067
00068
00069 adc = new daq_dta ;
00070 adc_non_zs = new daq_dta ;
00071 ped = new daq_dta ;
00072 rms = new daq_dta ;
00073 raw = new daq_dta ;
00074
00075 LOG(DBG,"%s: constructor: caller %p",name,rts_caller) ;
00076 return ;
00077 }
00078
00079 daq_bsmd::~daq_bsmd()
00080 {
00081 LOG(DBG,"%s: DEstructor",name) ;
00082
00083
00084 delete adc ;
00085 delete ped ;
00086 delete rms ;
00087 delete adc_non_zs ;
00088 delete raw ;
00089
00090 return ;
00091 }
00092
00093
00094
00095 daq_dta *daq_bsmd::get(const char *bank, int sec, int row, int pad, void *p1, void *p2)
00096 {
00097 Make() ;
00098 if(!present) return 0 ;
00099
00100 LOG(DBG,"got something") ;
00101
00102 if(strcasecmp(bank,"adc")==0) {
00103 return handle_adc(row) ;
00104 }
00105 else if(strcasecmp(bank,"adc_non_zs")==0) {
00106 return handle_adc_non_zs(row) ;
00107 }
00108 else if(strcasecmp(bank,"ped")==0) {
00109 return handle_ped_rms(row,1) ;
00110 }
00111 else if(strcasecmp(bank,"rms")==0) {
00112 return handle_ped_rms(row,0) ;
00113 }
00114 else if(strcasecmp(bank,"raw")==0) {
00115 return handle_raw(row) ;
00116 }
00117
00118
00119 LOG(ERR,"%s: unknown bank type \"%s\"",name,bank) ;
00120 return 0 ;
00121 }
00122
00123
00124 daq_dta *daq_bsmd::handle_adc(int rdo)
00125 {
00126 struct bsmd_desc bsmd_d ;
00127 int start_r, stop_r ;
00128 int bytes ;
00129
00130 assert(caller) ;
00131
00132 LOG(DBG,"%s: present 0x%X",name,present) ;
00133
00134 if(!present) return 0 ;
00135
00136 if(rdo <= 0) {
00137 start_r = 1 ;
00138 stop_r = BSMD_FIBERS ;
00139 }
00140 else {
00141 start_r = stop_r = rdo ;
00142 }
00143
00144 bytes = 0 ;
00145 memset(&bsmd_d,0,sizeof(bsmd_d)) ;
00146
00147 if(present & DET_PRESENT_DATAP) {
00148 char *emcp = (char *)legacyDetp(rts_id, caller->mem) ;
00149
00150 if(bsmd_reader(emcp, &bsmd_d)==0) return 0 ;
00151
00152 for(int r=start_r;r<=stop_r;r++) {
00153 bytes += bsmd_d.bytes[r-1][1] ;
00154 }
00155
00156 }
00157 else {
00158 int s_new, r_new ;
00159 char str[256] ;
00160 char *full_name ;
00161
00162 for(int r=start_r;r<=stop_r;r++) {
00163 int l_bytes ;
00164
00165 s_new = bsmd_old_to_new_map[r].new_sec ;
00166 r_new = bsmd_old_to_new_map[r].new_rdo ;
00167
00168 sprintf(str,"%s/sec%02d/rb%02d/adc",sfs_name,s_new,r_new) ;
00169
00170 full_name = caller->get_sfs_name(str) ;
00171
00172 if(!full_name) continue ;
00173
00174 l_bytes = caller->sfs->fileSize(full_name) ;
00175 if(!l_bytes) continue ;
00176
00177 bsmd_d.bytes[r-1][1] = l_bytes ;
00178
00179 bytes += l_bytes ;
00180 }
00181
00182 }
00183
00184
00185
00186 LOG(DBG,"rdo %d: bytes %d",rdo,bytes) ;
00187
00188 if(bytes==0) return 0 ;
00189
00190 adc->create(bytes,"adc",rts_id,DAQ_DTA_STRUCT(bsmd_t)) ;
00191
00192 u_short *data_alloc ;
00193 int malloced_bytes ;
00194
00195 if(present & DET_PRESENT_DATAP) {
00196 malloced_bytes = 0 ;
00197 data_alloc = 0 ;
00198 }
00199 else {
00200
00201 malloced_bytes = (2400+10+3+100)*4 *2 ;
00202 data_alloc = (u_short *)malloc(malloced_bytes) ;
00203 assert(data_alloc) ;
00204 }
00205
00206
00207 for(int r=start_r;r<=stop_r;r++) {
00208 int count ;
00209 int version, fiber ;
00210 u_short *data ;
00211
00212 if(bsmd_d.bytes[r-1][1] == 0) continue ;
00213
00214 if(present & DET_PRESENT_DATAP) {
00215
00216 data = (u_short *)(bsmd_d.dta[r-1][1]) ;
00217 }
00218 else {
00219 int s_new, r_new ;
00220 char str[256] ;
00221 char *full_name ;
00222
00223 s_new = bsmd_old_to_new_map[r].new_sec ;
00224 r_new = bsmd_old_to_new_map[r].new_rdo ;
00225
00226 sprintf(str,"%s/sec%02d/rb%02d/adc",sfs_name,s_new,r_new) ;
00227
00228 full_name = caller->get_sfs_name(str) ;
00229
00230 if(!full_name) continue ;
00231
00232 bytes = caller->sfs->fileSize(full_name) ;
00233
00234 if(bytes > malloced_bytes) {
00235 LOG(ERR,"Too big %s is %d",str,bytes) ;
00236 continue ;
00237 }
00238
00239 data = data_alloc ;
00240 caller->sfs->read(str, (char *)data, bytes) ;
00241
00242 bsmd_d.endian[r-1][1] = 0 ;
00243 }
00244
00245 bsmd_t *bsmd = (bsmd_t *) adc->request(1) ;
00246
00247 memset(bsmd,0,sizeof(bsmd_t)) ;
00248
00249
00250 if(bsmd_d.endian[r-1][1]) {
00251 version = b2h16(data[0]) ;
00252 count = b2h16(data[1]) ;
00253 bsmd->cap = b2h16(data[2]) ;
00254 fiber = b2h16(data[3]) ;
00255
00256 bsmd->cap &= 0x7F ;
00257 LOG(NOTE,"%s: fiber %d[%d]: count %d, cap %d, version 0x%04X",name,r,fiber,count,bsmd->cap,version) ;
00258
00259 data += 4 ;
00260
00261 for(int c=0;c<count;c++) {
00262 int ch = b2h16(*data++) ;
00263 int adc = b2h16(*data++) ;
00264
00265 bsmd->adc[ch] = adc ;
00266 }
00267 }
00268 else {
00269 version = l2h16(data[0]) ;
00270 count = l2h16(data[1]) ;
00271 bsmd->cap = l2h16(data[2]) ;
00272 fiber = l2h16(data[3]) ;
00273
00274 bsmd->cap &= 0x7F ;
00275 LOG(NOTE,"%s: fiber %d[%d]: count %d, cap %d, version 0x%04X",name,r,fiber,count,bsmd->cap,version) ;
00276
00277 data += 4 ;
00278
00279 for(int c=0;c<count;c++) {
00280 int ch = l2h16(*data++) ;
00281 int adc = l2h16(*data++) ;
00282
00283 bsmd->adc[ch] = adc ;
00284 }
00285 }
00286
00287
00288
00289 adc->finalize(1,0,r,bsmd->cap) ;
00290 }
00291
00292 adc->rewind() ;
00293
00294 if(malloced_bytes) free(data_alloc) ;
00295
00296 return adc ;
00297
00298 }
00299
00300 daq_dta *daq_bsmd::handle_ped_rms(int rdo, int is_ped)
00301 {
00302 int start_r, stop_r ;
00303 int bytes ;
00304 struct bsmd_desc bsmd_d ;
00305 daq_dta *dta_use ;
00306
00307 if(rdo <= 0) {
00308 start_r = 1 ;
00309 stop_r = BSMD_FIBERS ;
00310 }
00311 else {
00312 start_r = stop_r = rdo ;
00313 }
00314
00315
00316 int want_sec[3] = { 0, 0, 0 } ;
00317 u_short *pedrms[3] = { 0, 0, 0 } ;
00318
00319 for(int r=start_r;r<=stop_r;r++) {
00320
00321 int s_new, r_new ;
00322 s_new = bsmd_old_to_new_map[r].new_sec ;
00323 r_new = bsmd_old_to_new_map[r].new_rdo ;
00324
00325 want_sec[s_new] = 1 ;
00326 }
00327
00328
00329 bytes = 0 ;
00330
00331 if(present & DET_PRESENT_DATAP) {
00332 char *emcp = (char *)legacyDetp(rts_id, caller->mem) ;
00333
00334 if(bsmd_reader(emcp, &bsmd_d)==0) return 0 ;
00335
00336
00337 for(int r=start_r;r<=stop_r;r++) {
00338 bytes += bsmd_d.bytes[r-1][2] ;
00339 }
00340
00341
00342 }
00343 else {
00344 for(int s=1;s<=2;s++) {
00345 char str[256] ;
00346 char *full_name ;
00347 int l_bytes ;
00348
00349 if(want_sec[s] == 0) continue ;
00350
00351 sprintf(str,"%s/sec%02d/pedrms",sfs_name,s) ;
00352
00353 full_name = caller->get_sfs_name(str) ;
00354
00355 if(!full_name) continue ;
00356
00357 l_bytes = caller->sfs->fileSize(full_name) ;
00358
00359 bytes += l_bytes ;
00360
00361
00362 pedrms[s] = (u_short *) malloc(l_bytes) ;
00363
00364 caller->sfs->read(str, (char *)(pedrms[s]), l_bytes) ;
00365
00366 }
00367 }
00368
00369 LOG(DBG,"rdo %d: bytes %d",rdo,bytes) ;
00370
00371 if(bytes==0) return 0 ;
00372
00373
00374 if(is_ped) {
00375 dta_use = ped ;
00376 dta_use->create(1,"bsmd_ped",rts_id,DAQ_DTA_STRUCT(bsmd_t)) ;
00377 }
00378 else {
00379 dta_use = rms ;
00380 dta_use->create(1,"bsmd_rms",rts_id,DAQ_DTA_STRUCT(bsmd_t)) ;
00381 }
00382
00383
00384
00385
00386 LOG(DBG,"doing rdos: %d-%d",start_r,stop_r) ;
00387
00388 for(int r=start_r;r<=stop_r;r++) {
00389 u_short *data ;
00390
00391 if(present & DET_PRESENT_DATAP) {
00392 if(bsmd_d.bytes[r-1][2] == 0) continue ;
00393
00394 data = (u_short *)(bsmd_d.dta[r-1][2]) ;
00395 }
00396 else {
00397 int s_new, r_new ;
00398
00399 s_new = bsmd_old_to_new_map[r].new_sec ;
00400 r_new = bsmd_old_to_new_map[r].new_rdo ;
00401 if(pedrms[s_new]==0) continue ;
00402
00403 data = pedrms[s_new] + ((4+128*4800)*(r_new-1)) ;
00404
00405 bsmd_d.endian[r-1][2] = 0 ;
00406
00407 }
00408
00409 LOG(DBG,"BSMD PEDR: rdo %d: 0x%04X 0x%04X 0x%04X 0x%04X",r,data[0],data[1],data[2],data[3]) ;
00410
00411
00412 data += 4 ;
00413
00414
00415 for(int c=0;c<128;c++) {
00416 bsmd_t *bsmd = (bsmd_t *) dta_use->request(1) ;
00417 bsmd->cap = c ;
00418 for(int ch=0;ch<4800;ch++) {
00419 int adc ;
00420 if(bsmd_d.endian[r-1][2]) {
00421 adc = b2h16(*data++) ;
00422 }
00423 else {
00424 adc = l2h16(*data++) ;
00425 }
00426
00427 if(is_ped) adc &= 0x3FF ;
00428 else {
00429 adc >>= 10 ;
00430 }
00431
00432 bsmd->adc[ch] = adc ;
00433 }
00434 dta_use->finalize(1,0,r,c) ;
00435 }
00436
00437
00438 }
00439
00440 for(int s=1;s<=2;s++) {
00441 if(pedrms[s]) free(pedrms[s]) ;
00442 }
00443
00444 dta_use->rewind() ;
00445
00446 return dta_use ;
00447
00448 }
00449
00450
00451 daq_dta *daq_bsmd::handle_adc_non_zs(int rdo)
00452 {
00453 struct bsmd_desc bsmd_d ;
00454 int start_r, stop_r ;
00455 int bytes ;
00456
00457 assert(caller) ;
00458
00459 if(!present) return 0 ;
00460
00461 if(rdo <= 0) {
00462 start_r = 1 ;
00463 stop_r = BSMD_FIBERS ;
00464 }
00465 else {
00466 start_r = stop_r = rdo ;
00467 }
00468
00469 bytes = 0 ;
00470
00471 if(present & DET_PRESENT_DATAP) {
00472 char *emcp = (char *)legacyDetp(rts_id, caller->mem) ;
00473
00474 if(bsmd_reader(emcp, &bsmd_d)==0) return 0 ;
00475
00476
00477 for(int r=start_r;r<=stop_r;r++) {
00478
00479 bytes += bsmd_d.bytes[r-1][0] ;
00480 }
00481
00482 if(bytes==0) return 0 ;
00483
00484 adc_non_zs->create(bytes,"adc_nzs",rts_id,DAQ_DTA_STRUCT(bsmd_t)) ;
00485
00486 for(int r=start_r;r<=stop_r;r++) {
00487
00488 if(bsmd_d.bytes[r-1][0] == 0) continue ;
00489
00490 bsmd_t *bsmd = (bsmd_t *) adc_non_zs->request(1) ;
00491
00492
00493
00494
00495 bsmd->cap = *(char *)((char *)bsmd_d.dta[r-1][0] + 4 + 4*16) ;
00496
00497 LOG(DBG,"Found cap %d",bsmd->cap) ;
00498
00499 u_short *data = (u_short *)((char *)bsmd_d.dta[r-1][0] + 4 + 256) ;
00500
00501 for(int c=0;c<BSMD_DATSIZE;c++) {
00502 bsmd->adc[c] = l2h16(*data++) ;
00503 }
00504
00505 adc_non_zs->finalize(1,0,r,bsmd->cap) ;
00506 }
00507
00508
00509 }
00510 else {
00511
00512 for(int r=start_r;r<=stop_r;r++) {
00513 bytes += sizeof(bsmd_t) ;
00514 }
00515
00516
00517 adc_non_zs->create(bytes,"adc_nzs",rts_id,DAQ_DTA_STRUCT(bsmd_t)) ;
00518
00519 for(int r=start_r;r<=stop_r;r++) {
00520 daq_dta *dd = handle_raw(r) ;
00521
00522 if(dd==0) continue ;
00523
00524 if(dd->iterate() == 0) continue ;
00525
00526
00527 u_int *d = (u_int *)dd->Void ;
00528 u_int rdo_words = dd->ncontent ;
00529
00530 if(rdo_words == 0) continue ;
00531
00532 bsmd_t *bsmd = (bsmd_t *) adc_non_zs->request(1) ;
00533
00534
00535
00536
00537 bsmd->cap = d[8] & 0x7F ;
00538
00539
00540 LOG(DBG,"Found cap %d",bsmd->cap) ;
00541
00542 u_short *data = (u_short *)(d+10) ;
00543
00544 for(int c=0;c<BSMD_DATSIZE;c++) {
00545 bsmd->adc[c] = l2h16(*data++) ;
00546 }
00547
00548 adc_non_zs->finalize(1,0,r,bsmd->cap) ;
00549 }
00550
00551
00552
00553
00554
00555 }
00556
00557
00558
00559
00560 adc_non_zs->rewind() ;
00561
00562 return adc_non_zs ;
00563
00564 }
00565
00566
00567 daq_dta *daq_bsmd::handle_raw(int rdo)
00568 {
00569 struct bsmd_desc bsmd_d ;
00570 int start_r, stop_r ;
00571 int bytes ;
00572
00573 assert(caller) ;
00574
00575 if(!present) return 0 ;
00576
00577 if(rdo <= 0) {
00578 start_r = 1 ;
00579 stop_r = BSMD_FIBERS ;
00580 }
00581 else {
00582 start_r = stop_r = rdo ;
00583 }
00584
00585 bytes = 0 ;
00586
00587 if(present & DET_PRESENT_DATAP) {
00588 char *emcp = (char *)legacyDetp(rts_id, caller->mem) ;
00589
00590 if(bsmd_reader(emcp, &bsmd_d)==0) return 0 ;
00591
00592
00593 for(int r=start_r;r<=stop_r;r++) {
00594
00595 bytes += bsmd_d.bytes[r-1][0] ;
00596 }
00597
00598 if(bytes==0) return 0 ;
00599
00600 raw->create(bytes,"raw",rts_id,DAQ_DTA_STRUCT(char)) ;
00601
00602 for(int r=start_r;r<=stop_r;r++) {
00603 bytes = bsmd_d.bytes[r-1][0] ;
00604
00605 if(bytes == 0) continue ;
00606
00607 char *st = (char *) raw->request(bytes) ;
00608
00609 memcpy(st,(char *)bsmd_d.dta[r-1][0],bytes) ;
00610
00611 raw->finalize(bytes,0,r,0) ;
00612 }
00613 }
00614 else if(present & DET_PRESENT_SFS) {
00615 int s_new, r_new ;
00616 char str[256] ;
00617 char *full_name ;
00618
00619
00620 for(int r=start_r;r<=stop_r;r++) {
00621
00622 s_new = bsmd_old_to_new_map[r].new_sec ;
00623 r_new = bsmd_old_to_new_map[r].new_rdo ;
00624
00625 sprintf(str,"%s/sec%02d/rb%02d/raw",sfs_name,s_new,r_new) ;
00626
00627 full_name = caller->get_sfs_name(str) ;
00628
00629 if(!full_name) continue ;
00630
00631 bytes += caller->sfs->fileSize(full_name) ;
00632
00633 }
00634
00635
00636 LOG(NOTE,"BSMD raw: total of %d bytes",bytes) ;
00637 if(bytes == 0) return 0 ;
00638
00639 raw->create(bytes,"bsmd_raw",rts_id,DAQ_DTA_STRUCT(char)) ;
00640
00641
00642 for(int r=start_r;r<=stop_r;r++) {
00643
00644 s_new = bsmd_old_to_new_map[r].new_sec ;
00645 r_new = bsmd_old_to_new_map[r].new_rdo ;
00646
00647 sprintf(str,"%s/sec%02d/rb%02d/raw",sfs_name,s_new,r_new) ;
00648
00649 full_name = caller->get_sfs_name(str) ;
00650
00651 if(!full_name) continue ;
00652
00653 bytes = caller->sfs->fileSize(full_name) ;
00654
00655 char *st = (char *) raw->request(bytes) ;
00656 int ret = caller->sfs->read(str, st, bytes) ;
00657 if(ret != bytes) {
00658 LOG(ERR,"ret is %d != %d",ret,bytes) ;
00659 }
00660
00661 raw->finalize(bytes,s_new,r) ;
00662 }
00663
00664
00665
00666 }
00667 else return 0 ;
00668
00669
00670
00671
00672 raw->rewind() ;
00673
00674 return raw ;
00675
00676 }
00677
00678
00679
00680
00681 int daq_bsmd::get_l2(char *buff, int words, struct daq_trg_word *trg, int rdo)
00682 {
00683 const int BSMD_BYTES_MIN = ((2400+10+3)*4) ;
00684 const int BSMD_BYTES_MAX = ((2400+10+3+30)*4) ;
00685
00686 const u_int BSMD_SIGNATURE = 0x42534D44 ;
00687 const u_int BSMD_HDR_ID = 5 ;
00688
00689 int t_cou = 0 ;
00690 int bad = 0 ;
00691 u_int *d32 = (u_int *)buff ;
00692 int id_check_failed = 0 ;
00693
00694
00695 words = 2413 ;
00696
00697
00698 int buff_bytes = 4 * words ;
00699
00700 if((buff_bytes < BSMD_BYTES_MIN) || (buff_bytes > BSMD_BYTES_MAX)) {
00701 LOG(ERR,"RDO %d: expect %d bytes, received %d",rdo,BSMD_BYTES_MIN,buff_bytes) ;
00702 bad |= 1 ;
00703 }
00704
00705
00706
00707 int last_ix = words - 1 ;
00708
00709 if(d32[1] != BSMD_SIGNATURE) {
00710 LOG(ERR,"RDO %d: bad header sig 0x%08X, expect 0x%08X",rdo,d32[1], BSMD_SIGNATURE) ;
00711 bad |= 1 ;
00712 }
00713
00714 if(d32[9] != 0xDEADFACE) {
00715 LOG(ERR,"RDO %d: bad deadface 0x%08X",rdo,d32[9]) ;
00716 bad |= 1 ;
00717 }
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728 if((d32[3] & 0xFFFF0000)) {
00729 LOG(ERR,"RDO %d: error flags 0x%04X",rdo,d32[3]>>16) ;
00730 bad |= 2 ;
00731 }
00732
00733 if(((d32[3]>>8) & 0xFF) != BSMD_HDR_ID) {
00734 LOG(ERR,"RDO %d: bad det_id 0x%02X",rdo,(d32[3]>>8)&0xFF) ;
00735 bad |= 1 ;
00736 }
00737
00738 int rdo_in_dta = d32[3] & 0xFF ;
00739 if(rdo_id[rdo] != 0xFF) {
00740 if(rdo_id[rdo] != rdo_in_dta) {
00741 id_check_failed++ ;
00742 }
00743 }
00744
00745
00746 LOG(DBG,"RDO %d: in data %d",rdo,rdo_id) ;
00747
00748
00749 int format_code = (d32[2] >> 8) & 0xFF ;
00750 if(format_code == 0x02) {
00751 LOG(NOTE,"RDO %d: null event",rdo) ;
00752
00753 trg[0].t = 4097 ;
00754 trg[0].daq = 0 ;
00755 trg[0].trg = 0 ;
00756 trg[0].rhic = d32[4] ;
00757
00758 return 1 ;
00759
00760 }
00761
00762 #if 1
00763 #define G_CONST 0x04C11DB7
00764
00765 u_int crc_in_data = d32[last_ix] ;
00766 register u_int crc = 0xFFFFFFFF ;
00767 if(crc_in_data) {
00768 for(int i=0;i<last_ix;i++) {
00769 u_int datum ;
00770
00771 datum = d32[i] ;
00772 register u_int data_j ;
00773 register u_int crc_31 ;
00774
00775 for(register int j=31;j>=0;j--) {
00776 data_j = (datum >> j) & 1 ;
00777 crc_31 = (crc & 0x80000000) ? 1 : 0 ;
00778
00779 if(crc_31 == data_j) {
00780 crc = (crc<<1) ^ G_CONST ;
00781 }
00782 else {
00783 crc = (crc<<1) ;
00784 }
00785 }
00786 }
00787
00788 if(crc != crc_in_data) {
00789 LOG(ERR,"RDO %d: CRC in data 0x%08X, CRC calculated 0x%08X",rdo,crc_in_data,crc) ;
00790 bad |= 1 ;
00791 }
00792 }
00793
00794 LOG(DBG,"RDO %d: CRC in data 0x%08X, CRC calculated 0x%08X",rdo,crc_in_data,crc) ;
00795 #endif
00796
00797
00798
00799 t_cou = 0 ;
00800 trg[0].t = d32[0] & 0xFFF ;
00801 trg[0].daq = d32[2] & 0xF ;
00802 trg[0].trg = (d32[2] >> 4) & 0xF ;
00803 trg[0].rhic = d32[4] ;
00804
00805 t_cou++ ;
00806
00807
00808 LOG(NOTE,"RDO %d: token %d, trg %d, daq %d: rhic %u",rdo,
00809 trg[0].t, trg[0].trg, trg[0].daq, trg[0].rhic) ;
00810
00811
00812
00813 if(trg[0].t == 0) {
00814 LOG(ERR,"RDO %d: token 0?",rdo) ;
00815 trg[0].t = 4097 ;
00816 bad |= 2 ;
00817 }
00818
00819
00820 #if 1 // skip for the temporary 0x8129 V
00821
00822
00823 int mesg_length = d32[last_ix-1] & 0xFFF ;
00824 if(mesg_length > 30) {
00825 LOG(ERR,"RDO %d: bad trigger length %d",rdo,mesg_length) ;
00826
00827 mesg_length = 0 ;
00828 bad |= 2 ;
00829 }
00830
00831 for(int i=0;i<mesg_length;i++) {
00832 u_int trg_data = d32[last_ix - 2 - i] ;
00833
00834
00835
00836 trg[t_cou].t = (trg_data >> 8) & 0xFFF ;
00837 trg[t_cou].trg = (trg_data >> 4) & 0xF ;
00838 trg[t_cou].daq = trg_data & 0xF ;
00839 trg[t_cou].rhic = (trg_data >> 20) & 0x7FF ;
00840
00841
00842
00843 if(trg_data & 0x80000000) {
00844 LOG(ERR,"RDO %d: FIFO limit 0x%08X",rdo,trg_data) ;
00845 bad |= 2 ;
00846 }
00847
00848
00849
00850 if(t_cou >= 120) {
00851 LOG(ERR,"RDO %d: too many triggers %d",rdo,t_cou) ;
00852 bad |= 2 ;
00853 break ;
00854 }
00855
00856 t_cou++ ;
00857 }
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867 #endif
00868
00869
00870
00871 switch(trg[0].trg) {
00872 case 2 :
00873 LOG(WARN,"RDO %d: T %04d: odd trg_cmd %d (daq_cmd %d) -- will ignore this event even if it had errors...",
00874 rdo, trg[0].t, trg[0].trg, trg[0].daq) ;
00875 trg[0].t = 4097 ;
00876 bad = 0 ;
00877 break ;
00878 case 4 :
00879 case 8 :
00880 case 11 :
00881 case 12 :
00882 break ;
00883 default :
00884 LOG(ERR,"RDO %d: T %04d: bad trg_cmd %d (daq_cmd %d)",rdo, trg[0].t, trg[0].trg, trg[0].daq) ;
00885
00886 trg[0].t = 4097 ;
00887 bad |= 2 ;
00888 break ;
00889 }
00890
00891
00892 if(bad) {
00893 LOG(WARN,"RDO %d: words %d: bad %d:",rdo,words,bad) ;
00894
00895 for(int i=0;i<10;i++) {
00896 LOG(WARN,"\tRDO %d: header %4d: 0x%08X",rdo,i,d32[i]) ;
00897 }
00898
00899 for(int i=(words-4);i<words;i++) {
00900 LOG(WARN,"\tRDO %d: trailer %4d: 0x%08X",rdo,i,d32[i]) ;
00901 }
00902
00903 }
00904 else if(trg[0].trg==11) {
00905 int bad_cou = 0;
00906 int shutup = 0 ;
00907 for(int i=10;i<2410;i++) {
00908 u_int should ;
00909 u_int b31, b21, b1, b0 ;
00910
00911 b31 = (t_data >> 31) & 1 ;
00912 b21 = (t_data >> 21) & 1 ;
00913 b1 = (t_data >> 1) & 1 ;
00914 b0 = (t_data >> 0) & 1 ;
00915
00916 should = !(b31 ^ b21 ^ b1 ^b0) ;
00917 should = (t_data << 1) | should ;
00918
00919 if(d32[i] != t_data) {
00920 if(!shutup) LOG(WARN,"word %4d: should 0x%08X, is 0x%08X",i,t_data,d32[i]) ;
00921 bad_cou++ ;
00922 }
00923
00924 if(bad_cou > 2) shutup = 1 ;
00925
00926 should = !(b31 ^ b21 ^ b1 ^b0) ;
00927 should = (t_data << 1) | should ;
00928
00929 t_data = should ;
00930
00931 }
00932
00933 if(bad_cou) LOG(ERR,"RDO %d: bad locations %d",rdo,bad_cou) ;
00934 }
00935
00936 if(bad & 1) {
00937 return 0 ;
00938 }
00939 else {
00940
00941 if(id_check_failed) {
00942 rdo_warns[rdo]++ ;
00943 if(rdo_warns[rdo] < 5) {
00944 LOG(CAUTION,"RDO %d: rdo check failed: expect 0x%02X, found 0x%02X",
00945 rdo,rdo_id[rdo],rdo_in_dta) ;
00946 }
00947 }
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957 return t_cou ;
00958 }
00959 }