00001 #include <assert.h>
00002 #include <stdlib.h>
00003 #include <stdio.h>
00004 #include <arpa/inet.h>
00005 #include <dlfcn.h>
00006 #include <errno.h>
00007
00008 #include <rtsLog.h>
00009 #include <rts.h>
00010 #include <rtsSystems.h>
00011 #include <daqFormats.h>
00012
00013 #include <SFS/sfs_index.h>
00014
00015 #include "daqReader.h"
00016 #include "daq_det.h"
00017 #include "daq_dta.h"
00018
00019
00020
00021 daq_det_factory *daq_det_factory::pseudo_factories[32] ;
00022 daq_det_factory *daq_det_factory::det_factories[32] ;
00023
00024
00025
00026 daq_det *daq_det_factory::make_det(int wh)
00027 {
00028 daq_det_factory *use_factory = 0 ;
00029 char libname[64] ;
00030
00031 libname[0] = 0 ;
00032
00033 if(wh < 0) {
00034 switch(wh) {
00035 case -BTOW_ID :
00036 sprintf(libname,"libdaq_emc.so") ;
00037 break ;
00038 case -L3_ID :
00039 sprintf(libname,"libdaqhlt.so") ;
00040 break ;
00041 }
00042 }
00043 else {
00044 sprintf(libname,"libdaq_%s.so",rts2name(wh)) ;
00045 }
00046
00047
00048 for(u_int i=0;i<strlen(libname);i++) {
00049 libname[i] = tolower(libname[i]) ;
00050 }
00051
00052 LOG(NOTE,"factory for det %d, lib %s",wh,libname) ;
00053
00054 if(wh < 0) {
00055 wh = -wh ;
00056 use_factory = pseudo_factories[wh] ;
00057 }
00058 else {
00059 use_factory = det_factories[wh] ;
00060 }
00061
00062
00063 if(use_factory == 0) {
00064 #if 0 // this was never completed...
00065 #ifdef __ROOT__
00066 gSomething->Loadsomething(libname) ;
00067 #else
00068
00069 #if 0
00070 errno = 0 ;
00071 void *handle = dlopen("../DAQ_SC/libdaq_sc.so", RTLD_LAZY | RTLD_GLOBAL) ;
00072 if(handle == 0) {
00073 LOG(ERR,"dlopen failed for %s [%s]",libname,dlerror()) ;
00074 }
00075 else {
00076 LOG(NOTE,"dlopen OK for det %d, lib %s",wh,libname) ;
00077 }
00078 #endif
00079 #endif
00080 #endif
00081 }
00082
00083 if(use_factory == 0) {
00084 LOG(ERR,"Can't load or find detector %d,libname %s",wh,libname) ;
00085 }
00086
00087 assert(use_factory) ;
00088
00089 LOG(NOTE,"factory for %d: calling create",wh) ;
00090
00091 return use_factory->create() ;
00092 }
00093
00094
00095 int daq_det::endianess = 0 ;
00096
00097
00098 daq_det::daq_det(daqReader *rts_caller)
00099 {
00100 name = sfs_name = "(generic)" ;
00101 rts_id = -1 ;
00102 caller = rts_caller ;
00103 present = 0 ;
00104
00105 SetMode(0) ;
00106 m_Debug = 0 ;
00107
00108 def_sector = def_rdo = -1 ;
00109
00110 in_buffer = 0 ;
00111 out_buffer = 0 ;
00112 in_bytes = 0 ;
00113 out_bytes = 0 ;
00114
00115 if(htonl(0x12345678) != 0x12345678) {
00116 endianess = 0 ;
00117 }
00118 else {
00119 endianess = 1 ;
00120 }
00121
00122
00123 LOG(DBG,"daq_det: %s [%d], caller %p: endianess %c",name,rts_id,caller,endianess?'B':'L') ;
00124
00125 return ;
00126 }
00127
00128
00129 daq_det::~daq_det()
00130 {
00131 LOG(DBG,"~daq_det: %s [%d]",name,rts_id) ;
00132
00133 #ifndef PP_MVME
00134 if(caller) {
00135 LOG(DBG,"Before de_insert(%d)",rts_id) ;
00136 caller->de_insert(rts_id) ;
00137 LOG(DBG,"After de_insert(%d)",rts_id) ;
00138 }
00139 #endif
00140 return ;
00141 }
00142
00143
00144 unsigned int daq_det::get_global_event_num()
00145 {
00146 if(caller) return caller->seq ;
00147
00148 return 0 ;
00149 };
00150
00151 void daq_det::managed_by(class daqReader *c)
00152 {
00153 caller = c ;
00154
00155 assert(caller) ;
00156 #ifndef PP_MVME
00157 caller->insert(this, rts_id) ;
00158 #endif
00159 }
00160
00161 int daq_det::Make()
00162 {
00163 present = 0 ;
00164
00165
00166 if(presence()) {
00167 present |= DET_PRESENT_SFS ;
00168 LOG(NOTE,"%s(SFS %s): present via SFS",name,sfs_name) ;
00169 }
00170 else if(legacyDetp(rts_id, caller->mem)) {
00171 present |= DET_PRESENT_DATAP ;
00172 LOG(NOTE,"%s(SFS %s): present via DATAP",name,sfs_name) ;
00173 }
00174
00175 if(present) {
00176 evt_num++ ;
00177 }
00178 else {
00179 LOG(DBG, "%s: not found",name) ;
00180 }
00181
00182 return present ;
00183 }
00184
00185 int daq_det::Init()
00186 {
00187 present = 0 ;
00188 evt_num = 0 ;
00189 run_num = 0 ;
00190
00191 LOG(DBG,"Init: %s[%d], sfs_name %s",name,rts_id,sfs_name) ;
00192
00193 return 0 ;
00194 }
00195
00196 int daq_det::InitRun(int run_number)
00197 {
00198 run_num = run_number ;
00199 evt_num = 0 ;
00200 present = 0 ;
00201
00202 LOG(DBG,"InitRun: %s [%d]: run %09u",name,rts_id,run_number) ;
00203
00204 return 0 ;
00205 }
00206
00207 int daq_det::FinishRun(int old_run_number)
00208 {
00209
00210 LOG(DBG,"FinishRun: %s [%d]: run %09u",name,rts_id,old_run_number) ;
00211
00212 return 0 ;
00213 }
00214
00215 void daq_det::help() const
00216 {
00217 printf("***************** %s: %s ******************\n",name,GetCVS()) ;
00218
00219 }
00220
00221
00222
00223
00224 int daq_det::presence()
00225 {
00226
00227 int pres = 0 ;
00228
00229 if(caller==0) {
00230 LOG(TERR,"no caller? %s",name) ;
00231 pres = 1 ;
00232 goto ret_here;
00233 }
00234
00235 #ifdef PP_MVME
00236 pres = 1 ;
00237 goto ret_here ;
00238 #else
00239 if(caller->sfs == 0) goto ret_here ;
00240
00241 if(caller->sfs->opendirent((char *)sfs_name)) {
00242 pres = 1 ;
00243 }
00244 else {
00245 pres = 0 ;
00246 }
00247 #endif
00248 ret_here: ;
00249
00250 LOG(DBG,"sfs presence(%s): %d",sfs_name,pres) ;
00251
00252 return pres ;
00253
00254 } ;
00255
00256
00257
00258 int daq_det::get_token(char *addr, int words)
00259 {
00260 daq_trg_word trgs[128] ;
00261
00262 int ret = get_l2(addr, words, trgs, 1) ;
00263 if(ret == 0) {
00264 LOG(ERR,"No triggers?") ;
00265 return -1000 ;
00266 }
00267
00268
00269 if(trgs[0].t==0) {
00270 LOG(ERR,"Token 0 not allowed but I will try to use the other triggers...") ;
00271 trgs[0].t = 4097 ;
00272 }
00273
00274
00275 return trgs[0].t ;
00276
00277 }
00278
00279
00280 int daq_det::get_l2(char *buff, int buff_bytes, daq_trg_word *trg, int prompt)
00281 {
00282
00283 LOG(ERR,"%s: get_l2() not written!",name) ;
00284 return 0 ;
00285 }
00286
00287 int daq_det::bad_sanity()
00288 {
00289 return 0 ;
00290 }
00291
00292 daq_dta *daq_det::get(const char *bank,int c1, int c2, int c3, void *p1, void *p2)
00293 {
00294 LOG(ERR,"%s [%d]: get() not written!",name,rts_id) ;
00295
00296 return 0 ;
00297 }
00298
00299
00300 daq_dta *daq_det::put(const char *bank,int c1, int c2, int c3, void *p1, void *p2)
00301 {
00302 LOG(ERR,"%s: put() not written!",name) ;
00303
00304 return 0 ;
00305 }
00306
00307
00308
00309
00310 int checkBank(char *in, char *expect)
00311 {
00312 char buff[12] ;
00313
00314 memcpy(buff,in,8) ;
00315 buff[9] = 0 ;
00316
00317
00318
00319
00320
00321
00322 if(strcmp(buff,"DATAP")==0) {
00323 memcpy(buff,CHAR_DATAP,8) ;
00324 }
00325
00326 if(memcmp(buff,expect,strlen(expect))) {
00327 LOG(ERR,"Read \"%s\", expect \"%s\"",buff,expect) ;
00328 return -1 ;
00329 }
00330 else {
00331 LOG(DBG,"Found \"%s\", as expected...",expect) ;
00332 }
00333
00334 return 0 ;
00335 }
00336
00337
00338
00339
00340
00341 int *legacyDetp(int rts_id, char *m)
00342 {
00343 struct DATAP *datap = (struct DATAP *)m ;
00344 struct DATAPX *datapx ;
00345 int *ret_p ;
00346
00347 int len, off ;
00348 int id ;
00349
00350
00351 if(datap == 0) {
00352 LOG(DBG,"No DATAP: I would need it for %s [%d]",rts2name(rts_id),rts_id) ;
00353 return 0 ;
00354 }
00355
00356 int swapdatap = 0 ;
00357 int swapdatapx = 0 ;
00358
00359
00360 LOG(DBG,"Checking for %s",rts2name(rts_id)) ;
00361
00362
00363 if(checkBank(datap->bh.bank_type, CHAR_DATAP) < 0) {
00364 return 0 ;
00365 }
00366
00367 LOG(DBG,"Here...") ;
00368
00369 if(datap->bh.byte_order != DAQ_RAW_FORMAT_ORDER) swapdatap = 1;
00370
00371 for(int i=0;i<10;i++) {
00372 if(datap->det[i].len) {
00373 LOG(DBG,"Found DATAP ix %d: [%s]",i,rts2name(i)) ;
00374 }
00375 }
00376
00377
00378 switch(rts_id) {
00379 case BSMD_ID :
00380 id = BTOW_ID ;
00381 break ;
00382 case ESMD_ID :
00383 id = ETOW_ID ;
00384 break ;
00385 default :
00386 id = rts_id ;
00387 break ;
00388 }
00389
00390 ret_p = 0 ;
00391
00392
00393 if(id < 10) {
00394 len = qswap32(swapdatap, datap->det[id].len) ;
00395 off = qswap32(swapdatap, datap->det[id].off) ;
00396
00397 LOG(DBG, "Checking for datap: len=%d off=%d",len,off);
00398
00399 if((len == 0) || (off == 0)) {
00400 return 0 ;
00401 }
00402
00403
00404 LOG(DBG,"%s [%d] found in this event",rts2name(rts_id),rts_id) ;
00405 ret_p = ((int *)datap + off) ;
00406 }
00407 else {
00408
00409 len = qswap32(swapdatap, datap->det[EXT_ID].len) ;
00410 off = qswap32(swapdatap, datap->det[EXT_ID].off) ;
00411
00412 LOG(DBG, "Checking for datapx: len=%d off=%d",len,off);
00413
00414 if((len == 0) || (off == 0)) {
00415 return 0 ;
00416 }
00417
00418
00419 datapx = (struct DATAPX *)((int *)datap + off) ;
00420
00421
00422 if(checkBank(datapx->bh.bank_type, CHAR_DATAPX) < 0) {
00423 return 0 ;
00424 }
00425
00426 if(datapx->bh.byte_order != DAQ_RAW_FORMAT_ORDER) swapdatapx = 1;
00427
00428 for(int i=0;i<22;i++) {
00429 if(datapx->det[i].len) {
00430 LOG(DBG,"Found DATAPX ix %d: ID %d [%s]",i,i+10,rts2name(i+10)) ;
00431 }
00432 }
00433
00434
00435 len = qswap32(swapdatapx, datapx->det[id-10].len) ;
00436 off = qswap32(swapdatapx, datapx->det[id-10].off) ;
00437
00438
00439 if((len == 0) || (off == 0)) {
00440 return 0 ;
00441 }
00442
00443
00444 LOG(DBG,"%s [%d] found in this event",rts2name(rts_id),rts_id) ;
00445 ret_p = ((int *)datapx + off) ;
00446
00447 }
00448
00449
00450 if(ret_p == 0) return 0 ;
00451
00452
00453 EMCP *emcp = (EMCP *) ret_p ;
00454
00455
00456 switch(rts_id) {
00457 case BTOW_ID :
00458 case ETOW_ID :
00459 LOG(DBG,"[BE]TOW: %p: %d, %d",emcp,emcp->sec[0].len, emcp->sec[1].len) ;
00460 if(emcp->sec[0].len) ;
00461 else ret_p = 0 ;
00462 break ;
00463 case BSMD_ID :
00464 case ESMD_ID :
00465 LOG(DBG,"[BE]SMD: %p: %d, %d",emcp,emcp->sec[0].len, emcp->sec[1].len) ;
00466 if(emcp->sec[1].len) ;
00467 else ret_p = 0 ;
00468 break ;
00469 }
00470
00471 if(ret_p) LOG(DBG,"%s [%d] found in this event",rts2name(rts_id),rts_id) ;
00472
00473 return ret_p ;
00474 }
00475