Files
sics/mcstashm.c
koennecke b26b8fc735 - Changed strncpy to strlcpy, strncat to strlcat
- Added strlcpy and strlcat to SICS
- Added a driver for the POLDI power supplies


SKIPPED:
	psi/A1931.c
	psi/autowin.c
	psi/bruker.c
	psi/docho.c
	psi/dornier2.c
	psi/dspcode.c
	psi/ease.c
	psi/ecb.c
	psi/ecbcounter.c
	psi/ecbdriv.c
	psi/el734dc.c
	psi/el734driv.c
	psi/el734hp.c
	psi/el737driv.c
	psi/el737hpdriv.c
	psi/el737hpdrivsps.c
	psi/el737hpv2driv.c
	psi/el755driv.c
	psi/eurodriv.c
	psi/haakedriv.c
	psi/itc4driv.c
	psi/julcho.c
	psi/linadriv.c
	psi/lmd200.c
	psi/lscsupport.c
	psi/ltc11.c
	psi/make_gen
	psi/oicom.c
	psi/oxinst.c
	psi/pimotor.c
	psi/pipiezo.c
	psi/polterwrite.c
	psi/psi.c
	psi/sanscook.c
	psi/sanslirebin.c
	psi/sanswave.c
	psi/sinqhmdriv.c
	psi/sinqhttp.c
	psi/slsecho.c
	psi/slsmagnet.c
	psi/slsvme.c
	psi/sps.c
	psi/swmotor.c
	psi/swmotor2.c
	psi/tabledrive.c
	psi/tasscan.c
	psi/tdchm.c
	psi/velodorn.c
	psi/velodornier.c
2010-04-13 15:08:38 +00:00

238 lines
6.3 KiB
C

