From 006f10741cf792f068b88210e27c8e75d5a3b5ea Mon Sep 17 00:00:00 2001 From: cvs Date: Fri, 30 Jun 2000 14:16:52 +0000 Subject: [PATCH] - Fixed various bugs in evcontroller relating to bad access after initialization failure. - Fixed a bug in scan.c which causes scan to go in an endless loop when SICS failed to start a motor. - Fixed a bug in motor.c which caused bad softwarelimits after changes to the softzero. - Started changes in choco* in order incorporate normal parameters and an environment driver. --- chadapter.h | 8 ++++++++ choco.c | 44 +++++++++++++++++++++++++++++++++----------- choco.tex | 40 ++++++++++++++++++++++++++++++++++------ choco.w | 24 ++++++++++++++++++++---- danu.dat | 2 +- evcontroller.c | 11 +++-------- evdriver.i | 11 +++++++++++ hkl.c | 4 ++-- motor.c | 9 ++++++--- scan.c | 3 ++- sicsstatus.tcl | 48 ++++++++++++++++++++++++------------------------ test.tcl | 9 +++++---- 12 files changed, 149 insertions(+), 64 deletions(-) diff --git a/chadapter.h b/chadapter.h index 13379a2f..abaaa445 100644 --- a/chadapter.h +++ b/chadapter.h @@ -20,6 +20,8 @@ int CHAdapterAction(SConnection *pCon, SicsInterp *pSics, void *pData, int argc, char *argv[]); + + pEVDriver MakeControllerEnvironmentDriver(int argc, char *argv[]); #ifdef CHADAINTERNAL @@ -34,5 +36,11 @@ char *pParName; }CHAdapter; + + typedef struct __CHEV { + char *pParName; + pCodri pDriv; + }CHev, *pCHev; + #endif #endif diff --git a/choco.c b/choco.c index b911818f..e2064edb 100644 --- a/choco.c +++ b/choco.c @@ -111,18 +111,39 @@ } else { - iRet = CHGetParameter(self,argv[1],pValue,79); - if(iRet) + if(argc > 2) { - sprintf(pMessage,"%s.%s = %s",argv[0],argv[1],pValue); + /* 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 { - sprintf(pMessage,"ERROR: %s : while reading parameter %s", + /* 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; + } + SCWrite(pCon,pMessage,eValue); + return iRet; + } } return 0; } @@ -166,7 +187,8 @@ extern pCodri MakeDoChoDriver(char *pHost, int iPort, int iChannel); if(argc < 3) { - SCWrite(pCon,"ERROR: Insufficient number of arguments to MakeChopper", + SCWrite(pCon, + "ERROR: Insufficient number of arguments to MakeController", eError); return 0; } @@ -210,14 +232,14 @@ extern pCodri MakeDoChoDriver(char *pHost, int iPort, int iChannel); } else { - sprintf(pBueffel,"ERROR: Driver %s NOT supported for MakeChopper", + 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 chopper",eError); + SCWrite(pCon,"ERROR: No memory left to create controller",eError); return 0; } pNew->pDes = pDes; @@ -236,7 +258,7 @@ extern pCodri MakeDoChoDriver(char *pHost, int iPort, int iChannel); iRet = AddCommand(pSics, argv[1],ChocoAction,KillChoco,pNew); if(!iRet) { - sprintf(pBueffel,"ERROR: duplicate SPS command %s NOT created", + sprintf(pBueffel,"ERROR: duplicate command %s NOT created", argv[1]); SCWrite(pCon,pBueffel,eError); return 0; diff --git a/choco.tex b/choco.tex index fe5016a4..9b543f6e 100644 --- a/choco.tex +++ b/choco.tex @@ -1,8 +1,9 @@ \subsection{Chopper Controller} -Yet another way to deal with a controller has beenn devised for +Yet another way to deal with a controller has been devised for SICS. This uses the concept of a general controller which can have parameters enquired and set. Furthermore it may have parameters which -may be driven like a motor through a special adapter. This scheme is +may be driven like a motor or environment controller through special +adapters . This scheme is used for the chopper controller for FOCUS. \begin{itemize} \item A driver for a particular controller which allows to set and get @@ -11,6 +12,7 @@ parameters. \item An adapter object which allows to drive special parameters in a general controller. Such adapter objects can be configured for each drivable parameter in a controller. +\item An adapter to an environment controller driver. \end{itemize} The test case for this way of doing things is a controller for running choppers. This is why it gets the name. @@ -85,7 +87,7 @@ fValue. The last is floating point which covers the frequent occurence of numeric values. \item[SetPar2] The same as SetPar but uses test string as input for parameter setting. -\item[GetPar] retrieves the parameter parname formatted as test. The +\item[GetPar] retrieves the parameter parname formatted as text. The value is put into the buffer pBuffer. iBufLen is the maximum number of bytes permissable for pBuffer. \item[CheckPar] When parameters are driven a means is needed to find @@ -180,7 +182,7 @@ $\langle$chocodata {\footnotesize ?}$\rangle\equiv$ It consists just of the standard SICS object descriptor and a pointer to the driver. -\subsubsection{The Drive Adapter} +\subsubsection{The Drive And Environment Adapters} Most of the work of the drive adaptor is hidden in the functions implementing the drivable interface. Thus the interface to the DriveAdapter is fairly simple: @@ -199,6 +201,8 @@ $\langle$adapter {\footnotesize ?}$\rangle\equiv$ \mbox{}\verb@ int CHAdapterAction(SConnection *pCon, SicsInterp *pSics, @\\ \mbox{}\verb@ void *pData,@\\ \mbox{}\verb@ int argc, char *argv[]);@\\ +\mbox{}\verb@@\\ +\mbox{}\verb@ pEVDriver MakeControllerEnvironmentDriver(int argc, char *argv[]);@\\ \mbox{}\verb@ @\\ \mbox{}\verb@@$\diamond$ \end{list} @@ -215,6 +219,8 @@ creating a drive adapter. \item[CHAdapterAction] is the SICS interpreter function for representing the object in SICS. Just a single action is supported: request the value of the parameter. +\item[MakeControllerEnvironmentDriver] creates an environment control +driver for a parameter in a general controller object. \end{description} The data structure for the drive adapter is slightly more interesting: @@ -253,8 +259,29 @@ $\langle$adadata {\footnotesize ?}$\rangle\equiv$ this adapter. \end{description} +This is the data structure for the private part of the environment +controller driver: \begin{flushleft} \small \begin{minipage}{\linewidth} \label{scrap6} +$\langle$evada {\footnotesize ?}$\rangle\equiv$ +\vspace{-1ex} +\begin{list}{}{} \item +\mbox{}\verb@@\\ +\mbox{}\verb@ typedef struct __CHEV {@\\ +\mbox{}\verb@ char *pParName;@\\ +\mbox{}\verb@ pCodri pDriv;@\\ +\mbox{}\verb@ }CHev, *pCHev;@\\ +\mbox{}\verb@@$\diamond$ +\end{list} +\vspace{-1ex} +\footnotesize\addtolength{\baselineskip}{-1ex} +\begin{list}{}{\setlength{\itemsep}{-\parsep}\setlength{\itemindent}{-\leftmargin}} +\item Macro referenced in scrap ?. +\end{list} +\end{minipage}\\[4ex] +\end{flushleft} +\begin{flushleft} \small +\begin{minipage}{\linewidth} \label{scrap7} \verb@"codri.h"@ {\footnotesize ? }$\equiv$ \vspace{-1ex} \begin{list}{}{} \item @@ -281,7 +308,7 @@ this adapter. \end{minipage}\\[4ex] \end{flushleft} \begin{flushleft} \small -\begin{minipage}{\linewidth} \label{scrap7} +\begin{minipage}{\linewidth} \label{scrap8} \verb@"choco.h"@ {\footnotesize ? }$\equiv$ \vspace{-1ex} \begin{list}{}{} \item @@ -308,7 +335,7 @@ this adapter. \end{minipage}\\[4ex] \end{flushleft} \begin{flushleft} \small -\begin{minipage}{\linewidth} \label{scrap8} +\begin{minipage}{\linewidth} \label{scrap9} \verb@"chadapter.h"@ {\footnotesize ? }$\equiv$ \vspace{-1ex} \begin{list}{}{} \item @@ -327,6 +354,7 @@ this adapter. \mbox{}\verb@@$\langle$adapter {\footnotesize ?}$\rangle$\verb@@\\ \mbox{}\verb@#ifdef CHADAINTERNAL@\\ \mbox{}\verb@@$\langle$adadata {\footnotesize ?}$\rangle$\verb@@\\ +\mbox{}\verb@@$\langle$evada {\footnotesize ?}$\rangle$\verb@@\\ \mbox{}\verb@#endif@\\ \mbox{}\verb@#endif@\\ \mbox{}\verb@@$\diamond$ diff --git a/choco.w b/choco.w index 7ea5627e..d61ffaea 100644 --- a/choco.w +++ b/choco.w @@ -1,8 +1,9 @@ \subsection{Chopper Controller} -Yet another way to deal with a controller has beenn devised for +Yet another way to deal with a controller has been devised for SICS. This uses the concept of a general controller which can have parameters enquired and set. Furthermore it may have parameters which -may be driven like a motor through a special adapter. This scheme is +may be driven like a motor or environment controller through special +adapters . This scheme is used for the chopper controller for FOCUS. \begin{itemize} \item A driver for a particular controller which allows to set and get @@ -11,6 +12,7 @@ parameters. \item An adapter object which allows to drive special parameters in a general controller. Such adapter objects can be configured for each drivable parameter in a controller. +\item An adapter to an environment controller driver. \end{itemize} The test case for this way of doing things is a controller for running choppers. This is why it gets the name. @@ -72,7 +74,7 @@ fValue. The last is floating point which covers the frequent occurence of numeric values. \item[SetPar2] The same as SetPar but uses test string as input for parameter setting. -\item[GetPar] retrieves the parameter parname formatted as test. The +\item[GetPar] retrieves the parameter parname formatted as text. The value is put into the buffer pBuffer. iBufLen is the maximum number of bytes permissable for pBuffer. \item[CheckPar] When parameters are driven a means is needed to find @@ -141,7 +143,7 @@ the internal data structure for a controller object is very simple: It consists just of the standard SICS object descriptor and a pointer to the driver. -\subsubsection{The Drive Adapter} +\subsubsection{The Drive And Environment Adapters} Most of the work of the drive adaptor is hidden in the functions implementing the drivable interface. Thus the interface to the DriveAdapter is fairly simple: @@ -155,6 +157,8 @@ DriveAdapter is fairly simple: int CHAdapterAction(SConnection *pCon, SicsInterp *pSics, void *pData, int argc, char *argv[]); + + pEVDriver MakeControllerEnvironmentDriver(int argc, char *argv[]); @} \begin{description} @@ -163,6 +167,8 @@ creating a drive adapter. \item[CHAdapterAction] is the SICS interpreter function for representing the object in SICS. Just a single action is supported: request the value of the parameter. +\item[MakeControllerEnvironmentDriver] creates an environment control +driver for a parameter in a general controller object. \end{description} The data structure for the drive adapter is slightly more interesting: @@ -188,6 +194,15 @@ The data structure for the drive adapter is slightly more interesting: this adapter. \end{description} +This is the data structure for the private part of the environment +controller driver: +@d evada @{ + typedef struct __CHEV { + char *pParName; + pCodri pDriv; + }CHev, *pCHev; +@} + @o codri.h @{ /*------------------------------------------------------------------------- C o n t r o l l e r D r i v e r @@ -242,6 +257,7 @@ this adapter. @ #ifdef CHADAINTERNAL @ +@ #endif #endif @} diff --git a/danu.dat b/danu.dat index 19a73d75..b399ab11 100644 --- a/danu.dat +++ b/danu.dat @@ -1,3 +1,3 @@ - 5451 + 5798 NEVER, EVER modify or delete this file You'll risk eternal damnation and a reincarnation as a cockroach!|n \ No newline at end of file diff --git a/evcontroller.c b/evcontroller.c index 07d4d2d1..a509bc7e 100644 --- a/evcontroller.c +++ b/evcontroller.c @@ -657,8 +657,8 @@ ObParInit(pRes->pParam, ACCESS, "access", usUser, usMugger); ObParInit(pRes->pParam, ERRORHANDLER, "errorhandler", 0.0, usUser); ObParInit(pRes->pParam, INTERRUPT, "interrupt", eContinue, usUser); - ObParInit(pRes->pParam, UPLIMIT, "upperlimit", 2.0, usUser); - ObParInit(pRes->pParam, LOWLIMIT, "lowerlimit", -120., usUser); + ObParInit(pRes->pParam, UPLIMIT, "upperlimit", 300.0, usUser); + ObParInit(pRes->pParam, LOWLIMIT, "lowerlimit", 2., usUser); ObParInit(pRes->pParam, SAFEVALUE, "safevalue", 0., usUser); /* local initialisations */ @@ -1127,9 +1127,8 @@ pNew = CreateEVController(pDriv,argv[2],&iRet); if(!pNew) { - TecsError(pDriv, &iRet, pError, sizeof(pError)-1); + SCWrite(pCon,"ERROR: failed to initialize Tecs",eError); SCWrite(pCon,"ERROR creating Environment Controller",eError); - DeleteEVDriver(pDriv); return 0; } if(!iRet) @@ -1171,7 +1170,6 @@ if(!pNew) { SCWrite(pCon,"ERROR creating Environment Controller",eError); - DeleteEVDriver(pDriv); return 0; } if(!iRet) @@ -1213,7 +1211,6 @@ if(!pNew) { SCWrite(pCon,"ERROR creating Environment Controller",eError); - DeleteEVDriver(pDriv); return 0; } if(!iRet) @@ -1256,7 +1253,6 @@ if(!pNew) { SCWrite(pCon,"ERROR creating Environment Controller",eError); - DeleteEVDriver(pDriv); return 0; } if(!iRet) @@ -1378,7 +1374,6 @@ if(!pNew) { SCWrite(pCon,"ERROR creating Environment Controller",eError); - DeleteEVDriver(pDriv); return 0; } if(!iRet) diff --git a/evdriver.i b/evdriver.i index d6c5bb36..ea329c84 100644 --- a/evdriver.i +++ b/evdriver.i @@ -33,3 +33,14 @@ /*-------------------- life & death of a driver --------------------------*/ pEVDriver CreateEVDriver(int argc, char *argv[]); void DeleteEVDriver(pEVDriver pDriv); + + + + + + + + + + + diff --git a/hkl.c b/hkl.c index e804d325..2e8dec89 100644 --- a/hkl.c +++ b/hkl.c @@ -1102,7 +1102,7 @@ ente: return 0; break; case DEVDONE: - sprintf(pBueffel,"Driving to %3.1f %3.1f %3.1f done", + sprintf(pBueffel,"Driving to %8.4f %8.4f %8.4f done", fHKL[0], fHKL[1], fHKL[2]); SCWrite(pCon,pBueffel,eStatus); break; @@ -1312,7 +1312,7 @@ ente: /*----------- current */ else if(strcmp(argv[1],"current") == 0) { - sprintf(pBueffel,"Last HKL: %f %f %f ", + sprintf(pBueffel,"Last HKL: %8.4f %8.4f %8.4f ", self->fLastHKL[0], self->fLastHKL[1],self->fLastHKL[2]); SCWrite(pCon,pBueffel,eValue); return 1; diff --git a/motor.c b/motor.c index 3ea0a6f1..34dca100 100644 --- a/motor.c +++ b/motor.c @@ -517,7 +517,7 @@ extern void KillPiPiezo(void *pData); ObPar *pPar = NULL; char pBueffel[512]; int iRet; - float fLimit; + float fLimit, fOld, fChange; assert(self); assert(pCon); @@ -525,18 +525,21 @@ extern void KillPiPiezo(void *pData); if(strcmp(name,"softzero") == 0) { /* set it first, this also tests the necessary privileges */ + fOld = ObVal(self->ParArray,SZERO); iRet = ObParSet(self->ParArray,self->name,name,fVal,pCon); if(!iRet) { return iRet; } + /* shift the limits by the difference between old and new */ + fChange = fVal - fOld; /* upper limit */ fLimit = ObVal(self->ParArray,SUPP); - fLimit -= fVal; + fLimit -= fChange; ObParSet(self->ParArray,self->name,"softupperlim",fLimit,pCon); /* lower limit */ fLimit = ObVal(self->ParArray,SLOW); - fLimit -= fVal; + fLimit -= fChange; ObParSet(self->ParArray,self->name,"softlowerlim",fLimit,pCon); return 1; diff --git a/scan.c b/scan.c index 073cea54..28ceb624 100644 --- a/scan.c +++ b/scan.c @@ -859,6 +859,7 @@ extern void SNXFormatTime(char *pBuffer, int iLen); sprintf(pBueffel,"ERROR: Failed to start %s",pVar->Name); SCWrite(self->pCon,pBueffel,eError); status = 0; + break; } } } @@ -1019,7 +1020,7 @@ extern void SNXFormatTime(char *pBuffer, int iLen); } /* wait for finish */ lTask = GetDevexecID(pServ->pExecutor); - if(lTask > 0); + if(lTask > 0) { TaskWait(pServ->pTasker,lTask); } diff --git a/sicsstatus.tcl b/sicsstatus.tcl index 68a62c06..2a13e85b 100644 --- a/sicsstatus.tcl +++ b/sicsstatus.tcl @@ -6,7 +6,7 @@ flightpath setAccess 1 delay 2500.000000 delay setAccess 1 hm CountMode timer -hm preset 2.000000 +hm preset 100.000000 hm genbin 120.000000 35.000000 512 hm init datafile focus-1001848.hdf @@ -22,8 +22,8 @@ th sign 1.000000 th InterruptMode 0.000000 th AccessCode 2.000000 #Crystallographic Settings -hkl lambda 1.178100 -hkl setub -0.154751 -0.003824 -0.019538 0.049741 -0.005912 -0.061157 0.003550 -0.083854 0.005203 +hkl lambda 0.703790 +hkl setub -0.124702 0.001618 -0.041357 -0.104448 -0.001326 0.049388 0.000751 0.084094 0.001574 det1dist 300. det1dist setAccess 1 det1zeroy 128. @@ -60,8 +60,8 @@ ch InterruptMode 0.000000 ch AccessCode 2.000000 # Motor ph ph SoftZero 0.000000 -ph SoftLowerLim -200.000000 -ph SoftUpperLim 100.000000 +ph SoftLowerLim 0.000000 +ph SoftUpperLim 360.000000 ph Fixed -1.000000 ph sign 1.000000 ph InterruptMode 0.000000 @@ -84,8 +84,8 @@ muca InterruptMode 0.000000 muca AccessCode 2.000000 # Motor phi phi SoftZero 0.000000 -phi SoftLowerLim -200.000000 -phi SoftUpperLim 100.000000 +phi SoftLowerLim 0.000000 +phi SoftUpperLim 360.000000 phi Fixed -1.000000 phi sign 1.000000 phi InterruptMode 0.000000 @@ -114,13 +114,13 @@ twotheta Fixed -1.000000 twotheta sign 1.000000 twotheta InterruptMode 0.000000 twotheta AccessCode 2.000000 -lastscancommand sscan ch 180 190 10 2 +lastscancommand UNKNOWN lastscancommand setAccess 2 banana CountMode timer -banana preset 180.000000 +banana preset 100.000000 sample_mur 0.000000 sample_mur setAccess 2 -email Uwe.Nurps@nurps.nurpstown.de +email UNKNOWN email setAccess 2 fax UNKNOWN fax setAccess 2 @@ -129,7 +129,7 @@ phone setAccess 2 adress UNKNOWN adress setAccess 2 # Counter counter -counter SetPreset 1.000000 +counter SetPreset 1000.000000 counter SetMode Timer # Motor som som SoftZero 0.000000 @@ -276,9 +276,9 @@ monox sign 1.000000 monox InterruptMode 0.000000 monox AccessCode 2.000000 # Motor tasse -tasse SoftZero 10.000000 -tasse SoftLowerLim -140.000000 -tasse SoftUpperLim 120.000000 +tasse SoftZero 0.000000 +tasse SoftLowerLim -130.000000 +tasse SoftUpperLim 130.000000 tasse Fixed -1.000000 tasse sign 1.000000 tasse InterruptMode 0.000000 @@ -316,9 +316,9 @@ mgu sign 1.000000 mgu InterruptMode 0.000000 mgu AccessCode 2.000000 # Motor stu -stu SoftZero 0.000000 -stu SoftLowerLim -30.000000 -stu SoftUpperLim 30.000000 +stu SoftZero -10.000000 +stu SoftLowerLim -20.000000 +stu SoftUpperLim 40.000000 stu Fixed -1.000000 stu sign 1.000000 stu InterruptMode 0.000000 @@ -364,9 +364,9 @@ a5 sign 1.000000 a5 InterruptMode 0.000000 a5 AccessCode 2.000000 # Motor a4 -a4 SoftZero 10.000000 -a4 SoftLowerLim -140.000000 -a4 SoftUpperLim 120.000000 +a4 SoftZero 0.000000 +a4 SoftLowerLim -130.000000 +a4 SoftUpperLim 130.000000 a4 Fixed -1.000000 a4 sign 1.000000 a4 InterruptMode 0.000000 @@ -395,11 +395,11 @@ a1 Fixed -1.000000 a1 sign 1.000000 a1 InterruptMode 0.000000 a1 AccessCode 2.000000 -user Joseph Stalin +user Daniel_the_Clementine user setAccess 2 -sample EB:12mm +sample shit at 10.000000 sample setAccess 2 -title Nasse Fische in Dosen +title TopsiTupsiTapsi title setAccess 2 -starttime 2000-04-14 14:34:41 +starttime 2000-06-29 15:01:07 starttime setAccess 2 diff --git a/test.tcl b/test.tcl index c741f9ef..d6f49304 100644 --- a/test.tcl +++ b/test.tcl @@ -16,7 +16,7 @@ set shome /data/koenneck/src # first all the server options are set -ServerOption RedirectFile $shome/sics/stdout +#ServerOption RedirectFile $shome/sics/stdout ServerOption ReadTimeOut 100 # timeout when checking for commands. In the main loop SICS checks for @@ -40,7 +40,7 @@ ServerOption LogFileBaseName $shome/sics/tmp/server # the path and base name of the internal server logfile to which all # activity will be logged. -ServerOption TecsStartCmd "tecs/TecsServer -h lnsp26:4000/0" +ServerOption TecsStartCmd "tecs/bin/TecsServer -h lnsp26:4000/0" # -h host:port/channel is for serial server ServerOption TecsBinDir tecs/bin/ ServerOption TecsLogDir /data/koenneck/tmp/ @@ -380,7 +380,7 @@ MakeXYTable ixi source cotop.tcl Publish co User -source helium.tcl +#source helium.tcl MakeTRICSNEXUS sicsdatanumber $shome/sics/tmp trics.dic @@ -392,4 +392,5 @@ MakeXYTable omth Publish info user MakeLin2Ang a5l a5 -source tmp/beam.tcl +#source tmp/beam.tcl +source tcl/wwwpar.tcl