00001 #include <sys/types.h>
00002 #include <string.h>
00003 #include <assert.h>
00004
00005 #include <rtsLog.h>
00006 #include <rtsSystems.h>
00007
00008
00009 #include <SFS/sfs_index.h>
00010 #include <DAQ_READER/daqReader.h>
00011 #include <DAQ_READER/daq_dta.h>
00012
00013
00014
00015 #include <DAQ_EMC/daq_emc.h>
00016
00017 #include "daq_btow.h"
00018
00019
00020
00021 const int btow_crate_map[] = {
00022 0x12, 0x11, 0x10, 0x1e,
00023 0x1d, 0x1c, 0x1b, 0x1a,
00024 0x19, 0x18, 0x17, 0x16,
00025 0x15, 0x14, 0x13, 0x01,
00026 0x0f, 0x0e, 0x0d, 0x0c,
00027 0x0b, 0x0a, 0x09, 0x08,
00028 0x07, 0x06, 0x05, 0x04,
00029 0x03, 0x02
00030 } ;
00031
00032 class daq_det_btow_factory : public daq_det_factory
00033 {
00034 public:
00035 daq_det_btow_factory() {
00036 daq_det_factory::det_factories[BTOW_ID] = this ;
00037 }
00038
00039 daq_det *create() {
00040 return new daq_btow ;
00041 }
00042 } ;
00043
00044 static daq_det_btow_factory btow_factory ;
00045
00046
00047 const char *daq_btow::help_string = "BTOW tst\n" ;
00048
00049
00050
00051 daq_btow::daq_btow(daqReader *rts_caller)
00052 {
00053
00054 LOG(DBG,"BTOW: rts_id %d, name %s",rts_id,name) ;
00055
00056 rts_id = BTOW_ID ;
00057 name = rts2name(rts_id) ;
00058 sfs_name = "btow" ;
00059 caller = rts_caller ;
00060 if(caller) caller->insert(this, rts_id) ;
00061
00062 raw = new daq_dta ;
00063 adc = new daq_dta ;
00064
00065 LOG(DBG,"%s: constructor: caller %p",name,caller) ;
00066 }
00067
00068 daq_btow::~daq_btow()
00069 {
00070 LOG(DBG,"%s: destructor",name) ;
00071
00072 delete adc ;
00073 delete raw ;
00074
00075 return ;
00076 }
00077
00078
00079 int daq_btow::Make()
00080 {
00081 int dummy ;
00082
00083 present = 0 ;
00084
00085
00086 assert(caller) ;
00087
00088 evt_num++ ;
00089
00090 LOG(DBG,"%s: Make()",name) ;
00091
00092 if(presence()) {
00093 present |= DET_PRESENT_SFS;
00094 LOG(NOTE,"%s: %d: has SFS(%s)",name,evt_num,sfs_name) ;
00095 }
00096 else if(legacyDetp(rts_id, caller->mem)) {
00097 present |= DET_PRESENT_DATAP ;
00098 LOG(NOTE,"%s: %d: has DATAP",name,evt_num) ;
00099 }
00100 else if(getEmcTrgData(caller->mem,1,&dummy)) {
00101 present |= DET_PRESENT_TRG ;
00102 LOG(NOTE,"%s: %d: has DATAP within Trigger",name,present) ;
00103 }
00104 else {
00105 LOG(DBG,"%s: not present",name) ;
00106 }
00107
00108
00109
00110 return present ;
00111
00112 }
00113
00114 daq_dta *daq_btow::get(const char *bank, int c1, int c2, int c3, void *p1, void *p2)
00115 {
00116 Make() ;
00117 if(!present) return 0 ;
00118
00119
00120 if(strcasecmp(bank,"raw") == 0) {
00121 return handle_raw() ;
00122 }
00123 else if(strcasecmp(bank,"adc") == 0) {
00124 return handle_adc() ;
00125 }
00126 else {
00127 LOG(ERR,"%s: unknown bank \"%s\"",name,bank) ;
00128 return 0 ;
00129 }
00130
00131 }
00132
00133
00134 daq_dta *daq_btow::handle_raw()
00135 {
00136 char *from, *st ;
00137 int bytes ;
00138 char str[256] ;
00139 char *full_name = "?" ;
00140
00141 from = 0 ;
00142 full_name = "?" ;
00143
00144 assert(caller) ;
00145
00146
00147 if(present & DET_PRESENT_DATAP) {
00148 char *mem = (char *) legacyDetp(rts_id, caller->mem) ;
00149 from = emc_single_reader(mem, &bytes, rts_id) ;
00150 if(from == 0) return 0 ;
00151
00152 }
00153 else if(present & DET_PRESENT_TRG) {
00154 from = getEmcTrgData(caller->mem,1,&bytes) ;
00155 if(from == 0) return 0 ;
00156
00157 }
00158 else {
00159 sprintf(str,"%s/sec%02d/rb%02d/raw",sfs_name,1,1) ;
00160 full_name = caller->get_sfs_name(str) ;
00161 if(!full_name) return 0 ;
00162
00163 bytes = caller->sfs->fileSize(full_name) ;
00164
00165 }
00166
00167 raw->create(bytes,"btow_raw",rts_id,DAQ_DTA_STRUCT(char)) ;
00168 st = (char *) raw->request(bytes) ;
00169
00170 if(present & DET_PRESENT_SFS) {
00171 int ret = caller->sfs->read(full_name, st, bytes) ;
00172 if(ret != bytes) {
00173 LOG(ERR,"ret is %d") ;
00174 }
00175 }
00176 else {
00177 assert(from) ;
00178 memcpy(st, from, bytes) ;
00179 }
00180
00181 raw->finalize(bytes,1,1,0) ;
00182 raw->rewind() ;
00183
00184 LOG(DBG,"Returning raw bank...") ;
00185 return raw ;
00186 }
00187
00188
00189 daq_dta *daq_btow::handle_adc()
00190 {
00191 u_short *raw_dta ;
00192
00193 LOG(DBG,"Entering adc") ;
00194
00195 daq_dta *dd = handle_raw() ;
00196
00197 LOG(DBG,"raw bank %p",dd) ;
00198
00199 if(dd && dd->iterate()) {
00200 raw_dta = (u_short *) dd->Byte ;
00201 }
00202 else {
00203 return 0 ;
00204 }
00205
00206
00207 LOG(DBG,"Got raw bank, on to adc...") ;
00208
00209 adc->create(1,"adc", rts_id, DAQ_DTA_STRUCT(btow_t)) ;
00210
00211 btow_t *btow_p = (btow_t *) adc->request(1) ;
00212
00213
00214
00215
00216
00217
00218
00219 u_short *data = (u_short *)((char *)raw_dta + 4 + 128) ;
00220
00221
00222
00223 #if 0
00224 u_short *ppp = (u_short *) raw_dta ;
00225 for(int i=0;i<10;i++) {
00226 LOG(TERR,"%d: 0x%04X",i,ppp[i]) ;
00227 }
00228 #endif
00229
00230 for(int j=0;j<BTOW_PRESIZE;j++) {
00231 for(int i=0;i<BTOW_MAXFEE;i++) {
00232 btow_p->preamble[i][j] = l2h16(*data++) ;
00233 }
00234 }
00235
00236 for(int j=0;j<BTOW_DATSIZE;j++) {
00237 for(int i=0;i<BTOW_MAXFEE;i++) {
00238 btow_p->adc[i][j] = l2h16(*data++) ;
00239 }
00240 }
00241
00242
00243 adc->finalize(1,1,1,0) ;
00244 adc->rewind() ;
00245
00246 return adc ;
00247 }
00248
00249
00250 int daq_btow::get_l2(char *addr, int words, struct daq_trg_word *trg, int rdo)
00251 {
00252 const int BTOW_DDL_BYTES = 9972 ;
00253 int buff_bytes = words * 4 ;
00254 int rdo1 = rdo ;
00255 int tcou = 0 ;
00256
00257 u_short *us = (u_short *)addr ;
00258
00259 u_short t_hi = l2h16(us[2]) ;
00260 u_short t_lo = l2h16(us[3]) ;
00261
00262 int err = 0 ;
00263
00264 if(buff_bytes != BTOW_DDL_BYTES) {
00265 err |= 1 ;
00266 LOG(ERR,"Received %d bytes, expect %d!?",buff_bytes,BTOW_DDL_BYTES) ;
00267 }
00268
00269 if((t_lo & 0xFF00) || (t_hi & 0xFFF0)) {
00270 err |= 1 ;
00271 LOG(ERR,"Corrupt token: t_hi 0x%04X, t_lo 0x%04X",t_hi,t_lo) ;
00272
00273
00274 t_lo &= 0xFF ;
00275 t_hi &= 0xF ;
00276
00277 }
00278
00279
00280
00281 trg[tcou].t = t_hi*256 + t_lo ;
00282 trg[tcou].daq = 0 ;
00283 trg[tcou].trg = 4 ;
00284 trg[tcou].rhic = l2h16(us[4]) ;
00285 tcou++ ;
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296 if(us[0] != 0xF) {
00297 err |= 1 ;
00298 LOG(ERR,"trg cmd not 15 == 0x%04X",us[0]) ;
00299 }
00300
00301 if(trg[0].t == 0) {
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315 err |= 1 ;
00316 LOG(ERR,"token 0!") ;
00317
00318 }
00319
00320 if(err) {
00321 LOG(WARN,"RDO %d: 0x%04X 0x%04X 0x%04X 0x%04X 0x%04X",rdo1, us[0],us[1],us[2],us[3],us[4]) ;
00322
00323 }
00324
00325 if(err & 1) {
00326 return -1 ;
00327 }
00328
00329 return tcou ;
00330
00331
00332
00333 }
00334