00001 #include <stdio.h>
00002 #include <string.h>
00003 #include <arpa/inet.h>
00004
00005 #include <rtsLog.h>
00006 #include <rtsSystems.h>
00007 #include <daqFormats.h>
00008 #include <rts.h>
00009
00010 #include "daq_ric.h"
00011
00012
00013 int ric_reader(char *m, struct ric_t *ric, u_int driver)
00014 {
00015 struct DATAP *datap = (struct DATAP *)m ;
00016 struct RICP *ricp ;
00017 struct RICCRAMP *riccramp ;
00018 struct RICDATAD *ricdatad ;
00019
00020 int len, off ;
00021
00022 ric->mode = 1 ;
00023 ric->max_channels = 16*960 ;
00024 ric->channels = 0 ;
00025
00026 if(datap == NULL) return 0 ;
00027
00028 len = ntohl(datap->det[RIC_ID].len) * 4 ;
00029 if(len == 0) return 0 ;
00030
00031 off = ntohl(datap->det[RIC_ID].off) ;
00032 if(off == 0) return 0 ;
00033
00034
00035 LOG(DBG,"RIC len %d, off %d",len,off,0,0,0) ;
00036
00037 ricp = (struct RICP *)((u_int *)m + off) ;
00038
00039 if(checkBank(ricp->bh.bank_type,CHAR_RICP) < 0) {
00040 return -1 ;
00041 }
00042
00043 #define RUN_ME
00044 #ifdef RUN_ME
00045
00046 memset(ric->adc,0,sizeof(ric->adc)) ;
00047
00048
00049 int cram ;
00050
00051 for(cram=0;cram<16;cram++) {
00052 int banks ;
00053
00054 if(ricp->crams[cram].len <= 0) continue ;
00055
00056 riccramp = (struct RICCRAMP *)((u_int *)ricp + b2h32(ricp->crams[cram].off)) ;
00057
00058 if(checkBank(riccramp->bh.bank_type,CHAR_RICCRAMP) < 0) {
00059 return -1 ;
00060 }
00061
00062 for(banks=0;banks<8;banks++) {
00063 u_int cou ;
00064 u_int i ;
00065
00066 if(riccramp->banks[banks].len <= 0) continue ;
00067
00068 if(banks != RIC_BANK_DATAD) {
00069 LOG(DBG,"Found non-DATAD bank %d - skipping...",banks,0,0,0,0) ;
00070 continue ;
00071 }
00072
00073
00074
00075 ricdatad = (struct RICDATAD *)((u_int *)riccramp + b2h32(riccramp->banks[banks].off)) ;
00076
00077
00078 LOG(DBG,"Bank id is %d...",banks,0,0,0,0) ;
00079
00080 if(checkBank(ricdatad->bh.bank_type,CHAR_RICDATAD) < 0) {
00081 return -1 ;
00082 }
00083
00084
00085 cou = b2h32(ricdatad->bh.length) - sizeof(struct bankHeader)/4 ;
00086
00087 LOG(DBG,"RICH bank %d, CRAM %d has %d entries...",banks,cram,cou,0,0) ;
00088
00089 if(cou == 0) continue ;
00090
00091
00092 for(i=0;i<cou*2;i+=2) {
00093 u_short adc, ch ;
00094
00095 ch = b2h16(ricdatad->data[i]) ;
00096 adc = b2h16(ricdatad->data[i+1]) ;
00097
00098 if(adc > 1023) adc = 1023 ;
00099
00100 if(adc == 0) continue ;
00101
00102
00103 if(ch >= 960) {
00104 LOG(ERR,"RICH channel %d >= 960!",ch,0,0,0,0) ;
00105 return -1 ;
00106 }
00107
00108 ric->adc[cram][ch] = adc ;
00109
00110 ric->channels++ ;
00111 }
00112
00113 }
00114
00115 }
00116
00117
00118 #endif
00119 return len ;
00120
00121 }
00122