-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtbus.c,v 1.1 1999-11-19 16:00:08 hades Exp $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtbus.c,v 1.2 1999-11-22 10:45:55 hades Stab $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
#define NSUBEVTS 1
struct HardwareS {
- size_t maxSubEvtSizes[NSUBEVTS];
- UInt4 subEvtIds[NSUBEVTS];
+ size_t maxSubEvtSize;
HwDtu *dtu;
};
#include "hardware.h"
-size_t Hardware_maxSubEvtSize(const Hardware *my, int i)
+size_t Hardware_maxSubEvtSize(const Hardware *my)
{
- return my->maxSubEvtSizes[i];
+ return my->maxSubEvtSize;
}
-UInt4 Hardware_subEvtId(const Hardware *my, int i)
-{
- UInt4 retVal;
-
- if (i >= NSUBEVTS) {
- retVal = SubEvtId_invalid;
- } else {
- retVal = my->subEvtIds[i];
- }
- return retVal;
-}
Hardware *newHardware(void)
{
}
my = allocMem(sizeof(Hardware));
- my->subEvtIds[0] = SubEvtId_trigCode;
- my->maxSubEvtSizes[0] = SubEvt_hdrSize() + 2000 * sizeof(UInt4);
+ my->maxSubEvtSize = SubEvt_hdrSize() + 2000 * sizeof(UInt4);
my->dtu = allocMem(sizeof(HwDtu));
if (0 > conHwDtu(my->dtu, "dtu", param)) {
freeMem(my);
}
-void Hardware_waitForTrigger(Hardware *my)
+void Hardware_waitForTrigger(Hardware *my, void *subEvt)
{
- int doReadOut;
-
- do {
- while (HwDtu_isEmpty(my->dtu)) {
-#if 0
- struct timespec tS, *t = &tS;
- t->tv_sec = 0;
- t->tv_nsec = 020000000;
- nanosleep(t, NULL);
+ static int nextId = SubEvtId_trigCode;
+ static int doReadOut;
+ static UInt1 trigTag = 0;
+ static unsigned long trigNr = 0;
+
+ switch (nextId) {
+ case SubEvtId_trigCode:
+ do {
+ while (HwDtu_isEmpty(my->dtu)) {
+#if 1
+ struct timespec tS, *t = &tS;
+ t->tv_sec = 0;
+ t->tv_nsec = 020000000;
+ nanosleep(t, NULL);
#endif
- }
- HwDtu_read(my->dtu);
- msglog(LOG_DEBUG, "Dtu: tag: 0x%02x, code: 0x%02x\n", my->dtu->trigTag, my->dtu->trigCode);
- switch (my->dtu->trigCode & 0x7) {
- case 0x02:
- case 0x03:
- doReadOut = 0;
- break;
- default:
- doReadOut = 1;
- break;
- }
- } while (!doReadOut);
+ }
+ HwDtu_read(my->dtu);
+ msglog(LOG_DEBUG, "Dtu: tag: 0x%02x, code: 0x%02x\n", my->dtu->trigTag, my->dtu->trigCode);
+ switch (my->dtu->trigCode & 0x7) {
+ case 0x02:
+ case 0x03:
+ trigTag = my->dtu->trigTag;
+ doReadOut = 0;
+ break;
+ default:
+ doReadOut = 1;
+ break;
+ }
+ } while (!doReadOut);
+ SubEvt_setSize(subEvt, SubEvt_hdrSize());
+ SubEvt_setDecoding(subEvt, SubEvtDecoding_32bitData);
+ SubEvt_setTrigNr(subEvt, trigNr << 8 | trigTag);
+ SubEvt_setId(subEvt, SubEvtId_trigCode);
+ nextId = SubEvtId_trigCode;
+ trigTag = my->dtu->trigTag;
+ trigNr++;
+ break;
+ }
}
-void Hardware_readout(Hardware *my, int i, void *subEvt)
+void Hardware_readout(Hardware *my, void *subEvt)
{
UInt4 *data = SubEvt_data(subEvt);
UInt4 *first = data;
size_t size;
- switch (my->subEvtIds[i]) {
+ switch (SubEvt_pureId(subEvt)) {
case SubEvtId_trigCode:
- SubEvt_setSize(subEvt, SubEvt_hdrSize());
- SubEvt_setDecoding(subEvt, SubEvtDecoding_32bitData);
- SubEvt_setTrigNr(subEvt, my->dtu->trigTag);
- SubEvt_setId(subEvt, SubEvtId_trigCode);
*data++ = my->dtu->trigCode;
if (RAND_MAX / rand() > 2) {
break;
}
size = SubEvt_size(subEvt) + sizeof(UInt4) * (data - first);
- if (size > my->maxSubEvtSizes[i]) {
+ if (size > my->maxSubEvtSize) {
SubEvt_setId(subEvt, SubEvt_id(subEvt) | 0x80000000);
- size = my->maxSubEvtSizes[i];
+ size = my->maxSubEvtSize;
}
SubEvt_setSize(subEvt, size);
}