- 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
187 lines
4.8 KiB
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;
|
|
}
|