Cleaned up ANSTO code to merge with sinqdev.sics
This is our new RELEASE-4_0 branch which was taken from ansto/93d9a7c Conflicts: .gitignore SICSmain.c asynnet.c confvirtualmot.c counter.c devexec.c drive.c event.h exebuf.c exeman.c histmem.c interface.h motor.c motorlist.c motorsec.c multicounter.c napi.c napi.h napi4.c network.c nwatch.c nxscript.c nxxml.c nxxml.h ofac.c reflist.c scan.c sicshipadaba.c sicsobj.c site_ansto/docs/Copyright.txt site_ansto/instrument/lyrebird/config/tasmad/sicscommon/nxsupport.tcl site_ansto/instrument/lyrebird/config/tasmad/taspub_sics/tasscript.tcl statusfile.c tasdrive.c tasub.c tasub.h tasublib.c tasublib.h
This commit is contained in:
226
taskobj.c
Normal file
226
taskobj.c
Normal file
@@ -0,0 +1,226 @@
|
||||
/**
|
||||
* This is the SICS interface object to the tasker module
|
||||
*
|
||||
* copyright: GPL
|
||||
*
|
||||
* Mark Koennecke, December 2012
|
||||
*/
|
||||
#include <sics.h>
|
||||
#include "sicsobj.h"
|
||||
#include "sicshipadaba.h"
|
||||
#include "stptok.h"
|
||||
#include "macro.h"
|
||||
|
||||
typedef struct {
|
||||
char *scriptName;
|
||||
SConnection *con;
|
||||
} TclFunc, *pTclFunc;
|
||||
/*-------------------------------------------------------------------------*/
|
||||
static int ListCmd(pSICSOBJ self, SConnection *pCon, pHdb commandNode,
|
||||
pHdb par[], int nPar)
|
||||
{
|
||||
pDynString result = NULL;
|
||||
char buffer[256], *pDes, *pPtr, name[80], time[80], id[80], gid[80];
|
||||
pTaskHead it = NULL;
|
||||
|
||||
result = CreateDynString(128,128);
|
||||
if(result == NULL){
|
||||
SCWrite(pCon,"ERROR: out of memory in ListCmd", eError);
|
||||
return 0;
|
||||
}
|
||||
snprintf(buffer,sizeof(buffer),"%20s %20s %12s",
|
||||
"Task", "Start_Time", "ID");
|
||||
DynStringConcat(result,buffer);
|
||||
DynStringConcatChar(result,'\n');
|
||||
for(it = TaskIteratorStart(pServ->pTasker); it != NULL; it = TaskIteratorNext(it)){
|
||||
pDes = TaskDescription(it);
|
||||
if(pDes != NULL){
|
||||
pPtr = stptok(pDes,name,sizeof(name),"|");
|
||||
pPtr = stptok(pPtr,time,sizeof(time),"|");
|
||||
pPtr = stptok(pPtr,id,sizeof(id),"|");
|
||||
pPtr = stptok(pPtr,gid,sizeof(gid),"|");
|
||||
snprintf(buffer,sizeof(buffer),"%20s %20s %12s %10s",
|
||||
name,time,id,gid);
|
||||
DynStringConcat(result,buffer);
|
||||
DynStringConcatChar(result,'\n');
|
||||
free(pDes);
|
||||
}
|
||||
}
|
||||
SCWrite(pCon,GetCharArray(result),eValue);
|
||||
DeleteDynString(result);
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*----------------------------------------------------------------------*/
|
||||
static int KillCmd(pSICSOBJ self, SConnection *pCon, pHdb commandNode,
|
||||
pHdb par[], int nPar)
|
||||
{
|
||||
int status;
|
||||
|
||||
if(nPar < 1){
|
||||
SCWrite(pCon,"ERROR: need name of task to stop", eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(!SCMatchRights(pCon,usMugger)){
|
||||
return 0;
|
||||
}
|
||||
|
||||
status = StopTask(pServ->pTasker,par[0]->value.v.text);
|
||||
if(status == 0) {
|
||||
SCWrite(pCon,"ERROR: cannot commit suicide!", eError);
|
||||
return 0;
|
||||
}
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
}
|
||||
/*--------------------------------------------------------------------*/
|
||||
static int TclTaskFunction(void *pData)
|
||||
{
|
||||
int retVal, status ;
|
||||
Tcl_Interp *pTcl;
|
||||
|
||||
pTclFunc self = (pTclFunc)pData;
|
||||
assert(self != NULL);
|
||||
|
||||
pTcl = InterpGetTcl(pServ->pSics);
|
||||
assert(pTcl != NULL);
|
||||
|
||||
MacroPush(self->con);
|
||||
status = Tcl_Eval(pTcl, self->scriptName);
|
||||
MacroPop();
|
||||
/*
|
||||
traceSys("task","Executed %s with results %d and %s",self->scriptName, status,
|
||||
Tcl_GetStringResult(pTcl));
|
||||
*/
|
||||
if(status == 0){
|
||||
retVal = atoi(Tcl_GetStringResult(pTcl));
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
/*--------------------------------------------------------------------*/
|
||||
static void KillTclFunc(void *pData)
|
||||
{
|
||||
pTclFunc self = (pTclFunc)pData;
|
||||
if(self == NULL){
|
||||
return;
|
||||
}
|
||||
if(self->scriptName){
|
||||
free(self->scriptName);
|
||||
}
|
||||
if(self->con) {
|
||||
SCDeleteConnection(self->con);
|
||||
}
|
||||
free(self);
|
||||
}
|
||||
/*------------------------------------------------------------------*/
|
||||
static void TclFuncSignal(void *pData, int iSignal, void *pSigData)
|
||||
{
|
||||
int *iInt;
|
||||
pTclFunc self = NULL;
|
||||
|
||||
self = (pTclFunc) pData;
|
||||
assert(self);
|
||||
|
||||
if (iSignal == SICSINT) {
|
||||
iInt = (int *) pSigData;
|
||||
SCSetInterrupt(self->con,*iInt);
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------------*/
|
||||
static int RunCmd(pSICSOBJ self, SConnection *pCon, pHdb commandNode,
|
||||
pHdb par[], int nPar)
|
||||
{
|
||||
pTclFunc data = NULL;
|
||||
|
||||
if(nPar < 1) {
|
||||
SCWrite(pCon,"ERROR: need the name of a script to run",eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
data = malloc(sizeof(TclFunc));
|
||||
if(data == NULL){
|
||||
SCWrite(pCon,"ERROR: out of memory in RunCmd",eError);
|
||||
return 0;
|
||||
}
|
||||
memset(data,0,sizeof(TclFunc));
|
||||
data->con = SCCreateDummyConnection(pServ->pSics);
|
||||
data->scriptName = strdup(par[0]->value.v.text);
|
||||
TaskRegisterN(pServ->pTasker,
|
||||
data->scriptName,
|
||||
TclTaskFunction,
|
||||
TclFuncSignal,
|
||||
KillTclFunc,
|
||||
data, 0);
|
||||
traceSys("task","Started task %s",data->scriptName);
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
}
|
||||
/*--------------------------------------------------------------------*/
|
||||
int TaskOBJFactory(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[])
|
||||
{
|
||||
pSICSOBJ pNew = NULL;
|
||||
pHdb cmd = NULL, node;
|
||||
|
||||
pNew = SetupSICSOBJ(pCon,pSics,pData,argc,argv);
|
||||
if(pNew == NULL){
|
||||
return 0;
|
||||
}
|
||||
|
||||
cmd = AddSICSHdbPar(pNew->objectNode, "ps", usSpy,
|
||||
MakeSICSFunc(ListCmd));
|
||||
|
||||
cmd = AddSICSHdbPar(pNew->objectNode, "kill", usSpy,
|
||||
MakeSICSFunc(KillCmd));
|
||||
SetHdbProperty(cmd,"type","command");
|
||||
SetHdbProperty(cmd,"priv","spy");
|
||||
node = MakeSICSHdbPar("task",usSpy,MakeHdbText("banana"));
|
||||
AddHipadabaChild(cmd,node,NULL);
|
||||
|
||||
cmd = AddSICSHdbPar(pNew->objectNode, "run", usSpy,
|
||||
MakeSICSFunc(RunCmd));
|
||||
SetHdbProperty(cmd,"type","command");
|
||||
SetHdbProperty(cmd,"priv","spy");
|
||||
node = MakeSICSHdbPar("script",usSpy,MakeHdbText("banana"));
|
||||
AddHipadabaChild(cmd,node,NULL);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*-------------------------------------------------------------------*/
|
||||
void InitTaskOBJ()
|
||||
{
|
||||
pSICSOBJ pNew = NULL;
|
||||
pHdb cmd = NULL, node;
|
||||
|
||||
|
||||
pNew = MakeSICSOBJv("task", "TaskOBJ", HIPNONE, usInternal);
|
||||
if (pNew == NULL) {
|
||||
SCWrite(pServ->dummyCon, "ERROR: out of memory creating new SICS object", eError);
|
||||
return;
|
||||
}
|
||||
|
||||
cmd = AddSICSHdbPar(pNew->objectNode, "ps", usSpy,
|
||||
MakeSICSFunc(ListCmd));
|
||||
|
||||
cmd = AddSICSHdbPar(pNew->objectNode, "kill", usSpy,
|
||||
MakeSICSFunc(KillCmd));
|
||||
SetHdbProperty(cmd,"type","command");
|
||||
SetHdbProperty(cmd,"priv","spy");
|
||||
node = MakeSICSHdbPar("task",usSpy,MakeHdbText("banana"));
|
||||
AddHipadabaChild(cmd,node,NULL);
|
||||
|
||||
cmd = AddSICSHdbPar(pNew->objectNode, "run", usSpy,
|
||||
MakeSICSFunc(RunCmd));
|
||||
SetHdbProperty(cmd,"type","command");
|
||||
SetHdbProperty(cmd,"priv","spy");
|
||||
node = MakeSICSHdbPar("script",usSpy,MakeHdbText("banana"));
|
||||
AddHipadabaChild(cmd,node,NULL);
|
||||
|
||||
AddCommand(pServ->pSics,
|
||||
"task", InterInvokeSICSOBJ, KillSICSOBJ, pNew);
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user