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_hlt.h"
00016
00017
00018 const char *daq_hlt::help_string = "HLT\n\
00019 tpx returns TPX SL3;\n\
00020 trg returns TRG SL3;\n" ;
00021
00022 class daq_det_hlt_factory : public daq_det_factory
00023 {
00024 public:
00025 daq_det_hlt_factory() {
00026 daq_det_factory::pseudo_factories[L3_ID] = this ;
00027 }
00028
00029 daq_det *create() {
00030 return new daq_hlt ;
00031 }
00032 } ;
00033
00034 static daq_det_hlt_factory hlt_factory ;
00035
00036
00037 daq_hlt::daq_hlt(daqReader *rts_caller)
00038 {
00039 rts_id = -L3_ID ;
00040
00041 name = "hlt" ;
00042 sfs_name = "hlt" ;
00043 caller = rts_caller ;
00044
00045 if(caller) {
00046 caller->insert(this, rts_id) ;
00047 }
00048
00049 tpx = new daq_dta ;
00050 tof = new daq_dta ;
00051 trg = new daq_dta ;
00052 gl3 = new daq_dta ;
00053
00054 LOG(DBG,"%s: constructor: caller %p",name,rts_caller) ;
00055 return ;
00056 }
00057
00058 daq_hlt::~daq_hlt()
00059 {
00060 LOG(DBG,"%s: DEstructor",name) ;
00061
00062 delete tpx ;
00063 delete tof ;
00064 delete trg ;
00065 delete gl3 ;
00066
00067 return ;
00068 }
00069
00070
00071
00072 daq_dta *daq_hlt::get(const char *bank, int sec, int rdo, int pad, void *p1, void *p2)
00073 {
00074 Make() ;
00075 if(present == 0) return 0 ;
00076
00077
00078 if(strcasecmp(bank,"tpx")==0) {
00079 return handle_tpx(sec) ;
00080 }
00081 else if(strcasecmp(bank,"trg")==0) {
00082 return handle_trg() ;
00083 }
00084 else if(strcasecmp(bank,"tof")==0) {
00085 return handle_tof() ;
00086 }
00087 else if(strncasecmp(bank,"gl3",3)==0) {
00088 return handle_gl3(sec, bank) ;
00089 }
00090
00091
00092 LOG(ERR,"%s: unknown bank type \"%s\"",name,bank) ;
00093 return 0 ;
00094 }
00095
00096
00097
00098 daq_dta *daq_hlt::handle_tpx(int sec)
00099 {
00100 char *st ;
00101 int s_start, s_stop ;
00102 int bytes ;
00103
00104 assert(caller) ;
00105
00106 if(!present) {
00107 LOG(ERR,"%s: not present?",name) ;
00108 return 0 ;
00109 }
00110 else {
00111 LOG(DBG,"%s: present %d",name,present) ;
00112 }
00113
00114 if(sec<=0) {
00115 s_start = 1 ;
00116 s_stop = 24 ;
00117 }
00118 else {
00119 s_start = s_stop = sec ;
00120 }
00121
00122
00123 for(int s=s_start;s<=s_stop;s++) {
00124 char str[256] ;
00125 char *full_name ;
00126
00127 sprintf(str,"%s/tpx/sec%02d/sl3",sfs_name, sec) ;
00128 full_name = caller->get_sfs_name(str) ;
00129
00130 if(!full_name) return 0 ;
00131 bytes = caller->sfs->fileSize(full_name) ;
00132
00133 tpx->create(bytes,"hlt_tpx",rts_id,DAQ_DTA_STRUCT(char)) ;
00134 st = (char *) tpx->request(bytes) ;
00135
00136 int ret = caller->sfs->read(str, st, bytes) ;
00137 if(ret != bytes) {
00138 LOG(ERR,"ret is %d") ;
00139 }
00140
00141 tpx->finalize(bytes,s,1,0) ;
00142 }
00143
00144
00145 tpx->rewind() ;
00146
00147 return tpx ;
00148
00149 }
00150
00151 daq_dta *daq_hlt::handle_trg()
00152 {
00153 char *st ;
00154 int bytes ;
00155
00156 assert(caller) ;
00157
00158 if(!present) {
00159 LOG(ERR,"%s: not present?",name) ;
00160 return 0 ;
00161 }
00162 else {
00163 LOG(DBG,"%s: present %d",name,present) ;
00164 }
00165
00166 char str[256] ;
00167 char *full_name ;
00168
00169 sprintf(str,"%s/trg/sec%02d/sl3",sfs_name, 1) ;
00170 full_name = caller->get_sfs_name(str) ;
00171
00172 if(!full_name) return 0 ;
00173 bytes = caller->sfs->fileSize(full_name) ;
00174
00175 trg->create(bytes,"hlt_trg",rts_id,DAQ_DTA_STRUCT(char)) ;
00176 st = (char *) trg->request(bytes) ;
00177
00178 int ret = caller->sfs->read(str, st, bytes) ;
00179 if(ret != bytes) {
00180 LOG(ERR,"ret is %d") ;
00181 }
00182
00183 trg->finalize(bytes,1,1,0) ;
00184
00185 trg->rewind() ;
00186
00187 return trg ;
00188
00189 }
00190
00191 daq_dta *daq_hlt::handle_tof()
00192 {
00193 char *st ;
00194 int bytes ;
00195
00196 assert(caller) ;
00197
00198 if(!present) {
00199 LOG(ERR,"%s: not present?",name) ;
00200 return 0 ;
00201 }
00202 else {
00203 LOG(DBG,"%s: present %d",name,present) ;
00204 }
00205
00206 char str[256] ;
00207 char *full_name ;
00208
00209 sprintf(str,"%s/tof/sec%02d/sl3",sfs_name, 1) ;
00210 full_name = caller->get_sfs_name(str) ;
00211
00212 if(!full_name) return 0 ;
00213 bytes = caller->sfs->fileSize(full_name) ;
00214
00215 tof->create(bytes,"hlt_tof",rts_id,DAQ_DTA_STRUCT(char)) ;
00216 st = (char *) tof->request(bytes) ;
00217
00218 int ret = caller->sfs->read(str, st, bytes) ;
00219 if(ret != bytes) {
00220 LOG(ERR,"ret is %d") ;
00221 }
00222
00223 tof->finalize(bytes,1,1,0) ;
00224
00225 tof->rewind() ;
00226
00227 return tof ;
00228
00229 }
00230
00231 daq_dta *daq_hlt::handle_gl3(int sec, const char *bank)
00232 {
00233 char *st ;
00234 int bytes ;
00235 int cou = 0 ;
00236
00237 assert(caller) ;
00238
00239 if(!present) {
00240 LOG(ERR,"%s: not present?",name) ;
00241 return 0 ;
00242 }
00243 else {
00244 LOG(DBG,"%s: sec %d, bank %s: present %d",name,sec,bank,present) ;
00245 }
00246
00247 char str[256] ;
00248 char *full_name ;
00249
00250 sprintf(str,"%s/gl3",sfs_name) ;
00251 full_name = caller->get_sfs_name(str) ;
00252
00253 LOG(DBG,"Trying 1: %s: got %s",str,full_name) ;
00254
00255 if(!full_name) {
00256 sprintf(str,"%s/gl3/sec%02d",sfs_name, 1) ;
00257 full_name = caller->get_sfs_name(str) ;
00258
00259 LOG(DBG,"Trying 2: %s: got %s",str,full_name) ;
00260 if(!full_name) return 0 ;
00261 }
00262
00263
00264 bytes = caller->sfs->fileSize(full_name) ;
00265
00266 gl3->create(1024,"hlt_gl3",rts_id,DAQ_DTA_STRUCT(char)) ;
00267
00268 fs_dir *dir = caller->sfs->opendir(full_name) ;
00269 if(dir==0) return 0 ;
00270
00271 fs_dirent *entry ;
00272 while((entry = caller->sfs->readdir(dir))) {
00273
00274 bytes = caller->sfs->fileSize(entry->full_name) ;
00275 if(bytes == 0) {
00276 LOG(WARN,"%s: 0 bytes?",entry->full_name) ;
00277 continue ;
00278 }
00279
00280 cou++ ;
00281
00282 LOG(DBG,"%d: %s %s %d",cou,entry->full_name,entry->d_name,bytes) ;
00283
00284 st = (char *) gl3->request(bytes+sizeof(hlt_gl3_t)) ;
00285
00286 ((hlt_gl3_t *)st)->buff = st + sizeof(hlt_gl3_t) ;
00287 ((hlt_gl3_t *)st)->bytes = bytes ;
00288 char *yada = ((hlt_gl3_t *)st)->name ;
00289 strncpy(yada,entry->d_name,32) ;
00290
00291
00292 int ret = caller->sfs->read(entry->full_name, st+sizeof(hlt_gl3_t), bytes) ;
00293 if(ret != bytes) {
00294 LOG(ERR,"ret is %d") ;
00295 }
00296
00297 gl3->finalize(bytes+sizeof(hlt_gl3_t),cou,1,0) ;
00298
00299 }
00300
00301 gl3->rewind() ;
00302
00303 return gl3 ;
00304
00305 }
00306
00307
00308