00001 #include <assert.h>
00002 #include <sys/types.h>
00003 #include <errno.h>
00004
00005 #include <rtsLog.h>
00006 #include <rtsSystems.h>
00007
00008 #include <SFS/sfs_index.h>
00009
00010 #include <DAQ_READER/daqReader.h>
00011 #include <DAQ_READER/daq_dta.h>
00012
00013 #include "daq_tof.h"
00014
00015 extern int tof_reader(char *mem, struct tof_t *tof, u_int driver) ;
00016
00017
00018
00019
00020 const char *daq_tof::help_string = "\
00021 \n\
00022 TOF Help: \n\
00023 Supported Banks: \n\
00024 raw returns=ptr of start of DDL data; c1=sector[1..1]; c2=rdo[1..4]; \n\
00025 legacy returns=ptr to struct tof_t; \n\
00026 \n\
00027 \n\
00028 " ;
00029
00030 class daq_det_tof_factory : public daq_det_factory
00031 {
00032 public:
00033 daq_det_tof_factory() {
00034 daq_det_factory::det_factories[TOF_ID] = this ;
00035 }
00036
00037 daq_det *create() {
00038 return new daq_tof ;
00039 }
00040 } ;
00041
00042 static daq_det_tof_factory tof_factory ;
00043
00044
00045
00046 daq_tof::daq_tof(daqReader *rts_caller)
00047 {
00048 rts_id = TOF_ID ;
00049 name = rts2name(rts_id) ;
00050 sfs_name = "tof" ;
00051 caller = rts_caller ;
00052 if(caller) caller->insert(this, rts_id) ;
00053
00054 raw = new daq_dta ;
00055 legacy = new daq_dta ;
00056
00057
00058
00059 LOG(DBG,"%s: constructor: caller %p",name,rts_caller) ;
00060 return ;
00061 }
00062
00063 daq_tof::~daq_tof()
00064 {
00065 LOG(DBG,"%s: DEstructor",name) ;
00066
00067 delete raw ;
00068 delete legacy ;
00069
00070 return ;
00071 }
00072
00073
00074
00075 daq_dta *daq_tof::get(const char *bank, int sec, int row, int pad, void *p1, void *p2)
00076 {
00077 Make() ;
00078
00079 if(present==0) return 0 ;
00080
00081 LOG(DBG,"%s: looking for bank %s",name,bank) ;
00082
00083 if(strcmp(bank,"*")==0) bank = "legacy" ;
00084
00085
00086
00087 if(strcasecmp(bank,"raw")==0) {
00088 if((present & DET_PRESENT_SFS)==0) return 0 ;
00089 return handle_raw(sec,row) ;
00090 }
00091 else if(strcasecmp(bank,"legacy")==0) {
00092
00093 return handle_legacy() ;
00094 }
00095 else {
00096 LOG(ERR,"%s: unknown bank type \"%s\"",name,bank) ;
00097 }
00098
00099 return 0 ;
00100 }
00101
00102
00103 daq_dta *daq_tof::handle_legacy()
00104 {
00105 assert(caller) ;
00106
00107 legacy->create(1,"tof_t",rts_id,DAQ_DTA_STRUCT(tof_t)) ;
00108
00109
00110 tof_t *tof_p = (tof_t *) legacy->request(1) ;
00111
00112
00113 memset(tof_p->ddl_words,0,sizeof(tof_p->ddl_words)) ;
00114
00115 if(present & DET_PRESENT_DATAP) {
00116 tof_reader(caller->mem, tof_p, m_Debug) ;
00117 }
00118 else {
00119 tof_p->mode = 1 ;
00120 tof_p->channels = 0 ;
00121 tof_p->max_channels = 48+48+32+12 ;
00122
00123
00124 for(int r=1;r<=4;r++) {
00125 daq_dta *dd = handle_raw(0,r) ;
00126 if(dd && dd->iterate()) {
00127 u_int *tmp = (u_int *)dd->Void ;
00128
00129 u_int words = dd->ncontent/4 ;
00130
00131 LOG(DBG,"TOF: RDO %d: bytes %d (max %d)",r,dd->ncontent,sizeof(tof_p->ddl[0])) ;
00132
00133 if(words > (sizeof(tof_p->ddl[0])/4)) {
00134 LOG(ERR,"TOF: Huge event in RDO %d: %d words -- clipping to %d words",
00135 r,words,sizeof(tof_p->ddl[0])/4) ;
00136
00137 words = sizeof(tof_p->ddl[0])/4 ;
00138 }
00139
00140
00141 tof_p->ddl_words[r-1] = words ;
00142
00143
00144 for(u_int i=0;i<words;i++) {
00145 tof_p->ddl[r-1][i] = l2h32(*tmp) ;
00146 tmp++ ;
00147 }
00148
00149 }
00150
00151 }
00152
00153 }
00154 legacy->finalize(1,1,0,0) ;
00155 legacy->rewind() ;
00156
00157 return legacy ;
00158 }
00159
00160
00161 daq_dta *daq_tof::handle_raw(int sec, int rdo)
00162 {
00163 char str[128] ;
00164 int tot_bytes ;
00165 int min_rdo, max_rdo ;
00166 int min_sec, max_sec ;
00167 struct {
00168 int sec ;
00169 int rb ;
00170 u_int bytes ;
00171 } obj[MAX_SEC*MAX_RDO] ;
00172
00173
00174 sec = 1 ;
00175 min_sec = max_sec = sec ;
00176
00177 if(rdo==-1) {
00178 min_rdo = 1 ;
00179 max_rdo = MAX_RDO ;
00180 }
00181 else if((rdo<1) || (rdo>MAX_RDO)) return 0 ;
00182 else {
00183 min_rdo = max_rdo = rdo ;
00184 }
00185
00186
00187 assert(caller) ;
00188
00189
00190 tot_bytes = 0 ;
00191 int o_cou = 0 ;
00192 for(int s=min_sec;s<=max_sec;s++) {
00193 for(int r=min_rdo;r<=max_rdo;r++) {
00194
00195 sprintf(str,"%s/sec%02d/rb%02d/raw",sfs_name, s, r) ;
00196 char *full_name = caller->get_sfs_name(str) ;
00197
00198 LOG(DBG,"%s: trying sfs on \"%s\"",name,str) ;
00199 if(full_name == 0) continue ;
00200
00201 int size = caller->sfs->fileSize(full_name) ;
00202
00203 LOG(DBG,"Got %d",size) ;
00204
00205 if(size <= 0) {
00206 LOG(DBG,"%s: %s: not found in this event",name,str) ;
00207 continue ;
00208 }
00209 else {
00210 obj[o_cou].sec = s ;
00211 obj[o_cou].rb = r ;
00212 obj[o_cou].bytes = size ;
00213
00214 o_cou++ ;
00215
00216 tot_bytes += size ;
00217 LOG(DBG,"%s: %s: reading in \"%s\": bytes %d",name,str,"raw", size) ;
00218 }
00219 }
00220 }
00221
00222 raw->create(tot_bytes,"tof_raw",rts_id,DAQ_DTA_STRUCT(u_char)) ;
00223
00224 for(int i=0;i<o_cou;i++) {
00225
00226 sprintf(str,"%s/sec%02d/rb%02d/raw",sfs_name, obj[i].sec, obj[i].rb) ;
00227 char *full_name = caller->get_sfs_name(str) ;
00228 if(full_name == 0) continue ;
00229
00230 char *st = (char *) raw->request(obj[i].bytes) ;
00231
00232 int ret = caller->sfs->read(full_name, st, obj[i].bytes) ;
00233
00234 if(ret != (int)obj[i].bytes) {
00235 LOG(ERR,"%s: %s: read failed, expect %d, got %d [%s]",name,str,
00236 obj[i].bytes,ret,strerror(errno)) ;
00237 }
00238
00239 else {
00240 LOG(NOTE,"%s: %s read %d bytes",name,str,ret) ;
00241
00242 }
00243
00244 raw->finalize(obj[i].bytes,obj[i].sec,obj[i].rb,0) ;
00245
00246 }
00247
00248 raw->rewind() ;
00249 return raw ;
00250 }
00251
00252
00253
00254 int daq_tof::get_token(char *addr, int words)
00255 {
00256 int cou ;
00257 struct daq_trg_word trg[128] ;
00258
00259 cou = get_l2(addr,words,trg,1) ;
00260
00261 if(cou==0) return -1000 ;
00262 if(trg[0].t==0) return -ENOSYS ;
00263
00264 return trg[0].t ;
00265 }
00266
00267
00268 int daq_tof::get_l2(char *addr, int words, struct daq_trg_word *trg, int rdo)
00269 {
00270 u_int *w ;
00271 int cou = 0 ;
00272 int t_cou = 0 ;
00273 int in_words = words ;
00274
00275 int err = 0 ;
00276 int trg_start ;
00277
00278 w = (u_int *)addr ;
00279 words-- ;
00280
00281
00282 LOG(DBG,"First words 0x%08X 0x%08X 0x%08X, last words 0x%08X 0x%08X 0x%08X [+0x%08X], %u",
00283 w[0],w[1],w[2],w[words-2],w[words-1],w[words],w[words+1],words+1) ;
00284
00285
00286
00287
00288
00289
00290 trg[t_cou].t = w[0] & 0xFFF ;
00291 trg[t_cou].daq = (w[0]>>12) & 0xF ;
00292 trg[t_cou].trg = (w[0]>>16) & 0xF ;
00293 trg[t_cou].rhic = 0 ;
00294 trg[t_cou].rhic_delta = 0 ;
00295 t_cou++ ;
00296
00297
00298 LOG(NOTE,"prompt: T %4d, trg %d, daq %d [0x%08X]: words %d",trg[0].t,trg[0].trg,trg[0].daq,w[0],in_words) ;
00299
00300 if(in_words < 2) {
00301 err |= 1 ;
00302 LOG(ERR,"[%d] bad word count %d < 2",rdo,in_words);
00303 }
00304
00305
00306 if(w[0] == 0xA0000000) {
00307 trg[0].t = 4097;
00308 }
00309 else {
00310 if(in_words < 3) {
00311 err |= 1 ;
00312 LOG(ERR,"[%d] bad word count %d <= 3",rdo,in_words);
00313 }
00314
00315 if(trg[0].t == 0) {
00316 err |= 2 ;
00317 LOG(ERR,"[%d] token 0",rdo);
00318 trg[0].t = 4097 ;
00319 }
00320
00321 if(trg[0].trg != 4) {
00322 err |= 2 ;
00323 LOG(ERR,"[%d] bad trg_cmd %d != 4",rdo,trg[0].trg);
00324 }
00325
00326 if(w[1] != 0xDEADFACE) {
00327 err |= 1 ;
00328 LOG(ERR,"[%d] bad DEADCODE 0x%08X",rdo,w[1]);
00329 }
00330
00331
00332 }
00333
00334 if((w[0] >> 20) != 0xA00) {
00335 err |= 1 ;
00336 LOG(ERR,"[%d] bad first word 0x%08X doesn't start with 0xA00",rdo,w[0]);
00337 trg[0].t = 4097 ;
00338 }
00339
00340
00341 #if 0
00342
00343 while(words) {
00344 if((w[words] >> 28)==0xA) {
00345 words-- ;
00346 cou++ ;
00347 }
00348 else {
00349 break ;
00350 }
00351 }
00352
00353 if(cou==0) {
00354 err |= 1 ;
00355 LOG(ERR,"[%d] No Trigger FIFO contribution??",rdo);
00356 }
00357
00358 words++ ;
00359
00360 trg_start = words ;
00361
00362
00363 for(int i=0;i<cou;i++) {
00364 int l_err = 0 ;
00365
00366 trg[t_cou].t = w[words+i] & 0xFFF ;
00367 trg[t_cou].daq = (w[words+i]>>12) & 0xF ;
00368 trg[t_cou].trg = (w[words+i]>>16) & 0xF ;
00369 trg[t_cou].rhic = i+1 ;
00370 trg[t_cou].rhic_delta = i+1 ;
00371
00372 if(trg[t_cou].t == 0) l_err = 1 ;
00373
00374
00375 switch(trg[t_cou].trg) {
00376 case 4 :
00377 continue ;
00378 case 13 :
00379 case 15 :
00380 break ;
00381 default :
00382 l_err = 1 ;
00383 break ;
00384 }
00385
00386 if(l_err) {
00387 LOG(ERR,"[%d] bad FIFO trg (%d.): T %4d, trg %d, daq %d [0x%08X]",rdo,words+i,trg[t_cou].t,trg[t_cou].trg,trg[t_cou].daq,w[words+i]);
00388 err |= 2 ;
00389 continue ;
00390 }
00391
00392 t_cou++ ;
00393
00394 if(t_cou >=120) {
00395 err |= 2 ;
00396 LOG(ERR,"[%d] Too many trigger contributions %d >= 120",rdo,t_cou) ;
00397 break ;
00398 }
00399 }
00400
00401 #endif
00402 if((t_cou==1) && (trg[0].t > 0) && (trg[0].t<=4095)) {
00403 trg[t_cou].t = trg[0].t ;
00404 trg[t_cou].daq = 0 ;
00405 trg[t_cou].trg = 15 ;
00406 trg[t_cou].rhic = trg[0].rhic + 1 ;
00407 trg[t_cou].rhic_delta = 1 ;
00408 t_cou++ ;
00409
00410 }
00411 else {
00412 LOG(WARN,"%d %d %d???",t_cou,trg[0].t,trg[0].trg) ;
00413 }
00414
00415 if(err) {
00416 LOG(ERR,"[%d] Bad Event: T %4d: words %d, trg_words %d (start at %d) : 0x%08X 0x%08X 0x%08X",
00417 rdo,trg[0].t,in_words,cou,trg_start,w[0],w[1],w[2]) ;
00418
00419
00420
00421
00422 }
00423
00424 if(err & 1) {
00425 return -1 ;
00426 }
00427
00428 return t_cou ;
00429 }