-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwship.c,v 6.23 2002-10-09 12:42:18 hadaq Exp $";
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwship.c,v 6.24 2002-10-15 12:12:29 hadaq Exp $";
#include <assert.h>
#include <string.h>
#include "hwship.h"
-int conHwShip(HwShip * my, const char *name, const Param *param)
+int conHwShip(HwShip *my, const char *name, const Param *param)
{
- unsigned long cardBase;
+ unsigned long cardBase;
int paramWasFound;
- int i;
+ int i;
- assert(my != NULL);
+ assert(my != NULL);
- strcpy(my->name, name);
+ strcpy(my->name, name);
Param_getInt(param, my->name, "cardbase", ¶mWasFound, &cardBase);
if (!paramWasFound) {
syslog(LOG_WARNING,
- "Parameter %s(%s) not found, default = 0", my->name, "cardbase");
+ "Parameter %s(%s) not found, default = 0", my->name, "cardbase");
cardBase = 0;
}
+ my->lvme = malloc(sizeof(LVme));
+ if (0 > conLVme(my->lvme, cardBase, 0x400000UL, 0x39UL, 0, 0)) {
+ syslog(LOG_ERR, "HwShip on %p not found", cardBase);
+ return -1;
+ }
+ /* Select VME-accessible register of LVL2-controller */
+ LVme_setW(my->lvme, LVL2_SEL_VMEREG, LVL2_SELMEM_VMEREG);
- my->lvme = malloc(sizeof(LVme));
- if (0 > conLVme(my->lvme, cardBase, 0x400000UL, 0x39UL, 0, 0)) {
- syslog(LOG_ERR, "HwShip on %p not found", cardBase);
- return -1;
- }
- /* Select VME-accessible register of LVL2-controller */
- LVme_setW(my->lvme, LVL2_SEL_VMEREG, LVL2_SELMEM_VMEREG);
-
- my->currAddr = 0x7fffffff; /* behind end of memory */
- my->endOfData = 0;
- return 0;
+ my->currAddr = 0x7fffffff; /* behind end of memory */
+ my->endOfData = 0;
+ return 0;
}
-void desHwShip(HwShip * my)
+void desHwShip(HwShip *my)
{
- desLVme(my->lvme);
+ desLVme(my->lvme);
}
-void HwShip_requestBuffer(HwShip *my) {
- int i;
+void HwShip_requestBuffer(HwShip *my)
+{
+ int i;
#ifndef NDEBUG
- syslog(LOG_DEBUG, "wait for data");
+ syslog(LOG_DEBUG, "wait for data");
#endif
- while ((LVme_getL(my->lvme, LVL2_ACCESS_VMEREG) >> 16 & 0xffff) <= 2) {
+ while ((LVme_getL(my->lvme, LVL2_ACCESS_VMEREG) >> 16 & 0xffff) <= 2) {
#if 1
- struct timespec tS, *t = &tS;
- t->tv_sec = 0;
- t->tv_nsec = 010000000;
- nanosleep(t, NULL);
+ struct timespec tS, *t = &tS;
+ t->tv_sec = 0;
+ t->tv_nsec = 010000000;
+ nanosleep(t, NULL);
#endif
- }
+ }
#ifndef NDEBUG
- syslog(LOG_DEBUG, "data available");
+ syslog(LOG_DEBUG, "data available");
#endif
- i = my->bankRequested == 1 ? 0 : 1;
- LVme_setL(my->lvme, LVL2_ACCESS_VMEREG, i);
- my->bankRequested = i;
- my->currAddr = LVL2_DATASTART;
+ i = my->bankRequested == 1 ? 0 : 1;
+ LVme_setL(my->lvme, LVL2_ACCESS_VMEREG, i);
+ my->bankRequested = i;
+ my->currAddr = LVL2_DATASTART;
- /* to indicate a buffer request state which is cleared by getEndOfData */
- my->endOfData =0;
+ /* to indicate a buffer request state which is cleared by getEndOfData */
+ my->endOfData = 0;
}
#define SHIP_NODATASIZE 16
int HwShip_readSubEvt(HwShip *my, void *subEvt)
{
- uint32_t * data = (uint32_t *)subEvt;
- int lastAddr;
- int currAddr = my->currAddr;
- int size, i;
- char str[200], buff[200];
- unsigned long *tempPtr;
+ uint32_t *data = (uint32_t *) subEvt;
+ int lastAddr;
+ int currAddr = my->currAddr;
+ int size, i;
+ char str[200], buff[200];
+ unsigned long *tempPtr;
- size = LVme_getL(my->lvme, currAddr);
+ size = LVme_getL(my->lvme, currAddr);
- lastAddr = currAddr + size;
- my->currAddr = lastAddr;
+ lastAddr = currAddr + size;
+ my->currAddr = lastAddr;
- /* skip empty subevent, nobody will realize this */
+ /* skip empty subevent, nobody will realize this */
#if 1
- if (size <= SHIP_NODATASIZE) return 1;
-#endif
-
- /* copy one sub evt from RC to memory */
- *data++ = size;
- i=0;
- /* we are not sure what the maximum number of words is allowed in the ipcs*/
- while ( ( (currAddr+=4) < lastAddr) && ( i < 0x1600 ) ) {
- *data++ = LVme_getL(my->lvme, currAddr);
- i++;
- }
-
- if(size > 0x1900) {
- syslog(LOG_ERR,"Error, size too large: %.8x", size);
-
- tempPtr = data-0x1600;
-
- str[0] = 0;
- for(i=0;i < 100; i++) {
- sprintf(buff, "%.8x ", tempPtr[i]);
- strcpy((char *) ((unsigned int)str + strlen(str)) , buff);
- if( ((i+1)%4) == 0) {
- syslog(LOG_ERR, str);
- str[0] = 0;
- }
- }
- if( (i%4)) {
- syslog(LOG_ERR, str);
- str[0] = 0;
- }
- }
+ if (size <= SHIP_NODATASIZE)
+ return 1;
+#endif
+ /* copy one sub evt from RC to memory */
+ *data++ = size;
+ i = 0;
+ /* we are not sure what the maximum number of words is allowed in the ipcs*/
+ while (((currAddr += 4) < lastAddr) && (i < 0x1600)) {
+ *data++ = LVme_getL(my->lvme, currAddr);
+ i++;
+ }
+ if (size > 0x1900) {
+ syslog(LOG_ERR, "Error, size too large: %.8x", size);
+
+ tempPtr = data - 0x1600;
+
+ str[0] = 0;
+ for (i = 0; i < 100; i++) {
+ sprintf(buff, "%.8x ", tempPtr[i]);
+ strcpy((char *) ((unsigned int) str + strlen(str)), buff);
+ if (((i + 1) % 4) == 0) {
+ syslog(LOG_ERR, str);
+ str[0] = 0;
+ }
+ }
+ if ((i % 4)) {
+ syslog(LOG_ERR, str);
+ str[0] = 0;
+ }
+ }
#ifndef NDEBUG
syslog(LOG_DEBUG, "subEvt: %s", SubEvt_2charP(subEvt));
#endif
- return 0;
+ return 0;
}
-
-
-
-
-
#include "ipc_basis.h"
typedef struct HwShipS {
- char name[12];
- LVme *lvme;
- int currAddr;
- int endOfData;
- int bankRequested;
-} HwShip;
+ char name[12];
+ LVme *lvme;
+ int currAddr;
+ int endOfData;
+ int bankRequested;
+}
+
+HwShip;
int conHwShip(HwShip *my, const char *name, const Param *param);
void HwShip_requestBuffer(HwShip *my);
-static int bankConfirmed(HwShip *my) {
+static int bankConfirmed(HwShip *my)
+{
return LVme_tstBitL(my->lvme, LVL2_ACCESS_VMEREG, 7);
}
-static void HwShip_getEndOfData(HwShip *my) {
+static void HwShip_getEndOfData(HwShip *my)
+{
my->endOfData = LVme_getL(my->lvme, LVL2_OFFSET) - 2 + LVL2_OFFSET;
}
-static int HwShip_isBusy(HwShip *my) {
- return my->bankRequested != bankConfirmed(my);
+static int HwShip_isBusy(HwShip *my)
+{
+ return my->bankRequested != bankConfirmed(my);
}
-static int HwShip_isEmpty(HwShip *my) {
- return my->currAddr >= my->endOfData;
+static int HwShip_isEmpty(HwShip *my)
+{
+ return my->currAddr >= my->endOfData;
}
-static int HwShip_isBufRequested(HwShip *my) {
- return my->endOfData == 0;
+static int HwShip_isBufRequested(HwShip *my)
+{
+ return my->endOfData == 0;
}
int HwShip_readSubEvt(HwShip *my, void *subEvt);
-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwshow.c,v 6.23 2002-10-09 12:42:18 hadaq Exp $";
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwshow.c,v 6.24 2002-10-15 12:12:29 hadaq Exp $";
#define _POSIX_C_SOURCE 199309L
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
+#include <string.h>
#include <sys/time.h>
#include <syslog.h>
/*my->maxSubEvtSize = SubEvt_hdrSize() + (NSHIPS * 1600 * sizeof(uint32_t));*/
my->maxSubEvtSize = SubEvt_hdrSize() + (NSHIPS * 1900 * sizeof(uint32_t));
- syslog(LOG_WARNING, "max subevent size: %.8x", my->maxSubEvtSize );
+ syslog(LOG_WARNING, "max subevent size: %.8x", my->maxSubEvtSize);
for (i = 0; i < NSHIPS; i++) {
}
do {
- for (i = 0; i < NSHIPS; i++) {
- if (HwShip_isBufRequested(my->ship[i])) {
- if (!HwShip_isBusy(my->ship[i])) {
- HwShip_getEndOfData(my->ship[i]);
- --nRequests;
- }
+ for (i = 0; i < NSHIPS; i++) {
+ if (HwShip_isBufRequested(my->ship[i])) {
+ if (!HwShip_isBusy(my->ship[i])) {
+ HwShip_getEndOfData(my->ship[i]);
+ --nRequests;
+ }
+ }
}
- }
#if 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 == NSHIPS) {
- struct timespec tS, *t = &tS;
- t->tv_sec = 0;
- t->tv_nsec = 020000000;
- nanosleep(t, NULL);
- }
+ if (nRequests == NSHIPS) {
+ struct timespec tS, *t = &tS;
+ t->tv_sec = 0;
+ t->tv_nsec = 020000000;
+ nanosleep(t, NULL);
+ }
#endif
- } while(nRequests);
+ } while (nRequests);
}
/* read all ships, check for common trigger tag */
for (i = 0; i < NSHIPS; i++) {
- if( HwShip_readSubEvt(my->ship[i], subEvt) == 0) {
- if (firstShip < 0) {
- trigTag = SubEvt_trigNr(subEvt) & 0xff;
- firstShip = 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->ship[i]->name,trigTag,firstShip,SubEvt_trigNr(subEvt));
+ if (HwShip_readSubEvt(my->ship[i], subEvt) == 0) {
+ if (firstShip < 0) {
+ trigTag = SubEvt_trigNr(subEvt) & 0xff;
+ firstShip = 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->ship[i]->name, trigTag, firstShip, SubEvt_trigNr(subEvt));
+ }
}
+ subEvt = SubEvt_next(partEvt, subEvt);
}
- subEvt = SubEvt_next(partEvt, subEvt);
- }
}
SubEvt_setTrigNr(partEvt, trigNr << 8 | trigTag);
- SubEvt_setSize(partEvt, (char *)subEvt - (char *)partEvt);
+ SubEvt_setSize(partEvt, (char *) subEvt - (char *) partEvt);
trigNr++;
assert(SubEvt_size(partEvt) <= my->maxSubEvtSize);