- Adding first working version of the McStas SICS connection to cvs
SKIPPED: psi/polterwrite.c
This commit is contained in:
160
mcstascounter.c
Normal file
160
mcstascounter.c
Normal file
@ -0,0 +1,160 @@
|
||||
/*----------------------------------------------------------------------------
|
||||
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 "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;
|
||||
}
|
||||
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:
|
||||
strncpy(error,"Feauture not implemented",iErrLen);
|
||||
break;
|
||||
default:
|
||||
strncpy(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){
|
||||
strncpy(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;
|
||||
}
|
Reference in New Issue
Block a user