Add logarithmic scale to control UI refresh freq. & russian translations

This commit is contained in:
Alex Spataru 2021-09-18 19:07:42 -05:00
parent 505ab1f0de
commit 782168edab
31 changed files with 2881 additions and 50 deletions

View File

@ -24,7 +24,8 @@ TRANSLATIONS += \
$$PWD/translations/en.ts \
$$PWD/translations/es.ts \
$$PWD/translations/zh.ts \
$$PWD/translations/de.ts
$$PWD/translations/de.ts \
$$PWD/translations/ru.ts
RESOURCES += \
$$PWD/icons/rcc_icons.qrc \

View File

@ -24,5 +24,5 @@ MCU-Projekten, lesen Sie bitte das Wiki:
→ https://github.com/Serial-Studio/Serial-Studio/wiki
Tipp: Doppelklicken Sie auf eine Gruppe, ein Diagramm oder ein Widget, um es in
einem anderen Fenster anzuzeigen.
Tipp: Verwenden Sie den JSON-Editor zum Erstellen und Bearbeiten von
Serial Studio-Projektdateien.

View File

@ -22,4 +22,4 @@ the wiki:
→ https://github.com/Serial-Studio/Serial-Studio/wiki
Tip: Double-click on any group, chart or widget to view it in another window.
Tip: use the JSON Editor to create and edit Serial Studio project files.

View File

@ -22,5 +22,4 @@ actuales, por favor lea la wiki:
→ https://github.com/Serial-Studio/Serial-Studio/wiki
Consejo: haga doble clic en cualquier grupo, gráfico o widget para verlo en
otra ventana.
Consejo: utilice el Editor JSON para crear y editar proyectos de Serial Studio.

View File

