summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--filter-accela/ftnoir_filter_accela.cpp18
-rw-r--r--opentrack-compat/timer.hpp49
-rwxr-xr-xtracker-pt/ftnoir_tracker_pt.cpp2
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;