-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
#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 = ¶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
}
-
-
-