/*--------------------------------------------------------------------------
This is a driver for a histogram memory which is meant to interoperate
with a McStas simulation. For reasons of lazyness the control of counting
operations is delegated to a single counter object and this driver only
provides data space and means to access and copy data. This driver also
works without a counter connected in order to support multi HM control via
the hmcontrol module.
copyright: see file COPYRIGHT
Mark Koennecke, June 2005
-------------------------------------------------------------------------*/
#include <stdlib.h>
#include <assert.h>
#include "sics.h"
#include "counter.h"
#include "stringdict.h"
#include "HistDriv.i"
/*================= operator functions ====================================*/
static int McHMConfigure(pHistDriver self, SConnection * pCon,
pStringDict pOpt, SicsInterp * pSics)
{
char counterName[80];
char pError[256];
if (StringDictGet(pOpt, "counter", counterName, 79) == 1) {
self->pPriv = FindCommandData(pSics, counterName, "SingleCounter");
if (self->pPriv == NULL) {
snprintf(pError, 255,
"ERROR: tried to configure counter but %s not found",
counterName);
SCWrite(pCon, pError, eError);
return 0;
}
}
self->iReconfig = 0;
return configureHMdata(self->data, pOpt, pCon);
}
/*-------------------------------------------------------------------------*/
static int McHMStart(pHistDriver self, SConnection * pCon)
{
pCounter pCount = NULL;
/*
* clear data
*/
clearHMData(self->data);
/*
* if there is a counter, make him start
*/
pCount = (pCounter) self->pPriv;
if (pCount != NULL) {
pCount->pDriv->eMode = self->eCount;
pCount->pDriv->fPreset = self->fCountPreset;
return pCount->pCountInt->StartCount(pCount, pCon);
} else {
return 1;
}
}
/*------------------------------------------------------------------------*/
static int McHMHalt(pHistDriver self)
{
pCounter pCount = NULL;
pCount = (pCounter) self->pPriv;
if (pCount != NULL) {
return pCount->pCountInt->Halt(pCount);
} else {
return 1;
}
}
/*-------------------------------------------------------------------------*/
static int McHMCountStatus(pHistDriver self, SConnection * pCon)
{
pCounter pCount = NULL;
pCount = (pCounter) self->pPriv;
if (pCount != NULL) {
return pCount->pCountInt->CheckCountStatus(pCount, pCon);
} else {
return HWIdle;
}
}
/*------------------------------------------------------------------------*/
static int McHMGetError(pHistDriver self, int *iCode, char *error,
int errLen)
{
pCounter pCount = NULL;
pCount = (pCounter) self->pPriv;
if (pCount != NULL) {
return pCount->pDriv->GetError(pCount->pDriv, iCode, error, errLen);
} else {
*iCode = -1000;
strlcpy(error, "Feature not implemented in McStasHM", errLen);
return 1;
}
}
/*-------------------------------------------------------------------------*/
static int McHMFixIt(pHistDriver self, int iCode)
{
pCounter pCount = NULL;
pCount = (pCounter) self->pPriv;
if (pCount != NULL) {
return pCount->pDriv->TryAndFixIt(pCount->pDriv, iCode);
} else {
return COTERM;
}
}
/*-----------------------------------------------------------------------*/
static int McHMGetData(pHistDriver self, SConnection * pCon)
{
pCounter pCount = NULL;
pCount = (pCounter) self->pPriv;
if (pCount != NULL) {
return pCount->pCountInt->TransferData(pCount, pCon);
} else {
return 1;
}
}
/*-----------------------------------------------------------------------*/
static int McHMGetHistogram(pHistDriver self, SConnection * pCon,
int bank, int start, int end, HistInt * pData)
{
/*
* make sure data gets transferred
*/
return McHMGetData(self, pCon);
}
/*-------------------------------------------------------------------------*/
static int McHMSetHistogram(pHistDriver self, SConnection * pCon,
int bank, int start, int end, HistInt * pData)
{
int i, count = 0;
HistInt *hmData;
assert(bank == 0);
hmData = self->data->localBuffer;
for (i = start; i < end; i++, count++) {
hmData[i] = pData[count];
}
return 1;
}
/*-------------------------------------------------------------------------*/
static long McHMMonitor(pHistDriver self, int i, SConnection * pCon)
{
pCounter pCount = NULL;
pCount = (pCounter) self->pPriv;
if (pCount != NULL) {
return GetMonitor(pCount, i, pCon);
} else {
return 0L;
}
}
/*-------------------------------------------------------------------------*/
static float McHMGetTime(pHistDriver self, SConnection * pCon)
{
pCounter pCount = NULL;
pCount = (pCounter) self->pPriv;
if (pCount != NULL) {
return GetCountTime(pCount, pCon);;
} else {
return -999.99;
}
}
/*--------------------------------------------------------------------------*/
static int McHMPreset(pHistDriver self, SConnection * pCon, HistInt val)
{
int i;
long length;
HistInt *data;
length = getHMDataLength(self->data);
data = self->data->localBuffer;
for (i = 0; i < length; i++) {
data[i] = val;
}
return 1;
}
/*------------------------------------------------------------------------*/
static int McHMPause(pHistDriver self, SConnection * pCon)
{
return HWFault;
}
/*-----------------------------------------------------------------------*/
static int McHMContinue(pHistDriver self, SConnection * pCon)
{
return HWFault;
}
/*========================== the actual creation function ================*/
pHistDriver NewMcStasHM(pStringDict pOpt)
{
pHistDriver pNew = NULL;
pNew = CreateHistDriver(pOpt);
if (pNew == NULL) {
return NULL;
}
pNew->Configure = McHMConfigure;
pNew->Start = McHMStart;
pNew->Halt = McHMHalt;
pNew->GetCountStatus = McHMCountStatus;
pNew->GetError = McHMGetError;
pNew->TryAndFixIt = McHMFixIt;
pNew->GetData = McHMGetData;
pNew->GetHistogram = McHMGetHistogram;
pNew->SetHistogram = McHMSetHistogram;
pNew->GetMonitor = McHMMonitor;
pNew->GetTime = McHMGetTime;
pNew->Preset = McHMPreset;
pNew->FreePrivate = NULL;
pNew->Pause = McHMPause;
pNew->Continue = McHMContinue;
StringDictAddPair(pOpt, "counter", "UNKNOWN");
StringDictUpdate(pOpt, "update", "10");
return pNew;
}