-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwmdc.c,v 6.23 2002-10-27 10:53:23 hadaq Exp $";
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwmdc.c,v 6.24 2002-10-27 12:26:49 hadaq Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
free(my);
}
-void Hardware_waitForTrigger(Hardware *my, void *partEvt)
+void Hardware_waitForTrigger(Hardware *my, void *subEvt)
{
int i;
+ int nRequests = 0;
int nPoll = 0;
const int nPollMax = 60 / my->nSams;
- int nRequests;
- int firstSam = -1;
- void *subEvt = SubEvt_data(partEvt);
- static uint32_t trigNr = 0;
- uint32_t trigTag;
for (i = 0; i < my->nSams; i++) {
- HwSam_requestBuffer(my->sam[i]);
+ if (HwSam_isEmpty(my->sam[i])) {
+ HwSam_requestBuffer(my->sam[i]);
+ ++nRequests;
+ }
}
- /* init partial event, necessary for SubEvt_next() */
- SubEvt_setDecoding(partEvt, SubEvtDecoding_SubEvts);
- SubEvt_setId(partEvt, 0);
-
- /* make shure that all SAMS have delivered one sub event */
- /* check for common trigger tag */
- nRequests = my->nSams;
do {
for (i = 0; i < my->nSams; i++) {
if (HwSam_isBufRequested(my->sam[i])) {
if (!HwSam_isBusy(my->sam[i])) {
+ HwSam_getEndOfData(my->sam[i]);
--nRequests;
- if (HwSam_readSubEvt(my->sam[i], subEvt) == 0) {
- if (firstSam < 0) {
- trigTag = SubEvt_trigNr(subEvt) & 0xff;
- firstSam = i;
- } else {
- if (trigTag != (SubEvt_trigNr(subEvt) & 0xff)) {
- SubEvt_setId(subEvt, SubEvt_id(subEvt) | 0x80000000UL);
- SubEvt_setId(partEvt, SubEvt_id(partEvt) | 0x80000000UL);
- syslog(LOG_ERR, "(%s)Trigger tag mismatch: 0x%08x (%d) != 0x%08x",
- my->sam[i]->name, trigTag, firstSam, SubEvt_trigNr(subEvt));
- }
- }
- subEvt = (void *) (((uint32_t) subEvt + *(uint32_t *) subEvt + 4) & 0xfffffff8);
- }
}
}
}
#if 1
- if (nPoll >= nPollMax && firstSam < 0) {
+/*
+* This sleep prevents a tight loop which stops work on real
+* time systems if the priority of readout is not lowered.
+* When not using the sleep use option -p -2 for daq_readout.
+*/
+ if (nRequests == my->nSams && nPoll++ >= nPollMax) {
struct timespec tS, *t = &tS;
t->tv_sec = 0;
t->tv_nsec = 020000000;
nanosleep(t, NULL);
}
- ++nPoll;
#endif
} while (nRequests);
+}
+
+void Hardware_readout(Hardware *my, void *partEvt)
+{
+ int i;
+ int firstSam = -1;
+ void *subEvt = SubEvt_data(partEvt);
+ static unsigned long trigNr = 0;
+ unsigned trigTag;
+
+ /* init partial event, necessary for SubEvt_next() */
+ SubEvt_setDecoding(partEvt, SubEvtDecoding_SubEvts);
+ SubEvt_setId(partEvt, 0);
+
+ /* read all sams, check for common trigger tag */
+ for (i = 0; i < my->nSams; i++) {
+ if (HwSam_readSubEvt(my->sam[i], subEvt) == 0) {
+ if (firstSam < 0) {
+ trigTag = SubEvt_trigNr(subEvt) & 0xff;
+ firstSam = i;
+ } else {
+ if (trigTag != (SubEvt_trigNr(subEvt) & 0xff)) {
+ SubEvt_setDataError(subEvt);
+ SubEvt_setDataError(partEvt);
+ syslog(LOG_ERR, "(%s)Trigger tag mismatch: 0x%08x (%d) != 0x%08x",
+ my->sam[i]->name, trigTag, firstSam, SubEvt_trigNr(subEvt));
+ }
+ }
+ subEvt = SubEvt_next(partEvt, subEvt);
+ }
+ }
+
SubEvt_setTrigNr(partEvt, trigNr << 8 | trigTag);
SubEvt_setSize(partEvt, (char *) subEvt - (char *) partEvt);
trigNr++;
syslog(LOG_DEBUG, "partEvt: %s", SubEvt_2charP(partEvt));
#endif
}
-
-void Hardware_readout(Hardware *my, void *partEvt)
-{
-/* code moved to waitForTrigger */
-}
-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwsam.c,v 6.13 2002-10-24 16:45:40 hadaq Exp $";
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwsam.c,v 6.14 2002-10-27 12:26:49 hadaq Exp $";
#include <assert.h>
#include <string.h>
syslog(LOG_ERR, "HwSam readout bit = 1, should be 0, intialization bug");
}
my->currAddr = SAM_BUFSIZE;
+ my->endOfData = 0;
return 0;
}
}
} while (LVme_tstBitL(my->cram, CRR, 0) != i);
- my->currAddr = SAM_BUFSIZE * i + SAM_BUFOFFSET;
my->bankRequested = i;
+ my->currAddr = SAM_BUFSIZE * i + SAM_BUFOFFSET;
+
+ /* to indicate a buffer request state which is cleared by getEndOfData */
my->endOfData = 0;
#ifndef NDEBUG
syslog(LOG_DEBUG, "requestBuffer out");
#endif
}
+void HwSam_getEndOfData(HwSam *my)
+{
+ /* CAUTION this ist just for clearing buffer request state,
+ if also makes the being always empty in HwSam_isEmpty which makes
+ hwmdc.c working by coincidence */
+
+ my->endOfData = 1;
+}
+
/* 5 RC Headers + Subevent Header + some data */
#define SAM_NODATASIZE 0
#define RC_HEADERLENGTH 12
#endif
size = LVme_getL(my->cram, currAddr);
lastAddr = currAddr + size;
- my->endOfData = lastAddr;
if (size > SAM_BUFSIZE - SAM_BUFOFFSET) {
syslog(LOG_CRIT, "subEvt throw away : %d, %d", size, SAM_BUFSIZE-SAM_BUFOFFSET);