From 3061a06afb24c58fdea1a992f215d1fcab701fb4 Mon Sep 17 00:00:00 2001 From: hadaq Date: Thu, 7 Nov 2002 10:39:04 +0000 Subject: [PATCH] improved event-size checking. Sets error bit and reads until buffer end is reached. WK --- hadaq/hwtip.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/hadaq/hwtip.c b/hadaq/hwtip.c index 5515850..7c8a594 100644 --- a/hadaq/hwtip.c +++ b/hadaq/hwtip.c @@ -1,4 +1,4 @@ -static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtip.c,v 1.27 2002-10-31 14:13:53 hadaq Exp $"; +static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtip.c,v 1.28 2002-11-07 10:39:04 hadaq Exp $"; #include #include @@ -21,6 +21,9 @@ static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hada #define max(x,y) ( (x>y) ? x : y ) +/* undef if you don't want PRINTOUT if there was an error in the tdc data, mt*/ +#define BUFFER_PRINTOUT_ENABLED + static int ourVmeAccessOK; void sigbusHandler(int sig) @@ -112,6 +115,7 @@ int HwTip_readSubEvt(HwTip * my, void *subEvt) unsigned long currAddr = my->currAddr; unsigned long header; int size; + int byteSize; int statusWord, crateNumber = 0xff; int foundCBLTTrailerFlag = 0; int foundCBLTHeaderFlag = 0; @@ -120,23 +124,24 @@ int HwTip_readSubEvt(HwTip * my, void *subEvt) unsigned long tdcCounter = 0; unsigned long tdcEventCounter, trigTag,evtC; int arrayCounter = 0,i; +#ifdef BUFFER_PRINTOUT_ENABLED unsigned long tempArray[500]; +#endif char str[200], buff[200]; unsigned long lastGeo = 0, currentGeo; header = LVme_getL(my->lvme, currAddr); size = header & 0xfff; - if(size > 0xc00) { - syslog(LOG_ERR, "size is very large! size: %.8x ",size); - } + byteSize = size<<2; - my->currAddr += size<<2; + my->currAddr += byteSize; - trigTag = ((header>>16) & 0xff); - if (size > (TIP_BUFSIZE >> 2)) { - syslog(LOG_ERR, "header: %.8x , address: %.8x, size too long! ",header,currAddr); - return (header & 0xfffff000) | 1; + if(byteSize > (TIP_BUFSIZE - my->currAddr + my->fifo)) { + syslog(LOG_ERR, "size too large! size: %.8x ",size); + size = (TIP_BUFSIZE - my->currAddr + my->fifo)>>2; + header &= 0x80000000; } + trigTag = ((header>>16) & 0xff); /* copy one sub evt from RC to memory */ while (--size) { @@ -144,7 +149,9 @@ int HwTip_readSubEvt(HwTip * my, void *subEvt) /* *data++ = LVme_getL(my->lvme, currAddr+=4); */ dataWord = LVme_getL(my->lvme, currAddr+=4); *data++ = dataWord; +#ifdef BUFFER_PRINTOUT_ENABLED tempArray[arrayCounter++] = dataWord; +#endif statusWord = ((dataWord>>24) & 0x7); if( statusWord == 2 ) { /* Header */ @@ -186,7 +193,7 @@ int HwTip_readSubEvt(HwTip * my, void *subEvt) #if 1 if( (tdcEventCounter &0xff) != trigTag) { /* if( (max(evtC, trigTag) - min(evtC, trigTag) >=2) && (max(evtC, trigTag) - min(evtC, trigTag) <= 0xfe )) { */ - syslog(LOG_ERR, "header: %.8x, crate: %d, tdc_num: %d, tag != EvtCounter, (%.8x,%.8x), dataWord: %.8x ", + syslog(LOG_ERR, "header: %.8x, crate: %d, tdc_num: %d, tag (%.8x) != EvtCounter (%.8x), dataWord: %.8x ", header, crateNumber, tdcCounter, trigTag, tdcEventCounter, dataWord); errorFlag = 1; } @@ -207,6 +214,7 @@ int HwTip_readSubEvt(HwTip * my, void *subEvt) } +#ifdef BUFFER_PRINTOUT_ENABLED if(errorFlag) { str[0] = 0; for(i=0;i < arrayCounter; i++) { @@ -223,6 +231,7 @@ int HwTip_readSubEvt(HwTip * my, void *subEvt) } } +#endif return header; -- 2.43.0