00001 #include <sys/types.h>
00002 #include <string.h>
00003
00004 #include <rtsLog.h>
00005 #include <rtsSystems.h>
00006 #include <daqFormats.h>
00007
00008 #include <SFS/sfs_index.h>
00009 #include <DAQ_READER/daqReader.h>
00010 #include <DAQ_READER/daq_dta.h>
00011
00012 #include "daq_sc.h"
00013
00014 extern int sc_reader(char *m, struct sc_t *sc, u_int driver) ;
00015
00016
00017 class daq_det_sc_factory : public daq_det_factory
00018 {
00019 public:
00020 daq_det_sc_factory() {
00021
00022 daq_det_factory::det_factories[SC_ID] = this ;
00023 }
00024
00025 daq_det *create() {
00026
00027 return new daq_sc ;
00028 }
00029 } ;
00030
00031 static daq_det_sc_factory sc_factory ;
00032
00033
00034
00035 const char *daq_sc::help_string = "SC tst\n" ;
00036
00037
00038
00039 daq_sc::daq_sc(daqReader *rts_caller) : daq_det(rts_caller)
00040 {
00041 LOG(DBG,"SC: rts_id %d, name %s",rts_id,name) ;
00042
00043
00044 rts_id = SC_ID ;
00045 name = rts2name(rts_id) ;
00046 sfs_name = "scd" ;
00047
00048 caller = rts_caller ;
00049
00050 if(caller) caller->insert(this, rts_id) ;
00051
00052 legacy = new daq_dta ;
00053 raw = new daq_dta ;
00054
00055 LOG(DBG,"%s: constructor: caller %p",name,caller) ;
00056 }
00057
00058 daq_sc::~daq_sc()
00059 {
00060 LOG(DBG,"%s: destructor",name) ;
00061
00062 delete legacy ;
00063 delete raw ;
00064
00065 return ;
00066 }
00067
00068
00069 daq_dta *daq_sc::get(const char *bank, int c1, int c2, int c3, void *p1, void *p2)
00070 {
00071 Make() ;
00072 if(!present) return 0 ;
00073
00074
00075 if(!bank || strcmp(bank,"*")==0) bank = "legacy" ;
00076
00077 if(strcasecmp(bank,"legacy") == 0) {
00078 return handle_legacy() ;
00079 }
00080 else if(strcasecmp(bank,"raw") == 0) {
00081 return handle_raw() ;
00082 }
00083
00084 LOG(ERR,"%s: unknown bank %s",name,bank) ;
00085 return 0 ;
00086
00087
00088 }
00089
00090
00091 daq_dta *daq_sc::handle_raw()
00092 {
00093 int err = 0 ;
00094 char *local_store = 0 ;
00095 int ret ;
00096 char str[256] ;
00097 char *full_name ;
00098 int bytes ;
00099
00100 if(!(present & DET_PRESENT_SFS)) return 0 ;
00101
00102
00103
00104 sprintf(str,"%s",sfs_name) ;
00105 full_name = caller->get_sfs_name(str) ;
00106
00107 if(!full_name) {
00108 err = 1 ;
00109 goto ret_error ;
00110 }
00111
00112 bytes = caller->sfs->fileSize(full_name) ;
00113 if(bytes <= 0) {
00114 err = 2 ;
00115 goto ret_error ;
00116 }
00117
00118 raw->create(bytes,"sc_raw",rts_id,DAQ_DTA_STRUCT(char)) ;
00119
00120 local_store = (char *) raw->request(bytes) ;
00121
00122 ret = caller->sfs->read(str, local_store, bytes) ;
00123 if(ret != bytes) {
00124 err = 3 ;
00125 goto ret_error ;
00126 }
00127
00128
00129 raw->finalize(bytes,0,0,0) ;
00130 raw->rewind() ;
00131
00132 return raw ;
00133
00134 ret_error:;
00135
00136 LOG(ERR,"%s: handle_raw: error %d",name,err) ;
00137 return 0 ;
00138
00139 }
00140
00141 daq_dta *daq_sc::handle_legacy()
00142 {
00143
00144 int err = 0 ;
00145
00146
00147
00148 legacy->create(1,"sc_t",rts_id,DAQ_DTA_STRUCT(sc_t)) ;
00149
00150
00151 sc_t *sc_p = (sc_t *) legacy->request(1) ;
00152
00153
00154 if(present & DET_PRESENT_DATAP) {
00155 sc_reader(caller->mem, sc_p, m_Debug) ;
00156 }
00157 else {
00158 daq_dta *dd = handle_raw() ;
00159
00160 if(dd==0) {
00161 err = 1 ;
00162 goto ret_error ;
00163 }
00164
00165 dd->iterate() ;
00166
00167
00168 struct SCD *scd = (struct SCD *) dd->Void ;
00169
00170 int swapit = 0 ;
00171 if(scd->bh.byte_order != DAQ_RAW_FORMAT_ORDER) {
00172 swapit = 1 ;
00173 }
00174
00175 LOG(DBG,"Need to swap SCD(sfs) %d?",swapit) ;
00176
00177 sc_p->time = qswap32(swapit,scd->time) ;
00178
00179 u_int tmp_f = qswap32(swapit,scd->mag_field) ;
00180 memcpy(&(sc_p->mag_field),&tmp_f,4) ;
00181
00182
00183 sc_p->timelag = 0 ;
00184 sc_p->valid = 1 ;
00185
00186 for(u_int i=0;i<(sizeof(sc_p->rich_scalers)/4);i++) {
00187 sc_p->rich_scalers[i] = qswap32(swapit, scd->rich_scalers[i]) ;
00188 }
00189
00190 }
00191
00192 legacy->finalize(1,0,0,0) ;
00193 legacy->rewind() ;
00194
00195 return legacy ;
00196
00197 ret_error :;
00198
00199 LOG(ERR,"%s: handle_legacy: error %d",name,err) ;
00200
00201 return 0 ;
00202 }