-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtip.c,v 1.24 2002-05-27 21:22:15 hadaq Exp $";
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtip.c,v 1.25 2002-09-20 09:04:56 hadaq Exp $";
#include <assert.h>
#include <string.h>
#include "hwtip.h"
+
+#define min(x,y) ( (x>y) ? y : x )
+#define max(x,y) ( (x>y) ? x : y )
+
+
static int ourVmeAccessOK;
void sigbusHandler(int sig)
ourVmeAccessOK = 0;
t->tv_sec = 0;
- t->tv_nsec = 020000000;
+ t->tv_nsec = 20000000;
nanosleep(t, NULL);
}
}
syslog(LOG_INFO, "conc cardbase %.8x", cardBase );
- my->lvme = malloc(sizeof(LVme));
+ my->lvme = (LVme *)malloc(sizeof(LVme));
if (0 > conLVme(my->lvme, cardBase, 0x3000000UL, 0x09UL, 0, 0)) {
syslog(LOG_ERR, "HwTip on %p not found", cardBase);
return -1;
#if 1
struct timespec tS, *t = &tS;
t->tv_sec = 0;
- t->tv_nsec = 020000000;
+ t->tv_nsec = 20000000;
nanosleep(t, NULL);
#endif
}
my->currAddr = my->fifo + 0x4;
}
-#define TIP_NODATASIZE 20 /* header + some tag word */
int HwTip_readSubEvt(HwTip * my, void *subEvt)
{
uint32_t *data = (uint32_t *) subEvt;
- int lastAddr;
- int currAddr = my->currAddr;
- size_t size;
+ unsigned long currAddr = my->currAddr;
+ unsigned long header;
+ int size;
+ int statusWord, crateNumber = 0xff;
+ int foundCBLTTrailerFlag = 0;
+ int foundCBLTHeaderFlag = 0;
+ int errorFlag = 0;
+ unsigned long dataWord;
+ unsigned long tdcCounter = 0;
+ unsigned long tdcEventCounter, trigTag,evtC;
+ int arrayCounter = 0,i;
+ unsigned long tempArray[500];
+ char str[200], buff[200];
+
+ header = LVme_getL(my->lvme, currAddr);
+ size = header & 0xfff;
+ if(size > 0xc00) {
+ syslog(LOG_ERR, "size is very large! size: %.8x ",size);
+ }
- size = LVme_getL(my->lvme, currAddr);
- lastAddr = currAddr + size;
- my->currAddr = lastAddr;
+ my->currAddr += size<<2;
- if (size > TIP_BUFSIZE) {
- syslog(LOG_ERR, "found size: %.8x , address: %.8x, too long, fatal! ", size, currAddr);
- return -1;
+ 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( size <= TIP_NODATASIZE ) return 1;
-
/* copy one sub evt from RC to memory */
- *data++ = size;
+ while (--size) {
+
+ /* *data++ = LVme_getL(my->lvme, currAddr+=4); */
+ dataWord = LVme_getL(my->lvme, currAddr+=4);
+ *data++ = dataWord;
+ tempArray[arrayCounter++] = dataWord;
+ statusWord = ((dataWord>>24) & 0x7);
+ if( statusWord == 2 ) {
+ /* Header */
+ tdcCounter++;
+ crateNumber = ((dataWord>>16) & 0xff);
+ if( foundCBLTHeaderFlag == 1) {
+ syslog(LOG_ERR, "header: %.8x, at least two headers came without a trailer, data: %.8x",
+ header, dataWord);
+ errorFlag = 1;
+ }
+ foundCBLTHeaderFlag = 1;
+ }
+ else if ( statusWord == 4 ) {
+ /* Trailer */
+ tdcEventCounter = dataWord & 0xffffff;
+ foundCBLTTrailerFlag = 1;
+ if( foundCBLTTrailerFlag == 1 && foundCBLTHeaderFlag == 0) {
+ syslog(LOG_ERR, "header: %.8x, trailer came before header! data: %.8x",
+ header, dataWord);
+ errorFlag = 1;
+ }
+
+ evtC = (tdcEventCounter &0xff);
+ /* 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 ",
+ header, crateNumber, tdcCounter, trigTag, tdcEventCounter, dataWord);
+ errorFlag = 1;
+ }
+
+ foundCBLTTrailerFlag = 0;
+ foundCBLTHeaderFlag = 0;
+ }
+ else if (statusWord == 0) {
+ /* data word, nothing to do... */
+ }
+ else {
+#if 0
+ syslog(LOG_ERR, "status word of tdc not 0,2 or 4, header: %.8x, data: %.8x", header, dataWord);
+ errorFlag = 1;
+#endif
+ }
- while ((currAddr+=4) < lastAddr) {
- *data++ = LVme_getL(my->lvme, currAddr);
+
}
+
+ if(errorFlag) {
+ str[0] = 0;
+ for(i=0;i < arrayCounter; i++) {
+ sprintf(buff, "%.8x ", tempArray[i]);
+ strcpy((char *) ((unsigned int)str + strlen(str)) , buff);
+ if( ((i+1)%4) == 0) {
+ syslog(LOG_ERR, str);
+ str[0] = 0;
+ }
+ }
+ if( (i%4)) {
+ syslog(LOG_ERR, str);
+ str[0] = 0;
+ }
+
+ }
+
+ return header;
- return 0;
}
+
+
-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtrig.c,v 6.29 2002-05-28 15:58:36 hadaq Exp $";
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtrig.c,v 6.30 2002-09-20 09:04:42 hadaq Exp $";
/* modified MU readout producing a dense pack of 16 Bit words. 15-March-2002, W. Koenig */
#define _POSIX_C_SOURCE 199309L
void Hardware_waitForTrigger(Hardware *my, void *partEvt)
{
-
+
/*
* check if MU is ready
*/
events are processed. This is recommended, because it is very
"expensive" to read from an Sharc Register in the Matching Unit.
*/
-
+
if(my->evtCount == my->old_evtCount) {
while ((my->old_evtCount = LVme_getL(my->lvme0, MU_EVT_COUNT)) == my->evtCount) {
/* wait for some time for not disturbing the DSP */
/* wait for some time for not disturbing the DSP */
struct timespec tS, *t = &tS;
t->tv_sec = 0;
- t->tv_nsec = 10000000;
+ t->tv_nsec = 20000000UL;
nanosleep(t, NULL);
}
HwTip_getEndOfData(my->tip);
void Hardware_readout(Hardware *my, void *partEvt)
{
- void *subEvt = SubEvt_data(partEvt);
+ void * subEvt = SubEvt_data(partEvt);
+ void * subEvtStart;
static unsigned long trigNr = 0;
uint8_t trigTag;
int trigCode;
+ int header;
+ uint32_t * subEvtInfo;
int i;
SubEvt_setDecoding(partEvt, SubEvtDecoding_SubEvts);
* read out CONC
*/
+ subEvtStart = subEvt;
+ subEvt = SubEvt_data(subEvtStart);
+ SubEvt_setDecoding(subEvtStart, SubEvtDecoding_32bitData);
+ SubEvt_setId(subEvtStart, 0x19c);
+ SubEvt_setTrigNr(subEvtStart, trigTag);
+
+ /* leave space for an info word */
+ subEvtInfo = (uint32_t *)subEvt;
+ ++(uint32_t *)subEvt;
for (i = 0; i < NCRATES; i++) {
- if( HwTip_readSubEvt(my->tip, subEvt)==0) {
- if (trigTag != (SubEvt_trigNr(subEvt) & 0xff)) {
- SubEvt_setId(subEvt, SubEvt_id(subEvt) | 0x80000000UL);
+ header=HwTip_readSubEvt(my->tip, subEvt);
+ if (trigTag != ((header>>16) & 0xff)) {
+ SubEvt_setId(subEvtStart, SubEvt_id(subEvtStart) | 0x80000000UL);
SubEvt_setId(partEvt, SubEvt_id(partEvt) | 0x80000000UL);
syslog(LOG_ERR, "(%s)Trigger tag mismatch: (crate: %d) 0x%08x (MU) != 0x%08x",
- my->tip->name, i, trigTag, SubEvt_trigNr(subEvt));
+ my->tip->name, i, trigTag, (header>>16) & 0xff);
}
- subEvt = SubEvt_next(partEvt, subEvt);
- }
+ (uint32_t *)subEvt += (header & 0xfff)-1;
}
-
+ *subEvtInfo = header>>16;
+ SubEvt_setSize(subEvtStart, (uint32_t)subEvt - (uint32_t)subEvtStart);
#endif
- SubEvt_setSize(partEvt, (char *)subEvt - (char *)partEvt);
+ SubEvt_setSize(partEvt,(((uint32_t)subEvt+4) & 0xfffffff8) - (uint32_t)partEvt);
SubEvt_setTrigNr(partEvt, (trigNr << 8) | trigTag);
trigNr++;