]> jspc29.x-matter.uni-frankfurt.de Git - daqdata.git/commitdiff
Parameter consolidation in hwtrig.c, tested without tof -- mm
authorhadaq <hadaq>
Fri, 25 Oct 2002 10:04:15 +0000 (10:04 +0000)
committerhadaq <hadaq>
Fri, 25 Oct 2002 10:04:15 +0000 (10:04 +0000)
hadaq/hwtrig.c
hadaq/param.tcl

index 8899e6a16df34f1a8955547ca31544d3095f1005..d6023f7a75c30b28d2593caccfe94bc4289979eb 100644 (file)
@@ -1,27 +1,23 @@
-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtrig.c,v 6.31 2002-10-25 09:51:57 hadaq Exp $";
-/* modified MU readout producing a dense pack of 16 Bit words. 15-March-2002, W. Koenig */
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtrig.c,v 6.32 2002-10-25 10:04:15 hadaq Exp $";
 
 #define _POSIX_C_SOURCE 199309L
 #include <unistd.h>
 
 #include <assert.h>
 #include <errno.h>
-#include <sys/time.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
 #include <syslog.h>
+#include <time.h>
 
 #include <allParam.h>
 #include <lvme.h>
 
 #include "subevt.h"
+#include "hardware.h"
 
-
-#if 0
-#define TOF_READOUT
-#endif 
-
-#ifdef TOF_READOUT
 #include "hwtip.h"
-#endif
 
 /* Number of TOF crates */
 #define NCRATES 3
@@ -31,257 +27,253 @@ static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hada
 #define MU_FIFO_STATUS  0x0008UL
 
 struct HardwareS {
-  LVme *lvme0;
-  LVme *lvme4;
-  LVme *lvme6;
-  LVme_L evtCount;
-  LVme_L old_evtCount;
-#ifdef TOF_READOUT
+       LVme *lvme0;
+       LVme *lvme4;
+       LVme *lvme6;
+       LVme_L evtCount;
+       LVme_L old_evtCount;
        HwTip *tip;
-#endif
-  size_t maxSubEvtSize;
+       size_t maxSubEvtSize;
+       int nConcs;
 };
 
-#include "hardware.h"
-
 size_t Hardware_maxSubEvtSize(const Hardware *my)
 {
        return my->maxSubEvtSize;
 }
 
-#include <syslog.h>
-
-#include <stdint.h>
-
-
 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];
+       char mu[PARAM_MAX_VALUE_LEN];
+       char conc[PARAM_MAX_VALUE_LEN];
+       int nCards;
        unsigned long cardBase;
        int paramWasFound;
-       Param *param;
 
-       my = (Hardware *)malloc(sizeof(Hardware));
-       my->maxSubEvtSize = (SubEvt_hdrSize() + 2 * 500 * sizeof(uint16_t)) /* MU */
-               + ( NCRATES * ( SubEvt_hdrSize() +  620 * sizeof(uint32_t))); /* CONC */
+       for (i = 0; i < PARAM_MAX_ARRAY_LEN; i++) {
+               cards[i] = cardsS[i];
+       }
+
+       if (strcmp(subsystem, "unknown") == 0) {
+               ss = "trigconc";
+               syslog(LOG_NOTICE, "Subsystem not set, defaulting to %s", ss);
+       } else {
+               ss = subsystem;
+       }
+
+       if (0 > conParam(param)) {
+               syslog(LOG_ERR, "Construction of parameter source failed: %s", strerror(errno));
+               return NULL;
+       }
+       if (0 > getCards(param, ss, "mu", &nCards, cards)) {
+               syslog(LOG_ERR, "Retrieval of card list failed");
+               return NULL;
+       }
+       strcpy(mu, cards[0]);
+       if (0 > getCards(param, ss, "tip", &nCards, cards)) {
+               syslog(LOG_ERR, "Retrieval of card list failed");
+               return NULL;
+       }
+       strcpy(conc, cards[0]);
+
+       my = malloc(sizeof(Hardware));
+       my->maxSubEvtSize = (SubEvt_hdrSize() + 2 * 500 * sizeof(uint16_t))     /* MU */
+               +(NCRATES * (SubEvt_hdrSize() + 620 * sizeof(uint32_t)));       /* CONC */
+       my->nConcs = nCards;
 
        my->evtCount = 0;
        my->old_evtCount = 0;
 
