- 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
This commit is contained in:
cvs
2004-01-09 14:45:36 +00:00
parent fcfb569518
commit 0fb0458341
12 changed files with 198 additions and 54 deletions

View File

@ -648,7 +648,7 @@
assert(self); assert(self);
/* step through the list */ /* step through the list */
iRes = 0; iRes = 1;
iRet = LLDnodePtr2First(self->iList); iRet = LLDnodePtr2First(self->iList);
while(iRet != 0) while(iRet != 0)
{ {
@ -706,7 +706,7 @@
assert(self); assert(self);
/* step through the list */ /* step through the list */
iRes = 0; iRes = 1;
iRet = LLDnodePtr2First(self->iList); iRet = LLDnodePtr2First(self->iList);
while(iRet != 0) while(iRet != 0)
{ {
@ -775,7 +775,7 @@
assert(pData); assert(pData);
/* check Privilege: Muggers may do it */ /* check Privilege: Muggers may do it */
if(!SCMatchRights(pCon,usMugger)) if(!SCMatchRights(pCon,usUser))
{ {
SCWrite(pCon,"ERROR: NO Privilege to Stop operation ",eError); SCWrite(pCon,"ERROR: NO Privilege to Stop operation ",eError);
return 0; return 0;
@ -838,6 +838,50 @@
SetStatus(eEager); SetStatus(eEager);
return iRet; 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) int isInRunMode(pExeList self)

View File

@ -137,6 +137,17 @@
connection with non blocking operation such as motors started connection with non blocking operation such as motors started
with run. 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 ---------------------------------*/ /*--------------------------- Locking ---------------------------------*/
#line 183 "devexec.w" #line 183 "devexec.w"
@ -145,7 +156,7 @@
void UnlockDeviceExecutor(pExeList self); void UnlockDeviceExecutor(pExeList self);
#line 281 "devexec.w" #line 292 "devexec.w"
/* -------------------------- Executor management -------------------------*/ /* -------------------------- Executor management -------------------------*/

View File

@ -331,6 +331,17 @@ to the global SICS device executor.
\mbox{}\verb@ connection with non blocking operation such as motors started@\\ \mbox{}\verb@ connection with non blocking operation such as motors started@\\
\mbox{}\verb@ with run.@\\ \mbox{}\verb@ with run.@\\
\mbox{}\verb@ */@\\ \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@/*--------------------------- Locking ---------------------------------*/@\\
\mbox{}\verb@ @$\langle$devlock {\footnotesize ?}$\rangle$\verb@ @\\ \mbox{}\verb@ @$\langle$devlock {\footnotesize ?}$\rangle$\verb@ @\\
\mbox{}\verb@/* -------------------------- Executor management -------------------------*/@\\ \mbox{}\verb@/* -------------------------- Executor management -------------------------*/@\\

View File

@ -277,6 +277,17 @@ to the global SICS device executor.
connection with non blocking operation such as motors started connection with non blocking operation such as motors started
with run. 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 ---------------------------------*/ /*--------------------------- Locking ---------------------------------*/
@<devlock@> @<devlock@>
/* -------------------------- Executor management -------------------------*/ /* -------------------------- Executor management -------------------------*/

View File

@ -17,8 +17,8 @@
\begin{center} \begin{center}
\begin{huge} \begin{huge}
SICS Master User Manual\\ SICS Master User Manual\\
\end{huge} \end{huge}
\today\\ \today \\
Dr. Mark K\"onnecke \\ Dr. Mark K\"onnecke \\
Labor f\"ur Neutronenstreuung\\ Labor f\"ur Neutronenstreuung\\
Paul Scherrer Institut\\ Paul Scherrer Institut\\

View File

@ -1112,6 +1112,9 @@ NXstatus CALLING_STYLE NX5closegroup (NXhandle fid);
strcat(sLink->iTag5,sLink->iRefd); strcat(sLink->iTag5,sLink->iRefd);
} }
status = H5Glink(pFile->iFID, H5G_LINK_HARD, sLink->iRef5, sLink->iTag5); status = H5Glink(pFile->iFID, H5G_LINK_HARD, sLink->iRef5, sLink->iTag5);
if(status < 0){
return NX_ERROR;
}
return NX_OK; return NX_OK;
} }

100
nxdict.c
View File

@ -37,7 +37,6 @@
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <mfhdf.h>
#include "lld.h" #include "lld.h"
#include "napi.h" #include "napi.h"
#include "stringdict.h" #include "stringdict.h"
@ -546,6 +545,31 @@
#endif #endif
return pReplaced; 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, NXstatus NXDtextreplace(NXdict handle, char *pDefString,
char *pBuffer, int iBufLen) char *pBuffer, int iBufLen)
@ -869,7 +893,7 @@
int iRet, i; int iRet, i;
/* initialise dimensions to 0 */ /* initialise dimensions to 0 */
for(i = 0; i < MAX_VAR_DIMS; i++) for(i = 0; i < NX_MAXRANK; i++)
{ {
iDim[i] = 0; iDim[i] = 0;
} }
@ -912,15 +936,24 @@
} }
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
static TokDat tDatType[] = { static TokDat tDatType[] = {
{"DFNT_FLOAT32",DFNT_FLOAT32}, {"DFNT_FLOAT32",NX_FLOAT32},
{"DFNT_FLOAT64",DFNT_FLOAT64}, {"DFNT_FLOAT64",NX_FLOAT64},
{"DFNT_INT8",DFNT_INT8}, {"DFNT_INT8",NX_INT8},
{"DFNT_UINT8",DFNT_UINT8}, {"DFNT_UINT8",NX_UINT8},
{"DFNT_INT16",DFNT_INT16}, {"DFNT_INT16",NX_INT16},
{"DFNT_UINT16",DFNT_UINT16}, {"DFNT_UINT16",NX_UINT16},
{"DFNT_INT32",DFNT_INT32}, {"DFNT_INT32",NX_INT32},
{"DFNT_UINT32",DFNT_UINT32}, {"DFNT_UINT32",NX_UINT32},
{"DFNT_CHAR",DFNT_CHAR}, {"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} }; {NULL,-122} };
@ -959,14 +992,14 @@
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
static int NXDIParseSDS(NXhandle hfil, ParDat *pParse) static int NXDIParseSDS(NXhandle hfil, ParDat *pParse)
{ {
int iType = DFNT_FLOAT32; int iType = NX_FLOAT32;
int iRank = 1; int iRank = 1;
int iCompress = NX_COMP_NONE; 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 iList, iChunkDefined = 0 ;
int iRet, iStat, i; int iRet, iStat, i;
char pError[256]; char pError[256];
char pName[MAX_NC_NAME]; char pName[NX_MAXNAMELEN];
void (*ErrFunc)(void *pData, char *pErr); void (*ErrFunc)(void *pData, char *pErr);
AttItem sAtt; AttItem sAtt;
@ -1836,7 +1869,7 @@
return iRet; return iRet;
} }
iRet = NXputattr(hFil, "Units",pUnits, iRet = NXputattr(hFil, "Units",pUnits,
strlen(pUnits) + 1,DFNT_INT8); strlen(pUnits) + 1,NX_INT8);
if(iRet != NX_OK) if(iRet != NX_OK)
{ {
/* a comment on this one has already been written! */ /* a comment on this one has already been written! */
@ -1848,7 +1881,7 @@
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
NXstatus NXUallocSDS(NXhandle hFil, void **pData) NXstatus NXUallocSDS(NXhandle hFil, void **pData)
{ {
int iDIM[MAX_VAR_DIMS]; int iDIM[NX_MAXRANK];
int iRank,iType; int iRank,iType;
int iRet, i; int iRet, i;
long lLength; long lLength;
@ -1868,31 +1901,30 @@
} }
switch(iType) switch(iType)
{ {
case DFNT_FLOAT32: case NX_FLOAT32:
lLength *= sizeof(float32); lLength *= sizeof(float);
break; break;
case DFNT_FLOAT64: case NX_FLOAT64:
lLength *= sizeof(float64); lLength *= sizeof(double);
break; break;
case DFNT_INT8: case NX_INT8:
case DFNT_CHAR: case NX_CHAR:
case DFNT_UCHAR8: lLength *= sizeof(char);
lLength *= sizeof(int8);
break; break;
case DFNT_UINT8: case NX_UINT8:
lLength *= sizeof(uint8); lLength *= sizeof(unsigned char);
break; break;
case DFNT_INT16: case NX_INT16:
lLength *= sizeof(int16); lLength *= sizeof(short);
break; break;
case DFNT_UINT16: case NX_UINT16:
lLength *= sizeof(uint16); lLength *= sizeof(unsigned short);
break; break;
case DFNT_INT32: case NX_INT32:
lLength *= sizeof(int32); lLength *= sizeof(int);
break; break;
case DFNT_UINT32: case NX_UINT32:
lLength *= sizeof(uint32); lLength *= sizeof(int);
break; break;
default: default:
NXIReportError(NXpData,"ERROR: Internal: number type not recoginized"); NXIReportError(NXpData,"ERROR: Internal: number type not recoginized");

View File

@ -31,6 +31,7 @@
NXstatus NXDadd(NXdict handle, char *alias, char *DefString); NXstatus NXDadd(NXdict handle, char *alias, char *DefString);
NXstatus NXDget(NXdict handle, char *alias, char *pBuffer, int iBufLen); 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 NXDupdate(NXdict handle, char *alias, char *pNewVal);
NXstatus NXDtextreplace(NXdict handle, char *pDefString, char *pBuffer, NXstatus NXDtextreplace(NXdict handle, char *pDefString, char *pBuffer,
int iBuflen); int iBuflen);

View File

@ -7,6 +7,7 @@
copyright: see file COPYRIGHT copyright: see file COPYRIGHT
Mark Koennecke, February 2003 Mark Koennecke, February 2003
Mark Koennecke, January 2004
------------------------------------------------------------------------*/ ------------------------------------------------------------------------*/
#include <stdlib.h> #include <stdlib.h>
#include <assert.h> #include <assert.h>
@ -125,6 +126,10 @@ static int handleFileOperations(SConnection *pCon, pNXScript self,
close everything! and send a message to trigger file synchronisation close everything! and send a message to trigger file synchronisation
to the central server to the central server
*/ */
if(self->fileHandle == NULL){
SCSendOK(pCon);
return 1;
}
i = 511; i = 511;
iVal = NX_CHAR; iVal = NX_CHAR;
NXgetattr(self->fileHandle,"file_name",buffer,&i,&iVal); NXgetattr(self->fileHandle,"file_name",buffer,&i,&iVal);
@ -139,8 +144,10 @@ static int handleFileOperations(SConnection *pCon, pNXScript self,
access = NXACC_RDWR; access = NXACC_RDWR;
} else if(strcmp(argv[1],"create4") == 0){ } else if(strcmp(argv[1],"create4") == 0){
access = NXACC_CREATE4; access = NXACC_CREATE4;
unlink(argv[2]); /* kill file for overwrite */
} else if(strcmp(argv[1],"create5") == 0){ } else if(strcmp(argv[1],"create5") == 0){
access = NXACC_CREATE5; access = NXACC_CREATE5;
unlink(argv[2]); /* kill file for overwrite */
} else { } else {
return 0; return 0;
} }
@ -163,7 +170,6 @@ static int handleFileOperations(SConnection *pCon, pNXScript self,
/* /*
now initialize ourselves now initialize ourselves
*/ */
unlink(argv[2]); /* kill file for overwrite */
status = NXopen(argv[2],access,&self->fileHandle); status = NXopen(argv[2],access,&self->fileHandle);
if(status != NX_OK){ if(status != NX_OK){
sprintf(buffer,"ERROR: failed to open %s",argv[2]); 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]); strcpy(buffer,argv[2]);
strcat(buffer,"_null"); strcat(buffer,"_null");
if(NXDget(self->dictHandle,buffer,dummy,255)){ if(NXDdefget(self->dictHandle,buffer,dummy,255)){
MotorGetPar(brumm,"softzero",&fVal); MotorGetPar(brumm,"softzero",&fVal);
status = NXDputalias(self->fileHandle,self->dictHandle,buffer, &fVal); status = NXDputalias(self->fileHandle,self->dictHandle,buffer, &fVal);
if(status != NX_OK){ if(status != NX_OK){
@ -295,7 +301,7 @@ static void putCounter(SConnection *pCon, SicsInterp *pSics, pNXScript self,
fVal = GetCountTime(cter,pCon); fVal = GetCountTime(cter,pCon);
strcpy(newAlias,argv[2]); strcpy(newAlias,argv[2]);
strcat(newAlias,"_time"); 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); status = NXDputalias(self->fileHandle,self->dictHandle,newAlias,&fVal);
if(status != NX_OK){ if(status != NX_OK){
sprintf(buffer,"ERROR: failed to write count time to %s", newAlias); 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++){ for(i = 0; i < 10; i++){
sprintf(newAlias,"%s_%2.2d",argv[2],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); counts = GetMonitor(cter,i,pCon);
icounts = (int)counts; icounts = (int)counts;
status = NXDputalias(self->fileHandle,self->dictHandle,newAlias, status = NXDputalias(self->fileHandle,self->dictHandle,newAlias,
@ -583,7 +589,7 @@ static void putTimeBinning(SConnection *pCon, SicsInterp *pSics,
/* /*
build definition string build definition string
*/ */
status = NXDget(self->dictHandle,argv[2],buffer,254); status = NXDdefget(self->dictHandle,argv[2],buffer,254);
if(!status){ if(!status){
sprintf(buffer,"ERROR: alias %s for time binning not found", sprintf(buffer,"ERROR: alias %s for time binning not found",
argv[2]); argv[2]);
@ -661,7 +667,7 @@ static void putArray(SConnection *pCon, SicsInterp *pSics,
} }
data[i] = (float)dVal; data[i] = (float)dVal;
} else { } 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); SCWrite(pCon,buffer,eError);
} }
} }
@ -669,7 +675,7 @@ static void putArray(SConnection *pCon, SicsInterp *pSics,
/* /*
build definition string build definition string
*/ */
status = NXDget(self->dictHandle,argv[2],buffer,254); status = NXDdefget(self->dictHandle,argv[2],buffer,254);
if(!status){ if(!status){
sprintf(buffer,"ERROR: alias %s for array not found", sprintf(buffer,"ERROR: alias %s for array not found",
argv[2]); argv[2]);
@ -677,7 +683,7 @@ static void putArray(SConnection *pCon, SicsInterp *pSics,
free(data); free(data);
return; return;
} }
sprintf(defString,"%s -dim {%d} ",buffer,length); snprintf(defString,511,"%s -dim {%d} ",buffer,length);
/* /*
write it! write it!
@ -750,7 +756,7 @@ static int handlePut(SConnection *pCon, SicsInterp *pSics, pNXScript self,
return 1; return 1;
} }
Arg2Text(argc-3,&argv[3],buffer,1023); 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){ if(status != NX_OK){
sprintf(buffer,"ERROR: alias %s not found in puttext", sprintf(buffer,"ERROR: alias %s not found in puttext",
argv[2]); argv[2]);
@ -822,7 +828,23 @@ static void makeLink(SConnection *pCon, SicsInterp *pSics,
SCSendOK(pCon); 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 NXScriptAction(SConnection *pCon, SicsInterp *pSics, void *pData,
int argc, char *argv[]){ int argc, char *argv[]){
@ -865,6 +887,11 @@ int NXScriptAction(SConnection *pCon, SicsInterp *pSics, void *pData,
return 1; return 1;
} }
if(strcmp(argv[1],"updatedictvar") == 0){
updateDictVar(pCon,self,argc,argv);
return 1;
}
if(strstr(argv[1],"put") != NULL){ if(strstr(argv[1],"put") != NULL){
handlePut(pCon,pSics,self,argc,argv); handlePut(pCon,pSics,self,argc,argv);
return 1; return 1;

2
ofac.c
View File

@ -234,6 +234,8 @@
AddCommand(pInter,"StopExe",StopCommand,DeleteExeList, pExe); AddCommand(pInter,"StopExe",StopCommand,DeleteExeList, pExe);
AddCommand(pInter,"ListExe",ListExe,NULL,pExe); AddCommand(pInter,"ListExe",ListExe,NULL,pExe);
AddCommand(pInter,"Success",Success,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 */ /* add additional object creation commands here */
AddCommand(pInter,"TokenInit",TokenInit,NULL,NULL); AddCommand(pInter,"TokenInit",TokenInit,NULL,NULL);

View File

@ -474,7 +474,8 @@ end:
sprintf(pBueffel,"%s.%s = %f",argv[0],pName,pPar->fVal); sprintf(pBueffel,"%s.%s = %f",argv[0],pName,pPar->fVal);
SCWrite(pCon,pBueffel,eValue); SCWrite(pCon,pBueffel,eValue);
iRet = 1; iRet = 1;
goto end; DeleteTokenList(pList);
return 1;
} }
} }
end: end:

View File

@ -84,6 +84,11 @@ static float FAILRATE;
return HWIdle; return HWIdle;
} }
if(pSim->iPause == 1)
{
return HWPause;
}
if(SimRandom() < FAILRATE) if(SimRandom() < FAILRATE)
{ {
return HWFault; return HWFault;
@ -118,10 +123,6 @@ static float FAILRATE;
} }
else else
{ {
if(pSim->iPause == 1)
{
return HWPause;
}
return HWIdle; return HWIdle;
} }
} }