summaryrefslogtreecommitdiffhomepage
path: root/filter-accela
diff options
context:
space:
mode:
Diffstat (limited to 'filter-accela')
-rw-r--r--filter-accela/accela-settings.hpp23
-rw-r--r--filter-accela/ftnoir_accela_filtercontrols.ui35
-rw-r--r--filter-accela/ftnoir_filter_accela.cpp114
-rw-r--r--filter-accela/ftnoir_filter_accela.h23
-rw-r--r--filter-accela/ftnoir_filter_accela_dialog.cpp16
-rw-r--r--filter-accela/lang/de_DE.ts57
-rw-r--r--filter-accela/lang/nl_NL.ts7
-rw-r--r--filter-accela/lang/ru_RU.ts7
-rw-r--r--filter-accela/lang/stub.ts7
-rw-r--r--filter-accela/lang/zh_CN.ts46
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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;right&quot;&gt;&lt;br/&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Accela by &lt;/span&gt;&lt;a href=&quot;https://github.com/sthalik&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0057ae;&quot;&gt;Stanisław Halik&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;&lt;br/&gt;Thanks to &lt;/span&gt;&lt;a href=&quot;https://github.com/dbaarda&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0057ae;&quot;&gt;Donovan Baarda&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align=&quot;right&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;2012-2017&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;right&quot;&gt;&lt;br/&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Visit &lt;/span&gt;&lt;a href=&quot;https://github.com/opentrack/opentrack/wiki/Accela-in-opentrack-2.3&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0000ff;&quot;&gt;our wiki&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; for description of the settings.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;right&quot;&gt;&lt;br/&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Accela by &lt;/span&gt;&lt;a href=&quot;https://github.com/sthalik&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0057ae;&quot;&gt;Stanisław Halik&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;&lt;br/&gt;Thanks to &lt;/span&gt;&lt;a href=&quot;https://github.com/dbaarda&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0057ae;&quot;&gt;Donovan Baarda&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align=&quot;right&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;2012-2017&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;right&quot;&gt;&lt;br/&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;In &lt;/span&gt;&lt;a href=&quot;https://github.com/opentrack/opentrack/wiki/Accela-in-opentrack-2.3&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0000ff;&quot;&gt;unserem Wiki&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; gibt es eine Beschreibung der Einstellungen.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;right&quot;&gt;&lt;br/&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Accela by &lt;/span&gt;&lt;a href=&quot;https://github.com/sthalik&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0057ae;&quot;&gt;Stanisław Halik&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;&lt;br/&gt;Thanks to &lt;/span&gt;&lt;a href=&quot;https://github.com/dbaarda&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0057ae;&quot;&gt;Donovan Baarda&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align=&quot;right&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;2012-2017&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;right&quot;&gt;&lt;br/&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Visit &lt;/span&gt;&lt;a href=&quot;https://github.com/opentrack/opentrack/wiki/Accela-in-opentrack-2.3&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0000ff;&quot;&gt;our wiki&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; for description of the settings.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">&lt;html&gt;
+
+&lt;body&gt;
+ &lt;p align=&quot;right&quot;&gt;&lt;br /&gt;
+ &lt;span style=&quot; font-size:10pt;&quot;&gt;Accela by &lt;/span&gt;
+ &lt;a href=&quot;https://github.com/sthalik&quot;&gt;
+ &lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0057ae;&quot;&gt;Stanisław Halik&lt;/span&gt;
+ &lt;/a&gt;
+ &lt;span style=&quot; font-size:10pt;&quot;&gt;&lt;br /&gt;Thanks to &lt;/span&gt;
+ &lt;a href=&quot;https://github.com/dbaarda&quot;&gt;
+ &lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0057ae;&quot;&gt;Donovan Baarda&lt;/span&gt;
+ &lt;/a&gt;
+ &lt;/p&gt;
+ &lt;p align=&quot;right&quot;&gt;
+ &lt;span style=&quot; font-size:10pt;&quot;&gt;2012-2017&lt;/span&gt;
+ &lt;/p&gt;
+ &lt;p align=&quot;right&quot;&gt;&lt;br /&gt;
+ &lt;span style=&quot; font-size:8pt;&quot;&gt;访问&lt;/span&gt;
+ &lt;a href=&quot;https://github.com/opentrack/opentrack/wiki/Accela-in-opentrack-2.3&quot;&gt;
+ &lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0066bb;&quot;&gt;我们的 wiki&lt;/span&gt;
+ &lt;/a&gt;
+ &lt;span style=&quot; font-size:8pt;&quot;&gt; 了解设置的描述.&lt;/span&gt;
+ &lt;/p&gt;
+&lt;/body&gt;
+
+&lt;/html&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>accelaDll</name>
+ <message>
+ <source>Accela</source>
+ <translation></translation>
</message>
</context>
<context>