-       param = (Param *)malloc(sizeof(Param));
-       conParam(param);
-       Param_getInt(param, "mu", "cardbase", &paramWasFound, &cardBase);
-       syslog(LOG_INFO, "MU cardbase %.8x", cardBase );
+       Param_getInt(param, mu, "cardbase", &paramWasFound, &cardBase);
        if (!paramWasFound) {
-               syslog(LOG_WARNING,
-                       "Parameter %s(%s) not found, default = 0", "mu", "cardbase");
-               cardBase = 0;
+               syslog(LOG_ERR, "Parameter %s(cardbase) not found, default = 0", mu);
+               return NULL;
        }
+       syslog(LOG_INFO, "MU cardbase %.8x", cardBase);
 
-       my->lvme0 = (LVme *)malloc(sizeof(LVme));
+       my->lvme0 = malloc(sizeof(LVme));
        if (0 > conLVme(my->lvme0, cardBase, 0x100000UL, 0x09UL, 0, 0)) {
-         syslog(LOG_ERR, "MU on %p not found", cardBase);
-         return NULL;
+               syslog(LOG_ERR, "MU on %p not found", cardBase);
+               return NULL;
        }
-       my->lvme4 = (LVme *)malloc(sizeof(LVme));
+       my->lvme4 = malloc(sizeof(LVme));
        if (0 > conLVme(my->lvme4, cardBase + 0x4000000, 0x10000UL, 0x09UL, 0, 0)) {
-         syslog(LOG_ERR, "MU on %p not found", cardBase);
-         return NULL;
+               syslog(LOG_ERR, "MU on %p not found", cardBase);
+               return NULL;
        }
-       my->lvme6 = (LVme *)malloc(sizeof(LVme));
+       my->lvme6 = malloc(sizeof(LVme));
        if (0 > conLVme(my->lvme6, cardBase + 0x6000000, 0x10000UL, 0x09UL, 0, 0)) {
-         syslog(LOG_ERR, "MU on %p not found", cardBase);
-         return NULL;
+               syslog(LOG_ERR, "MU on %p not found", cardBase);
+               return NULL;
        }
 
