diff --git a/Pcie40Applications/main_pcie40_ul.c b/Pcie40Applications/main_pcie40_ul.c index e1b14f15973dfff0b5f113935754041a768e0e36..35988a3ee7dd03085c280852965c021657ba168d 100644 --- a/Pcie40Applications/main_pcie40_ul.c +++ b/Pcie40Applications/main_pcie40_ul.c @@ -54,7 +54,8 @@ int crc_calc( int crc, unsigned int data ){ return crc_temp; } -int decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc , int * run ) { +int decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc , int * run , + int * bad , int *evn , int * retry , int * pctime , int * putime ) { int magic; int size, size_link; @@ -82,13 +83,20 @@ int decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc , int * ix = *ce + 2; exp_run = data[ ix % DMASIZE ] >> 8 ; - printf("exprun %.8x eve %d\n", exp_run, evenum ); + // printf("exprun %.8x eve %d\n", exp_run, evenum ); if ( exp_run != *run ) { // it may be that the old data is still in memory - printf( "RUN = %d\n", *run ) ; + // printf( "RUN = %d\n", *run ) ; return 0 ; } + if ( evenum != *evn ) { + printf( "Bad event number %d %d %d %d %d %d\n" , evenum , *evn , ctime , utime , *pctime , *putime ) ; + } + + *putime = utime ; + *pctime = ctime ; + offset = 8; // size of ROB header [words] @@ -96,24 +104,30 @@ int decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc , int * *crc = 0xffff ; ix = *ce + offset; - size_link = data[ ix ] & 0x00ffffff ; + size_link = data[ ix % DMASIZE ] & 0x00ffffff ; + + if ( 0 == size_link ) return 0 ; // it could be that the memory was read + // while being filled // Calculation of CRC *crc = crc_calc( *crc, ctime ); *crc = crc_calc( *crc, evenum ); *crc = crc_calc( *crc, utime ); - *crc = crc_calc( *crc, exp_run ); + *crc = crc_calc( *crc, ( exp_run << 8 ) ); - for ( ix = *ce + offset + 2 ; ix < *ce + offset + size_link -2; ix++ ) { + for ( ix = *ce + offset + 2 ; ix < *ce + offset + size_link -2; ++ix ) { *crc = crc_calc( *crc, data[ ix % DMASIZE ] ); } ix = *ce + 8 + size_link -2; if( ( *crc & 0xffff ) != ( data[ ix % DMASIZE ] & 0xffff ) ){ + // retry, could be that the event is not fully in memory + ++(*retry) ; + if ( *retry < 3 ) return 0 ; + *bad = 1 ; printf( "Error in CRC comparison calc %.8x : data %.8x\n" , *crc , data[ ix % DMASIZE ] ); - return -1; - }else{ } + offset += size_link; if( offset + 4 > size ){ printf( "Invalid data size sum of link size %d size = %d\n" , @@ -139,10 +153,10 @@ int main (int argc ,char** argv) { FILE* fp; char * ptr ; char * tmp ; - fp = popen( "ssh vme \"trigft -80 pulse 1 10\"" , "r" ) ; + fp = popen( "ssh vme \"trigft -80 pulse 100 -1\"" , "r" ) ; char buf[1000] ; char exp[] = "exp" ; - sleep( 2 ) ; + // sleep( 2 ) ; while( fgets( buf , sizeof(buf) , fp ) != NULL ) { // printf( "A= %d\n" , strncmp( exp , buf , 3 ) ) ; // printf( strncmp( &buf[0] , 'exp' , 1 ) ) ; @@ -168,7 +182,14 @@ int main (int argc ,char** argv) { unsigned int * data ; double time_spent ; int retry ; + int bad ; + int evn ; + evn = 0 ; + bad = 0 ; retry = 0 ; + int pctime, putime ; + pctime = 0 ; + putime = 0 ; int i ; int size, size_256, currentEventIndex, crc, nErr, nEvt, nRetry ; @@ -177,18 +198,23 @@ int main (int argc ,char** argv) { nEvt = 0 ; nRetry = 0 ; clock_t begin = clock(); - for ( i = 0 ; i < 100 ; ++i ) { - if ( nEvt % 10000 == 1 ) printf( "Event number %d\n", nEvt ) ; + for ( i = 0 ; i < 1000000 ; ++i ) { + if ( ( nEvt % 10000 == 1 ) && ( size != 0 ) ) printf( "Event number %d\n", nEvt ) ; res = pcie40_b2dmapointerread( 0 , &data ) ; - - size = decode_data_wUL( data , ¤tEventIndex , &crc , &run ) ; + bad = 0 ; + size = decode_data_wUL( data , ¤tEventIndex , &crc , &run , &bad , &evn , &retry , + &pctime , &putime ) ; if ( 0 == size ) continue ; + if ( retry != 0 ) nRetry++ ; + retry = 0 ; if ( size == -1 ) { nErr++ ; continue ; } - + if ( bad == 1 ) nErr++ ; + evn++ ; + if( size % 8 != 0 ){ size_256 = ( size/8 + 1 )*8; }