00001 #include <stdio.h>
00002 #include <string.h>
00003 #include <arpa/inet.h>
00004
00005 #include <rtsLog.h>
00006 #include <rts.h>
00007 #include <rtsSystems.h>
00008 #include <daqFormats.h>
00009
00010 #include "daq_fpd.h"
00011
00012 int fpd_reader(char *m, struct fpd_t *fpd, u_int driver)
00013 {
00014 struct DATAP *datap = (struct DATAP *)m ;
00015 struct FPDP *fpdp ;
00016 struct FPDADCD *adcd ;
00017 struct FPDTDCD *tdcd ;
00018 struct FPDREGD *regd ;
00019 struct FPDPEDR *pedr ;
00020 struct FPDSCL *scl ;
00021 struct BBCDAT *bbcdat ;
00022 struct BBCPED *bbcped ;
00023 struct BBCSCL *bbcscl ;
00024
00025 int len, off ;
00026 int i, banks, type ;
00027 int ch ;
00028
00029 fpd->mode = 1 ;
00030 fpd->max_channels = 1 ;
00031 fpd->channels = 0 ;
00032
00033 if(datap == NULL) return 0 ;
00034
00035 len = ntohl(datap->det[FPD_ID].len) * 4 ;
00036 if(len == 0) return 0 ;
00037
00038 off = ntohl(datap->det[FPD_ID].off) ;
00039 if(off == 0) return 0 ;
00040
00041
00042 fpdp = (struct FPDP *)((u_int *)m + off) ;
00043
00044 if(checkBank(fpdp->bh.bank_type,"FPDP") < 0) {
00045 return -1 ;
00046 }
00047
00048 memset(&fpd,0,sizeof(fpd)) ;
00049 fpd->mode = 1 ;
00050 fpd->max_channels = 256 ;
00051 fpd->channels = 0 ;
00052
00053
00054 banks = (l2h32(fpdp->bh.length) - 10)/2 ;
00055
00056 for(type=0;type<banks;type++) {
00057 if(fpdp->type[type].len == 0) {
00058 LOG(DBG,"FPD bank %d not present (len==0)",type,0,0,0,0) ;
00059 continue ;
00060 }
00061 else {
00062 LOG(DBG,"FPD bank %d found: len %d qw, off %d qw (%d %d)",type,
00063 l2h32(fpdp->type[type].len),l2h32(fpdp->type[type].off),fpdp->type[type].len,fpdp->type[type].off) ;
00064 }
00065
00066 switch(type) {
00067 case FPDP_ADCD :
00068
00069 adcd = (struct FPDADCD *)((u_int *)fpdp + l2h32(fpdp->type[type].off)) ;
00070
00071 if(checkBank(adcd->bh.bank_type,CHAR_FPDADCD) < 0) {
00072 return -1 ;
00073 }
00074
00075
00076 ch = (l2h32(adcd->bh.length) - 10)*2 ;
00077 fpd->channels = ch ;
00078
00079 if(ch > (int)(sizeof(fpd->adc)/sizeof(fpd->adc[0]))) {
00080 LOG(ERR,"Counter overflow in FPDADCD! ch == %d",ch,0,0,0,0) ;
00081 return -1 ;
00082 }
00083
00084 for(i=0;i<ch;i++) {
00085 fpd->adc[i] = l2h16(adcd->data[i]) ;
00086 }
00087
00088 break ;
00089 case FPDP_TDCD :
00090
00091 tdcd = (struct FPDTDCD *)((u_int *)fpdp + l2h32(fpdp->type[type].off)) ;
00092 if(checkBank(tdcd->bh.bank_type,CHAR_FPDTDCD) < 0) {
00093 return -1 ;
00094 }
00095
00096
00097 for(i=0;i<8;i++) {
00098 fpd->tdc[i] = l2h16(tdcd->data[i]) ;
00099 }
00100
00101 break ;
00102
00103 case FPDP_REGD :
00104 regd = (struct FPDREGD *)((u_int *)fpdp + l2h32(fpdp->type[type].off)) ;
00105 if(checkBank(regd->bh.bank_type,CHAR_FPDREGD) < 0) {
00106 return -1 ;
00107 }
00108
00109
00110 for(i=0;i<3;i++) {
00111 fpd->reg[i] = l2h16(regd->data[i]) ;
00112 }
00113
00114 break ;
00115
00116 case FPDP_PEDR :
00117 pedr = (struct FPDPEDR *)((u_int *)fpdp + l2h32(fpdp->type[type].off)) ;
00118 if(checkBank(pedr->bh.bank_type,CHAR_FPDPEDR) < 0) {
00119 return -1 ;
00120 }
00121
00122
00123 for(i=0;i<256;i++) {
00124 fpd->ped[i] = l2h16(pedr->ped[i]) ;
00125 }
00126 for(i=0;i<256;i++) {
00127 fpd->rms[i] = l2h16(pedr->rms[i]) ;
00128 }
00129
00130 break ;
00131 case FPDP_SCL :
00132 scl = (struct FPDSCL *)((u_int *)fpdp + l2h32(fpdp->type[type].off)) ;
00133 if(checkBank(scl->bh.bank_type,CHAR_FPDSCL) < 0) {
00134 return -1 ;
00135 }
00136
00137 break ;
00138 case FPDP_BBCDAT :
00139 bbcdat = (struct BBCDAT *)((u_int *)fpdp + l2h32(fpdp->type[type].off)) ;
00140 if(checkBank(bbcdat->bh.bank_type,CHAR_BBCDAT) < 0) {
00141 return -1 ;
00142 }
00143
00144
00145 for(i=0;i<32;i++) {
00146 fpd->bbc.pulse[i] = l2h16(bbcdat->pulse[i]) ;
00147 }
00148 for(i=0;i<32;i++) {
00149 fpd->bbc.time[i] = l2h16(bbcdat->time[i]) ;
00150 }
00151 for(i=0;i<2;i++) {
00152 fpd->bbc.proof[i] = l2h16(bbcdat->proof[i]) ;
00153 }
00154 for(i=0;i<6;i++) {
00155 fpd->bbc.spare[i] = l2h16(bbcdat->spare[i]) ;
00156 }
00157
00158
00159 break ;
00160 case FPDP_BBCPED :
00161 bbcped = (struct BBCPED *)((u_int *)fpdp + l2h32(fpdp->type[type].off)) ;
00162 if(checkBank(bbcped->bh.bank_type,CHAR_BBCPED) < 0) {
00163 return -1 ;
00164 }
00165
00166 for(i=0;i<32;i++) {
00167 fpd->bbc.ped[i] = l2h16(bbcped->ped[i]) ;
00168 }
00169 for(i=0;i<32;i++) {
00170 fpd->bbc.rms[i] = l2h16(bbcped->rms[i]) ;
00171 }
00172 for(i=0;i<64;i++) {
00173 fpd->bbc.peaks[i] = l2h16(bbcped->peaks[i]) ;
00174 }
00175
00176 break ;
00177 case FPDP_BBCSCL :
00178 bbcscl = (struct BBCSCL *)((u_int *)fpdp + l2h32(fpdp->type[type].off)) ;
00179 if(checkBank(bbcscl->bh.bank_type,CHAR_BBCSCL) < 0) {
00180 return -1 ;
00181 }
00182
00183 for(i=0;i<32;i++) {
00184 fpd->bbc.scl[i] = l2h16(bbcscl->scl[i]) ;
00185 }
00186
00187 break ;
00188
00189
00190 default :
00191 LOG(ERR,"Unknown bank id %d in FPDP?",type,0,0,0,0) ;
00192 break ;
00193 }
00194
00195 }
00196
00197 return len ;
00198
00199 }
00200