From 13cbf654fa21ed12dc9a844b6a792c7dc0f9c387 Mon Sep 17 00:00:00 2001 From: hadaq Date: Fri, 25 Oct 2002 10:04:15 +0000 Subject: [PATCH] Parameter consolidation in hwtrig.c, tested without tof -- mm --- hadaq/hwtrig.c | 302 +++++++++++++++++++++++------------------------- hadaq/param.tcl | 22 +--- 2 files changed, 153 insertions(+), 171 deletions(-) diff --git a/hadaq/hwtrig.c b/hadaq/hwtrig.c index 8899e6a..d6023f7 100644 --- a/hadaq/hwtrig.c +++ b/hadaq/hwtrig.c @@ -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 #include #include -#include +#include +#include +#include #include +#include #include #include #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 - -#include - - int Hardware_inSpill(const Hardware *my) { return 0; } -Hardware *newHardware(void) +Hardware *newHardware(const char *subsystem) { Hardware *my; + Param paramS, *param = ¶mS; + 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", ¶mWasFound, &cardBase); - syslog(LOG_INFO, "MU cardbase %.8x", cardBase ); + Param_getInt(param, mu, "cardbase", ¶mWasFound, &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 } - - - diff --git a/hadaq/param.tcl b/hadaq/param.tcl index 8fcb80c..e4cbe50 100644 --- a/hadaq/param.tcl +++ b/hadaq/param.tcl @@ -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 -- 2.43.0