- 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:
zolliker
2010-04-13 14:16:29 +00:00
parent 7d30c4d352
commit 38818e650c

View File

@ -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);