00001 #include <sys/types.h>
00002 #include <errno.h>
00003 #include <assert.h>
00004
00005 #include <rtsLog.h>
00006 #include <rtsSystems.h>
00007
00008
00009
00010 #include <SFS/sfs_index.h>
00011 #include <DAQ_READER/daqReader.h>
00012 #include <DAQ_READER/daq_dta.h>
00013
00014
00015 #include "daq_esmd.h"
00016
00017 int esmd_crate_map[] = {
00018 0x40, 0x41, 0x42, 0x43,
00019 0x44, 0x45, 0x46, 0x47,
00020 0x48, 0x49, 0x4a, 0x4b,
00021 0x4c, 0x4d, 0x4e, 0x4f,
00022 0x50, 0x51, 0x52, 0x53,
00023 0x54, 0x55, 0x56, 0x57,
00024 0x58, 0x59, 0x5a, 0x5b,
00025 0x5c, 0x5d, 0x5e, 0x5f,
00026 0x60, 0x61, 0x62, 0x63,
00027 0x64, 0x65, 0x66, 0x67,
00028 0x68, 0x69, 0x6a, 0x6b,
00029 0x6c, 0x6d, 0x6e, 0x6f
00030 };
00031
00032 const char *daq_esmd::help_string = "ESMD\n\
00033 adc returns esmd_t;\n\
00034 raw returns raw data\n" ;
00035
00036 class daq_det_esmd_factory : public daq_det_factory
00037 {
00038 public:
00039 daq_det_esmd_factory() {
00040 daq_det_factory::det_factories[ESMD_ID] = this ;
00041 }
00042
00043 daq_det *create() {
00044 return new daq_esmd ;
00045 }
00046 } ;
00047
00048 static daq_det_esmd_factory esmd_factory ;
00049
00050
00051 daq_esmd::daq_esmd(daqReader *rts_caller)
00052 {
00053 rts_id = ESMD_ID ;
00054 name = rts2name(rts_id) ;
00055 sfs_name = "esmd" ;
00056 caller = rts_caller ;
00057
00058 if(caller) caller->insert(this, rts_id) ;
00059
00060 raw = new daq_dta ;
00061 adc = new daq_dta ;
00062
00063 LOG(DBG,"%s: constructor: caller %p",name,rts_caller) ;
00064 return ;
00065 }
00066
00067 daq_esmd::~daq_esmd()
00068 {
00069 LOG(DBG,"%s: DEstructor",name) ;
00070
00071 delete raw ;
00072 delete adc ;
00073
00074 return ;
00075 }
00076
00077
00078
00079 daq_dta *daq_esmd::get(const char *bank, int sec, int row, int pad, void *p1, void *p2)
00080 {
00081 Make() ;
00082 if(present == 0) return 0 ;
00083
00084
00085 if(strcasecmp(bank,"raw")==0) {
00086 return handle_raw() ;
00087 }
00088 else if(strcasecmp(bank,"adc")==0) {
00089 return handle_adc() ;
00090 }
00091
00092
00093 LOG(ERR,"%s: unknown bank type \"%s\"",name,bank) ;
00094 return 0 ;
00095 }
00096
00097
00098
00099 daq_dta *daq_esmd::handle_raw()
00100 {
00101 char *from , *st ;
00102 int bytes ;
00103
00104 assert(caller) ;
00105
00106
00107
00108 if(!present) {
00109 LOG(ERR,"%s: not present?",name) ;
00110 return 0 ;
00111 }
00112 else {
00113 LOG(DBG,"%s: present %d",name,present) ;
00114 }
00115
00116 if(present & DET_PRESENT_DATAP) {
00117 char *mem = (char *)legacyDetp(rts_id, caller->mem) ;
00118 from = emc_single_reader(mem, &bytes, rts_id) ;
00119 if(from == 0) return 0 ;
00120
00121
00122 raw->create(bytes,"esmd_raw",rts_id,DAQ_DTA_STRUCT(char)) ;
00123 st = (char *) raw->request(bytes) ;
00124
00125
00126
00127 memcpy(st, from, bytes) ;
00128
00129 }
00130 else {
00131 char str[256] ;
00132 char *full_name ;
00133
00134 sprintf(str,"%s/sec%02d/rb%02d/raw",sfs_name, 1, 1) ;
00135 full_name = caller->get_sfs_name(str) ;
00136
00137 if(!full_name) return 0 ;
00138
00139 bytes = caller->sfs->fileSize(full_name) ;
00140
00141 raw->create(bytes,"esmd_raw",rts_id,DAQ_DTA_STRUCT(char)) ;
00142 st = (char *) raw->request(bytes) ;
00143
00144 int ret = caller->sfs->read(str, st, bytes) ;
00145 if(ret != bytes) {
00146 LOG(ERR,"ret is %d") ;
00147 }
00148 }
00149
00150
00151 raw->finalize(bytes,1,1,0) ;
00152 raw->rewind() ;
00153
00154 return raw ;
00155
00156 }
00157
00158
00159
00160 daq_dta *daq_esmd::handle_adc()
00161 {
00162 u_short *raw_dta ;
00163
00164 daq_dta *dd = handle_raw() ;
00165
00166 LOG(DBG,"%s: got raw %p",name,dd) ;
00167
00168 if(dd && dd->iterate()) {
00169 raw_dta = (u_short *) dd->Byte ;
00170 }
00171 else {
00172 return 0 ;
00173 }
00174
00175 adc->create(1,"esmd_adc", rts_id, DAQ_DTA_STRUCT(esmd_t)) ;
00176
00177 esmd_t *esmd_p = (esmd_t *) adc->request(1) ;
00178
00179
00180
00181 u_short *data = (u_short *)((char *)raw_dta + 128) ;
00182
00183 if(present & DET_PRESENT_DATAP) {
00184 data += 2 ;
00185 }
00186
00187
00188 memset(esmd_p,0,sizeof(esmd_t)) ;
00189
00190
00191
00192 int max_fee ;
00193 if(raw->ncontent < (48*192)) {
00194 max_fee = 30 ;
00195 }
00196 else {
00197 max_fee = 48 ;
00198 }
00199
00200
00201
00202
00203 for(int j=0;j<ESMD_PRESIZE;j++) {
00204 for(int i=0;i<max_fee;i++) {
00205 esmd_p->preamble[i][j] = l2h16(*data++) ;
00206 }
00207 }
00208
00209 for(int j=0;j<ESMD_DATSIZE;j++) {
00210 for(int i=0;i<max_fee;i++) {
00211 esmd_p->adc[i][j] = l2h16(*data++) ;
00212 }
00213 }
00214
00215
00216
00217 adc->finalize(1,1,1,0) ;
00218
00219 adc->rewind() ;
00220
00221 return adc ;
00222 }
00223
00224
00225 int daq_esmd::get_l2(char *buff, int buff_words, struct daq_trg_word *trg, int rdo1)
00226 {
00227 const int ESMD_DDL_BYTES = 18948 ;
00228 int buff_bytes = buff_words * 4 ;
00229
00230 u_short *us = (u_short *)buff ;
00231
00232 u_short t_hi = l2h16(us[2]) ;
00233 u_short t_lo = l2h16(us[3]) ;
00234
00235 int err = 0 ;
00236
00237 if(buff_bytes != ESMD_DDL_BYTES) {
00238 err |= 1 ;
00239 LOG(ERR,"Received %d bytes, expect %d!?",buff_bytes,ESMD_DDL_BYTES) ;
00240 }
00241
00242 if((t_lo & 0xFF00) || (t_hi & 0xFFF0)) {
00243 err |= 1 ;
00244 LOG(ERR,"Corrupt token: t_hi 0x%04X, t_lo 0x%04X",t_hi,t_lo) ;
00245
00246
00247 t_lo &= 0xFF ;
00248 t_hi &= 0xF ;
00249
00250 }
00251
00252
00253
00254 trg[0].t = t_hi*256 + t_lo ;
00255 trg[0].daq = 0 ;
00256 trg[0].trg = 4 ;
00257 trg[0].rhic = l2h16(us[4]) ;
00258
00259
00260 if(us[0] != 0xF) {
00261 err |= 1 ;
00262 LOG(ERR,"trg cmd not 15 == 0x%04X",us[0]) ;
00263 }
00264
00265 if(trg[0].t == 0) {
00266 err |= 1 ;
00267 LOG(ERR,"token 0!") ;
00268 }
00269
00270 if(err) {
00271 LOG(WARN,"RDO %d: 0x%04X 0x%04X 0x%04X 0x%04X 0x04X",rdo1, us[0],us[1],us[2],us[3],us[4]) ;
00272
00273 }
00274
00275 if(err & 1) {
00276 return -1 ;
00277 }
00278
00279 return 1 ;
00280 }