Consistency with shower -- mm
authorhadaq <hadaq>
Sun, 27 Oct 2002 12:26:49 +0000 (12:26 +0000)
committerhadaq <hadaq>
Sun, 27 Oct 2002 12:26:49 +0000 (12:26 +0000)
hadaq/hwmdc.c
hadaq/hwsam.c
hadaq/hwsam.h

index feae9def3f628daef491c00a4933002a05209068..c53122dad198b70570513f9439961798299c978b 100644 (file)
@@ -1,4 +1,4 @@
-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwmdc.c,v 6.23 2002-10-27 10:53:23 hadaq Exp $";
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwmdc.c,v 6.24 2002-10-27 12:26:49 hadaq Exp $";
 
 #define _POSIX_C_SOURCE 199309L
 #include <unistd.h>
@@ -93,61 +93,76 @@ void deleteHardware(Hardware *my)
        free(my);
 }
 
-void Hardware_waitForTrigger(Hardware *my, void *partEvt)
+void Hardware_waitForTrigger(Hardware *my, void *subEvt)
 {
        int i;
+       int nRequests = 0;
        int nPoll = 0;
        const int nPollMax = 60 / my->nSams;
-       int nRequests;
-       int firstSam = -1;
-       void *subEvt = SubEvt_data(partEvt);
-       static uint32_t trigNr = 0;
-       uint32_t trigTag;
 
        for (i = 0; i < my->nSams; i++) {
-               HwSam_requestBuffer(my->sam[i]);
+               if (HwSam_isEmpty(my->sam[i])) {
+                       HwSam_requestBuffer(my->sam[i]);
+                       ++nRequests;
+               }
        }
 
-       /* init partial event, necessary for SubEvt_next() */
-       SubEvt_setDecoding(partEvt, SubEvtDecoding_SubEvts);
-       SubEvt_setId(partEvt, 0);
-
-       /* make shure that all SAMS have delivered one sub event */
-       /* check for common trigger tag */
-       nRequests = my->nSams;
        do {
                for (i = 0; i < my->nSams; i++) {
                        if (HwSam_isBufRequested(my->sam[i])) {
                                if (!HwSam_isBusy(my->sam[i])) {
+                                       HwSam_getEndOfData(my->sam[i]);
                                        --nRequests;
-                                       if (HwSam_readSubEvt(my->sam[i], subEvt) == 0) {
-                                               if (firstSam < 0) {
-                                                       trigTag = SubEvt_trigNr(subEvt) & 0xff;
-                                                       firstSam = i;
-                                               } else {
-                                                       if (trigTag != (SubEvt_trigNr(subEvt) & 0xff)) {
-                                                               SubEvt_setId(subEvt, SubEvt_id(subEvt) | 0x80000000UL);
-                                                               SubEvt_setId(partEvt, SubEvt_id(partEvt) | 0x80000000UL);
-                                                               syslog(LOG_ERR, "(%s)Trigger tag mismatch: 0x%08x (%d) != 0x%08x",
-                                                                          my->sam[i]->name, trigTag, firstSam, SubEvt_trigNr(subEvt));
-                                                       }
-                                               }
-                                               subEvt = (void *) (((uint32_t) subEvt + *(uint32_t *) subEvt + 4) & 0xfffffff8);
-                                       }
                                }
                        }
                }
 #if 1
-               if (nPoll >= nPollMax && firstSam < 0) {
+/*
+* This sleep prevents a tight loop which stops work on real
+* time systems if the priority of readout is not lowered.
+* When not using the sleep use option -p -2 for daq_readout.
+*/
+               if (nRequests == my->nSams && nPoll++ >= nPollMax) {
                        struct timespec tS, *t = &tS;
                        t->tv_sec = 0;
                        t->tv_nsec = 020000000;
                        nanosleep(t, NULL);
                }
-               ++nPoll;
 #endif
        } while (nRequests);
 
+}
+
+void Hardware_readout(Hardware *my, void *partEvt)
+{
+       int i;
+       int firstSam = -1;
+       void *subEvt = SubEvt_data(partEvt);
+       static unsigned long trigNr = 0;
+       unsigned trigTag;
+
+       /* init partial event, necessary for  SubEvt_next() */
+       SubEvt_setDecoding(partEvt, SubEvtDecoding_SubEvts);
+       SubEvt_setId(partEvt, 0);
+
+       /* read all sams, check for common trigger tag */
+       for (i = 0; i < my->nSams; i++) {
+               if (HwSam_readSubEvt(my->sam[i], subEvt) == 0) {
+                       if (firstSam < 0) {
+                               trigTag = SubEvt_trigNr(subEvt) & 0xff;
+                               firstSam = i;
+                       } else {
+                               if (trigTag != (SubEvt_trigNr(subEvt) & 0xff)) {
+                                       SubEvt_setDataError(subEvt);
+                                       SubEvt_setDataError(partEvt);
+                                       syslog(LOG_ERR, "(%s)Trigger tag mismatch: 0x%08x (%d) != 0x%08x",
+                                                  my->sam[i]->name, trigTag, firstSam, SubEvt_trigNr(subEvt));
+                               }
+                       }
+                       subEvt = SubEvt_next(partEvt, subEvt);
+               }
+       }
+
        SubEvt_setTrigNr(partEvt, trigNr << 8 | trigTag);
        SubEvt_setSize(partEvt, (char *) subEvt - (char *) partEvt);
        trigNr++;
@@ -157,8 +172,3 @@ void Hardware_waitForTrigger(Hardware *my, void *partEvt)
        syslog(LOG_DEBUG, "partEvt: %s", SubEvt_2charP(partEvt));
 #endif
 }
-
-void Hardware_readout(Hardware *my, void *partEvt)
-{
-/* code moved to waitForTrigger */
-}
index cb9520acf8d595010f43323c2508f6212096c8a0..0c109ae923f45f6d1b3f4fdc03ceb99bffd03d9e 100644 (file)
@@ -1,4 +1,4 @@
-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwsam.c,v 6.13 2002-10-24 16:45:40 hadaq Exp $";
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwsam.c,v 6.14 2002-10-27 12:26:49 hadaq Exp $";
 
 #include <assert.h>
 #include <string.h>
@@ -49,6 +49,7 @@ int conHwSam(HwSam *my, const char *name, const Param *param)
                syslog(LOG_ERR, "HwSam readout bit = 1, should be 0, intialization bug");
        }
        my->currAddr = SAM_BUFSIZE;
