- 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);
/* 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)

View File

@ -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 -------------------------*/

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@ 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 -------------------------*/@\\

View File

@ -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 ---------------------------------*/
@<devlock@>
/* -------------------------- Executor management -------------------------*/

View File

@ -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;
}

100
nxdict.c
View File

@ -37,7 +37,6 @@
#include <assert.h>
#include <string.h>
#include <time.h>
#include <mfhdf.h>
#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");

View File

@ -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);

View File

@ -7,6 +7,7 @@
copyright: see file COPYRIGHT
Mark Koennecke, February 2003
Mark Koennecke, January 2004
------------------------------------------------------------------------*/
#include <stdlib.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
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;

2
ofac.c
View File

@ -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);

View File

@ -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:

View File

@ -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;
}
}