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_trg.h"
00013
00014
00015 const char *daq_trg::help_string = "TRG tst\n" ;
00016
00017 class daq_det_trg_factory : public daq_det_factory
00018 {
00019 public:
00020 daq_det_trg_factory() {
00021 daq_det_factory::det_factories[TRG_ID] = this ;
00022 }
00023
00024 daq_det *create() {
00025 return new daq_trg ;
00026 }
00027 } ;
00028
00029 static daq_det_trg_factory trg_factory ;
00030
00031
00032 extern int trg_reader(char *m, struct trg_t *trg, u_int driver, u_int daqbits) ;
00033 extern char *trg_find_raw(char *m, int *bytes);
00034
00035 daq_trg::daq_trg(daqReader *rts_caller) : daq_det(rts_caller)
00036 {
00037 LOG(DBG,"TRG: rts_id %d, name %s, caller %p",rts_id,name,caller) ;
00038
00039
00040 rts_id = TRG_ID ;
00041 name = rts2name(rts_id) ;
00042 sfs_name = "trg" ;
00043
00044 caller = rts_caller ;
00045 if(caller) caller->insert(this, rts_id) ;
00046
00047 legacy = new daq_dta ;
00048 raw = new daq_dta ;
00049
00050 LOG(DBG,"%s: constructor: caller %p",name,caller) ;
00051 }
00052
00053 daq_trg::~daq_trg()
00054 {
00055 LOG(DBG,"%s: destructor",name) ;
00056
00057 delete legacy ;
00058 delete raw ;
00059
00060 return ;
00061 }
00062
00063
00064 daq_dta *daq_trg::get(const char *bank, int c1, int c2, int c3, void *p1, void *p2)
00065 {
00066 Make() ;
00067 if(!present) return 0 ;
00068
00069 if(strcmp(bank,"*")==0) bank = "legacy" ;
00070
00071 if(strcasecmp(bank,"legacy") == 0) {
00072 return handle_legacy() ;
00073 }
00074 else if(strcasecmp(bank,"raw") == 0) {
00075 return handle_raw() ;
00076 }
00077 else {
00078 LOG(ERR,"%s: unknown bank %s",name,bank) ;
00079 }
00080
00081 return 0 ;
00082
00083 }
00084
00085
00086 daq_dta *daq_trg::handle_legacy()
00087 {
00088
00089 if(!(present & DET_PRESENT_DATAP)) {
00090 LOG(NOTE,"%s: can't have legacy without DATAP (post FY08), yet...",name) ;
00091 return 0 ;
00092 }
00093
00094
00095 legacy->create(1,"trg_t",rts_id,DAQ_DTA_STRUCT(trg_t)) ;
00096
00097
00098 trg_t *trg_p = (trg_t *) legacy->request(1) ;
00099
00100
00101 trg_reader(caller->mem, trg_p, m_Debug,caller->daqbits) ;
00102
00103
00104 trg_p->daqbits = caller->daqbits ;
00105
00106 legacy->finalize(1,0,0,0) ;
00107 legacy->rewind() ;
00108
00109 return legacy ;
00110 }
00111
00112 daq_dta *daq_trg::handle_raw()
00113 {
00114 int err = 0 ;
00115 int bytes = 0 ;
00116 char *ptr = 0 ;
00117 char str[256] ;
00118 char *full_name ;
00119 int ret ;
00120
00121 if(present & DET_PRESENT_DATAP) {
00122 ptr = trg_find_raw(caller->mem, &bytes) ;
00123
00124 LOG(DBG,"%s: raw from DATAP: %d bytes",name,bytes) ;
00125
00126 if((ptr == 0) || (bytes == 0)) {
00127 err = 1 ;
00128 goto ret_error ;
00129 }
00130
00131
00132 raw->create(bytes,"trg_raw",rts_id,DAQ_DTA_STRUCT(char)) ;
00133
00134 char *where = (char *) raw->request(bytes) ;
00135 memcpy(where, ptr, bytes) ;
00136
00137
00138
00139 }
00140 else {
00141 sprintf(str,"%s",sfs_name) ;
00142 full_name = caller->get_sfs_name(str) ;
00143
00144 if(!full_name) {
00145 err = 2 ;
00146 goto ret_error ;
00147 }
00148
00149 bytes = caller->sfs->fileSize(full_name) ;
00150 if(bytes <= 0) {
00151 err = 3 ;
00152 goto ret_error ;
00153 }
00154
00155 LOG(DBG,"%s(%s): full_name %s, bytes %d",name,sfs_name,full_name,bytes) ;
00156
00157 raw->create(bytes,"trg_raw",rts_id,DAQ_DTA_STRUCT(char)) ;
00158
00159 ptr = (char *) raw->request(bytes) ;
00160
00161 ret = caller->sfs->read(full_name, ptr, bytes) ;
00162 if(ret != bytes) {
00163 err = 3 ;
00164 goto ret_error ;
00165 }
00166
00167 }
00168
00169
00170 raw->finalize(bytes,0,0,0) ;
00171 raw->rewind() ;
00172 return raw ;
00173
00174 ret_error:;
00175
00176 LOG(ERR,"%s: handle_raw: error %d",name,err) ;
00177 return 0 ;
00178 }