*** empty log message ***
This commit is contained in:
@ -93,6 +93,9 @@ int defaultPrepareTxn(pAsyncProtocol p, pAsyncTxn txn, const char* cmd, int cmd_
|
||||
}
|
||||
txn->out_len = cmd_len;
|
||||
txn->out_idx = 0;
|
||||
if(txn->inp_buf != NULL){
|
||||
free(txn->inp_buf);
|
||||
}
|
||||
txn->inp_buf = malloc(rsp_len);
|
||||
if (txn->inp_buf == NULL) {
|
||||
SICSLogWrite("Out of memory in AsyncProtocol::defaultPrepareTxn", eError);
|
||||
|
@ -21,7 +21,8 @@ typedef enum {
|
||||
ATX_NULL=0,
|
||||
ATX_TIMEOUT=-1,
|
||||
ATX_ACTIVE=1,
|
||||
ATX_COMPLETE=2
|
||||
ATX_COMPLETE=2,
|
||||
ATX_DISCO=3
|
||||
} ATX_STATUS;
|
||||
|
||||
struct __async_txn {
|
||||
|
45
asyncqueue.c
45
asyncqueue.c
@ -8,7 +8,7 @@
|
||||
* single command channel.
|
||||
*
|
||||
* Douglas Clowes, February 2007
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sys/time.h>
|
||||
@ -21,7 +21,6 @@
|
||||
#include "asyncqueue.h"
|
||||
#include "nwatch.h"
|
||||
|
||||
typedef struct __AsyncQueue AsyncQueue, *pAsyncQueue;
|
||||
|
||||
typedef struct __async_command AQ_Cmd, *pAQ_Cmd;
|
||||
|
||||
@ -130,9 +129,9 @@ static int AQ_Reconnect(pAsyncQueue self)
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int CommandTimeout(void* cntx, int mode);
|
||||
static int DelayedStart(void* cntx, int mode);
|
||||
static int PopCommand(pAsyncQueue self);
|
||||
|
||||
static int StartCommand(pAsyncQueue self)
|
||||
{
|
||||
@ -183,8 +182,14 @@ static int StartCommand(pAsyncQueue self)
|
||||
iRet = NETRead(sock, reply, 1, 0);
|
||||
if (iRet < 0) { /* EOF */
|
||||
iRet = AQ_Reconnect(self);
|
||||
if (iRet == 0)
|
||||
if (iRet <= 0) {
|
||||
myCmd->tran->txn_state = ATX_DISCO;
|
||||
if(myCmd->tran->handleResponse){
|
||||
myCmd->tran->handleResponse(myCmd->tran);
|
||||
}
|
||||
PopCommand(self);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
@ -239,7 +244,6 @@ static int QueCommand(pAsyncQueue self, pAQ_Cmd cmd)
|
||||
self->command_tail = cmd;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int PopCommand(pAsyncQueue self)
|
||||
{
|
||||
pAQ_Cmd myCmd = self->command_head;
|
||||
@ -306,10 +310,22 @@ static int MyCallback(void* context, int mode)
|
||||
char reply[1];
|
||||
|
||||
iRet = NETRead(self->pSock, reply, 1, 0);
|
||||
/* printf(" iRet, char = %d, %d\n", iRet, (int)reply[0]); */
|
||||
if (iRet < 0) { /* EOF */
|
||||
iRet = AQ_Reconnect(self);
|
||||
if (iRet <= 0)
|
||||
if (iRet <= 0){
|
||||
/* changed to call handleResponse with a bad status code: MK
|
||||
*/
|
||||
pAQ_Cmd myCmd = self->command_head;
|
||||
if(myCmd){
|
||||
myCmd->tran->txn_state = ATX_DISCO;
|
||||
if(myCmd->tran->handleResponse){
|
||||
myCmd->tran->handleResponse(myCmd->tran);
|
||||
}
|
||||
PopCommand(self);
|
||||
}
|
||||
return iRet;
|
||||
}
|
||||
/* restart the command */
|
||||
StartCommand(self);
|
||||
return 1;
|
||||
@ -336,7 +352,7 @@ static int MyCallback(void* context, int mode)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int AsyncUnitEnqueHead(pAsyncUnit unit, pAsyncTxn context)
|
||||
int AsyncUnitEnqueueHead(pAsyncUnit unit, pAsyncTxn context)
|
||||
{
|
||||
pAQ_Cmd myCmd = NULL;
|
||||
|
||||
@ -412,6 +428,9 @@ pAsyncTxn AsyncUnitPrepareTxn(pAsyncUnit unit,
|
||||
if (rsp_len == 0)
|
||||
myTxn->inp_buf = NULL;
|
||||
else {
|
||||
if(myTxn->inp_buf != NULL){
|
||||
free(myTxn->inp_buf);
|
||||
}
|
||||
myTxn->inp_buf = malloc(rsp_len + 1);
|
||||
if (myTxn->inp_buf == NULL) {
|
||||
SICSLogWrite("ERROR: Out of memory in AsyncUnitPrepareTxn", eError);
|
||||
@ -954,3 +973,15 @@ int AsyncUnitDestroy(pAsyncUnit unit)
|
||||
return 1;
|
||||
}
|
||||
|
||||
pAsyncUnit AsyncUnitFromQueue(pAsyncQueue queue){
|
||||
pAsyncUnit result = NULL;
|
||||
|
||||
result = malloc(sizeof(AsyncUnit));
|
||||
if(result == NULL){
|
||||
return NULL;
|
||||
}
|
||||
memset(result,0,sizeof(AsyncUnit));
|
||||
result->queue = queue;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -17,6 +17,9 @@
|
||||
#define AQU_RETRY_CMD -4
|
||||
#define AQU_POP_CMD -5
|
||||
|
||||
typedef struct __AsyncQueue AsyncQueue, *pAsyncQueue;
|
||||
|
||||
|
||||
/** \brief create an AsyncUnit attached to a named AsyncQueue.
|
||||
*
|
||||
* \param queueName the name of the AsyncQueue to be used
|
||||
@ -24,6 +27,11 @@
|
||||
* \return positive if successful
|
||||
*/
|
||||
int AsyncUnitCreate(const char* queueName, pAsyncUnit* unit);
|
||||
/** \brief Get an AsyncUnit from a given AsyncQueue
|
||||
* \param queue The AsyncQueue fro which this AsyncUnit is valid
|
||||
* \return a new AsyncUnit or NULL on error
|
||||
*/
|
||||
pAsyncUnit AsyncUnitFromQueue(pAsyncQueue queue);
|
||||
|
||||
/** \brief create an AsyncUnit attached to an anonymous AsyncQueue.
|
||||
*
|
||||
|
@ -221,6 +221,7 @@ typedef struct {
|
||||
pRes->iLock = 0;
|
||||
pRes->drivePrint = 0;
|
||||
pRes->paused = 0;
|
||||
pRes->taskRunning = 0;
|
||||
pRes->pCall = CreateCallBackInterface();
|
||||
pRes->lastRun = time(NULL);
|
||||
pRes->pDes->GetInterface = DevexecInterface;
|
||||
|
@ -336,7 +336,7 @@ static int DiffScanTask(void *pData){
|
||||
check for interrupt
|
||||
*/
|
||||
if(SCGetInterrupt(self->scanObject->pCon) >= eAbortScan){
|
||||
pCount->pDriv->Halt(pCount->pDriv);
|
||||
pCount->pCountInt->Halt(pCount);
|
||||
pVar->pInter->Halt(pVar->pObject);
|
||||
SicsWait(1);
|
||||
finish = 0;
|
||||
|
13
exe.w
13
exe.w
@ -89,6 +89,19 @@ The interface to this buffer system comprises:
|
||||
*/
|
||||
int exeBufProcess(pExeBuf self, SicsInterp *pSics,
|
||||
SConnection *pCon, pICallBack pCall, int echo);
|
||||
/**
|
||||
* Process an exe buffer, but store commands causing errors in a list.
|
||||
* This is used for restoring status files.
|
||||
* @@param self The exe buffer to process
|
||||
* @@param pSics The SICS interpreter to use for processing
|
||||
* @@param pCon The connection object providing the environment for
|
||||
* processing this buffer.
|
||||
* @@param errCommandList A lld string list for storing commands which
|
||||
* had errors.
|
||||
* @@return 1 on success, 0 on error
|
||||
*/
|
||||
int exeBufProcessErrList(pExeBuf self, SicsInterp *pSics,
|
||||
SConnection *pCon, int errCommandList);
|
||||
/**
|
||||
* retrieves the executing range
|
||||
* @@param self The exe buffer to query
|
||||
|
40
exebuf.c
40
exebuf.c
@ -11,6 +11,7 @@
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <tcl.h>
|
||||
#include "lld_str.h"
|
||||
#include "fortify.h"
|
||||
#include "sics.h"
|
||||
#include "exebuf.h"
|
||||
@ -232,6 +233,45 @@ int exeBufProcess(pExeBuf self, SicsInterp *pSics,
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------*/
|
||||
int exeBufProcessErrList(pExeBuf self, SicsInterp *pSics,
|
||||
SConnection *pCon, int errList){
|
||||
pDynString command = NULL;
|
||||
Tcl_Interp *pTcl = NULL;
|
||||
int status;
|
||||
|
||||
static int weWantLogging = 1;
|
||||
char *cmd;
|
||||
char cmdName[128];
|
||||
char *ende;
|
||||
int l;
|
||||
|
||||
assert(self);
|
||||
assert(pSics);
|
||||
|
||||
self->start = 0;
|
||||
self->end = -1;
|
||||
self->lineno = 0;
|
||||
pTcl = InterpGetTcl(pSics);
|
||||
|
||||
while((command = findBlockEnd(self)) != NULL){
|
||||
cmd = GetCharArray(command);
|
||||
|
||||
status = Tcl_Eval(pTcl,cmd);
|
||||
if(status != TCL_OK){
|
||||
LLDstringAppend(errList,cmd);
|
||||
}
|
||||
DeleteDynString(command);
|
||||
if(SCGetInterrupt(pCon) >= eAbortBatch){
|
||||
SCWrite(pCon,"ERROR: batch processing interrupted",eError);
|
||||
SetStatus(eEager);
|
||||
return 0;
|
||||
} else {
|
||||
SCSetInterrupt(pCon,eContinue);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
/*------------------------------------------------------------------------*/
|
||||
void exeBufRange(pExeBuf self, int *start, int *end, int *lineno){
|
||||
assert(self);
|
||||
|
17
exebuf.h
17
exebuf.h
@ -1,5 +1,5 @@
|
||||
|
||||
#line 213 "exe.w"
|
||||
#line 226 "exe.w"
|
||||
|
||||
/**
|
||||
* Buffer handling code for the Exe Buffer batch file processing
|
||||
@ -63,6 +63,19 @@
|
||||
*/
|
||||
int exeBufProcess(pExeBuf self, SicsInterp *pSics,
|
||||
SConnection *pCon, pICallBack pCall, int echo);
|
||||
/**
|
||||
* Process an exe buffer, but store commands causing errors in a list.
|
||||
* This is used for restoring status files.
|
||||
* @param self The exe buffer to process
|
||||
* @param pSics The SICS interpreter to use for processing
|
||||
* @param pCon The connection object providing the environment for
|
||||
* processing this buffer.
|
||||
* @param errCommandList A lld string list for storing commands which
|
||||
* had errors.
|
||||
* @return 1 on success, 0 on error
|
||||
*/
|
||||
int exeBufProcessErrList(pExeBuf self, SicsInterp *pSics,
|
||||
SConnection *pCon, int errCommandList);
|
||||
/**
|
||||
* retrieves the executing range
|
||||
* @param self The exe buffer to query
|
||||
@ -89,7 +102,7 @@
|
||||
*/
|
||||
char *exeBufName(pExeBuf self);
|
||||
|
||||
#line 226 "exe.w"
|
||||
#line 239 "exe.w"
|
||||
|
||||
|
||||
#endif
|
||||
|
4
exebuf.i
4
exebuf.i
@ -1,5 +1,5 @@
|
||||
|
||||
#line 204 "exe.w"
|
||||
#line 217 "exe.w"
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Internal header file for the exe buffer module. Do not edit. This is
|
||||
@ -16,6 +16,6 @@ typedef struct __EXEBUF{
|
||||
int lineno;
|
||||
} ExeBuf;
|
||||
|
||||
#line 209 "exe.w"
|
||||
#line 222 "exe.w"
|
||||
|
||||
|
||||
|
6
exeman.i
6
exeman.i
@ -1,12 +1,12 @@
|
||||
|
||||
#line 182 "exe.w"
|
||||
#line 195 "exe.w"
|
||||
|
||||
/*-------------------------------------------------------------------
|
||||
Internal header file for the exe manager module. Do not edit. This
|
||||
is automatically generated from exe.w
|
||||
-------------------------------------------------------------------*/
|
||||
|
||||
#line 138 "exe.w"
|
||||
#line 151 "exe.w"
|
||||
|
||||
typedef struct __EXEMAN{
|
||||
pObjectDescriptor pDes;
|
||||
@ -20,5 +20,5 @@ typedef struct __EXEMAN{
|
||||
int echo;
|
||||
}ExeMan, *pExeMan;
|
||||
|
||||
#line 187 "exe.w"
|
||||
#line 200 "exe.w"
|
||||
|
||||
|
613
genericcontroller.c
Normal file
613
genericcontroller.c
Normal file
@ -0,0 +1,613 @@
|
||||
/**
|
||||
* This is a generic controller for devices in SICS. It is configurable via Tcl
|
||||
* scripts.
|
||||
*
|
||||
* copyright: see file COPYRIGHT
|
||||
*
|
||||
* Mark Koennecke, November 2007
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <tcl.h>
|
||||
#include <sics.h>
|
||||
#include <macro.h>
|
||||
#include <sicshipadaba.h>
|
||||
#include <sicsobj.h>
|
||||
#include <dynstring.h>
|
||||
#include <genericcontroller.h>
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static int GenConSetCallback(void *userData, void *callData, pHdb node,
|
||||
hdbValue v){
|
||||
pSICSOBJ self = (pSICSOBJ)userData;
|
||||
SConnection *pCon = (SConnection *)callData;
|
||||
pGenController priv = NULL;
|
||||
char command[1024];
|
||||
char value[80];
|
||||
int status, privilege;
|
||||
pDynString data;
|
||||
|
||||
assert(self != NULL);
|
||||
|
||||
priv = (pGenController)self->pPrivate;
|
||||
|
||||
/*
|
||||
* check rights
|
||||
*/
|
||||
memset(value,0,80);
|
||||
if(GetHdbProperty(node,"priv",value,80) && pCon != NULL){
|
||||
privilege = usInternal;
|
||||
if(strcmp(value,"manager") == 0){
|
||||
privilege = usMugger;
|
||||
}
|
||||
if(strcmp(value,"user") == 0){
|
||||
privilege = usUser;
|
||||
}
|
||||
if(!SCMatchRights(pCon,privilege)){
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* check writeCommand
|
||||
*/
|
||||
memset(value,0,80);
|
||||
GetHdbProperty(node,"writeCommand",value,80);
|
||||
if(strlen(value) < 2){
|
||||
if(pCon != NULL){
|
||||
SCWrite(pCon,"ERROR: parameter is read-only",eError);
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* check status
|
||||
*/
|
||||
memset(value,0,80);
|
||||
GetHdbProperty(node,"status",value,80);
|
||||
if(strstr(value,"idle") == NULL){
|
||||
return 0;
|
||||
}
|
||||
SetHdbProperty(node,"status","setting");
|
||||
data = formatValue(v);
|
||||
if(data != NULL){
|
||||
SetHdbProperty(node,"target",GetCharArray(data));
|
||||
DeleteDynString(data);
|
||||
}
|
||||
|
||||
/*
|
||||
* issue command
|
||||
*/
|
||||
if(priv->enqueueNodeHead != NULL){
|
||||
priv->enqueueNodeHead(self,pCon,node);
|
||||
} else {
|
||||
if(pCon != NULL){
|
||||
SCWrite(pCon,"ERROR: generic controller NOT configured",
|
||||
eError);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static int GenConGetCallback(void *userData, void *callData, pHdb node,
|
||||
hdbValue v){
|
||||
pSICSOBJ self = (pSICSOBJ)userData;
|
||||
SConnection *pCon = (SConnection *)callData;
|
||||
pGenController priv = NULL;
|
||||
char command[1024];
|
||||
char value[256];
|
||||
int status, privilege;
|
||||
|
||||
assert(self != NULL);
|
||||
|
||||
priv = (pGenController)self->pPrivate;
|
||||
|
||||
/*
|
||||
* check status
|
||||
*/
|
||||
memset(value,0,80);
|
||||
GetHdbProperty(node,"status",value,80);
|
||||
if(strstr(value,"idle") == NULL){
|
||||
return 1;
|
||||
}
|
||||
SetHdbProperty(node,"status","getting");
|
||||
|
||||
/*
|
||||
* check readCommand
|
||||
*/
|
||||
memset(value,0,256);
|
||||
GetHdbProperty(node,"readCommand",value,255);
|
||||
if(strlen(value) < 2){
|
||||
return 0;
|
||||
} else {
|
||||
if(priv->enqueueNode != NULL){
|
||||
priv->enqueueNode(self,pCon, node);
|
||||
} else {
|
||||
if(pCon != NULL){
|
||||
SCWrite(pCon,"ERROR: generic controller connection NOT configured",
|
||||
eError);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Upper Level GetHipadabaPar will automtaically return the
|
||||
* node value. Which should have been updated through an update
|
||||
* during the execution of enqueueNode
|
||||
*/
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static pHdb MakeGenConPar(pSICSOBJ self, char *name, int type, int length){
|
||||
pHdb result = NULL;
|
||||
pHdbCallback kalle = NULL;
|
||||
|
||||
result = MakeHipadabaNode(name,type,length);
|
||||
if(result == NULL){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
kalle = MakeHipadabaCallback(GenConSetCallback,
|
||||
self,
|
||||
NULL,
|
||||
-1,
|
||||
-1);
|
||||
if(kalle == NULL){
|
||||
return NULL;
|
||||
}
|
||||
AppendHipadabaCallback(result,HCBSET, kalle);
|
||||
|
||||
kalle = MakeHipadabaCallback(GenConGetCallback,
|
||||
self,
|
||||
NULL,
|
||||
-1,
|
||||
-1);
|
||||
if(kalle == NULL){
|
||||
return NULL;
|
||||
}
|
||||
AppendHipadabaCallback(result,HCBREAD, kalle);
|
||||
|
||||
SetHdbProperty(result,"priv","manager");
|
||||
SetHdbProperty(result,"readCommand","");
|
||||
SetHdbProperty(result,"writeCommand","");
|
||||
SetHdbProperty(result,"replyCommand","");
|
||||
SetHdbProperty(result,"status","idle");
|
||||
|
||||
return result;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int MakeGenPar(pSICSOBJ self, SConnection *pCon,
|
||||
char *argv[], int argc){
|
||||
char buffer[2048];
|
||||
int type, length = 1;
|
||||
pHdb node = NULL , parent;
|
||||
char *pPtr = NULL;
|
||||
|
||||
if(argc < 5){
|
||||
snprintf(buffer,2048,"ERROR: insufficient arguments to %s makepar",
|
||||
argv[0]);
|
||||
SCWrite(pCon,buffer, eError);
|
||||
return 0;
|
||||
}
|
||||
type = convertHdbType(argv[4]);
|
||||
if(argc > 5){
|
||||
length = atoi(argv[5]);
|
||||
}
|
||||
strncpy(buffer,argv[3],2047);
|
||||
pPtr = strrchr(buffer,'/');
|
||||
if(pPtr == NULL){
|
||||
node = MakeGenConPar(self, argv[3], type, length);
|
||||
parent = self->objectNode;
|
||||
} else {
|
||||
*pPtr = '\0';
|
||||
pPtr++;
|
||||
node = MakeGenConPar(self, pPtr, type, length);
|
||||
parent = GetHipadabaNode(self->objectNode,buffer);
|
||||
}
|
||||
if(node == NULL || parent == NULL){
|
||||
SCWrite(pCon,"ERROR: failed to create node or parent not found",
|
||||
eError);
|
||||
return 0;
|
||||
}
|
||||
AddHipadabaChild(parent, node, pCon);
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
}
|
||||
/*=============================== ==========================================
|
||||
* This stuff is for the Tcl - AsynQueue implementation of GenericController
|
||||
* ==========================================================================*/
|
||||
typedef struct {
|
||||
pHdb node;
|
||||
pSICSOBJ obj;
|
||||
SConnection *pCon;
|
||||
pGenController priv;
|
||||
pAsyncUnit assi;
|
||||
pAsyncTxn trans;
|
||||
commandContext comCon;
|
||||
char replyCommand[2048];
|
||||
} GenContext, *pGenContext;
|
||||
/*--------------------------------------------------------------------------
|
||||
* This is called by AsyncQueue when a reply has been received.
|
||||
* -------------------------------------------------------------------------*/
|
||||
static int GenConTxnHandler(pAsyncTxn pTxn){
|
||||
pGenContext genCon = NULL;
|
||||
char reply[10240];
|
||||
|
||||
genCon = (pGenContext)pTxn->cntx;
|
||||
assert(genCon != NULL);
|
||||
|
||||
memset(reply,0,10240*sizeof(char));
|
||||
switch(pTxn->txn_state){
|
||||
case ATX_NULL:
|
||||
case ATX_ACTIVE:
|
||||
return 1;
|
||||
break;
|
||||
case ATX_TIMEOUT:
|
||||
strcpy(reply,"TIMEOUT");
|
||||
break;
|
||||
case ATX_DISCO:
|
||||
strcpy(reply,"DISCONNECTED");
|
||||
break;
|
||||
case ATX_COMPLETE:
|
||||
strncpy(reply,pTxn->inp_buf,10240);
|
||||
break;
|
||||
}
|
||||
|
||||
if(genCon->pCon != NULL){
|
||||
SCPushContext2(genCon->pCon, genCon->comCon);
|
||||
}
|
||||
genCon->priv->replyCallback(genCon->obj, genCon->pCon,
|
||||
genCon->node, genCon->replyCommand, reply, strlen(reply));
|
||||
if(genCon->pCon != NULL){
|
||||
SCPopContext(genCon->pCon);
|
||||
}
|
||||
free(genCon);
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static char *formatCommand(pHdb node, SConnection *pCon){
|
||||
pDynString com = NULL;
|
||||
char value[512];
|
||||
Tcl_Interp *pTcl = NULL;
|
||||
int status;
|
||||
|
||||
com = CreateDynString(256,128);
|
||||
if(com == NULL){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(value,0,512);
|
||||
GetHdbProperty(node,"status",value,512);
|
||||
if(strstr(value,"set") != NULL){
|
||||
memset(value,0,512);
|
||||
GetHdbProperty(node,"writeCommand",value,512);
|
||||
DynStringConcat(com,value);
|
||||
DynStringConcatChar(com,' ');
|
||||
memset(value,0,512);
|
||||
GetHdbProperty(node,"target",value,512);
|
||||
DynStringConcat(com,value);
|
||||
} else {
|
||||
memset(value,0,512);
|
||||
GetHdbProperty(node,"readCommand",value,512);
|
||||
DynStringConcat(com,value);
|
||||
}
|
||||
pTcl = InterpGetTcl(pServ->pSics);
|
||||
if(pCon != NULL){
|
||||
MacroPush(pCon);
|
||||
}
|
||||
status = Tcl_Eval(pTcl, GetCharArray(com));
|
||||
if(pCon != NULL){
|
||||
MacroPop();
|
||||
}
|
||||
DeleteDynString(com);
|
||||
if(status != TCL_OK){
|
||||
SetHdbProperty(node,"result", (char *)Tcl_GetStringResult(pTcl));
|
||||
return NULL;
|
||||
}
|
||||
return strdup(Tcl_GetStringResult(pTcl));
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static pGenContext PrepareToEnque(pSICSOBJ self, SConnection *pCon, pHdb node){
|
||||
pGenContext result = NULL;
|
||||
char *command = NULL;
|
||||
pGenController priv = NULL;
|
||||
|
||||
priv = (pGenController)self->pPrivate;
|
||||
assert(priv != NULL);
|
||||
|
||||
command = formatCommand(node, pCon);
|
||||
if(command == NULL){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
result = malloc(sizeof(GenContext));
|
||||
if(result == NULL){
|
||||
return NULL;
|
||||
}
|
||||
memset(result,0,sizeof(GenContext));
|
||||
if(!GetHdbProperty(node,"replyCommand",result->replyCommand,2048)){
|
||||
if(pCon != NULL){
|
||||
SCWrite(pCon,"ERROR: no replyCommand found",eError);
|
||||
}
|
||||
free(result);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
result->assi = AsyncUnitFromQueue((pAsyncQueue)priv->comContext);
|
||||
if(result->assi == NULL){
|
||||
return NULL;
|
||||
}
|
||||
result->trans = AsyncUnitPrepareTxn(result->assi,
|
||||
command,strlen(command),
|
||||
GenConTxnHandler,
|
||||
result,
|
||||
2048);
|
||||
if(result->trans == NULL){
|
||||
return NULL;
|
||||
}
|
||||
result->node = node;
|
||||
result->priv = priv;
|
||||
result->obj = self;
|
||||
result->pCon = pCon;
|
||||
priv->comError = GCOK;
|
||||
result->comCon = SCGetContext(pCon);
|
||||
free(command);
|
||||
|
||||
return result;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int AsyncEnqueueNode(pSICSOBJ self, SConnection *pCon, pHdb node){
|
||||
pGenContext genCon = NULL;
|
||||
|
||||
genCon = PrepareToEnque(self, pCon, node);
|
||||
if(genCon == NULL){
|
||||
return 0;
|
||||
}
|
||||
return AsyncUnitEnqueueTxn(genCon->assi, genCon->trans);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int AsyncEnqueueNodeHead(pSICSOBJ self, SConnection *pCon, pHdb node){
|
||||
pGenContext genCon = NULL;
|
||||
|
||||
genCon = PrepareToEnque(self, pCon, node);
|
||||
if(genCon == NULL){
|
||||
return 0;
|
||||
}
|
||||
return AsyncUnitEnqueueHead(genCon->assi, genCon->trans);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int AsyncReply(pSICSOBJ self, SConnection *pCon, pHdb node,
|
||||
char *replyCommand, char *reply, int replylen){
|
||||
pDynString com = NULL;
|
||||
Tcl_Interp *pTcl;
|
||||
int status;
|
||||
|
||||
SetHdbProperty(node,"result",reply);
|
||||
|
||||
com = CreateDynString(256,128);
|
||||
if(com == NULL){
|
||||
return 0;
|
||||
}
|
||||
DynStringConcat(com, replyCommand);
|
||||
DynStringConcat(com," \"");
|
||||
DynStringConcat(com, reply);
|
||||
DynStringConcat(com,"\"\0");
|
||||
if(pCon != NULL){
|
||||
MacroPush(pCon);
|
||||
}
|
||||
pTcl = InterpGetTcl(pServ->pSics);
|
||||
status = Tcl_Eval(pTcl,GetCharArray(com));
|
||||
if(pCon != NULL){
|
||||
MacroPop();
|
||||
}
|
||||
DeleteDynString(com);
|
||||
if(status != TCL_OK){
|
||||
SetHdbProperty(node,"lastError",(char *)Tcl_GetStringResult(pTcl));
|
||||
}
|
||||
return status;
|
||||
}
|
||||
/*============= GenController Object Functions ==============================*/
|
||||
static int ConnectAsync(pSICSOBJ self, SConnection *pCon,
|
||||
char *argv[], int argc){
|
||||
pGenController priv = NULL;
|
||||
pAsyncQueue assi = NULL;
|
||||
char buffer[2048];
|
||||
pAsyncUnit uni = NULL;
|
||||
|
||||
priv = (pGenController)self->pPrivate;
|
||||
assert(priv != NULL);
|
||||
|
||||
if(argc < 4){
|
||||
snprintf(buffer,2048,"ERROR: insufficient arguments to %s asynconnect",
|
||||
argv[0]);
|
||||
SCWrite(pCon,buffer, eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
assi = (pAsyncQueue)FindCommandData(pServ->pSics, argv[3],"AsyncQueue");
|
||||
if(assi == NULL){
|
||||
snprintf(buffer,2048,"ERROR: %s not found or no AsyncQueue", argv[3]);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
priv->comContext = assi;
|
||||
priv->killComContext = NULL; /* not ours, cleaned up by AsyncQueue module */
|
||||
priv->enqueueNode = AsyncEnqueueNode;
|
||||
priv->enqueueNodeHead = AsyncEnqueueNodeHead;
|
||||
priv->replyCallback = AsyncReply;
|
||||
priv->comError = GCOK;
|
||||
|
||||
/*
|
||||
* This unit is solely for the purpose of receiving event notifications
|
||||
*/
|
||||
uni = AsyncUnitFromQueue(assi);
|
||||
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int GenControllerConfigure(SConnection *pCon, SicsInterp *pSics,
|
||||
void *pData, int argc, char *argv[]){
|
||||
pSICSOBJ controller = NULL;
|
||||
pGenController self = NULL;
|
||||
char buffer[2048];
|
||||
|
||||
if(argc < 3){
|
||||
snprintf(buffer,2048,"ERROR: insufficient arguments to %s", argv[0]);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
controller = (pSICSOBJ)FindCommandData(pSics,argv[2], "GenericController");
|
||||
if(controller == NULL){
|
||||
snprintf(buffer,2048,"ERROR: controller %s not found", argv[2]);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
strtolower(argv[1]);
|
||||
if(strcmp(argv[1],"makepar") == 0){
|
||||
return MakeGenPar(controller,pCon,argv,argc);
|
||||
} else if(strcmp(argv[1],"asynconnect") == 0){
|
||||
return ConnectAsync(controller, pCon, argv, argc);
|
||||
} else {
|
||||
SCWrite(pCon,"ERROR: argument to GenControllerConfigure not found",
|
||||
eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void killGeneric(void *data){
|
||||
pGenController self = (pGenController)data;
|
||||
|
||||
if(self == NULL){
|
||||
return;
|
||||
}
|
||||
if(self->comContext != NULL && self->killComContext != NULL){
|
||||
self->killComContext(self->comContext);
|
||||
}
|
||||
free(self);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int EnqueFunc(pSICSOBJ self, SConnection *pCon, pHdb commandNode,
|
||||
pHdb par[], int nPar){
|
||||
pGenController priv = NULL;
|
||||
pHdb node = NULL;
|
||||
char buffer[512];
|
||||
|
||||
priv = (pGenController)self->pPrivate;
|
||||
assert(priv != NULL);
|
||||
assert(nPar >= 1);
|
||||
|
||||
node = GetHipadabaNode(self->objectNode,par[0]->value.v.text);
|
||||
if(node == NULL){
|
||||
snprintf(buffer,511,"ERROR: node %s to enqueue not found",
|
||||
par[0]->value.v.text);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(priv->enqueueNode != NULL){
|
||||
priv->enqueueNode(self, pCon, node);
|
||||
} else {
|
||||
SCWrite(pCon,"ERROR: GenController NOT configured",eError);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int EnqueHeadFunc(pSICSOBJ self, SConnection *pCon, Hdb commandNode,
|
||||
pHdb par[], int nPar){
|
||||
pGenController priv = NULL;
|
||||
pHdb node = NULL;
|
||||
char buffer[512];
|
||||
|
||||
priv = (pGenController)self->pPrivate;
|
||||
assert(priv != NULL);
|
||||
assert(nPar >= 1);
|
||||
|
||||
node = GetHipadabaNode(self->objectNode,par[0]->value.v.text);
|
||||
if(node == NULL){
|
||||
snprintf(buffer,511,"ERROR: node %s to enqueue not found",
|
||||
par[0]->value.v.text);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(priv->enqueueNodeHead != NULL){
|
||||
priv->enqueueNodeHead(self, pCon, node);
|
||||
} else {
|
||||
SCWrite(pCon,"ERROR: GenController NOT configured",eError);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int GenControllerFactory(SConnection *pCon, SicsInterp *pSics,
|
||||
void *pData, int argc, char *argv[]){
|
||||
pSICSOBJ pNew = NULL;
|
||||
pGenController priv = NULL;
|
||||
hdbValue funcValue, textValue;
|
||||
pHdb node = NULL;
|
||||
char line[132];
|
||||
int status;
|
||||
|
||||
if(argc < 2){
|
||||
SCWrite(pCon,
|
||||
"ERROR: insufficient number of arguments to GenControllerFactrory",
|
||||
eError);
|
||||
return 0;
|
||||
}
|
||||
priv = malloc(sizeof(GenController));
|
||||
if(priv == NULL){
|
||||
SCWrite(pCon,"ERROR: out of memory in GenControllerFactory",
|
||||
eError);
|
||||
return 0;
|
||||
}
|
||||
memset(priv,0,sizeof(GenController));
|
||||
|
||||
pNew = MakeSICSOBJ(argv[1],"GenericController");
|
||||
if(pNew == NULL){
|
||||
SCWrite(pCon,"ERROR: out of memory in GenControllerFactory",
|
||||
eError);
|
||||
return 0;
|
||||
}
|
||||
pNew->pPrivate = priv;
|
||||
pNew->KillPrivate = killGeneric;
|
||||
|
||||
textValue = MakeHdbText("Undefined");
|
||||
funcValue = makeHdbData(HIPFUNC,1,EnqueFunc);
|
||||
node = MakeSICSHdbPar("enqueue",usUser, funcValue);
|
||||
AddSICSHdbPar(node,"node",usUser,textValue);
|
||||
AppendHipadabaCallback(node,HCBSET,MakeSICSFuncCallback(pNew));
|
||||
AddHipadabaChild(pNew->objectNode,node,NULL);
|
||||
|
||||
funcValue = makeHdbData(HIPFUNC,1,EnqueHeadFunc);
|
||||
node = MakeSICSHdbPar("enqueuehead",usUser, funcValue);
|
||||
AddSICSHdbPar(node,"node",usUser,textValue);
|
||||
AppendHipadabaCallback(node,HCBSET,MakeSICSFuncCallback(pNew));
|
||||
AddHipadabaChild(pNew->objectNode,node,NULL);
|
||||
|
||||
status = AddCommand(pSics,
|
||||
argv[1],
|
||||
InvokeSICSOBJ,
|
||||
KillSICSOBJ,
|
||||
pNew);
|
||||
if(status != 1){
|
||||
KillSICSOBJ(pNew);
|
||||
SCPrintf(pCon,eError,"ERROR: failed create duplicate command %s", argv[1]);
|
||||
return 0;
|
||||
}
|
||||
SCSendOK(pCon);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
37
genericcontroller.h
Normal file
37
genericcontroller.h
Normal file
@ -0,0 +1,37 @@
|
||||
/**
|
||||
* This is a generic controller for devices in SICS. In its default configuration it
|
||||
* will be configurable via Tcl scripts and used AsynqQueue for communication. But
|
||||
* it is suitably generic to support other mechanisms as well.
|
||||
*
|
||||
* copyright: see file COPYRIGHT
|
||||
*
|
||||
* Mark Koennecke, November 2007
|
||||
*/
|
||||
#ifndef GENERICCONTROLLER_H_
|
||||
#define GENERICCONTROLLER_H_
|
||||
#include <asyncqueue.h>
|
||||
#include <sicshipadaba.h>
|
||||
|
||||
#define GCTIMEOUT 5001
|
||||
#define GCDISCONNECT 5002
|
||||
#define GCOK 5000
|
||||
#define GCRECONNECT 5003
|
||||
#define GCRETRY 5004
|
||||
|
||||
typedef struct {
|
||||
int (*enqueueNode)(pSICSOBJ self, SConnection *pCon, pHdb node);
|
||||
int (*enqueueNodeHead)(pSICSOBJ self, SConnection *pCon, pHdb node);
|
||||
int (*replyCallback)(pSICSOBJ self, SConnection *pCon, pHdb node,
|
||||
char *replyCommand, char *reply, int replylen);
|
||||
void *comContext;
|
||||
void (*killComContext)(void *data);
|
||||
int comError;
|
||||
}GenController, *pGenController;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int GenControllerFactory(SConnection *pCon, SicsInterp *pSics,
|
||||
void *pData, int argc, char *argv[]);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int GenControllerConfigure(SConnection *pCon, SicsInterp *pSics,
|
||||
void *pData, int argc, char *argv[]);
|
||||
|
||||
#endif /*GENERICCONTROLLER_H_*/
|
19
geninter.c
Normal file
19
geninter.c
Normal file
@ -0,0 +1,19 @@
|
||||
/**
|
||||
* This is the implementation of various SICS internal interfaces based on
|
||||
* parameters in a generic controller.
|
||||
*
|
||||
* copyright: see file COPYRIGHT
|
||||
*
|
||||
* Mark Koennecke, November 2007
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <sics.h>
|
||||
#include <sicshipadaba.h>
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int GenDrivableFactory(SConnection *pCon, SicsInterp *pSics,
|
||||
void *pData, int argc, char *argv[]){
|
||||
|
||||
return 1;
|
||||
}
|
19
geninter.h
Normal file
19
geninter.h
Normal file
@ -0,0 +1,19 @@
|
||||
/**
|
||||
* This is the implementation of various SICS internal interfaces based on
|
||||
* parameters in a generic controller.
|
||||
*
|
||||
* copyright: see file COPYRIGHT
|
||||
*
|
||||
* Mark Koennecke, November 2007
|
||||
*/
|
||||
#ifndef GENINTER_H_
|
||||
#define GENINTER_H_
|
||||
/**
|
||||
* make a drivable parameter:
|
||||
* Usage:
|
||||
* MakeGenDrivable name par-node control-node
|
||||
*/
|
||||
int GenDrivableFactory(SConnection *pCon, SicsInterp *pSics,
|
||||
void *pData, int argc, char *argv[]);
|
||||
|
||||
#endif /*GENINTER_H_*/
|
29
hdbqueue.c
29
hdbqueue.c
@ -68,7 +68,8 @@ static pHdb MakeNewEntry(char *name, pHdbCallback update){
|
||||
return entry;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int EnqueFunc(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
static int EnqueFunc(pSICSOBJ self, SConnection *pCon, Hdb commandNode,
|
||||
pHdb par[], int nPar){
|
||||
pHdb entry = NULL;
|
||||
pHdb work = NULL;
|
||||
char name[80];
|
||||
@ -113,7 +114,8 @@ static int EnqueFunc(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int AddCmdData(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
static int AddCmdData(pSICSOBJ self, SConnection *pCon, Hdb comNode,
|
||||
pHdb par[], int nPar){
|
||||
pHdb work = NULL;
|
||||
pHdb commandNode = NULL;
|
||||
char name[80];
|
||||
@ -171,7 +173,8 @@ static void sequentialNames(pHdb obj,SConnection *pCon){
|
||||
NotifyHipadabaPar(work,pCon);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int Dequeue(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
static int Dequeue(pSICSOBJ self, SConnection *pCon, pHdb commandNode,
|
||||
pHdb par[], int nPar){
|
||||
pHdb work = NULL;
|
||||
char name[80];
|
||||
pHdbQueue priv = (pHdbQueue)self->pPrivate;
|
||||
@ -198,7 +201,8 @@ static int Dequeue(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
return 0;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int Clean(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
static int Clean(pSICSOBJ self, SConnection *pCon,Hdb commandNode,
|
||||
pHdb par[], int nPar){
|
||||
int i;
|
||||
pHdb current = NULL, queue = NULL;
|
||||
pHdb currentEntry = NULL, tmp = NULL;
|
||||
@ -225,7 +229,8 @@ static int Clean(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int CleanAll(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
static int CleanAll(pSICSOBJ self, SConnection *pCon, pHdb commandNode,
|
||||
pHdb par[], int nPar){
|
||||
int i;
|
||||
pHdb current = NULL, queue = NULL;
|
||||
pHdb currentEntry = NULL, tmp;
|
||||
@ -292,7 +297,8 @@ static int QueueTask(void *pData){
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int Start(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
static int Start(pSICSOBJ self, SConnection *pCon, pHdb commandNode,
|
||||
pHdb par[], int nPar){
|
||||
pHdbQueue priv = (pHdbQueue)self->pPrivate;
|
||||
|
||||
priv->iStop = 0;
|
||||
@ -313,7 +319,8 @@ static int Start(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int Restart(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
static int Restart(pSICSOBJ self, SConnection *pCon, pHdb commandNode,
|
||||
pHdb par[], int nPar){
|
||||
pHdbQueue priv = (pHdbQueue)self->pPrivate;
|
||||
pHdb maxCurrent = NULL;
|
||||
|
||||
@ -323,17 +330,19 @@ static int Restart(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
NotifyHipadabaPar(maxCurrent,pCon);
|
||||
}
|
||||
|
||||
return Start(self,pCon,par,nPar);
|
||||
return Start(self,pCon,commandNode,par,nPar);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int Stop(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
static int Stop(pSICSOBJ self, SConnection *pCon, pHdb commandNode,
|
||||
pHdb par[], int nPar){
|
||||
pHdbQueue priv = (pHdbQueue)self->pPrivate;
|
||||
|
||||
priv->iStop = 1;
|
||||
return 1;
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int Move(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
static int Move(pSICSOBJ self, SConnection *pCon, pHdb commandNode,
|
||||
pHdb par[], int nPar){
|
||||
pHdb moveNode = NULL;
|
||||
pHdb insertNode = NULL;
|
||||
pHdb prevNode = NULL, queueNode = NULL;
|
||||
|
28
hipadaba.c
28
hipadaba.c
@ -401,7 +401,7 @@ hdbValue MakeHdbIntArray(int length, int *data){
|
||||
return result;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
hdbValue MakeHdbFloatArrray(int length, double *data){
|
||||
hdbValue MakeHdbFloatArray(int length, double *data){
|
||||
hdbValue result;
|
||||
|
||||
result.dataType = HIPFLOATAR;
|
||||
@ -411,6 +411,10 @@ hdbValue MakeHdbFloatArrray(int length, double *data){
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
void ReleaseHdbValue(hdbValue *v){
|
||||
|
||||
if(v->doNotFree == 1){
|
||||
return;
|
||||
}
|
||||
switch(v->dataType){
|
||||
case HIPTEXT:
|
||||
if(v->v.text != NULL){
|
||||
@ -871,10 +875,30 @@ void InternalRemoveHipadabaCallback(pHdb root, int internalID){
|
||||
}
|
||||
}
|
||||
/*=================== parameter interface ====================================*/
|
||||
static int canCopy(hdbValue *source, hdbValue *target){
|
||||
if(target->dataType == HIPINTVARAR) {
|
||||
if(source->dataType == HIPINTAR ||
|
||||
source->dataType == HIPINTVARAR){
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if(target->dataType == HIPFLOATVARAR) {
|
||||
if(source->dataType == HIPFLOATAR ||
|
||||
source->dataType == HIPFLOATVARAR){
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if(source->dataType != target->dataType){
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int copyHdbValue(hdbValue *source, hdbValue *target){
|
||||
int i;
|
||||
|
||||
if(source->dataType != target->dataType){
|
||||
if(!canCopy(source,target)){
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -52,6 +52,7 @@
|
||||
typedef struct __hdbValue {
|
||||
int dataType;
|
||||
int arrayLength;
|
||||
int doNotFree;
|
||||
union __value {
|
||||
int intValue;
|
||||
double doubleValue;
|
||||
|
@ -204,7 +204,13 @@
|
||||
int i, int iStart, int iEnd, HistInt *lData)
|
||||
{
|
||||
iSet = 2;
|
||||
if(self->data->localBuffer == NULL){
|
||||
resizeBuffer(self->data);
|
||||
}
|
||||
iSetVal = lData[0];
|
||||
if(iEnd < getHMDataLength(self->data)){
|
||||
memcpy(self->data->localBuffer+iStart,lData,(iEnd - iStart)*sizeof(HistInt));
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
5
hkl.c
5
hkl.c
@ -52,7 +52,10 @@
|
||||
return 1;
|
||||
}
|
||||
fprintf(fd,"#Crystallographic Settings\n");
|
||||
fprintf(fd,"%s lambda %f\n",name, self->fLambda);
|
||||
if(self->iManual == 1)
|
||||
{
|
||||
fprintf(fd,"%s lambda %f\n",name, self->fLambda);
|
||||
}
|
||||
fprintf(fd,
|
||||
"%s setub %8.6f %8.6f %8.6f %8.6f %8.6f %8.6f %8.6f %8.6f %8.6f\n",
|
||||
name,
|
||||
|
15
lld_blob.c
15
lld_blob.c
@ -28,6 +28,21 @@ int LLDblobCreate( void )
|
||||
return LLDcreate( sizeof( struct BlobDesc ));
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
int LLDdeleteBlob(int List)
|
||||
{
|
||||
struct BlobDesc Blob ;
|
||||
int status;
|
||||
|
||||
status = LLDnodePtr2First(List);
|
||||
while(status == 1){
|
||||
LLDnodeDataTo( List, & Blob );
|
||||
free(Blob.data);
|
||||
status = LLDnodePtr2Next(List);
|
||||
}
|
||||
LLDdelete(List);
|
||||
return 1;
|
||||
}
|
||||
/* ---- LL blob node mangement ---------------------------------------- */
|
||||
|
||||
int LLDblobInsert( int List, void * Source, unsigned Size )
|
||||
|
@ -20,7 +20,8 @@
|
||||
int LLDblobCreate( void );
|
||||
/* returns list number to use or -1 on failure. */
|
||||
/* MUST be called before using a list of blobs. */
|
||||
|
||||
int LLDdeleteBlob(int List);
|
||||
/* deletes a list and all its data */
|
||||
/* ---- Node management --------------------------------------------------
|
||||
Functions changing current node pointer to the new node.
|
||||
A return value of -1 indicates a memory allocation problem.
|
||||
|
7
macro.c
7
macro.c
@ -70,6 +70,7 @@
|
||||
#include "servlog.h"
|
||||
#include "stringdict.h"
|
||||
#include "exeman.h"
|
||||
#include "nxcopy.h"
|
||||
|
||||
#define SICSERROR "005567SICS"
|
||||
/*----------------------------------------------------------------------------
|
||||
@ -301,7 +302,8 @@ static int ProtectedExec(ClientData clientData, Tcl_Interp *interp,
|
||||
/*--------------------------------------------------------------------------
|
||||
initialises a Tcl-Interpreter, installs SICS unknown mechanism and kills
|
||||
a few dangerous commands from the normal Tcl command set
|
||||
*/
|
||||
----------------------------------------------------------------------------*/
|
||||
extern int Nxinter_SafeInit(Tcl_Interp *pTcl); /* from Swig NeXus Tcl interface */
|
||||
|
||||
Tcl_Interp *MacroInit(SicsInterp *pSics)
|
||||
{
|
||||
@ -345,6 +347,9 @@ static int ProtectedExec(ClientData clientData, Tcl_Interp *interp,
|
||||
*/
|
||||
Tcl_CreateObjCommand(pInter,"exec",ProtectedExec,NULL,KillExec);
|
||||
|
||||
Nxinter_SafeInit(pInter);
|
||||
NXcopy_Init(pInter);
|
||||
|
||||
return pInter;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
3
make_gen
3
make_gen
@ -33,7 +33,8 @@ SOBJ = network.o ifile.o conman.o SCinter.o splitter.o passwd.o \
|
||||
sinfox.o sicslist.o cone.o hipadaba.o sicshipadaba.o statistics.o \
|
||||
moregress.o hdbcommand.o multicounter.o regresscter.o histregress.o \
|
||||
sicshdbadapter.o polldriv.o sicspoll.o statemon.o hmslave.o \
|
||||
nwatch.o asyncqueue.o asyncprotocol.o sicsobj.o hdbqueue.o
|
||||
nwatch.o asyncqueue.o asyncprotocol.o sicsobj.o hdbqueue.o\
|
||||
nxcopy.o nxinterhelper.o nxinter_wrap.o genericcontroller.o
|
||||
|
||||
MOTOROBJ = motor.o simdriv.o
|
||||
COUNTEROBJ = countdriv.o simcter.o counter.o
|
||||
|
@ -23,8 +23,8 @@ BINTARGET = bin
|
||||
EXTRA=nintf.o
|
||||
SUBLIBS = psi/libpsi.a psi/hardsup/libhlib.a matrix/libmatrix.a \
|
||||
psi/tecs/libtecsl.a
|
||||
LIBS = -L$(HDFROOT)/lib $(SUBLIBS) $(NILIB)\
|
||||
-ltcl8.3 $(HDFROOT)/lib/libhdf5.a \
|
||||
LIBS = -L$(HDFROOT)/lib $(SUBLIBS) $(NILIB)\
|
||||
-ltcl $(HDFROOT)/lib/libhdf5.a \
|
||||
$(HDFROOT)/lib/libmfhdf.a $(HDFROOT)/lib/libdf.a \
|
||||
$(HDFROOT)/lib/libjpeg.a -lsz $(HDFROOT)/lib/libjson.a \
|
||||
-ldl -lz -lmxml -lghttp -lm -lc
|
||||
|
@ -372,8 +372,7 @@ int MakeMultiCounter(SConnection *pCon, SicsInterp *pSics,
|
||||
pDriv->GetError = MultiCounterError;
|
||||
pDriv->TryAndFixIt = MultiCounterFix;
|
||||
pDriv->Set = MultiCounterSet;
|
||||
pDriv->Send
|
||||
= MultiCounterSend;
|
||||
pDriv->Send = MultiCounterSend;
|
||||
|
||||
/*
|
||||
assign interface functions
|
||||
|
3
napi5.c
3
napi5.c
@ -934,7 +934,7 @@ static void killAttVID(pNexusFile5 pFile, int vid){
|
||||
int rank;
|
||||
hsize_t myStart[H5S_MAX_RANK];
|
||||
hsize_t mySize[H5S_MAX_RANK];
|
||||
hsize_t size[1],maxdims[H5S_MAX_RANK];
|
||||
hsize_t size[H5S_MAX_RANK],maxdims[H5S_MAX_RANK];
|
||||
hid_t filespace,dataspace;
|
||||
|
||||
pFile = NXI5assert (fid);
|
||||
@ -948,6 +948,7 @@ static void killAttVID(pNexusFile5 pFile, int vid){
|
||||
{
|
||||
myStart[i] = iStart[i];
|
||||
mySize[i] = iSize[i];
|
||||
size[i] = iSize[i];
|
||||
}
|
||||
iRet = H5Sget_simple_extent_dims(pFile->iCurrentS, NULL, maxdims);
|
||||
dataspace = H5Screate_simple (rank, mySize, NULL);
|
||||
|
@ -273,6 +273,13 @@
|
||||
/* install telnet port */
|
||||
InstallTelnet();
|
||||
|
||||
/* If the restore file has not been loaded, do so now */
|
||||
if(!hasRestored())
|
||||
{
|
||||
strcpy(pBueffel,"restore");
|
||||
SCInvoke(self->dummyCon,self->pSics,pBueffel);
|
||||
}
|
||||
|
||||
/* exit handlers need to be installed here */
|
||||
atexit(StopExit);
|
||||
Fortify_CheckAllMemory();
|
||||
|
294
nxcopy.c
Normal file
294
nxcopy.c
Normal file
@ -0,0 +1,294 @@
|
||||
/**
|
||||
* This defines a couple of Tcl functions which allow to copy data from the
|
||||
* nxdataset's returned from the swig Tcl interface to NeXus files into
|
||||
* SICS data structures.
|
||||
*
|
||||
* copyright: see file COPYRIGHT
|
||||
*
|
||||
* Mark Koennecke, October 2007
|
||||
*/
|
||||
#include <sics.h>
|
||||
#include "nxdataset.h"
|
||||
#include "sicshipadaba.h"
|
||||
#include "sicsdata.h"
|
||||
#include "nxcopy.h"
|
||||
#include "HistMem.h"
|
||||
/*-------------------------------------------------------------------------------
|
||||
* decode a SWIG style pointer into the real pointer value.
|
||||
* Stolen from SWIG generated code.
|
||||
--------------------------------------------------------------------------------*/
|
||||
static const char *SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
|
||||
register unsigned char *u = (unsigned char *) ptr;
|
||||
register const unsigned char *eu = u + sz;
|
||||
for (; u != eu; ++u) {
|
||||
register char d = *(c++);
|
||||
register unsigned char uu;
|
||||
if ((d >= '0') && (d <= '9'))
|
||||
uu = ((d - '0') << 4);
|
||||
else if ((d >= 'a') && (d <= 'f'))
|
||||
uu = ((d - ('a'-10)) << 4);
|
||||
else
|
||||
return (char *) 0;
|
||||
d = *(c++);
|
||||
if ((d >= '0') && (d <= '9'))
|
||||
uu |= (d - '0');
|
||||
else if ((d >= 'a') && (d <= 'f'))
|
||||
uu |= (d - ('a'-10));
|
||||
else
|
||||
return (char *) 0;
|
||||
*u = uu;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
/*-------------------------------------------------------------------------------*/
|
||||
int isTypeAllowed(int type){
|
||||
switch(type){
|
||||
case NX_INT32:
|
||||
case NX_UINT32:
|
||||
case NX_FLOAT32:
|
||||
return 1;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------------
|
||||
* copy an nxdataset to a sicsdata object
|
||||
--------------------------------------------------------------------------------*/
|
||||
static int NXDataToSicsdata(ClientData clientData, Tcl_Interp *interp,
|
||||
int objc, Tcl_Obj *CONST objv[]){
|
||||
Tcl_Obj *resultPtr;
|
||||
const char *text;
|
||||
pNXDS data = NULL;
|
||||
pSICSData sicsData;
|
||||
int length, i;
|
||||
|
||||
if(objc < 3) {
|
||||
Tcl_WrongNumArgs(interp,objc,objv,"Usage: nxdatatosicsdata nxdata sicsdata");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
resultPtr = Tcl_GetObjResult(interp);
|
||||
|
||||
/*
|
||||
* get nxdataset pointer
|
||||
*/
|
||||
text = Tcl_GetStringFromObj(objv[1],NULL);
|
||||
if(strstr(text,"NULL") != NULL){
|
||||
Tcl_SetStringObj(resultPtr,"nxdata argument is NULL pointer",38);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
text++;
|
||||
SWIG_UnpackData(text,&data,sizeof(void *));
|
||||
|
||||
if(data->magic != MAGIC){
|
||||
Tcl_SetStringObj(resultPtr,"nxdata argument is no valid nxdataset",
|
||||
strlen("nxdata argument is no valid nxdataset"));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
length = getNXDatasetLength(data);
|
||||
if(!isTypeAllowed(data->type)){
|
||||
Tcl_SetStringObj(resultPtr,"can only copy int and float types",
|
||||
strlen("can only copy int and float types"));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
* locate sicsdata
|
||||
*/
|
||||
text = Tcl_GetStringFromObj(objv[2],NULL);
|
||||
sicsData = (pSICSData)FindCommandData(pServ->pSics,(char *)text,"SICSData");
|
||||
if(sicsData == NULL){
|
||||
Tcl_SetStringObj(resultPtr,"sicsdata argument is no valid SICSData",
|
||||
strlen("sicsdata argument is no valid SICSData"));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
* copy the data
|
||||
*/
|
||||
if(data->type == NX_FLOAT32){
|
||||
for(i = 0; i < length; i++){
|
||||
setSICSDataFloat(sicsData,i,data->u.fPtr[i]);
|
||||
}
|
||||
} else {
|
||||
for(i = 0; i < length; i++){
|
||||
setSICSDataInt(sicsData,i,data->u.iPtr[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return TCL_OK;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static hdbValue NXDatasetToHdbValue(pNXDS data){
|
||||
hdbValue val;
|
||||
int length, i;
|
||||
|
||||
length = getNXDatasetLength(data);
|
||||
switch(getNXDatasetType(data)){
|
||||
case NX_INT32:
|
||||
case NX_UINT32:
|
||||
if(length == 1){
|
||||
val = MakeHdbInt(data->u.iPtr[0]);
|
||||
} else {
|
||||
val = MakeHdbIntArray(length,data->u.iPtr);
|
||||
val.dataType = HIPINTVARAR;
|
||||
}
|
||||
break;
|
||||
case NX_FLOAT32:
|
||||
if(length == 1){
|
||||
val = MakeHdbFloat((double)data->u.fPtr[0]);
|
||||
} else {
|
||||
val = makeHdbValue(HIPFLOATAR,length);
|
||||
for(i = 0; i < length; i++){
|
||||
val.v.floatArray[i] = (double)data->u.fPtr[i];
|
||||
}
|
||||
val.dataType = HIPFLOATVARAR;
|
||||
}
|
||||
break;
|
||||
case NX_FLOAT64:
|
||||
if(length == 1){
|
||||
val = MakeHdbFloat(data->u.dPtr[0]);
|
||||
} else {
|
||||
val = MakeHdbFloatArray(length,data->u.dPtr);
|
||||
}
|
||||
break;
|
||||
case NX_CHAR:
|
||||
case NX_INT8:
|
||||
case NX_UINT8:
|
||||
val = MakeHdbText(data->u.cPtr);
|
||||
break;
|
||||
case NX_INT16:
|
||||
case NX_UINT16:
|
||||
if(length == 1){
|
||||
val = MakeHdbInt((int)data->u.sPtr[0]);
|
||||
} else {
|
||||
val = makeHdbValue(HIPINTAR,length);
|
||||
for(i = 0; i < length; i++){
|
||||
val.v.intArray[i] = (int)data->u.sPtr[i];
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return val;
|
||||
}
|
||||
/*---------------------------------------------------------------------------
|
||||
* copy the content of an nxdataset onto a Hipadaba node
|
||||
*---------------------------------------------------------------------------*/
|
||||
static int NXDataToHdbNode(ClientData clientData, Tcl_Interp *interp,
|
||||
int objc, Tcl_Obj *CONST objv[]){
|
||||
pNXDS data = NULL;
|
||||
Tcl_Obj *resultPtr;
|
||||
int length, status;
|
||||
const char *text;
|
||||
pHdb node = NULL;
|
||||
hdbValue val;
|
||||
|
||||
if(objc < 3) {
|
||||
Tcl_WrongNumArgs(interp,objc,objv,"Usage: nxdatatohdb nxdata path");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
resultPtr = Tcl_GetObjResult(interp);
|
||||
|
||||
/*
|
||||
* get nxdataset pointer
|
||||
*/
|
||||
text = Tcl_GetStringFromObj(objv[1],NULL);
|
||||
if(strstr(text,"NULL") != NULL){
|
||||
Tcl_SetStringObj(resultPtr,"nxdata argument is NULL pointer",38);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
text++;
|
||||
SWIG_UnpackData(text,&data,sizeof(void *));
|
||||
|
||||
if(data->magic != MAGIC){
|
||||
Tcl_SetStringObj(resultPtr,"nxdata argument is no valid nxdataset",
|
||||
strlen("nxdata argument is no valid nxdataset"));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
length = getNXDatasetLength(data);
|
||||
|
||||
/*
|
||||
* locate node
|
||||
*/
|
||||
text = Tcl_GetStringFromObj(objv[2],NULL);
|
||||
node = GetHipadabaNode(GetHipadabaRoot(),(char *)text);
|
||||
if(node == NULL){
|
||||
Tcl_SetStringObj(resultPtr,"path does not point to a valid node",
|
||||
strlen("path does not point to a valid node"));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
val = NXDatasetToHdbValue(data);
|
||||
status = UpdateHipadabaPar(node,val,NULL);
|
||||
if(status != 1){
|
||||
Tcl_SetStringObj(resultPtr,"data type mismatch",
|
||||
strlen("data type mismatch"));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int NXDataToHM(ClientData clientData, Tcl_Interp *interp,
|
||||
int objc, Tcl_Obj *CONST objv[]){
|
||||
pNXDS data = NULL;
|
||||
Tcl_Obj *resultPtr;
|
||||
int length, status;
|
||||
const char *text;
|
||||
pHistMem pHM = NULL;
|
||||
SConnection *pCon = NULL;
|
||||
|
||||
if(objc < 3) {
|
||||
Tcl_WrongNumArgs(interp,objc,objv,"Usage: nxdatatohdb nxdata path");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
resultPtr = Tcl_GetObjResult(interp);
|
||||
|
||||
/*
|
||||
* get nxdataset pointer
|
||||
*/
|
||||
text = Tcl_GetStringFromObj(objv[1],NULL);
|
||||
if(strstr(text,"NULL") != NULL){
|
||||
Tcl_SetStringObj(resultPtr,"nxdata argument is NULL pointer",38);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
text++;
|
||||
SWIG_UnpackData(text,&data,sizeof(void *));
|
||||
|
||||
if(data->magic != MAGIC){
|
||||
Tcl_SetStringObj(resultPtr,"nxdata argument is no valid nxdataset",
|
||||
strlen("nxdata argument is no valid nxdataset"));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
length = getNXDatasetLength(data);
|
||||
|
||||
/*
|
||||
* get HM
|
||||
*/
|
||||
text = Tcl_GetStringFromObj(objv[2],NULL);
|
||||
pHM = (pHistMem)FindCommandData(pServ->pSics,(char *)text,"HistMem");
|
||||
if(pHM == NULL){
|
||||
Tcl_SetStringObj(resultPtr,"hm argument is not histogram memory",
|
||||
strlen("hm argument is not histogram memory"));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
if(getNXDatasetType(data) != NX_INT32 || GetHistLength(pHM) < length){
|
||||
Tcl_SetStringObj(resultPtr,"data to hm type or length mismatch",
|
||||
strlen("data to hm type or length mismatch"));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
pCon = SCCreateDummyConnection(pServ->pSics);
|
||||
SetHistogram(pHM, pCon, 0,0,length, data->u.iPtr);
|
||||
SCDeleteConnection(pCon);
|
||||
|
||||
return TCL_OK;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int NXcopy_Init(Tcl_Interp *pInter){
|
||||
Tcl_CreateObjCommand(pInter,"nxToSicsData",NXDataToSicsdata,NULL,NULL);
|
||||
Tcl_CreateObjCommand(pInter,"nxToHdb",NXDataToHdbNode,NULL,NULL);
|
||||
Tcl_CreateObjCommand(pInter,"nxToHM",NXDataToHM,NULL,NULL);
|
||||
return 1;
|
||||
}
|
16
nxcopy.h
Normal file
16
nxcopy.h
Normal file
@ -0,0 +1,16 @@
|
||||
/**
|
||||
* This defines a couple of Tcl functions which allow to copy data from the
|
||||
* nxdataset's returned from the swig Tcl interface to NeXus files into
|
||||
* SICS data structures.
|
||||
*
|
||||
* copyright: see file COPYRIGHT
|
||||
*
|
||||
* Mark Koennecke, October 2007
|
||||
*/
|
||||
#ifndef NXCOPY_H_
|
||||
#define NXCOPY_H_
|
||||
#include <tcl.h>
|
||||
|
||||
int NXcopy_Init(Tcl_Interp *pTcl);
|
||||
|
||||
#endif /*NXCOPY_H_*/
|
3516
nxinter_wrap.c
Normal file
3516
nxinter_wrap.c
Normal file
File diff suppressed because it is too large
Load Diff
561
nxinterhelper.c
Normal file
561
nxinterhelper.c
Normal file
@ -0,0 +1,561 @@
|
||||
/*
|
||||
This is a library of support functions and data structures which can be
|
||||
used in order to create interfaces between the NeXus-API and scripting
|
||||
languages or data analysis systems with a native code interface.
|
||||
|
||||
copyright: GPL
|
||||
|
||||
Mark Koennecke, October 2002
|
||||
Mark Koennecke, November 2002
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include "nxinterhelper.h"
|
||||
#include "nxdataset.h"
|
||||
/*-----------------------------------------------------------------
|
||||
An own error handler. nx_getlasterror will return the test of
|
||||
the last NeXus error.
|
||||
--------------------------------------------------------------------*/
|
||||
static char errorText[256]= "";
|
||||
|
||||
static void nxinterError(void *pData, char *error){
|
||||
strncpy(errorText,error,255);
|
||||
}
|
||||
/*-----------------------------------------------------------------------*/
|
||||
char *nx_getlasterror(void){
|
||||
return strdup(errorText);
|
||||
}
|
||||
/*-------------------- opening and closing -------------------------------*/
|
||||
void *nx_open(char *filename, int accessMethod){
|
||||
NXhandle handle = NULL;
|
||||
int status;
|
||||
|
||||
NXMSetError(NULL,nxinterError);
|
||||
status = NXopen(filename,(NXaccess)accessMethod, &handle);
|
||||
if(status == NX_OK){
|
||||
return handle;
|
||||
}else{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
/*------------------------------------------------------------------------*/
|
||||
void *nx_flush(void *hundle){
|
||||
NXhandle handle;
|
||||
int status;
|
||||
|
||||
handle = (NXhandle)hundle;
|
||||
status = NXflush(&handle);
|
||||
if(status == NX_OK){
|
||||
return handle;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------*/
|
||||
void nx_close(void *hundle){
|
||||
NXhandle handle;
|
||||
|
||||
handle = (NXhandle)hundle;
|
||||
NXclose(&handle);
|
||||
}
|
||||
/*=================== group handling functions ========================*/
|
||||
int nx_makegroup(void *handle, char *name, char *nxclass){
|
||||
int status;
|
||||
NXhandle hfil;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
status = NXmakegroup(hfil,name, nxclass);
|
||||
if(status == NX_OK){
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------*/
|
||||
int nx_opengroup(void *handle, char *name, char *nxclass){
|
||||
int status;
|
||||
NXhandle hfil;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
status = NXopengroup(hfil,name, nxclass);
|
||||
if(status == NX_OK){
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------*/
|
||||
int nx_openpath(void *handle, char *path){
|
||||
int status;
|
||||
NXhandle hfil;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
status = NXopenpath(hfil,path);
|
||||
if(status == NX_OK){
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------*/
|
||||
int nx_opengrouppath(void *handle, char *path){
|
||||
int status;
|
||||
NXhandle hfil;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
status = NXopengrouppath(hfil,path);
|
||||
if(status == NX_OK){
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------*/
|
||||
int nx_closegroup(void *handle){
|
||||
int status;
|
||||
NXhandle hfil;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
status = NXclosegroup(hfil);
|
||||
if(status == NX_OK){
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/*-------------------------------------------------------------------*/
|
||||
char *nx_getnextentry(void *handle, char separator){
|
||||
int status, length, type;
|
||||
NXhandle hfil;
|
||||
char *resultBuffer = NULL;
|
||||
NXname group,nxclass;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
status = NXgetnextentry(hfil,group, nxclass,&type);
|
||||
if(status == NX_OK){
|
||||
length = 30 + strlen(group) + strlen(nxclass);
|
||||
/*
|
||||
This introduces a memory leak. I had hoped, that swig would
|
||||
kill it for me after use, but I'am afraid, this is not the
|
||||
case. Unfortately I do not know how to fix the issue.
|
||||
*/
|
||||
resultBuffer = (char *)malloc(length*sizeof(char));
|
||||
if(resultBuffer == NULL){
|
||||
return NULL;
|
||||
}
|
||||
sprintf(resultBuffer,"%s%c%s%c%d",group,separator,nxclass,
|
||||
separator,type);
|
||||
return resultBuffer;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
/*-------------------------------------------------------------------*/
|
||||
void *nx_getgroupID(void *handle){
|
||||
int status;
|
||||
NXhandle hfil;
|
||||
NXlink *linki;
|
||||
|
||||
linki = (NXlink *)malloc(sizeof(NXlink));
|
||||
if(linki == NULL){
|
||||
return NULL;
|
||||
}
|
||||
hfil = (NXhandle)handle;
|
||||
status = NXgetgroupID(hfil,linki);
|
||||
if(status == NX_OK){
|
||||
return linki;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
/*------------------------------------------------------------------*/
|
||||
int nx_initgroupdir(void *handle){
|
||||
int status;
|
||||
NXhandle hfil;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
status = NXinitgroupdir(hfil);
|
||||
if(status == NX_OK){
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/*========================== dataset handling =======================*/
|
||||
int nx_makedata(void *ptr, char *name, int rank, int type,
|
||||
void *dimPtr){
|
||||
int status;
|
||||
NXhandle hfil;
|
||||
pNXDS dimData;
|
||||
|
||||
hfil = (NXhandle)ptr;
|
||||
dimData = (pNXDS)dimPtr;
|
||||
if(dimData->type != NX_INT32){
|
||||
NXIReportError(NULL,"ERROR: dimension data not integer");
|
||||
return 0;
|
||||
}
|
||||
status = NXmakedata(hfil, name, type, rank,
|
||||
dimData->u.iPtr);
|
||||
if(status == NX_OK){
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------*/
|
||||
int nx_compmakedata(void *ptr, char *name, int rank, int type,
|
||||
void *dimPtr, void *bufPtr){
|
||||
int status;
|
||||
NXhandle hfil;
|
||||
pNXDS dimData, bufData;
|
||||
|
||||
hfil = (NXhandle)ptr;
|
||||
dimData = (pNXDS)dimPtr;
|
||||
if(dimData->type != NX_INT32){
|
||||
NXIReportError(NULL,"ERROR: dimension data not integer");
|
||||
return 0;
|
||||
}
|
||||
bufData = (pNXDS)bufPtr;
|
||||
status = NXcompmakedata(hfil, name, type, rank,
|
||||
dimData->u.iPtr, NX_COMP_LZW,bufData->u.iPtr);
|
||||
if(status == NX_OK){
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------------*/
|
||||
int nx_opendata(void *handle, char *name){
|
||||
int status;
|
||||
NXhandle hfil;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
status = NXopendata(hfil,name);
|
||||
if(status == NX_OK){
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------------*/
|
||||
int nx_closedata(void *handle){
|
||||
int status;
|
||||
NXhandle hfil;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
status = NXclosedata(hfil);
|
||||
if(status == NX_OK){
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/*------------------------------------------------------------------------*/
|
||||
int nx_putslab(void *handle, void *dataset, void *startDim){
|
||||
int status;
|
||||
NXhandle hfil;
|
||||
pNXDS data;
|
||||
pNXDS start;
|
||||
int end[NX_MAXRANK], i;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
data = (pNXDS)dataset;
|
||||
start = (pNXDS)startDim;
|
||||
for(i = 0; i < data->rank;i++){
|
||||
end[i] = data->dim[i];
|
||||
}
|
||||
|
||||
status = NXputslab(hfil,data->u.ptr,start->u.iPtr,end);
|
||||
if(status == NX_OK){
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------*/
|
||||
void *nx_getslab(void *handle, void *startdim, void *sizedim){
|
||||
pNXDS resultdata;
|
||||
pNXDS start, size;
|
||||
int status, rank, type, dim[NX_MAXRANK];
|
||||
NXhandle hfil;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
start = (pNXDS)startdim;
|
||||
size = (pNXDS)sizedim;
|
||||
|
||||
/*
|
||||
get info first, then allocate data
|
||||
*/
|
||||
status = NXgetinfo(hfil, &rank,dim,&type);
|
||||
if(status != NX_OK){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
resultdata = createNXDataset(rank,type,size->u.iPtr);
|
||||
if(resultdata == NULL){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status = NXgetslab(hfil,resultdata->u.ptr,start->u.iPtr,
|
||||
size->u.iPtr);
|
||||
if(status == NX_OK){
|
||||
return resultdata;
|
||||
}else{
|
||||
dropNXDataset(resultdata);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
/*------------------------------------------------------------------------*/
|
||||
void *nx_getds(void *handle, char *name){
|
||||
pNXDS result = NULL;
|
||||
int rank, type,dim[NX_MAXRANK],status;
|
||||
NXhandle hfil;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
status = NXopendata(hfil,name);
|
||||
if(status != NX_OK){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status = NXgetinfo(hfil,&rank,dim,&type);
|
||||
if(status != NX_OK){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
result = createNXDataset(rank,type,dim);
|
||||
if(result == NULL){
|
||||
NXclosedata(hfil);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status = NXgetdata(hfil,result->u.ptr);
|
||||
if(result == NULL){
|
||||
NXclosedata(hfil);
|
||||
dropNXDataset(result);
|
||||
return NULL;
|
||||
}
|
||||
NXclosedata(hfil);
|
||||
return result;
|
||||
}
|
||||
/*----------------------------------------------------------------------*/
|
||||
int nx_putds(void *handle, char *name, void *dataset){
|
||||
NXhandle hfil;
|
||||
int status;
|
||||
pNXDS data;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
data = (pNXDS)dataset;
|
||||
|
||||
status = NXopendata(hfil,name);
|
||||
if(status != NX_OK){
|
||||
status = NXmakedata(hfil,name,data->type,data->rank,data->dim);
|
||||
if(status != NX_OK){
|
||||
return 0;
|
||||
}
|
||||
NXopendata(hfil,name);
|
||||
}
|
||||
|
||||
status = NXputdata(hfil,data->u.ptr);
|
||||
NXclosedata(hfil);
|
||||
if(status != NX_OK){
|
||||
return 0;
|
||||
}else{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*------------------------------------------------------------------------*/
|
||||
void *nx_getdata(void *handle){
|
||||
pNXDS result = NULL;
|
||||
int rank, type,dim[NX_MAXRANK],status;
|
||||
NXhandle hfil;
|
||||
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
status = NXgetinfo(hfil,&rank,dim,&type);
|
||||
if(status != NX_OK){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
result = createNXDataset(rank,type,dim);
|
||||
if(result == NULL){
|
||||
NXclosedata(hfil);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status = NXgetdata(hfil,result->u.ptr);
|
||||
if(result == NULL){
|
||||
dropNXDataset(result);
|
||||
return NULL;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
/*----------------------------------------------------------------------*/
|
||||
int nx_putdata(void *handle, void *dataset){
|
||||
NXhandle hfil;
|
||||
int status;
|
||||
pNXDS data;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
data = (pNXDS)dataset;
|
||||
|
||||
if(data == NULL){
|
||||
NXIReportError(NULL,"ERROR: NULL data pointer in nx_putdata");
|
||||
return 0;
|
||||
}
|
||||
|
||||
status = NXputdata(hfil,data->u.ptr);
|
||||
if(status != NX_OK){
|
||||
return 0;
|
||||
}else{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------------*/
|
||||
void *nx_getinfo(void *handle){
|
||||
NXhandle hfil;
|
||||
int status, type, rank, dim[NX_MAXRANK], rdim[1], i;
|
||||
pNXDS data = NULL;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
|
||||
status = NXgetinfo(handle,&rank,dim,&type);
|
||||
if(status != NX_OK){
|
||||
return NULL;
|
||||
}
|
||||
rdim[0] = 2 + rank;
|
||||
data = createNXDataset(1,NX_INT32,rdim);
|
||||
data->u.iPtr[0] = type;
|
||||
data->u.iPtr[1] = rank;
|
||||
for(i = 0; i < rank; i++){
|
||||
data->u.iPtr[2+i] = dim[i];
|
||||
}
|
||||
return data;
|
||||
}
|
||||
/*----------------------------------------------------------------------*/
|
||||
void *nx_getdataID(void *handle){
|
||||
NXhandle hfil;
|
||||
int status;
|
||||
NXlink *linki;
|
||||
|
||||
linki = (NXlink *)malloc(sizeof(NXlink));
|
||||
if(linki == NULL){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
status = NXgetdataID(hfil,linki);
|
||||
if(status == NX_OK){
|
||||
return linki;
|
||||
} else {
|
||||
free(linki);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
/*-------------------------------------------------------------------*/
|
||||
char *nx_getnextattr(void *handle, char separator){
|
||||
int status, length, type;
|
||||
char *result;
|
||||
NXhandle hfil;
|
||||
NXname aName;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
status = NXgetnextattr(hfil,aName, &length, &type);
|
||||
if(status == NX_OK){
|
||||
/*
|
||||
This introduces a memory leak. I had hoped, that swig would
|
||||
kill it for me after use, but I'am afraid, this is not the
|
||||
case. Unfortately I do not know how to fix the issue.
|
||||
*/
|
||||
result = (char *)malloc((20+strlen(aName))*sizeof(char));
|
||||
if(result == NULL){
|
||||
return NULL;
|
||||
}
|
||||
memset(result,0,(20+strlen(aName))*sizeof(char));
|
||||
sprintf(result,"%s%c%d%c%d", aName,separator,
|
||||
length,separator,type);
|
||||
return result;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
/*-------------------------------------------------------------------*/
|
||||
int nx_putattr(void *handle, char *name, void *ds){
|
||||
int status;
|
||||
NXhandle hfil;
|
||||
pNXDS data;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
data = (pNXDS)ds;
|
||||
status = NXputattr(hfil,name,data->u.ptr,data->dim[0],data->type);
|
||||
if(status == NX_OK){
|
||||
return 1;
|
||||
}else{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/*-------------------------------------------------------------------*/
|
||||
void *nx_getattr(void *handle, char *name, int type, int length){
|
||||
NXhandle hfil;
|
||||
int status, tp, ll, dim[1];
|
||||
pNXDS data = NULL;
|
||||
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
|
||||
/*
|
||||
prepare dataset
|
||||
*/
|
||||
dim[0] = length+1;
|
||||
data = createNXDataset(1,type,dim);
|
||||
if(data == NULL){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
finally read the real data
|
||||
*/
|
||||
ll = length;
|
||||
tp = type;
|
||||
status = NXgetattr(hfil,name,data->u.ptr,&ll,&tp);
|
||||
if(status != NX_OK){
|
||||
dropNXDataset(data);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
/*-----------------------------------------------------------------------*/
|
||||
int nx_makelink(void *handle, void *link){
|
||||
NXhandle hfil;
|
||||
NXlink* lk;
|
||||
int status;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
lk = (NXlink *)link;
|
||||
|
||||
status = NXmakelink(hfil,lk);
|
||||
if(status == NX_OK){
|
||||
return 1;
|
||||
}else{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------*/
|
||||
int nx_opensourcegroup(void *handle){
|
||||
NXhandle hfil;
|
||||
int status;
|
||||
|
||||
hfil = (NXhandle)handle;
|
||||
|
||||
status = NXopensourcegroup(hfil);
|
||||
if(status == NX_OK){
|
||||
return 1;
|
||||
}else{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
68
nxinterhelper.h
Normal file
68
nxinterhelper.h
Normal file
@ -0,0 +1,68 @@
|
||||
/*
|
||||
This is a library of support functions and data structures which can be
|
||||
used in order to create interfaces between the NeXus-API and scripting
|
||||
languages or data analysis systems with a native code interface.
|
||||
|
||||
copyright: GPL
|
||||
|
||||
Mark Koennecke, October 2002
|
||||
*/
|
||||
|
||||
#ifndef NXINTERHELPER
|
||||
#define NXINTERHELPER
|
||||
|
||||
#include <napi.h>
|
||||
|
||||
/*------------- opening and closing section ---------------------*/
|
||||
void *nx_open(char *filename, int accessMethod);
|
||||
void *nx_flush(void *handle);
|
||||
void nx_close(void *handle);
|
||||
/*--------------- group handling section ------------------------*/
|
||||
int nx_makegroup(void *handle, char *name, char *nxclass);
|
||||
int nx_opengroup(void *handle, char *name, char *nxclass);
|
||||
int nx_opengrouppath(void *handle, char *path);
|
||||
int nx_openpath(void *handle, char *path);
|
||||
int nx_closegroup(void *handle);
|
||||
char *nx_getnextentry(void *handle, char separator);
|
||||
void *nx_getgroupID(void *handle);
|
||||
int nx_initgroupdir(void *handle);
|
||||
|
||||
/*---------------- dataset handling -----------------------------*/
|
||||
int nx_makedata(void *ptr, char *name, int rank, int type, void *dimPtr);
|
||||
int nx_compmakedata(void *ptr, char *name, int rank, int type,
|
||||
void *dimPtr, void *bufPtr);
|
||||
|
||||
int nx_opendata(void *handle, char *name);
|
||||
int nx_closedata(void *handle);
|
||||
|
||||
int nx_putslab(void *handle, void *dataset, void *startDim);
|
||||
void *nx_getslab(void *handle, void *startdim, void *size);
|
||||
|
||||
void *nx_getds(void *handle, char *name);
|
||||
int nx_putds(void *handle, char *name, void *dataset);
|
||||
|
||||
void *nx_getdata(void *handle);
|
||||
int nx_putdata(void *handle,void *dataset);
|
||||
|
||||
void *nx_getinfo(void *handle);
|
||||
void *nx_getdataID(void *handle);
|
||||
|
||||
/*-------------------- attributes --------------------------------*/
|
||||
char *nx_getnextattr(void *handle, char separator);
|
||||
int nx_putattr(void *handle, char *name, void *ds);
|
||||
void *nx_getattr(void *handle, char *name, int type, int length);
|
||||
|
||||
|
||||
/*---------------------- link -----------------------------------*/
|
||||
int nx_makelink(void *handle, void *link);
|
||||
int nx_opensourcegroup(void *handle);
|
||||
/*----------------- error handling -----------------------------*/
|
||||
char *nx_getlasterror(void);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
9
ofac.c
9
ofac.c
@ -126,6 +126,7 @@
|
||||
#include "asyncprotocol.h"
|
||||
#include "sicsobj.h"
|
||||
#include "hdbqueue.h"
|
||||
#include "genericcontroller.h"
|
||||
/*----------------------- Server options creation -------------------------*/
|
||||
static int IFServerOption(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[])
|
||||
@ -231,8 +232,6 @@
|
||||
AddCommand(pInter,"status", UserStatus,NULL,NULL);
|
||||
AddCommand(pInter,"ResetServer",ResetStatus,NULL,NULL);
|
||||
AddCommand(pInter,"Dir",ListObjects,NULL,NULL);
|
||||
AddCommand(pInter,"Backup",BackupStatus,NULL,NULL);
|
||||
AddCommand(pInter,"Restore",RestoreStatus,NULL,NULL);
|
||||
AddCommand(pInter,"SetInt", SetSICSInterrupt,NULL,NULL);
|
||||
AddCommand(pInter,"GetInt",GetSICSInterrupt,NULL,NULL);
|
||||
AddCommand(pInter,"SICSType",SICSType,NULL,NULL);
|
||||
@ -345,6 +344,8 @@
|
||||
AddCommand(pInter,"MakeAsyncQueue",AsyncQueueFactory,NULL,NULL);
|
||||
AddCommand(pInter,"MakeSicsObj",InstallSICSOBJ,NULL,NULL);
|
||||
AddCommand(pInter,"MakeHdbQueue",MakeHDBQueue,NULL,NULL);
|
||||
AddCommand(pInter,"MakeGenController",GenControllerFactory,NULL,NULL);
|
||||
AddCommand(pInter,"genconfigure",GenControllerConfigure,NULL,NULL);
|
||||
|
||||
/*
|
||||
install site specific commands
|
||||
@ -417,7 +418,8 @@
|
||||
RemoveCommand(pSics,"MakeAsyncQueue");
|
||||
RemoveCommand(pSics,"MakeAsyncProtocol");
|
||||
RemoveCommand(pSics,"MakeSicsObject");
|
||||
RemoveCommand(pSics,"MakeHdbQueue");
|
||||
RemoveCommand(pSics,"MakeGenController");
|
||||
RemoveCommand(pSics,"genconfigure");
|
||||
/*
|
||||
remove site specific installation commands
|
||||
*/
|
||||
@ -459,6 +461,7 @@
|
||||
}
|
||||
MakeExeManager(pCon,pSics,NULL,1, NULL);
|
||||
InitIniCommands(pSics,pServ->pTasker);
|
||||
InstallBckRestore(pCon,pSics);
|
||||
|
||||
pCon->iFiles = 0;
|
||||
|
||||
|
@ -47,12 +47,10 @@ static int pollHdb(struct __POLLDRIV *self, SConnection *pCon){
|
||||
/*-----------------------------------------------------------------------*/
|
||||
static pPollDriv makeHdbDriver(SConnection *pCon, char *objectIdentifier,
|
||||
int argc, char *argv[]){
|
||||
pHdb root = NULL, node = NULL;
|
||||
pHdb node = NULL;
|
||||
pPollDriv pNew = NULL;
|
||||
|
||||
root = GetHipadabaRoot();
|
||||
assert(root != NULL);
|
||||
node = GetHipadabaNode(root,objectIdentifier);
|
||||
node = locateSICSNode(pServ->pSics,pCon,objectIdentifier);
|
||||
if(node == NULL){
|
||||
SCWrite(pCon,"ERROR: object to poll not found",eError);
|
||||
return 0;
|
||||
|
@ -43,12 +43,10 @@ static int pollHdb(struct __POLLDRIV *self, SConnection *pCon){
|
||||
/*-----------------------------------------------------------------------*/
|
||||
static pPollDriv makeHdbDriver(SConnection *pCon, char *objectIdentifier,
|
||||
int argc, char *argv[]){
|
||||
pHdb root = NULL, node = NULL;
|
||||
pHdb node = NULL;
|
||||
pPollDriv pNew = NULL;
|
||||
|
||||
root = GetHipadabaRoot();
|
||||
assert(root != NULL);
|
||||
node = GetHipadabaNode(root,objectIdentifier);
|
||||
node = locateSICSNode(pServ->pSics,pCon,objectIdentifier);
|
||||
if(node == NULL){
|
||||
SCWrite(pCon,"ERROR: object to poll not found",eError);
|
||||
return 0;
|
||||
|
8
selvar.c
8
selvar.c
@ -163,6 +163,7 @@
|
||||
static int CheckVal(void *pSelf, SConnection *pCon )
|
||||
{
|
||||
pSelVar self = NULL;
|
||||
int status;
|
||||
|
||||
self = (pSelVar)pSelf;
|
||||
assert(self);
|
||||
@ -173,7 +174,12 @@
|
||||
|
||||
self->pCon = pCon;
|
||||
InvokeCallBack(self->pCall, WLCHANGE, self);
|
||||
return MonoCheck(self->pSel,pCon);
|
||||
status = MonoCheck(self->pSel,pCon);
|
||||
if(status != HWBusy)
|
||||
{
|
||||
InvokeCallBack(self->pCall, WLCHANGE, self);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
/*------------------------------------------------------------------------*/
|
||||
static int HaltSelVar(void *pSelf)
|
||||
|
@ -315,6 +315,7 @@ static pHdb MakeHMDataNode(pHistMem pHM, char *name){
|
||||
if(node == NULL){
|
||||
return NULL;
|
||||
}
|
||||
node->value.doNotFree = 1;
|
||||
pCall = MakeHipadabaCallback(HMDataGetCallback,pHM,NULL,-1,-1);
|
||||
if(pCall == NULL){
|
||||
return NULL;
|
||||
|
@ -27,7 +27,7 @@
|
||||
#include <splitter.h>
|
||||
#include "sicsobj.h"
|
||||
|
||||
/*== there can be only hipadaba in SICS, some globals to care for that == */
|
||||
/*== there can be only one hipadaba in SICS, some globals to care for that == */
|
||||
static pHdb root = NULL;
|
||||
static pSicsPoll poller = NULL;
|
||||
typedef enum {
|
||||
@ -173,7 +173,7 @@ static int SICSFuncCallback(void *userData, void *callData, pHdb node,
|
||||
}
|
||||
func = (SICSOBJFunc)node->value.v.obj;
|
||||
if(func != NULL){
|
||||
return func((pSICSOBJ)userData,(SConnection *)callData, par,nPar);
|
||||
return func((pSICSOBJ)userData,(SConnection *)callData, node, par,nPar);
|
||||
} else {
|
||||
printf("Great Badness in calling SICSFuncCallback\n");
|
||||
return 0;
|
||||
@ -1241,7 +1241,7 @@ int ProcessSICSHdbPar(pHdb root, SConnection *pCon,
|
||||
SCWrite(pCon,"ERROR: out of memory reading parameter data",eError);
|
||||
return 0;
|
||||
}
|
||||
DynStringInsert(parData," =", 0);
|
||||
DynStringInsert(parData," = ", 0);
|
||||
DynStringInsert(parData,argv[0],0);
|
||||
if(printPrefix != NULL){
|
||||
DynStringInsert(parData,printPrefix,0);
|
||||
@ -1521,7 +1521,7 @@ static char *hdbTypes[] = {"none",
|
||||
"func",
|
||||
NULL};
|
||||
/*-------------------------------------------------------------------------*/
|
||||
static int convertHdbType(char *text){
|
||||
int convertHdbType(char *text){
|
||||
int type;
|
||||
|
||||
type = 0;
|
||||
@ -1594,7 +1594,7 @@ static int MakeHdbNode(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
if(strlen(pPtr) < 1) {
|
||||
parent = root;
|
||||
} else {
|
||||
parent = GetHipadabaNode(root,buffer);
|
||||
parent = locateSICSNode(pSics,pCon,buffer);
|
||||
}
|
||||
if(parent == NULL){
|
||||
snprintf(buffer2,512,"ERROR: parent %s for new node does not exist",
|
||||
@ -1672,7 +1672,7 @@ static int MakeHdbScriptNode(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
if(strlen(pPtr) < 1) {
|
||||
parent = root;
|
||||
} else {
|
||||
parent = GetHipadabaNode(root,buffer);
|
||||
parent = locateSICSNode(pSics,pCon,buffer);
|
||||
}
|
||||
if(parent == NULL){
|
||||
snprintf(buffer2,512,"ERROR: parent %s for new node does not exist",
|
||||
@ -1742,7 +1742,7 @@ static int DeleteHdbNode(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static pHdb locateSICSNode(SicsInterp *pSics, SConnection *pCon, char *path){
|
||||
pHdb locateSICSNode(SicsInterp *pSics, SConnection *pCon, char *path){
|
||||
pHdb result = NULL;
|
||||
char *pPtr = NULL, sicsObj[128], error[256];
|
||||
pDummy pDum = NULL;
|
||||
@ -1840,9 +1840,11 @@ static int UpdateHdbNode(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
char error[512];
|
||||
int i, status;
|
||||
|
||||
/*
|
||||
if(!SCMatchRights(pCon,usUser)){
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
|
||||
if(argc < 2) {
|
||||
SCWrite(pCon,"ERROR: insufficient number of arguments to UpdateHdbNode",
|
||||
@ -1856,7 +1858,7 @@ static int UpdateHdbNode(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
}
|
||||
if(argc > 2){
|
||||
if(!cloneHdbValue(&targetNode->value,&newValue)){
|
||||
SCWrite(pCon,"ERROR: out of mmeory cloning node",
|
||||
SCWrite(pCon,"ERROR: out of memory cloning node",
|
||||
eError);
|
||||
return 0;
|
||||
}
|
||||
@ -1875,6 +1877,7 @@ static int UpdateHdbNode(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
SCWrite(pCon,error, eError);
|
||||
return 0;
|
||||
}
|
||||
DeleteDynString(parData);
|
||||
} else {
|
||||
memset(&newValue,0,sizeof(hdbValue));
|
||||
GetHipadabaPar(targetNode,&newValue,pCon);
|
||||
@ -1956,6 +1959,44 @@ static int GetHdbNode(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int GetHdbVal(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[]){
|
||||
pHdb targetNode = NULL;
|
||||
hdbValue newValue;
|
||||
pDynString parData = NULL;
|
||||
char error[512], oriPath[512];
|
||||
int i, status, protocol, outCode;
|
||||
char value[80];
|
||||
|
||||
if(argc < 2) {
|
||||
SCWrite(pCon,"ERROR: need path to node to print",eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
strncpy(oriPath,argv[1], 511);
|
||||
targetNode = locateSICSNode(pSics,pCon,argv[1]);
|
||||
if(targetNode == NULL){
|
||||
return 0;
|
||||
}
|
||||
memset(&newValue,0,sizeof(hdbValue));
|
||||
GetHipadabaPar(targetNode, &newValue, pCon);
|
||||
parData = formatValue(newValue);
|
||||
if(parData == NULL){
|
||||
SCWrite(pCon,"ERROR: out of memory formatting data",eError);
|
||||
return 0;
|
||||
} else {
|
||||
if ((protocol = isJSON(pCon)) == 1)
|
||||
outCode = eHdbEvent;
|
||||
else
|
||||
outCode = eEvent;
|
||||
SCWrite(pCon,GetCharArray(parData), outCode);
|
||||
DeleteDynString(parData);
|
||||
ReleaseHdbValue(&newValue);
|
||||
return 1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static int countChildren(pHdb node){
|
||||
pHdb current = NULL;
|
||||
@ -2539,7 +2580,7 @@ static int SicsCommandNode(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
if(strlen(pPtr) < 1) {
|
||||
parent = root;
|
||||
} else {
|
||||
parent = GetHipadabaNode(root,buffer);
|
||||
parent = locateSICSNode(pSics,pCon,buffer);
|
||||
}
|
||||
if(parent == NULL){
|
||||
snprintf(buffer2,512,"ERROR: parent %s for new node does not exist",
|
||||
@ -2607,18 +2648,42 @@ static int GetSICSHdbProperty(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
}
|
||||
targetNode = locateSICSNode(pSics,pCon,argv[1]);
|
||||
if(targetNode == NULL){
|
||||
SCWrite(pCon,"ERROR: node not found",eValue);
|
||||
SCWrite(pCon,"ERROR: node not found",eValue);
|
||||
return 0;
|
||||
}
|
||||
status = GetHdbProperty(targetNode,argv[2],buffer,511);
|
||||
if(status != 1){
|
||||
SCWrite(pCon,"ERROR: attribute not found",eValue);
|
||||
return 0;
|
||||
SCWrite(pCon,"ERROR: attribute not found",eValue);
|
||||
return 0;
|
||||
}
|
||||
SCPrintf(pCon,eValue,"%s.%s = %s", argv[1], argv[2], buffer);
|
||||
return 1;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static int GetSICSHdbPropertyVal(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[]){
|
||||
pHdb targetNode = NULL;
|
||||
char buffer[512];
|
||||
int status;
|
||||
|
||||
if(argc < 3) {
|
||||
SCWrite(pCon,"ERROR: need path key as parameters",eError);
|
||||
return 0;
|
||||
}
|
||||
targetNode = locateSICSNode(pSics,pCon,argv[1]);
|
||||
if(targetNode == NULL){
|
||||
SCWrite(pCon,"ERROR: node not found",eValue);
|
||||
return 0;
|
||||
}
|
||||
status = GetHdbProperty(targetNode,argv[2],buffer,511);
|
||||
if(status != 1){
|
||||
SCWrite(pCon,"ERROR: attribute not found",eValue);
|
||||
return 0;
|
||||
}
|
||||
SCPrintf(pCon,eValue,"%s", buffer);
|
||||
return 1;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static int ListSICSHdbProperty(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[]){
|
||||
pHdb targetNode = NULL;
|
||||
@ -2670,6 +2735,7 @@ int InstallSICSHipadaba(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
AddCommand(pSics,"hset", SetHdbNode, NULL, NULL);
|
||||
AddCommand(pSics,"hupdate", UpdateHdbNode, NULL, NULL);
|
||||
AddCommand(pSics,"hget", GetHdbNode, NULL, NULL);
|
||||
AddCommand(pSics,"hval", GetHdbVal, NULL, NULL);
|
||||
AddCommand(pSics,"hzipget",ZipGetHdbNode, NULL, NULL);
|
||||
AddCommand(pSics,"hlist", ListHdbNode, NULL, NULL);
|
||||
AddCommand(pSics,"hnotify", AutoNotifyHdbNode, NULL, NULL);
|
||||
@ -2681,6 +2747,7 @@ int InstallSICSHipadaba(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
AddCommand(pSics,"hcommand",SicsCommandNode, NULL, NULL);
|
||||
AddCommand(pSics,"hsetprop",SetSICSHdbProperty, NULL, NULL);
|
||||
AddCommand(pSics,"hgetprop",GetSICSHdbProperty, NULL, NULL);
|
||||
AddCommand(pSics,"hgetpropval",GetSICSHdbPropertyVal, NULL, NULL);
|
||||
AddCommand(pSics,"hlistprop",ListSICSHdbProperty, NULL, NULL);
|
||||
|
||||
InstallSICSPoll(pCon,pSics,pData,argc,argv);
|
||||
|
@ -280,6 +280,14 @@ int SICSHdbSetPar(void *obj, SConnection *pCon,
|
||||
*/
|
||||
int isSICSHdbRO(pHdb node);
|
||||
/*============= common SICS Interactions ===================================*/
|
||||
/**
|
||||
* locate a SICS Hdb node, thereby honouring the /sics/object/par syntax
|
||||
* @param pSics, the SICS interpreter
|
||||
* @param pCon A connection to report errors too
|
||||
* @param path The path to locate
|
||||
* @return The demanded node or NULL in case of failure
|
||||
*/
|
||||
pHdb locateSICSNode(SicsInterp *pSics, SConnection *pCon, char *path);
|
||||
/**
|
||||
* Install a SICS automatic notification callback on the node. This is
|
||||
* a default callback using the current connection with its current
|
||||
@ -352,6 +360,13 @@ pDynString formatValue(hdbValue v);
|
||||
* @return 0 on failure, 1 on success
|
||||
*/
|
||||
int readHdbValue(hdbValue *v, char *data, char *error, int errlen);
|
||||
/**
|
||||
* convert from test to a Hipadaba type
|
||||
* @param text The type text
|
||||
* @return The converted Hipadaba type
|
||||
*/
|
||||
int convertHdbType(char *text);
|
||||
|
||||
/*================= SICS Interpreter Interface ===========================*/
|
||||
/**
|
||||
* InstallHipadaba installs the Hipadaba commands into the SICS interpreter.
|
||||
|
110
sicsobj.c
110
sicsobj.c
@ -6,10 +6,15 @@
|
||||
* Mark Koennecke, July 2007
|
||||
*/
|
||||
#include <sics.h>
|
||||
#include <tcl.h>
|
||||
#include "assert.h"
|
||||
#include "ifile.h"
|
||||
#include "sicsobj.h"
|
||||
#include "dynstring.h"
|
||||
#include "macro.h"
|
||||
#include "sicshipadaba.h"
|
||||
|
||||
extern int decodeSICSPriv(char *txt); /* from access.c */
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static void DefaultKill(void *data){
|
||||
return;
|
||||
@ -92,10 +97,104 @@ static int invokeOBJFunction(pSICSOBJ object, pHdb commandNode, SConnection *pCo
|
||||
SCWrite(pCon,"ERROR: internal error, function not found",eError);
|
||||
return 0;
|
||||
}
|
||||
status = pFunc(object, pCon, parArray,count);
|
||||
status = pFunc(object, pCon, commandNode, parArray,count);
|
||||
return status;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int ScriptObjFunc(pSICSOBJ obj, SConnection *pCon, pHdb commandNode,
|
||||
pHdb par[], int nCount){
|
||||
int status, i;
|
||||
Tcl_Interp *pTcl = NULL;
|
||||
Tcl_DString com;
|
||||
char value[256];
|
||||
pDynString val = NULL;
|
||||
char *pPtr = NULL;
|
||||
|
||||
memset(value,0,256);
|
||||
GetHdbProperty(commandNode,"priv",value,256);
|
||||
status = decodeSICSPriv(value);
|
||||
if(!SCMatchRights(pCon,status)){
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(GetHdbProperty(commandNode,"script",value,256) != 1){
|
||||
SCWrite(pCon,"ERROR: script property not configured on this node",
|
||||
eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Tcl_DStringInit(&com);
|
||||
Tcl_DStringAppend(&com,value,strlen(value));
|
||||
for(i = 0; i < nCount; i++){
|
||||
val = formatValue(par[i]->value);
|
||||
if(val != NULL){
|
||||
Tcl_DStringAppend(&com," ", 1);
|
||||
pPtr = GetCharArray(val);
|
||||
Tcl_DStringAppend(&com,pPtr,strlen(pPtr));
|
||||
DeleteDynString(val);
|
||||
}
|
||||
}
|
||||
|
||||
MacroPush(pCon);
|
||||
pTcl = InterpGetTcl(pServ->pSics);
|
||||
status = Tcl_Eval(pTcl,Tcl_DStringValue(&com));
|
||||
Tcl_DStringFree(&com);
|
||||
MacroPop();
|
||||
|
||||
if(status == TCL_OK){
|
||||
SCWrite(pCon,Tcl_GetStringResult(pTcl),eValue);
|
||||
return 1;
|
||||
} else {
|
||||
SCWrite(pCon,Tcl_GetStringResult(pTcl),eError);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static int MakeScriptFunc(pSICSOBJ self, SConnection *pCon,
|
||||
int argc, char *argv[]){
|
||||
char path[512], *pPtr = NULL;
|
||||
pHdb parent = NULL, node = NULL;
|
||||
hdbValue func;
|
||||
|
||||
if(argc < 5){
|
||||
SCWrite(pCon,
|
||||
"ERROR: not enough arguments: obj makescriptfunc path script priv",
|
||||
eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(!SCMatchRights(pCon,usMugger)){
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
strncpy(path,argv[2],511);
|
||||
pPtr = strrchr(path,'/');
|
||||
if(pPtr == NULL){
|
||||
/* no hierarchy */
|
||||
parent = self->objectNode;
|
||||
node = MakeHipadabaNode(path,HIPFUNC,1);
|
||||
} else {
|
||||
/* hierarchy */
|
||||
*pPtr = '\0';
|
||||
parent = GetHipadabaNode(self->objectNode,path);
|
||||
pPtr++;
|
||||
node = MakeHipadabaNode(pPtr,HIPFUNC,1);
|
||||
}
|
||||
if(parent == NULL || node == NULL){
|
||||
SCWrite(pCon,"ERROR: root path error or out of memory",eError);
|
||||
return 0;
|
||||
}
|
||||
node->value.v.obj = ScriptObjFunc;
|
||||
SetHdbProperty(node,"script",argv[3]);
|
||||
SetHdbProperty(node,"priv",argv[4]);
|
||||
AppendHipadabaCallback(node,HCBSET,MakeSICSFuncCallback(self));
|
||||
AddHipadabaChild(parent,node,pCon);
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int InvokeSICSOBJ(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[]){
|
||||
pSICSOBJ self = NULL;
|
||||
@ -106,7 +205,7 @@ int InvokeSICSOBJ(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
self = (pSICSOBJ)pData;
|
||||
assert(self != NULL);
|
||||
|
||||
if(argc < 1){
|
||||
if(argc < 2){
|
||||
SCWrite(pCon,"ERROR: Nothing to process",eError);
|
||||
return -1;
|
||||
}
|
||||
@ -114,10 +213,15 @@ int InvokeSICSOBJ(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
if(parNode != NULL && parNode->value.dataType == HIPFUNC){
|
||||
status = invokeOBJFunction(self, parNode, pCon, argc-2, &argv[2]);
|
||||
} else {
|
||||
status = ProcessSICSHdbPar(self->objectNode,pCon, argv[0],
|
||||
strncpy(buffer,argv[0],130);
|
||||
strcat(buffer," ");
|
||||
status = ProcessSICSHdbPar(self->objectNode,pCon, buffer,
|
||||
argc-1,&argv[1]);
|
||||
}
|
||||
if(status == -1){
|
||||
if(strcmp(argv[1],"makescriptfunc") == 0) {
|
||||
return MakeScriptFunc(self,pCon,argc,argv);
|
||||
}
|
||||
snprintf(buffer,131,"ERROR: no command or parameter found for key: %s",
|
||||
argv[1]);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
|
@ -23,7 +23,7 @@ typedef struct {
|
||||
}SICSOBJ, *pSICSOBJ;
|
||||
/*-----------------------------------------------------------------------*/
|
||||
typedef int (*SICSOBJFunc)(pSICSOBJ self, SConnection *pCon,
|
||||
pHdb par[], int nPar);
|
||||
pHdb commandNode, pHdb par[], int nPar);
|
||||
/*======================= Live & Death =================================*/
|
||||
pSICSOBJ MakeSICSOBJ(char *name, char *class);
|
||||
void KillSICSOBJ(void *data);
|
||||
|
55
sicsstat.tcl
55
sicsstat.tcl
@ -1,7 +1,60 @@
|
||||
exe batchpath ./
|
||||
exe syspath ./
|
||||
sample
|
||||
sample setAccess 2
|
||||
title
|
||||
title setAccess 2
|
||||
user
|
||||
user setAccess 2
|
||||
email unknown
|
||||
email setAccess 2
|
||||
address unknown
|
||||
address setAccess 2
|
||||
fax unknown
|
||||
fax setAccess 2
|
||||
phone unknown
|
||||
phone setAccess 2
|
||||
# Motor som
|
||||
som sign 1.000000
|
||||
som SoftZero 0.000000
|
||||
som SoftLowerLim -180.000000
|
||||
som SoftUpperLim 180.000000
|
||||
som Fixed -1.000000
|
||||
som InterruptMode 0.000000
|
||||
som precision 0.010000
|
||||
som ignorefault 0.000000
|
||||
som AccessCode 2.000000
|
||||
som failafter 3.000000
|
||||
som maxretry 3.000000
|
||||
som movecount 10.000000
|
||||
# Motor stt
|
||||
stt sign 1.000000
|
||||
stt SoftZero 0.000000
|
||||
stt SoftLowerLim 0.000000
|
||||
stt SoftUpperLim 120.000000
|
||||
stt Fixed -1.000000
|
||||
stt InterruptMode 0.000000
|
||||
stt precision 0.010000
|
||||
stt ignorefault 0.000000
|
||||
stt AccessCode 2.000000
|
||||
stt failafter 3.000000
|
||||
stt maxretry 3.000000
|
||||
stt movecount 10.000000
|
||||
# Motor dth
|
||||
dth sign 1.000000
|
||||
dth SoftZero 0.000000
|
||||
dth SoftLowerLim 0.000000
|
||||
dth SoftUpperLim 200.000000
|
||||
dth Fixed -1.000000
|
||||
dth InterruptMode 0.000000
|
||||
dth precision 0.010000
|
||||
dth ignorefault 0.000000
|
||||
dth AccessCode 2.000000
|
||||
dth failafter 3.000000
|
||||
dth maxretry 3.000000
|
||||
dth movecount 10.000000
|
||||
# Counter counter
|
||||
counter SetPreset 3.000000
|
||||
counter SetPreset 1000.000000
|
||||
counter SetMode Timer
|
||||
hm CountMode timer
|
||||
hm preset 3.000000
|
||||
|
16
statemon.c
16
statemon.c
@ -320,7 +320,21 @@ int StateMonAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
SCRegister(pCon,pSics, self->pCall,lID);
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
}
|
||||
} else if(strcmp(argv[1],"start") == 0) {
|
||||
if(argc > 2){
|
||||
InvokeCallBack(self->pCall,STSTART,argv[2]);
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
} else if(strcmp(argv[1],"stop") == 0) {
|
||||
if(argc > 2){
|
||||
InvokeCallBack(self->pCall,STEND,argv[2]);
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
SCWrite(pCon,"ERROR: keyword not recognized",eError);
|
||||
return 0;
|
||||
|
124
status.c
124
status.c
@ -9,6 +9,9 @@
|
||||
|
||||
Updated in order to prevent status floods
|
||||
Mark Koennecke, July 2004
|
||||
|
||||
Reworked restore to keep parameters from uninitialized devices
|
||||
Mark Koennecke, November 2007
|
||||
|
||||
Copyright:
|
||||
|
||||
@ -50,6 +53,9 @@
|
||||
#include "interrupt.h"
|
||||
#include "devexec.h"
|
||||
#include "sicshipadaba.h"
|
||||
#include "lld_str.h"
|
||||
#include "lld.h"
|
||||
#include "exebuf.h"
|
||||
#undef VALUECHANGE
|
||||
#define VALUECHANGE 2
|
||||
|
||||
@ -397,28 +403,116 @@ static int motorSave = 0;
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------*/
|
||||
static int restoreOccurred = 0;
|
||||
int hasRestored(){
|
||||
return restoreOccurred;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
typedef struct {
|
||||
pObjectDescriptor pDes;
|
||||
int errList;
|
||||
}RestoreObj, *pRestoreObj;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void killRestore(void *data){
|
||||
pRestoreObj self = (pRestoreObj)data;
|
||||
if(self == NULL){
|
||||
return;
|
||||
}
|
||||
if(self->errList >= 0){
|
||||
LLDdeleteBlob(self->errList);
|
||||
}
|
||||
if(self->pDes != NULL){
|
||||
DeleteDescriptor(self->pDes);
|
||||
}
|
||||
free(self);
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static int SaveRestore(void *obj, char *name, FILE *fd){
|
||||
int status;
|
||||
char buffer[1024];
|
||||
|
||||
pRestoreObj self = (pRestoreObj)obj;
|
||||
if(self == NULL){
|
||||
return 0;
|
||||
}
|
||||
status = LLDnodePtr2First(self->errList);
|
||||
while(status == 1){
|
||||
LLDstringData(self->errList,buffer);
|
||||
fprintf(fd,"%s\n", buffer);
|
||||
status = LLDnodePtr2Next(self->errList);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int InstallBckRestore(SConnection *pCon, SicsInterp *pSics){
|
||||
pRestoreObj pNew = NULL;
|
||||
|
||||
pNew = malloc(sizeof(RestoreObj));
|
||||
if(pNew == NULL){
|
||||
SCWrite(pCon,"ERROR: no memory to create restore object! This is SERIOUS!!!",
|
||||
eError);
|
||||
return 0;
|
||||
}
|
||||
pNew->pDes = CreateDescriptor("BckRestore");
|
||||
pNew->errList = LLDstringCreate();
|
||||
if(pNew->pDes == NULL || pNew->errList < 0){
|
||||
SCWrite(pCon,"ERROR: no memory to create restore object! This is SERIOUS!!!",
|
||||
eError);
|
||||
return 0;
|
||||
}
|
||||
pNew->pDes->SaveStatus = SaveRestore;
|
||||
AddCommand(pSics,"Backup",BackupStatus,NULL,NULL);
|
||||
AddCommand(pSics,"Restore",RestoreStatus,killRestore,pNew);
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*-----------------------------------------------------------------------*/
|
||||
static int listRestoreErr(pRestoreObj self, SConnection *pCon){
|
||||
char buffer[1024];
|
||||
int status;
|
||||
pDynString data = NULL;
|
||||
|
||||
SCStartBuffering(pCon);
|
||||
status = LLDnodePtr2First(self->errList);
|
||||
while(status == 1){
|
||||
LLDstringData(self->errList,buffer);
|
||||
SCWrite(pCon,buffer,eValue);
|
||||
status = LLDnodePtr2Next(self->errList);
|
||||
}
|
||||
data = SCEndBuffering(pCon);
|
||||
if(data != NULL){
|
||||
SCWrite(pCon,GetCharArray(data),eValue);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
/*-----------------------------------------------------------------------*/
|
||||
int RestoreStatus(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[])
|
||||
{
|
||||
{
|
||||
char pBueffel[512];
|
||||
int iRights;
|
||||
int iRet;
|
||||
char *pFile = NULL;
|
||||
writeFunc oldWrite;
|
||||
pExeBuf buffi = NULL;
|
||||
pRestoreObj self = (pRestoreObj)pData;
|
||||
|
||||
assert(pSics);
|
||||
assert(pCon);
|
||||
assert(self != NULL);
|
||||
|
||||
|
||||
if(argc < 2)
|
||||
{
|
||||
pFile = IFindOption(pSICSOptions,"statusfile");
|
||||
if(pFile)
|
||||
{
|
||||
sprintf(pBueffel,"FileEval %s",pFile);
|
||||
sprintf(pBueffel,"%s",pFile);
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
SCWrite(pCon,"ERROR: No filename given for backup, Aborted.",
|
||||
eError);
|
||||
return 0;
|
||||
@ -426,16 +520,35 @@ static int motorSave = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(pBueffel,"FileEval %s",argv[1]);
|
||||
if(strcmp(argv[1],"listerr") == 0){
|
||||
return listRestoreErr(self,pCon);
|
||||
} else {
|
||||
sprintf(pBueffel,"%s",argv[1]);
|
||||
}
|
||||
}
|
||||
|
||||
buffi = exeBufCreate("restore");
|
||||
if(buffi == NULL){
|
||||
SCWrite(pCon,"ERROR: failed to allocate buffer for restore",eError);
|
||||
return 0;
|
||||
}
|
||||
iRet = exeBufLoad(buffi,pBueffel);
|
||||
if(iRet != 1){
|
||||
exeBufDelete(buffi);
|
||||
SCWrite(pCon,"ERROR: failed open status file",eError);
|
||||
return 0;
|
||||
}
|
||||
LLDdeleteBlob(self->errList);
|
||||
self->errList = LLDstringCreate();
|
||||
iRights = SCGetRights(pCon);
|
||||
pCon->iUserRights = usInternal;
|
||||
oldWrite = SCGetWriteFunc(pCon);
|
||||
SCSetWriteFunc(pCon,SCNotWrite);
|
||||
iRet = InterpExecute(pSics,pCon,pBueffel);
|
||||
iRet = exeBufProcessErrList(buffi,pSics,pCon,self->errList);
|
||||
restoreOccurred = 1;
|
||||
SCSetWriteFunc(pCon,oldWrite);
|
||||
pCon->iUserRights = iRights;
|
||||
exeBufDelete(buffi);
|
||||
/*
|
||||
if we do not override parameterChange here, the backup file
|
||||
would be overwritten after each restore... Not the right thing
|
||||
@ -445,4 +558,3 @@ static int motorSave = 0;
|
||||
SCSendOK(pCon);
|
||||
return iRet;
|
||||
}
|
||||
|
||||
|
4
status.h
4
status.h
@ -50,11 +50,13 @@
|
||||
int ResetStatus(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[]);
|
||||
|
||||
int InstallBckRestore(SConnection *pCon, SicsInterp *pSics);
|
||||
int BackupStatus(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[]);
|
||||
|
||||
int RestoreStatus(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[]);
|
||||
|
||||
int hasRestored();
|
||||
|
||||
|
||||
#endif
|
||||
|
3
task.c
3
task.c
@ -243,7 +243,8 @@
|
||||
IncrTaskPointer(self);
|
||||
while(self->iStop == 0)
|
||||
{
|
||||
if((self->pCurrent != pEnd) && (self->pCurrent->iStatus == READY))
|
||||
if((self->pCurrent != pEnd) && (self->pCurrent->iStatus == READY)
|
||||
&& self->pCurrent != NULL)
|
||||
/* omit ourselves! */
|
||||
{
|
||||
iRet = self->pCurrent->pRun(self->pCurrent->pData);
|
||||
|
2
tasub.c
2
tasub.c
@ -1158,7 +1158,7 @@ static int calcUBFromCell(ptasUB self, SConnection *pCon){
|
||||
return 0;
|
||||
}
|
||||
if(mat_det(UB) < .000001){
|
||||
SCWrite(pCon,"ERROR: invalid UB matrix, check reflections",eError);
|
||||
SCWrite(pCon,"ERROR: invalid UB matrix, check cell",eError);
|
||||
return 0;
|
||||
}
|
||||
if(self->machine.UB != NULL){
|
||||
|
14
tclintimpl.c
14
tclintimpl.c
@ -136,13 +136,21 @@ int TclIntAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
pTclInt self = NULL;
|
||||
char pBuffer[1024];
|
||||
char *cmd;
|
||||
float val;
|
||||
|
||||
self = (pTclInt)pData;
|
||||
assert(self);
|
||||
if(argc < 2){
|
||||
sprintf(pBuffer,"ERROR: %s expects at least one argument!", argv[0]);
|
||||
SCWrite(pCon,pBuffer,eError);
|
||||
return 0;
|
||||
if(self->pDriv->GetValue != NULL){
|
||||
val = self->pDriv->GetValue(self,pCon);
|
||||
snprintf(pBuffer,1024,"%s = %f", argv[0], val);
|
||||
SCWrite(pCon,pBuffer,eValue);
|
||||
return 1;
|
||||
} else {
|
||||
sprintf(pBuffer,"ERROR: %s expects at least one argument!", argv[0]);
|
||||
SCWrite(pCon,pBuffer,eError);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
strtolower(argv[1]);
|
||||
|
331
val.lis
331
val.lis
@ -1,93 +1,240 @@
|
||||
==6880== Memcheck, a memory error detector.
|
||||
==6880== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
|
||||
==6880== Using LibVEX rev 1732, a library for dynamic binary translation.
|
||||
==6880== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
|
||||
==6880== Using valgrind-3.2.3, a dynamic binary instrumentation framework.
|
||||
==6880== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
|
||||
==6880== For more details, rerun with: -v
|
||||
==6880==
|
||||
==19540== Memcheck, a memory error detector.
|
||||
==19540== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
|
||||
==19540== Using LibVEX rev 1732, a library for dynamic binary translation.
|
||||
==19540== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
|
||||
==19540== Using valgrind-3.2.3, a dynamic binary instrumentation framework.
|
||||
==19540== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
|
||||
==19540== For more details, rerun with: -v
|
||||
==19540==
|
||||
==19540== Syscall param write(buf) points to uninitialised byte(s)
|
||||
==19540== at 0x41DA1FE: __write_nocancel (in /lib/tls/libc-2.3.2.so)
|
||||
==19540== by 0x81D25BD: H5FD_sec2_write (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540== Address 0xBEFF3BFA is on thread 1's stack
|
||||
==19540==
|
||||
==19540== Source and destination overlap in memcpy(0x4445028, 0x43CE7E8, 1744896)
|
||||
==19540== at 0x401C96D: memcpy (mc_replace_strmem.c:116)
|
||||
==19540== by 0x8241BDA: H5V_memcpyvv (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Invalid read of size 1
|
||||
==19540== at 0x401C988: memcpy (mc_replace_strmem.c:406)
|
||||
==19540== by 0x8241BDA: H5V_memcpyvv (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540== Address 0x4445027 is 1 bytes before a block of size 1,744,896 alloc'd
|
||||
==19540== at 0x401A846: malloc (vg_replace_malloc.c:149)
|
||||
==19540== by 0x81B8BDE: H5D_istore_chunk_alloc (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Invalid read of size 1
|
||||
==19540== at 0x401C98D: memcpy (mc_replace_strmem.c:406)
|
||||
==19540== by 0x8241BDA: H5V_memcpyvv (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540== Address 0x4445026 is 2 bytes before a block of size 1,744,896 alloc'd
|
||||
==19540== at 0x401A846: malloc (vg_replace_malloc.c:149)
|
||||
==19540== by 0x81B8BDE: H5D_istore_chunk_alloc (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Invalid read of size 1
|
||||
==19540== at 0x401C993: memcpy (mc_replace_strmem.c:406)
|
||||
==19540== by 0x8241BDA: H5V_memcpyvv (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540== Address 0x4445025 is 3 bytes before a block of size 1,744,896 alloc'd
|
||||
==19540== at 0x401A846: malloc (vg_replace_malloc.c:149)
|
||||
==19540== by 0x81B8BDE: H5D_istore_chunk_alloc (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Invalid read of size 1
|
||||
==19540== at 0x401C99A: memcpy (mc_replace_strmem.c:406)
|
||||
==19540== by 0x8241BDA: H5V_memcpyvv (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540== Address 0x4445024 is 4 bytes before a block of size 1,744,896 alloc'd
|
||||
==19540== at 0x401A846: malloc (vg_replace_malloc.c:149)
|
||||
==19540== by 0x81B8BDE: H5D_istore_chunk_alloc (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Conditional jump or move depends on uninitialised value(s)
|
||||
==19540== at 0x40D60F5: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D6945: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D598F: deflate (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D3C7F: compress2 (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x8243947: H5Z_filter_deflate (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Conditional jump or move depends on uninitialised value(s)
|
||||
==19540== at 0x40D609F: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D6945: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D598F: deflate (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D3C7F: compress2 (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x8243947: H5Z_filter_deflate (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Conditional jump or move depends on uninitialised value(s)
|
||||
==19540== at 0x40D60FE: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D6945: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D598F: deflate (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D3C7F: compress2 (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x8243947: H5Z_filter_deflate (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Conditional jump or move depends on uninitialised value(s)
|
||||
==19540== at 0x40D60D8: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D6945: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D598F: deflate (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D3C7F: compress2 (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x8243947: H5Z_filter_deflate (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Conditional jump or move depends on uninitialised value(s)
|
||||
==19540== at 0x40D6107: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D6945: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D598F: deflate (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D3C7F: compress2 (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x8243947: H5Z_filter_deflate (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Conditional jump or move depends on uninitialised value(s)
|
||||
==19540== at 0x40D6110: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D6945: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D598F: deflate (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D3C7F: compress2 (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x8243947: H5Z_filter_deflate (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Use of uninitialised value of size 4
|
||||
==19540== at 0x40D68E5: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D598F: deflate (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D3C7F: compress2 (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x8243947: H5Z_filter_deflate (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Use of uninitialised value of size 4
|
||||
==19540== at 0x40D68F7: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D598F: deflate (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D3C7F: compress2 (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x8243947: H5Z_filter_deflate (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Use of uninitialised value of size 4
|
||||
==19540== at 0x40D6B50: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D598F: deflate (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D3C7F: compress2 (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x8243947: H5Z_filter_deflate (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Use of uninitialised value of size 4
|
||||
==19540== at 0x40D6B65: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D598F: deflate (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D3C7F: compress2 (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x8243947: H5Z_filter_deflate (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Conditional jump or move depends on uninitialised value(s)
|
||||
==19540== at 0x40D60DF: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D6945: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D598F: deflate (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D3C7F: compress2 (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x8243947: H5Z_filter_deflate (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Conditional jump or move depends on uninitialised value(s)
|
||||
==19540== at 0x40D60E8: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D6945: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D598F: deflate (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D3C7F: compress2 (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x8243947: H5Z_filter_deflate (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Conditional jump or move depends on uninitialised value(s)
|
||||
==19540== at 0x40D6119: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D6945: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D598F: deflate (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D3C7F: compress2 (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x8243947: H5Z_filter_deflate (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Conditional jump or move depends on uninitialised value(s)
|
||||
==19540== at 0x40D6122: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D6945: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D598F: deflate (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D3C7F: compress2 (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x8243947: H5Z_filter_deflate (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Conditional jump or move depends on uninitialised value(s)
|
||||
==19540== at 0x40D612B: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D6945: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D598F: deflate (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D3C7F: compress2 (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x8243947: H5Z_filter_deflate (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
==19540==
|
||||
==19540== Conditional jump or move depends on uninitialised value(s)
|
||||
==19540== at 0x40D6134: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D6945: (within /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D598F: deflate (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x40D3C7F: compress2 (in /usr/lib/libz.so.1.1.4)
|
||||
==19540== by 0x8243947: H5Z_filter_deflate (in /afs/psi.ch/user/k/koennecke/src/workspace/sics/SICServer)
|
||||
WARNING: Cannot log(Accepted dummy connection )
|
||||
sim/trics/trics.tcl:0>> ServerOption ReadTimeOut 100
|
||||
sim/trics/trics.tcl:1>> ServerOption AcceptTimeOut 100
|
||||
sim/trics/trics.tcl:2>> ServerOption ReadUserPasswdTimeout 7000
|
||||
sim/trics/trics.tcl:3>> ServerOption LogFileDir $loghome
|
||||
sim/trics/trics.tcl:4>> ServerOption LogFileBaseName $loghome/tricsserver
|
||||
sim/trics/trics.tcl:5>> ServerOption statusfile ${datahome}tricsstatus.tcl
|
||||
sim/trics/trics.tcl:6>> ServerOption TecsPort 9753
|
||||
sim/trics/trics.tcl:7>> ServerOption ServerPort 2911
|
||||
sim/trics/trics.tcl:8>> ServerOption InterruptPort 2914
|
||||
sim/trics/trics.tcl:9>> ServerOption TelnetPort 1301
|
||||
sim/trics/trics.tcl:10>> ServerOption TelWord sicslogin
|
||||
sim/trics/trics.tcl:11>> ServerOption QuieckPort 2108
|
||||
sim/trics/trics.tcl:12>> TokenInit connan
|
||||
sim/trics/trics.tcl:13>> commandlog intervall 10
|
||||
sim/trics/trics.tcl:14>> commandlog auto
|
||||
sim/trics/trics.tcl:15>> SicsUser jurg willi 2
|
||||
sim/trics/trics.tcl:16>> SicsUser oksana sun 1
|
||||
sim/trics/trics.tcl:17>> SicsUser schaniel brida 2
|
||||
sim/trics/trics.tcl:18>> SicsUser lnsmanager lnsSICSlns 1
|
||||
sim/trics/trics.tcl:19>> SicsUser tricsuser 07lns1 2
|
||||
sim/trics/trics.tcl:20>> SicsUser lnsg 07lns1 2
|
||||
sim/trics/trics.tcl:21>> VarMake Instrument Text Internal
|
||||
sim/trics/trics.tcl:22>> Instrument lock
|
||||
sim/trics/trics.tcl:23>> VarMake Title Text User
|
||||
sim/trics/trics.tcl:24>> VarMake sample Text User
|
||||
sim/trics/trics.tcl:25>> sample "Schefer"
|
||||
sim/trics/trics.tcl:26>> VarMake User Text User
|
||||
sim/trics/trics.tcl:27>> User "Jurg"
|
||||
sim/trics/trics.tcl:28>> VarMake fax Text User
|
||||
sim/trics/trics.tcl:29>> VarMake phone Text User
|
||||
sim/trics/trics.tcl:30>> FAX "EMERGENCY: 056 - 250.1332"
|
||||
sim/trics/trics.tcl:31>> PHONE "EMERGENCY: 079 - 692.5617"
|
||||
sim/trics/trics.tcl:32>> VarMake distance Float User
|
||||
sim/trics/trics.tcl:33>> VarMake monochromator Text User
|
||||
sim/trics/trics.tcl:34>> VarMake lambda Float Mugger
|
||||
sim/trics/trics.tcl:35>> VarMake BatchRoot Text User
|
||||
sim/trics/trics.tcl:36>> VarMake LastScanCommand Text User
|
||||
sim/trics/trics.tcl:37>> lastscancommand unknown scan
|
||||
sim/trics/trics.tcl:38>> ClientPut "Initialising Elephant"
|
||||
Initialising Elephant
|
||||
sim/trics/trics.tcl:39>> ClientPut "Initialising Sample Table Motors"
|
||||
Initialising Sample Table Motors
|
||||
sim/trics/trics.tcl:40>> cex1 precision .05
|
||||
sim/trics/trics.tcl:41>> cex1 failafter 5
|
||||
sim/trics/trics.tcl:42>> cex1 softlowerlim 0
|
||||
sim/trics/trics.tcl:43>> cex1 softupperlim 360
|
||||
sim/trics/trics.tcl:44>> cex2 precision .05
|
||||
sim/trics/trics.tcl:45>> cex2 failafter 5
|
||||
sim/trics/trics.tcl:46>> cex2 softlowerlim 0
|
||||
sim/trics/trics.tcl:47>> cex2 softupperlim 360
|
||||
sim/trics/trics.tcl:48>> stt precision .03
|
||||
sim/trics/trics.tcl:49>> MakeConfigurableMotor D1W
|
||||
sim/trics/trics.tcl:50>> D1W drivescript widthscript
|
||||
sim/trics/trics.tcl:51>> D1W readscript readwidth
|
||||
sim/trics/trics.tcl:52>> MakeConfigurableMotor D1H
|
||||
sim/trics/trics.tcl:53>> D1H drivescript heightscript
|
||||
sim/trics/trics.tcl:54>> D1H readscript readheight
|
||||
sim/trics/trics.tcl:55>> SicsAlias MOMU A1
|
||||
sim/trics/trics.tcl:56>> SicsAlias MTVU A12
|
||||
sim/trics/trics.tcl:57>> SicsAlias MTPU A13
|
||||
sim/trics/trics.tcl:58>> SicsAlias MGVU A14
|
||||
sim/trics/trics.tcl:59>> SicsAlias MGPU A15
|
||||
sim/trics/trics.tcl:60>> SicsAlias MCVU A16
|
||||
sim/trics/trics.tcl:61>> SicsAlias MOML B1
|
||||
sim/trics/trics.tcl:62>> SicsAlias MTVL A22
|
||||
sim/trics/trics.tcl:63>> SicsAlias MTPL A23
|
||||
sim/trics/trics.tcl:64>> SicsAlias MGVL A24
|
||||
sim/trics/trics.tcl:65>> SicsAlias MGPL A25
|
||||
sim/trics/trics.tcl:66>> SicsAlias MCVL A26
|
||||
sim/trics/trics.tcl:67>> SicsAlias MEXZ A37
|
||||
sim/trics/trics.tcl:68>> SicsAlias SOM A3
|
||||
sim/trics/trics.tcl:69>> SicsAlias SOM OM
|
||||
sim/trics/trics.tcl:70>> SicsAlias STT A4
|
||||
sim/trics/trics.tcl:71>> SicsAlias STT TH
|
||||
sim/trics/trics.tcl:72>> SicsAlias SCH A10
|
||||
sim/trics/trics.tcl:73>> SicsAlias SPH A20
|
||||
sim/trics/trics.tcl:74>> SicsAlias SCH CH
|
||||
sim/trics/trics.tcl:75>> SicsAlias SCH CHI
|
||||
sim/trics/trics.tcl:76>> SicsAlias SPH PH
|
||||
sim/trics/trics.tcl:77>> SicsAlias DG1 A31
|
||||
sim/trics/trics.tcl:78>> SicsAlias DG2 A32
|
||||
sim/trics/trics.tcl:79>> SicsAlias DG3 A33
|
||||
sim/trics/trics.tcl:80>> SicsAlias FILEEVAL XBU
|
||||
sim/
|
||||
sim/laue/laue.tcl:0>> ServerOption ReadTimeOut 10
|
||||
sim/laue/laue.tcl:1>> ServerOption AcceptTimeOut 10
|
||||
sim/laue/laue.tcl:2>> ServerOption ReadUserPasswdTimeout 500000
|
||||
sim/laue/laue.tcl:3>> ServerOption ServerPort 2911
|
||||
sim/laue/laue.tcl:4>> ServerOption InterruptPort 2913
|
||||
sim/laue/laue.tcl:5>> ServerOption TelnetPort 1301
|
||||
sim/laue/laue.tcl:6>> ServerOption TelWord sicslogin
|
||||
sim/laue/laue.tcl:7>> ServerOption QuieckPort 2108
|
||||
sim/laue/laue.tcl:8>> TokenInit connan
|
||||
sim/laue/laue.tcl:9>> ServerOption LogFileDir $loghome
|
||||
sim/laue/laue.tcl:10>> commandlog auto
|
||||
sim/laue/laue.tcl:11>> ServerOption statusfile $datahome/lauestatus.tcl
|
||||
sim/laue/laue.tcl:12>> SicsUser Mugger Mugger 1
|
||||
sim/laue/laue.tcl:13>> SicsUser lnsmanager lnsSICSlns 1
|
||||
sim/laue/laue.tcl:14>> SicsUser User User 2
|
||||
sim/laue/laue.tcl:15>> SicsUser Spy Spy 3
|
||||
sim/laue/laue.tcl:16>> SicsUser laueuser 07lns1 2
|
||||
sim/laue/laue.tcl:17>> VarMake Instrument Text Internal
|
||||
sim/laue/laue.tcl:18>> VarMake sample Text User
|
||||
sim/laue/laue.tcl:19>> sample " "
|
||||
sim/laue/laue.tcl:20>> VarMake Title Text User
|
||||
sim/laue/laue.tcl:21>> Title " "
|
||||
sim/laue/laue.tcl:22>> VarMake User Text User
|
||||
sim/laue/laue.tcl:23>> User " "
|
||||
sim/laue/laue.tcl:24>> VarMake email Text User
|
||||
sim/laue/laue.tcl:25>> email "unknown"
|
||||
sim/laue/laue.tcl:26>> VarMake address Text User
|
||||
sim/laue/laue.tcl:27>> address "unknown"
|
||||
sim/laue/laue.tcl:28>> VarMake fax Text User
|
||||
sim/laue/laue.tcl:29>> fax "unknown"
|
||||
sim/laue/laue.tcl:30>> VarMake phone Text User
|
||||
sim/laue/laue.tcl:31>> phone "unknown"
|
||||
sim/laue/laue.tcl:32>> hm configure counter counter
|
||||
sim/laue/laue.tcl:33>> hm configure amplictrl 1
|
||||
sim/laue/laue.tcl:34>> hm configure shutterctrl 2
|
||||
sim/laue/laue.tcl:35>> hm configure clear 1
|
||||
sim/laue/laue.tcl:36>> hm configure rank 2
|
||||
sim/laue/laue.tcl:37>> hm configure dim0 768
|
||||
sim/laue/laue.tcl:38>> hm configure dim1 568
|
||||
sim/laue/laue.tcl:39>> sicsdatafactory new __transfer
|
||||
sim/laue/laue.tcl:40>> MakeSicsObj lscan LaueScan
|
||||
sim/laue/laue.tcl:41>> hmake /sics/lscan/upperpos mugger float
|
||||
sim/laue/laue.tcl:42>> hmake /sics/lscan/lowerpos mugger float
|
||||
sim/laue/laue.tcl:43>> hmake /sics/lscan/sttbegin user float
|
||||
sim/laue/laue.tcl:44>> hmake /sics/lscan/sttend user float
|
||||
sim/laue/laue.tcl:45>> hmake /sics/lscan/sttstep user float
|
||||
sim/laue/laue.tcl:46>> hcommand /sics/lscan/run lauescan
|
||||
sim/laue/laue.tcl:47>> hsetprop /sics/lscan/run type command
|
||||
sim/laue/laue.tcl:48>> hsetprop /sics/lscan/run priv user
|
||||
sim/laue/laue.tcl:49>> hmake /sics/lscan/run/mode user text
|
||||
sim/laue/laue.tcl:50>> hmake /sics/lscan/run/preset user float
|
||||
sim/laue/laue.tcl:51>> hset /sics/lscan/upperpos 190.
|
||||
sim/laue/laue.tcl:52>> hset /sics/lscan/lowerpos 5.
|
||||
sim/laue/laue.tcl:53>> hset /sics/lscan/sttbegin 10.
|
||||
sim/laue/laue.tcl:54>> hset /sics/lscan/sttend 30.
|
||||
sim/laue/laue.tcl:55>> hset /sics/lscan/sttstep 5.
|
||||
sim/laue/laue.tcl:56>> hset /sics/lscan/run/mode timer
|
||||
sim/laue/laue.tcl:57>> hset /sics/lscan/run/preset 2.
|
||||
sim/laue/laue.tcl:58>> MakeDataNumber SicsDataNumber $datahome/DataNumber
|
||||
sim/laue/laue.tcl:59>> VarMake SicsDataPath Text Mugger
|
||||
sim/laue/laue.tcl:60>> SicsDataPath $datahome/
|
||||
sim/laue/laue.tcl:61>> SicsDataPath lock
|
||||
sim/laue/laue.tcl:62>> VarMake SicsDataPrefix Text Mugger
|
||||
sim/laue/laue.tcl:63>> SicsDataPrefix laue
|
||||
sim/laue/laue.tcl:64>> SicsDataPrefix lock
|
||||
sim/laue/laue.tcl:65>> VarMake SicsDataPostFix Text Mugger
|
||||
sim/laue/laue.tcl:66>> SicsDataPostFix .hdf
|
||||
sim/laue/laue.tcl:67>> SicsDataPostFix lock
|
||||
sim/laue/laue.tcl:68>> clientput "Laue configuration done"
|
||||
Laue configuration done
|
||||
OK
|
||||
ERROR: alias daba not recognized
|
||||
OK
|
||||
==19540==
|
||||
==19540== ERROR SUMMARY: 4310127 errors from 22 contexts (suppressed: 29 from 3)
|
||||
==19540== malloc/free: in use at exit: 73,818 bytes in 1,540 blocks.
|
||||
==19540== malloc/free: 14,838 allocs, 13,298 frees, 5,407,018 bytes allocated.
|
||||
==19540== For counts of detected errors, rerun with: -v
|
||||
==19540== searching for pointers to 1,540 not-freed blocks.
|
||||
==19540== checked 479,156 bytes.
|
||||
==19540==
|
||||
==19540== LEAK SUMMARY:
|
||||
==19540== definitely lost: 69 bytes in 6 blocks.
|
||||
==19540== possibly lost: 8,000 bytes in 1 blocks.
|
||||
==19540== still reachable: 65,749 bytes in 1,533 blocks.
|
||||
==19540== suppressed: 0 bytes in 0 blocks.
|
||||
==19540== Rerun with --leak-check=full to see details of leaked memory.
|
||||
|
Reference in New Issue
Block a user