]> jspc29.x-matter.uni-frankfurt.de Git - daqdata.git/commitdiff
Get the list of sams from parameters like the other subsystems do.
authorhadaq <hadaq>
Sun, 27 Oct 2002 10:53:23 +0000 (10:53 +0000)
committerhadaq <hadaq>
Sun, 27 Oct 2002 10:53:23 +0000 (10:53 +0000)
CAUTION!! This version still relies on "virtual" (means half) sam3s,
so it's still incompatible with runctrl.
Tested with mdc0.
-- mm

hadaq/hwmdc.c
hadaq/param.tcl

index 5f423ace611aa8eb62bc49bf3105b008f5d8af4e..feae9def3f628daef491c00a4933002a05209068 100644 (file)
@@ -1,5 +1,4 @@
-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwmdc.c,v 6.22 2002-10-27 08:37:54 hadaq Exp $";
-
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwmdc.c,v 6.23 2002-10-27 10:53:23 hadaq Exp $";
 
 #define _POSIX_C_SOURCE 199309L
 #include <unistd.h>
@@ -8,7 +7,7 @@ static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hada
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h> 
+#include <string.h>
 #include <time.h>
 #include <syslog.h>
 
@@ -16,21 +15,10 @@ static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hada
 #include "subevt.h"
 #include "hwsam.h"
 
-#define MDCCRATE 1
-
-#if MDCCRATE == 0
-#define FIRSTSAM 0
-#define NSAMS 12
-#endif
-
-#if MDCCRATE == 1
-#define FIRSTSAM 12
-#define NSAMS 5
-#endif
-
 struct HardwareS {
        size_t maxSubEvtSize;
-       HwSam *sam[NSAMS];
+       int nSams;
+       HwSam **sam;
 };
 
 #include "hardware.h"
@@ -45,32 +33,49 @@ int Hardware_inSpill(const Hardware *my)
        return 0;
 }
 
