271 lines
7.0 KiB
C
271 lines
7.0 KiB
C
/*--------------------------------------------------------------------------
|
|
D I L L U D R I V
|
|
|
|
This file contains the implementation of a driver for the Oxford
|
|
Instruments dillution cryostat using the CC0-510/AVSI temperature
|
|
controller.
|
|
|
|
|
|
Mark Koennecke, October 1997
|
|
|
|
Copyright: see copyright.h
|
|
----------------------------------------------------------------------------*/
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
#include <math.h>
|
|
#include <assert.h>
|
|
#include <fortify.h>
|
|
#include <conman.h>
|
|
#include <servlog.h>
|
|
#include <fortify.h>
|
|
|
|
#include "evdriver.h"
|
|
#include "hardsup/dillutil.h"
|
|
#include "hardsup/el734_def.h"
|
|
#include "hardsup/el734fix.h"
|
|
#include "dilludriv.h"
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
typedef struct {
|
|
pDILLU pData;
|
|
char *pHost;
|
|
int iPort;
|
|
int iChannel;
|
|
int iLastError;
|
|
char *pTranslationFile;
|
|
} DILLUDriv, *pDILLUDriv;
|
|
/*----------------------------------------------------------------------------*/
|
|
static int GetDILLUPos(pEVDriver self, float *fPos)
|
|
{
|
|
pDILLUDriv pMe = NULL;
|
|
int iRet;
|
|
|
|
assert(self);
|
|
pMe = (pDILLUDriv)self->pPrivate;
|
|
assert(pMe);
|
|
|
|
iRet = DILLU_Read(&pMe->pData,fPos);
|
|
if(iRet != 1 )
|
|
{
|
|
pMe->iLastError = iRet;
|
|
return 0;
|
|
}
|
|
if( (*fPos < 0) || (*fPos > 1000) )
|
|
{
|
|
*fPos = -999.;
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
/*----------------------------------------------------------------------------*/
|
|
static int DILLURun(pEVDriver self, float fVal)
|
|
{
|
|
pDILLUDriv pMe = NULL;
|
|
int iRet;
|
|
|
|
assert(self);
|
|
pMe = (pDILLUDriv )self->pPrivate;
|
|
assert(pMe);
|
|
|
|
iRet = DILLU_Set(&pMe->pData,fVal);
|
|
if(iRet != 1)
|
|
{
|
|
pMe->iLastError = iRet;
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
/*--------------------------------------------------------------------------*/
|
|
static int DILLUError(pEVDriver self, int *iCode, char *error, int iErrLen)
|
|
{
|
|
pDILLUDriv pMe = NULL;
|
|
|
|
assert(self);
|
|
pMe = (pDILLUDriv)self->pPrivate;
|
|
assert(pMe);
|
|
|
|
*iCode = pMe->iLastError;
|
|
DILLU_Error2Text(&pMe->pData,pMe->iLastError,error,iErrLen);
|
|
|
|
return 1;
|
|
}
|
|
/*--------------------------------------------------------------------------*/
|
|
static int DILLUSend(pEVDriver self, char *pCommand, char *pReply, int iLen)
|
|
{
|
|
pDILLUDriv pMe = NULL;
|
|
int iRet;
|
|
|
|
assert(self);
|
|
pMe = (pDILLUDriv )self->pPrivate;
|
|
assert(pMe);
|
|
|
|
iRet = DILLU_Send(&pMe->pData,pCommand, pReply,iLen);
|
|
if(iRet != 1)
|
|
{
|
|
pMe->iLastError = iRet;
|
|
return 0;
|
|
}
|
|
return 1;
|
|
|
|
}
|
|
/*--------------------------------------------------------------------------*/
|
|
static int DILLUInit(pEVDriver self)
|
|
{
|
|
pDILLUDriv pMe = NULL;
|
|
int iRet;
|
|
|
|
assert(self);
|
|
pMe = (pDILLUDriv )self->pPrivate;
|
|
assert(pMe);
|
|
|
|
pMe->pData = NULL;
|
|
iRet = DILLU_Open(&pMe->pData, pMe->pHost, pMe->iPort, pMe->iChannel,
|
|
0,pMe->pTranslationFile);
|
|
if(iRet != 1)
|
|
{
|
|
pMe->iLastError = iRet;
|
|
return 0;
|
|
}
|
|
DILLU_Config(&pMe->pData, 1000);
|
|
return 1;
|
|
}
|
|
/*--------------------------------------------------------------------------*/
|
|
static int DILLUClose(pEVDriver self)
|
|
{
|
|
pDILLUDriv pMe = NULL;
|
|
int iRet;
|
|
|
|
assert(self);
|
|
pMe = (pDILLUDriv )self->pPrivate;
|
|
assert(pMe);
|
|
|
|
DILLU_Close(&pMe->pData);
|
|
return 1;
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
static int DILLUFix(pEVDriver self, int iError)
|
|
{
|
|
pDILLUDriv pMe = NULL;
|
|
int iRet;
|
|
|
|
assert(self);
|
|
pMe = (pDILLUDriv )self->pPrivate;
|
|
assert(pMe);
|
|
|
|
switch(iError)
|
|
{
|
|
/* network errors */
|
|
case EL734__BAD_FLUSH:
|
|
case EL734__BAD_RECV:
|
|
case EL734__BAD_RECV_NET:
|
|
case EL734__BAD_RECV_UNKN:
|
|
case EL734__BAD_RECVLEN:
|
|
case EL734__BAD_RECV1:
|
|
case EL734__BAD_RECV1_PIPE:
|
|
case EL734__BAD_RNG:
|
|
case EL734__BAD_SEND:
|
|
case EL734__BAD_SEND_PIPE:
|
|
case EL734__BAD_SEND_NET:
|
|
case EL734__BAD_SEND_UNKN:
|
|
case EL734__BAD_SENDLEN:
|
|
DILLUClose(self);
|
|
iRet = DILLUInit(self);
|
|
if(iRet)
|
|
{
|
|
return DEVREDO;
|
|
}
|
|
else
|
|
{
|
|
return DEVFAULT;
|
|
}
|
|
break;
|
|
/* handable protocoll errors */
|
|
case EL734__BAD_TMO:
|
|
return DEVREDO;
|
|
break;
|
|
case DILLU__NODILLFILE:
|
|
case DILLU__ERRORTABLE:
|
|
case DILLU__READONLY:
|
|
case DILLU__OUTOFRANGE:
|
|
case DILLU__BADMALLOC:
|
|
case DILLU__FILENOTFOUND:
|
|
return DEVFAULT;
|
|
case DILLU__BADREAD:
|
|
case DILLU__SILLYANSWER:
|
|
return DEVREDO;
|
|
default:
|
|
return DEVFAULT;
|
|
break;
|
|
}
|
|
return DEVFAULT;
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
static int DILLUHalt(pEVDriver *self)
|
|
{
|
|
assert(self);
|
|
|
|
return 1;
|
|
}
|
|
/*------------------------------------------------------------------------*/
|
|
void KillDILLU(void *pData)
|
|
{
|
|
pDILLUDriv pMe = NULL;
|
|
|
|
pMe = (pDILLUDriv)pData;
|
|
assert(pMe);
|
|
|
|
if(pMe->pHost)
|
|
{
|
|
free(pMe->pHost);
|
|
}
|
|
if(pMe->pTranslationFile)
|
|
{
|
|
free(pMe->pTranslationFile);
|
|
}
|
|
free(pMe);
|
|
}
|
|
/*------------------------------------------------------------------------*/
|
|
pEVDriver CreateDILLUDriv(int argc, char *argv[])
|
|
{
|
|
pEVDriver pNew = NULL;
|
|
pDILLUDriv pSim = NULL;
|
|
|
|
/* check for arguments */
|
|
if(argc < 3)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
pNew = CreateEVDriver(argc,argv);
|
|
pSim = (pDILLUDriv)malloc(sizeof(DILLUDriv));
|
|
memset(pSim,0,sizeof(DILLUDriv));
|
|
if(!pNew || !pSim)
|
|
{
|
|
return NULL;
|
|
}
|
|
pNew->pPrivate = pSim;
|
|
pNew->KillPrivate = KillDILLU;
|
|
|
|
/* initalise pDILLUDriver */
|
|
pSim->iLastError = 0;
|
|
pSim->pHost = strdup(argv[0]);
|
|
pSim->iPort = atoi(argv[1]);
|
|
pSim->iChannel = atoi(argv[2]);
|
|
pSim->pTranslationFile = strdup(argv[3]);
|
|
|
|
|
|
/* initialise function pointers */
|
|
pNew->SetValue = DILLURun;
|
|
pNew->GetValue = GetDILLUPos;
|
|
pNew->Send = DILLUSend;
|
|
pNew->GetError = DILLUError;
|
|
pNew->TryFixIt = DILLUFix;
|
|
pNew->Init = DILLUInit;
|
|
pNew->Close = DILLUClose;
|
|
|
|
return pNew;
|
|
}
|
|
|