00001 #include <sys/types.h>
00002
00003 #include <rtsLog.h>
00004 #include <rtsSystems.h>
00005 #include <daqFormats.h>
00006 #include <rts.h>
00007
00008 #include <DAQ_READER/daq_det.h>
00009
00010 #include "daq_bsmd.h"
00011
00012 const char *hdrs[3] = {
00013 CHAR_EMCADCR,
00014 CHAR_EMCADCD,
00015 CHAR_EMCPEDR
00016 } ;
00017
00018 char *bsmd_reader(char *e, struct bsmd_desc *bsmd_d)
00019 {
00020 struct EMCP *emcp = (struct EMCP *)e ;
00021 u_int off, len ;
00022 int found_some ;
00023
00024 found_some = 0 ;
00025 memset(bsmd_d,0,sizeof(struct bsmd_desc)) ;
00026
00027 LOG(DBG,"BSMD: %p",emcp) ;
00028
00029 if(!emcp) return 0 ;
00030
00031
00032 if(checkBank(emcp->bh.bank_type, CHAR_EMCP)<0) return 0 ;
00033
00034 off = b2h32(emcp->sec[1].off) ;
00035 len = b2h32(emcp->sec[1].len) ;
00036 LOG(DBG,"BSMD: sector 1: %d %d",off,len) ;
00037
00038 if((len==0) || (off==0)) return 0 ;
00039
00040 struct EMCSECP *emcsecp = (struct EMCSECP *)((u_int *)emcp + off) ;
00041
00042 if(checkBank(emcsecp->bh.bank_type, CHAR_EMCSECP)<0) return 0 ;
00043
00044 int fibers = (b2h32(emcsecp->bh.length)-10) / 2 ;
00045
00046 LOG(DBG,"BSMD: %d fibers",fibers) ;
00047
00048 for(int f=0;f<fibers;f++) {
00049
00050 len = b2h32(emcsecp->fiber[f].len) ;
00051 off = b2h32(emcsecp->fiber[f].off) ;
00052
00053 if((len==0) || (off==0)) continue ;
00054
00055 struct EMCRBP *emcrbp = (struct EMCRBP *)((u_int *)emcsecp + off) ;
00056
00057 if(checkBank(emcrbp->bh.bank_type, CHAR_EMCRBP)< 0) return 0 ;
00058
00059 int banks = (b2h32(emcrbp->bh.length) - 10)/2 ;
00060
00061 LOG(DBG,"BSMD: fiber %d: %d banks",f,banks) ;
00062
00063 for(int b=0;b<banks;b++) {
00064
00065 len = b2h32(emcrbp->banks[b].len) ;
00066 off = b2h32(emcrbp->banks[b].off) ;
00067
00068 if((len==0) || (off==0)) continue ;
00069
00070 struct DUMMYDATA *emcadc = (DUMMYDATA *) ((u_int *)emcrbp + off) ;
00071
00072 if(checkBank(emcadc->bh.bank_type, (char *)hdrs[b])<0) return 0 ;
00073
00074
00075 found_some = 1 ;
00076
00077 if(b!=0) {
00078 bsmd_d->bytes[f][b] = b2h32(emcadc->bh.length)*4 - 40 ;
00079 bsmd_d->endian[f][b] = 1 ;
00080 }
00081 else {
00082 bsmd_d->bytes[f][b] = l2h32(emcadc->bh.length)*4 - 40 ;
00083 bsmd_d->endian[f][b] = 0 ;
00084 }
00085
00086 bsmd_d->dta[f][b] = ((char *)emcadc + 40) ;
00087
00088 LOG(DBG,"BSMD: fiber %d: bank %d: bytes %d",f,b,bsmd_d->bytes[f][b]) ;
00089 }
00090 }
00091
00092 LOG(DBG,"bsmd_reader: found some %d",found_some) ;
00093
00094 if(found_some) return (char *)bsmd_d ;
00095 else return 0 ;
00096 }
00097
00098
00099