-#ifdef TOF_READOUT
-       my->tip = (HwTip *) malloc(sizeof(HwTip));
-       if (0 > conHwTip(my->tip, "conc", param)) {
-               syslog(LOG_ERR, "%s:%d:%s", __FILE__, __LINE__, strerror(errno));
-               return NULL;
+       if (my->nConcs > 0) {
+               my->tip = malloc(sizeof(HwTip));
+               if (0 > conHwTip(my->tip, conc, param)) {
+                       syslog(LOG_ERR, "Construction of card %s failed:%s", conc, strerror(errno));
+                       return NULL;
+               }
        }
-#endif
 
        desParam(param);
-
        return my;
 }
 
 void deleteHardware(Hardware *my)
 {
-#ifdef TOF_READOUT
-       desHwTip(my->tip);
-       free(my->tip);
-#endif
-
-  desLVme(my->lvme6);
-  free(my->lvme6);
-  desLVme(my->lvme4);
-  free(my->lvme4);
-  desLVme(my->lvme0);
-  free(my->lvme0);
-  free(my);
+       if (my->nConcs > 0) {
+               desHwTip(my->tip);
+               free(my->tip);
+       }
+
+       desLVme(my->lvme6);
+       free(my->lvme6);
+       desLVme(my->lvme4);
+       free(my->lvme4);
+       desLVme(my->lvme0);
+       free(my->lvme0);
+       free(my);
 }
 
 void Hardware_waitForTrigger(Hardware *my, void *partEvt)
 {
-/*
-* check if MU is ready
-*/
-#ifndef NDEBUG
-       syslog(LOG_DEBUG, "check if MU is ready");
-#endif
 
-  /*
+       syslog(LOG_DEBUG, "check if MU is ready");
+       /*
     only read the Matching Unit Count register, when all pending
     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 */
-               struct timespec tS, *t = &tS;
-               t->tv_sec = 0;
-               t->tv_nsec = 20000000UL;
-               nanosleep(t, NULL);
 
-       }
-#ifndef NDEBUG
-       syslog(LOG_DEBUG, "evtCount: %d, oldEvtCount: %d", my->evtCount, my->old_evtCount);
-#endif
-  }
-  my->evtCount++;
-
-#ifdef TOF_READOUT
-/*
-* check if CONC is ready
-*/
-#ifndef NDEBUG
-       syslog(LOG_DEBUG, "check if CONC is ready");
-#endif
-
-       if (HwTip_isEmpty(my->tip)) {
-               HwTip_requestBuffer(my->tip);
-               while (HwTip_isBusy(my->tip)) {
+       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 */
                        struct timespec tS, *t = &tS;
                        t->tv_sec = 0;
                        t->tv_nsec = 20000000UL;
                        nanosleep(t, NULL);
+
+               }
+               syslog(LOG_DEBUG, "evtCount: %d, oldEvtCount: %d", my->evtCount, my->old_evtCount);
+       }
+       my->evtCount++;
+
+       if (my->nConcs > 0) {
+               syslog(LOG_DEBUG, "check if CONC is ready");
+
+               if (HwTip_isEmpty(my->tip)) {
+                       HwTip_requestBuffer(my->tip);
+                       while (HwTip_isBusy(my->tip)) {
+                               /* wait for some time for not disturbing the DSP */
+                               struct timespec tS, *t = &tS;
+                               t->tv_sec = 0;
+                               t->tv_nsec = 20000000UL;
+                               nanosleep(t, NULL);
+                       }
+                       HwTip_getEndOfData(my->tip);
                }
-               HwTip_getEndOfData(my->tip);
        }
