- 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:
50
devexec.c
50
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)
|
||||
|
13
devexec.h
13
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 -------------------------*/
|
||||
|
||||
|
11
devexec.tex
11
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 -------------------------*/@\\
|
||||
|
11
devexec.w
11
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 ---------------------------------*/
|
||||
@<devlock@>
|
||||
/* -------------------------- Executor management -------------------------*/
|
||||
|
@ -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\\
|
||||
|
3
napi5.c
3
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;
|
||||
}
|
||||
|
||||
|
100
nxdict.c
100
nxdict.c
@ -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");
|
||||
|
1
nxdict.h
1
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);
|
||||
|
45
nxscript.c
45
nxscript.c
@ -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
2
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);
|
||||
|
@ -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:
|
||||
|
Reference in New Issue
Block a user