Skip to content
Snippets Groups Projects
Commit 8c368ffd authored by yamadas's avatar yamadas
Browse files

Check if the next event's 7f7f magic word and, if not, wait until it appears.

    [INFO] Good! run 00005300 prevrun 00005300 eve 00003a02 pos 000019c8 size 00000118
    [INFO] Good! run 00005300 prevrun 00005300 eve 00003a03 pos 00001ae0 size 00000100
    [INFO] Good! run 00005300 prevrun 00005300 eve 00003a04 pos 00001be0 size 00000028
    Invalid magic number 60616263 pos 7176 : 5c5d5e5f 60616263 64656667 68696a6b 6c6d6e6f 70717273 74757677 7879
parent c9c0382f
No related branches found
No related tags found
2 merge requests!6Master,!86links slc tool
......@@ -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 , &currentEventIndex , &crc , &run , &bad , &evn , &retry ,
&pctime , &putime , &nMissed ) ;
if ( 0 == size ) {
read_dma = 1 ;
continue ;
prev_ce = currentEventIndex;
if( decode_data_wUL( data , &currentEventIndex , &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 ;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment