diff options
-rw-r--r-- | filter-accela/ftnoir_filter_accela.cpp | 18 | ||||
-rw-r--r-- | opentrack-compat/timer.hpp | 49 | ||||
-rwxr-xr-x | tracker-pt/ftnoir_tracker_pt.cpp | 2 |
3 files changed, 46 insertions, 23 deletions
diff --git a/filter-accela/ftnoir_filter_accela.cpp b/filter-accela/ftnoir_filter_accela.cpp index b29c989a..352c751e 100644 --- a/filter-accela/ftnoir_filter_accela.cpp +++ b/filter-accela/ftnoir_filter_accela.cpp @@ -49,7 +49,7 @@ FTNoIR_Filter::FTNoIR_Filter() : first_run(true) trans.setMaxInput(trans_gains[0][0]); rot.setMaxOutput(rot_gains[0][1]); trans.setMaxOutput(trans_gains[0][1]); - + for (int i = 0; rot_gains[i][0] >= 0; i++) { rot.addPoint(QPointF(rot_gains[i][0], rot_gains[i][1])); @@ -75,33 +75,33 @@ void FTNoIR_Filter::filter(const double* input, double *output) t.start(); return; } - + const double rot_t = (1+s.rot_threshold) * s.mult_rot; const double trans_t = (1+s.trans_threshold) * s.mult_trans; - - const double dt = t.elapsed() * 1e-9; + + const double dt = t.elapsed_seconds(); t.start(); const double RC = s.mult_ewma * s.ewma / 1000.; // seconds const double alpha = dt/(dt+RC); const double rot_dz = s.rot_deadzone * s.mult_rot_dz; const double trans_dz = s.trans_deadzone * s.mult_trans_dz; - + for (int i = 0; i < 6; i++) { Map& m = i >= 3 ? rot : trans; - + smoothed_input[i] = smoothed_input[i] * (1.-alpha) + input[i] * alpha; - + const double in = smoothed_input[i]; - + const double vec = in - last_output[i]; const double dz = i >= 3 ? rot_dz : trans_dz; const double vec_ = std::max(0., fabs(vec) - dz); const double thres = i >= 3 ? rot_t : trans_t; const double val = m.getValue(vec_ / thres); const double result = last_output[i] + (vec < 0 ? -1 : 1) * dt * val; - + last_output[i] = output[i] = result; } } diff --git a/opentrack-compat/timer.hpp b/opentrack-compat/timer.hpp index f0741295..28de1700 100644 --- a/opentrack-compat/timer.hpp +++ b/opentrack-compat/timer.hpp @@ -24,10 +24,14 @@ static inline void opentrack_clock_gettime(int, struct timespec* ts) (void) QueryPerformanceCounter(&d); - long long part = d.QuadPart / ((long double)freq.QuadPart) * 1000000000.L; + using ll = long long; + using ld = long double; + const long long part = ll(d.QuadPart / ld(freq.QuadPart) * 1000000000.L); + using t_s = decltype(ts->tv_sec); + using t_ns = decltype(ts->tv_nsec); - ts->tv_sec = part / 1000000000ULL; - ts->tv_nsec = part % 1000000000ULL; + ts->tv_sec = t_s(part / 1000000000LL); + ts->tv_nsec = t_ns(part % 1000000000LL); } # define clock_gettime opentrack_clock_gettime #else @@ -49,26 +53,45 @@ static inline void clock_gettime(int, struct timespec* ts) } # endif #endif -class Timer { +class Timer +{ private: struct timespec state; - long long conv(const struct timespec& cur) const + long long conv_nsecs(const struct timespec& cur) const { return (cur.tv_sec - state.tv_sec) * 1000000000LL + (cur.tv_nsec - state.tv_nsec); } + long conv_usecs(const struct timespec& cur) const + { + return long(cur.tv_sec - state.tv_sec) * 1000000L + long(cur.tv_nsec - state.tv_nsec) / 1000l; + } public: - Timer() { + Timer() + { start(); } - void start() { - (void) clock_gettime(CLOCK_MONOTONIC, &state); + void start() + { + clock_gettime(CLOCK_MONOTONIC, &state); + } + long long elapsed_nsecs() const + { + struct timespec cur; + clock_gettime(CLOCK_MONOTONIC, &cur); + return conv_nsecs(cur); } - long long elapsed() const { + long elapsed_usecs() const + { struct timespec cur; - (void) clock_gettime(CLOCK_MONOTONIC, &cur); - return conv(cur); + clock_gettime(CLOCK_MONOTONIC, &cur); + return long(conv_usecs(cur)); } - long elapsed_ms() const { - return elapsed() / 1000000L; + long elapsed_ms() const + { + return elapsed_usecs() / 1000L; + } + double elapsed_seconds() const + { + return double(elapsed_nsecs() * 1e-9L); } }; diff --git a/tracker-pt/ftnoir_tracker_pt.cpp b/tracker-pt/ftnoir_tracker_pt.cpp index 87e9b2b8..562ffcf1 100755 --- a/tracker-pt/ftnoir_tracker_pt.cpp +++ b/tracker-pt/ftnoir_tracker_pt.cpp @@ -104,7 +104,7 @@ void Tracker_PT::run() while((commands & ABORT) == 0) { - const double dt = time.elapsed() * 1e-9; + const double dt = time.elapsed_seconds(); time.start(); bool new_frame; |