-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
#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));
}