#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 maxSubEvtSizes[NSUBEVTS];
- UInt4 subEvtIds[NSUBEVTS];
+ size_t maxSubEvtSize;
};
-size_t Hardware_maxSubEvtSize(const Hardware *my, int i)
-{
- return my->maxSubEvtSizes[i];
-}
+#include "hardware.h"
-UInt4 Hardware_subEvtId(const Hardware *my, int i)
+size_t Hardware_maxSubEvtSize(const Hardware *my)
{
- UInt4 retVal;
-
- if (i >= NSUBEVTS) {
- retVal = SubEvtId_invalid;
- } else {
- retVal = my->subEvtIds[i];
- }
- return retVal;
+ return my->maxSubEvtSize;
}
+#include <hadesstd.h>
+
int Hardware_inSpill(const Hardware *my)
{
return 0;
Param *param;
my = allocMem(sizeof(Hardware));
- 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);
+ my->maxSubEvtSize = SubEvt_hdrSize() + 401 * sizeof(UInt4);
param = allocMem(sizeof(Param));
conParam(param, "param.tcl");
freeMem(my);
}
-void Hardware_waitForTrigger(Hardware *my)
+void Hardware_waitForTrigger(Hardware *my, void *subEvt)
{
+ static int nextId = SubEvtId_trigCode;
struct timespec tS, *t = &tS;
-#if 1
- t->tv_sec = 0;
- t->tv_nsec = 100000000;
- nanosleep(t, NULL);
-#endif
-}
-
-void Hardware_readout(Hardware *my, int i, void *subEvt)
-{
- UInt4 *data = SubEvt_data(subEvt);
- UInt4 *first = data;
+ static unsigned long trigNr = 0;
static UInt1 trigTag = 0;
- size_t size;
- switch (my->subEvtIds[i]) {
+
+ switch (nextId) {
case SubEvtId_trigCode:
+#if 0
+ 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, trigTag);
- *data++ = 0x00000001;
+ 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, trigTag);
+ SubEvt_setTrigNr(subEvt, trigNr << 8 | trigTag);
+ trigNr++;
+ trigTag++;
+ nextId = SubEvtId_trigCode;
+ break;
+ }
+}
+
+void Hardware_readout(Hardware *my, void *subEvt)
+{
+ UInt4 *data = SubEvt_data(subEvt);
+ UInt4 *first = data;
+ size_t size;
+
+ switch (SubEvt_pureId(subEvt)) {
+ case SubEvtId_trigCode:
+ *data++ = 0x00000001;
+ break;
+ case SubEvtId_test1:
*data++ = 0x55aa00FF;
*data++ = 0x55aa00FF;
*data++ = 0x55aa00FF;
#if 1
- 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);
+ 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);
#endif
- trigTag++;
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);
}
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/readout.c,v 6.7 1999-11-21 16:43:31 hades Exp $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/readout.c,v 6.8 1999-11-22 09:00:48 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"
void *subEvt;
Worker *worker;
ShmTrans *shmTrans;
- void *hadTu;
- HadTuQueue *hadTuQueue;
int i;
int isStandalone;
char *outPath;
Worker_initEnd(worker);
- hadTuQueue = allocMem(HadTuQueue_sizeOf());
- hadTu = ShmTrans_alloc(shmTrans, 64 * 1024);
- conHadTuQueue(hadTuQueue, hadTu, 64 * 1024);
while (setjmp(terminateJmp) == 0) {
+ void *hadTu;
+ HadTuQueue *hadTuQueue;
Worker_dump(worker, 1);
+ hadTu = ShmTrans_alloc(shmTrans, 64 * 1024);
#ifndef NDEBUG
msglog(LOG_DEBUG,
"shmTrans: %p = hadTu: %s\n", hadTu, HadTu_2charP(hadTu));
#endif
- Hardware_waitForTrigger(hw);
- for (i = 0; Hardware_subEvtId(hw, i) != SubEvtId_invalid; i++) {
- while (NULL == (subEvt = HadTuQueue_alloc(hadTuQueue, Hardware_maxSubEvtSize(hw, i)))) {
- desHadTuQueue(hadTuQueue);
- ShmTrans_send(shmTrans);
- hadTu = ShmTrans_alloc(shmTrans, 32 * 1024);
- conHadTuQueue(hadTuQueue, hadTu, 32 * 1024);
- }
+ hadTuQueue = allocMem(HadTuQueue_sizeOf());
+ conHadTuQueue(hadTuQueue, hadTu, 64 * 1024);
+ while (NULL != (subEvt = HadTuQueue_alloc(hadTuQueue, Hardware_maxSubEvtSize(hw)))) {
+ Hardware_waitForTrigger(hw, subEvt);
- Hardware_readout(hw, i, subEvt);
- SubEvt_setTrigNr(subEvt, (*trigAccepted << 8) | (SubEvt_trigNr(subEvt) & 0xff));
+ Hardware_readout(hw, subEvt);
(*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);
}
- desHadTuQueue(hadTuQueue);
- ShmTrans_send(shmTrans);
- freeMem(hadTuQueue);
Worker_fini(worker);
ShmTrans_close(shmTrans);