-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwmdc.c,v 6.22 2002-10-27 08:37:54 hadaq Exp $";
-
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwmdc.c,v 6.23 2002-10-27 10:53:23 hadaq Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
+#include <string.h>
#include <time.h>
#include <syslog.h>
#include "subevt.h"
#include "hwsam.h"
-#define MDCCRATE 1
-
-#if MDCCRATE == 0
-#define FIRSTSAM 0
-#define NSAMS 12
-#endif
-
-#if MDCCRATE == 1
-#define FIRSTSAM 12
-#define NSAMS 5
-#endif
-
struct HardwareS {
size_t maxSubEvtSize;
- HwSam *sam[NSAMS];
+ int nSams;
+ HwSam **sam;
};
#include "hardware.h"
return 0;
}
-Hardware *newHardware(void)
+Hardware *newHardware(const char *subsystem)
{
Hardware *my;
Param paramS, *param = ¶mS;
int i;
+ const char *ss;
+ char cardsS[PARAM_MAX_ARRAY_LEN][PARAM_MAX_VALUE_LEN];
+ char *cards[PARAM_MAX_ARRAY_LEN];
+ int nCards;
+
+ for (i = 0; i < PARAM_MAX_ARRAY_LEN; i++) {
+ cards[i] = cardsS[i];
+ }
+
+ if (strcmp(subsystem, "unknown") == 0) {
+ ss = "mdc0";
+ syslog(LOG_NOTICE, "Subsystem not set, defaulting to %s", ss);
+ } else {
+ ss = subsystem;
+ }
if (0 > conParam(param)) {
- syslog(LOG_ERR, "%s:%d:%s", __FILE__, __LINE__, strerror(errno));
+ syslog(LOG_ERR, "Construction of parameter source failed: %s", strerror(errno));
+ return NULL;
+ }
+ if (0 > getCards(param, ss, "sam", &nCards, cards)) {
+ syslog(LOG_ERR, "Retrieval of card list failed");
return NULL;
}
my = malloc(sizeof(Hardware));
+ my->sam = malloc(nCards * sizeof(HwSam *));
+ my->nSams = nCards;
- my->maxSubEvtSize = SubEvt_hdrSize() + (NSAMS * 2564 * sizeof(uint32_t));
-
- for (i = 0; i < NSAMS; i++) {
- char buf[12];
+ my->maxSubEvtSize = SubEvt_hdrSize() + (my->nSams * 2564 * sizeof(uint32_t));
+ for (i = 0; i < my->nSams; i++) {
my->sam[i] = malloc(sizeof(HwSam));
- sprintf(buf, "sam%d", i + FIRSTSAM);
- if (0 > conHwSam(my->sam[i], buf, param)) {
- syslog(LOG_ERR, "%s:%d:%s", __FILE__, __LINE__, strerror(errno));
+ if (0 > conHwSam(my->sam[i], cards[i], param)) {
+ syslog(LOG_ERR, "Construction of card %s failed:%s", cards[i], strerror(errno));
return NULL;
}
}
-
desParam(param);
return my;
}
{
int i;
- for (i = 0; i < NSAMS; i++) {
+ for (i = 0; i < my->nSams; i++) {
desHwSam(my->sam[i]);
free(my->sam[i]);
}
+ free(my->sam);
free(my);
}
-#define N_POLL_MAX 60/NSAMS
void Hardware_waitForTrigger(Hardware *my, void *partEvt)
{
int i;
int nPoll = 0;
+ const int nPollMax = 60 / my->nSams;
int nRequests;
- int firstSam=-1;
+ int firstSam = -1;
void *subEvt = SubEvt_data(partEvt);
static uint32_t trigNr = 0;
uint32_t trigTag;
- for (i = 0; i < NSAMS; i++) {
+ for (i = 0; i < my->nSams; i++) {
HwSam_requestBuffer(my->sam[i]);
}
/* make shure that all SAMS have delivered one sub event */
/* check for common trigger tag */
- nRequests = NSAMS;
+ nRequests = my->nSams;
do {
- for (i = 0; i < NSAMS; i++) {
- if (HwSam_isBufRequested(my->sam[i])) {
- if(!HwSam_isBusy(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);
- }
+ for (i = 0; i < my->nSams; i++) {
+ if (HwSam_isBufRequested(my->sam[i])) {
+ if (!HwSam_isBusy(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 >= N_POLL_MAX && firstSam < 0) {
+ if (nPoll >= nPollMax && firstSam < 0) {
struct timespec tS, *t = &tS;
t->tv_sec = 0;
t->tv_nsec = 020000000;
} while (nRequests);
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);