#include #include #include #include #include #include "/usr/include/bsd/sys/time.h" #include "rd13liberrs.h" #include "MultiIntFlags.h" #include "VME_trig.h" #define CSR_CONF 0xE0 #define CSR_CONF1 0x8C #define INBURST 0 #define OUTBURST 1 #define SIGNAL_EVENT 1 #define SIGNAL_SOB 2 #define SIGNAL_EOB 3 #define SIGNAL_SOFT 4 #define DEBUG 1 #define SIGNAL_DEBUG 1 static int state = OUTBURST; int i, corboflag[4]; int counter[4]; int value, mask; int k, sts; int nbursts; int badsob = 0; int badeob = 0; int offburst = 0; int evinburst = 0; int no_trig = 0; int vr_value; int dspnum; int loops; main() { for(i=0; i<4; i++) counter[i] = 0; initCORBO(); do_binary_init(dspnum); while(counter[0] 10) { do_binary_exit(); exitCORBO(); } waitCORBO(); } do_binary_exit(); exitCORBO(); } initCORBO() { if (TM_init!=0) { printf("\t\tan error mapping the card CORBO\n"); exit(1); } value = RD13_flags_initialise(); if ( value != RD13_FLAGS_SUCCESS ) { printf( " error from flags init is %x \n",value); exit(); } value = RD13_flags_add(10,0,1,&corboflag[0], SIGNAL_EVENT); if ( value != RD13_FLAGS_SUCCESS ) { printf(" error from flags add is %x \n",value); exit(); } value = RD13_flags_add(20,0,2,&corboflag[1], SIGNAL_SOB); if ( value != RD13_FLAGS_SUCCESS ) { printf(" error from flags add is %x \n",value); exit(); } value = RD13_flags_add(30,0,2,&corboflag[2], SIGNAL_EOB); if ( value != RD13_FLAGS_SUCCESS ) { printf(" error from flags add is %x \n",value); exit(); } TM_csrW(1,0x00); TM_csrW(2,0x00); TM_csrW(3,0x00); TM_csrW(4,0x00); TM_clear(1); TM_clear(2); TM_clear(3); TM_clear(4); TM_vrW(1,10); /* TM_vrR(1,vr_value); printf("VR 1 = %d\n",vr_value); TM_vr1R(1,vr_value); printf("VR (bim2) 1 = %d\n",vr_value); */ TM_vrW(2,20); /* TM_vrR(2,vr_value); printf("VR 1 = %d\n",vr_value); TM_vr1R(2,vr_value); printf("VR (bim2) 2 = %d\n",vr_value); */ TM_vrW(4,30); /* TM_vrR(4,vr_value); printf("VR 1 = %d\n",vr_value); TM_vr1R(4,vr_value); printf("VR (bim2) 4 = %d\n",vr_value); */ TM_cptW(1,0x00); TM_cptW(2,0x00); TM_cptW(4,0x00); TM_crW(1,0x1a); TM_crW(2,0x1b); TM_crW(4,0x1c); TM_csrW(1,CSR_CONF); TM_csrW(2,CSR_CONF); TM_csrW(4,CSR_CONF); TM_csrW(3,CSR_CONF1); TM_crW(3,0x0); TM_clear(3); TM_test(3); for(i=0; i<3; i++) printf("Flag %d for vector %d\n", corboflag[i], (10*(i+1))); } waitCORBO() { int signal; printf(" waiting for interrupts \n"); RD13_wait_signal(&signal); switch(signal) { case SIGNAL_SOB: do_sob(signal - 1, 0); break; case SIGNAL_EOB: do_eob(signal - 1, 0); break; case SIGNAL_EVENT: do_event(signal - 1, 0); break; case SIGNAL_SOFT: do_soft(signal - 1, 0); break; default: printf("Invalid SIGNAL received... %d\n", signal); break; } } exitCORBO() { TM_clear(1); TM_clear(2); TM_clear(3); TM_clear(4); TM_csrW(1,0x00); TM_csrW(2,0x00); TM_csrW(4,0x00); value = RD13_flags_remove(corboflag[0]); printf(" error from flags remove is %x \n",value); value = RD13_flags_remove(corboflag[1]); printf(" error from flags remove is %x \n",value); value = RD13_flags_remove(corboflag[2]); printf(" error from flags remove is %x \n",value); printf("Total Triggers %d SOB %d EOB %d\n", counter[0], counter[1], counter[3]); printf("Triggers off burst %d Bad SOB %d Bad EOB %d\n", offburst, badsob, badeob); TM_release; printf("done...\n"); exit(0); } int do_event(i, sts) int i; int sts; { if(state == INBURST) { counter[i]++; evinburst++; printf(" EVENT %d \n",evinburst); do_binary_readout(dspnum); } else offburst++; TM_clear(1); TM_crW(1,0x1a); } int do_sob(i, sts) int i; int sts; { if(state == INBURST) { badsob++; } else { evinburst = 0; counter[i]++; printf("Start Of BURST %d\n", counter[i]); state = INBURST; do_binary_SOB(dspnum); } TM_clear(3); TM_clear(2); TM_crW(2,0x1b); } int do_eob(i, sts) int i; int sts; { if(state == OUTBURST) badeob++; else { counter[i]++; printf("End Of BURST %d. %d Triggers\n", counter[i], evinburst); if (evinburst == 0) no_trig++; state = OUTBURST; do_binary_EOB(dspnum); } TM_clear(4); TM_crW(4,0x1c); RD13_soft_signal(SIGNAL_SOFT); } int do_soft(i, sts) int i; int sts; { counter[i]++; }