00001 #include <sys/types.h>
00002 #include <errno.h>
00003 #include <assert.h>
00004 #include <stdlib.h>
00005
00006 #include <rtsLog.h>
00007 #include <rtsSystems.h>
00008
00009
00010
00011 #include <SFS/sfs_index.h>
00012 #include <DAQ_READER/daqReader.h>
00013 #include <DAQ_READER/daq_dta.h>
00014
00015
00016 #include "daq_gmt.h"
00017
00018
00019 const char *daq_gmt::help_string = "GMT\n\
00020 adc returns gmt_t;\n\
00021 raw returns raw data\n" ;
00022
00023 class daq_det_gmt_factory : public daq_det_factory
00024 {
00025 public:
00026 daq_det_gmt_factory() {
00027 daq_det_factory::det_factories[GMT_ID] = this ;
00028 }
00029
00030 daq_det *create() {
00031 return new daq_gmt ;
00032 }
00033 } ;
00034
00035 static daq_det_gmt_factory gmt_factory ;
00036
00037
00038 daq_gmt::daq_gmt(daqReader *rts_caller)
00039 {
00040 rts_id = GMT_ID ;
00041 name = rts2name(rts_id) ;
00042 sfs_name = "gmt" ;
00043 caller = rts_caller ;
00044
00045 if(caller) caller->insert(this, rts_id) ;
00046
00047 raw = new daq_dta ;
00048
00049 LOG(DBG,"%s: constructor: caller %p",name,rts_caller) ;
00050 return ;
00051 }
00052
00053 daq_gmt::~daq_gmt()
00054 {
00055 LOG(DBG,"%s: DEstructor",name) ;
00056
00057 delete raw ;
00058
00059
00060 return ;
00061 }
00062
00063
00064
00065 daq_dta *daq_gmt::get(const char *bank, int sec, int rdo, int pad, void *p1, void *p2)
00066 {
00067 Make() ;
00068
00069 if(present == 0) return 0 ;
00070
00071
00072 if(strcasecmp(bank,"raw")==0) {
00073 return handle_raw(rdo) ;
00074 }
00075
00076
00077 LOG(ERR,"%s: unknown bank type \"%s\"",name,bank) ;
00078 return 0 ;
00079 }
00080
00081
00082
00083 daq_dta *daq_gmt::handle_raw(int rdo)
00084 {
00085 char *st ;
00086 int r_start, r_stop ;
00087 int bytes ;
00088
00089 assert(caller) ;
00090
00091 if(!present) {
00092 return 0 ;
00093 }
00094 else {
00095 LOG(DBG,"%s: present %d",name,present) ;
00096 }
00097
00098 char str[256] ;
00099 char *full_name ;
00100
00101
00102 if(rdo<=0) {
00103 r_start = 1 ;
00104 r_stop = 1 ;
00105 }
00106 else {
00107 r_start = r_stop = rdo ;
00108 }
00109
00110
00111 raw->create(8*1024,"gmt_raw",rts_id,DAQ_DTA_STRUCT(char)) ;
00112
00113 for(int r=r_start;r<=r_stop;r++) {
00114 sprintf(str,"%s/sec%02d/rb%02d/raw",sfs_name, 1, r) ;
00115 full_name = caller->get_sfs_name(str) ;
00116
00117 if(!full_name) continue ;
00118 bytes = caller->sfs->fileSize(full_name) ;
00119
00120
00121 st = (char *) raw->request(bytes) ;
00122
00123 int ret = caller->sfs->read(str, st, bytes) ;
00124 if(ret != bytes) {
00125 LOG(ERR,"ret is %d") ;
00126 }
00127
00128
00129 raw->finalize(bytes,0,r,0) ;
00130 }
00131
00132 raw->rewind() ;
00133
00134 return raw ;
00135
00136 }
00137
00138