diff options
Diffstat (limited to 'filter-accela')
| -rw-r--r-- | filter-accela/accela-settings.hpp | 23 | ||||
| -rw-r--r-- | filter-accela/ftnoir_accela_filtercontrols.ui | 35 | ||||
| -rw-r--r-- | filter-accela/ftnoir_filter_accela.cpp | 114 | ||||
| -rw-r--r-- | filter-accela/ftnoir_filter_accela.h | 23 | ||||
| -rw-r--r-- | filter-accela/ftnoir_filter_accela_dialog.cpp | 16 | ||||
| -rw-r--r-- | filter-accela/lang/de_DE.ts | 57 | ||||
| -rw-r--r-- | filter-accela/lang/nl_NL.ts | 7 | ||||
| -rw-r--r-- | filter-accela/lang/ru_RU.ts | 7 | ||||
| -rw-r--r-- | filter-accela/lang/stub.ts | 7 | ||||
| -rw-r--r-- | filter-accela/lang/zh_CN.ts | 46 |
10 files changed, 240 insertions, 95 deletions
diff --git a/filter-accela/accela-settings.hpp b/filter-accela/accela-settings.hpp index 63173aa8..b2f62a43 100644 --- a/filter-accela/accela-settings.hpp +++ b/filter-accela/accela-settings.hpp @@ -1,8 +1,11 @@ #pragma once +#include "spline/spline.hpp" #include "options/options.hpp" + +namespace detail::accela { + using namespace options; -#include "spline/spline.hpp" // ------------------------------------ // debug knobs @@ -19,8 +22,7 @@ struct settings_accela : opts double x, y; }; - static constexpr inline gains const rot_gains[16] = - { + static constexpr gains const rot_gains[] { { 9, 300 }, { 8, 200 }, { 5, 100 }, @@ -30,8 +32,7 @@ struct settings_accela : opts { .5, .4 }, }; - static constexpr inline gains const pos_gains[16] = - { + static constexpr gains const pos_gains[] { { 9, 200 }, { 8, 150 }, { 7, 110 }, @@ -47,10 +48,14 @@ struct settings_accela : opts static void make_splines(spline& rot, spline& pos); - value<slider_value> rot_smoothing { b, "rotation-sensitivity", slider_value(1.5, .05, 2.5) }, - pos_smoothing { b, "translation-sensitivity", slider_value(1., .05, 1.5) }, - rot_deadzone { b, "rotation-deadzone", slider_value(.03, 0, .2) }, - pos_deadzone { b, "translation-deadzone", slider_value(.1, 0, 1) }; + value<slider_value> rot_smoothing { b, "rotation-sensitivity", { 1.5, .05, 2.5 } }, + pos_smoothing { b, "translation-sensitivity", { 1., .05, 1.5 } }, + rot_deadzone { b, "rotation-deadzone", { .03, 0, .2 } }, + pos_deadzone { b, "translation-deadzone", { .1, 0, 1 } }; settings_accela() : opts("accela-sliders") {} }; + +} // ns detail::accela + +using detail::accela::settings_accela; diff --git a/filter-accela/ftnoir_accela_filtercontrols.ui b/filter-accela/ftnoir_accela_filtercontrols.ui index ce9f52a2..899f4920 100644 --- a/filter-accela/ftnoir_accela_filtercontrols.ui +++ b/filter-accela/ftnoir_accela_filtercontrols.ui @@ -10,7 +10,7 @@ <x>0</x> <y>0</y> <width>550</width> - <height>275</height> + <height>279</height> </rect> </property> <property name="sizePolicy"> @@ -276,6 +276,19 @@ <zorder>label</zorder> </widget> </item> + <item row="3" column="0"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> <item row="2" column="0"> <widget class="QLabel" name="label_9"> <property name="sizePolicy"> @@ -321,18 +334,18 @@ </property> </widget> </item> - <item row="3" column="0"> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <item row="4" column="0"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> </property> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>1</height> + </size> </property> - </widget> + </spacer> </item> </layout> </widget> diff --git a/filter-accela/ftnoir_filter_accela.cpp b/filter-accela/ftnoir_filter_accela.cpp index 23d71ef0..940ac50c 100644 --- a/filter-accela/ftnoir_filter_accela.cpp +++ b/filter-accela/ftnoir_filter_accela.cpp @@ -7,54 +7,54 @@ #include "ftnoir_filter_accela.h" #include "compat/math.hpp" #include "api/plugin-api.hpp" +#include "opentrack/defs.hpp" #include <algorithm> #include <QDebug> #include <QMutexLocker> #include "compat/math-imports.hpp" +#include "compat/time.hpp" -accela::accela() : first_run(true) +accela::accela() { s.make_splines(spline_rot, spline_pos); } -template<int N = 3, typename F> +template<typename F> never_inline -static void do_deltas(const double* deltas, double* output, double& smoothed, F&& fun) +static void do_deltas(const double* deltas, double* output, F&& fun) { + constexpr unsigned N = 3; + double norm[N]; + double dist = 0; - const double dist = progn( - double ret = 0; - for (unsigned k = 0; k < N; k++) - ret += deltas[k]*deltas[k]; - return sqrt(ret); - ); + for (unsigned k = 0; k < N; k++) + dist += deltas[k]*deltas[k]; + dist = sqrt(dist); - const double value = double(fun(dist)); + const double value = fun(dist); for (unsigned k = 0; k < N; k++) { - const double c = dist > 1e-6 ? clamp((fabs(deltas[k]) / dist), 0., 1.) : 0; + const double c = dist > 1e-6 ? std::clamp((fabs(deltas[k]) / dist), 0., 1.) : 0; norm[k] = c; } - progn( - double n = 0; - for (unsigned k = 0; k < N; k++) - n += norm[k]; + double n = 0; + for (unsigned k = 0; k < N; k++) // NOLINT(modernize-loop-convert) + n += norm[k]; - if (n > 1e-6) - { - const double ret = 1./n; - for (unsigned k = 0; k < N; k++) - norm[k] *= ret; - } - else - for (unsigned k = 0; k < N; k++) - norm[k] = 0; - ); + if (n > 1e-6) + { + const double ret = 1./n; + for (unsigned k = 0; k < N; k++) // NOLINT(modernize-loop-convert) + norm[k] *= ret; + } + else + for (unsigned k = 0; k < N; k++) // NOLINT(modernize-loop-convert) + norm[k] = 0; for (unsigned k = 0; k < N; k++) { @@ -63,8 +63,19 @@ static void do_deltas(const double* deltas, double* output, double& smoothed, F& } } +template<typename F> +[[maybe_unused]] +never_inline +static void do_delta(double delta, double* output, F&& fun) +{ + *output = fun(fabs(delta)) * signum(delta); +} + void accela::filter(const double* input, double *output) { + static constexpr double full_turn = 360.0; + static constexpr double half_turn = 180.0; + if (unlikely(first_run)) { first_run = false; @@ -76,9 +87,6 @@ void accela::filter(const double* input, double *output) last_output[i] = f; } - smoothed_input[0] = 0; - smoothed_input[1] = 0; - t.start(); #if defined DEBUG_ACCELA debug_max = 0; @@ -88,20 +96,21 @@ void accela::filter(const double* input, double *output) return; } - const double rot_thres = s.rot_smoothing.to<double>(); - const double pos_thres = s.pos_smoothing.to<double>(); + const double rot_thres{s.rot_smoothing}; + const double pos_thres{s.pos_smoothing}; const double dt = t.elapsed_seconds(); t.start(); - const double rot_dz = s.rot_deadzone.to<double>(); - const double pos_dz = s.pos_deadzone.to<double>(); + const double rot_dz{ s.rot_deadzone}; + const double pos_dz{ s.pos_deadzone}; // rot for (unsigned i = 3; i < 6; i++) { double d = input[i] - last_output[i]; + if (fabs(d) > half_turn) d -= copysign(full_turn, d); if (fabs(d) > rot_dz) d -= copysign(rot_dz, d); @@ -111,26 +120,15 @@ void accela::filter(const double* input, double *output) deltas[i] = d / rot_thres; } - do_deltas(&deltas[Yaw], &output[Yaw], smoothed_input[0], [this](double x) { +#ifdef UI_ACCELA_OLD_STAIRCASE + for (int i = Yaw; i <= Roll; i++) + do_delta(deltas[i], &output[i], [this](double x) { + return spline_rot.get_value_no_save(x); + }); +#else + do_deltas(&deltas[Yaw], &output[Yaw], [this](double x) { return spline_rot.get_value_no_save(x); }); - -#if defined DEBUG_ACCELA - var.input(fabs(smoothed_input[0]) + fabs(smoothed_input[1]) + fabs(smoothed_input[2])); - debug_max = fmax(debug_max, smoothed_input[0]); - - using time_units::secs_; - - if (debug_timer.is_elapsed(secs_(1))) - { - qDebug() << "accela:" - << "max" << debug_max - << "mean" << var.avg() - << "stddev/mean" << var.stddev() / var.avg(); - - var.clear(); - debug_max = 0; - } #endif // pos @@ -146,7 +144,7 @@ void accela::filter(const double* input, double *output) deltas[i] = d / pos_thres; } - do_deltas(&deltas[TX], &output[TX], smoothed_input[1], [this](double x) { + do_deltas(&deltas[TX], &output[TX], [this](double x) { return spline_pos.get_value_no_save(x); }); @@ -156,22 +154,26 @@ void accela::filter(const double* input, double *output) { output[k] *= dt; output[k] += last_output[k]; + if (k >= Yaw && fabs(output[k]) > half_turn) + output[k] -= copysign(full_turn, output[k]); last_output[k] = output[k]; } } +namespace detail::accela { + void settings_accela::make_splines(spline& rot, spline& pos) { - rot = spline(); - pos = spline(); + rot.clear(); pos.clear(); for (const auto& val : rot_gains) - rot.add_point(QPointF(val.x, val.y)); + rot.add_point({ val.x, val.y }); for (const auto& val : pos_gains) - pos.add_point(QPointF(val.x, val.y)); + pos.add_point({ val.x, val.y }); } -OPENTRACK_DECLARE_FILTER(accela, dialog_accela, accelaDll) +} // ns detail::accela +OPENTRACK_DECLARE_FILTER(accela, dialog_accela, accelaDll) diff --git a/filter-accela/ftnoir_filter_accela.h b/filter-accela/ftnoir_filter_accela.h index 1d7925dc..0d6dca1b 100644 --- a/filter-accela/ftnoir_filter_accela.h +++ b/filter-accela/ftnoir_filter_accela.h @@ -12,14 +12,14 @@ #include "api/plugin-api.hpp" #include "compat/timer.hpp" #include "compat/variance.hpp" -#include "compat/macros.hpp" #include <QMutex> #include <QTimer> -class accela : public IFilter +//#define DEBUG_ACCELA + +struct accela : IFilter { -public: accela(); void filter(const double* input, double *output) override; void center() override { first_run = true; } @@ -27,15 +27,14 @@ public: module_status initialize() override { return status_ok(); } private: settings_accela s; - double last_output[6], deltas[6]; - double smoothed_input[2]; + double last_output[6] {}, deltas[6] {}; Timer t; #if defined DEBUG_ACCELA Timer debug_timer; double debug_max; variance var; #endif - bool first_run; + bool first_run = true; }; class dialog_accela : public IFilterDialog @@ -45,9 +44,12 @@ public: dialog_accela(); void register_filter(IFilter*) override {} void unregister_filter() override {} + void save() override; + void reload() override; + bool embeddable() noexcept override { return true; } + void set_buttons_visible(bool x) override; private: Ui::AccelaUICdialog_accela ui; - void save(); settings_accela s; private slots: void doOK(); @@ -56,7 +58,8 @@ private slots: class accelaDll : public Metadata { -public: - QString name() { return otr_tr("Accela"); } - QIcon icon() { return QIcon(":/images/filter-16.png"); } + Q_OBJECT + + QString name() override { return tr("Accela"); } + QIcon icon() override { return QIcon(":/images/filter-16.png"); } }; diff --git a/filter-accela/ftnoir_filter_accela_dialog.cpp b/filter-accela/ftnoir_filter_accela_dialog.cpp index 51c31ca4..6a0a35b0 100644 --- a/filter-accela/ftnoir_filter_accela_dialog.cpp +++ b/filter-accela/ftnoir_filter_accela_dialog.cpp @@ -13,6 +13,8 @@ #include "spline/spline-widget.hpp" #include <QDialog> +using namespace options; + dialog_accela::dialog_accela() { ui.setupUi(this); @@ -42,7 +44,7 @@ dialog_accela::dialog_accela() QDialog dr; spline_widget r(&dr); dr.setWindowTitle("Accela rotation gain"); r.set_preview_only(true); r.setEnabled(true); - r.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); r.setConfig(&rot); + r.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); r.set_config(&rot); r.setFixedSize(1024, 600); dr.show(); dr.exec(); @@ -52,7 +54,7 @@ dialog_accela::dialog_accela() QDialog dt; spline_widget t(&dt); dt.setWindowTitle("Accela translation gain"); t.set_preview_only(true); t.setEnabled(true); - dt.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); t.setConfig(&pos); + dt.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); t.set_config(&pos); t.setFixedSize(1024, 600); dt.show(); dt.exec(); @@ -76,3 +78,13 @@ void dialog_accela::save() { s.b->save(); } + +void dialog_accela::reload() +{ + s.b->reload(); +} + +void dialog_accela::set_buttons_visible(bool x) +{ + ui.buttonBox->setVisible(x); +} diff --git a/filter-accela/lang/de_DE.ts b/filter-accela/lang/de_DE.ts new file mode 100644 index 00000000..9ab4e8c5 --- /dev/null +++ b/filter-accela/lang/de_DE.ts @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="de_DE"> +<context> + <name>AccelaUICdialog_accela</name> + <message> + <source>Filter settings</source> + <translation>Filter-Einstellungen</translation> + </message> + <message> + <source>Rotation filtering (Yaw, pitch, and roll)</source> + <translation>Rotationsfilterung (Gieren, Nicken und Rollen)</translation> + </message> + <message> + <source>Smoothing</source> + <translation>Glättung</translation> + </message> + <message> + <source>0°</source> + <translation>0°</translation> + </message> + <message> + <source>Deadzone</source> + <translation>Totbereich</translation> + </message> + <message> + <source>Position filtering (X, Y, Z - translation)</source> + <translation>Positionsfilterung (X, Y, Z-Übersetzung)</translation> + </message> + <message> + <source>0mm</source> + <translation>0 mm</translation> + </message> + <message> + <source><html><head/><body><p align="right"><br/><span style=" font-size:10pt;">Accela by </span><a href="https://github.com/sthalik"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">Stanisław Halik</span></a><span style=" font-size:10pt;"><br/>Thanks to </span><a href="https://github.com/dbaarda"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">Donovan Baarda</span></a></p><p align="right"><span style=" font-size:10pt;">2012-2017</span></p><p align="right"><br/><span style=" font-size:8pt;">Visit </span><a href="https://github.com/opentrack/opentrack/wiki/Accela-in-opentrack-2.3"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">our wiki</span></a><span style=" font-size:8pt;"> for description of the settings.</span></p></body></html></source> + <translation><html><head/><body><p align="right"><br/><span style=" font-size:10pt;">Accela by </span><a href="https://github.com/sthalik"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">Stanisław Halik</span></a><span style=" font-size:10pt;"><br/>Thanks to </span><a href="https://github.com/dbaarda"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">Donovan Baarda</span></a></p><p align="right"><span style=" font-size:10pt;">2012-2017</span></p><p align="right"><br/><span style=" font-size:8pt;">In </span><a href="https://github.com/opentrack/opentrack/wiki/Accela-in-opentrack-2.3"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">unserem Wiki</span></a><span style=" font-size:8pt;"> gibt es eine Beschreibung der Einstellungen.</span></p></body></html></translation> + </message> +</context> +<context> + <name>accelaDll</name> + <message> + <source>Accela</source> + <translation>Accela</translation> + </message> +</context> +<context> + <name>dialog_accela</name> + <message> + <source>%1°</source> + <translation>%1°</translation> + </message> + <message> + <source>%1mm</source> + <translation>%1 mm</translation> + </message> +</context> +</TS> diff --git a/filter-accela/lang/nl_NL.ts b/filter-accela/lang/nl_NL.ts index 53f37992..5a4d1f58 100644 --- a/filter-accela/lang/nl_NL.ts +++ b/filter-accela/lang/nl_NL.ts @@ -37,6 +37,13 @@ </message> </context> <context> + <name>accelaDll</name> + <message> + <source>Accela</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>dialog_accela</name> <message> <source>%1°</source> diff --git a/filter-accela/lang/ru_RU.ts b/filter-accela/lang/ru_RU.ts index 387f993b..c2eb175d 100644 --- a/filter-accela/lang/ru_RU.ts +++ b/filter-accela/lang/ru_RU.ts @@ -37,6 +37,13 @@ </message> </context> <context> + <name>accelaDll</name> + <message> + <source>Accela</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>dialog_accela</name> <message> <source>%1°</source> diff --git a/filter-accela/lang/stub.ts b/filter-accela/lang/stub.ts index a8e48a37..4a3e27ff 100644 --- a/filter-accela/lang/stub.ts +++ b/filter-accela/lang/stub.ts @@ -37,6 +37,13 @@ </message> </context> <context> + <name>accelaDll</name> + <message> + <source>Accela</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>dialog_accela</name> <message> <source>%1°</source> diff --git a/filter-accela/lang/zh_CN.ts b/filter-accela/lang/zh_CN.ts index 98e95407..1deb8288 100644 --- a/filter-accela/lang/zh_CN.ts +++ b/filter-accela/lang/zh_CN.ts @@ -1,19 +1,19 @@ <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> -<TS version="2.1"> +<TS version="2.1" language="zh_CN"> <context> <name>AccelaUICdialog_accela</name> <message> <source>Filter settings</source> - <translation type="unfinished"></translation> + <translation>过滤器设置</translation> </message> <message> <source>Rotation filtering (Yaw, pitch, and roll)</source> - <translation type="unfinished"></translation> + <translation>旋转过滤器 (偏航, 俯仰, 滚转)</translation> </message> <message> <source>Smoothing</source> - <translation type="unfinished"></translation> + <translation type="unfinished">平滑</translation> </message> <message> <source>0°</source> @@ -21,11 +21,11 @@ </message> <message> <source>Deadzone</source> - <translation type="unfinished"></translation> + <translation>死区</translation> </message> <message> <source>Position filtering (X, Y, Z - translation)</source> - <translation type="unfinished"></translation> + <translation>方位过滤器 (X, Y, Z - 变换)</translation> </message> <message> <source>0mm</source> @@ -33,7 +33,39 @@ </message> <message> <source><html><head/><body><p align="right"><br/><span style=" font-size:10pt;">Accela by </span><a href="https://github.com/sthalik"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">Stanisław Halik</span></a><span style=" font-size:10pt;"><br/>Thanks to </span><a href="https://github.com/dbaarda"><span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">Donovan Baarda</span></a></p><p align="right"><span style=" font-size:10pt;">2012-2017</span></p><p align="right"><br/><span style=" font-size:8pt;">Visit </span><a href="https://github.com/opentrack/opentrack/wiki/Accela-in-opentrack-2.3"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">our wiki</span></a><span style=" font-size:8pt;"> for description of the settings.</span></p></body></html></source> - <translation type="unfinished"></translation> + <translation type="unfinished"><html> + +<body> + <p align="right"><br /> + <span style=" font-size:10pt;">Accela by </span> + <a href="https://github.com/sthalik"> + <span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">Stanisław Halik</span> + </a> + <span style=" font-size:10pt;"><br />Thanks to </span> + <a href="https://github.com/dbaarda"> + <span style=" font-size:10pt; text-decoration: underline; color:#0057ae;">Donovan Baarda</span> + </a> + </p> + <p align="right"> + <span style=" font-size:10pt;">2012-2017</span> + </p> + <p align="right"><br /> + <span style=" font-size:8pt;">访问</span> + <a href="https://github.com/opentrack/opentrack/wiki/Accela-in-opentrack-2.3"> + <span style=" font-size:8pt; text-decoration: underline; color:#0066bb;">我们的 wiki</span> + </a> + <span style=" font-size:8pt;"> 了解设置的描述.</span> + </p> +</body> + +</html></translation> + </message> +</context> +<context> + <name>accelaDll</name> + <message> + <source>Accela</source> + <translation></translation> </message> </context> <context> |
