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
00018 #include "daq_etow.h"
00019
00020
00021 const int etow_crate_map[] = {
00022 0x01, 0x02, 0x03, 0x04, 0x05, 0x06
00023 };
00024
00025
00026 const char *daq_etow::help_string = "ETOW tst\n" ;
00027
00028 class daq_det_etow_factory : public daq_det_factory
00029 {
00030 public:
00031 daq_det_etow_factory() {
00032 daq_det_factory::det_factories[ETOW_ID] = this ;
00033 }
00034
00035 daq_det *create() {
00036 return new daq_etow ;
00037 }
00038 } ;
00039
00040 static daq_det_etow_factory etow_factory ;
00041
00042
00043
00044 daq_etow::daq_etow(daqReader *rts_caller)
00045 {
00046
00047 LOG(DBG,"ETOW: rts_id %d, name %s",rts_id,name) ;
00048
00049
00050 rts_id = ETOW_ID ;
00051 name = rts2name(rts_id) ;
00052 sfs_name = "etow" ;
00053 caller = rts_caller ;
00054 if(caller) caller->insert(this, rts_id) ;
00055
00056 raw = new daq_dta ;
00057 adc = new daq_dta ;
00058
00059 LOG(DBG,"%s: constructor: caller %p",name,caller) ;
00060 }
00061
00062 daq_etow::~daq_etow()
00063 {
00064 LOG(DBG,"%s: destructor",name) ;
00065
00066 delete adc ;
00067 delete raw ;
00068
00069 return ;
00070 }
00071
00072
00073 int daq_etow::Make()
00074 {
00075 int dummy ;
00076
00077 present = 0 ;
00078 assert(caller) ;
00079
00080 evt_num++ ;
00081
00082 LOG(DBG,"%s: Make()",name) ;
00083
00084 if(presence()) {
00085 present |= DET_PRESENT_SFS ;
00086 }
00087 else if(legacyDetp(rts_id, caller->mem)) {
00088 present |= DET_PRESENT_DATAP ;
00089 }
00090 else if(getEmcTrgData(caller->mem,2,&dummy)) {
00091 present |= DET_PRESENT_TRG ;
00092 }
00093
00094 switch(present) {
00095 case DET_PRESENT_DATAP :
00096 LOG(NOTE,"%s: %d: has DATAP",name,evt_num) ;
00097 break ;
00098 case DET_PRESENT_SFS :
00099 LOG(NOTE,"%s: %d: has SFS(%s)",name,evt_num,sfs_name) ;
00100 break ;
00101 case DET_PRESENT_TRG :
00102 LOG(NOTE,"%s: %d: has DATAP within Trigger",name,evt_num) ;
00103 break ;
00104 }
00105
00106 return present ;
00107
00108 }
00109
00110 daq_dta *daq_etow::get(const char *bank, int c1, int c2, int c3, void *p1, void *p2)
00111 {
00112 Make() ;
00113 if(!present) return 0 ;
00114
00115
00116 if(strcasecmp(bank,"raw") == 0) {
00117 return handle_raw() ;
00118 }
00119 else if(strcasecmp(bank,"adc") == 0) {
00120 return handle_adc() ;
00121 }
00122 else {
00123 LOG(ERR,"%s: unknown bank \"%s\"",name,bank) ;
00124 return 0 ;
00125 }
00126
00127 }
00128
00129
00130 daq_dta *daq_etow::handle_raw()
00131 {
00132 char *from, *st ;
00133 int bytes ;
00134
00135 assert(caller) ;
00136
00137
00138
00139 if(present & DET_PRESENT_DATAP) {
00140 char *mem = (char *)legacyDetp(rts_id, caller->mem) ;
00141 from = emc_single_reader(mem, &bytes, rts_id) ;
00142 if(from == 0) return 0 ;
00143
00144 }
00145 else if(present & DET_PRESENT_TRG) {
00146 from = getEmcTrgData(caller->mem,2,&bytes) ;
00147 if(from == 0) return 0 ;
00148 }
00149 else {
00150 char str[256] ;
00151 char *full_name ;
00152
00153 sprintf(str,"%s/sec%02d/rb%02d/raw",sfs_name,1,1) ;
00154
00155
00156 full_name = caller->get_sfs_name(str) ;
00157
00158 LOG(DBG,"%s: %s: %p",name,str,full_name) ;
00159
00160 if(!full_name) return 0 ;
00161
00162 bytes = caller->sfs->fileSize(full_name) ;
00163
00164 LOG(DBG,"ETOW sfs bytes %d",bytes) ;
00165
00166 raw->create(bytes,"raw",rts_id,DAQ_DTA_STRUCT(u_char)) ;
00167
00168 st = (char *) raw->request(bytes) ;
00169
00170 int ret = caller->sfs->read(str, st, bytes) ;
00171 if(ret != bytes) {
00172 LOG(ERR,"ret is %d") ;
00173 }
00174 goto done ;
00175 }
00176
00177 raw->create(bytes,"raw",rts_id,DAQ_DTA_STRUCT(u_char)) ;
00178 st = (char *)raw->request(bytes) ;
00179 memcpy(st, from, bytes) ;
00180
00181 done: ;
00182
00183 raw->finalize(bytes,1,1,0) ;
00184 raw->rewind() ;
00185
00186 LOG(DBG,"Returning raw bank...") ;
00187 return raw ;
00188 }
00189
00190
00191 daq_dta *daq_etow::handle_adc()
00192 {
00193 u_short *raw_dta ;
00194
00195 LOG(DBG,"Entering adc") ;
00196
00197 daq_dta *dd = handle_raw() ;
00198
00199 LOG(DBG,"raw bank %p",dd) ;
00200
00201 if(dd && dd->iterate()) {
00202 raw_dta = (u_short *) dd->Byte ;
00203 }
00204 else {
00205 return 0 ;
00206 }
00207
00208
00209 LOG(DBG,"Got raw bank, on to adc...") ;
00210
00211 adc->create(1,"adc", rts_id, DAQ_DTA_STRUCT(etow_t)) ;
00212
00213 etow_t *etow_p = (etow_t *) adc->request(1) ;
00214
00215
00216
00217 u_short *data = (u_short *)((char *)raw_dta + 4 + 128) ;
00218
00219 for(int j=0;j<ETOW_PRESIZE;j++) {
00220 for(int i=0;i<ETOW_MAXFEE;i++) {
00221 etow_p->preamble[i][j] = l2h16(*data++) ;
00222 }
00223 }
00224
00225 for(int j=0;j<ETOW_DATSIZE;j++) {
00226 for(int i=0;i<ETOW_MAXFEE;i++) {
00227 etow_p->adc[i][j] = l2h16(*data++) ;
00228 }
00229 }
00230
00231
00232 adc->finalize(1,1,1,0) ;
00233 adc->rewind() ;
00234
00235 return adc ;
00236 }
00237
00238 int daq_etow::get_l2(char *addr, int words, struct daq_trg_word *trg, int rdo1)
00239 {
00240 const int ETOW_DDL_BYTES = 2100 ;
00241 int buff_bytes = words * 4 ;
00242
00243 u_short *us = (u_short *)addr ;
00244
00245 u_short t_hi = l2h16(us[2]) ;
00246 u_short t_lo = l2h16(us[3]) ;
00247
00248 int err = 0 ;
00249
00250 if(buff_bytes != ETOW_DDL_BYTES) {
00251 err |= 1 ;
00252 LOG(ERR,"Received %d bytes, expect %d!?",buff_bytes,ETOW_DDL_BYTES) ;
00253 }
00254
00255 if((t_lo & 0xFF00) || (t_hi & 0xFFF0)) {
00256 err |= 1 ;
00257 LOG(ERR,"Corrupt token: t_hi 0x%04X, t_lo 0x%04X",t_hi,t_lo) ;
00258
00259
00260 t_lo &= 0xFF ;
00261 t_hi &= 0xF ;
00262
00263 }
00264
00265
00266
00267 trg[0].t = t_hi*256 + t_lo ;
00268 trg[0].daq = 0 ;
00269 trg[0].trg = 4 ;
00270 trg[0].rhic = l2h16(us[4]) ;
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280 if(us[0] != 0xF) {
00281 err |= 1 ;
00282 LOG(ERR,"trg cmd not 15 == 0x%04X",us[0]) ;
00283 }
00284
00285 if(trg[0].t == 0) {
00286 err |= 1 ;
00287 LOG(ERR,"token 0!") ;
00288 }
00289
00290 if(err) {
00291 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]) ;
00292
00293 }
00294
00295 if(err & 1) {
00296 return -1 ;
00297 }
00298
00299 return 1 ;
00300
00301
00302
00303 }
00304