00001 #include <string.h>
00002 #include <arpa/inet.h>
00003 #include <stdio.h>
00004
00005 #include <daqFormats.h>
00006 #include <rtsSystems.h>
00007 #include <rtsLog.h>
00008 #include <rts.h>
00009
00010 #include "daq_ftp.h"
00011
00012 static int unpackRaw(int sec, int what, struct TPCPADK *padk, struct TPCCPPR_l *cppr, char *mem, ftp_t *ftp) ;
00013
00014 int ftp_reader(char *m, struct ftp_t *ftp, u_int driver)
00015 {
00016 int sec ;
00017 int rb, mz ;
00018 int len ;
00019 u_int off ;
00020
00021 struct TPCP *ftpp ;
00022 struct TPCSECP *secp ;
00023 struct TPCRBP *rbp ;
00024 struct TPCMZP *mzp ;
00025 struct TPCSEQD *seqd ;
00026 struct TPCADCD *adcd ;
00027 struct TPCPADK *padk ;
00028 struct TPCADCR_l *adcr ;
00029 struct TPCCPPR_l *cppr ;
00030 struct TPCPEDR *pedr ;
00031 struct TPCRMSR *rmsr ;
00032 struct DATAP *datap ;
00033
00034
00035
00036 ftp->channels = 0 ;
00037
00038
00039 ftp->mode = 0 ;
00040
00041
00042 ftp->max_channels = 2*10*960*256 ;
00043
00044 if(m == NULL) return 0 ;
00045 datap = (struct DATAP *)m ;
00046
00047 len = ntohl(datap->det[FTP_ID].len) ;
00048 if(len == 0) return 0 ;
00049 len *= 4 ;
00050
00051 off = ntohl(datap->det[FTP_ID].off) ;
00052 if(off == 0) return 0 ;
00053
00054 ftpp = (struct TPCP *)((u_int *)m + off) ;
00055 if(checkBank((char *)ftpp,"FTPP") < 0) return -1 ;
00056
00057
00058 memset((char *)ftp->counts,0,sizeof(ftp->counts)) ;
00059
00060
00061 for(sec=0;sec<2;sec++) {
00062 int last ;
00063
00064
00065 if(ftpp->sb[sec].len == 0) continue ;
00066
00067 secp = (struct TPCSECP *) ((char *)ftpp + b2h32(ftpp->sb[sec].off)*4) ;
00068 if(checkBank((char *)secp,"FTPSECP") < 0) return -1 ;
00069
00070 last = 10 ;
00071
00072 for(rb=0;rb<last;rb++) {
00073
00074
00075 if(secp->rb[rb].len == 0) continue ;
00076
00077 rbp = (struct TPCRBP *) ((char *)secp + b2h32(secp->rb[rb].off)*4) ;
00078 if(checkBank((char *)rbp,"FTPRBP") < 0) {
00079 break ;
00080 return -1 ;
00081 }
00082
00083
00084
00085 for(mz=0;mz<3;mz++) {
00086 if(rbp->mz[mz].len == 0) continue ;
00087
00088 mzp = (struct TPCMZP *)((char *)rbp + l2h32(rbp->mz[mz].off)*4) ;
00089 if(checkBank((char *)mzp,"FTPMZP") < 0) {
00090 break ;
00091 return -1 ;
00092 }
00093
00094 u_int mz_pix = 0 ;
00095
00096
00097 if((mzp->banks[TPC_ADCD].len != 0) && (ftp->mode==0)) {
00098
00099
00100 seqd = (struct TPCSEQD *)((char *)mzp + l2h32(mzp->banks[TPC_SEQD].off)*4) ;
00101 adcd = (struct TPCADCD *)((char *)mzp + l2h32(mzp->banks[TPC_ADCD].off)*4) ;
00102
00103 if(checkBank((char *)seqd,"FTPSEQD") < 0) return -1 ;
00104 if(checkBank((char *)adcd,"FTPADCD") < 0) return -1 ;
00105
00106 int len = l2h32(seqd->bh.length) - 10 ;
00107 len *= 2 ;
00108
00109 int adccou = 0 ;
00110 int jj ;
00111
00112
00113
00114 for(jj=0;jj<len;jj++) {
00115 int start, last, length, stop ;
00116 u_short ss, f8 ;
00117 static int rr, pp ;
00118 int tbin ;
00119 int frow, fpad ;
00120
00121 ss = l2h16(seqd->seq[jj]) ;
00122 f8 = (ss & 0x8000) ? 1 : 0 ;
00123
00124
00125 frow = (rr-1)/6 ;
00126 fpad = ((rr-1)%6)*160 + (pp-1) ;
00127
00128
00129 if(f8) {
00130
00131 pp = (ss & 0x7FFF) % 256 ;
00132 rr = (ss & 0x7FFF) / 256 ;
00133
00134
00135
00136 last = 0 ;
00137
00138 if(pp==0xFF) {
00139 LOG(DBG,"Dummy row %d...",jj,0,0,0,0) ;
00140 continue ;
00141 }
00142
00143
00144 }
00145 else {
00146 int counter ;
00147 last = (ss & 0x0020) ? 1 : 0 ;
00148 start = (ss & 0x7FC0) >> 6 ;
00149
00150 length = ss & 0x1F ;
00151
00152 stop = start + length ;
00153
00154
00155
00156 for(tbin=start;tbin<stop;tbin++) {
00157 u_char val ;
00158
00159 val = adcd->adc[adccou++] ;
00160 mz_pix++ ;
00161 if(tbin > 255) continue ;
00162
00163
00164 counter = ftp->counts[sec][frow][fpad] ;
00165
00166 ftp->adc[sec][frow][fpad][counter] = val ;
00167 ftp->timebin[sec][frow][fpad][counter] = tbin ;
00168 if(ftp->counts[sec][frow][fpad] != 255) {
00169 (ftp->counts[sec][frow][fpad])++ ;
00170 }
00171 ftp->channels++ ;
00172 }
00173 }
00174
00175 if(last) {
00176 pp++ ;
00177 }
00178 }
00179
00180 LOG(DBG,"FTP: Setor %d, RB %d, MZ %d: ticks %u, pix %u",sec+1,rb+1,mz+1,l2h32(mzp->bh.w9),mz_pix) ;
00181
00182
00183
00184 continue ;
00185 }
00186
00187 padk = NULL ;
00188 if(mzp->banks[TPC_PADK].len != 0) {
00189 padk = (struct TPCPADK *)((char *)mzp + l2h32(mzp->banks[TPC_PADK].off)*4) ;
00190
00191 if(checkBank((char *)padk,"FTPPADK") < 0) return -1 ;
00192
00193 }
00194
00195 cppr = NULL ;
00196 if(mzp->banks[TPC_CPPR].len != 0) {
00197
00198 cppr = (struct TPCCPPR_l *)((char *)mzp + l2h32(mzp->banks[TPC_CPPR].off)*4) ;
00199 if(checkBank((char *)cppr,"FTPCPPR") < 0) return -1 ;
00200 }
00201
00202 if((mzp->banks[TPC_ADCR].len != 0) && (ftp->mode==0)) {
00203 adcr = (struct TPCADCR_l *)((char *)mzp + l2h32(mzp->banks[TPC_ADCR].off)*4) ;
00204
00205 if(checkBank((char *)adcr,"FTPADCR") < 0) return -1 ;
00206
00207 if(unpackRaw(sec, 0, padk, cppr, (char *)adcr, ftp) < 0) {
00208 LOG(ERR,"Problems in RAW data in sector %d, RB %d, MZ %d - skipping...",
00209 sec+1,rb+1,mz+1,0,0) ;
00210 }
00211
00212 LOG(DBG,"FTP Raw data bank in sector %d, RB %d, MZ %d!",
00213 sec+1,rb+1,mz+1,0,0) ;
00214 continue ;
00215 }
00216
00217 if(mzp->banks[TPC_PEDR].len != 0) {
00218 pedr = (struct TPCPEDR *)((char *)mzp + l2h32(mzp->banks[TPC_PEDR].off)*4) ;
00219
00220 if(checkBank((char *)pedr,"FTPPEDR") < 0) return -1 ;
00221
00222 unpackRaw(sec, 1, padk, cppr, (char *)pedr, ftp) ;
00223 ftp->mode = 1 ;
00224
00225 }
00226
00227 if(mzp->banks[TPC_RMSR].len != 0) {
00228 rmsr = (struct TPCRMSR *)((char *)mzp + l2h32(mzp->banks[TPC_RMSR].off)*4) ;
00229
00230 if(checkBank((char *)rmsr,"FTPRMSR") < 0) return -1 ;
00231
00232 unpackRaw(sec, 2, padk, cppr, (char *)rmsr, ftp) ;
00233 ftp->mode = 1 ;
00234
00235 }
00236
00237
00238 }
00239
00240 }
00241
00242 }
00243
00244
00245
00246 return len ;
00247 }
00248
00249
00250
00251
00252
00253
00254
00255 static int unpackRaw(int sec, int what, struct TPCPADK *padk, struct TPCCPPR_l *cppr, char *mem, ftp_t *ftp)
00256 {
00257 int i, j, t ;
00258 u_char row, pad ;
00259 u_short *cppseq ;
00260 u_char *adcseq ;
00261 u_char *adcdata ;
00262 u_short *cppdata ;
00263 int frow, fpad ;
00264 int timebins, cpps ;
00265
00266 timebins = 512 ;
00267 cpps = 31 ;
00268
00269
00270
00271 if(padk == NULL) {
00272 LOG(WARN,"No PADK? - skipping...",0,0,0,0,0) ;
00273 return -1 ;
00274 }
00275 if(mem == NULL) {
00276 LOG(WARN,"No DATA? - skipping...",0,0,0,0,0) ;
00277 return -1 ;
00278 }
00279
00280 adcdata = NULL ;
00281 cppdata = NULL ;
00282
00283 switch(what) {
00284 case 0 :
00285 adcdata = (u_char *) mem + sizeof(struct TPCADCR_l);
00286
00287 if(cppr == NULL) {
00288 LOG(WARN,"No CPPR? - skipping...",0,0,0,0,0) ;
00289 return -1 ;
00290 }
00291
00292 cppdata = (u_short *)((char *)cppr + sizeof(struct TPCCPPR_l)) ;
00293 break ;
00294 case 1 :
00295 adcdata = ((struct TPCPEDR *)mem)->ped ;
00296 break ;
00297 case 2 :
00298 adcdata = ((struct TPCRMSR *)mem)->rms ;
00299 break ;
00300 }
00301
00302
00303 for(i=0;i<320;i++) {
00304 row = padk->rp[i].row ;
00305 pad = padk->rp[i].pad ;
00306
00307 if((row==0xFF) || (pad==0xFF)) continue ;
00308
00309
00310
00311 row-- ;
00312 pad-- ;
00313
00314
00315 frow = row/6 ;
00316 fpad = (row%6)*160 + pad ;
00317
00318 adcseq = (u_char *) adcdata + timebins*i ;
00319
00320 switch(what) {
00321 case 0 :
00322 cppseq = (u_short *)((char *) cppdata + 2*2*32*i) ;
00323 for(j=0;j<cpps;j++) {
00324 u_short start, stop ;
00325 u_char val ;
00326 int counter ;
00327
00328
00329
00330 start = l2h16(*cppseq++) ;
00331 stop = l2h16(*cppseq++) ;
00332
00333
00334 if(start & 0xFE00) break ;
00335 if(start >= 256) break ;
00336
00337
00338 if(start == 511) stop = 511 ;
00339
00340 if((stop < start) || (stop >= timebins)) {
00341 LOG(WARN,"Bad data stop<start %d<%d - skipping",stop,start,0,0,0) ;
00342 return -1 ;
00343 }
00344
00345
00346 if(stop >= 256) stop = 255 ;
00347
00348 for(t=start;t<=stop;t++) {
00349
00350 val = *(adcseq + t) ;
00351
00352 if(val == 0) {
00353 return -1 ;
00354 }
00355
00356 counter = ftp->counts[sec][frow][fpad] ;
00357
00358
00359 ftp->adc[sec][frow][fpad][counter] = val ;
00360 ftp->timebin[sec][frow][fpad][counter] = t ;
00361 if(ftp->counts[sec][frow][fpad] != 255) {
00362 ftp->counts[sec][frow][fpad]++ ;
00363 }
00364 ftp->channels++ ;
00365 }
00366
00367 }
00368 break ;
00369 case 1 :
00370 for(j=0;j<256;j++) {
00371 u_char val ;
00372 val = *adcseq++ ;
00373
00374 ftp->adc[sec][frow][fpad][j] = val ;
00375 ftp->channels++ ;
00376
00377 }
00378 break ;
00379 case 2 :
00380 for(j=0;j<256;j++) {
00381 u_char val ;
00382 val = *adcseq++ ;
00383
00384 ftp->timebin[sec][frow][fpad][j] = val ;
00385 }
00386 break ;
00387 }
00388
00389
00390 }
00391
00392
00393 return 0 ;
00394
00395 }