]> jspc29.x-matter.uni-frankfurt.de Git - daqdata.git/commitdiff
optimized code (omits empty subevents), minimize communication overhead,
authorhadaq <hadaq>
Thu, 23 May 2002 16:51:37 +0000 (16:51 +0000)
committerhadaq <hadaq>
Thu, 23 May 2002 16:51:37 +0000 (16:51 +0000)
needs new hwship.c hwship.h

hadaq/hwshow.c

index 0d7498c37d07111d20fd6a4cb1b1c32c416df344..bebf105e95c5da0e3fb85bad65ee667ffa457e12 100644 (file)
@@ -1,4 +1,4 @@
-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwshow.c,v 6.20 2001-11-18 13:10:35 hadaq Exp $";
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwshow.c,v 6.21 2002-05-23 16:51:37 hadaq Exp $";
 
 
 #define _POSIX_C_SOURCE 199309L
@@ -50,7 +50,7 @@ Hardware *newHardware(void)
        my->maxSubEvtSize = SubEvt_hdrSize() + (NSHIPS * 1600 * sizeof(uint32_t));
 
        for (i = 0; i < NSHIPS; i++) {
-               char buf[16];
+               char buf[12];
 
                my->ship[i] = malloc(sizeof(HwShip));
                sprintf(buf, "ipc%d", i);
@@ -80,36 +80,48 @@ void deleteHardware(Hardware *my)
 void Hardware_waitForTrigger(Hardware *my, void *subEvt)
 {
        int i;
+       int nRequests = 0;
 
        for (i = 0; i < NSHIPS; i++) {
                if (HwShip_isEmpty(my->ship[i])) {
                        HwShip_requestBuffer(my->ship[i]);
+                       ++nRequests;
                }
        }
 
-       for (i = 0; i < NSHIPS; i++) {
-               while (HwShip_isBusy(my->ship[i])) {
-#if 1
+       do {
+         for (i = 0; i < NSHIPS; i++) {
+               if (HwShip_isBufRequested(my->ship[i])) {
+                 if (!HwShip_isBusy(my->ship[i])) {
+                       HwShip_getEndOfData(my->ship[i]);
+                       --nRequests;
+                 }
+               }
+         }
+#if 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.
 */
-                       struct timespec tS, *t = &tS;
-                       t->tv_sec = 0;
-                       t->tv_nsec = 020000000;
-                       nanosleep(t, NULL);
+         if (nRequests == NSHIPS) {
+               struct timespec tS, *t = &tS;
+               t->tv_sec = 0;
+               t->tv_nsec = 020000000;
+               nanosleep(t, NULL);
+         }
 #endif
-               }
-       }
+       } while(nRequests);
+
 }
 
 void Hardware_readout(Hardware *my, void *partEvt)
 {
        int i;
+       int firstShip = -1;
        void *subEvt = SubEvt_data(partEvt);
        static uint32_t trigNr = 0;
-       uint32_t trigTag;
+       uint32_t trigTag = 0;
 
        /* init partial event, necessary for  SubEvt_next() */
        SubEvt_setDecoding(partEvt, SubEvtDecoding_SubEvts);
@@ -117,18 +129,20 @@ void Hardware_readout(Hardware *my, void *partEvt)
 
        /* read all ships, check for common trigger tag */
        for (i = 0; i < NSHIPS; i++) {
-               HwShip_readSubEvt(my->ship[i], subEvt);
-               if (i == 0) {
+         if( HwShip_readSubEvt(my->ship[i], subEvt) == 0) {
+               if (firstShip < 0) {
                        trigTag = SubEvt_trigNr(subEvt) & 0xff;
+                       firstShip = 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 != 0x%08x",
-                                       my->ship[i]->name,trigTag, SubEvt_trigNr(subEvt));
+                               syslog(LOG_ERR, "(%s)Trigger tag mismatch: 0x%08x (%d) != 0x%08x",
+                                       my->ship[i]->name,trigTag,firstShip,SubEvt_trigNr(subEvt));
                        }
                }
                subEvt = SubEvt_next(partEvt, subEvt);
+         }
        }
 
     SubEvt_setTrigNr(partEvt, trigNr << 8 | trigTag);