]> jspc29.x-matter.uni-frankfurt.de Git - daqdata.git/commitdiff
Initial revision
authorhades <hades>
Fri, 19 Nov 1999 16:00:08 +0000 (16:00 +0000)
committerhades <hades>
Fri, 19 Nov 1999 16:00:08 +0000 (16:00 +0000)
hadaq/hwtbus.c [new file with mode: 0644]

diff --git a/hadaq/hwtbus.c b/hadaq/hwtbus.c
new file mode 100644 (file)
index 0000000..c3767cf
--- /dev/null
@@ -0,0 +1,130 @@
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtbus.c,v 1.1 1999-11-19 16:00:08 hades Exp $";
+
+#define _POSIX_C_SOURCE 199309L
+#include <unistd.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
+
+#include "param.h"
+#include "subevt.h"
+#include "hwdtu.h"
+
+#define NSUBEVTS 1
+
+struct HardwareS {
+       size_t maxSubEvtSizes[NSUBEVTS];
+       UInt4 subEvtIds[NSUBEVTS];
+       HwDtu *dtu;
+};
+
+#include "hardware.h"
+
+size_t Hardware_maxSubEvtSize(const Hardware *my, int i)
+{
+       return my->maxSubEvtSizes[i];
+}
+
+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)
+{
+       Hardware *my;
+       Param paramS, *param = &paramS;
+       HwDtu *dtu;
+
+       if (0 > conParam(param, "param.tcl")) {
+               msglog(LOG_DEBUG, "%s:%d:%s\n", __FILE__, __LINE__, strerror(errno));
+               return NULL;
+       }
+       my = allocMem(sizeof(Hardware));
+
+       my->subEvtIds[0] = SubEvtId_trigCode;
+       my->maxSubEvtSizes[0] = SubEvt_hdrSize() + 2000 * sizeof(UInt4);
+
+       my->dtu = allocMem(sizeof(HwDtu));
+       if (0 > conHwDtu(my->dtu, "dtu", param)) {
+               msglog(LOG_DEBUG, "%s:%d:%s\n", __FILE__, __LINE__, strerror(errno));
+               return NULL;
+       }
+
+       desParam(param);
+       return my;
+}
+
+void deleteHardware(Hardware *my)
+{
+       desHwDtu(my->dtu);
+       freeMem(my->dtu);
+
+       freeMem(my);
+}
+
+void Hardware_waitForTrigger(Hardware *my)
+{
+       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);
+#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);
+}
+
+void Hardware_readout(Hardware *my, int i, void *subEvt)
+{
+       UInt4 *data = SubEvt_data(subEvt);
+       UInt4 *first = data;
+       size_t size;
+
+       switch (my->subEvtIds[i]) {
+       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) {
+                       data += (int) ((500.0 * rand()) / RAND_MAX);
+                       data += (int) ((500.0 * rand()) / RAND_MAX);
+                       data += (int) ((500.0 * rand()) / RAND_MAX);
+                       data += (int) ((500.0 * rand()) / RAND_MAX);
+               }
+               break;
+       }
+       size = SubEvt_size(subEvt) + sizeof(UInt4) * (data - first);
+       if (size > my->maxSubEvtSizes[i]) {
+               SubEvt_setId(subEvt, SubEvt_id(subEvt) | 0x80000000);
+               size = my->maxSubEvtSizes[i];
+       }
+       SubEvt_setSize(subEvt, size);
+}