From 7b3be452b6be528de753a1a633a3aacdb11be86c Mon Sep 17 00:00:00 2001 From: DaMichel Date: Fri, 29 Jul 2016 11:12:22 +0200 Subject: new track logging: record poses in various stages of processing into a file --- opentrack-logic/tracklogger.hpp | 57 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 opentrack-logic/tracklogger.hpp (limited to 'opentrack-logic/tracklogger.hpp') diff --git a/opentrack-logic/tracklogger.hpp b/opentrack-logic/tracklogger.hpp new file mode 100644 index 00000000..feed7fa2 --- /dev/null +++ b/opentrack-logic/tracklogger.hpp @@ -0,0 +1,57 @@ +#pragma once +#include "main-settings.hpp" +#include "opentrack-compat/options.hpp" + +#include +#include +#include +#include + +class OPENTRACK_LOGIC_EXPORT TrackLogger +{ +public: + TrackLogger() + { + } + + static mem make() { return std::make_shared(); } + + virtual void write(const char *) + { + } + + virtual void write(const double *, int n) + { + } + + virtual void next_line() + { + } + + void write_pose(const double *p) + { + write(p, 6); + } +}; + + +class OPENTRACK_LOGIC_EXPORT TrackLoggerCSV : public TrackLogger +{ + std::ofstream out; + bool first_col; +public: + TrackLoggerCSV(const QString &filename) : TrackLogger(), + first_col(true) + { + out.open(filename.toStdString()); + if (!out.is_open()) + throw std::ios_base::failure("unable to open file"); + } + + static mem make(const main_settings &s) { return std::static_pointer_cast(std::make_shared(s.tracklogging_filename)); } + + virtual void write(const char *s); + virtual void write(const double *p, int n); + virtual void next_line(); +}; + -- cgit v1.2.3 From 884b3f013045d60d586c55338a76feb4dfa30c9b Mon Sep 17 00:00:00 2001 From: DaMichel Date: Fri, 29 Jul 2016 11:36:21 +0200 Subject: track logging: why not write proper csv with COMMA separated lists! Also write proper header. --- opentrack-logic/tracker.cpp | 27 +++++++++++++++++++-------- opentrack-logic/tracklogger.cpp | 15 ++++++++++----- opentrack-logic/tracklogger.hpp | 1 + 3 files changed, 30 insertions(+), 13 deletions(-) (limited to 'opentrack-logic/tracklogger.hpp') diff --git a/opentrack-logic/tracker.cpp b/opentrack-logic/tracker.cpp index 8101932c..f29e3100 100644 --- a/opentrack-logic/tracker.cpp +++ b/opentrack-logic/tracker.cpp @@ -135,7 +135,7 @@ void Tracker::logic() raw(i) = newpose[i]; } - logger.write_pose(raw); // raw tracker input + logger.write_pose(raw); // raw if (is_nan(raw)) raw = last_raw; @@ -210,13 +210,13 @@ void Tracker::logic() } } - logger.write_pose(value); // after various transformations to account for camera position + logger.write_pose(value); // "corrected" - after various transformations to account for camera position // whenever something can corrupt its internal state due to nan/inf, elide the call if (is_nan(value)) { nan = true; - logger.write_pose(value); // for consistency with filtered value + logger.write_pose(value); // "filtered" } else { @@ -224,11 +224,9 @@ void Tracker::logic() Pose tmp = value; if (libs.pFilter) - { libs.pFilter->filter(tmp, value); - } } - logger.write_pose(value); // filtered value if filter present + logger.write_pose(value); // "filtered" // CAVEAT rotation only, due to tcomp for (int i = 3; i < 6; i++) @@ -265,7 +263,7 @@ void Tracker::logic() for (int i = 0; i < 3; i++) value(i) = map(value(i), m(i)); - logger.write_pose(value); // after mapping + logger.write_pose(value); // "mapped" if (nan) { @@ -296,7 +294,20 @@ void Tracker::run() (void) timeBeginPeriod(1); #endif - logger.write("//dt;raw;before filter;after filter;after mapping; every pose has channels TX, TY, TZ, Yaw, Pitch, Roll"); + { + const char* posechannels[6] = { "TX", "TY", "TZ", "Yaw", "Pitch", "Roll" }; + const char* datachannels[5] = { "dt", "raw", "corrected", "filtered", "mapped" }; + logger.write(datachannels[0]); + char buffer[128]; + for (int j = 1; j < 5; ++j) + { + for (int i = 0; i < 6; ++i) + { + snprintf(buffer, 128, "%s%s", datachannels[j], posechannels[i]); + logger.write(buffer); + } + } + } logger.next_line(); while (!should_quit) diff --git a/opentrack-logic/tracklogger.cpp b/opentrack-logic/tracklogger.cpp index 5e4cf4f9..f007c2bc 100644 --- a/opentrack-logic/tracklogger.cpp +++ b/opentrack-logic/tracklogger.cpp @@ -1,22 +1,27 @@ #include "tracklogger.hpp" #include "tracker.h" - + +void TrackLoggerCSV::handle_first_col_sep() +{ + if (!first_col) + out.put(','); + first_col = false; +} void TrackLoggerCSV::write(const char *s) { + handle_first_col_sep(); out << s; } void TrackLoggerCSV::write(const double *p, int n) { - if (!first_col) - out.put(';'); - first_col = false; + handle_first_col_sep(); for (int i = 0; i < n-1; ++i) { out << p[i]; - out.put(';'); + out.put(','); } out << p[n-1]; } diff --git a/opentrack-logic/tracklogger.hpp b/opentrack-logic/tracklogger.hpp index feed7fa2..99bc71b0 100644 --- a/opentrack-logic/tracklogger.hpp +++ b/opentrack-logic/tracklogger.hpp @@ -39,6 +39,7 @@ class OPENTRACK_LOGIC_EXPORT TrackLoggerCSV : public TrackLogger { std::ofstream out; bool first_col; + inline void handle_first_col_sep(); public: TrackLoggerCSV(const QString &filename) : TrackLogger(), first_col(true) -- cgit v1.2.3 From 12d2080865958cc07d37dddd28240f40423fb292 Mon Sep 17 00:00:00 2001 From: DaMichel Date: Fri, 29 Jul 2016 16:32:54 +0200 Subject: logger: it is definitely nicer to not have things all over the place --- gui/ui.cpp | 50 +---------------------------------------- gui/ui.h | 2 -- opentrack-logic/state.hpp | 2 -- opentrack-logic/tracklogger.hpp | 7 +----- opentrack-logic/work.cpp | 45 +++++++++++++++++++++++++++++++++++-- opentrack-logic/work.hpp | 10 ++++++--- 6 files changed, 52 insertions(+), 64 deletions(-) (limited to 'opentrack-logic/tracklogger.hpp') diff --git a/gui/ui.cpp b/gui/ui.cpp index 3bda6ee2..94fd0cbf 100644 --- a/gui/ui.cpp +++ b/gui/ui.cpp @@ -15,7 +15,6 @@ #include #include #include -#include #ifdef _WIN32 # include @@ -286,44 +285,6 @@ void MainWindow::reload_options() ensure_tray(); } -/* - Allocates a new logger instance depending on main settings. Result is assigned to logger variable of State object. - May open warning dialogs. - May also assign nullptr in case of an error. -*/ -void MainWindow::initialize_logger() -{ - logger = nullptr; - if (s.tracklogging_enabled) - { - if (static_cast(s.tracklogging_filename).isEmpty()) - { - QMessageBox::warning(this, tr("Logging Error"), - tr("No filename given for track logging. Aborting."), - QMessageBox::Ok, - QMessageBox::NoButton); - return; - } - try - { - logger = TrackLoggerCSV::make(s); - } - catch (std::ios_base::failure &) - { - QMessageBox::warning(this, tr("Logging Error"), - tr("Unable to open file: ") + s.tracklogging_filename + tr(". Aborting."), - QMessageBox::Ok, - QMessageBox::NoButton); - return; - } - } - else - { - logger = TrackLogger::make(); - } - assert(logger != nullptr); -} - void MainWindow::startTracker() { @@ -350,17 +311,9 @@ void MainWindow::startTracker() return; } - initialize_logger(); - if (logger == nullptr) - { - // error -> rollback - libs = SelectedLibraries(); - return; - } - save_modules(); - work = std::make_shared(pose, libs, *logger, winId()); + work = std::make_shared(pose, libs, winId()); reload_options(); @@ -412,7 +365,6 @@ void MainWindow::stopTracker() work = nullptr; libs = SelectedLibraries(); - logger = nullptr; { double p[6] = {0,0,0, 0,0,0}; diff --git a/gui/ui.h b/gui/ui.h index acec615e..d6f5e400 100644 --- a/gui/ui.h +++ b/gui/ui.h @@ -103,8 +103,6 @@ private slots: void stopTracker(); void reload_options(); - void initialize_logger(); - signals: void emit_start_tracker(); void emit_stop_tracker(); diff --git a/opentrack-logic/state.hpp b/opentrack-logic/state.hpp index bdab9afe..1c608f7a 100644 --- a/opentrack-logic/state.hpp +++ b/opentrack-logic/state.hpp @@ -14,7 +14,6 @@ using namespace options; #include "main-settings.hpp" #include "mappings.hpp" #include "selected-libraries.hpp" -#include "tracklogger.hpp" #include "work.hpp" #include #include @@ -30,5 +29,4 @@ struct State main_settings s; Mappings pose; mem work; - mem logger; }; diff --git a/opentrack-logic/tracklogger.hpp b/opentrack-logic/tracklogger.hpp index 99bc71b0..65128d48 100644 --- a/opentrack-logic/tracklogger.hpp +++ b/opentrack-logic/tracklogger.hpp @@ -14,8 +14,6 @@ public: { } - static mem make() { return std::make_shared(); } - virtual void write(const char *) { } @@ -45,12 +43,9 @@ public: first_col(true) { out.open(filename.toStdString()); - if (!out.is_open()) - throw std::ios_base::failure("unable to open file"); } - static mem make(const main_settings &s) { return std::static_pointer_cast(std::make_shared(s.tracklogging_filename)); } - + bool is_open() const { return out.is_open(); } virtual void write(const char *s); virtual void write(const double *p, int n); virtual void next_line(); diff --git a/opentrack-logic/work.cpp b/opentrack-logic/work.cpp index e5b08c18..8d00270b 100644 --- a/opentrack-logic/work.cpp +++ b/opentrack-logic/work.cpp @@ -1,9 +1,50 @@ #include "work.hpp" +#include -Work::Work(Mappings& m, SelectedLibraries& libs, TrackLogger &logger, WId handle) : + +std::shared_ptr Work::make_logger(const main_settings &s) +{ + if (s.tracklogging_enabled) + { + if (static_cast(s.tracklogging_filename).isEmpty()) + { + QMessageBox::warning(nullptr, "Logging Error", + "No filename given for track logging. Proceeding without logging.", + QMessageBox::Ok, + QMessageBox::NoButton); + } + else + { + auto logger = std::make_shared(s.tracklogging_filename); + if (!logger->is_open()) + { + logger = nullptr; + QMessageBox::warning(nullptr, "Logging Error", + "Unable to open file: " + s.tracklogging_filename + ". Proceeding without logging.", + QMessageBox::Ok, + QMessageBox::NoButton); + } + else + { + /* As this function has the potential to fill up the hard drive + of the unwary with junk data, a warning is in order. */ + QMessageBox::warning(nullptr, "Logging Active", + "Just a heads up. You are recoding pose data to " + s.tracklogging_filename + "!", + QMessageBox::Ok, + QMessageBox::NoButton); + return logger; + } + } + } + return std::make_shared(); +} + + +Work::Work(Mappings& m, SelectedLibraries& libs, WId handle) : libs(libs), - tracker(std::make_shared(m, libs, logger)), + logger(make_logger(s)), + tracker(std::make_shared(m, libs, *logger)), sc(std::make_shared()), handle(handle), keys { diff --git a/opentrack-logic/work.hpp b/opentrack-logic/work.hpp index 6425b11c..4afb1da4 100644 --- a/opentrack-logic/work.hpp +++ b/opentrack-logic/work.hpp @@ -13,6 +13,7 @@ #include "tracker.h" #include "shortcuts.h" #include "export.hpp" +#include "tracklogger.hpp" #include #include @@ -25,15 +26,18 @@ struct OPENTRACK_LOGIC_EXPORT Work { using fn_t = std::function; using key_tuple = std::tuple; - + main_settings s; // tracker needs settings, so settings must come before it SelectedLibraries& libs; + std::shared_ptr logger; // must come before tracker, since tracker depends on it std::shared_ptr tracker; std::shared_ptr sc; WId handle; std::vector keys; - main_settings s; - Work(Mappings& m, SelectedLibraries& libs, TrackLogger &logger, WId handle); + Work(Mappings& m, SelectedLibraries& libs, WId handle); ~Work(); void reload_shortcuts(); + +private: + std::shared_ptr make_logger(const main_settings &s); }; -- cgit v1.2.3