+       my->endOfData = 0;
 
        return 0;
 }
@@ -75,14 +76,25 @@ void HwSam_requestBuffer(HwSam *my)
                }
        } while (LVme_tstBitL(my->cram, CRR, 0) != i);
 
-       my->currAddr = SAM_BUFSIZE * i + SAM_BUFOFFSET;
        my->bankRequested = i;
+       my->currAddr = SAM_BUFSIZE * i + SAM_BUFOFFSET;
+
+       /* to indicate a buffer request state which is cleared by getEndOfData */
        my->endOfData = 0;
 #ifndef NDEBUG
        syslog(LOG_DEBUG, "requestBuffer out");
 #endif
 }
 
+void HwSam_getEndOfData(HwSam *my)
+{
+       /* CAUTION this ist just for clearing  buffer request state,
+       if also makes the being always empty in HwSam_isEmpty which makes
+       hwmdc.c working by coincidence */
+       
+       my->endOfData = 1;
+}
+
 /* 5 RC Headers + Subevent Header + some data */
 #define SAM_NODATASIZE 0
 #define RC_HEADERLENGTH 12
@@ -101,7 +113,6 @@ int HwSam_readSubEvt(HwSam *my, void *subEvt)
 #endif
        size = LVme_getL(my->cram, currAddr);
        lastAddr = currAddr + size;
-       my->endOfData = lastAddr;
 
        if (size > SAM_BUFSIZE - SAM_BUFOFFSET) {
                syslog(LOG_CRIT, "subEvt throw away : %d, %d", size, SAM_BUFSIZE-SAM_BUFOFFSET);
index 509f141a28612bf55da3b97a1c1f719a18045f5f..948de63cc5d0ab4ba2c3b0579f55401c3621cc64 100644 (file)
@@ -10,14 +10,16 @@ typedef struct HwSamS {
   LVme *cram;
   LVme *regs;
   int bankRequested;
-  int currAddr;
-  int endOfData;
+  unsigned long currAddr;
+  unsigned long endOfData;
 } HwSam;
 
 int conHwSam(HwSam *my, const char *name, const Param *param);
 void desHwSam(HwSam *my);
 int HwSam_readSubEvt(HwSam *my, void *subEvt);
 
+void HwSam_getEndOfData(HwSam *my);
+
 static int bankConfirmed(HwSam *my)
 {
        return LVme_tstBitL(my->regs, VMSR, 0);