#include <unistd.h>
#include <sys/time.h>
+#include <hadesstd.h>
+
+#include "hardware.h"
#include "subevt.h"
#include "param.h"
+#define NSUBEVTS 2
+
struct HardwareS {
- size_t maxSubEvtSize;
+ size_t maxSubEvtSizes[NSUBEVTS];
+ UInt4 subEvtIds[NSUBEVTS];
};
-#include "hardware.h"
-
-size_t Hardware_maxSubEvtSize(const Hardware *my)
+size_t Hardware_maxSubEvtSize(const Hardware *my, int i)
{
- return my->maxSubEvtSize;
+ return my->maxSubEvtSizes[i];
}
-#include <hadesstd.h>
+UInt4 Hardware_subEvtId(const Hardware *my, int i)
+{
+ UInt4 retVal;
+
+ if (i >= NSUBEVTS) {
+ retVal = SubEvtId_invalid;
+ } else {
+ retVal = my->subEvtIds[i];
+ }
+ return retVal;
+}
int Hardware_inSpill(const Hardware *my)
{
Param *param;
my = allocMem(sizeof(Hardware));
- my->maxSubEvtSize = SubEvt_hdrSize() + 401 * sizeof(UInt4);
+ my->subEvtIds[0] = SubEvtId_trigCode;
+ my->maxSubEvtSizes[0] = SubEvt_hdrSize() + 1 * sizeof(UInt4);
+ my->subEvtIds[1] = SubEvtId_test1;
+ my->maxSubEvtSizes[1] = SubEvt_hdrSize() + 401 * sizeof(UInt4);
param = allocMem(sizeof(Param));
conParam(param, "param.tcl");
freeMem(my);
}
-void Hardware_waitForTrigger(Hardware *my, void *subEvt)
+void Hardware_waitForTrigger(Hardware *my)
{
- static int nextId = SubEvtId_trigCode;
struct timespec tS, *t = &tS;
- static unsigned long trigNr = 0;
- static UInt1 trigTag = 0;
-
-
- switch (nextId) {
- case SubEvtId_trigCode:
-#if 0
- t->tv_sec = 0;
- t->tv_nsec = 100000000;
- nanosleep(t, NULL);
+#if 1
+ t->tv_sec = 0;
+ t->tv_nsec = 100000000;
+ nanosleep(t, NULL);
#endif
-
- SubEvt_setSize(subEvt, SubEvt_hdrSize());
- SubEvt_setDecoding(subEvt, SubEvtDecoding_32bitData);
- SubEvt_setId(subEvt, SubEvtId_trigCode);
- SubEvt_setTrigNr(subEvt, trigNr << 8 | trigTag);
- nextId = SubEvtId_test1;
-
- break;
- case SubEvtId_test1:
- SubEvt_setSize(subEvt, SubEvt_hdrSize());
- SubEvt_setDecoding(subEvt, SubEvtDecoding_32bitData);
- SubEvt_setId(subEvt, SubEvtId_test1);
- SubEvt_setTrigNr(subEvt, trigNr << 8 | trigTag);
- trigNr++;
- trigTag++;
- nextId = SubEvtId_trigCode;
-
- break;
- }
}
-void Hardware_readout(Hardware *my, void *subEvt)
+void Hardware_readout(Hardware *my, int i, void *subEvt)
{
UInt4 *data = SubEvt_data(subEvt);
UInt4 *first = data;
+ static UInt1 trigTag = 0;
size_t size;
- switch (SubEvt_pureId(subEvt)) {
+ switch (my->subEvtIds[i]) {
case SubEvtId_trigCode:
+ SubEvt_setSize(subEvt, SubEvt_hdrSize());
+ SubEvt_setDecoding(subEvt, SubEvtDecoding_32bitData);
+ SubEvt_setId(subEvt, SubEvtId_trigCode);
+ SubEvt_setTrigNr(subEvt, trigTag);
*data++ = 0x00000001;
break;
case SubEvtId_test1:
+ SubEvt_setSize(subEvt, SubEvt_hdrSize());
+ SubEvt_setDecoding(subEvt, SubEvtDecoding_32bitData);
+ SubEvt_setId(subEvt, SubEvtId_test1);
+ SubEvt_setTrigNr(subEvt, trigTag);
+
*data++ = 0x55aa00FF;
*data++ = 0x55aa00FF;
*data++ = 0x55aa00FF;
#if 1
- data += (int) ((1000.0 * rand()) / RAND_MAX);
- data += (int) ((1000.0 * rand()) / RAND_MAX);
- data += (int) ((1000.0 * rand()) / RAND_MAX);
- data += (int) ((1000.0 * rand()) / RAND_MAX);
- data += (int) ((1000.0 * rand()) / RAND_MAX);
- data += (int) ((1000.0 * rand()) / RAND_MAX);
+ data += (int) ((100.0 * rand()) / RAND_MAX);
+ data += (int) ((100.0 * rand()) / RAND_MAX);
+ data += (int) ((100.0 * rand()) / RAND_MAX);
+ data += (int) ((100.0 * rand()) / RAND_MAX);
+ data += (int) ((100.0 * rand()) / RAND_MAX);
+ data += (int) ((100.0 * rand()) / RAND_MAX);
#endif
+ trigTag++;
break;
}
size = SubEvt_size(subEvt) + sizeof(UInt4) * (data - first);
- if (size > my->maxSubEvtSize) {
+ if (size > my->maxSubEvtSizes[i]) {
SubEvt_setId(subEvt, SubEvt_id(subEvt) | 0x80000000);
- size = my->maxSubEvtSize;
+ size = my->maxSubEvtSizes[i];
}
SubEvt_setSize(subEvt, size);
}
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/readout.c,v 6.3 1999-11-17 14:06:47 hades Exp $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/readout.c,v 6.4 1999-11-19 16:00:18 hades Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
#include <hadesstd.h>
#include "hardware.h"
+#include "subevt.h"
#include "shmtrans.h"
#include "hadtuqueue.h"
#include "worker.h"
msglog(LOG_DEBUG, "shmTrans: %p = hadTu: %s\n", hadTu, HadTu_2charP(hadTu));
#endif
hadTuQueue = allocMem(HadTuQueue_sizeOf());
-#ifdef BIGMSG
conHadTuQueue(hadTuQueue, hadTu, queueSize - HadTu_hdrSize());
-#else
- conHadTuQueue(hadTuQueue, hadTu, Hardware_maxSubEvtSize(hw) + HadTu_hdrSize() + 8);
-#endif
- while (NULL != (subEvt = HadTuQueue_alloc(hadTuQueue, Hardware_maxSubEvtSize(hw)))) {
- Hardware_waitForTrigger(hw, subEvt);
+ Hardware_waitForTrigger(hw);
+ for (i = 0; Hardware_subEvtId(hw, i) != SubEvtId_invalid; i++) {
+ subEvt = HadTuQueue_alloc(hadTuQueue, Hardware_maxSubEvtSize(hw, i));
- Hardware_readout(hw, subEvt);
+ Hardware_readout(hw, i, subEvt);
+ SubEvt_setTrigNr(subEvt, (*trigAccepted << 8) | (SubEvt_trigNr(subEvt) & 0xff));
(*subevtsRead)++;
if (SubEvt_dataError(subEvt)) {
(*subevtsDataErr)++;
}
- (*trigAccepted) = SubEvt_trigNr(subEvt) >> 8;
#ifndef NDEBUG
msglog(LOG_DEBUG, "hadTuQueue: %p = subEvt: %s\n", subEvt, SubEvt_2charP(subEvt));
#endif
HadTuQueue_push(hadTuQueue);
}
+ (*trigAccepted)++;
desHadTuQueue(hadTuQueue);
freeMem(hadTuQueue);
ShmTrans_send(shmTrans);