Files
sics/logsetup.c
2008-05-14 14:23:16 +00:00

114 lines
2.7 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;
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);
str = formatValue(value, node);
LoggerWrite(logger, time(NULL), LoggerPeriod(logger), GetCharArray(str));
DeleteDynString(str);
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>]]");
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;
}
period = 0;
if (argc > 2) {
period = atoi(argv[2]);
}
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);
if (logger != 0) { /* logger exists already, changed only period */
LoggerSetPeriod(logger, period);
} else {
logger = LoggerMake(name, period, !numeric);
LoggerSetNumeric(logger, numeric);
cb = MakeHipadabaCallback(LoggerUpdateCallback, logger, (void (*)(void *))LoggerKill);
assert(cb);
AppendHipadabaCallback(node, cb);
}
return 1;
}
void LogSetupInit(void) {
AddCmd("LogSetup",LogSetup);
}