10 #include <rtsSystems.h>
12 #include <DAQ1000/ddl_struct.h>
13 #include <DAQ1000/rdo_cmds.h>
15 #include <TPC/rowlen.h>
16 #include <TPX/tpx_altro_to_pad.h>
18 #include <DAQ_TPX/tpxCore.h>
19 #include <DAQ_TPX/tpxPed.h>
20 #include <DAQ_TPX/tpxGain.h>
22 #include <DAQ_ITPC/itpcPed.h>
26 #include <MISC_LIBS/thread_dbg.h>
42 int tpx23::from22to23(
char *c_addr,
int words)
48 inline u_int tpx23::set_rdo(
int s,
int r)
66 get_token((
char *)d_start,words) ;
70 if(run_type==1 || run_type==5) {
71 int r0_logical = tpx36_from_real(subdet_id,sector1,rdo1) - 1 ;
74 peds->valid_evts[r0_logical]++ ;
75 peds->evts[r0_logical]++ ;
77 peds->sector = subdet_id ;
79 if(peds->evts[r0_logical]<=3)
goto done ;
80 if(peds->valid_evts[r0_logical]>1000)
goto done ;
91 if(log_level>0) LOG(TERR,
"%d: fee_scan",rdo1) ;
93 u_int *h_to_continue ;
97 while(h>(d_start+2)) {
107 int wc = ((hi&0x3F)<<4)|((lo&0xF0000)>>16) ;
110 int id = (lo&0xFF0) >> 4 ;
115 u_int a = (lo>>12)&0xF ;
118 if((aaa!= 0x2AAA)||(a!=0xA)||(wc>437)) {
121 if((online || mode) && retry==0) {
122 LOG(ERR,
"S%02d:%d: aid %d:%d, %d:%d: aaa 0x%X, a 0x%X, wc %d, %d",
123 sector1,rdo1,
id,ch,id_pre,ch_pre,aaa,a,wc,d_end-h) ;
145 u_int aa = ((h[1]&0xFFFFF)>>10) ;
152 if((online || mode) && retry==0) {
153 LOG(ERR,
"S%02d:%d: aid %d:%d, %d:%d: aaa 0x%X, a 0x%X, aa 0x%X, wc %d",
154 sector1,rdo1,
id,ch,id_pre,ch_pre,aaa,a,aa,wc) ;
177 LOG(WARN,
"S%02d:%d: aid %d:%d, %d:%d: aaa 0x%X, a 0x%X, wc %d, %d -- OK",
178 sector1,rdo1,
id,ch,id_pre,ch_pre,aaa,a,wc,d_end-h) ;
187 for(
int i=0;i<tpx_fee_override_cou;i++) {
188 if(sector1 == tpx_fee_override[i].sector) {
189 if(rdo1==tpx_fee_override[i].rdo) {
190 int fee =
id & 0xFE ;
192 if(fee == tpx_fee_override[i].curr_altro) {
193 int should = tpx_fee_override[i].orig_altro ;
195 if(
id & 1) should |= 1 ;
211 int flags = flags_row_pad(
id,ch,row,pad) ;
218 if(online) LOG(ERR,
"S%02d:%d: rp %d:%d (aid %d:%d, %d:%d) : wc %d",sector1,rdo1,row,pad,
219 id,ch,id_pre,ch_pre, wc) ;
230 if(flags && run_type==3) {
232 LOG(TERR,
"%d: rp %d:%d, flags 0x%X",rdo1,row,pad,flags) ;
240 altro_present[id][ch]++ ;
242 if(altro_present[
id][ch]>1) {
245 if(online) LOG(ERR,
"S%02:%d: AID %d:%d already present %d",sector1,rdo1,
id,ch,altro_present[
id][ch]) ;
252 u_short *d = s1_dta + last_ix ;
256 LOG(TERR,
"%d: rp %d:%d; last_ix %d %p",rdo1,row,pad,last_ix,d) ;
274 dd[0] = (hi>>10)&0x3FF ;
276 dd[2] = (lo>>10)&0x3FF ;
295 d[ix++] = (hi>>10)&0x3FF ;
296 d[ix++] = hi & 0x3FF ;
297 d[ix++] = (lo>>10)&0x3FF ;
298 d[ix++] = lo & 0x3FF ;
307 struct seq_t *seq = s1[row][pad].seq ;
322 u_short t_len = *dd++ - 2 ;
323 u_short t_hi = *dd++ ;
325 if(seq_ix>=(SEQ_MAX-1)) {
330 t_lo = t_hi - t_len + 1 ;
332 if(t_len>440 || t_hi>440 || t_lo>440) {
335 if(online||mode) LOG(ERR,
"S%02d:%d: rp %d:%d (aid %d:%d, %d:%d), t_len %d, t_lo %d, t_hi %d; wc %d, ix %d, seq %d, %d",
336 sector1,rdo1,row,pad,
338 t_len,t_lo,t_hi,wc,ix,seq_ix,d_end-h) ;
340 if(t_len>440 || t_hi>440 || t_lo>440) {
357 sseq[seq_ix].t_lo = t_lo ;
358 sseq[seq_ix].t_hi = t_hi ;
362 for(
int i=0;i<t_len;i++) {
364 sseq[seq_ix].d[i] = adc ;
375 if(run_type==1 || run_type==5) {
378 memset(&a,0,
sizeof(a)) ;
379 a.what = TPX_ALTRO_DO_ADC ;
391 for(
int i=(seq_ix-1);i>=0;i--) {
392 int t_len = sseq[i].t_hi - sseq[i].t_lo + 1 ;
395 for(
int j=(t_len-1);j>=0;j--) {
396 int adc = sseq[i].d[j] ;
398 a.tb[aix] = sseq[i].t_lo + ii ;
408 tpx_d->sector = sector1 ;
416 tpx_d->ch_start(ch) ;
418 for(
int i=(seq_ix-1);i>=0;i--) {
419 int t_len = sseq[i].t_hi - sseq[i].t_lo + 1 ;
422 for(
int j=(t_len-1);j>=0;j--) {
423 int adc = sseq[i].d[j] ;
429 tb = sseq[i].t_lo + ii ;
434 tpx_d->accum(tb,adc) ;
449 seq = s1[row][pad].seq ;
453 for(
int i=(seq_ix-1);i>=0;i--) {
454 seq[s_cou].t_lo = sseq[i].t_lo;
455 seq[s_cou].t_hi = sseq[i].t_hi ;
456 seq[s_cou].dta_p = (dd-d) ;
457 seq[s_cou].blob_id = 0 ;
459 int t_len = sseq[i].t_hi - sseq[i].t_lo + 1 ;
463 for(
int j=(t_len-1);j>=0;j--) {
464 *dd++ = sseq[i].d[j] ;
476 sequence_cou += s_cou ;
478 seq[s_cou].t_hi = -1 ;
479 s1[row][pad].ix = last_ix ;
485 seq = s1[row][pad].seq ;
486 while(seq->t_hi>=0) {
487 int t_len = seq->t_hi - seq->t_lo + 1 ;
488 printf(
"rp %d:%d, t_lo %d, t_hi %d\n",row,pad,seq->t_lo,seq->t_hi) ;
490 dd = d + seq->dta_p ;
491 for(
int j=0;j<t_len;j++) {
492 printf(
" adc %d: %d\n",j,dd[j]) ;
519 u_int tpx23::get_token_s(
char *c_addr,
int wds)
521 u_int *d = (u_int *)c_addr ;
532 int type = (d[0]>>0)&0xF ;
533 int hdr_type = (d[0]>>24)&0xF ;
564 daq = (d[-2] >> 12)&0xF ;
565 trg = (d[-2] >> 16)&0xF ;
579 d -= trg_cou * (
sizeof(
struct trg_data)/4) ;
586 for(
int i=0;i<trg_cou;i++) {
589 switch(trg_d[i].csr & 0xFF000000) {
595 t = trg_d[i].data & 0xFFF ;
596 daq = (trg_d[i].data >> 12)&0xF ;
597 trg = (trg_d[i].data >> 16)&0xF ;
608 return (trg<<16)|(daq<<12)|t ;
611 u_int tpx23::get_token(
char *c_addr,
int wds)
613 u_int *d = (u_int *)c_addr ;
639 tdbg[0] = d_first[1] ;
648 token = d[-2] & 0xFFF ;
649 daq_cmd = (d[-2] >> 12)&0xF ;
650 trg_cmd = (d[-2] >> 16)&0xF ;
653 u_int evt_err = d[-1] ;
654 if(evt_err & 0xFF000000) {
657 if(wds>20) cou = 20 ;
663 LOG(ERR,
"evt_err %d:%d: 0x%08X: 0x%08X, wds %u",evt,rdo1,d_first[0],evt_err,wds) ;
664 for(
int i=0;i<cou;i++) {
665 LOG(TERR,
" %d: 0x%08X",i,d_first[i]) ;
672 printf(
" delta evt %d: all %d: %d %d %d %d - token %d, wds %d\n",evt,tdbg[1]-tdbg[0],
683 return (trg_cmd<<16)|(daq_cmd<<12)|token ;
693 d -= trg_cou * (
sizeof(
struct trg_data)/4) ;
698 for(
int i=0;i<trg_cou;i++) {
704 switch(trg[i].csr & 0xFF000000) {
710 token = trg[i].data & 0xFFF ;
711 daq_cmd = (trg[i].data >> 12)&0xF ;
712 trg_cmd = (trg[i].data >> 16)&0xF ;
725 return (trg_cmd<<16)|(daq_cmd<<12)|token ;
732 int tpx23::msc_dump(
char *c_addr,
int wds)
736 LOG(INFO,
"msc_dump: %d bytes, should be %d: Sreal%d:%d",wds*4,
sizeof(
struct tpx_rdo),
744 memcpy(&(
tpx_rdo[sector1-1][rdo1-1]),c_addr,
sizeof(
struct tpx_rdo)) ;
747 err = tpx_show_status(sector1,1<<(rdo1-1),0) ;
749 if(online) LOG(ERR,
"S%02d:%d: tpx_show_status %d",sector1,rdo1,err) ;
755 int tpx23::log_dump(
char *c_addr,
int wds)
765 u_int err_status = 0 ;
783 int max_cou = (words-4)*4 ;
784 rdobuff = (
char *)(c_addr+2*4) ;
787 len = strlen(rdobuff) ;
788 if(len>max_cou) len = max_cou ;
792 tmpbuff = (
char *) malloc(len+1) ;
793 memcpy(tmpbuff,rdobuff,len+1) ;
796 for(
int i=0;i<len;i++) {
797 if(tmpbuff[i]==
'\n') {
805 for(
int i=0;i<(len);) {
813 for(
int j=st;j<len;j++) {
814 if(tmpbuff[j] == 0) break ;
816 if(!isprint(tmpbuff[j])) {
817 if(tmpbuff[j] == 9) ;
819 LOG(WARN,
"---> [%d LOG] Unprintable character 0x%02X? -- powercycle",rdo,(u_char)tmpbuff[j]) ;
830 if(strstr(tmpbuff+st,
"RHIC clock: ")) {
831 if(strstr(tmpbuff+st,
"EXTERNAL")) {
839 if(strstr(tmpbuff+st,
"JTAG dev ")) {
847 ret = sscanf(tmpbuff+st,
"JTAG dev %d: ID 0x%X, USERcode 0x%X",&dev,&dev_id,&user) ;
848 LOG(WARN,
"JTAG: ret %d, dev %d, dev_id 0x%08X, user 0x%08X",ret, dev, dev_id,user) ;
850 if(ret==3 && dev>=0 && dev<5) {
851 fpga_usercode[dev] = user ;
856 if(strstr(tmpbuff+st,
"SPECIAL_0 code")) {
857 LOG(ERR,
"---> SPECIAL code: RDO %d",rdo) ;
861 if(strstr(tmpbuff+st,
"ERR")) {
862 if(strstr(tmpbuff+st,
"FLASH Id")) {
863 LOG(WARN,
"[S%02d:%d LOG]: contains ERR \"%s\"",s_real,r_real,tmpbuff+st) ;
872 if(strstr(tmpbuff+st,
"Status: Xil config")) {
873 if(strstr(tmpbuff+st,
"!")) {
875 LOG(WARN,
"---> [S%d:%d LOG] CPLD status has \"!\" -- ignored ",s_real,r_real) ;
879 if(strstr(tmpbuff+st,
"FEE power BAD")) {
887 if(strstr(tmpbuff+st,
"SRAM check failed")) {
890 LOG(ERR,
"---> [%d LOG] SRAM check failed -- powercycle",rdo) ;
893 if(strstr(tmpbuff+st,
"CPLD claims error")) {
895 LOG(ERR,
"---> [%d LOG] CPLD claims error -- reconfig 0x300",rdo) ;
898 if(strstr(tmpbuff+st,
"can't configure RDO!")) {
899 LOG(ERR,
"---> [%d LOG] \"can't configure RDO\" -- reconfig 0x300",rdo) ;
905 if(strstr(tmpbuff+st,
"lost RHIC")) {
906 LOG(ERR,
"---> [%d LOG] \"lost RHIC\" -- restart run",rdo) ;
909 if(strstr(tmpbuff+st,
"NO RHIC CLOCK")) {
910 LOG(ERR,
"---> [%d LOG] \"NO RHIC CLOCK\" -- restart run",rdo) ;
914 if(strstr(tmpbuff+st,
"DRIFT")) {
915 LOG(ERR,
"---> [%d LOG] \"DRIFT/clock problems\" -- restart run",rdo) ;
920 if(strstr(tmpbuff+st,
"CRIT")) {
922 LOG(ERR,
"---> [%d LOG] CRIT string in log -- restart run",rdo) ;
925 if(strstr(tmpbuff+st,
"altro error")) {
928 LOG(ERR,
"---> [%d LOG] altro error -- restart run",rdo) ;
932 if(strstr(tmpbuff+st,
"ERR ALTRO")) {
937 if(strstr(tmpbuff+st,
"ERR: expired")) {
943 LOG(ERR,
"[S%02d:%d %d]: %s",s_real,r_real,evt,tmpbuff+st) ;
947 LOG(INFO,
"[S%02d:%d %d]: %s",s_real,r_real,evt,tmpbuff+st) ;
966 tm[strlen(tm)-1] = 0 ;
989 pthread_mutex_lock(&log_file_mutex) ;
992 fprintf(log_file,
"%s[RDO %d] (%s) %s%s%s",ANSI_BLUE,rdo,
995 term_char,ANSI_RESET) ;
998 fprintf(log_file,
"%s",rdobuff) ;
1003 pthread_mutex_unlock(&log_file_mutex) ;
1011 int tpx23::rdo_scan(
char *c_addr,
int wds)
1015 u_int *d = (u_int *)c_addr ;
1019 int rdo = (d[0]>>8)&0xF ;
1020 int sec = (d[0]>>12)&0xFF ;
1022 subtype = (d[0]>>4)&0xF ;
1023 type = (d[0]>>0)&0xF ;
1025 hdr_version = (d[0]>>24)&0xF ;
1039 if((d[0]&0xF0000000)!=0xF0000000) {
1040 LOG(ERR,
"%d:%d: bad header 0x%08X",evt,rdo1,d[0]) ;
1043 if(rdo!=rdo1 || sec!=sector1) {
1044 LOG(ERR,
"%d:%d: wrong sec,rdo: rdo expect %d is %d; sector expect %d is %d [0x%08X]",evt,rdo1,
1045 rdo1,rdo,sector1,sec,d[0]) ;
1055 ret = log_dump(c_addr,wds) ;
1063 LOG(WARN,
"%d: MSC: event %d: S%02d:%d: type %d:%d, words %d",rdo1,d[1],sec,rdo,type,subtype,words) ;
1065 ret = msc_dump(c_addr, wds) ;
1088 if(rp_gain_tpx==0) {
1089 rp_gain_tpx = (row_pad_t (*)[ROW_MAX+1][PAD_MAX+1]) malloc(
sizeof(row_pad_t)*24*(ROW_MAX+1)*(PAD_MAX+1)) ;
1092 for(
int s=0;s<24;s++) {
1093 for(
int r=0;r<=ROW_MAX;r++) {
1094 for(
int p=0;p<=PAD_MAX;p++) {
1095 rp_gain_tpx[s][r][p].gain = 1.0 ;
1096 rp_gain_tpx[s][r][p].t0 = 0.0 ;
1097 rp_gain_tpx[s][r][p].flags = 0 ;
1102 rp_gain = rp_gain_tpx ;
1105 peds =
new class tpxPed ;
1110 for(
int row=1;row<=45;row++) rowlen[row] = tpc_rowlen[row] ;
1114 memset(fpga_usercode,0,
sizeof(fpga_usercode)) ;
1120 #include <DAQ_TPX/tpxCore.h>
1122 u_char tpx23::flags_row_pad(
int asic,
int channel,
int &row,
int &pad)
1127 if(rdo1<1||rdo1>6)
return 0xFF ;
1131 tpx_from_altro(rdo1-1,asic,channel,row,pad) ;
1132 if(row==0 || row==255)
return 0xFF ;
1133 if(pad==0 || pad==255)
return 0xFF ;
1137 return rp_gain[sector1-1][row][pad].flags ;
1141 int tpx23::run_start()