00001 #include <sys/types.h>
00002 #include <string.h>
00003
00004 #include <rtsLog.h>
00005 #include <rtsSystems.h>
00006
00007 #include <SFS/sfs_index.h>
00008 #include <DAQ_READER/daqReader.h>
00009 #include <DAQ_READER/daq_dta.h>
00010
00011
00012 #include "daq_pmd.h"
00013
00014 extern int pmd_reader(char *m, struct pmd_t *pmd, u_int driver) ;
00015
00016 const char *daq_pmd::help_string = "PMD tst\n" ;
00017
00018 class daq_det_pmd_factory : public daq_det_factory
00019 {
00020 public:
00021 daq_det_pmd_factory() {
00022 daq_det_factory::det_factories[PMD_ID] = this ;
00023 }
00024
00025 daq_det *create() {
00026 return new daq_pmd ;
00027 }
00028 } ;
00029
00030 static daq_det_pmd_factory pmd_factory ;
00031
00032
00033
00034 daq_pmd::daq_pmd(daqReader *rts_caller)
00035 {
00036 LOG(DBG,"PMD: rts_id %d, name %s",rts_id,name) ;
00037
00038
00039 rts_id = PMD_ID ;
00040 name = rts2name(rts_id) ;
00041 sfs_name = "pmd" ;
00042 caller = rts_caller ;
00043 if(caller) caller->insert(this, rts_id) ;
00044
00045 legacy = new daq_dta ;
00046 raw = new daq_dta ;
00047
00048 LOG(DBG,"%s: constructor: caller %p",name,caller) ;
00049 }
00050
00051 daq_pmd::~daq_pmd()
00052 {
00053 LOG(DBG,"%s: destructor",name) ;
00054 if(caller) caller->de_insert(rts_id) ;
00055
00056 delete legacy ;
00057 delete raw ;
00058
00059 return ;
00060 }
00061
00062
00063 daq_dta *daq_pmd::get(const char *bank, int c1, int c2, int c3, void *p1, void *p2)
00064 {
00065 Make() ;
00066 if(!present) return 0 ;
00067
00068 if(strcmp(bank,"*")==0) bank = "legacy" ;
00069
00070 if(strcasecmp(bank,"legacy") == 0) {
00071 return handle_legacy() ;
00072 }
00073
00074 if(strcasecmp(bank,"raw") == 0) {
00075 return handle_raw(c1) ;
00076 }
00077
00078 LOG(ERR,"%s: unknown bank %s",name,bank) ;
00079 return 0 ;
00080
00081
00082 }
00083
00084
00085 daq_dta *daq_pmd::handle_legacy()
00086 {
00087
00088
00089 legacy->create(1,"pmd_t",rts_id,DAQ_DTA_STRUCT(pmd_t)) ;
00090
00091
00092 pmd_t *pmd_p = (pmd_t *) legacy->request(1) ;
00093
00094 LOG(DBG,"PMD: present is %d",present) ;
00095
00096 memset(pmd_p,0,sizeof(pmd_t)) ;
00097
00098 if(present & DET_PRESENT_DATAP) {
00099 pmd_reader(caller->mem, pmd_p, 0) ;
00100 }
00101 else {
00102 for(int s=1;s<=2;s++) {
00103
00104 daq_dta *store = handle_raw(s) ;
00105 if(store && store->iterate()) {
00106 LOG(DBG,"PMD: calling reader with %p for %d",store->Void,s) ;
00107 pmd_reader((char *)store->Void, pmd_p, s) ;
00108 }
00109 }
00110 }
00111
00112 legacy->finalize(1,0,0,0) ;
00113 legacy->rewind() ;
00114
00115 return legacy ;
00116 }
00117
00118
00119 daq_dta *daq_pmd::handle_raw(int sec)
00120 {
00121 char str[256] ;
00122 char *full_name ;
00123 char *st ;
00124 int bytes ;
00125
00126
00127
00128 sprintf(str,"%s/sec%02d/rb%02d/raw",sfs_name,sec,0) ;
00129 full_name = caller->get_sfs_name(str) ;
00130
00131 if(!full_name) return 0 ;
00132
00133
00134 bytes = caller->sfs->fileSize(full_name) ;
00135
00136 raw->create(bytes,"pmd_raw",rts_id,DAQ_DTA_STRUCT(char)) ;
00137 st = (char *) raw->request(bytes) ;
00138
00139 int ret = caller->sfs->read(str,st,bytes) ;
00140 if(ret != bytes) {
00141 LOG(ERR,"PMD: ret is %d",ret) ;
00142 }
00143
00144 raw->finalize(bytes,sec,0,0) ;
00145 raw->rewind() ;
00146
00147 return raw ;
00148 }