From 4e59acf9291c0de604f0133ec9ad69abbb4cd58f Mon Sep 17 00:00:00 2001 From: muench Date: Mon, 16 Jun 2003 08:26:38 +0000 Subject: [PATCH] Get new stuff from mdc, untested!! --- hadaq/hwshow.c | 73 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/hadaq/hwshow.c b/hadaq/hwshow.c index 2a84433..a81904b 100644 --- a/hadaq/hwshow.c +++ b/hadaq/hwshow.c @@ -1,4 +1,4 @@ -static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwshow.c,v 6.35 2003-06-16 08:14:30 muench Exp $"; +static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwshow.c,v 6.36 2003-06-16 08:26:38 muench Exp $"; #define SHIP_BLT @@ -156,43 +156,64 @@ void Hardware_waitForTrigger(Hardware *my, void *subEvt) #ifdef SHIP_BLT void Hardware_readout(Hardware *my, void *partEvt) { - int i; - int firstShip = -1; - void *subEvt = SubEvt_data(my->buf); static unsigned long trigNr = 0; - unsigned trigTag; - int dataError; - int size; - /* init partial event, necessary for SubEvt_next() */ - SubEvt_setDecoding(my->buf, SubEvtDecoding_SubEvts); - dataError = 0; - SubEvt_setId(my->buf, 0); + int i; + void *subEvt; + int dataError; + unsigned trigTag; + unsigned long offset; + /* prepare BMA chain by scanning all VME cards */ + if (0 > LBma_resetChain(my->lbma)) { + syslog(LOG_ERR, "%s:%d:%s", __FILE__, __LINE__, strerror(errno)); + } + offset = 0; for (i = 0; i < my->nShips; i++) { - if (0 > LBma_resetChain(my->lbma)) { - syslog(LOG_ERR, "%s:%d:%s", __FILE__, __LINE__, strerror(errno)); - } - size = HwShip_fillLBmaChain(my->ship[i], my->lbma, (char *) subEvt - (char *) my->buf); + int size; + + size = HwShip_fillLBmaChain(my->ship[i], my->lbma, offset); if (size > 0) { - subEvt = (char *) subEvt + (size + 0x7U & ~0x7U); + offset += size + 0x7 & ~0x7; } - if (0 > LBma_startChain(my->lbma)) { - syslog(LOG_ERR, "%s:%d:%s", __FILE__, __LINE__, strerror(errno)); + } + assert(SubEvt_hdrSize() + offset <= Hardware_maxSubEvtSize(my)); + + /* read data via VME */ + if (0 > LBma_startChain(my->lbma)) { + syslog(LOG_ERR, "%s:%d:%s", __FILE__, __LINE__, strerror(errno)); + } + if (0 > LBma_waitChain(my->lbma)) { + syslog(LOG_ERR, "%s:%d:%s", __FILE__, __LINE__, strerror(errno)); + } + memcpy(SubEvt_data(partEvt), my->buf, offset); + + /* check consistency and fill crate event header */ + SubEvt_setSize(partEvt, SubEvt_hdrSize() + offset); + SubEvt_setDecoding(partEvt, SubEvtDecoding_SubEvts); + dataError = 0; + trigTag = 0x100; + for (subEvt = SubEvt_data(partEvt); subEvt < SubEvt_end(partEvt); subEvt = SubEvt_next(partEvt, subEvt)) { + if (SubEvt_dataError(subEvt)) { + dataError = 1; } - if (0 > LBma_waitChain(my->lbma)) { - syslog(LOG_ERR, "%s:%d:%s", __FILE__, __LINE__, strerror(errno)); + if (trigTag > 0xff) { + trigTag = SubEvt_trigNr(subEvt) & 0xff; + } else { + if (trigTag != (SubEvt_trigNr(subEvt) & 0xff)) { + dataError = 1; + syslog(LOG_ERR, "(%s)Trigger tag mismatch: 0x%08x != 0x%08x", my->ship[i]->name, trigTag, SubEvt_trigNr(subEvt)); + } } } + SubEvt_setId(partEvt, 0); + if (dataError) { + SubEvt_setDataError(partEvt); + } + SubEvt_setTrigNr(partEvt, trigNr << 8 | trigTag); - SubEvt_setTrigNr(my->buf, trigNr << 8 | trigTag); - SubEvt_setSize(my->buf, (char *) subEvt - (char *) my->buf); trigNr++; - assert(SubEvt_size(my->buf) <= Hardware_maxSubEvtSize(my)); - - memcpy(partEvt, my->buf, SubEvt_size(my->buf)); - syslog(LOG_DEBUG, "partEvt: %s", SubEvt_2charP(partEvt)); } -- 2.43.0