1
0
Fork 0
flightgear/src/Main/logger.cxx
david 8506e731a2 Minor logging changes.
All logs and log entries are now disabled by default, unless
explicitly enabled by an 'enabled' property.  This works much more
intuitively with the GUI dialog.
2003-02-01 17:59:52 +00:00

153 lines
3.3 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// logger.cxx - log properties.
// Written by David Megginson, started 2002.
//
// This file is in the Public Domain, and comes with no warranty.
#include "logger.hxx"
#include STL_FSTREAM
#include <string>
SG_USING_STD(ofstream);
SG_USING_STD(endl);
SG_USING_STD(string);
#include <simgear/debug/logstream.hxx>
#include "fg_props.hxx"
////////////////////////////////////////////////////////////////////////
// Implementation of FGLogger
////////////////////////////////////////////////////////////////////////
FGLogger::FGLogger ()
{
}
FGLogger::~FGLogger ()
{
}
void
FGLogger::init ()
{
SGPropertyNode * logging = fgGetNode("/logging");
if (logging == 0)
return;
vector<SGPropertyNode_ptr> children = logging->getChildren("log");
for (unsigned int i = 0; i < children.size(); i++) {
SGPropertyNode * child = children[i];
if (!child->getBoolValue("enabled", false))
continue;
_logs.push_back(Log());
Log &log = _logs[_logs.size()-1];
string filename = child->getStringValue("filename");
if (filename.size() == 0) {
filename = "fg_log.csv";
child->setStringValue("filename", filename.c_str());
}
string delimiter = child->getStringValue("delimiter");
if (delimiter.size() == 0) {
delimiter = ",";
child->setStringValue("delimiter", delimiter.c_str());
}
log.interval_ms = child->getLongValue("interval-ms");
log.delimiter = delimiter.c_str()[0];
log.output = new ofstream(filename.c_str());
if (!log.output) {
SG_LOG(SG_INPUT, SG_ALERT, "Cannot write log to " << filename);
continue;
}
//
// Process the individual entries (Time is automatic).
//
vector<SGPropertyNode_ptr> entries = child->getChildren("entry");
(*log.output) << "Time";
for (unsigned int j = 0; j < entries.size(); j++) {
SGPropertyNode * entry = entries[j];
//
// Set up defaults.
//
if (!entry->hasValue("property")) {
entry->setBoolValue("enabled", false);
continue;
}
if (!entry->getBoolValue("enabled"))
continue;
SGPropertyNode * node =
fgGetNode(entry->getStringValue("property"), true);
log.nodes.push_back(node);
(*log.output) << log.delimiter
<< entry->getStringValue("title", node->getPath());
}
(*log.output) << endl;
}
}
void
FGLogger::reinit ()
{
_logs.clear();
init();
}
void
FGLogger::bind ()
{
}
void
FGLogger::unbind ()
{
}
void
FGLogger::update (double dt)
{
double sim_time_ms = globals->get_sim_time_sec() * 1000;
for (unsigned int i = 0; i < _logs.size(); i++) {
if ((sim_time_ms - _logs[i].last_time_ms) >= _logs[i].interval_ms) {
_logs[i].last_time_ms = sim_time_ms;
(*_logs[i].output) << sim_time_ms;
for (unsigned int j = 0; j < _logs[i].nodes.size(); j++) {
(*_logs[i].output) << _logs[i].delimiter
<< _logs[i].nodes[j]->getStringValue();
}
(*_logs[i].output) << endl;
}
}
}
////////////////////////////////////////////////////////////////////////
// Implementation of FGLogger::Log
////////////////////////////////////////////////////////////////////////
FGLogger::Log::Log ()
: output(0),
interval_ms(0),
last_time_ms(-999999.0),
delimiter(',')
{
}
FGLogger::Log::~Log ()
{
delete output;
}
// end of logger.cxx