#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);