Cleaned up ANSTO code to merge with sinqdev.sics

This is our new RELEASE-4_0 branch which was taken from ansto/93d9a7c
Conflicts:
	.gitignore
	SICSmain.c
	asynnet.c
	confvirtualmot.c
	counter.c
	devexec.c
	drive.c
	event.h
	exebuf.c
	exeman.c
	histmem.c
	interface.h
	motor.c
	motorlist.c
	motorsec.c
	multicounter.c
	napi.c
	napi.h
	napi4.c
	network.c
	nwatch.c
	nxscript.c
	nxxml.c
	nxxml.h
	ofac.c
	reflist.c
	scan.c
	sicshipadaba.c
	sicsobj.c
	site_ansto/docs/Copyright.txt
	site_ansto/instrument/lyrebird/config/tasmad/sicscommon/nxsupport.tcl
	site_ansto/instrument/lyrebird/config/tasmad/taspub_sics/tasscript.tcl
	statusfile.c
	tasdrive.c
	tasub.c
	tasub.h
	tasublib.c
	tasublib.h
This commit is contained in:
Ferdi Franceschini
2015-04-23 20:49:26 +10:00
parent c650788a2c
commit 10d29d597c
1336 changed files with 9430 additions and 226646 deletions

View File

@@ -9,6 +9,8 @@
Mark Koennecke, February 2003
Mark Koennecke, January 2004
added putHdb and putHdbSlab, Mark Koennecke, December 2008
added sput, sappend and slab. Mark Koennecke, November 2013
------------------------------------------------------------------------*/
#include <stdlib.h>
#include <assert.h>
@@ -32,6 +34,9 @@
#include "nxscript.h"
#include "sicsdata.h"
#include "sicshipadaba.h"
#include "messagepipe.h"
#include "sicsget.h"
#include "stptok.h"
extern char *trim(char *str);
@@ -230,6 +235,7 @@ static int handleFileOperations(SConnection * pCon, pNXScript self,
SCWrite(pCon, buffer, eError);
return -1;
}
traceIO("datafile", "Opening %s", argv[2]);
SCSendOK(pCon);
return 1;
}
@@ -945,9 +951,7 @@ static void putSlab(SConnection * pCon, SicsInterp * pSics, pNXScript self,
pSICSData data = NULL;
pCounter memsec = NULL;
pHdb node = NULL;
char buffer[256];
enum histargs { haStart, haLength, haBank };
int i, haIndex, hpars[HANUM], haFirst = 6;
double dVal;
if (argc < 6) {
SCWrite(pCon, "ERROR: insufficient number of arguments to putslab",
@@ -978,38 +982,12 @@ static void putSlab(SConnection * pCon, SicsInterp * pSics, pNXScript self,
*/
mem = (pHistMem) FindCommandData(pSics, argv[5], "HistMem");
if (mem != NULL) {
if (argc == 6) {
histData = GetHistogramPointer(mem, pCon);
} else if (argc > 6) {
for (i = 0, haIndex = haFirst; i < HANUM; i++, haIndex++) {
status = Tcl_GetInt(InterpGetTcl(pSics), argv[haIndex], &hpars[i]);
if (status != TCL_OK) {
sprintf(buffer, "ERROR: failed to convert %s to integer",
argv[haIndex]);
SCWrite(pCon, buffer, eError);
return;
}
}
histData = (HistInt *) malloc(hpars[haLength] * sizeof(HistInt));
if (!histData) {
SCWrite(pCon, "ERROR: out of memory for reading histogram memory",
eError);
return;
}
memset(histData, 0, hpars[haLength] * sizeof(HistInt));
status = GetHistogramDirect(mem, pCon, hpars[haBank],
hpars[haStart],
hpars[haStart] + hpars[haLength],
histData,
hpars[haLength] * sizeof(HistInt));
}
histData = GetHistogramPointer(mem, pCon);
if (histData) {
status = NXputslab(self->fileHandle, histData, start, size);
if (status == NX_OK) {
written = 1;
}
if (argc > 6)
free(histData);
status = NXputslab(self->fileHandle, histData, start, size);
if (status == NX_OK) {
written = 1;
}
}
}
@@ -1039,6 +1017,24 @@ static void putSlab(SConnection * pCon, SicsInterp * pSics, pNXScript self,
written = 1;
}
}
/**
* try to look for a single double. This is a hack to make absolute_time
* work at BOA. A cleaner solution should be devised in a later stage.
* MK, June 2013
*/
if(written == 0) {
status = Tcl_GetDouble(InterpGetTcl(pSics), argv[5], &dVal);
if (status != TCL_OK) {
written = 0;
} else {
status = NXputslab(self->fileHandle, &dVal, start, size);
if (status == NX_OK) {
written = 1;
}
}
}
/*
* drop out of hierarchy
*/
@@ -1426,7 +1422,421 @@ static void putGlobal(SConnection * pCon, SicsInterp * pSics,
}
SCSendOK(pCon);
}
/*-----------------------------------------------------------------------
sget based functions
-------------------------------------------------------------------------*/
static pMP putPipe = NULL;
static pMP appendPipe = NULL;
/*------------------------------------------------------------------------*/
typedef struct {
hdbValue v;
char error[512];
char defString[1024];
int success;
int argc;
char **argv;
pNXScript nx;
int rank;
int dim[NX_MAXRANK];
int point;
}PutMessage, *pPutMessage;
/*------------------------------------------------------------------------*/
static int CheckNoArguments(void *message, void *userData)
{
pPutMessage self = (pPutMessage)message;
int *noArgs = (int *)userData;
if(self->argc < *noArgs){
snprintf(self->error, sizeof(self->error),"Not enough arguments, %d required",
*noArgs);
return MPSTOP;
}
return MPCONTINUE;
}
/*------------------------------------------------------------------------*/
static int SGetData(void *message, void *userData)
{
pPutMessage self = (pPutMessage)message;
int status;
status = sget(self->argv[3],&self->v);
if(status == 0){
snprintf(self->error, sizeof(self->error),"data for %s NOT found",
self->argv[3]);
return MPSTOP;
}
return MPCONTINUE;
}
/*-----------------------------------------------------------------------*/
static int GetDefString(void *message, void *userData)
{
pPutMessage self = (pPutMessage)message;
NXstatus status;
status = NXDget(self->nx->dictHandle, self->argv[2],
self->defString,sizeof(self->defString));
if(status != NX_OK){
snprintf(self->error, sizeof(self->error),"alias %s NOT found",
self->argv[2]);
return MPSTOP;
}
NXDtextreplace(self->nx->dictHandle,self->defString,
self->defString,sizeof(self->defString));
return MPCONTINUE;
}
/*------------------------------------------------------------------------*/
static int SPutAddType(void *message, void *userData)
{
pPutMessage self = (pPutMessage)message;
switch(self->v.dataType){
case HIPINT:
case HIPINTAR:
case HIPINTVARAR:
strncat(self->defString," -type NX_INT32 ",sizeof(self->defString));
break;
case HIPFLOAT:
case HIPFLOATAR:
case HIPFLOATVARAR:
strncat(self->defString," -type NX_FLOAT32 ",sizeof(self->defString));
break;
case HIPTEXT:
strncat(self->defString," -type NX_CHAR ",sizeof(self->defString));
break;
default :
snprintf(self->error, sizeof(self->error),"invalid data type %d",
self->v.dataType);
return MPSTOP;
}
return MPCONTINUE;
}
/*-----------------------------------------------------------------------
Writing should not fail due to some error in padding. Thus this routine
protects against errors but does not fail
------------------------------------------------------------------------*/
static int SPutPadding(void *message, void *userData)
{
pPutMessage self = (pPutMessage)message;
char *pPtr = NULL, *pEnd = NULL;
unsigned int len = 0, i;
if(self->v.dataType == HIPTEXT && strstr(self->v.v.text,"@len") != NULL){
pPtr = strchr(self->v.v.text,'=');
pPtr++;
pEnd = strchr(pPtr,'@');
if(pPtr != NULL && pEnd != NULL){
*pEnd = '\0';
len = atoi(pPtr);
}
pPtr = malloc((len+7)*sizeof(char));
if(pPtr != NULL){
memset(pPtr,0,len*sizeof(char));
strncpy(pPtr,pEnd+1,len);
for(i = strlen(pPtr); i < len-2; i++){
pPtr[i] = ' ';
}
pPtr[len-1] = '!';
free(self->v.v.text);
self->v.v.text = pPtr;
}
}
return MPCONTINUE;
}
/*------------------------------------------------------------------------*/
static int SPutDim(void *message, void *userData)
{
pPutMessage self = (pPutMessage)message;
char dim[20], *pPtr;
int i;
if(self->argc > 4) {
pPtr = self->argv[4];
while((pPtr = stptok(pPtr,dim,sizeof(dim),",")) != NULL){
self->dim[self->rank] = atoi(dim);
self->rank++;
}
} else {
self->rank = 1;
switch(self->v.dataType){
case HIPINT:
case HIPFLOAT:
self->dim[0] = 1;
break;
case HIPINTAR:
case HIPINTVARAR:
case HIPFLOATAR:
case HIPFLOATVARAR:
self->dim[0] = self->v.arrayLength;
break;
case HIPTEXT:
if(self->v.v.text != NULL){
self->dim[0] = strlen(self->v.v.text)+1;
} else {
self->dim[0] = 1;
}
break;
default:
snprintf(self->error, sizeof(self->error),"invalid data type %d",
self->v.dataType);
return MPSTOP;
}
}
snprintf(dim,sizeof(dim)," -rank %d ", self->rank);
strncat(self->defString,dim,sizeof(self->defString));
strncat(self->defString," -dim {",sizeof(self->defString));
for(i = 0; i < self->rank; i++){
sprintf(dim,"%d,", self->dim[i]);
strncat(self->defString,dim,sizeof(self->defString));
}
pPtr = strrchr(self->defString,(int)',');
*pPtr = '}';
return MPCONTINUE;
}
/*-----------------------------------------------------------------------*/
static int SPutWrite(void *message, void *userData)
{
pPutMessage self = (pPutMessage)message;
NXstatus status;
float fVal, *fData;
int i;
switch(self->v.dataType){
case HIPINT:
status = NXDputdef(self->nx->fileHandle, self->nx->dictHandle,
self->defString, &self->v.v.intValue);
break;
case HIPFLOAT:
fVal = self->v.v.doubleValue;
status = NXDputdef(self->nx->fileHandle, self->nx->dictHandle,
self->defString, &fVal);
break;
case HIPINTAR:
case HIPINTVARAR:
status = NXDputdef(self->nx->fileHandle, self->nx->dictHandle,
self->defString, self->v.v.intArray);
break;
case HIPFLOATAR:
case HIPFLOATVARAR:
fData = malloc(self->v.arrayLength * sizeof(float));
if(fData == NULL){
snprintf(self->error, sizeof(self->error),"out of memory in SPutWrire");
return MPSTOP;
}
for(i = 0; i < self->v.arrayLength; i++){
fData[i] = self->v.v.floatArray[i];
}
status = NXDputdef(self->nx->fileHandle, self->nx->dictHandle,
self->defString, &fData);
free(fData);
break;
case HIPTEXT:
status = NXDputdef(self->nx->fileHandle, self->nx->dictHandle,
self->defString, self->v.v.text);
break;
default:
snprintf(self->error, sizeof(self->error),"invalid data type %d",
self->v.dataType);
return MPSTOP;
}
if(status == NX_OK){
self->success = 1;
} else {
snprintf(self->error, sizeof(self->error),"error writing %s", self->argv[2]);
}
return MPCONTINUE;
}
/*------------------------------------------------------------------------*/
static void configurePutPipe()
{
int *noArgs;
putPipe = MakeMP();
noArgs = malloc(sizeof(int));
*noArgs = 4;
AppendMPFilter(putPipe,CheckNoArguments, noArgs,free);
AppendMPFilter(putPipe,SGetData, NULL,NULL);
AppendMPFilter(putPipe,GetDefString, NULL,NULL);
AppendMPFilter(putPipe,SPutAddType, NULL,NULL);
AppendMPFilter(putPipe,SPutPadding, NULL,NULL);
AppendMPFilter(putPipe,SPutDim, NULL,NULL);
AppendMPFilter(putPipe,SPutWrite, NULL,NULL);
}
/*------------------------------------------------------------------------*/
static int SAppendDim(void *message, void *userData)
{
pPutMessage self = (pPutMessage)message;
char dim[20], *pPtr;
int i;
self->point = atoi(self->argv[4]);
self->rank = 1;
self->dim[0] = -1;
if(self->argc > 5) {
pPtr = self->argv[5];
while((pPtr = stptok(pPtr,dim,sizeof(dim),",")) != NULL){
self->dim[self->rank] = atoi(dim);
self->rank++;
}
} else {
self->rank = 1;
switch(self->v.dataType){
case HIPINT:
case HIPFLOAT:
break;
case HIPINTAR:
case HIPINTVARAR:
case HIPFLOATAR:
case HIPFLOATVARAR:
self->rank = 2;
self->dim[1] = self->v.arrayLength;
break;
case HIPTEXT:
self->rank = 2;
self->dim[1] = strlen(self->v.v.text)+1;
break;
default:
snprintf(self->error, sizeof(self->error),"invalid data type %d",
self->v.dataType);
return MPSTOP;
}
}
snprintf(dim,sizeof(dim)," -rank %d ", self->rank);
strncat(self->defString,dim,sizeof(self->defString));
strncat(self->defString," -dim {",sizeof(self->defString));
for(i = 0; i < self->rank; i++){
sprintf(dim,"%d,", self->dim[i]);
strncat(self->defString,dim,sizeof(self->defString));
}
pPtr = strrchr(self->defString,(int)',');
*pPtr = '}';
return MPCONTINUE;
}
/*-----------------------------------------------------------------------*/
static int SAppendWrite(void *message, void *userData)
{
pPutMessage self = (pPutMessage)message;
NXstatus status;
float fVal, *fData;
int i;
int start[NX_MAXRANK], size[NX_MAXRANK];
NXopenpath(self->nx->fileHandle,"/");
status = NXDopendef(self->nx->fileHandle, self->nx->dictHandle,
self->defString);
if(status != NX_OK){
snprintf(self->error, sizeof(self->error),"cannot open NeXus object");
return MPSTOP;
}
start[0] = self->point;
size[0] = 1;
for(i = 1; i < self->rank; i++){
start[i] = 0;
size[i] = self->dim[i];
}
switch(self->v.dataType){
case HIPINT:
status = NXputslab(self->nx->fileHandle,&self->v.v.intValue, start,size);
break;
case HIPFLOAT:
fVal = self->v.v.doubleValue;
status = NXputslab(self->nx->fileHandle,&fVal, start,size);
break;
case HIPINTAR:
case HIPINTVARAR:
status = NXputslab(self->nx->fileHandle,&self->v.v.intArray, start,size);
break;
case HIPFLOATAR:
case HIPFLOATVARAR:
fData = malloc(self->v.arrayLength * sizeof(float));
if(fData == NULL){
snprintf(self->error, sizeof(self->error),"out of memory in SPutWrire");
return MPSTOP;
}
for(i = 0; i < self->v.arrayLength; i++){
fData[i] = self->v.v.floatArray[i];
}
status = NXputslab(self->nx->fileHandle,fData, start,size);
free(fData);
break;
case HIPTEXT:
status = NXputslab(self->nx->fileHandle,self->v.v.text, start,size);
break;
default:
snprintf(self->error, sizeof(self->error),"invalid data type %d",
self->v.dataType);
return MPSTOP;
}
if(status == NX_OK){
self->success = 1;
} else {
snprintf(self->error, sizeof(self->error),"error writing %s", self->argv[2]);
}
NXopenpath(self->nx->fileHandle,"/");
return MPCONTINUE;
}
/*------------------------------------------------------------------------*/
static void configureAppendPipe()
{
int *noArgs;
appendPipe = MakeMP();
noArgs = malloc(sizeof(int));
*noArgs = 5;
AppendMPFilter(appendPipe,CheckNoArguments, noArgs,free);
AppendMPFilter(appendPipe,SGetData, NULL,NULL);
AppendMPFilter(appendPipe,GetDefString, NULL,NULL);
AppendMPFilter(appendPipe,SPutAddType, NULL,NULL);
AppendMPFilter(appendPipe,SAppendDim, NULL,NULL);
AppendMPFilter(appendPipe,SAppendWrite, NULL,NULL);
}
/*------------------------------------------------------------------------*/
static int handleSPut(SConnection * pCon, SicsInterp * pSics,
pNXScript self, int argc, char *argv[])
{
PutMessage mess;
memset(&mess, 0, sizeof(PutMessage));
mess.argc = argc;
mess.argv = argv;
mess.nx = self;
MPprocess(putPipe,&mess);
if(mess.success == 0){
SCPrintf(pCon,eLogError,"ERROR: %s", mess.error);
} else {
SCSendOK(pCon);
}
ReleaseHdbValue(&mess.v);
return mess.success;
}
/*------------------------------------------------------------------------*/
static int handleSAppend(SConnection * pCon, SicsInterp * pSics,
pNXScript self, int argc, char *argv[])
{
PutMessage mess;
memset(&mess, 0, sizeof(PutMessage));
mess.argc = argc;
mess.argv = argv;
mess.nx = self;
MPprocess(appendPipe,&mess);
if(mess.success == 0){
SCPrintf(pCon,eLogError,"ERROR: %s", mess.error);
} else {
SCSendOK(pCon);
}
ReleaseHdbValue(&mess.v);
return mess.success;
}
/*-----------------------------------------------------------------------*/
static int handlePut(SConnection * pCon, SicsInterp * pSics,
pNXScript self, int argc, char *argv[])
@@ -1558,6 +1968,12 @@ static int handlePut(SConnection * pCon, SicsInterp * pSics,
} else if (strcmp(argv[1], "putslab16") == 0) {
/*===============*/
putSlab16(pCon, pSics, self, argc, argv);
} else if (strcmp(argv[1], "puts") == 0) {
/*===============*/
handleSPut(pCon, pSics, self, argc, argv);
} else if (strcmp(argv[1], "sappend") == 0) {
/*===============*/
handleSAppend(pCon, pSics, self, argc, argv);
} else {
SCPrintf(pCon, eLogError, "ERROR: put command %s not recognised", argv[1] );
}
@@ -1700,7 +2116,7 @@ int NXScriptAction(SConnection * pCon, SicsInterp * pSics, void *pData,
return 1;
}
if (strstr(argv[1], "put") != NULL) {
if (strstr(argv[1], "put") != NULL || strstr(argv[1],"sappend") != NULL) {
handlePut(pCon, pSics, self, argc, argv);
return 1;
}
@@ -1769,6 +2185,12 @@ int MakeNXScript(SConnection * pCon, SicsInterp * pSics, void *pData,
return 0;
}
self->timeDivisor = 1;
/*
configure pipes
*/
configurePutPipe();
configureAppendPipe();
/*
create with with a default name if none specified
@@ -1787,3 +2209,20 @@ int MakeNXScript(SConnection * pCon, SicsInterp * pSics, void *pData,
}
return 1;
}
static pNXScript sysScript= NULL;
/*-----------------------------------------------------------------------------------*/
int isNXScriptWriting(void)
{
if(sysScript == NULL){
sysScript = FindCommandData(pServ->pSics,"nxscript","NXScript");
}
if(sysScript != NULL && sysScript->fileHandle != NULL){
return 1;
} else {
return 0;
}
}