Skip to content
Snippets Groups Projects
Commit 54fab3cf authored by Patrick Robbe's avatar Patrick Robbe
Browse files

Improve data checking program

parent 32600452
No related branches found
No related tags found
2 merge requests!6Master,!86links slc tool
......@@ -41,21 +41,21 @@ const int CRC16_XMODEM_TABLE[] = {
int crc_calc( int crc, unsigned int data ){
int byte1, byte2, byte3, byte4, crc_temp ;
byte1 = data & 0xFF;
byte2 = ( data & 0xFF00 ) >> 8;
byte3 = ( data & 0xFF0000 ) >> 16;
byte4 = ( data & 0xFF000000 ) >> 24;
crc_temp = (((crc)<<8)&0xff00) ^ CRC16_XMODEM_TABLE[(((crc)>>8)&0xff)^byte4] ;
crc_temp = (((crc_temp)<<8)&0xff00) ^ CRC16_XMODEM_TABLE[(((crc_temp)>>8)&0xff)^byte3] ;
crc_temp = (((crc_temp)<<8)&0xff00) ^ CRC16_XMODEM_TABLE[(((crc_temp)>>8)&0xff)^byte2] ;
crc_temp = (((crc_temp)<<8)&0xff00) ^ CRC16_XMODEM_TABLE[(((crc_temp)>>8)&0xff)^byte1] ;
return crc_temp;
int crc_calc( int * crc, unsigned int * data ){
int byte1, byte2, byte3, byte4 ;
byte1 = (*data) & 0xFF;
byte2 = ( (*data) & 0xFF00 ) >> 8;
byte3 = ( (*data) & 0xFF0000 ) >> 16;
byte4 = ( (*data) & 0xFF000000 ) >> 24;
*crc = ((((*crc))<<8)&0xff00) ^ CRC16_XMODEM_TABLE[((((*crc))>>8)&0xff)^byte4] ;
*crc = ((((*crc))<<8)&0xff00) ^ CRC16_XMODEM_TABLE[((((*crc))>>8)&0xff)^byte3] ;
*crc = ((((*crc))<<8)&0xff00) ^ CRC16_XMODEM_TABLE[((((*crc))>>8)&0xff)^byte2] ;
*crc = ((((*crc))<<8)&0xff00) ^ CRC16_XMODEM_TABLE[((((*crc))>>8)&0xff)^byte1] ;
}
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 * bad , int *evn , int * retry , int * pctime , int * putime ,
int * nmissed ) {
int magic;
int size, size_link;
......@@ -65,15 +65,42 @@ int decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc , int *
unsigned int exp_run, evenum, ctime, utime;
*crc = 0 ;
size = data[ ( *ce ) % DMASIZE ] ;
size = data[ ( *ce ) % DMASIZE ] ;
magic = data[ ( *ce + 1 ) % DMASIZE ] ;
// Check a new event is available in the memory
if( ( magic & 0xffff0000 ) != 0x7f7f0000 ){
// printf("Invalid magic number %.8x\n", magic );
return 0;
}
if ( ( *evn > 1 ) && ( ( ( data[ (*ce - 2 ) % DMASIZE ] & 0xffff0000 ) != 0xbbbc0000 ) &&
( ( data[ (*ce -2) % DMASIZE ] & 0xFFFF0000 ) != 0x7FFF0000 )) ) {
// printf( "Problem %d retry %d\n" , *evn , *retry ) ;
++(*retry) ;
//ecs_write( 0 , 2 , 0x000501A0 , 0x1 ) ;
if ( *retry < 3 ) {
return 0 ;
}
*retry = 0 ;
// search for next good event
int j = 0 ;
for ( j = 0 ; j < DMASIZE ; ++j ) {
if ( ( ( data[ j ] & 0xffff0000 ) == 0x7f7f0000 ) &&
( ( data[ ( j + 2 ) % DMASIZE ] > *evn ) ) ) {
size = data[ ( j - 1 ) % DMASIZE ] ;
*ce = ( ( j - 1 ) % DMASIZE ) ;
//printf( "New event number %d %d\n" , *evn , data[ ( j + 2 ) % DMASIZE ] ) ;
break ;
}
}
} else {
return 0;
}
}
if ( 0 == size ) return 0 ;
ix = *ce + 4;
ctime = data[ ix % DMASIZE ];
ix = *ce + 3;
......@@ -81,82 +108,119 @@ int decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc , int *
ix = *ce + 5;
utime = data[ ix % DMASIZE ];
ix = *ce + 2;
exp_run = data[ ix % DMASIZE ] >> 8 ;
// 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 ) ;
exp_run = data[ ix % DMASIZE ] ;
// printf("exprun %.8x eve %d ce %d\n", exp_run, evenum , *ce );
if ( ( exp_run >> 8 ) != *run ) { // it may be that the old data is still in memory
return 0 ;
}
if ( evenum < *evn ) return 0 ;
if ( evenum != *evn ) {
printf( "Bad event number %d %d %d %d %d %d\n" , evenum , *evn , ctime , utime , *pctime , *putime ) ;
printf( "Bad event number %d %d %d %d %d %d retry = %d\n" , evenum , *evn , ctime , utime , *pctime , *putime ,
*retry ) ;
*nmissed += (- *evn + evenum ) ;
*evn = evenum ;
*bad = 1 ;
//if ( evenum != 0 ) {
// int j = 0 ;
// for ( j = 0 ; j < DMASIZE ; ++j ) {
// printf( "%d %.8x %d\n" , j , data[ j ] , *ce ) ;
// }
// exit( 0 ) ;
//}
}
*putime = utime ;
*pctime = ctime ;
offset = 8; // size of ROB header [words]
int first_crc ;
*crc = 0xffff ;
crc_calc( crc, &ctime );
crc_calc( crc, &evenum );
crc_calc( crc, &utime );
crc_calc( crc, &exp_run );
first_crc = *crc ;
while( offset + 4 != size ){ // 4 = ROB trailer size
*crc = 0xffff ;
ix = *ce + offset;
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 << 8 ) );
*crc = first_crc ;
for ( ix = *ce + offset + 2 ; ix < *ce + offset + size_link -2; ++ix ) {
*crc = crc_calc( *crc, data[ ix % DMASIZE ] );
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
//ecs_write( 0 , 2 , 0x000501A0 , 0x1 ) ;
++(*retry) ;
if ( *retry < 3 ) return 0 ;
if ( *retry < 10 ) {
return 0 ;
}
*bad = 1 ;
printf( "Error in CRC comparison calc %.8x : data %.8x\n" , *crc , data[ ix % DMASIZE ] );
printf( "Error in CRC comparison calc %.8x : data %.8x, offset = %d, retry = %d\n" , *crc , data[ ix % DMASIZE ] ,
offset, *retry );
// if ( evenum != 0 ) {
// int j = 0 ;
// for ( j = 0 ; j < DMASIZE ; ++j ) {
// printf( "%d %.8x %d\n" , j , data[ j ] , *ce ) ;
// }
// exit( 0 ) ;
//}
*retry = 0 ;
}
// ecs_write( 0 , 2 , 0x000501A0 , 0x0 ) ;
offset += size_link;
if( offset + 4 > size ){
printf( "Invalid data size sum of link size %d size = %d\n" ,
offset + 4, size );
// if ( evenum != 0 ) {
// int j = 0 ;
// for ( j = 0 ; j < DMASIZE ; ++j ) {
// printf( "%d %.8x %d\n" , j , data[ j ] , *ce ) ;
// }
// exit( 0 ) ;
//}
return -1 ;
}
}
return size ;
}
int main (int argc ,char** argv) {
// Stop trigger
system( "ssh vme \"resetft -80\"" ) ;
system( "ssh robbep@vme \"resetft -53\"" ) ;
sleep( 2 ) ;
int res = ecs_open( 0 , 0 ) ;
if ( -1 == res ) printf("ERROR: Could not open device (BAR 0)\n") ;
else printf("SUCCESS: Device opened for DMA\n");
res = ecs_open( 0 , 2 ) ;
// ecs_write( 0 , 2 , 0x000501A0 , 0x0 ) ;
ecs_write( 0 , 2 , 0x000501A0 , 0x1 ) ;
pcie40_b2dmabufferreset( 0 ) ;
// Start trigger
int run = 0 ;
FILE* fp;
char * ptr ;
char * tmp ;
fp = popen( "ssh vme \"trigft -80 pulse 100 -1\"" , "r" ) ;
fp = popen( "ssh robbep@vme \"trigft -53 pulse 1000 -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 ) ) ;
......@@ -192,24 +256,40 @@ int main (int argc ,char** argv) {
putime = 0 ;
int i ;
int size, size_256, currentEventIndex, crc, nErr, nEvt, nRetry ;
int size, size_256, currentEventIndex, crc, nErr, nEvt, nRetry, nMissed ;
currentEventIndex = 0 ;
nErr = 0 ;
nEvt = 0 ;
nRetry = 0 ;
clock_t begin = clock();
for ( i = 0 ; i < 1000000 ; ++i ) {
if ( ( nEvt % 10000 == 1 ) && ( size != 0 ) ) printf( "Event number %d\n", nEvt ) ;
nMissed = 0 ;
int read_dma = 1 ;
clock_t begin = clock() ;
for ( i = 0 ; i < 10000000 ; ++i ) {
if ( ( nEvt % 1000 == 1 ) && ( size != 0 ) ) printf( "Event number %d\n", nEvt ) ;
if ( read_dma == 1 ) {
// set busy
//res = ecs_write( 0 , 2 , 0x000501A0 , 0x1 ) ;
//sleep(5);
res = pcie40_b2dmapointerread( 0 , &data ) ;
if ( 1 == i ) ecs_write( 0 , 2 , 0x000501A0 , 0x0 ) ;
//usleep( 5 ) ;
// release busy
//res = ecs_write( 0 , 2 , 0x000501A0 , 0x0 ) ;
read_dma = 1 ;
}
res = pcie40_b2dmapointerread( 0 , &data ) ;
bad = 0 ;
size = decode_data_wUL( data , &currentEventIndex , &crc , &run , &bad , &evn , &retry ,
&pctime , &putime ) ;
if ( 0 == size ) continue ;
&pctime , &putime , &nMissed ) ;
if ( 0 == size ) {
read_dma = 1 ;
continue ;
}
if ( retry != 0 ) nRetry++ ;
retry = 0 ;
if ( size == -1 ) {
nErr++ ;
read_dma = 1 ;
continue ;
}
if ( bad == 1 ) nErr++ ;
......@@ -217,12 +297,16 @@ int main (int argc ,char** argv) {
if( size % 8 != 0 ){
size_256 = ( size/8 + 1 )*8;
} else {
size_256 = size ;
}
currentEventIndex = ( currentEventIndex + size_256 ) % DMASIZE ;
nEvt++ ;
read_dma = 1 ;
retry = 0 ;
}
clock_t end = clock();
time_spent += (double)(end - begin) / CLOCKS_PER_SEC;
......@@ -234,5 +318,6 @@ int main (int argc ,char** argv) {
printf( "Number of events = %d \n", nEvt ) ;
printf( "Number of errors = %d \n", nErr ) ;
printf( "Number of retries = %d \n", nRetry ) ;
printf( "Number of missed = %d \n", nMissed ) ;
return 0 ;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment