Files
sics/choco.c
cvs e3cd728ecb - Rearranged directory structure for forking out ANSTO
- Refactored site specific stuff into a site module
- PSI specific stuff is now in the PSI directory.
- The old version has been tagged with pre-ansto


SKIPPED:
	psi/A1931.c
	psi/A1931.h
	psi/amor2t.c
	psi/amor2t.h
	psi/amor2t.i
	psi/amor2t.tex
	psi/amor2t.w
	psi/amorscan.c
	psi/amorscan.h
	psi/amorscan.w
	psi/amorstat.c
	psi/amorstat.h
	psi/amorstat.i
	psi/amorstat.tex
	psi/amorstat.w
	psi/bruker.c
	psi/bruker.h
	psi/bruker.w
	psi/buffer.c
	psi/buffer.h
	psi/dilludriv.c
	psi/dilludriv.h
	psi/dmc.c
	psi/dmc.h
	psi/dmc.w
	psi/docho.c
	psi/ecb.c
	psi/ecb.h
	psi/ecb.i
	psi/ecb.w
	psi/ecbdriv.c
	psi/ecbdriv.h
	psi/el734dc.c
	psi/el734driv.c
	psi/el755driv.c
	psi/el755driv.h
	psi/faverage.c
	psi/faverage.h
	psi/faverage.tex
	psi/faverage.w
	psi/fowrite.c
	psi/fowrite.h
	psi/itc4.c
	psi/itc4.h
	psi/itc4.w
	psi/itc4driv.c
	psi/ltc11.c
	psi/ltc11.h
	psi/nextrics.c
	psi/nextrics.h
	psi/nxamor.c
	psi/nxamor.h
	psi/nxamor.tex
	psi/nxamor.w
	psi/pimotor.c
	psi/pimotor.h
	psi/pimotor.tex
	psi/pimotor.w
	psi/pipiezo.c
	psi/polterwrite.c
	psi/polterwrite.h
	psi/psi.c
	psi/ruli.c
	psi/ruli.h
	psi/sanscook.c
	psi/sanswave.c
	psi/sanswave.h
	psi/sanswave.tex
	psi/sanswave.w
	psi/serial.c
	psi/serial.h
	psi/serial.w
	psi/sinqhmdriv.c
	psi/sinqhmdriv.i
	psi/sinqhmdriv.w
	psi/slsmagnet.c
	psi/sps.c
	psi/sps.h
	psi/sps.i
	psi/sps.tex
	psi/sps.w
	psi/swmotor.c
	psi/swmotor.h
	psi/swmotor.i
	psi/tas.c
	psi/tas.h
	psi/tas.tex
	psi/tas.w
	psi/tasdrive.c
	psi/tasinit.c
	psi/tasscan.c
	psi/tasu.h
	psi/tasutil.c
	psi/tdchm.c
	psi/tdchm.h
	psi/tecsdriv.c
	psi/tecsdriv.h
	psi/velodorn.c
	psi/velodorn.h
	psi/velodorn.w
	psi/velodornier.c
	psi/hardsup/README
	psi/hardsup/StrMatch.c
	psi/hardsup/asynsrv_def.h
	psi/hardsup/asynsrv_errcodes.h
	psi/hardsup/asynsrv_mark.c
	psi/hardsup/asynsrv_utility.c
	psi/hardsup/c_interfaces.c
	psi/hardsup/dillutil.c
	psi/hardsup/dillutil.h
	psi/hardsup/el734_def.h
	psi/hardsup/el734_errcodes.h
	psi/hardsup/el734_utility.c
	psi/hardsup/el734fix.h
	psi/hardsup/el734tcl.c
	psi/hardsup/el737_def.h
	psi/hardsup/el737_errcodes.h
	psi/hardsup/el737_utility.c
	psi/hardsup/el737fix.h
	psi/hardsup/el737tcl.c
	psi/hardsup/el755_def.h
	psi/hardsup/el755_errcodes.h
	psi/hardsup/el755_errorlog.c
	psi/hardsup/el755_utility.c
	psi/hardsup/err.c
	psi/hardsup/failinet.c
	psi/hardsup/geterrno.c
	psi/hardsup/itc4util.c
	psi/hardsup/itc4util.h
	psi/hardsup/make_gen
	psi/hardsup/makefile_alpha
	psi/hardsup/makefile_linux
	psi/hardsup/makeprint.c
	psi/hardsup/rs232c_def.h
	psi/hardsup/serialsinq.c
	psi/hardsup/serialsinq.h
	psi/hardsup/sinq_defs.h
	psi/hardsup/sinq_prototypes.h
	psi/hardsup/sinqhm.c
	psi/hardsup/sinqhm.h
	psi/hardsup/sinqhm_def.h
	psi/hardsup/stredit.c
	psi/hardsup/strjoin.c
	psi/hardsup/table.c
	psi/hardsup/table.h
	psi/hardsup/velsel_def.h
	psi/hardsup/velsel_utility.c
	psi/motor/Makefile
	psi/motor/el734_test
	psi/motor/el734_test.c
	psi/motor/makeprint.c
	psi/sinqhm/FOCUS_gbl.h
	psi/sinqhm/FOCUS_srv_main.c
	psi/sinqhm/Makefile
	psi/sinqhm/SinqHM_bootParamsConfig.c
	psi/sinqhm/SinqHM_bootUtil.c
	psi/sinqhm/SinqHM_def.h
	psi/sinqhm/SinqHM_gbl.h
	psi/sinqhm/SinqHM_srv_filler.c
	psi/sinqhm/SinqHM_srv_main.c
	psi/sinqhm/SinqHM_srv_routines.c
	psi/sinqhm/SinqHM_srv_server.c
	psi/sinqhm/bld
	psi/sinqhm/bld2
	psi/sinqhm/bldmen
	psi/sinqhm/hist_mem_notes.tex
	psi/sinqhm/hist_mem_spec.tex
	psi/sinqhm/hist_mem_spec_fig1.ps
	psi/sinqhm/hist_mem_spec_fig2.ps
	psi/sinqhm/hist_mem_spec_fig3.ps
	psi/sinqhm/hist_mem_spec_fig4.ps
	psi/sinqhm/lwl_client.c
	psi/sinqhm/lwl_server.c
	psi/sinqhm/make_sinqhm.com
	psi/sinqhm/monitor.c
	psi/sinqhm/psi_logo.ps
	psi/sinqhm/sinq_logo.ps
	psi/sinqhm/sinqhm_bootutil_client.c
	psi/sinqhm/sinqhm_client.c
	psi/sinqhm/sinqhm_ctrl.c
	psi/sinqhm/usrConfig.c
	psi/sinqhm/usrConfig.c_diffs
	psi/sinqhm/usrConfig2604.c
	psi/sinqhm/vmio10_def.h
	psi/sinqhm/vmio_utility.c
	psi/tecs/coc_client.c
	psi/tecs/coc_client.h
	psi/tecs/coc_logfile.c
	psi/tecs/coc_logfile.h
	psi/tecs/coc_server.c
	psi/tecs/coc_server.h
	psi/tecs/coc_util.c
	psi/tecs/coc_util.h
	psi/tecs/fortify1.c
	psi/tecs/instr_hosts.c
	psi/tecs/instr_hosts.h
	psi/tecs/keep_running.c
	psi/tecs/make_gen
	psi/tecs/make_opt
	psi/tecs/make_opt_alpha
	psi/tecs/make_opt_llc
	psi/tecs/makefile
	psi/tecs/makefile_alpha
	psi/tecs/makefile_linux
	psi/tecs/myc_buf.c
	psi/tecs/myc_buf.h
	psi/tecs/myc_err.c
	psi/tecs/myc_err.h
	psi/tecs/myc_fortran.h
	psi/tecs/myc_mem.h
	psi/tecs/myc_str.c
	psi/tecs/myc_str.h
	psi/tecs/myc_time.c
	psi/tecs/myc_time.h
	psi/tecs/myc_tmp.c
	psi/tecs/myc_tmp.h
	psi/tecs/rstart.c
	psi/tecs/six.c
	psi/tecs/str.f
	psi/tecs/sys_cmdpar.f
	psi/tecs/sys_date.f
	psi/tecs/sys_env.c
	psi/tecs/sys_get_key.f
	psi/tecs/sys_getenv.f
	psi/tecs/sys_lun.f
	psi/tecs/sys_open.f
	psi/tecs/sys_open_alpha.f
	psi/tecs/sys_rdline.c
	psi/tecs/sys_select.c
	psi/tecs/sys_select.h
	psi/tecs/sys_unix.c
	psi/tecs/sys_wait.f
	psi/tecs/tecs.bld
	psi/tecs/tecs.c
	psi/tecs/tecs.tcl
	psi/tecs/tecs_c.c
	psi/tecs/tecs_c.h
	psi/tecs/tecs_cli.c
	psi/tecs/tecs_cli.h
	psi/tecs/tecs_client.f
	psi/tecs/tecs_data.c
	psi/tecs/tecs_data.h
	psi/tecs/tecs_dlog.inc
	psi/tecs/tecs_for.f
	psi/tecs/tecs_lsc.c
	psi/tecs/tecs_lsc.h
	psi/tecs/tecs_plot.f
	psi/tecs/tecs_serial.c
	psi/tecs/tecs_serial.h
	psi/tecs/term.c
	psi/tecs/term.h
	psi/utils/Makefile
	psi/utils/SerPortServer.c
	psi/utils/asynsrv_test.c
	psi/utils/ecb-load.c
	psi/utils/el734.c
	psi/utils/el734_test.c
	psi/utils/el737.c
	psi/utils/make.ecb
	psi/utils/check/amorcheck
	psi/utils/check/dmccheck
	psi/utils/check/focuscheck
	psi/utils/check/focusstatus.tcl
	psi/utils/check/hrptcheck
	psi/utils/check/sanscheck
	psi/utils/check/sicssyntax.tex
	psi/utils/check/sicssyntaxlib.tcl
	psi/utils/check/test.tcl
	psi/utils/check/topsicheck
	psi/utils/check/tricscheck
	psi/utils/check/tst
2003-06-20 10:17:44 +00:00

253 lines
6.3 KiB
C

/*------------------------------------------------------------------------
C h o p p e r C o n t r o l l e r
Implementation file for the SICS chopper controller and general controller
device. For details about this object and its relation with the SICS system
see choco.w or choco.tex.
Mark Koennecke, January 1998
-------------------------------------------------------------------------*/
#include <stdlib.h>
#include <tcl.h>
#include <assert.h>
#include "fortify.h"
#include "sics.h"
#include "site.h"
#define CHOCOINTERNAL
#include "choco.h"
/*------------------------------------------------------------------------*/
int CHGetParameter(pChoco self, char *parname, char *pParValue,
int iBuflen)
{
int iRet, iCode;
assert(self);
iRet = self->pDriv->GetPar(self->pDriv, parname, pParValue,
iBuflen);
if(!iRet)
{
iRet = 0;
self->pDriv->GetError(self->pDriv,&iCode,pParValue, iBuflen);
}
return iRet;
}
/*------------------------------------------------------------------------*/
pCodri CHGetDriver(pChoco self)
{
assert(self);
return self->pDriv;
}
/*------------------------------------------------------------------------*/
int CHList(pChoco self, SConnection *pCon, char *name)
{
char *pPar, *pCopy = NULL;
char pValue[80];
char pMessage[256];
int iRet, iLen;
Tcl_DString tlist;
assert(self);
/* copy pParList as it will be destroyed by strtok */
iLen = strlen(self->pDriv->pParList);
pCopy = (char *)malloc((iLen+10)*sizeof(char));
if(!pCopy)
{
SCWrite(pCon,"ERROR: out of memory in CHList",eError);
return 0;
}
memset(pCopy,0,iLen+10);
strcpy(pCopy,self->pDriv->pParList);
Tcl_DStringInit(&tlist);
pPar = strtok(pCopy,",");
while(pPar != NULL)
{
iRet = CHGetParameter(self,pPar,pValue,79);
if(iRet)
{
sprintf(pMessage,"%s.%s = %s \n",name,pPar,pValue);
}
else
{
sprintf(pMessage,"ERROR: %s : while reading parameter %s \n",
pValue,pPar);
}
Tcl_DStringAppend(&tlist, pMessage,-1);
pPar = strtok(NULL,",");
}
SCWrite(pCon,Tcl_DStringValue(&tlist),eValue);
Tcl_DStringFree(&tlist);
free(pCopy);
return 1;
}
/*-----------------------------------------------------------------------*/
int ChocoAction(SConnection *pCon, SicsInterp *pSics, void *pData,
int argc, char *argv[])
{
pChoco self = NULL;
char pValue[80], pMessage[256];
int iRet;
self = (pChoco)pData;
assert(self);
if(argc < 2)
{
sprintf(pMessage, "ERROR: Ragument required for %s",argv[0]);
SCWrite(pCon,pMessage,eError);
return 0;
}
/* argument can either be list or parameter name */
strtolower(argv[1]);
if(strcmp(argv[1],"list") == 0)
{
return CHList(self,pCon,argv[0]);
}
else
{
if(argc > 2)
{
/* set case */
iRet = self->pDriv->SetPar2(self->pDriv,argv[1],argv[2]);
if(!iRet)
{
self->pDriv->GetError(self->pDriv,&iRet,pValue,79);
sprintf(pMessage,"ERROR: %s",pValue);
SCWrite(pCon,pMessage,eError);
return 0;
}
else
{
SCSendOK(pCon);
return 1;
}
}
else
{
/* get case */
iRet = CHGetParameter(self,argv[1],pValue,79);
if(iRet)
{
sprintf(pMessage,"%s.%s = %s",argv[0],argv[1],pValue);
}
else
{
sprintf(pMessage,"ERROR: %s : while reading parameter %s",
pValue,argv[1]);
}
SCWrite(pCon,pMessage,eValue);
return iRet;
}
}
return 0;
}
/*----------------------------------------------------------------------*/
static void KillChoco(void *pData)
{
pChoco self = NULL;
self = (pChoco)pData;
if(!self)
return;
if(self->pDriv)
{
self->pDriv->Close(self->pDriv);
self->pDriv->Delete(self->pDriv);
if(self->pDriv->pParList)
free(self->pDriv->pParList);
free(self->pDriv);
}
if(self->pDes)
DeleteDescriptor(self->pDes);
free(self);
}
/*-----------------------------------------------------------------------
DRIVERS
*/
extern pCodri MakeSimChopper(void);
/*-----------------------------------------------------------------------*/
int ChocoFactory(SConnection *pCon, SicsInterp *pSics, void *pData,
int argc, char *argv[])
{
pChoco pNew = NULL;
pCodri pDriv = NULL;
pObjectDescriptor pDes = NULL;
char pBueffel[132];
int iRet, iPort, iChannel;
int iSingle = 0;
pSite site = NULL;
if(argc < 3)
{
SCWrite(pCon,
"ERROR: Insufficient number of arguments to MakeController",
eError);
return 0;
}
/* first try to get everything done */
pNew = (pChoco)malloc(sizeof(Choco));
pDes = CreateDescriptor("Chopper");
/* do driver */
strtolower(argv[2]);
if(strcmp(argv[2],"sim") == 0)
{
pDriv = MakeSimChopper();
}
else
{
site = getSite();
if(site != NULL){
pDriv = site->CreateControllerDriver(pCon,argc-2,&argv[2]);
} else {
pDriv = NULL;
}
if(pDriv == NULL){
sprintf(pBueffel,"ERROR: Driver %s NOT supported for MakeController",
argv[2]);
SCWrite(pCon,pBueffel,eError);
return 0;
}
}
if( (pNew == NULL) || (pDes == NULL) || (pDriv == NULL) )
{
SCWrite(pCon,"ERROR: No memory left to create controller",eError);
return 0;
}
pNew->pDes = pDes;
pNew->pDriv = pDriv;
/* initialize driver */
iRet = pDriv->Init(pDriv);
if(!iRet)
{
SCWrite(pCon,"ERROR: Failed to initialize driver",eError);
KillChoco(pNew);
return 0;
}
/* install as command */
iRet = AddCommand(pSics, argv[1],ChocoAction,KillChoco,pNew);
if(!iRet)
{
sprintf(pBueffel,"ERROR: duplicate command %s NOT created",
argv[1]);
SCWrite(pCon,pBueffel,eError);
return 0;
}
return 1;
}