-Hardware *newHardware(void)
+Hardware *newHardware(const char *subsystem)
 {
        Hardware *my;
        Param paramS, *param = &paramS;
        int i;
+       const char *ss;
+       char cardsS[PARAM_MAX_ARRAY_LEN][PARAM_MAX_VALUE_LEN];
+       char *cards[PARAM_MAX_ARRAY_LEN];
+       int nCards;
+
+       for (i = 0; i < PARAM_MAX_ARRAY_LEN; i++) {
+               cards[i] = cardsS[i];
+       }
+
+       if (strcmp(subsystem, "unknown") == 0) {
+               ss = "mdc0";
+               syslog(LOG_NOTICE, "Subsystem not set, defaulting to %s", ss);
+       } else {
+               ss = subsystem;
+       }
 
        if (0 > conParam(param)) {
-               syslog(LOG_ERR, "%s:%d:%s", __FILE__, __LINE__, strerror(errno));
+               syslog(LOG_ERR, "Construction of parameter source failed: %s", strerror(errno));
+               return NULL;
+       }
+       if (0 > getCards(param, ss, "sam", &nCards, cards)) {
+               syslog(LOG_ERR, "Retrieval of card list failed");
                return NULL;
        }
        my = malloc(sizeof(Hardware));
+       my->sam = malloc(nCards * sizeof(HwSam *));
+       my->nSams = nCards;
 
-       my->maxSubEvtSize = SubEvt_hdrSize() + (NSAMS * 2564 * sizeof(uint32_t));
-
-       for (i = 0; i < NSAMS; i++) {
-               char buf[12];
+       my->maxSubEvtSize = SubEvt_hdrSize() + (my->nSams * 2564 * sizeof(uint32_t));
 
+       for (i = 0; i < my->nSams; i++) {
                my->sam[i] = malloc(sizeof(HwSam));
-               sprintf(buf, "sam%d", i + FIRSTSAM);
-               if (0 > conHwSam(my->sam[i], buf, param)) {
-                       syslog(LOG_ERR, "%s:%d:%s", __FILE__, __LINE__, strerror(errno));
+               if (0 > conHwSam(my->sam[i], cards[i], param)) {
+                       syslog(LOG_ERR, "Construction of card %s failed:%s", cards[i], strerror(errno));
                        return NULL;
                }
        }
 
-
        desParam(param);
        return my;
 }
@@ -79,26 +84,27 @@ void deleteHardware(Hardware *my)
 {
        int i;
 
-       for (i = 0; i < NSAMS; i++) {
+       for (i = 0; i < my->nSams; i++) {
                desHwSam(my->sam[i]);
                free(my->sam[i]);
        }
 
+       free(my->sam);
        free(my);
 }
 
-#define N_POLL_MAX 60/NSAMS
 void Hardware_waitForTrigger(Hardware *my, void *partEvt)
 {
        int i;
        int nPoll = 0;
+       const int nPollMax = 60 / my->nSams;
        int nRequests;
-       int firstSam=-1;
+       int firstSam = -1;
        void *subEvt = SubEvt_data(partEvt);
        static uint32_t trigNr = 0;
        uint32_t trigTag;
 
-       for (i = 0; i < NSAMS; i++) {
+       for (i = 0; i < my->nSams; i++) {
                HwSam_requestBuffer(my->sam[i]);
        }
 
@@ -108,31 +114,31 @@ void Hardware_waitForTrigger(Hardware *my, void *partEvt)
 
        /* make shure that all SAMS have delivered one sub event */
        /* check for common trigger tag */
-       nRequests = NSAMS;
+       nRequests = my->nSams;
        do {
-               for (i = 0; i < NSAMS; i++) {
-                 if (HwSam_isBufRequested(my->sam[i])) {
-                       if(!HwSam_isBusy(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);
-                         }
+               for (i = 0; i < my->nSams; i++) {
+                       if (HwSam_isBufRequested(my->sam[i])) {
+                               if (!HwSam_isBusy(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 >= N_POLL_MAX && firstSam < 0) {
+               if (nPoll >= nPollMax && firstSam < 0) {
                        struct timespec tS, *t = &tS;
                        t->tv_sec = 0;
                        t->tv_nsec = 020000000;
@@ -143,7 +149,7 @@ void Hardware_waitForTrigger(Hardware *my, void *partEvt)
        } while (nRequests);
 
        SubEvt_setTrigNr(partEvt, trigNr << 8 | trigTag);
-       SubEvt_setSize(partEvt, (char *)subEvt - (char *)partEvt);
+       SubEvt_setSize(partEvt, (char *) subEvt - (char *) partEvt);
        trigNr++;
 
        assert(SubEvt_size(partEvt) <= my->maxSubEvtSize);
index e4cbe5050756e158b7d94c15076569ecc86bbe2a..afb8a29c0552b9b0e2b2f357b867ca1058857441 100644 (file)
@@ -20,6 +20,45 @@ set readout(file) ./daq_readout
 set readout(stndln) 0
 set readout(priority) -2
 
+set mdc0(unit0) sam0
+set mdc0(unit1) sam1
+set mdc0(unit2) sam2
+set mdc0(unit3) sam3
+set mdc0(unit4) sam4
+set mdc0(unit5) sam5
+set mdc0(unit6) sam6
+set mdc0(unit7) sam7
+set mdc0(unit8) sam8
+set mdc0(unit9) sam9
+set mdc0(unit10) sam10
+set mdc0(unit11) sam11
+
+set mdc1(unit0) sam12
+set mdc1(unit1) sam13
+set mdc1(unit2) sam14
+set mdc1(unit3) sam15
+set mdc1(unit4) sam16
+set mdc1(unit5) sam17
+
+set sam0(cardtype) sam
+set sam1(cardtype) sam
+set sam2(cardtype) sam
+set sam3(cardtype) sam
+set sam4(cardtype) sam
+set sam5(cardtype) sam
+set sam6(cardtype) sam
+set sam7(cardtype) sam
+set sam8(cardtype) sam
+set sam9(cardtype) sam
+set sam10(cardtype) sam
+set sam11(cardtype) sam
+set sam12(cardtype) sam
+set sam13(cardtype) sam
+set sam14(cardtype) sam
+set sam15(cardtype) sam
+set sam16(cardtype) sam
+set sam17(cardtype) sam
+
 set sam0(cardbase) 0x01000000
 set sam1(cardbase) 0x01100000
 set sam2(cardbase) 0x02000000