136 lines
3.3 KiB
C
136 lines
3.3 KiB
C
#include "logger.h"
|
|
#include "sics.h"
|
|
#include "sicshipadaba.h"
|
|
|
|
static char *loggerID = "loggerID";
|
|
|
|
static hdbCallbackReturn LoggerUpdateCallback(pHdb node,
|
|
void *userData,
|
|
pHdbMessage message)
|
|
{
|
|
Logger *logger = userData;
|
|
pDynString str;
|
|
SConnection *conn = NULL;
|
|
hdbValue value;
|
|
pHdbDataMessage mm = NULL;
|
|
pHdbDataSearch dsm = NULL;
|
|
time_t now;
|
|
|
|
if ((dsm = GetHdbDataSearchMessage(message)) != NULL) {
|
|
if (dsm->testPtr == loggerID) {
|
|
dsm->result = userData;
|
|
return hdbAbort;
|
|
}
|
|
return hdbContinue;
|
|
}
|
|
|
|
if ((mm = GetHdbUpdateMessage(message)) == NULL) {
|
|
return hdbContinue;
|
|
}
|
|
|
|
value = *(mm->v);
|
|
|
|
time(&now);
|
|
if (now > LoggerLastTime(logger)) { /* never write more than once per second */
|
|
if (GetHdbProp(node, "geterror") == NULL) {
|
|
str = formatValue(value, node);
|
|
LoggerWrite(logger, time(NULL), LoggerPeriod(logger), GetCharArray(str));
|
|
DeleteDynString(str);
|
|
} else {
|
|
LoggerWrite(logger, time(NULL), LoggerPeriod(logger), "");
|
|
}
|
|
}
|
|
return hdbContinue;
|
|
}
|
|
|
|
static int LogSetup(SConnection * pCon, SicsInterp * pSics, void *pData,
|
|
int argc, char *argv[])
|
|
{
|
|
pHdb node;
|
|
pHdbCallback cb;
|
|
static char basepath[1024] = "/";
|
|
char buf[1024];
|
|
char *p, *name;
|
|
static char *loggerDir = NULL;
|
|
int numeric, period;
|
|
Logger *logger;
|
|
|
|
if (argc < 2) {
|
|
SCPrintf(pCon, eError,
|
|
"ERROR: should be: logsetup <node> [<period> [<filename>]]");
|
|
/* or logsetup <node> clear */
|
|
return 0;
|
|
}
|
|
if (strcasecmp(argv[1], "basepath") == 0) {
|
|
if (argc > 2) {
|
|
snprintf(basepath, sizeof basepath, "%s", argv[2]);
|
|
}
|
|
SCPrintf(pCon, eValue, "%s", basepath);
|
|
return 1;
|
|
}
|
|
if (loggerDir == NULL) {
|
|
loggerDir = IFindOption(pSICSOptions, "LoggerDir");
|
|
if (loggerDir == NULL)
|
|
loggerDir = "./";
|
|
LoggerSetDir(loggerDir);
|
|
}
|
|
if (strcasecmp(argv[1], "directory") == 0) {
|
|
if (argc > 2) {
|
|
loggerDir = strdup(argv[2]);
|
|
}
|
|
SCPrintf(pCon, eValue, "%s", loggerDir);
|
|
return 1;
|
|
}
|
|
node = FindHdbNode(basepath, argv[1], pCon);
|
|
if (node == NULL) {
|
|
SCPrintf(pCon, eError, "ERROR: %s not found", argv[1]);
|
|
return 0;
|
|
}
|
|
if (argc > 3) {
|
|
snprintf(buf, sizeof buf, "%s", argv[3]);
|
|
} else {
|
|
snprintf(buf, sizeof buf, "%s", argv[1]);
|
|
}
|
|
for (p = buf; *p != '\0'; p++) {
|
|
if (*p == '/')
|
|
*p = '.';
|
|
}
|
|
if (buf[0] == '.') {
|
|
name = buf + 1;
|
|
} else {
|
|
name = buf;
|
|
}
|
|
if (node->value.dataType == HIPFLOAT) {
|
|
numeric = 1;
|
|
} else {
|
|
numeric = 0;
|
|
}
|
|
logger = FindHdbCallbackData(node, loggerID);
|
|
period = 0;
|
|
if (argc > 2) {
|
|
if (logger != NULL && strcasecmp(argv[2], "clear") == 0) {
|
|
LoggerWrite(logger, time(NULL), LoggerPeriod(logger), "");
|
|
return 1;
|
|
}
|
|
period = atoi(argv[2]);
|
|
}
|
|
if (logger != 0) { /* logger exists already */
|
|
LoggerChange(logger, period, name);
|
|
} else {
|
|
logger = LoggerMake(name, period, !numeric);
|
|
LoggerSetNumeric(logger, numeric);
|
|
SetHdbProperty(node, "logger_name", name);
|
|
cb = MakeHipadabaCallback(LoggerUpdateCallback, logger,
|
|
(void (*)(void *)) LoggerKill);
|
|
assert(cb);
|
|
AppendHipadabaCallback(node, cb);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
void LogSetupInit(void)
|
|
{
|
|
AddCmd("LogSetup", LogSetup);
|
|
}
|