Skip to content
Snippets Groups Projects
Commit 7dd8631f authored by Satoru Yamada's avatar Satoru Yamada
Browse files

Separate check_hdr_trl part as a function.

parent 14eec113
No related branches found
No related tags found
No related merge requests found
......@@ -12,6 +12,11 @@ extern "C" int ecs_write(int dev, int bar, unsigned add, int val);
//#define DEBUG
#define OLD_RUN 1
#define OLD_EVENT 2
#define NO_TRAILER 3
const int CRC16_XMODEM_TABLE[] = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
......@@ -102,7 +107,6 @@ int crc_calc_event( unsigned int* data, int start_pos ){
crc_calc( &crc, &exp_run );
first_crc = crc ;
#ifdef DEBUG
printf("Start\n");
for( i = start_pos ; i < start_pos + size ; i++){
......@@ -152,8 +156,8 @@ int crc_calc_event( unsigned int* data, int start_pos ){
}else{
good_flag = 1;
// printf("%.2d Good ! calcd %.4x data %.4x offset %.4x size %.4x szlnk %.4x trl %.8x\n",
// link_num, crc, data[ cur_pos % DMASIZE ] & 0xffff, offset, size, size_link, data[ (cur_pos+1) % DMASIZE ] );
// printf("%.2d Good ! calcd %.4x data %.4x offset %.4x size %.4x szlnk %.4x trl %.8x\n",
// link_num, crc, data[ cur_pos % DMASIZE ] & 0xffff, offset, size, size_link, data[ (cur_pos+1) % DMASIZE ] );
}
link_num++;
......@@ -161,11 +165,11 @@ int crc_calc_event( unsigned int* data, int start_pos ){
}
if( bad ){
for( i = 0 ; i < size ; i++){
printf("%.8x ", data[ ( start_pos + i ) % DMASIZE ] );
if( i % 8 == 7 ) printf("\n");
}
printf("\n");
// for( i = 0 ; i < size ; i++){
// printf("%.8x ", data[ ( start_pos + i ) % DMASIZE ] );
// if( i % 8 == 7 ) printf("\n");
// }
// printf("\n");
good_flag = -2;
}
return good_flag;
......@@ -173,220 +177,226 @@ int crc_calc_event( unsigned int* data, int start_pos ){
}
int main (int argc ,char** argv) {
// Stop trigger
/* 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
// fp = popen( "ssh robbep@vme \"trigft -53 pulse 1000 -1\"" , "r" ) ;
// sleep( 2 ) ;
/* while( fgets( buf , sizeof(buf) , fp ) != NULL ) { */
/* // printf( "A= %d\n" , strncmp( exp , buf , 3 ) ) ; */
/* // printf( strncmp( &buf[0] , 'exp' , 1 ) ) ; */
/* tmp = strdup( buf ) ; */
/* if ( strncmp( exp , buf , 3 ) == 0 ) { */
/* //printf( '%s\n' , buf ) ; */
/* // printf( "ICI\n" ) ; */
/* ptr = strtok( tmp , " " ) ; */
/* ptr = strtok( NULL , " " ) ; */
/* ptr = strtok( NULL , " " ) ; */
/* ptr = strtok( NULL , " " ) ; */
/* // while ( ptr != NULL ) { */
/* run = atoi( ptr ) ; */
/* // ptr = strtok( NULL , " " ) ; */
/* } */
/* //} */
/* } */
/* pclose( fp ) ; */
//sleep( 2 ) ;
int run = 0 ;
FILE* fp;
char * ptr ;
char * tmp ;
char buf[1000] ;
char exp[] = "exp" ;
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, nMissed ;
currentEventIndex = 0 ;
nErr = 0 ;
nEvt = 0 ;
nRetry = 0 ;
nMissed = 0 ;
int read_dma = 1 ;
clock_t begin = clock() ;
int size_zero_cnt = 0;
int start_flag = 1;
int magic;
int size_link;
int offset;
unsigned int next_exp_run, cur_exp_run = 0, evenum, ctime, utime, first_eve = 0;
int start_pos = 0;
int cnt = 0, dma_cnt = 0;
int eve_cnt = 0, first_event_flag = 0, crc_err_eve_cnt = 0;
int print_line(unsigned int *data, int cur_pos ){
printf("pos %.8x : ", cur_pos);
for( int i = 0; i < 8 ; i++ ){
printf("%.8x ", data[ ( cur_pos + i - ( cur_pos % 8 ) ) % DMASIZE ]);
}
printf("\n");
return 0;
}
int check_hdr_trl( unsigned int *data, int cur_pos, int *event_flag,
unsigned int cur_exp_run, unsigned int cur_eve, unsigned int *next_exp_run, unsigned int *next_eve ){
unsigned int trailer = 0;
int size = data[ cur_pos ] ;
*next_exp_run = 0;
*event_flag = 0;
*next_eve = 0;
if ( ( ( data[ ( cur_pos + 1 ) % DMASIZE ] & 0xffff0000 ) == 0x7f7f0000 ) ){
*next_exp_run = data[ ( cur_pos + 2 ) % DMASIZE ] ;
*next_eve = data[ ( cur_pos + 3 ) % DMASIZE ];
trailer = data[ ( cur_pos + size + DMASIZE - 1 ) % DMASIZE ];
if( *next_exp_run < cur_exp_run && cur_exp_run != 0 ){
printf( "OLD-run's event : run %.8x eve %.8x ( cur run %.8x eve %.8x) : pos %.8x size %d\n",
*next_exp_run , *next_eve, cur_exp_run, cur_eve, cur_pos, size );
*event_flag = OLD_RUN;
}else if( *next_eve <= cur_eve && cur_exp_run != 0 ){
printf( "OLD or same event : run %.8x eve %.8x ( cur run %.8x eve %.8x) : pos %.8x size %d\n",
*next_exp_run , *next_eve, cur_exp_run, cur_eve, cur_pos, size );
*event_flag = OLD_EVENT;
}else if( trailer != 0x7fff0006 ){
printf( "No trailer [%.8x] : run %.8x eve %.8x ( cur run %.8x eve %.8x) : pos %.8x size %d\n",
trailer, *next_exp_run , *next_eve, cur_exp_run, cur_eve, cur_pos, size );
print_line( data, ( cur_pos + size + DMASIZE - 1 ) % DMASIZE );
*event_flag = NO_TRAILER;
}else{
printf( "Good event : run %.8x eve %.8x ( cur run %.8x eve %.8x) : pos %.8x size %d\n",
*next_exp_run , *next_eve, cur_exp_run, cur_eve, cur_pos, size );
}
print_line( data, cur_pos );
return 1;
}
return 0;
}
// if( dma_cnt % 1000 == 0 ){
// printf( "7f7f is found. TRAILER %.8x eve %.8x exprun %.8x pos 0x%x dmacnt %d\n",
// data[ ( cur_pos + data[ ( cur_pos + j + DMASIZE ) % DMASIZE ] - 1 + DMASIZE ) % DMASIZE ],
// next_eve, next_exp_run, ( cur_pos + j + 1 ) % DMASIZE, dma_cnt );
// }
int main (int argc ,char** argv) {
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 ) ;
int run = 0 ;
FILE* fp;
char * ptr ;
char * tmp ;
char buf[1000] ;
char exp[] = "exp" ;
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, nMissed ;
currentEventIndex = 0 ;
nErr = 0 ;
nEvt = 0 ;
nRetry = 0 ;
nMissed = 0 ;
clock_t begin = clock() ;
int size_zero_cnt = 0;
int start_flag = 1;
int magic;
int size_link;
int offset;
unsigned int next_exp_run, cur_exp_run = 0, evenum, ctime, utime, first_eve = 0;
int start_pos = 0;
int cnt = 0, dma_cnt = 0;
int eve_cnt = 0, first_event_flag = 0, crc_err_eve_cnt = 0;
int cur_pos = 0;
int ret = 0;
unsigned int cur_eve = 0, next_eve = 0;
int mod_pos = 0;
// if ( ( nEvt % 1000 == 1 ) && ( size != 0 ) ) printf( "Event number %d\n", nEvt ) ;
int cur_pos = 0;
int ret = 0, event_flag = 0;
unsigned int cur_eve = 0, next_eve = 0;
int mod_pos = 0;
// if ( ( nEvt % 1000 == 1 ) && ( size != 0 ) ) printf( "Event number %d\n", nEvt ) ;
//
// Read the 1st data
//
res = pcie40_b2dmapointerread( 0 , &data ) ;
dma_cnt++;
if ( start_flag == 1 ){
ecs_write( 0 , 2 , 0x000501A0 , 0x0 ) ;
start_flag = 0;
}
//
// Main loop
//
while( 1 ){
//
// Read the 1st data
// Search 7f7f header magic word.
//
if ( read_dma == 1 ) {
// set busy
//res = ecs_write( 0 , 2 , 0x000501A0 , 0x1 ) ;
//sleep(5);
while( 1 ){
ret = check_hdr_trl( data, cur_pos, &event_flag, cur_exp_run, cur_eve, &next_exp_run, &next_eve );
if( ret == 1 && event_flag == 0){
break;
}
usleep(1000); // to avoid BUSY loop
//
// Refresh DMA memory
//
res = pcie40_b2dmapointerread( 0 , &data ) ;
dma_cnt++;
if ( start_flag == 1 ){
ecs_write( 0 , 2 , 0x000501A0 , 0x0 ) ;
start_flag = 0;
int wait_flag = 0;
//
// Scan to find x"7f7f...."
//
if( cnt > 100 ){
cnt = 0;
int j = 0 ;
for ( j = 0 ; j < DMASIZE ; ++j ) {
ret = check_hdr_trl( data, cur_pos + j, &event_flag, cur_exp_run,
cur_eve, &next_exp_run, &next_eve );
if( ret == 1 ){
cur_pos = cur_pos + j;
break;
}
}
}
//usleep( 5 ) ;
// release busy
//res = ecs_write( 0 , 2 , 0x000501A0 , 0x0 ) ;
read_dma = 1 ;
}
cnt++;
}
//
// Main loop
// Check event-data
//
while( 1 ){
while( 1 ){
// if( ( data[ ( cur_pos + 1 ) % DMASIZE ] & 0xffff0000 ) == 0x7f7f0000 ){
// printf("HEAD %.8x TRAIL %.8x\n", data[ ( cur_pos + 1 ) % DMASIZE ],
// data[ ( cur_pos + data[ cur_pos % DMASIZE ] - 1 + DMASIZE ) % DMASIZE ] );
// }
// if( !( ( ( ( magic = data[ ( cur_pos + 1 ) % DMASIZE ] ) & 0xffff0000 ) != 0x7f7f0000 ) ) ){
if( !( ( ( ( magic = data[ ( cur_pos + 1 ) % DMASIZE ] ) & 0xffff0000 ) != 0x7f7f0000 )
|| data[ ( cur_pos + data[ cur_pos % DMASIZE ] - 1 + DMASIZE ) % DMASIZE ] != 0x7fff0006 ) ){
break;
}
// usleep(1000); // to avoid BUSY loop
//
// Refresh DMA memory
//
res = pcie40_b2dmapointerread( 0 , &data ) ;
dma_cnt++;
int wait_flag = 0;
//
// Scan to find x"7f7f...."
//
if( cnt > 100 ){
cnt = 0;
int j = 0 ;
for ( j = 0 ; j < DMASIZE ; ++j ) {
#ifdef DEBUG
printf("%.8x %d\n", data[ ( cur_pos + j + 1 ) % DMASIZE ], cur_pos + j );
#ifdef FULL_CHECK
if( ( data[ ( cur_pos + data[ cur_pos % DMASIZE ] - 2 + DMASIZE ) % DMASIZE ] != 0x00000000 ) ||
( data[ ( cur_pos + data[ cur_pos % DMASIZE ] - 3 + DMASIZE ) % DMASIZE ] != 0x7faf0000 ) ){
printf("Full ! %.8x %.8x\n",
data[ ( cur_pos + data[ cur_pos % DMASIZE ] - 3 + DMASIZE ) % DMASIZE ],
data[ ( cur_pos + data[ cur_pos % DMASIZE ] - 2 + DMASIZE ) % DMASIZE ] );
}
#endif
if ( ( ( data[ ( cur_pos + j + 1 ) % DMASIZE ] & 0xffff0000 ) == 0x7f7f0000 ) ){
next_eve = data[ ( cur_pos + j + 3 ) % DMASIZE ];
next_exp_run = data[ ( cur_pos + j + 2 ) % DMASIZE ] ;
if( dma_cnt % 1000 == 0 ){
printf( "7f7f is found. TRAILER %.8x eve %.8x exprun %.8x pos %d dmacnt %d\n",
data[ ( cur_pos + j + data[ ( cur_pos + j + DMASIZE ) % DMASIZE ] - 1 + DMASIZE ) % DMASIZE ],
next_eve, next_exp_run, ( cur_pos + j + 1 ) % DMASIZE, dma_cnt );
}
if( next_eve > cur_eve && next_exp_run >= cur_exp_run ){
/* if( data[ ( ( data[ ( cur_pos + j + DMASIZE ) % DMASIZE ] ) - 1 + DMASIZE ) % DMASIZE ] != 0x7fff0006 ){ */
/* usleep(1000); */
/* break; */
/* } */
cur_pos = ( cur_pos + j + DMASIZE ) % DMASIZE;
size = data[ cur_pos ];
// printf( "Detect new Event number prev %.8x new %.8x pos %.8x size %.8x\n" , cur_eve , next_eve, cur_pos, size );
break;
}else{
// printf( "Detect Old Event number prev %.8x new %.8x pos %d\n" , cur_eve , next_eve, ( cur_pos + j + DMASIZE ) % DMASIZE );
break;
}
}else{
continue;
}
}
}
cnt++;
}
size = data[ cur_pos ] ;
//
// Check event-data
//
next_eve = data[ ( cur_pos + 3 ) % DMASIZE ];
next_exp_run = data[ ( cur_pos + 2 ) % DMASIZE ];
if( first_event_flag == 0 || cur_exp_run != next_exp_run ){
first_event_flag = 1;
first_eve = next_eve;
// crc_err_eve_cnt = 0;
// eve_cnt = 0;
}
eve_cnt++;
ret = crc_calc_event( data, cur_pos );
// printf("crc ret %d cnt %d\n", eve_cnt);
if( ret != 1 ){
crc_err_eve_cnt++;
}
size = data[ cur_pos ] ;
if(ret != 1 || eve_cnt % 100 == 0 ){
printf( "Event number prev %.8x new %.8x pos %.8x size %.8x\n" , cur_eve , next_eve, cur_pos, size );
}
cur_eve = next_eve;
cur_exp_run = next_exp_run;
if(ret != 1 || eve_cnt % 100 == 0 ){
printf("STATUS : tot eve %d read eve %d err_eve %d run %d\n", next_eve - first_eve, eve_cnt, crc_err_eve_cnt, cur_exp_run );
}
mod_pos = ( cur_pos + size ) % 8;
if( mod_pos != 0 ){
cur_pos = ( cur_pos + size + DMASIZE + ( 8 - mod_pos) ) % DMASIZE ;
}else{
cur_pos = ( cur_pos + size + DMASIZE ) % DMASIZE ;
}
next_eve = data[ ( cur_pos + 3 ) % DMASIZE ];
next_exp_run = data[ ( cur_pos + 2 ) % DMASIZE ];
if( first_event_flag == 0 || cur_exp_run != next_exp_run ){
first_event_flag = 1;
first_eve = next_eve;
// crc_err_eve_cnt = 0;
// eve_cnt = 0;
}
eve_cnt++;
ret = crc_calc_event( data, cur_pos );
// printf("crc ret %d cnt %d\n", eve_cnt);
if( ret != 1 ){
crc_err_eve_cnt++;
}
if(ret != 1 || eve_cnt % 100 == 0 ){
printf( "Event number prev %.8x new %.8x pos %.8x size %.8x\n" , cur_eve , next_eve, cur_pos, size );
}
cur_eve = next_eve;
cur_exp_run = next_exp_run;
if(ret != 1 || eve_cnt % 100 == 0 ){
printf("STATUS : tot eve %d read eve %d err_eve %d run %.8x\n", next_eve - first_eve, eve_cnt, crc_err_eve_cnt, cur_exp_run );
}
mod_pos = ( cur_pos + size ) % 8;
if( mod_pos != 0 ){
cur_pos = ( cur_pos + size + DMASIZE + ( 8 - mod_pos) ) % DMASIZE ;
}else{
cur_pos = ( cur_pos + size + DMASIZE ) % DMASIZE ;
}
}
clock_t end = clock();
time_spent += (double)(end - begin) / CLOCKS_PER_SEC;
clock_t end = clock();
time_spent += (double)(end - begin) / CLOCKS_PER_SEC;
ecs_close( 0 , 0 ) ;
ecs_close( 0 , 0 ) ;
printf( "Timing = %f s\n" , time_spent ) ;
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 ;
}
printf( "Timing = %f s\n" , time_spent ) ;
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.
Finish editing this message first!
Please register or to comment