diff --git a/Pcie40Applications/main_pcie40_ul.c b/Pcie40Applications/main_pcie40_ul.c index 41edc130d8d0ecbe9ac356b72647e816b53b2819..d2665fd537e0d8f0d7cbcf91d1beac2b10f3d327 100644 --- a/Pcie40Applications/main_pcie40_ul.c +++ b/Pcie40Applications/main_pcie40_ul.c @@ -39,7 +39,14 @@ const int CRC16_XMODEM_TABLE[] = { 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0, } ; - +int print_data( unsigned int *data ){ + int j = 0; + printf("Try -----------------------------------\n"); + for ( j = 0 ; j < DMASIZE ; ++j ) { + printf( "%.8x " , data[ j ] ) ; + if( j % 8 == 7 ) printf("\n"); + } +} int crc_calc( int * crc, unsigned int * data ){ int byte1, byte2, byte3, byte4 ; @@ -53,16 +60,16 @@ int crc_calc( int * crc, unsigned int * data ){ *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 decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc , int * prev_exp_run , int * bad , int *evn , int * retry , int * pctime , int * putime , int * nmissed ) { int magic; - int size, size_link; - int ix ; + int size, size_link, size_256; + int ix, new = 0; int offset; - unsigned int exp_run, evenum, ctime, utime; + unsigned int exp_run, evenum, ctime, utime, cur_pos = 0; if( *ce < 0 || DMASIZE < *ce ){ printf("Current positoin is out of DMASIZE %d. Exiting...\n", *ce ); @@ -72,7 +79,9 @@ int decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc , int * *crc = 0 ; size = data[ ( *ce ) % DMASIZE ] ; magic = data[ ( *ce + 1 ) % DMASIZE ] ; + exp_run = data[ ( *ce + 2 ) % DMASIZE ]; evenum = data[ ( *ce + 3 ) % DMASIZE ]; + // Check a new event is available in the memory if( ( magic & 0xffff0000 ) != 0x7f7f0000 ){ printf("Invalid magic number %.8x pos %d : ", magic, *ce ); @@ -80,34 +89,72 @@ int decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc , int * data[ ( *ce ) % DMASIZE ], data[ ( *ce + 1 ) % DMASIZE ], data[ ( *ce + 2 ) % DMASIZE ], data[ ( *ce + 3 ) % DMASIZE ], data[ ( *ce + 4 ) % DMASIZE ], data[ ( *ce + 5 ) % DMASIZE ], data[ ( *ce + 6 ) % DMASIZE ], data[ ( *ce + 7 ) % DMASIZE ] ); + + // print_data(data); // search for next good event int j = 0 ; for ( j = *ce ; j < *ce + DMASIZE ; ++j ) { - if ( ( ( data[ j ] & 0xffff0000 ) == 0x7f7f0000 ) && + if ( ( ( data[ j % DMASIZE ] & 0xffff0000 ) == 0x7f7f0000 ) && ( ( data[ ( j + 2 ) % DMASIZE ] > *evn ) ) ) { size = data[ ( j - 1 ) % DMASIZE ] ; + exp_run = data[ ( j + 1 ) % DMASIZE ]; evenum = data[ ( j + 2 ) % DMASIZE ]; - *ce = ( j - 1 ) % DMASIZE; - printf("New ! eve %.8d pos %d size %d : ", evenum, *ce, size); - printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n", - data[ ( *ce ) % DMASIZE ], data[ ( *ce + 1 ) % DMASIZE ], data[ ( *ce + 2 ) % DMASIZE ], - data[ ( *ce + 3 ) % DMASIZE ], data[ ( *ce + 4 ) % DMASIZE ], data[ ( *ce + 5 ) % DMASIZE ], - data[ ( *ce + 6 ) % DMASIZE ], data[ ( *ce + 7 ) % DMASIZE ] ); + cur_pos = ( j - 1 ) % DMASIZE; + printf("New ! eve %.8x pos %d size %d : ", evenum, j - 1, size); + new = 1; + printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n", + data[ ( j - 1 ) % DMASIZE ],data[ ( j ) % DMASIZE ], + data[ ( j + 1 ) % DMASIZE ], data[ ( j + 2 ) % DMASIZE ], + data[ ( j + 3 ) % DMASIZE ], data[ ( j + 4 ) % DMASIZE ], data[ ( j + 5 ) % DMASIZE ], + data[ ( j + 6 ) % DMASIZE ], data[ ( j + 7 ) % DMASIZE ], data[ ( j + 8 ) % DMASIZE ]); break ; } - if( j == *ce + DMASIZE - 1 ) return 0; + if( j == *ce + DMASIZE - 1 ) return -1; } - }else{ - printf("Good! eve %.8d pos %d size %d\n", evenum, *ce, size); } - if( evenum - *evn != 1 ){ - printf("Missing events cur %d pre %d\n", evenum, *evn ); + + + printf("[INFO] Good! run %.8x prevrun %.8x eve %.8x pos %.8x size %.8x\n", exp_run, *prev_exp_run, evenum, *ce, size); + + + if( size % 8 != 0 ){ + size_256 = ( size/8 + 1 )*8; + } else { + size_256 = size ; } - *evn = evenum; + if( exp_run == *prev_exp_run && evenum - *evn != 1 ){ + printf("[WARNING] Missing events run cur %.8x pre %.8x eve cur %.8x pre %.8x\n", exp_run, *prev_exp_run, evenum, *evn ); + } - return size; + if( exp_run < *prev_exp_run && *prev_exp_run < 0x1000000 ){ + printf("[NOTICE] Reached prev. run data : run cur %.8x pre %.8x eve cur %.8x pre %.8x\n", exp_run, *prev_exp_run, evenum, *evn ); + return -1; + }else if( exp_run > 0x1000000 ){ + printf("[ERROR] Too large run num! run %.8x prevrun %.8x eve %.8x pos %.8x size %.8x\n", exp_run, *prev_exp_run, evenum, *ce, size); + if( new == 1 ){ + printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n", + data[ ( cur_pos ) % DMASIZE ], + data[ ( cur_pos + 1 ) % DMASIZE ], data[ ( cur_pos + 2 ) % DMASIZE ], + data[ ( cur_pos + 3 ) % DMASIZE ], data[ ( cur_pos + 4 ) % DMASIZE ], data[ ( cur_pos + 5 ) % DMASIZE ], + data[ ( cur_pos + 6 ) % DMASIZE ], data[ ( cur_pos + 7 ) % DMASIZE ], data[ ( cur_pos + 8 ) % DMASIZE ]); + }else{ + printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n", + data[ ( *ce ) % DMASIZE ], data[ ( *ce + 1 ) % DMASIZE ], data[ ( *ce + 2 ) % DMASIZE ], + data[ ( *ce + 3 ) % DMASIZE ], data[ ( *ce + 4 ) % DMASIZE ], data[ ( *ce + 5 ) % DMASIZE ], + data[ ( *ce + 6 ) % DMASIZE ], data[ ( *ce + 7 ) % DMASIZE ] ); + } + return -1; + }else{ + if( new == 1 ) *ce = cur_pos; + *ce = *ce + size_256; + // printf("new pos %d size %d\n", *ce, size_256); + *prev_exp_run = exp_run; + *evn = evenum; + } + + return 0; if ( 0 == size ) return 0 ; @@ -122,7 +169,7 @@ int decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc , int * // 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 + if ( ( exp_run >> 8 ) != *prev_exp_run ) { // it may be that the old data is still in memory return 0 ; } @@ -227,7 +274,7 @@ int main(int argc ,char** argv) { FILE* fp; char * ptr ; char * tmp ; - fp = popen( "ssh yamadas@ttd7 \"trigft -23 pulse 10 -1\"" , "r" ) ; + fp = popen( "ssh yamadas@ttd7 \"trigft -23 poisson 1000 -1\"" , "r" ) ; char buf[1000] ; char exp[] = "exp" ; sleep( 2 ) ; @@ -259,6 +306,7 @@ int main(int argc ,char** argv) { int retry ; int bad ; int evn ; + int ret = 0; evn = 0 ; bad = 0 ; retry = 0 ; @@ -267,8 +315,9 @@ int main(int argc ,char** argv) { putime = 0 ; int i, j ; - int size, size_256, currentEventIndex, crc, nErr, nEvt, nRetry, nMissed ; + int size, size_256, currentEventIndex, prev_ce, crc, nErr, nEvt, nRetry, nMissed ; currentEventIndex = 0 ; + prev_ce = 0; nErr = 0 ; nEvt = 0 ; nRetry = 0 ; @@ -277,9 +326,9 @@ int main(int argc ,char** argv) { clock_t begin = clock() ; // for ( i = 0 ; i < 10000000 ; ++i ) { - for ( i = 0 ; i < 10 ; ++i ) { + for ( i = 0 ; i < 1000000 ; ++i ) { - if ( ( nEvt % 1000 == 1 ) && ( size != 0 ) ) printf( "Event number %d\n", nEvt ) ; + // 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 ) ; @@ -292,44 +341,21 @@ int main(int argc ,char** argv) { read_dma = 1 ; } - printf("Try %.8x -----------------------------------\n",i ); - for ( j = 0 ; j < DMASIZE ; ++j ) { - printf( "%.8x " , data[ j ] ) ; - if( j % 8 == 7 ) printf("\n"); - } bad = 0 ; - - printf("index %d data %.8x\n", currentEventIndex, data[ ( currentEventIndex + 1 ) % DMASIZE ] ); - while( currentEventIndex < DMASIZE && 0 <= currentEventIndex ){ + while( currentEventIndex < DMASIZE && currentEventIndex >= 0 ){ + // printf("index %d data %.8x\n", currentEventIndex, data[ ( currentEventIndex + 1 ) % DMASIZE ] ); currentEventIndex = currentEventIndex % DMASIZE ; - size = decode_data_wUL( data , ¤tEventIndex , &crc , &run , &bad , &evn , &retry , - &pctime , &putime , &nMissed ) ; - if ( 0 == size ) { - read_dma = 1 ; - continue ; + prev_ce = currentEventIndex; + if( decode_data_wUL( data , ¤tEventIndex , &crc , &run , &bad , &evn , &retry , &pctime , &putime , &nMissed ) < 0 ){ + sleep(1); + break; } - if ( retry != 0 ) nRetry++ ; - if ( size == -1 ) { - nErr++ ; - read_dma = 1 ; - continue ; - } - if ( bad == 1 ) nErr++ ; - // evn++ ; - - if( size % 8 != 0 ){ - size_256 = ( size/8 + 1 )*8; - } else { - size_256 = size ; - } - - // printf("cur %d sz %d\n", currentEventIndex, size_256 ); - currentEventIndex = currentEventIndex + size_256; - nEvt++ ; } currentEventIndex = currentEventIndex % DMASIZE ; + printf("cnt %d pos %d run %.8x evn %.8x\n", nEvt, currentEventIndex, run, evn); + nEvt++; read_dma = 1 ; retry = 0 ; }