Files
sics/mcstascounter.c

187 lines
4.8 KiB
C

/*----------------------------------------------------------------------------
This is a counter driver which wraps the McStas controller into a
counter driver.
copyright: see file COPYRIGHT
Mark Koennecke, June 2005
-----------------------------------------------------------------------------*/
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include "sics.h"
#include "countdriv.h"
#include "mccontrol.h"
/*-------------------------------------------------------------------------*/
#define SCRIPTERROR -110
#define NOTIMPLEMENTED -111
/*====================== interface functions ==============================*/
static int McStatus(struct __COUNTER *self, float *fControl)
{
int status;
pMcStasController pMcStas = NULL;
pMcStas = (pMcStasController) self->pData;
status = McStasStatus(pMcStas, fControl);
if (status == HWFault) {
self->iErrorCode = SCRIPTERROR;
return status;
}
return status;
}
/*--------------------------------------------------------------------------*/
static int McStart(struct __COUNTER *self)
{
int status;
pMcStasController pMcStas = NULL;
pMcStas = (pMcStasController) self->pData;
memset(self->lCounts, 0, MAXCOUNT * sizeof(long));
status = McStasStart(pMcStas, self->eMode, self->fPreset);
if (status == HWFault) {
self->iErrorCode = SCRIPTERROR;
}
return status;
}
/*--------------------------------------------------------------------------*/
static int McPause(struct __COUNTER *self)
{
self->iErrorCode = NOTIMPLEMENTED;
return HWFault;
}
/*--------------------------------------------------------------------------*/
static int McContinue(struct __COUNTER *self)
{
self->iErrorCode = NOTIMPLEMENTED;
return HWFault;
}
/*--------------------------------------------------------------------------*/
static int McHalt(struct __COUNTER *self)
{
int status;
pMcStasController pMcStas = NULL;
pMcStas = (pMcStasController) self->pData;
status = McStasStop(pMcStas);
if (status == HWFault) {
self->iErrorCode = SCRIPTERROR;
}
return status;
}
/*--------------------------------------------------------------------------*/
static int McReadValues(struct __COUNTER *self)
{
int status;
pMcStasController pMcStas = NULL;
pMcStas = (pMcStasController) self->pData;
status = McStasTransferData(pMcStas);
if (status == HWFault) {
self->iErrorCode = SCRIPTERROR;
}
self->fTime = time(NULL) - pMcStas->startTime;
return status;
}
/*--------------------------------------------------------------------------*/
static int McGetError(struct __COUNTER *self, int *iCode, char *error,
int iErrLen)
{
pMcStasController pMcStas = NULL;
pMcStas = (pMcStasController) self->pData;
switch (self->iErrorCode) {
case SCRIPTERROR:
McStasGetError(pMcStas, error, iErrLen);
break;
case NOTIMPLEMENTED:
strlcpy(error, "Feauture not implemented", iErrLen);
break;
default:
strlcpy(error, "Unknown error code in McStas Driver", iErrLen);
break;
}
return 1;
}
/*------------------------------------------------------------------------*/
static int McTryAndFixIt(struct __COUNTER *self, int iCode)
{
int status;
pMcStasController pMcStas = NULL;
pMcStas = (pMcStasController) self->pData;
status = McStasFix(pMcStas);
return status;
}
/*------------------------------------------------------------------------*/
static int McSet(struct __COUNTER *self, char *name, int iCter, float FVal)
{
return 1;
}
/*------------------------------------------------------------------------*/
static int McGet(struct __COUNTER *self, char *name, int iCter,
float *fVal)
{
*fVal = 25.99;
return 1;
}
/*-------------------------------------------------------------------------*/
static int McSend(struct __COUNTER *self, char *pText,
char *pReply, int iReplyLen)
{
strlcpy(pReply, "WARNING: McStas simulation cannot be sent anything",
iReplyLen);
return 1;
}
/*-------------------------------------------------------------------------*/
pCounterDriver NewMcStasCounter(char *name)
{
pMcStasController pMcStas = NULL;
pCounterDriver pNew = NULL;
/*
* cannot do it without a McStas Controller
*/
pMcStas = FindCommandData(pServ->pSics, "mccontrol", "McStasController");
if (pMcStas == NULL) {
return NULL;
}
pNew = CreateCounterDriver(name, "McStas");
if (pNew == NULL) {
return NULL;
}
pNew->iNoOfMonitors = 10;
pNew->pData = pMcStas;
pNew->GetStatus = McStatus;
pNew->Start = McStart;
pNew->Halt = McHalt;
pNew->ReadValues = McReadValues;
pNew->GetError = McGetError;
pNew->TryAndFixIt = McTryAndFixIt;
pNew->Pause = McPause;
pNew->Continue = McContinue;
pNew->Set = McSet;
pNew->Get = McGet;
pNew->Send = McSend;
pNew->KillPrivate = NULL;
return pNew;
}