From 197bb8a785b239969b982a69019e44c96d24767d Mon Sep 17 00:00:00 2001 From: hadaq Date: Sun, 27 Oct 2002 12:26:49 +0000 Subject: [PATCH] Consistency with shower -- mm --- hadaq/hwmdc.c | 82 +++++++++++++++++++++++++++++---------------------- hadaq/hwsam.c | 17 +++++++++-- hadaq/hwsam.h | 6 ++-- 3 files changed, 64 insertions(+), 41 deletions(-) diff --git a/hadaq/hwmdc.c b/hadaq/hwmdc.c index feae9de..c53122d 100644 --- a/hadaq/hwmdc.c +++ b/hadaq/hwmdc.c @@ -1,4 +1,4 @@ -static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwmdc.c,v 6.23 2002-10-27 10:53:23 hadaq Exp $"; +static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwmdc.c,v 6.24 2002-10-27 12:26:49 hadaq Exp $"; #define _POSIX_C_SOURCE 199309L #include @@ -93,61 +93,76 @@ void deleteHardware(Hardware *my) free(my); } -void Hardware_waitForTrigger(Hardware *my, void *partEvt) +void Hardware_waitForTrigger(Hardware *my, void *subEvt) { int i; + int nRequests = 0; int nPoll = 0; const int nPollMax = 60 / my->nSams; - int nRequests; - int firstSam = -1; - void *subEvt = SubEvt_data(partEvt); - static uint32_t trigNr = 0; - uint32_t trigTag; for (i = 0; i < my->nSams; i++) { - HwSam_requestBuffer(my->sam[i]); + if (HwSam_isEmpty(my->sam[i])) { + HwSam_requestBuffer(my->sam[i]); + ++nRequests; + } } - /* init partial event, necessary for SubEvt_next() */ - SubEvt_setDecoding(partEvt, SubEvtDecoding_SubEvts); - SubEvt_setId(partEvt, 0); - - /* make shure that all SAMS have delivered one sub event */ - /* check for common trigger tag */ - nRequests = my->nSams; do { for (i = 0; i < my->nSams; i++) { if (HwSam_isBufRequested(my->sam[i])) { if (!HwSam_isBusy(my->sam[i])) { + HwSam_getEndOfData(my->sam[i]); --nRequests; - if (HwSam_readSubEvt(my->sam[i], subEvt) == 0) { - if (firstSam < 0) { - trigTag = SubEvt_trigNr(subEvt) & 0xff; - firstSam = i; - } else { - if (trigTag != (SubEvt_trigNr(subEvt) & 0xff)) { - SubEvt_setId(subEvt, SubEvt_id(subEvt) | 0x80000000UL); - SubEvt_setId(partEvt, SubEvt_id(partEvt) | 0x80000000UL); - syslog(LOG_ERR, "(%s)Trigger tag mismatch: 0x%08x (%d) != 0x%08x", - my->sam[i]->name, trigTag, firstSam, SubEvt_trigNr(subEvt)); - } - } - subEvt = (void *) (((uint32_t) subEvt + *(uint32_t *) subEvt + 4) & 0xfffffff8); - } } } } #if 1 - if (nPoll >= nPollMax && firstSam < 0) { +/* +* This sleep prevents a tight loop which stops work on real +* time systems if the priority of readout is not lowered. +* When not using the sleep use option -p -2 for daq_readout. +*/ + if (nRequests == my->nSams && nPoll++ >= nPollMax) { struct timespec tS, *t = &tS; t->tv_sec = 0; t->tv_nsec = 020000000; nanosleep(t, NULL); } - ++nPoll; #endif } while (nRequests); +} + +void Hardware_readout(Hardware *my, void *partEvt) +{ + int i; + int firstSam = -1; + void *subEvt = SubEvt_data(partEvt); + static unsigned long trigNr = 0; + unsigned 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 < my->nSams; i++) { + if (HwSam_readSubEvt(my->sam[i], subEvt) == 0) { + if (firstSam < 0) { + trigTag = SubEvt_trigNr(subEvt) & 0xff; + firstSam = i; + } else { + if (trigTag != (SubEvt_trigNr(subEvt) & 0xff)) { + SubEvt_setDataError(subEvt); + SubEvt_setDataError(partEvt); + syslog(LOG_ERR, "(%s)Trigger tag mismatch: 0x%08x (%d) != 0x%08x", + my->sam[i]->name, trigTag, firstSam, SubEvt_trigNr(subEvt)); + } + } + subEvt = SubEvt_next(partEvt, subEvt); + } + } + SubEvt_setTrigNr(partEvt, trigNr << 8 | trigTag); SubEvt_setSize(partEvt, (char *) subEvt - (char *) partEvt); trigNr++; @@ -157,8 +172,3 @@ void Hardware_waitForTrigger(Hardware *my, void *partEvt) syslog(LOG_DEBUG, "partEvt: %s", SubEvt_2charP(partEvt)); #endif } - -void Hardware_readout(Hardware *my, void *partEvt) -{ -/* code moved to waitForTrigger */ -} diff --git a/hadaq/hwsam.c b/hadaq/hwsam.c index cb9520a..0c109ae 100644 --- a/hadaq/hwsam.c +++ b/hadaq/hwsam.c @@ -1,4 +1,4 @@ -static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwsam.c,v 6.13 2002-10-24 16:45:40 hadaq Exp $"; +static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwsam.c,v 6.14 2002-10-27 12:26:49 hadaq Exp $"; #include #include @@ -49,6 +49,7 @@ int conHwSam(HwSam *my, const char *name, const Param *param) syslog(LOG_ERR, "HwSam readout bit = 1, should be 0, intialization bug"); } my->currAddr = SAM_BUFSIZE; + my->endOfData = 0; return 0; } @@ -75,14 +76,25 @@ void HwSam_requestBuffer(HwSam *my) } } while (LVme_tstBitL(my->cram, CRR, 0) != i); - my->currAddr = SAM_BUFSIZE * i + SAM_BUFOFFSET; my->bankRequested = i; + my->currAddr = SAM_BUFSIZE * i + SAM_BUFOFFSET; + + /* to indicate a buffer request state which is cleared by getEndOfData */ my->endOfData = 0; #ifndef NDEBUG syslog(LOG_DEBUG, "requestBuffer out"); #endif } +void HwSam_getEndOfData(HwSam *my) +{ + /* CAUTION this ist just for clearing buffer request state, + if also makes the being always empty in HwSam_isEmpty which makes + hwmdc.c working by coincidence */ + + my->endOfData = 1; +} + /* 5 RC Headers + Subevent Header + some data */ #define SAM_NODATASIZE 0 #define RC_HEADERLENGTH 12 @@ -101,7 +113,6 @@ int HwSam_readSubEvt(HwSam *my, void *subEvt) #endif size = LVme_getL(my->cram, currAddr); lastAddr = currAddr + size; - my->endOfData = lastAddr; if (size > SAM_BUFSIZE - SAM_BUFOFFSET) { syslog(LOG_CRIT, "subEvt throw away : %d, %d", size, SAM_BUFSIZE-SAM_BUFOFFSET); diff --git a/hadaq/hwsam.h b/hadaq/hwsam.h index 509f141..948de63 100644 --- a/hadaq/hwsam.h +++ b/hadaq/hwsam.h @@ -10,14 +10,16 @@ typedef struct HwSamS { LVme *cram; LVme *regs; int bankRequested; - int currAddr; - int endOfData; + unsigned long currAddr; + unsigned long endOfData; } HwSam; int conHwSam(HwSam *my, const char *name, const Param *param); void desHwSam(HwSam *my); int HwSam_readSubEvt(HwSam *my, void *subEvt); +void HwSam_getEndOfData(HwSam *my); + static int bankConfirmed(HwSam *my) { return LVme_tstBitL(my->regs, VMSR, 0); -- 2.43.0