From 0fb0458341882d64fc3d4e206fc40fca2eb5918d Mon Sep 17 00:00:00 2001 From: cvs Date: Fri, 9 Jan 2004 14:45:36 +0000 Subject: [PATCH] - Fixes to NXscript - Added Pause and Continue commands - Fixed simulation counter to deal properly with pause - Fixed nxdict HDF5 problem SKIPPED: psi/makefile_alpha psi/nextrics.c psi/nxsans.c --- devexec.c | 50 ++++++++++++++++++++-- devexec.h | 13 +++++- devexec.tex | 11 +++++ devexec.w | 11 +++++ doc/user/userrefman | 4 +- napi5.c | 3 ++ nxdict.c | 100 +++++++++++++++++++++++++++++--------------- nxdict.h | 1 + nxscript.c | 45 ++++++++++++++++---- ofac.c | 2 + selector.c | 3 +- simcter.c | 9 ++-- 12 files changed, 198 insertions(+), 54 deletions(-) diff --git a/devexec.c b/devexec.c index 60848781..4f03796e 100644 --- a/devexec.c +++ b/devexec.c @@ -648,7 +648,7 @@ assert(self); /* step through the list */ - iRes = 0; + iRes = 1; iRet = LLDnodePtr2First(self->iList); while(iRet != 0) { @@ -706,7 +706,7 @@ assert(self); /* step through the list */ - iRes = 0; + iRes = 1; iRet = LLDnodePtr2First(self->iList); while(iRet != 0) { @@ -775,7 +775,7 @@ assert(pData); /* check Privilege: Muggers may do it */ - if(!SCMatchRights(pCon,usMugger)) + if(!SCMatchRights(pCon,usUser)) { SCWrite(pCon,"ERROR: NO Privilege to Stop operation ",eError); return 0; @@ -838,6 +838,50 @@ SetStatus(eEager); return iRet; } +/*-------------------------------------------------------------------------*/ + int PauseAction(SConnection *pCon, SicsInterp *pSics, void *pData, + int argc, char *argv[]) + { + int status; + + status = PauseExecution((pExeList)pData); + if(status) + { + SCSendOK(pCon); + return 1; + } + else + { + SCWrite(pCon,"ERROR: failed to pause",eError); + return 0; + } + } +/*-------------------------------------------------------------------------*/ + int ContinueAction(SConnection *pCon, SicsInterp *pSics, void *pData, + int argc, char *argv[]) + { + int status; + Status eStat; + + eStat = GetStatus(); + if(eStat != ePaused) + { + SCWrite(pCon,"ERROR: Not paused, ignored",eError); + return 0; + } + + status = ContinueExecution((pExeList)pData); + if(status) + { + SCSendOK(pCon); + return 1; + } + else + { + SCWrite(pCon,"ERROR: failed to pause",eError); + return 0; + } + } /*--------------------------------------------------------------------------*/ int isInRunMode(pExeList self) diff --git a/devexec.h b/devexec.h index b6ece632..9dae95a5 100644 --- a/devexec.h +++ b/devexec.h @@ -137,6 +137,17 @@ connection with non blocking operation such as motors started with run. */ + int PauseAction(SConnection *pCon, SicsInterp *pSics, void *pData, + int argc, char *argv[]); + /* + pauses execution + */ + int ContinueAction(SConnection *pCon, SicsInterp *pSics, void *pData, + int argc, char *argv[]); + /* + continues execution + */ + /*--------------------------- Locking ---------------------------------*/ #line 183 "devexec.w" @@ -145,7 +156,7 @@ void UnlockDeviceExecutor(pExeList self); -#line 281 "devexec.w" +#line 292 "devexec.w" /* -------------------------- Executor management -------------------------*/ diff --git a/devexec.tex b/devexec.tex index 3fdef4fb..9adef9fa 100644 --- a/devexec.tex +++ b/devexec.tex @@ -331,6 +331,17 @@ to the global SICS device executor. \mbox{}\verb@ connection with non blocking operation such as motors started@\\ \mbox{}\verb@ with run.@\\ \mbox{}\verb@ */@\\ +\mbox{}\verb@ int PauseAction(SConnection *pCon, SicsInterp *pSics, void *pData,@\\ +\mbox{}\verb@ int argc, char *argv[]);@\\ +\mbox{}\verb@ /*@\\ +\mbox{}\verb@ pauses execution@\\ +\mbox{}\verb@ */@\\ +\mbox{}\verb@ int ContinueAction(SConnection *pCon, SicsInterp *pSics, void *pData,@\\ +\mbox{}\verb@ int argc, char *argv[]);@\\ +\mbox{}\verb@ /*@\\ +\mbox{}\verb@ continues execution@\\ +\mbox{}\verb@ */ @\\ +\mbox{}\verb@ @\\ \mbox{}\verb@/*--------------------------- Locking ---------------------------------*/@\\ \mbox{}\verb@ @$\langle$devlock {\footnotesize ?}$\rangle$\verb@ @\\ \mbox{}\verb@/* -------------------------- Executor management -------------------------*/@\\ diff --git a/devexec.w b/devexec.w index 48320103..fb2a56cb 100644 --- a/devexec.w +++ b/devexec.w @@ -277,6 +277,17 @@ to the global SICS device executor. connection with non blocking operation such as motors started with run. */ + int PauseAction(SConnection *pCon, SicsInterp *pSics, void *pData, + int argc, char *argv[]); + /* + pauses execution + */ + int ContinueAction(SConnection *pCon, SicsInterp *pSics, void *pData, + int argc, char *argv[]); + /* + continues execution + */ + /*--------------------------- Locking ---------------------------------*/ @ /* -------------------------- Executor management -------------------------*/ diff --git a/doc/user/userrefman b/doc/user/userrefman index eadc9adc..8fd3fd5d 100644 --- a/doc/user/userrefman +++ b/doc/user/userrefman @@ -17,8 +17,8 @@ \begin{center} \begin{huge} SICS Master User Manual\\ -\end{huge} -\today\\ +\end{huge} +\today \\ Dr. Mark K\"onnecke \\ Labor f\"ur Neutronenstreuung\\ Paul Scherrer Institut\\ diff --git a/napi5.c b/napi5.c index f4b95298..0f83403a 100644 --- a/napi5.c +++ b/napi5.c @@ -1112,6 +1112,9 @@ NXstatus CALLING_STYLE NX5closegroup (NXhandle fid); strcat(sLink->iTag5,sLink->iRefd); } status = H5Glink(pFile->iFID, H5G_LINK_HARD, sLink->iRef5, sLink->iTag5); + if(status < 0){ + return NX_ERROR; + } return NX_OK; } diff --git a/nxdict.c b/nxdict.c index 6bf5b65c..f766a138 100644 --- a/nxdict.c +++ b/nxdict.c @@ -37,7 +37,6 @@ #include #include #include -#include #include "lld.h" #include "napi.h" #include "stringdict.h" @@ -546,6 +545,31 @@ #endif return pReplaced; } +/*------------------------------------------------------------------------*/ + NXstatus NXDdefget(NXdict handle, char *pKey, char *pBuffer, int iBufLen) + { + int status; + pDynString pRep = NULL; + + status = NXDget(handle,pKey,pBuffer,iBufLen); + if(status != NX_OK) + { + return status; + } + + pRep = NXDItextreplace(handle,pBuffer); + if(pRep) + { + strncpy(pBuffer,GetCharArray(pRep),iBufLen); + status = NX_OK; + DeleteDynString(pRep); + } + else + { + status = NX_ERROR; + } + return status; + } /*--------------------------------------------------------------------------*/ NXstatus NXDtextreplace(NXdict handle, char *pDefString, char *pBuffer, int iBufLen) @@ -869,7 +893,7 @@ int iRet, i; /* initialise dimensions to 0 */ - for(i = 0; i < MAX_VAR_DIMS; i++) + for(i = 0; i < NX_MAXRANK; i++) { iDim[i] = 0; } @@ -912,15 +936,24 @@ } /*------------------------------------------------------------------------*/ static TokDat tDatType[] = { - {"DFNT_FLOAT32",DFNT_FLOAT32}, - {"DFNT_FLOAT64",DFNT_FLOAT64}, - {"DFNT_INT8",DFNT_INT8}, - {"DFNT_UINT8",DFNT_UINT8}, - {"DFNT_INT16",DFNT_INT16}, - {"DFNT_UINT16",DFNT_UINT16}, - {"DFNT_INT32",DFNT_INT32}, - {"DFNT_UINT32",DFNT_UINT32}, - {"DFNT_CHAR",DFNT_CHAR}, + {"DFNT_FLOAT32",NX_FLOAT32}, + {"DFNT_FLOAT64",NX_FLOAT64}, + {"DFNT_INT8",NX_INT8}, + {"DFNT_UINT8",NX_UINT8}, + {"DFNT_INT16",NX_INT16}, + {"DFNT_UINT16",NX_UINT16}, + {"DFNT_INT32",NX_INT32}, + {"DFNT_UINT32",NX_UINT32}, + {"DFNT_CHAR",NX_CHAR}, + {"NX_FLOAT32",NX_FLOAT32}, + {"NX_FLOAT64",NX_FLOAT64}, + {"NX_INT8",NX_INT8}, + {"NX_UINT8",NX_UINT8}, + {"NX_INT16",NX_INT16}, + {"NX_UINT16",NX_UINT16}, + {"NX_INT32",NX_INT32}, + {"NX_UINT32",NX_UINT32}, + {"NX_CHAR",NX_CHAR}, {NULL,-122} }; @@ -959,14 +992,14 @@ /*-------------------------------------------------------------------------*/ static int NXDIParseSDS(NXhandle hfil, ParDat *pParse) { - int iType = DFNT_FLOAT32; + int iType = NX_FLOAT32; int iRank = 1; int iCompress = NX_COMP_NONE; - int32 iDim[MAX_VAR_DIMS], iChunk[MAX_VAR_DIMS]; + int iDim[NX_MAXRANK], iChunk[NX_MAXRANK]; int iList, iChunkDefined = 0 ; int iRet, iStat, i; char pError[256]; - char pName[MAX_NC_NAME]; + char pName[NX_MAXNAMELEN]; void (*ErrFunc)(void *pData, char *pErr); AttItem sAtt; @@ -1836,7 +1869,7 @@ return iRet; } iRet = NXputattr(hFil, "Units",pUnits, - strlen(pUnits) + 1,DFNT_INT8); + strlen(pUnits) + 1,NX_INT8); if(iRet != NX_OK) { /* a comment on this one has already been written! */ @@ -1848,7 +1881,7 @@ /*-----------------------------------------------------------------------*/ NXstatus NXUallocSDS(NXhandle hFil, void **pData) { - int iDIM[MAX_VAR_DIMS]; + int iDIM[NX_MAXRANK]; int iRank,iType; int iRet, i; long lLength; @@ -1868,31 +1901,30 @@ } switch(iType) { - case DFNT_FLOAT32: - lLength *= sizeof(float32); + case NX_FLOAT32: + lLength *= sizeof(float); break; - case DFNT_FLOAT64: - lLength *= sizeof(float64); + case NX_FLOAT64: + lLength *= sizeof(double); break; - case DFNT_INT8: - case DFNT_CHAR: - case DFNT_UCHAR8: - lLength *= sizeof(int8); + case NX_INT8: + case NX_CHAR: + lLength *= sizeof(char); break; - case DFNT_UINT8: - lLength *= sizeof(uint8); + case NX_UINT8: + lLength *= sizeof(unsigned char); break; - case DFNT_INT16: - lLength *= sizeof(int16); + case NX_INT16: + lLength *= sizeof(short); break; - case DFNT_UINT16: - lLength *= sizeof(uint16); + case NX_UINT16: + lLength *= sizeof(unsigned short); break; - case DFNT_INT32: - lLength *= sizeof(int32); + case NX_INT32: + lLength *= sizeof(int); break; - case DFNT_UINT32: - lLength *= sizeof(uint32); + case NX_UINT32: + lLength *= sizeof(int); break; default: NXIReportError(NXpData,"ERROR: Internal: number type not recoginized"); diff --git a/nxdict.h b/nxdict.h index 17dc1a0f..e0acaa3e 100644 --- a/nxdict.h +++ b/nxdict.h @@ -31,6 +31,7 @@ NXstatus NXDadd(NXdict handle, char *alias, char *DefString); NXstatus NXDget(NXdict handle, char *alias, char *pBuffer, int iBufLen); + NXstatus NXDdefget(NXdict handle, char *alias, char *pBuffer, int iBufLen); NXstatus NXDupdate(NXdict handle, char *alias, char *pNewVal); NXstatus NXDtextreplace(NXdict handle, char *pDefString, char *pBuffer, int iBuflen); diff --git a/nxscript.c b/nxscript.c index 9d366fec..2b13e12d 100644 --- a/nxscript.c +++ b/nxscript.c @@ -7,6 +7,7 @@ copyright: see file COPYRIGHT Mark Koennecke, February 2003 + Mark Koennecke, January 2004 ------------------------------------------------------------------------*/ #include #include @@ -125,6 +126,10 @@ static int handleFileOperations(SConnection *pCon, pNXScript self, close everything! and send a message to trigger file synchronisation to the central server */ + if(self->fileHandle == NULL){ + SCSendOK(pCon); + return 1; + } i = 511; iVal = NX_CHAR; NXgetattr(self->fileHandle,"file_name",buffer,&i,&iVal); @@ -139,8 +144,10 @@ static int handleFileOperations(SConnection *pCon, pNXScript self, access = NXACC_RDWR; } else if(strcmp(argv[1],"create4") == 0){ access = NXACC_CREATE4; + unlink(argv[2]); /* kill file for overwrite */ } else if(strcmp(argv[1],"create5") == 0){ access = NXACC_CREATE5; + unlink(argv[2]); /* kill file for overwrite */ } else { return 0; } @@ -163,7 +170,6 @@ static int handleFileOperations(SConnection *pCon, pNXScript self, /* now initialize ourselves */ - unlink(argv[2]); /* kill file for overwrite */ status = NXopen(argv[2],access,&self->fileHandle); if(status != NX_OK){ sprintf(buffer,"ERROR: failed to open %s",argv[2]); @@ -223,7 +229,7 @@ static void putMotor(SConnection *pCon, SicsInterp *pSics, pNXScript self, */ strcpy(buffer,argv[2]); strcat(buffer,"_null"); - if(NXDget(self->dictHandle,buffer,dummy,255)){ + if(NXDdefget(self->dictHandle,buffer,dummy,255)){ MotorGetPar(brumm,"softzero",&fVal); status = NXDputalias(self->fileHandle,self->dictHandle,buffer, &fVal); if(status != NX_OK){ @@ -295,7 +301,7 @@ static void putCounter(SConnection *pCon, SicsInterp *pSics, pNXScript self, fVal = GetCountTime(cter,pCon); strcpy(newAlias,argv[2]); strcat(newAlias,"_time"); - if(NXDget(self->dictHandle,newAlias,dummy,79)){ + if(NXDdefget(self->dictHandle,newAlias,dummy,79)){ status = NXDputalias(self->fileHandle,self->dictHandle,newAlias,&fVal); if(status != NX_OK){ sprintf(buffer,"ERROR: failed to write count time to %s", newAlias); @@ -309,7 +315,7 @@ static void putCounter(SConnection *pCon, SicsInterp *pSics, pNXScript self, */ for(i = 0; i < 10; i++){ sprintf(newAlias,"%s_%2.2d",argv[2],i); - if(NXDget(self->dictHandle,newAlias,dummy,79)){ + if(NXDdefget(self->dictHandle,newAlias,dummy,79)){ counts = GetMonitor(cter,i,pCon); icounts = (int)counts; status = NXDputalias(self->fileHandle,self->dictHandle,newAlias, @@ -583,7 +589,7 @@ static void putTimeBinning(SConnection *pCon, SicsInterp *pSics, /* build definition string */ - status = NXDget(self->dictHandle,argv[2],buffer,254); + status = NXDdefget(self->dictHandle,argv[2],buffer,254); if(!status){ sprintf(buffer,"ERROR: alias %s for time binning not found", argv[2]); @@ -661,7 +667,7 @@ static void putArray(SConnection *pCon, SicsInterp *pSics, } data[i] = (float)dVal; } else { - sprintf(buffer,"WARNING: failed to find array element %d", i); + snprintf(buffer,254,"WARNING: failed to find array element %d", i); SCWrite(pCon,buffer,eError); } } @@ -669,7 +675,7 @@ static void putArray(SConnection *pCon, SicsInterp *pSics, /* build definition string */ - status = NXDget(self->dictHandle,argv[2],buffer,254); + status = NXDdefget(self->dictHandle,argv[2],buffer,254); if(!status){ sprintf(buffer,"ERROR: alias %s for array not found", argv[2]); @@ -677,7 +683,7 @@ static void putArray(SConnection *pCon, SicsInterp *pSics, free(data); return; } - sprintf(defString,"%s -dim {%d} ",buffer,length); + snprintf(defString,511,"%s -dim {%d} ",buffer,length); /* write it! @@ -750,7 +756,7 @@ static int handlePut(SConnection *pCon, SicsInterp *pSics, pNXScript self, return 1; } Arg2Text(argc-3,&argv[3],buffer,1023); - status = NXDget(self->dictHandle,argv[2],defString,1023); + status = NXDdefget(self->dictHandle,argv[2],defString,1023); if(status != NX_OK){ sprintf(buffer,"ERROR: alias %s not found in puttext", argv[2]); @@ -822,7 +828,23 @@ static void makeLink(SConnection *pCon, SicsInterp *pSics, SCSendOK(pCon); } +/*----------------------------------------------------------------------*/ +static void updateDictVar(SConnection *pCon, pNXScript self, int argc, + char *argv[]){ + int status; + if(self->dictHandle == NULL){ + SCWrite(pCon,"ERROR: cannot update variable, dictionary not open", + eError); + return; + } + if(argc < 4){ + SCWrite(pCon,"ERROR: insufficient number of arguments to updateDictVar", + eError); + return; + } + NXDupdate(self->dictHandle,argv[2],argv[3]); +} /*-----------------------------------------------------------------------*/ int NXScriptAction(SConnection *pCon, SicsInterp *pSics, void *pData, int argc, char *argv[]){ @@ -865,6 +887,11 @@ int NXScriptAction(SConnection *pCon, SicsInterp *pSics, void *pData, return 1; } + if(strcmp(argv[1],"updatedictvar") == 0){ + updateDictVar(pCon,self,argc,argv); + return 1; + } + if(strstr(argv[1],"put") != NULL){ handlePut(pCon,pSics,self,argc,argv); return 1; diff --git a/ofac.c b/ofac.c index c84dbe7f..0e111abd 100644 --- a/ofac.c +++ b/ofac.c @@ -234,6 +234,8 @@ AddCommand(pInter,"StopExe",StopCommand,DeleteExeList, pExe); AddCommand(pInter,"ListExe",ListExe,NULL,pExe); AddCommand(pInter,"Success",Success,NULL,pExe); + AddCommand(pInter,"pause",PauseAction,NULL,pExe); + AddCommand(pInter,"continue",ContinueAction,NULL,pExe); /* add additional object creation commands here */ AddCommand(pInter,"TokenInit",TokenInit,NULL,NULL); diff --git a/selector.c b/selector.c index 9ef1b63f..ac817eda 100644 --- a/selector.c +++ b/selector.c @@ -474,7 +474,8 @@ end: sprintf(pBueffel,"%s.%s = %f",argv[0],pName,pPar->fVal); SCWrite(pCon,pBueffel,eValue); iRet = 1; - goto end; + DeleteTokenList(pList); + return 1; } } end: diff --git a/simcter.c b/simcter.c index e625fb42..1b501e67 100644 --- a/simcter.c +++ b/simcter.c @@ -84,6 +84,11 @@ static float FAILRATE; return HWIdle; } + if(pSim->iPause == 1) + { + return HWPause; + } + if(SimRandom() < FAILRATE) { return HWFault; @@ -118,10 +123,6 @@ static float FAILRATE; } else { - if(pSim->iPause == 1) - { - return HWPause; - } return HWIdle; } }