- introduced <controller> actions function for listing actions
- introduced <controller> reconnect function - list seconds of minute in debugging mode - "sct utime" may be used from scripts to get the milliseconds time
This commit is contained in:
@ -162,7 +162,6 @@ int SctCommand(SConnection * con, SicsInterp * sics, void *object,
|
|||||||
Hdb *node = NULL;
|
Hdb *node = NULL;
|
||||||
Hdb *cNode = NULL;
|
Hdb *cNode = NULL;
|
||||||
hdbValue v;
|
hdbValue v;
|
||||||
double dtime;
|
|
||||||
|
|
||||||
assert(sct == object);
|
assert(sct == object);
|
||||||
if (sct->nodes != NULL) {
|
if (sct->nodes != NULL) {
|
||||||
@ -222,13 +221,12 @@ int SctCommand(SConnection * con, SicsInterp * sics, void *object,
|
|||||||
* time stamping
|
* time stamping
|
||||||
*/
|
*/
|
||||||
if (strcmp(argv[1], "utime") == 0) {
|
if (strcmp(argv[1], "utime") == 0) {
|
||||||
if (argc < 3) {
|
snprintf(value, 1024, "%.3f", DoubleTime());
|
||||||
SCWrite(con, "ERROR: need property to write time stamp too", eError);
|
if (argc > 2) { /* if no property is given, use only return value */
|
||||||
return 0;
|
SetHdbProperty(node, argv[2], value);
|
||||||
}
|
}
|
||||||
dtime = DoubleTime();
|
/* write time as return value */
|
||||||
snprintf(value, 1024, "%.3f", dtime);
|
SCWrite(con, value, eValue);
|
||||||
SetHdbProperty(node, argv[2], value);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -268,6 +266,11 @@ int SctCommand(SConnection * con, SicsInterp * sics, void *object,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double secondsOfMinute() {
|
||||||
|
double now=DoubleTime();
|
||||||
|
return (now/60-floor(now/60))*60;
|
||||||
|
}
|
||||||
|
|
||||||
int SctCallInContext(SConnection * con, char *script, Hdb * node,
|
int SctCallInContext(SConnection * con, char *script, Hdb * node,
|
||||||
SctController * controller, char **resPtr)
|
SctController * controller, char **resPtr)
|
||||||
{
|
{
|
||||||
@ -279,7 +282,7 @@ int SctCallInContext(SConnection * con, char *script, Hdb * node,
|
|||||||
|
|
||||||
PushContext(node, controller->node);
|
PushContext(node, controller->node);
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
SCPrintf(con, eLog, "script: %s", script);
|
SCPrintf(con, eLog, "%6.3f script: %s", secondsOfMinute(), script);
|
||||||
}
|
}
|
||||||
|
|
||||||
MacroPush(con);
|
MacroPush(con);
|
||||||
@ -295,7 +298,7 @@ int SctCallInContext(SConnection * con, char *script, Hdb * node,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
SCPrintf(con, eLog, "error: %s", result);
|
SCPrintf(con, eLog, "%6.3f error: %s", secondsOfMinute(), result);
|
||||||
}
|
}
|
||||||
iRet = 0;
|
iRet = 0;
|
||||||
}
|
}
|
||||||
@ -362,7 +365,7 @@ static char *SctActionHandler(void *actionData, char *lastReply,
|
|||||||
script = NULL;
|
script = NULL;
|
||||||
if (!commError && controller->verbose && lastReply != NULL
|
if (!commError && controller->verbose && lastReply != NULL
|
||||||
&& *lastReply != '\0') {
|
&& *lastReply != '\0') {
|
||||||
SCPrintf(con, eLog, "reply : %s\n", lastReply);
|
SCPrintf(con, eLog, "%6.3f reply : %s\n", secondsOfMinute(), lastReply);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -499,7 +502,7 @@ static char *SctActionHandler(void *actionData, char *lastReply,
|
|||||||
if (send == NULL)
|
if (send == NULL)
|
||||||
send = "";
|
send = "";
|
||||||
if (controller->verbose) {
|
if (controller->verbose) {
|
||||||
SCPrintf(con, eLog, "send : %s", send);
|
SCPrintf(con, eLog, "%6.3f send : %s", secondsOfMinute(), send);
|
||||||
}
|
}
|
||||||
return send;
|
return send;
|
||||||
}
|
}
|
||||||
@ -545,6 +548,18 @@ static int SctMatchNode(void *vNode, void *vData)
|
|||||||
return node == d->node;
|
return node == d->node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char * SctDataInfo(void *d)
|
||||||
|
{
|
||||||
|
SctData *data = d;
|
||||||
|
char text[256];
|
||||||
|
int l;
|
||||||
|
|
||||||
|
snprintf(text, sizeof text, "%s ", data->name);
|
||||||
|
l = strlen(text);
|
||||||
|
GetHdbPath(data->node, text + l, sizeof text - l);
|
||||||
|
return strdup(text);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is the callback for all nodes participating in the
|
* This is the callback for all nodes participating in the
|
||||||
* scriptcontext system
|
* scriptcontext system
|
||||||
@ -708,7 +723,7 @@ static hdbCallbackReturn SctActionCallback(Hdb * node, void *userData,
|
|||||||
data->answered = 0;
|
data->answered = 0;
|
||||||
data->inMacro = SCinMacro(con);
|
data->inMacro = SCinMacro(con);
|
||||||
DevQueue(data->controller->devser, data, prio,
|
DevQueue(data->controller->devser, data, prio,
|
||||||
SctWriteHandler, SctMatch, NULL);
|
SctWriteHandler, SctMatch, NULL, SctDataInfo);
|
||||||
/* no kill function in DevQueue: data is owned by the node (callback list) */
|
/* no kill function in DevQueue: data is owned by the node (callback list) */
|
||||||
return hdbContinue;
|
return hdbContinue;
|
||||||
}
|
}
|
||||||
@ -815,7 +830,7 @@ int SctAddPollNode(SctController * controller, Hdb * node, double interval,
|
|||||||
data->name = strdup(action);
|
data->name = strdup(action);
|
||||||
|
|
||||||
return DevSchedule(controller->devser, data, prio, interval,
|
return DevSchedule(controller->devser, data, prio, interval,
|
||||||
SctActionHandler, SctMatch, SctKillData);
|
SctActionHandler, SctMatch, SctKillData, SctDataInfo);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -852,13 +867,13 @@ static int SctPollCmd(pSICSOBJ ccmd, SConnection * con,
|
|||||||
}
|
}
|
||||||
action = ParText(cmdNode, "action", nPar, "read");
|
action = ParText(cmdNode, "action", nPar, "read");
|
||||||
|
|
||||||
if (SctAddPollNode(controller, node, interval, prio, action) > 0) {
|
if (SctAddPollNode(controller, node, interval, prio, action)) {
|
||||||
SCPrintf(con, eValue,
|
SCPrintf(con, eValue,
|
||||||
"%s poll on %s changed to %g sec, %s prio",
|
"%s poll registered on %s (%g sec, %s prio)",
|
||||||
action, path, interval, prioText);
|
action, path, interval, prioText);
|
||||||
} else {
|
} else {
|
||||||
SCPrintf(con, eValue,
|
SCPrintf(con, eValue,
|
||||||
"%s poll registered on %s (%g sec, %s prio)",
|
"%s poll on %s changed to %g sec, %s prio",
|
||||||
action, path, interval, prioText);
|
action, path, interval, prioText);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
@ -1009,7 +1024,7 @@ void SctQueueNode(SctController * controller, Hdb * node,
|
|||||||
data->answered = 1;
|
data->answered = 1;
|
||||||
|
|
||||||
if (DevQueue(data->controller->devser, data, prio,
|
if (DevQueue(data->controller->devser, data, prio,
|
||||||
SctWriteHandler, SctMatch, SctKillData)) {
|
SctWriteHandler, SctMatch, SctKillData, SctDataInfo)) {
|
||||||
if (con != NULL) {
|
if (con != NULL) {
|
||||||
data->conCtx = SCCopyConnection(con);
|
data->conCtx = SCCopyConnection(con);
|
||||||
}
|
}
|
||||||
@ -1084,13 +1099,13 @@ static char *TransactionHandler(void *actionData, char *lastReply,
|
|||||||
if (st->sent == 0) {
|
if (st->sent == 0) {
|
||||||
st->sent = 1;
|
st->sent = 1;
|
||||||
if (st->controller->verbose) {
|
if (st->controller->verbose) {
|
||||||
SCPrintf(st->con, eLog, "send : %s", st->command);
|
SCPrintf(st->con, eLog, "%6.3f send : %s", secondsOfMinute(), st->command);
|
||||||
}
|
}
|
||||||
return st->command;
|
return st->command;
|
||||||
} else {
|
} else {
|
||||||
st->sent = 2;
|
st->sent = 2;
|
||||||
if (st->controller->verbose) {
|
if (st->controller->verbose) {
|
||||||
SCPrintf(st->con, eLog, "reply : %s", lastReply);
|
SCPrintf(st->con, eLog, "%6.3f reply : %s", secondsOfMinute(), lastReply);
|
||||||
}
|
}
|
||||||
SCWrite(st->con, lastReply, eValue);
|
SCWrite(st->con, lastReply, eValue);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1119,7 +1134,7 @@ static int SctTransactCmd(pSICSOBJ ccmd, SConnection * con,
|
|||||||
st->controller = c;
|
st->controller = c;
|
||||||
|
|
||||||
DevQueue(c->devser, st, WritePRIO,
|
DevQueue(c->devser, st, WritePRIO,
|
||||||
TransactionHandler, SctTransactMatch, NULL);
|
TransactionHandler, SctTransactMatch, NULL, NULL);
|
||||||
while (st->sent != 2) {
|
while (st->sent != 2) {
|
||||||
TaskYield(pServ->pTasker);
|
TaskYield(pServ->pTasker);
|
||||||
if (SCGetInterrupt(con) != eContinue) {
|
if (SCGetInterrupt(con) != eContinue) {
|
||||||
@ -1156,7 +1171,7 @@ static int SctSendCmd(pSICSOBJ ccmd, SConnection * con,
|
|||||||
}
|
}
|
||||||
|
|
||||||
DevQueue(c->devser, st, prio,
|
DevQueue(c->devser, st, prio,
|
||||||
TransactionHandler, SctTransactMatch, KillSctTransact);
|
TransactionHandler, SctTransactMatch, KillSctTransact, NULL);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1170,6 +1185,28 @@ static int SctDisconnect(pSICSOBJ ccmd, SConnection * con,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int SctReconnect(pSICSOBJ ccmd, SConnection * con,
|
||||||
|
Hdb * cmdNode, Hdb * par[], int nPar)
|
||||||
|
{
|
||||||
|
SctController *c;
|
||||||
|
|
||||||
|
c = (SctController *) ccmd->pPrivate;
|
||||||
|
DevReconnect(c->devser, ParText(cmdNode, "hostport", nPar, ""));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int SctListActions(pSICSOBJ ccmd, SConnection * con,
|
||||||
|
Hdb * cmdNode, Hdb * par[], int nPar)
|
||||||
|
{
|
||||||
|
SctController *c;
|
||||||
|
char *result;
|
||||||
|
|
||||||
|
c = (SctController *) ccmd->pPrivate;
|
||||||
|
result = DevList(c->devser);
|
||||||
|
SCWrite(con, result, eValue);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static hdbCallbackReturn SctDebugCallback(Hdb * node, void *userData,
|
static hdbCallbackReturn SctDebugCallback(Hdb * node, void *userData,
|
||||||
hdbMessage * msg)
|
hdbMessage * msg)
|
||||||
{
|
{
|
||||||
@ -1323,8 +1360,15 @@ static int SctMakeController(SConnection * con, SicsInterp * sics,
|
|||||||
cmd = AddSICSHdbPar(controller->node,
|
cmd = AddSICSHdbPar(controller->node,
|
||||||
"disconnect", usMugger, MakeSICSFunc(SctDisconnect));
|
"disconnect", usMugger, MakeSICSFunc(SctDisconnect));
|
||||||
|
|
||||||
|
cmd = AddSICSHdbPar(controller->node,
|
||||||
|
"reconnect", usMugger, MakeSICSFunc(SctReconnect));
|
||||||
|
AddSICSHdbPar(cmd, "hostport", usMugger, MakeHdbText(""));
|
||||||
|
|
||||||
par = AddSICSHdbPar(controller->node, "debug", usUser, MakeHdbInt(-1));
|
par = AddSICSHdbPar(controller->node, "debug", usUser, MakeHdbInt(-1));
|
||||||
|
|
||||||
|
cmd = AddSICSHdbPar(controller->node,
|
||||||
|
"actions", usUser, MakeSICSFunc(SctListActions));
|
||||||
|
|
||||||
cb = MakeHipadabaCallback(SctDebugCallback, controller, NULL);
|
cb = MakeHipadabaCallback(SctDebugCallback, controller, NULL);
|
||||||
if (cb)
|
if (cb)
|
||||||
AppendHipadabaCallback(par, cb);
|
AppendHipadabaCallback(par, cb);
|
||||||
|
Reference in New Issue
Block a user