diff --git a/SCinter.c b/SCinter.c index e494c6d0..29daf5e9 100644 --- a/SCinter.c +++ b/SCinter.c @@ -77,6 +77,7 @@ SICSLogWrite("Error allocating memory for Interpreter",eInternal); return NULL; } + memset(pInter,0,sizeof(SicsInterp)); pInter->pCList = NULL; pInter->AList.pFirst = NULL; /* M.Z. */ pInter->pTcl = (void *)MacroInit(pInter); diff --git a/conman.c b/conman.c index afb22b83..8f8e3c4a 100644 --- a/conman.c +++ b/conman.c @@ -35,6 +35,10 @@ Introduced SCPrintf to avoid many of these pBueffel. Markus Zolliker, Sept 2004. + Cleaned up conman data structure. Removed left over and unused + fields. + Mark Koennecke, December 2004 + Copyright: see copyright.h -----------------------------------------------------------------------------*/ #include "fortify.h" @@ -167,7 +171,6 @@ extern pServer pServ; pRes->inUse = 0; pRes->iMacro = 0; pRes->iTelnet = 0; - pRes->pSics = pSics; pRes->eInterrupt = eContinue; pRes->lMagic = CONMAGIC; pRes->iLogin = 0; @@ -179,7 +182,7 @@ extern pServer pServ; } /* install command */ - AddCommand(pRes->pSics, ConName(pRes->ident), ConSicsAction, NULL,pRes); + AddCommand(pSics, ConName(pRes->ident), ConSicsAction, NULL,pRes); return pRes; } @@ -411,7 +414,7 @@ extern pServer pServ; fclose(pVictim->pFiles[i]); } - RemoveCommand(pVictim->pSics,ConName(pVictim->ident)); + RemoveCommand(pServ->pSics,ConName(pVictim->ident)); if(pVictim->pDes) { @@ -428,14 +431,6 @@ extern pServer pServ; } LLDdelete(pVictim->iList); - /* remove standing data connections */ - if(pVictim->pDataSock) - { - NETClosePort(pVictim->pDataSock); - free(pVictim->pDataSock); - free(pVictim->pDataComp); - } - /* remove command stack */ if(pVictim->pStack) { @@ -549,7 +544,9 @@ extern pServer pServ; l = vsnprintf(buf, sizeof buf, fmt, ap); va_end(ap); if (l >= sizeof buf) { - /* we have probably a C99 conforming snprintf and need a larger buffer */ + /* we have probably a C99 conforming snprintf and + need a larger buffer + */ dyn = malloc(l+1); if (dyn != NULL) { va_start(ap, fmt); @@ -662,7 +659,7 @@ static void writeToLogFiles(SConnection *self, char *buffer) /* put it into the interpreter if present */ if(SCinMacro(self)) { - InterpWrite(self->pSics,buffer); + InterpWrite(pServ->pSics,buffer); /* print it to client if error message */ if((iOut== eError) || (iOut == eWarning) ) { @@ -742,7 +739,7 @@ static void writeToLogFiles(SConnection *self, char *buffer) /* put it into the interpreter if present */ if(SCinMacro(self)) { - InterpWrite(self->pSics,buffer); + InterpWrite(pServ->pSics,buffer); /* print it to client if error message */ if((iOut== eError) || (iOut == eWarning) ) { @@ -793,7 +790,7 @@ static void writeToLogFiles(SConnection *self, char *buffer) /* put it into the interpreter if present */ if(SCinMacro(self)) { - InterpWrite(self->pSics,buffer); + InterpWrite(pServ->pSics,buffer); } else /* not in interpreter, normal logic */ { @@ -861,7 +858,7 @@ static void writeToLogFiles(SConnection *self, char *buffer) /* put it into the interpreter if present */ if(SCinMacro(self)) { - InterpWrite(self->pSics,buffer); + InterpWrite(pServ->pSics,buffer); } else /* not in interpreter, normal logic */ { @@ -1641,7 +1638,7 @@ static void writeToLogFiles(SConnection *self, char *buffer) if(self->pAction) { - InterpExecute(self->pSics,self->pCon,self->pAction); + InterpExecute(pServ->pSics,self->pCon,self->pAction); } return 1; } @@ -1799,9 +1796,8 @@ static void writeToLogFiles(SConnection *self, char *buffer) } /* invoke command */ CostaLock(self->pStack); - SCInvoke(self,self->pSics,pPtr); + SCInvoke(self,pServ->pSics,pPtr); CostaUnlock(self->pStack); - /* SCWrite(self,"\b",eError); */ } else { @@ -1897,9 +1893,12 @@ int SCActive(SConnection *self) { return 1; } - if(GetExeOwner(pServ->pExecutor) == self) + if(pServ->pExecutor != NULL) { - return 1; + if(GetExeOwner(pServ->pExecutor) == self) + { + return 1; + } } return 0; } diff --git a/conman.h b/conman.h index 09b4a96f..3b4d76d0 100644 --- a/conman.h +++ b/conman.h @@ -12,6 +12,8 @@ Mark Koennecke, Aprl 2003 + Mark Koennecke, December 2004 + copyright: see copyright.h ----------------------------------------------------------------------------*/ #ifndef SICSCONNECT @@ -30,34 +32,32 @@ typedef int (*writeFunc)(struct __SConnection *pCon, typedef struct __SConnection { /* object basics */ pObjectDescriptor pDes; - /* char *pName; now generated on the fly from ident */ long lMagic; long ident; struct __SConnection *next; /* I/O control */ + /* our socket */ mkChannel *pSock; + + /* per connection log files */ FILE *pFiles[MAXLOGFILES]; - int iMacro; - int iTelnet; - int iOutput; int iFiles; - writeFunc write; - mkChannel *pDataSock; - char *pDataComp; - int iDataPort; + + int iMacro; /* suppress I/O in macro*/ + int iTelnet; /* telnet flag */ + int iOutput; + writeFunc write; /* function doing + writing */ /* execution context */ - int eInterrupt; + int eInterrupt; int iUserRights; - int inUse; - int iDummy; - int iGrab; - int iErrCode; + int inUse; + int iGrab; /* grab flag for token*/ int parameterChange; int sicsError; - SicsInterp *pSics; - + /* a FIFO */ pCosta pStack; diff --git a/counter.c b/counter.c index cfaa37a9..b5feb33e 100644 --- a/counter.c +++ b/counter.c @@ -654,7 +654,7 @@ { self->pCountInt->TransferData(self,pCon); } - if( (iNum < 0) || (iNum > self->pDriv->iNoOfMonitors) ) + if( (iNum < 0) || (iNum >= self->pDriv->iNoOfMonitors) ) { return -1L; } diff --git a/devexec.c b/devexec.c index 9367bb55..a7500d6c 100644 --- a/devexec.c +++ b/devexec.c @@ -159,6 +159,7 @@ DeleteCallBackInterface(self->pCall); free(self); + pServ->pExecutor = NULL; } /*--------------------------------------------------------------------------*/ void ExeInterest(pExeList self, pDevEntry pDev, char *text) { diff --git a/doc/manager/iscan.htm b/doc/manager/iscan.htm index 1c085062..b80c10d4 100644 --- a/doc/manager/iscan.htm +++ b/doc/manager/iscan.htm @@ -3,7 +3,7 @@
Scans are preformed from a variety of commands in SICS. All these commands are just Tcl--wrappers around an internal scan object implemented in C. This @@ -13,6 +13,29 @@ command in the initialisation file. This command install the internal scan object under a user defined name. For the rest of this document it is assumed that this name is xxscan.
++Scanning in SICS evolved a little over time. It turned out that scans +are a demanding job for a programmer because of the plethora of +special scans people wish to perform and the many data file formats which +have to be supported. This requires a very high degree of +configurability. Under several refactorings the internal scan command +has grown to become: +
-
The last commands in the last section allowed to overload the +functions implementing various operations during the scan with user +defined methods. This section is the reference for these +functions. The following operations during a scan be configured: +
In some cases users wish to control the scan more closely, i.e. do multiple counting operations at the same point etc. This is especially @@ -133,6 +235,44 @@ command: In all this replace xxxscan with the name of the internal scan command.
++When aligning or when searching peaks a very fast scan is +required. This is the differential scan. It starts a motor and +collects counts while the motor is running. The counts collected are +the monitor normalized difference to the previous reading. This +functionality can be configured into SICS with the command: +
+MakeDiffScan +in the configuration file. An optional parameter defines +another name then diffscan (the default) for this object. Differential +scans can only be run against one motor as it cannot be guaranteed that +motors in a coordinated movement operate at the same speed. The +procedure to use diffscan is: +