]> jspc29.x-matter.uni-frankfurt.de Git - daqdata.git/commitdiff
merged with wolgang-local, mt
authorhadaq <hadaq>
Fri, 20 Sep 2002 09:04:42 +0000 (09:04 +0000)
committerhadaq <hadaq>
Fri, 20 Sep 2002 09:04:42 +0000 (09:04 +0000)
hadaq/hwtip.c
hadaq/hwtrig.c

index 3fa867bda2d2eca6a10d089ad109c515014bfefa..84ad4249619692379c8f4b5e0962d48d9f236417 100644 (file)
@@ -1,4 +1,4 @@
-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>
@@ -15,6 +15,11 @@ static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hada
 
 #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)
@@ -23,7 +28,7 @@ void sigbusHandler(int sig)
 
        ourVmeAccessOK = 0;
        t->tv_sec = 0;
-       t->tv_nsec = 020000000;
+       t->tv_nsec = 20000000;
        nanosleep(t, NULL);
 }
 
@@ -48,7 +53,7 @@ int conHwTip(HwTip * my, const char *name, const Param *param)
        }
        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;
@@ -79,7 +84,7 @@ void HwTip_requestBuffer(HwTip * my)
 #if 1
                struct timespec tS, *t = &tS;
                t->tv_sec = 0;
-               t->tv_nsec = 020000000;
+               t->tv_nsec = 20000000;
                nanosleep(t, NULL);
 #endif
        }
@@ -100,31 +105,109 @@ void HwTip_requestBuffer(HwTip * my)
        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;
 }
+
+
index a7ef3a6c5a7f4b151c2e030ed69ef262498c7112..1a1d8de36af77262bffcb7b2b496581ee9be42ef 100644 (file)
@@ -1,4 +1,4 @@
-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
@@ -130,7 +130,7 @@ void deleteHardware(Hardware *my)
 
 void Hardware_waitForTrigger(Hardware *my, void *partEvt)
 {
-  
 /*
 * check if MU is ready
 */
@@ -143,7 +143,7 @@ void Hardware_waitForTrigger(Hardware *my, void *partEvt)
     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 */
@@ -173,7 +173,7 @@ void Hardware_waitForTrigger(Hardware *my, void *partEvt)
                        /* 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);
@@ -222,10 +222,13 @@ int readoutTrig(Hardware *my, void *subEvt)
 
 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);
@@ -245,23 +248,32 @@ void Hardware_readout(Hardware *my, void *partEvt)
 * 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++;