114 lines
2.7 KiB
C
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);
|
|
}
|