-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwmdc.c,v 6.6 2000-11-08 07:53:23 hades Exp $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwmdc.c,v 6.7 2000-11-12 14:40:20 hades Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
#include "subevt.h"
#include "hwsam.h"
-#define NSAMS 1
+#define NSAMS 10
+#define SAMMASK ((1 << NSAMS) - 1)
struct HardwareS {
size_t maxSubEvtSize;
HwSam *sam[NSAMS];
- unsigned samToRead;
};
#include "hardware.h"
Param paramS, *param = ¶mS;
int i;
-#if 0
- system("cd /home/hades/ht99/slow; mdc init >/dev/null 2>&1");
-#endif
-
if (0 > conParam(param)) {
msglog(LOG_DEBUG, "%s:%d:%s\n", __FILE__, __LINE__, strerror(errno));
return NULL;
}
my = allocMem(sizeof(Hardware));
- my->maxSubEvtSize = SubEvt_hdrSize() + (2564 * sizeof(UInt4));
- my->samToRead = 0;
+ my->maxSubEvtSize = SubEvt_hdrSize() + (NSAMS * 2564 * sizeof(UInt4));
for (i = 0; i < NSAMS; i++) {
char buf[16];
freeMem(my);
}
-void Hardware_waitForTrigger(Hardware *my, void *subEvt)
+void Hardware_waitForTrigger(Hardware *my, void *partEvt)
{
- if (HwSam_isEmpty(my->sam[my->samToRead])) {
- HwSam_requestBuffer(my->sam[my->samToRead]);
- while (HwSam_isBusy(my->sam[my->samToRead])) {
+ int i;
+ unsigned long anySamIsBusy;
+
+ for (i = 0; i < NSAMS; i++) {
+ if (HwSam_isEmpty(my->sam[i])) {
+ HwSam_requestBuffer(my->sam[i]);
+ }
+ }
+
+ /* make shure that all SAMS can deliver at least one sub event */
+ anySamIsBusy = SAMMASK;
+ do {
+ for (i = 0; i < NSAMS; i++) {
+ if ((anySamIsBusy & (1 << i)) && !HwSam_isBusy(my->sam[i])) {
+ anySamIsBusy &= ~(1 << i);
+ } else {
#if 0
- struct timespec tS, *t = &tS;
- t->tv_sec = 0;
- t->tv_nsec = 020000000;
- nanosleep(t, NULL);
+ struct timespec tS, *t = &tS;
+ t->tv_sec = 0;
+ t->tv_nsec = 020000000;
+ nanosleep(t, NULL);
#endif
+ }
}
- }
+ } while (anySamIsBusy);
}
-void Hardware_readout(Hardware *my, void *subEvt)
+void Hardware_readout(Hardware *my, void *partEvt)
{
- HwSam_readSubEvt(my->sam[my->samToRead], subEvt);
- if (++my->samToRead == NSAMS ) {
- my->samToRead = 0;
+ int i;
+ void *subEvt = SubEvt_data(partEvt);
+ static UInt4 trigNr = 0;
+ UInt4 trigTag;
+
+ /* init partial event, necessary for SubEvt_next() */
+ SubEvt_setDecoding(partEvt, SubEvtDecoding_SubEvts);
+ SubEvt_setId(partEvt, 0);
+
+ /* read all sams, check for common trigger tag */
+ for (i = 0; i < NSAMS; i++) {
+
+ HwSam_readSubEvt(my->sam[i], subEvt);
+ if (i == 0) {
+ trigTag = SubEvt_trigNr(subEvt);
+ } else {
+ if (trigTag != SubEvt_trigNr(subEvt)) {
+ msglog(LOG_ERR, "(%s)Trigger tag mismatch: 0x%08x != 0x%08x\n",
+ my->sam[i]->name,trigTag, SubEvt_trigNr(subEvt));
+ }
+ }
+ subEvt = SubEvt_next(partEvt, subEvt);
}
+
+ SubEvt_setTrigNr(partEvt, trigNr << 8 | trigTag);
+ SubEvt_setSize(partEvt, (char *)subEvt - (char *)partEvt);
+ trigNr++;
}
return i + LVme_getL(my->cram, i);
}
-static void standbyMode(HwSam *my) {
- LVme_clrBitL(my->regs, KSR, 0);
- do {
- LVme_setL(my->cram, CRR, 0);
- } while (LVme_getL(my->cram, CRR) != 0);
- my->currAddr = BUFSIZE;
-}
-
-static void acquireMode(HwSam *my) {
- LVme_setBitL(my->regs, KSR, 0);
-}
-
int conHwSam(HwSam * my, const char *name, const Param *param)
{
unsigned long cardBase;
msglog(LOG_ERR, "HwSam on %p not found\n", cardBase);
return -1;
}
- my->trigNr = 0;
+ my->currAddr = BUFSIZE;
- standbyMode(my);
- acquireMode(my);
return 0;
}
void desHwSam(HwSam * my)
{
- standbyMode(my);
desLVme(my->regs);
desLVme(my->cram);
}
UInt4 *data = (UInt4 *)subEvt;
int firstAddr;
int size;
- UInt1 trigTag;
msglog(LOG_DEBUG, "readSubEvt in\n");
size = LVme_getL(my->cram, my->currAddr);
msglog(LOG_DEBUG, "readSubEvt currAddr: 0x%08x\n", my->currAddr);
if (my->currAddr + size > endOfData(my)) {
- msglog(LOG_EMERG,"subEvt throw away : %d, %d\n", size, endOfData(my) - my->currAddr);
+ msglog(LOG_CRIT,"subEvt throw away : %d, %d\n", size, endOfData(my) - my->currAddr);
/* create impossible subEvt */
SubEvt_setSize(subEvt, SubEvt_hdrSize());
SubEvt_setDecoding(subEvt, SubEvtDecoding_16bitData);
for (firstAddr = my->currAddr; my->currAddr - firstAddr < size; my->currAddr += 4) {
*data++ = LVme_getL(my->cram, my->currAddr);
}
-
msglog(LOG_DEBUG, "readSubEvt subevt: %s\n", SubEvt_2charP(subEvt));
-
- /* normal extension of trigger tag */
- trigTag = SubEvt_trigNr(subEvt);
-
- /* BUGBUG if soft & hardware trigNr differ, HW gets precedence */
- if (trigTag != (my->trigNr & 0xff)) {
- msglog(LOG_EMERG,"readSubEvt trigTag differ : 0x%08x, 0x%02x\n",my->trigNr, trigTag);
- }
- if (trigTag < (my->trigNr & 0xff)) {
- my->trigNr += 0x100;
- }
- my->trigNr = (my->trigNr & 0xffffff00) | trigTag;
- SubEvt_setTrigNr(subEvt, my->trigNr << 8 | trigTag);
- my->trigNr++;
}
msglog(LOG_DEBUG, "readSubEvt out\n");
LVme *regs;
int bufSize;
int currAddr;
- int trigNr;
} HwSam;
set readout(stndln) 0
set readout(priority) -2
+set sam0(cardbase) 0x1C000000
+set sam1(cardbase) 0x2C000000
+set sam2(cardbase) 0x3C000000
+set sam3(cardbase) 0x5C000000
+set sam4(cardbase) 0x8C000000
+set sam5(cardbase) 0x9C000000
+set sam6(cardbase) 0xaC000000
+set sam7(cardbase) 0xbC000000
+set sam8(cardbase) 0xdC000000
+set sam9(cardbase) 0xec000000
set soft(size) 1024
set dtu(cardbase) 0x44100000
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/readout.c,v 6.12 2000-11-12 14:40:20 hades Exp $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/readout.c,v 6.13 2000-11-12 14:42:08 hades Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
Worker_initEnd(worker);
while (setjmp(terminateJmp) == 0) {
+ int n = 0;
void *hadTu;
HadTuQueue *hadTuQueue;
Worker_dump(worker, 1);
- hadTu = ShmTrans_alloc(shmTrans, 192 * 1024);
+ hadTu = ShmTrans_alloc(shmTrans, 60 * 1024);
#ifndef NDEBUG
msglog(LOG_DEBUG,
"shmTrans: %p = hadTu: %s\n", hadTu, HadTu_2charP(hadTu));
#endif
hadTuQueue = allocMem(HadTuQueue_sizeOf());
- conHadTuQueue(hadTuQueue, hadTu, 192 * 1024);
- while (NULL != (subEvt = HadTuQueue_alloc(hadTuQueue, Hardware_maxSubEvtSize(hw)))) {
+ conHadTuQueue(hadTuQueue, hadTu, 60 * 1024);
+ while (n++ < 100 && NULL != (subEvt = HadTuQueue_alloc(hadTuQueue, Hardware_maxSubEvtSize(hw)))) {
Hardware_waitForTrigger(hw, subEvt);
Hardware_readout(hw, subEvt);