-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwrace.c,v 6.12 2001-03-07 16:02:44 hades Exp $";
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwrace.c,v 6.13 2001-04-10 15:00:21 hades Exp $";
#define _POSIX_C_SOURCE 199309L
strcpy(my->name, name);
- my->trigNr = 0;
-
Param_getInt(param, my->name, "cardbase", ¶mWasFound, &cardBase);
if (!paramWasFound) {
msglog(LOG_WARNING,
int size;
size = Rc_readMem(my->rc, my->currAddr);
-#if 0
-/* This sleep was a quickhack in sep. 99 beamtime to fix a problem
- * during bank switching. It is not understood, why it helped.
-*/
- if ( 1 || my->currAddr == 0) {
- struct timespec tS, *t = &tS;
- t->tv_sec = 0;
- t->tv_nsec = 040000000;
- nanosleep(t, NULL);
- }
-#endif
#ifndef NDEBUG
msglog(LOG_DEBUG, "size: %x, currAddr: %x\n", size, my->currAddr);
#endif
for (firstAddr = my->currAddr; my->currAddr - firstAddr < size; my->currAddr += 4) {
*data++ = Rc_readMem(my->rc, my->currAddr);
}
-/* Just for testing the banks
- * id is changed to show the bank where the subevent was
- * read from.
- * WON'T WORK WITH ANALYSIS SOFTWARE ANY MORE
- */
-#if 0
- SubEvt_setId(subEvt, bankConfirmed(my));
-#endif
- /* normal extension of trigger tag */
- SubEvt_setTrigNr(subEvt, my->trigNr << 8 | SubEvt_trigNr(subEvt));
- my->trigNr++;
/* align currAddr to next page */
if ((my->currAddr & 0xff) != 0) {
-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwrich.c,v 6.15 2001-04-10 13:28:51 hades Exp $";
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwrich.c,v 6.16 2001-04-10 15:00:21 hades Exp $";
#define _POSIX_C_SOURCE 199309L
struct HardwareS {
size_t maxSubEvtSize;
HwRace *race[NRACES];
- unsigned raceToRead;
};
#include "hardware.h"
my = allocMem(sizeof(Hardware));
my->maxSubEvtSize = SubEvt_hdrSize() + (NRACES * 2500 * sizeof(UInt4));
- my->raceToRead = 0;
for (i = 0; i < NRACES; i++) {
char buf[16];
void Hardware_waitForTrigger(Hardware *my, void *subEvt)
{
+ int i;
+
+ for (i = 0; i < NRACES; i++) {
+ if (HwRace_isEmpty(my->race[i])) {
+ HwRace_requestBuffer(my->race[i]);
+ }
+ }
+ for (i = 0; i < NRACES; i++) {
+ while (HwRace_isBusy(my->race[i])) {
+#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);
+#endif
+ }
+ }
}
void Hardware_readout(Hardware *my, void *partEvt)
{
+ int i;
void *subEvt = SubEvt_data(partEvt);
- int i, j;
+ static UInt4 trigNr = 0;
+ UInt4 trigTag;
+ /* init partial event, necessary for SubEvt_next() */
SubEvt_setDecoding(partEvt, SubEvtDecoding_SubEvts);
+ SubEvt_setId(partEvt, 0);
- for (my->raceToRead = 0; my->raceToRead < NRACES; my->raceToRead++) {
- if (HwRace_isEmpty(my->race[my->raceToRead])) {
- HwRace_requestBuffer(my->race[my->raceToRead]);
- while (HwRace_isBusy(my->race[my->raceToRead])) {
-#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);
-#endif
+ /* read all races, check for common trigger tag */
+ for (i = 0; i < NRACES; i++) {
+ HwRace_readSubEvt(my->race[i], subEvt);
+ if (i == 0) {
+ trigTag = SubEvt_trigNr(subEvt);
+ } else {
+ if (trigTag != SubEvt_trigNr(subEvt)) {
+ msglog(LOG_ERR, "(%s)Trigger tag mismatch: 0x%08x != 0x%08x\n",
+ my->race[i]->name,trigTag, SubEvt_trigNr(subEvt));
}
}
- HwRace_readSubEvt(my->race[my->raceToRead], subEvt);
- SubEvt_setTrigNr(partEvt, SubEvt_trigNr(subEvt));
subEvt = SubEvt_next(partEvt, subEvt);
}
+ SubEvt_setTrigNr(partEvt, trigNr << 8 | trigTag);
SubEvt_setSize(partEvt, (char *)subEvt - (char *)partEvt);
- SubEvt_setId(partEvt, 0);
+ trigNr++;
#ifndef NDEBUG
msglog(LOG_DEBUG, "partEvt: %s\n", SubEvt_2charP(partEvt));
#endif