@ -0,0 +1,28 @@
________ _____ ______ ____________ _____________
__ ___/______________(_)_____ ___ / __ ___/_ /____ _______ /__(_)_____
_____ \_ _ \_ ___/_ /_ __ `/_ / _____ \_ __/ / / / __ /__ /_ __ \
____/ // __/ / _ / / /_/ /_ / ____/ // /_ / /_/ // /_/ / _ / / /_/ /
/____/ \___//_/ /_/ \__,_/ /_/ /____/ \__/ \__,_/ \__,_/ /_/ \____/
Добро пожаловать в Serial Studio! Для начала, пожалуйста, выберите COM-порт и
скорость передачи данных в панели панели устройств справа. Если последовательное
соединение успешно и входящие данные интерпретируются правильно, эта панель
автоматически закроется, и на экране появится приборная панель будет отображена.
В противном случае вы можете использовать консоль, чтобы найти источник вашей
проблемы.
Используйте кнопки панели инструментов для отображения функций, которые вы хотите
использовать. Если вы столкнулись с проблемой при работе с Serial Studio, сообщите
об этом по адресу:
→ https://github.com/Serial-Studio/Serial-Studio/issues
Вы также можете воспользоваться ссылками в окне "О программе". Для получения
документации по использования Serial Studio и интеграции с вашими текущими
проектами MCU, пожалуйста, прочитайте вики:
→ https://github.com/Serial-Studio/Serial-Studio/wiki
Совет: Используйте редактор JSON Editor для создания и редактирования файлов
проекта Serial Studio.

View File

@ -17,4 +17,4 @@ ____/ // __/ / _ / / /_/ /_ / ____/ // /_ / /_/ // /_/ / _ / / /_/ /
→ https://github.com/Serial-Studio/Serial-Studio/wiki
提示:双击任何组,图表或小部件以在另一个窗口中查看它
提示:使用JSON编辑器来创建和编辑Serial Studio项目文件

View File

@ -5,5 +5,6 @@
<file>Welcome_EN.txt</file>
<file>Welcome_ES.txt</file>
<file>Welcome_ZH.txt</file>
<file>Welcome_RU.txt</file>
</qresource>
</RCC>

View File

@ -36,6 +36,33 @@ Control {
property alias startSequence: _startSequence.text
property alias tcpPlugins: _tcpPlugins.checked
property alias separatorSequence: _separatorSequence.text
property alias uiRefreshRate: _uiRefreshRate.value
//
// Maps the slider position to Hz
// https://stackoverflow.com/a/846249
//
function logslider(position) {
var minp = 0
var maxp = 100
var minv = Math.log(1)
var maxv = Math.log(1000)
var scale = (maxv - minv) / (maxp - minp);
return Math.exp(minv + scale * (position - minp));
}
//
// Maps the Hz value to the slider position
// https://stackoverflow.com/a/846249
//
function logposition(value) {
var minp = 0
var maxp = 100
var minv = Math.log(1)
var maxv = Math.log(1000)
var scale = (maxv - minv) / (maxp - minp)
return (Math.log(value) - minv) / scale + minp;
}
//
// Layout
@ -130,6 +157,30 @@ Control {
}
}
//
// UI refresh frequency
//
Label {
text: qsTr("UI refresh rate") + ": "
} RowLayout {
spacing: app.spacing
Slider {
id: _uiRefreshRate
from: 0
to: 100
Layout.fillWidth: true
value: logposition(Cpp_Misc_TimerEvents.highFreqTimeoutHz)
onValueChanged: {
if (logslider(value) !== Cpp_Misc_TimerEvents.highFreqTimeoutHz)
Cpp_Misc_TimerEvents.highFreqTimeoutHz = logslider(value)
}
}
Label {
text: Cpp_Misc_TimerEvents.highFreqTimeoutHz + " Hz"
}
}
//
// Plugins enabled
//

View File

@ -80,6 +80,7 @@ Item {
property alias startSequence: settings.startSequence
property alias tcpPlugins: settings.tcpPlugins
property alias separatorSequence: settings.separatorSequence
property alias uiRefreshRate: settings.uiRefreshRate
}
//

Binary file not shown.

View File

@ -658,6 +658,145 @@
<translation>Netzwerk Schnittstelle</translation>
</message>
</context>
<context>
<name>JSON::Editor</name>
<message>
<source>Dataset widgets</source>
<translation>Widgets für Datensätze</translation>
</message>
<message>
<source>Accelerometer</source>
<translation>Beschleunigungsmesser</translation>
</message>
<message>
<source>Gyroscope</source>
<translation>Gyroskop</translation>
</message>
<message>
<source>Map</source>
<translation>Karte</translation>
</message>
<message>
<source>None</source>
<translation>Keine</translation>
</message>
<message>
<source>Gauge</source>
<translation>Messgerät</translation>
</message>
<message>
<source>Bar/level</source>
<translation>Bar/Niveau</translation>
</message>
<message>
<source>Compass</source>
<translation>Kompass</translation>
</message>
<message>
<source>New Project</source>
<translation>Neues Projekt</translation>
</message>
<message>
<source>Do you want to save your changes?</source>
<translation>Möchten Sie Ihre Änderungen speichern?</translation>
</message>
<message>
<source>You have unsaved modifications in this project!</source>
<translation>Sie haben nicht gespeicherte Änderungen in diesem Projekt!</translation>
</message>
<message>
<source>Project error</source>
<translation>Projektfehler</translation>
</message>
<message>
<source>Project title cannot be empty!</source>
<translation>Der Projekttitel darf nicht leer sein!</translation>
</message>
<message>
<source>Project error - Group %1</source>
<translation>Projektfehler - Gruppe %1</translation>
</message>
<message>
<source>Group title cannot be empty!</source>
<translation>Der Gruppentitel darf nicht leer sein!</translation>
</message>
<message>
<source>Project error - Group %1, Dataset %2</source>
<translation>Projektfehler - Gruppe %1, Datensatz %2</translation>
</message>
<message>
<source>Dataset title cannot be empty!</source>
<translation>Der Titel des Datensatzes darf nicht leer sein!</translation>
</message>
<message>
<source>Warning - Group %1, Dataset %2</source>
<translation>Warnung - Gruppe %1, Datensatz %2</translation>
</message>
<message>
<source>Dataset contains duplicate frame index position! Continue?</source>
<translation>Der Datensatz enthält eine doppelte Frame-Indexposition! Weiter?</translation>
</message>
<message>
<source>Save JSON project</source>
<translation>JSON-Projekt speichern</translation>
</message>
<message>
<source>File open error</source>
<translation>Fehler beim Öffnen einer Datei</translation>
</message>
<message>
<source>Select JSON file</source>
<translation>JSON Modelldatei auswählen</translation>
</message>
<message>
<source>New Group</source>
<translation>Neue Gruppe</translation>
</message>
<message>
<source>Delete group &quot;%1&quot;</source>
<translation>Gruppe &quot;%1&quot; löschen</translation>
</message>
<message>
<source>Are you sure you want to delete this group?</source>
<translation>Sind Sie sicher, dass Sie diese Gruppe löschen wollen?</translation>
</message>
<message>
<source>Are you sure you want to change the group-level widget?</source>
<translation>Sind Sie sicher, dass Sie das Widget auf Gruppenebene ändern möchten?</translation>
</message>
<message>
<source>Existing datasets for this group will be deleted</source>
<translation>Vorhandene Datensätze für diese Gruppe werden gelöscht</translation>
</message>
<message>
<source>Accelerometer %1</source>
<translation>Beschleunigungsmesser %1</translation>
</message>
<message>
<source>Gyro %1</source>
<translation>Kreisel %1</translation>
</message>
<message>
<source>Latitude</source>
<translation>Breitengrad</translation>
</message>
<message>
<source>Longitude</source>
<translation>Längengrad</translation>
</message>
<message>
<source>New dataset</source>
<translation>Neuer Datensatz</translation>
</message>
<message>
<source>Delete dataset &quot;%1&quot;</source>
<translation>Datensatz &quot;%1&quot; löschen</translation>
</message>
<message>
<source>Are you sure you want to delete this dataset?</source>
<translation>Sind Sie sicher, dass Sie diesen Datensatz löschen wollen?</translation>
</message>
</context>
<context>
<name>JSON::Generator</name>
<message>
@ -674,11 +813,11 @@
</message>
<message>
<source>JSON map file loaded successfully!</source>
<translation>JSON Modelldatei erfolgreich geladen!</translation>
<translation type="vanished">JSON Modelldatei erfolgreich geladen!</translation>
</message>
<message>
<source>File &quot;%1&quot; loaded into memory</source>
<translation>Datei %1 geladen</translation>
<translation type="vanished">Datei %1 geladen</translation>
</message>
<message>
<source>Cannot read JSON file</source>
@ -697,6 +836,104 @@
<translation type="vanished">Das Format der empfangenen Daten stimmt nicht mit der ausgewählten JSON Modelldatei überein.</translation>
</message>
</context>
<context>
<name>JsonDatasetDelegate</name>
<message>
<source>Dataset %1 - %2</source>
<translation>Datensatz %1 - %2</translation>
</message>
<message>
<source>Title:</source>
<translation>Titel:</translation>
</message>
<message>
<source>Sensor reading, uptime, etc...</source>
<translation>Sensormesswerte, Betriebszeit usw...</translation>
</message>
<message>
<source>Units:</source>
<translation>Einheiten:</translation>
</message>
<message>
<source>Volts, meters, seconds, etc...</source>
<translation>Volt, Meter, Sekunden, usw...</translation>
</message>
<message>
<source>Frame index:</source>
<translation>Frame-Index:</translation>
</message>
<message>
<source>Generate graph:</source>
<translation>Erzeugen Sie ein Diagramm:</translation>
</message>
<message>
<source>Widget:</source>
<translation>Widget:</translation>
</message>
<message>
<source>Min value:</source>
<translation>Minimaler Wert:</translation>
</message>
<message>
<source>Max value:</source>
<translation>Maximaler Wert:</translation>
</message>
</context>
<context>
<name>JsonEditor</name>
<message>
<source>JSON Editor - %1</source>
<translation>JSON-Editor - %1</translation>
</message>
<message>
<source>Project title (required)</source>
<translation>Projekttitel (erforderlich)</translation>
</message>
<message>
<source>Data separator (default is &apos;,&apos;)</source>
<translation>Datentrennzeichen (Standard ist &apos;,&apos;)</translation>
</message>
<message>
<source>Frame start sequence (default is &apos;%1&apos;)</source>
<translation>Startsequenz des Rahmens (Standard ist &apos;%1&apos;)</translation>
</message>
<message>
<source>Frame end sequence (default is &apos;%1&apos;)</source>
<translation>Rahmenendsequenz (Standard ist &apos;%1&apos;)</translation>
</message>
<message>
<source>Start something awesome</source>
<translation>Starten Sie etwas Großartiges</translation>
</message>
<message>
<source>Click on the &quot;%1&quot; button to begin</source>
<translation>Klicken Sie auf die Schaltfläche &quot;%1&quot;, um zu beginnen</translation>
</message>
<message>
<source>Close</source>
<translation>Schließen</translation>
</message>
<message>
<source>Add group</source>
<translation>Gruppe hinzufügen</translation>
</message>
<message>
<source>Open existing project...</source>
<translation>Vorhandenes Projekt öffnen...</translation>
</message>
<message>
<source>Create new project</source>
<translation>Neues Projekt erstellen</translation>
</message>
<message>
<source>Apply</source>
<translation>Bewerbung</translation>
</message>
<message>
<source>Save</source>
<translation>Speichern</translation>
</message>
</context>
<context>
<name>JsonGenerator</name>
<message>
@ -736,6 +973,21 @@
<translation type="vanished">JSON Dateien</translation>
</message>
</context>
<context>
<name>JsonGroupDelegate</name>
<message>
<source>Group %1 - %2</source>
<translation>Gruppe %1 - %2</translation>
</message>
<message>
<source>Title</source>
<translation>Titel</translation>
</message>
<message>
<source>Add dataset</source>
<translation>Datensatz hinzufügen</translation>
</message>
</context>
<context>
<name>MQTT</name>
<message>
@ -1466,6 +1718,14 @@
<source>Theme</source>
<translation>Thema</translation>
</message>
<message>
<source>Data separator</source>
<translation>Daten-Trennzeichen</translation>
</message>
<message>
<source>UI refresh rate</source>
<translation>UI-Aktualisierungsrate</translation>
</message>
</context>
<context>
<name>Setup</name>
@ -1619,6 +1879,10 @@
<source>Connect</source>
<translation>Verbinden</translation>
</message>
<message>
<source>JSON Editor</source>
<translation>JSON-Editor</translation>
</message>
</context>
<context>
<name>Updater</name>

Binary file not shown.

View File

@ -571,6 +571,145 @@
<translation></translation>
</message>
</context>
<context>
<name>JSON::Editor</name>
<message>
<source>Dataset widgets</source>
<translation></translation>
</message>
<message>
<source>Accelerometer</source>
<translation></translation>
</message>
<message>
<source>Gyroscope</source>
<translation></translation>
</message>
<message>
<source>Map</source>
<translation></translation>
</message>
<message>
<source>None</source>
<translation></translation>
</message>
<message>
<source>Gauge</source>
<translation></translation>
</message>
<message>
<source>Bar/level</source>
<translation></translation>
</message>
<message>
<source>Compass</source>
<translation></translation>
</message>
<message>
<source>New Project</source>
<translation></translation>
</message>
<message>
<source>Do you want to save your changes?</source>
<translation></translation>
</message>
<message>
<source>You have unsaved modifications in this project!</source>
<translation></translation>
</message>
<message>
<source>Project error</source>
<translation></translation>
</message>
<message>
<source>Project title cannot be empty!</source>
<translation></translation>
</message>
<message>
<source>Project error - Group %1</source>
<translation></translation>
</message>
<message>
<source>Group title cannot be empty!</source>
<translation></translation>
</message>
<message>
<source>Project error - Group %1, Dataset %2</source>
<translation></translation>
</message>
<message>
<source>Dataset title cannot be empty!</source>
<translation></translation>
</message>
<message>
<source>Warning - Group %1, Dataset %2</source>
<translation></translation>
</message>
<message>
<source>Dataset contains duplicate frame index position! Continue?</source>
<translation></translation>
</message>
<message>
<source>Save JSON project</source>
<translation></translation>
</message>
<message>
<source>File open error</source>
<translation></translation>
</message>
<message>
<source>Select JSON file</source>
<translation></translation>
</message>
<message>
<source>New Group</source>
<translation></translation>
</message>
<message>
<source>Delete group &quot;%1&quot;</source>
<translation></translation>
</message>
<message>
<source>Are you sure you want to delete this group?</source>
<translation></translation>
</message>
<message>
<source>Are you sure you want to change the group-level widget?</source>
<translation></translation>
</message>
<message>
<source>Existing datasets for this group will be deleted</source>
<translation></translation>
</message>
<message>
<source>Accelerometer %1</source>
<translation></translation>
</message>
<message>
<source>Gyro %1</source>
<translation></translation>
</message>
<message>
<source>Latitude</source>
<translation></translation>
</message>
<message>
<source>Longitude</source>
<translation></translation>
</message>
<message>
<source>New dataset</source>
<translation></translation>
</message>
<message>
<source>Delete dataset &quot;%1&quot;</source>
<translation></translation>
</message>
<message>
<source>Are you sure you want to delete this dataset?</source>
<translation></translation>
</message>
</context>
<context>
<name>JSON::Generator</name>
<message>
@ -585,14 +724,6 @@
<source>JSON parse error</source>
<translation></translation>
</message>
<message>
<source>JSON map file loaded successfully!</source>
<translation></translation>
</message>
<message>
<source>File &quot;%1&quot; loaded into memory</source>
<translation></translation>
</message>
<message>
<source>Cannot read JSON file</source>
<translation></translation>
@ -602,6 +733,119 @@
<translation></translation>
</message>
</context>
<context>
<name>JsonDatasetDelegate</name>
<message>
<source>Dataset %1 - %2</source>
<translation></translation>
</message>
<message>
<source>Title:</source>
<translation></translation>
</message>
<message>
<source>Sensor reading, uptime, etc...</source>
<translation></translation>
</message>
<message>
<source>Units:</source>
<translation></translation>
</message>
<message>
<source>Volts, meters, seconds, etc...</source>
<translation></translation>
</message>
<message>
<source>Frame index:</source>
<translation></translation>
</message>
<message>
<source>Generate graph:</source>
<translation></translation>
</message>
<message>
<source>Widget:</source>
<translation></translation>
</message>
<message>
<source>Min value:</source>
<translation></translation>
</message>
<message>
<source>Max value:</source>
<translation></translation>
</message>
</context>
<context>
<name>JsonEditor</name>
<message>
<source>JSON Editor - %1</source>
<translation></translation>
</message>
<message>
<source>Project title (required)</source>
<translation></translation>
</message>
<message>
<source>Data separator (default is &apos;,&apos;)</source>
<translation></translation>
</message>
<message>
<source>Frame start sequence (default is &apos;%1&apos;)</source>
<translation></translation>
</message>
<message>
<source>Frame end sequence (default is &apos;%1&apos;)</source>
<translation></translation>
</message>
<message>
<source>Start something awesome</source>
<translation></translation>
</message>
<message>
<source>Click on the &quot;%1&quot; button to begin</source>
<translation></translation>
</message>
<message>
<source>Close</source>
<translation></translation>
</message>
<message>
<source>Add group</source>
<translation></translation>
</message>
<message>
<source>Open existing project...</source>
<translation></translation>
</message>
<message>
<source>Create new project</source>
<translation></translation>
</message>
<message>
<source>Apply</source>
<translation></translation>
</message>
<message>
<source>Save</source>
<translation></translation>
</message>
</context>
<context>
<name>JsonGroupDelegate</name>
<message>
<source>Group %1 - %2</source>
<translation></translation>
</message>
<message>
<source>Title</source>
<translation></translation>
</message>
<message>
<source>Add dataset</source>
<translation></translation>
</message>
</context>
<context>
<name>MQTT</name>
<message>
@ -1256,6 +1500,14 @@
<source>Theme</source>
<translation></translation>
</message>
<message>
<source>Data separator</source>
<translation></translation>
</message>
<message>
<source>UI refresh rate</source>
<translation></translation>
</message>
</context>
<context>
<name>Setup</name>
@ -1354,6 +1606,10 @@
<source>Connect</source>
<translation></translation>
</message>
<message>
<source>JSON Editor</source>
<translation></translation>
</message>
</context>
<context>
<name>Updater</name>

Binary file not shown.

View File

@ -690,6 +690,145 @@
<translation>Puerto de red</translation>
</message>
</context>
<context>
<name>JSON::Editor</name>
<message>
<source>Dataset widgets</source>
<translation>Widgets de conjuntos de datos</translation>
</message>
<message>
<source>Accelerometer</source>
<translation>Acelerómetro</translation>
</message>
<message>
<source>Gyroscope</source>
<translation>Giroscopio</translation>
</message>
<message>
<source>Map</source>
<translation>Mapa</translation>
</message>
<message>
<source>None</source>
<translation>Ninguno</translation>
</message>
<message>
<source>Gauge</source>
<translation>Calibre</translation>
</message>
<message>
<source>Bar/level</source>
<translation>Barra/nivel</translation>
</message>
<message>
<source>Compass</source>
<translation>Brújula</translation>
</message>
<message>
<source>New Project</source>
<translation>Nuevo proyecto</translation>
</message>
<message>
<source>Do you want to save your changes?</source>
<translation>¿Quieres guardar los cambios?</translation>
</message>
<message>
<source>You have unsaved modifications in this project!</source>
<translation>¡Tienes modificaciones sin guardar en este proyecto!</translation>
</message>
<message>
<source>Project error</source>
<translation>Error de proyecto</translation>
</message>
<message>
<source>Project title cannot be empty!</source>
<translation>El título del proyecto no puede estar vacío.</translation>
</message>
<message>
<source>Project error - Group %1</source>
<translation>Error de proyecto - Grupo %1</translation>
</message>
<message>
<source>Group title cannot be empty!</source>
<translation>El título del grupo no puede estar vacío.</translation>
</message>
<message>
<source>Project error - Group %1, Dataset %2</source>
<translation>Error de proyecto - Grupo %1, Conjunto de datos %2</translation>
</message>
<message>
<source>Dataset title cannot be empty!</source>
<translation>El título del conjunto de datos no puede estar vacío.</translation>
</message>
<message>
<source>Warning - Group %1, Dataset %2</source>
<translation>Advertencia - Grupo %1, conjunto de datos %2</translation>
</message>
<message>
<source>Dataset contains duplicate frame index position! Continue?</source>
<translation>El conjunto de datos contiene una posición de índice de trama duplicada. ¿Continuar?</translation>
</message>
<message>
<source>Save JSON project</source>
<translation>Guardar proyecto JSON</translation>
</message>
<message>
<source>File open error</source>
<translation>Error al abrir el archivo</translation>
</message>
<message>
<source>Select JSON file</source>
<translation>Seleccionar archivo JSON</translation>
</message>
<message>
<source>New Group</source>
<translation>Nuevo grupo</translation>
</message>
<message>
<source>Delete group &quot;%1&quot;</source>
<translation>Eliminar el grupo &quot;%1&quot;</translation>
</message>
<message>
<source>Are you sure you want to delete this group?</source>
<translation>¿Estás seguro/a de que quieres eliminar este grupo?</translation>
</message>
<message>
<source>Are you sure you want to change the group-level widget?</source>
<translation>¿Estás seguro/a de que quieres cambiar el widget a nivel de grupo?</translation>
</message>
<message>
<source>Existing datasets for this group will be deleted</source>
<translation>Los conjuntos de datos existentes para este grupo se eliminarán</translation>
</message>
<message>
<source>Accelerometer %1</source>
<translation>Acelerómetro %1</translation>
</message>
<message>
<source>Gyro %1</source>
<translation>Giroscopio %1</translation>
</message>
<message>
<source>Latitude</source>
<translation>Latitud</translation>
</message>
<message>
<source>Longitude</source>
<translation>Longitud</translation>
</message>
<message>
<source>New dataset</source>
<translation>Nuevo conjunto de datos</translation>
</message>
<message>
<source>Delete dataset &quot;%1&quot;</source>
<translation>Eliminar el conjunto de datos &quot;%1&quot;</translation>
</message>
<message>
<source>Are you sure you want to delete this dataset?</source>
<translation>¿Está seguro/a de que quiere eliminar este conjunto de datos?</translation>
</message>
</context>
<context>
<name>JSON::Generator</name>
<message>
@ -706,11 +845,11 @@
</message>
<message>
<source>JSON map file loaded successfully!</source>
<translation>¡El archivo de mapa JSON se cargó correctamente!</translation>
<translation type="vanished">¡El archivo de mapa JSON se cargó correctamente!</translation>
</message>
<message>
<source>File &quot;%1&quot; loaded into memory</source>
<translation>Archivo &quot;%1&quot; cargado en memoria</translation>
<translation type="vanished">Archivo &quot;%1&quot; cargado en memoria</translation>
</message>
<message>
<source>Cannot read JSON file</source>
@ -729,6 +868,104 @@
<translation type="vanished">El formato de los datos recibidos no se corresponde con el archivo de mapa JSON seleccionado.</translation>
</message>
</context>
<context>
<name>JsonDatasetDelegate</name>
<message>
<source>Dataset %1 - %2</source>
<translation>Conjunto de datos %1 - %2</translation>
</message>
<message>
<source>Title:</source>
<translation>Título:</translation>
</message>
<message>
<source>Sensor reading, uptime, etc...</source>
<translation>Lectura del sensor, tiempo de funcionamiento, etc...</translation>
</message>
<message>
<source>Units:</source>
<translation>Unidades:</translation>
</message>
<message>
<source>Volts, meters, seconds, etc...</source>
<translation>Voltios, metros, segundos, etc...</translation>
</message>
<message>
<source>Frame index:</source>
<translation>Índice de la trama:</translation>
</message>
<message>
<source>Generate graph:</source>
<translation>Generar gráfico:</translation>
</message>
<message>
<source>Widget:</source>
<translation>Widget:</translation>
</message>
<message>
<source>Min value:</source>
<translation>Valor mínimo:</translation>
</message>
<message>
<source>Max value:</source>
<translation>Valor máximo:</translation>
</message>
</context>
<context>
<name>JsonEditor</name>
<message>
<source>JSON Editor - %1</source>
<translation>Editor JSON - %1</translation>
</message>
<message>
<source>Project title (required)</source>
<translation>Título del proyecto (obligatorio)</translation>
</message>
<message>
<source>Data separator (default is &apos;,&apos;)</source>
<translation>Separador de datos (por defecto es &apos;,&apos;)</translation>
</message>
<message>
<source>Frame start sequence (default is &apos;%1&apos;)</source>
<translation>Secuencia de inicio de la trama (por defecto es &apos;%1&apos;)</translation>
</message>
<message>
<source>Frame end sequence (default is &apos;%1&apos;)</source>
<translation>Secuencia de fin de la trarma (por defecto es &apos;%1&apos;)</translation>
</message>
<message>
<source>Start something awesome</source>
<translation>Comienza algo increíble</translation>
</message>
<message>
<source>Click on the &quot;%1&quot; button to begin</source>
<translation>Haga clic en el botón &quot;%1&quot; para comenzar</translation>
</message>
<message>
<source>Close</source>
<translation>Cerrar</translation>
</message>
<message>
<source>Add group</source>
<translation>Agregar grupo</translation>
</message>
<message>
<source>Open existing project...</source>
<translation>Abrir un proyecto existente...</translation>
</message>
<message>
<source>Create new project</source>
<translation>Crear nuevo proyecto</translation>
</message>
<message>
<source>Apply</source>
<translation>Aplicar</translation>
</message>
<message>
<source>Save</source>
<translation>Guardar</translation>
</message>
</context>
<context>
<name>JsonGenerator</name>
<message>
@ -772,6 +1009,21 @@
<translation type="vanished">Archivos JSON</translation>
</message>
</context>
<context>
<name>JsonGroupDelegate</name>
<message>
<source>Group %1 - %2</source>
<translation>Grupo %1 - %2</translation>
</message>
<message>
<source>Title</source>
<translation>Título</translation>
</message>
<message>
<source>Add dataset</source>
<translation>Agregar conjunto de datos</translation>
</message>
</context>
<context>
<name>JsonParser</name>
<message>
@ -1585,6 +1837,14 @@
<source>Theme</source>
<translation>Tema</translation>
</message>
<message>
<source>Data separator</source>
<translation>Separador de datos</translation>
</message>
<message>
<source>UI refresh rate</source>
<translation>Frec. de actualización</translation>
</message>
</context>
<context>
<name>Setup</name>
@ -1774,6 +2034,10 @@
<source>Connect</source>
<translation>Conectar</translation>
</message>
<message>
<source>JSON Editor</source>
<translation>Editor JSON</translation>
</message>
</context>
<context>
<name>Updater</name>

View File

@ -4,5 +4,6 @@
<file>en.qm</file>
<file>es.qm</file>
<file>zh.qm</file>
<file>ru.qm</file>
</qresource>
</RCC>

BIN
assets/translations/ru.qm Normal file

Binary file not shown.

1648
assets/translations/ru.ts Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -686,6 +686,145 @@
<translation></translation>
</message>
</context>
<context>
<name>JSON::Editor</name>
<message>
<source>Dataset widgets</source>
<translation></translation>
</message>
<message>
<source>Accelerometer</source>
<translation></translation>
</message>
<message>
<source>Gyroscope</source>
<translation></translation>
</message>
<message>
<source>Map</source>
<translation></translation>
</message>
<message>
<source>None</source>
<translation></translation>
</message>
<message>
<source>Gauge</source>
<translation></translation>
</message>
<message>
<source>Bar/level</source>
<translation>/</translation>
</message>
<message>
<source>Compass</source>
<translation></translation>
</message>
<message>
<source>New Project</source>
<translation></translation>
</message>
<message>
<source>Do you want to save your changes?</source>
<translation></translation>
</message>
<message>
<source>You have unsaved modifications in this project!</source>
<translation>!</translation>
</message>
<message>
<source>Project error</source>
<translation></translation>
</message>
<message>
<source>Project title cannot be empty!</source>
<translation>!</translation>
</message>
<message>
<source>Project error - Group %1</source>
<translation>Project error - Group %1</translation>
</message>
<message>
<source>Group title cannot be empty!</source>
<translation>!</translation>
</message>
<message>
<source>Project error - Group %1, Dataset %2</source>
<translation> - %1%2</translation>
</message>
<message>
<source>Dataset title cannot be empty!</source>
<translation>!</translation>
</message>
<message>
<source>Warning - Group %1, Dataset %2</source>
<translation> - %1, %2</translation>
</message>
<message>
<source>Dataset contains duplicate frame index position! Continue?</source>
<translation>! </translation>
</message>
<message>
<source>Save JSON project</source>
<translation>JSON项目</translation>
</message>
<message>
<source>File open error</source>
<translation></translation>
</message>
<message>
<source>Select JSON file</source>
<translation>JSON映射文件</translation>
</message>
<message>
<source>New Group</source>
<translation></translation>
</message>
<message>
<source>Delete group &quot;%1&quot;</source>
<translation>&quot;%1&quot;</translation>
</message>
<message>
<source>Are you sure you want to delete this group?</source>
<translation></translation>
</message>
<message>
<source>Are you sure you want to change the group-level widget?</source>
<translation></translation>
</message>
<message>
<source>Existing datasets for this group will be deleted</source>
<translation></translation>
</message>
<message>
<source>Accelerometer %1</source>
<translation>%1</translation>
</message>
<message>
<source>Gyro %1</source>
<translation> %1</translation>
</message>
<message>
<source>Latitude</source>
<translation></translation>
</message>
<message>
<source>Longitude</source>
<translation></translation>
</message>
<message>
<source>New dataset</source>
<translation></translation>
</message>
<message>
<source>Delete dataset &quot;%1&quot;</source>
<translation>&quot;%1&quot;</translation>
</message>
<message>
<source>Are you sure you want to delete this dataset?</source>
<translation></translation>
</message>
</context>
<context>
<name>JSON::Generator</name>
<message>
@ -702,11 +841,11 @@
</message>
<message>
<source>JSON map file loaded successfully!</source>
<translation>JSON映射文件已成功加载</translation>
<translation type="vanished">JSON映射文件已成功加载</translation>
</message>
<message>
<source>File &quot;%1&quot; loaded into memory</source>
<translation>%1</translation>
<translation type="vanished">%1</translation>
</message>
<message>
<source>Cannot read JSON file</source>
@ -725,6 +864,104 @@
<translation type="vanished">JSON映射文件不对应</translation>
</message>
</context>
<context>
<name>JsonDatasetDelegate</name>
<message>
<source>Dataset %1 - %2</source>
<translation> %1 - %2</translation>
</message>
<message>
<source>Title:</source>
<translation></translation>
</message>
<message>
<source>Sensor reading, uptime, etc...</source>
<translation>...</translation>
</message>
<message>
<source>Units:</source>
<translation></translation>
</message>
<message>
<source>Volts, meters, seconds, etc...</source>
<translation>...</translation>
</message>
<message>
<source>Frame index:</source>
<translation></translation>
</message>
<message>
<source>Generate graph:</source>
<translation></translation>
</message>
<message>
<source>Widget:</source>
<translation></translation>
</message>
<message>
<source>Min value:</source>
<translation></translation>
</message>
<message>
<source>Max value:</source>
<translation></translation>
</message>
</context>
<context>
<name>JsonEditor</name>
<message>
<source>JSON Editor - %1</source>
<translation>JSON编辑器 - %1</translation>
</message>
<message>
<source>Project title (required)</source>
<translation></translation>
</message>
<message>
<source>Data separator (default is &apos;,&apos;)</source>
<translation>&apos;&apos;</translation>
</message>
<message>
<source>Frame start sequence (default is &apos;%1&apos;)</source>
<translation>&apos;%1&apos;</translation>
</message>
<message>
<source>Frame end sequence (default is &apos;%1&apos;)</source>
<translation>&apos;%1&apos;</translation>
</message>
<message>
<source>Start something awesome</source>
<translation></translation>
</message>
<message>
<source>Click on the &quot;%1&quot; button to begin</source>
<translation>&quot;%1 &quot;</translation>
</message>
<message>
<source>Close</source>
<translation></translation>
</message>
<message>
<source>Add group</source>
<translation></translation>
</message>
<message>
<source>Open existing project...</source>
<translation>...</translation>
</message>
<message>
<source>Create new project</source>
<translation></translation>
</message>
<message>
<source>Apply</source>
<translation></translation>
</message>
<message>
<source>Save</source>
<translation></translation>
</message>
</context>
<context>
<name>JsonGenerator</name>
<message>
@ -768,6 +1005,21 @@
<translation type="vanished">JSON文件</translation>
</message>
</context>
<context>
<name>JsonGroupDelegate</name>
<message>
<source>Group %1 - %2</source>
<translation> %1 - %2</translation>
</message>
<message>
<source>Title</source>
<translation></translation>
</message>
<message>
<source>Add dataset</source>
<translation></translation>
</message>
</context>
<context>
<name>MQTT</name>
<message>
@ -1502,6 +1754,14 @@
<source>Theme</source>
<translation></translation>
</message>
<message>
<source>Data separator</source>
<translation></translation>
</message>
<message>
<source>UI refresh rate</source>
<translation>UI刷新率</translation>
</message>
</context>
<context>
<name>Setup</name>
@ -1679,6 +1939,10 @@
<source>Connect</source>
<translation></translation>
</message>
<message>
<source>JSON Editor</source>
<translation>JSON编辑器</translation>
</message>
</context>
<context>
<name>Updater</name>

View File

@ -54,7 +54,7 @@ Export::Export()
auto ge = JSON::Generator::getInstance();
auto te = Misc::TimerEvents::getInstance();
connect(io, &IO::Manager::connectedChanged, this, &Export::closeFile);
connect(te, &Misc::TimerEvents::timeout1Hz, this, &Export::writeValues);
connect(te, &Misc::TimerEvents::lowFreqTimeout, this, &Export::writeValues);
connect(ge, &JSON::Generator::jsonChanged, this, &Export::registerFrame);
LOG_TRACE() << "Class initialized";

View File

@ -99,7 +99,7 @@ Console::Console()
// Read received data automatically
auto dm = Manager::getInstance();
auto te = Misc::TimerEvents::getInstance();
connect(te, SIGNAL(timeout42Hz()), this, SLOT(displayData()));
connect(te, SIGNAL(highFreqTimeout()), this, SLOT(displayData()));
connect(dm, &Manager::dataSent, this, &Console::onDataSent);
connect(dm, &Manager::dataReceived, this, &Console::onDataReceived);

View File

@ -55,7 +55,7 @@ Serial::Serial()
// Build serial devices list
auto te = Misc::TimerEvents::getInstance();
connect(te, SIGNAL(timeout1Hz()), this, SLOT(refreshSerialDevices()));
connect(te, SIGNAL(lowFreqTimeout()), this, SLOT(refreshSerialDevices()));
// Log class init
LOG_TRACE() << "Class initialized";

View File

@ -55,7 +55,7 @@ Client::Client()
auto io = IO::Manager::getInstance();
auto ge = JSON::Generator::getInstance();
auto te = Misc::TimerEvents::getInstance();
connect(te, &Misc::TimerEvents::timeout42Hz, this, &Client::sendData);
connect(te, &Misc::TimerEvents::highFreqTimeout, this, &Client::sendData);
connect(io, &IO::Manager::connectedChanged, this, &Client::resetStatistics);
connect(ge, &JSON::Generator::jsonChanged, this, &Client::registerJsonFrame);

View File

@ -159,6 +159,7 @@ void ModuleManager::initializeQmlInterface()
auto mqttPublisher = MQTT::Client::getInstance();
auto pluginsBridge = Plugins::Bridge::getInstance();
auto macExtras = Misc::MacExtras::getInstance();
auto timerEvents = Misc::TimerEvents::getInstance();
LOG_INFO() << "Finished initializing C++ modules";
// Retranslate the QML interface automagically
@ -186,6 +187,7 @@ void ModuleManager::initializeQmlInterface()
c->setContextProperty("Cpp_MQTT_Client", mqttPublisher);
c->setContextProperty("Cpp_Plugins_Bridge", pluginsBridge);
c->setContextProperty("Cpp_Misc_MacExtras", macExtras);
c->setContextProperty("Cpp_Misc_TimerEvents", timerEvents);
// Register app info with QML
c->setContextProperty("Cpp_AppName", qApp->applicationName());
@ -198,7 +200,7 @@ void ModuleManager::initializeQmlInterface()
engine()->load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
// Start common event timers
Misc::TimerEvents::getInstance()->startTimers();
timerEvents->startTimers();
// Log QML engine status
LOG_INFO() << "Finished loading QML interface";

View File

@ -27,29 +27,38 @@
#include <ConsoleAppender.h>
using namespace Misc;
#define HZ_TO_MS(x) qCeil(1000 / x)
/**
/**º
* Pointer to the only instance of the class
*/
static TimerEvents *INSTANCE = nullptr;
/**
* Converts the given @a hz to milliseconds
*/
static int HZ_TO_MS(const int hz)
{
const double rHz = hz;
const double uHz = 1000;
return qRound(uHz / rHz);
}
/**
* Constructor function
*/
TimerEvents::TimerEvents()
{
// Configure timeout intevals
m_timer1Hz.setInterval(HZ_TO_MS(1));
m_timer42Hz.setInterval(HZ_TO_MS(42));
m_timerLowFreq.setInterval(HZ_TO_MS(1));
m_timerHighFreq.setInterval(HZ_TO_MS(21));
// Configure timer precision
m_timer1Hz.setTimerType(Qt::PreciseTimer);
m_timer42Hz.setTimerType(Qt::PreciseTimer);
m_timerLowFreq.setTimerType(Qt::PreciseTimer);
m_timerHighFreq.setTimerType(Qt::PreciseTimer);
// Configure signals/slots
connect(&m_timer1Hz, &QTimer::timeout, this, &TimerEvents::timeout1Hz);
connect(&m_timer42Hz, &QTimer::timeout, this, &TimerEvents::timeout42Hz);
connect(&m_timerLowFreq, &QTimer::timeout, this, &TimerEvents::lowFreqTimeout);
connect(&m_timerHighFreq, &QTimer::timeout, this, &TimerEvents::highFreqTimeout);
LOG_TRACE() << "Class initialized";
}
@ -64,13 +73,21 @@ TimerEvents *TimerEvents::getInstance()
return INSTANCE;
}
/**
* Returns the target UI refresh frequency
*/
int TimerEvents::highFreqTimeoutHz() const
{
return HZ_TO_MS(m_timerHighFreq.interval());
}
/**
* Stops all the timers of this module
*/
void TimerEvents::stopTimers()
{
m_timer1Hz.stop();
m_timer42Hz.stop();
m_timerLowFreq.stop();
m_timerHighFreq.stop();
LOG_INFO() << "Timers stopped";
}
@ -80,8 +97,26 @@ void TimerEvents::stopTimers()
*/
void TimerEvents::startTimers()
{
m_timer1Hz.start();
m_timer42Hz.start();
m_timerLowFreq.start();
m_timerHighFreq.start();
LOG_TRACE() << "Timers started";
}
/**
* Updates the target UI refresh frequency
*/
void TimerEvents::setHighFreqTimeout(const int hz)
{
if (hz > 0)
{
m_timerHighFreq.setInterval(HZ_TO_MS(hz));
emit highFreqTimeoutChanged();
}
else
{
m_timerHighFreq.setInterval(HZ_TO_MS(1));
emit highFreqTimeoutChanged();
}
}

View File

@ -30,25 +30,34 @@ namespace Misc
{
class TimerEvents : public QObject
{
// clang-format off
Q_OBJECT
Q_PROPERTY(int highFreqTimeoutHz
READ highFreqTimeoutHz
WRITE setHighFreqTimeout
NOTIFY highFreqTimeoutChanged)
// clang-format on
signals:
void timeout1Hz();
void timeout42Hz();
void lowFreqTimeout();
void highFreqTimeout();
void highFreqTimeoutChanged();
public:
static TimerEvents *getInstance();
int highFreqTimeoutHz() const;
public slots:
void stopTimers();
void startTimers();
void setHighFreqTimeout(const int hz);
private:
TimerEvents();
private:
QTimer m_timer1Hz;
QTimer m_timer42Hz;
QTimer m_timerLowFreq;
QTimer m_timerHighFreq;
};
}

View File

@ -83,6 +83,9 @@ int Translator::systemLanguage() const
case QLocale::German:
lang = 3;
break;
case QLocale::Russian:
lang = 4;
break;
default:
lang = 0;
break;
@ -111,6 +114,9 @@ QString Translator::welcomeConsoleText() const
case 3:
lang = "DE";
break;
case 4:
lang = "RU";
break;
default:
lang = "EN";
break;
@ -148,7 +154,7 @@ QString Translator::acknowledgementsText() const
*/
QStringList Translator::availableLanguages() const
{
return QStringList { "English", "Español", "简体中文", "Deutsch" };
return QStringList { "English", "Español", "简体中文", "Deutsch", "Русский" };
}
/**
@ -180,6 +186,10 @@ void Translator::setLanguage(const int language)
langName = "de";
locale = QLocale(QLocale::German);
break;
case 4:
langName = "ru";
locale = QLocale(QLocale::Russian);
break;
default:
langName = "en";
locale = QLocale(QLocale::English);

View File

@ -50,7 +50,7 @@ Bridge::Bridge()
auto ge = JSON::Generator::getInstance();
auto te = Misc::TimerEvents::getInstance();
connect(ge, &JSON::Generator::jsonChanged, this, &Bridge::registerFrame);
connect(te, &Misc::TimerEvents::timeout42Hz, this, &Bridge::sendProcessedData);
connect(te, &Misc::TimerEvents::highFreqTimeout, this, &Bridge::sendProcessedData);
// Send I/O "raw" data directly
auto io = IO::Manager::getInstance();

View File

@ -48,7 +48,7 @@ DataProvider::DataProvider()
auto ge = JSON::Generator::getInstance();
auto te = Misc::TimerEvents::getInstance();
connect(cp, SIGNAL(openChanged()), this, SLOT(resetData()));
connect(te, SIGNAL(timeout42Hz()), this, SLOT(updateData()));
connect(te, SIGNAL(highFreqTimeout()), this, SLOT(updateData()));
connect(io, SIGNAL(connectedChanged()), this, SLOT(resetData()));
connect(ge, SIGNAL(jsonFileMapChanged()), this, SLOT(resetData()));
connect(ge, &JSON::Generator::jsonChanged, this, &DataProvider::selectLatestJSON);
@ -115,10 +115,6 @@ JSON::Group *DataProvider::getGroup(const int index)
*/
void DataProvider::resetData()
{
// Stop if dev a device is connected or if CSV file is open
if (IO::Manager::getInstance()->connected() || CSV::Player::getInstance()->isOpen())
return;
// Make latest frame invalid
m_latestJsonFrame = JFI_Empty();
m_latestFrame.read(m_latestJsonFrame.jsonDocument.object());

View File

@ -71,8 +71,9 @@ GraphProvider::GraphProvider()
auto ge = JSON::Generator::getInstance();
auto te = Misc::TimerEvents::getInstance();
connect(cp, SIGNAL(openChanged()), this, SLOT(resetData()));
connect(te, SIGNAL(timeout42Hz()), this, SLOT(drawGraphs()));
connect(te, SIGNAL(highFreqTimeout()), this, SLOT(drawGraphs()));
connect(io, SIGNAL(connectedChanged()), this, SLOT(resetData()));
connect(ge, SIGNAL(jsonFileMapChanged()), this, SLOT(resetData()));
connect(ge, &JSON::Generator::jsonChanged, this, &GraphProvider::registerFrame);
// Avoid issues when CSV player goes backwards