-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwshow.c,v 6.20 2001-11-18 13:10:35 hadaq Exp $";
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwshow.c,v 6.21 2002-05-23 16:51:37 hadaq Exp $";
#define _POSIX_C_SOURCE 199309L
my->maxSubEvtSize = SubEvt_hdrSize() + (NSHIPS * 1600 * sizeof(uint32_t));
for (i = 0; i < NSHIPS; i++) {
- char buf[16];
+ char buf[12];
my->ship[i] = malloc(sizeof(HwShip));
sprintf(buf, "ipc%d", i);
void Hardware_waitForTrigger(Hardware *my, void *subEvt)
{
int i;
+ int nRequests = 0;
for (i = 0; i < NSHIPS; i++) {
if (HwShip_isEmpty(my->ship[i])) {
HwShip_requestBuffer(my->ship[i]);
+ ++nRequests;
}
}
- for (i = 0; i < NSHIPS; i++) {
- while (HwShip_isBusy(my->ship[i])) {
-#if 1
+ do {
+ for (i = 0; i < NSHIPS; i++) {
+ if (HwShip_isBufRequested(my->ship[i])) {
+ if (!HwShip_isBusy(my->ship[i])) {
+ HwShip_getEndOfData(my->ship[i]);
+ --nRequests;
+ }
+ }
+ }
+#if 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.
*/
- struct timespec tS, *t = &tS;
- t->tv_sec = 0;
- t->tv_nsec = 020000000;
- nanosleep(t, NULL);
+ if (nRequests == NSHIPS) {
+ struct timespec tS, *t = &tS;
+ t->tv_sec = 0;
+ t->tv_nsec = 020000000;
+ nanosleep(t, NULL);
+ }
#endif
- }
- }
+ } while(nRequests);
+
}
void Hardware_readout(Hardware *my, void *partEvt)
{
int i;
+ int firstShip = -1;
void *subEvt = SubEvt_data(partEvt);
static uint32_t trigNr = 0;
- uint32_t trigTag;
+ uint32_t trigTag = 0;
/* init partial event, necessary for SubEvt_next() */
SubEvt_setDecoding(partEvt, SubEvtDecoding_SubEvts);
/* read all ships, check for common trigger tag */
for (i = 0; i < NSHIPS; i++) {
- HwShip_readSubEvt(my->ship[i], subEvt);
- if (i == 0) {
+ if( HwShip_readSubEvt(my->ship[i], subEvt) == 0) {
+ if (firstShip < 0) {
trigTag = SubEvt_trigNr(subEvt) & 0xff;
+ firstShip = 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 != 0x%08x",
- my->ship[i]->name,trigTag, SubEvt_trigNr(subEvt));
+ syslog(LOG_ERR, "(%s)Trigger tag mismatch: 0x%08x (%d) != 0x%08x",
+ my->ship[i]->name,trigTag,firstShip,SubEvt_trigNr(subEvt));
}
}
subEvt = SubEvt_next(partEvt, subEvt);
+ }
}
SubEvt_setTrigNr(partEvt, trigNr << 8 | trigTag);