00001 #include <sys/types.h>
00002 #include <string.h>
00003
00004 #include <rtsLog.h>
00005 #include <rtsSystems.h>
00006
00007 #include <DAQ_READER/daqReader.h>
00008 #include <DAQ_READER/daq_dta.h>
00009
00010 #include "daq_emc.h"
00011
00012 #include <DAQ_BTOW/daq_btow.h>
00013 #include <DAQ_ETOW/daq_etow.h>
00014 #include <DAQ_ESMD/daq_esmd.h>
00015 #include <DAQ_BSMD/daq_bsmd.h>
00016
00017 const char *daq_emc::help_string = "EMC tst\n" ;
00018
00019 class daq_det_emc_factory : public daq_det_factory
00020 {
00021 public:
00022 daq_det_emc_factory() {
00023 daq_det_factory::pseudo_factories[BTOW_ID] = this ;
00024 }
00025
00026 daq_det *create() {
00027 return new daq_emc ;
00028 }
00029 } ;
00030
00031 static daq_det_emc_factory emc_factory ;
00032
00033
00034
00035 daq_emc::daq_emc(daqReader *rts_caller)
00036 {
00037 LOG(WARN,"Using EMC_LEGACY is deprecated! Rather use the specific readers: BTOW, BSMD, ETOW, ESMD") ;
00038
00039 LOG(DBG,"EMC: rts_id %d, name %s",rts_id,name) ;
00040
00041
00042 rts_id = -BTOW_ID ;
00043 name = sfs_name = "emc_pseudo" ;
00044 caller = rts_caller ;
00045
00046 if(caller) caller->insert(this, rts_id) ;
00047
00048 legacy = new daq_dta ;
00049
00050 LOG(DBG,"%s: constructor: caller %p",name,caller) ;
00051 }
00052
00053 daq_emc::~daq_emc()
00054 {
00055 LOG(DBG,"%s: destructor",name) ;
00056
00057 delete legacy ;
00058
00059 return ;
00060 }
00061
00062 int daq_emc::Make()
00063 {
00064 return 0 ;
00065 }
00066
00067 daq_dta *daq_emc::get(const char *bank, int c1, int c2, int c3, void *p1, void *p2)
00068 {
00069
00070 if(strcmp(bank,"*")==0) bank = "legacy" ;
00071
00072 if(strcasecmp(bank,"legacy") != 0) {
00073 LOG(ERR,"%s: unknown bank %s",name,bank) ;
00074 return 0 ;
00075 }
00076
00077 return handle_legacy() ;
00078
00079 }
00080
00081
00082 daq_dta *daq_emc::handle_legacy()
00083 {
00084 daq_dta *dd ;
00085 int found_some = 0 ;
00086
00087
00088
00089
00090
00091
00092 legacy->create(1,"emc_t",rts_id,DAQ_DTA_STRUCT(emc_t)) ;
00093
00094 emc_t *emc_p = (emc_t *) legacy->request(1) ;
00095
00096 memset(emc_p,0,sizeof(struct emc_t)) ;
00097
00098 emc_p->etow_max_ch = ETOW_MAXFEE * ETOW_DATSIZE ;
00099 emc_p->btow_max_ch = BTOW_MAXFEE * BTOW_DATSIZE ;
00100 emc_p->esmd_max_ch = ESMD_MAXFEE * ESMD_DATSIZE ;
00101 emc_p->bsmd_max_ch = BSMD_FIBERS * BSMD_DATSIZE ;
00102
00103 dd = caller->det("btow")->get("adc") ;
00104 while(dd && dd->iterate()) {
00105 found_some = 1 ;
00106
00107
00108 emc_p->btow_in = 1;
00109
00110 btow_t *d = (btow_t *) dd->Void ;
00111
00112 for(int i=0;i<BTOW_MAXFEE;i++) {
00113 for(int j=0;j<BTOW_PRESIZE;j++) {
00114 emc_p->btow_pre[i][j] = d->preamble[i][j] ;
00115 }
00116 for(int j=0;j<BTOW_DATSIZE;j++) {
00117 if(d->adc[i][j] > 0) emc_p->btow_ch++ ;
00118 emc_p->btow_new[i][j] = d->adc[i][j] ;
00119 }
00120
00121 }
00122
00123 }
00124
00125 dd = caller->det("etow")->get("adc") ;
00126 while(dd && dd->iterate()) {
00127 found_some = 1 ;
00128
00129 emc_p->etow_in = 1;
00130
00131 etow_t *d = (etow_t *) dd->Void ;
00132
00133 for(int i=0;i<ETOW_MAXFEE;i++) {
00134 for(int j=0;j<ETOW_PRESIZE;j++) {
00135 emc_p->etow_pre[i][j] = d->preamble[i][j] ;
00136 }
00137 for(int j=0;j<ETOW_DATSIZE;j++) {
00138 if(d->adc[i][j] > 0) emc_p->etow_ch++ ;
00139 emc_p->etow[i][j] = d->adc[i][j] ;
00140 }
00141
00142 }
00143
00144
00145 }
00146
00147 dd = caller->det("esmd")->get("adc") ;
00148 while(dd && dd->iterate()) {
00149 found_some = 1 ;
00150
00151 emc_p->esmd_in = 1;
00152 emc_p->esmd_max_fee = ESMD_MAXFEE ;
00153
00154 esmd_t *d = (esmd_t *) dd->Void ;
00155
00156 for(int i=0;i<ESMD_MAXFEE;i++) {
00157 for(int j=0;j<ESMD_PRESIZE;j++) {
00158 emc_p->esmd_pre[i][j] = d->preamble[i][j] ;
00159 }
00160 for(int j=0;j<ESMD_DATSIZE;j++) {
00161 if(d->adc[i][j] > 0) emc_p->esmd_ch++ ;
00162 emc_p->esmd[i][j] = d->adc[i][j] ;
00163 }
00164
00165 }
00166 }
00167
00168
00169
00170
00171 if((dd=caller->det("bsmd")->get("adc_non_zs"))) {
00172 while(dd->iterate()) {
00173 found_some = 1 ;
00174
00175 emc_p->bsmd_in = 1 ;
00176 emc_p->bsmd_raw_in = 1 ;
00177
00178 bsmd_t *d = (bsmd_t *) dd->Void ;
00179
00180 int rdo_ix = dd->rdo - 1 ;
00181 for(int i=0;i<BSMD_DATSIZE;i++) {
00182 if(d->adc[i] > 0) emc_p->bsmd_ch++ ;
00183
00184 emc_p->bsmd[rdo_ix][i] = d->adc[i] ;
00185 }
00186
00187 emc_p->bsmd_cap[rdo_ix] = d->cap ;
00188 }
00189 }
00190 else if((dd=caller->det("bsmd")->get("adc"))) {
00191 while(dd->iterate()) {
00192 found_some = 1 ;
00193
00194 emc_p->bsmd_in = 1 ;
00195 emc_p->bsmd_raw_in = 0 ;
00196
00197 bsmd_t *d = (bsmd_t *) dd->Void ;
00198
00199 int rdo_ix = dd->rdo - 1 ;
00200
00201 for(int i=0;i<BSMD_DATSIZE;i++) {
00202 if(d->adc[i] > 0) emc_p->bsmd_ch++ ;
00203
00204 emc_p->bsmd[rdo_ix][i] = d->adc[i] ;
00205 }
00206
00207 emc_p->bsmd_cap[rdo_ix] = d->cap ;
00208
00209 }
00210 }
00211
00212
00213 legacy->finalize(1,0,0,0) ;
00214 legacy->rewind() ;
00215
00216 if(found_some) return legacy ;
00217 else return 0 ;
00218 }