-#endif
-
 }
 
 int readoutTrig(Hardware *my, void *subEvt)
 {
-       uint32_t * header = (uint32_t *)subEvt;
-       uint16_t * data;
-       uint16_t * dataEnd;
+       uint32_t *header = (uint32_t *) subEvt;
+       uint16_t *data;
+       uint16_t *dataEnd;
 
-       if (! ((LVme_getW(my->lvme6, MU_FIFO_STATUS) >> 3) &0x1) ) {
+       if (!((LVme_getW(my->lvme6, MU_FIFO_STATUS) >> 3) & 0x1)) {
                LVme_getW(my->lvme4, MU_FIFO);
        }
        /*
          old MU assumes its 16 bit words get expanded to 32 Bit.
          This is not the case, see SubEvt_setDecoding(..)
        */
-       *header =((LVme_getW(my->lvme4, MU_FIFO) & 0xffff)>>1) + 8;
+       *header = ((LVme_getW(my->lvme4, MU_FIFO) & 0xffff) >> 1) + 8;
        /*
          *header contains subevent size in char's.
          It is added to the pointer to evt begin.
        */
-       dataEnd=(uint16_t *)((uint32_t)header + *header);
+       dataEnd = (uint16_t *) ((uint32_t) header + *header);
 
        *++header = LVme_getW(my->lvme4, MU_FIFO) & 0xffff;
        *++header = LVme_getW(my->lvme4, MU_FIFO) & 0xffff;
        *++header = LVme_getW(my->lvme4, MU_FIFO) & 0xffff;
        SubEvt_setDecoding(subEvt, SubEvtDecoding_16bitData);
 
-       data=(uint16_t *)++header;
+       data = (uint16_t *) ++header;
 
        while (data < dataEnd) {
                *data++ = (uint16_t) LVme_getW(my->lvme4, MU_FIFO);
        }
 
-#ifndef NDEBUG
        syslog(LOG_DEBUG, "subEvt: %s", SubEvt_2charP(subEvt));
-#endif
+
        /* return trigger code = first MU data word */
-       return  *(uint16_t *)header;
+       return *(uint16_t *) header;
 }
 
 void Hardware_readout(Hardware *my, void *partEvt)
 {
-       void * subEvt = SubEvt_data(partEvt);
-       void * subEvtStart;
+       void *subEvt = SubEvt_data(partEvt);
        static unsigned long trigNr = 0;
-       uint8_t trigTag;
+       unsigned trigTag;
        int trigCode;
-       int header;
-       uint32_t * subEvtInfo;
        int i;
 
        SubEvt_setDecoding(partEvt, SubEvtDecoding_SubEvts);
 
-/*
-* read out MU
-*/
-
+       syslog(LOG_DEBUG, "read out MU");
        trigCode = readoutTrig(my, subEvt);
 
        SubEvt_setId(partEvt, trigCode);
        trigTag = SubEvt_trigNr(subEvt) & 0xff;
+
        subEvt = SubEvt_next(partEvt, subEvt);
 
-#ifdef TOF_READOUT
-/*
-* 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++) {
-               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, (header>>16) & 0xff);
+       if (my->nConcs > 0) {
+               uint32_t *data = SubEvt_data(subEvt);
+               int header;
+               uint32_t *subEvtInfo;
+
+               syslog(LOG_DEBUG, "read out CONC");
+               SubEvt_setDecoding(subEvt, SubEvtDecoding_32bitData);
+               SubEvt_setId(subEvt, 0x19c);
+               SubEvt_setTrigNr(subEvt, trigTag);
+
+               subEvtInfo = data++; /* leave space for an info word */
+
+               for (i = 0; i < NCRATES; i++) {
+                       header = HwTip_readSubEvt(my->tip, data);
+                       if (trigTag != ((header >> 16) & 0xff)) {
+                               SubEvt_setDataError(subEvt);
+                               SubEvt_setDataError(partEvt);
+                               syslog(LOG_ERR, "(%s)Trigger tag mismatch: (crate: %d) 0x%08x (MU) != 0x%08x",
+                                          my->tip->name, i, trigTag, (header >> 16) & 0xff);
+                       }
+                       data += (header & 0xfff) - 1;
                }
-               (uint32_t *)subEvt += (header & 0xfff)-1;
-       }
 
-       *subEvtInfo = header>>16;
-       SubEvt_setSize(subEvtStart, (uint32_t)subEvt - (uint32_t)subEvtStart);
-#endif
+               *subEvtInfo = header >> 16;
+               SubEvt_setSize(subEvt, (char *)data - (char *)subEvt);
+               subEvt = SubEvt_next(partEvt, subEvt);
+       }
 
-       SubEvt_setSize(partEvt,(((uint32_t)subEvt+4) & 0xfffffff8) - (uint32_t)partEvt);
-       SubEvt_setTrigNr(partEvt, (trigNr << 8) | trigTag);
+       SubEvt_setTrigNr(partEvt, trigNr << 8 | trigTag);
+       SubEvt_setSize(partEvt, (char *) subEvt - (char *) partEvt);
        trigNr++;
 
        assert(SubEvt_size(partEvt) <= my->maxSubEvtSize);
-#ifndef NDEBUG
+
        syslog(LOG_DEBUG, "partEvt: %s", SubEvt_2charP(partEvt));
-#endif
 }
-
-
-
index 8fcb80c615dbf20868918d46782458525cf1e3c3..e4cbe5050756e158b7d94c15076569ecc86bbe2a 100644 (file)
@@ -139,21 +139,11 @@ set race7(status_id) 101
 set race8(status_id) 102
 set race9(status_id) 103
 
-set conc(cardbase)  0x18000000
-set mu(cardbase)    0xd0000000
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+set trigconc(unit0) mu
+set trigconc(unit1) conc
 
+set mu(cardtype)    mu
+set conc(cardtype)  tip
 
+set mu(cardbase)    0xd0000000
+set conc(cardbase)  0x18000000