From 84c2d8577ef1b3af09e1f93ace04c18817188260 Mon Sep 17 00:00:00 2001 From: philmoz Date: Mon, 12 Feb 2024 13:01:54 +1100 Subject: [PATCH] feat(radio): allow prec. for mix slow up/dn to be set to 10 or 100ms (#4612) --- .../src/firmwares/edgetx/yaml_mixdata.cpp | 2 + companion/src/firmwares/mixdata.h | 1 + companion/src/modeledit/mixerdialog.cpp | 41 +- companion/src/modeledit/mixerdialog.ui | 501 +++++++++--------- companion/src/modelprinter.cpp | 4 + radio/src/datastructs_private.h | 2 +- radio/src/gui/128x64/gui.h | 4 +- radio/src/gui/128x64/menu_model.cpp | 4 +- radio/src/gui/128x64/model_flightmodes.cpp | 4 +- radio/src/gui/128x64/model_mix_edit.cpp | 13 +- radio/src/gui/212x64/gui.h | 4 +- radio/src/gui/212x64/menu_model.cpp | 4 +- radio/src/gui/212x64/model_mix_edit.cpp | 13 +- radio/src/gui/colorlcd/mixer_edit_adv.cpp | 32 +- radio/src/gui/colorlcd/mixer_edit_adv.h | 3 + radio/src/mixer.cpp | 5 +- .../storage/yaml/yaml_datastructs_128x64.cpp | 2 +- .../storage/yaml/yaml_datastructs_nv14.cpp | 2 +- .../storage/yaml/yaml_datastructs_pl18.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_t20.cpp | 2 +- .../storage/yaml/yaml_datastructs_tpro.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_x10.cpp | 2 +- .../storage/yaml/yaml_datastructs_x12s.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 2 +- .../storage/yaml/yaml_datastructs_xlites.cpp | 2 +- radio/src/tests/mixer.cpp | 86 ++- radio/src/translations.cpp | 2 + radio/src/translations.h | 2 + radio/src/translations/cn.h | 2 + radio/src/translations/cz.h | 2 + radio/src/translations/da.h | 2 + radio/src/translations/de.h | 2 + radio/src/translations/en.h | 2 + radio/src/translations/es.h | 2 + radio/src/translations/fi.h | 2 + radio/src/translations/fr.h | 2 + radio/src/translations/he.h | 2 + radio/src/translations/it.h | 2 + radio/src/translations/jp.h | 2 + radio/src/translations/nl.h | 2 + radio/src/translations/pl.h | 2 + radio/src/translations/pt.h | 2 + radio/src/translations/ru.h | 2 + radio/src/translations/se.h | 2 + radio/src/translations/tw.h | 2 + radio/src/translations/ua.h | 2 + 47 files changed, 491 insertions(+), 292 deletions(-) diff --git a/companion/src/firmwares/edgetx/yaml_mixdata.cpp b/companion/src/firmwares/edgetx/yaml_mixdata.cpp index 5b53bf762..cb5f39e09 100644 --- a/companion/src/firmwares/edgetx/yaml_mixdata.cpp +++ b/companion/src/firmwares/edgetx/yaml_mixdata.cpp @@ -134,6 +134,7 @@ Node convert::encode(const MixData& rhs) node["curve"] = rhs.curve; node["delayUp"] = rhs.delayUp; node["delayDown"] = rhs.delayDown; + node["speedPrec"] = rhs.speedPrec; node["speedUp"] = rhs.speedUp; node["speedDown"] = rhs.speedDown; node["carryTrim"] = rhs.carryTrim; @@ -156,6 +157,7 @@ bool convert::decode(const Node& node, MixData& rhs) node["curve"] >> rhs.curve; node["delayUp"] >> rhs.delayUp; node["delayDown"] >> rhs.delayDown; + node["speedPrec"] >> rhs.speedPrec; node["speedUp"] >> rhs.speedUp; node["speedDown"] >> rhs.speedDown; node["carryTrim"] >> rhs.carryTrim; diff --git a/companion/src/firmwares/mixdata.h b/companion/src/firmwares/mixdata.h index dc81298f0..2e912dccf 100644 --- a/companion/src/firmwares/mixdata.h +++ b/companion/src/firmwares/mixdata.h @@ -49,6 +49,7 @@ class MixData { CurveReference curve; unsigned int delayUp; unsigned int delayDown; + unsigned int speedPrec; unsigned int speedUp; unsigned int speedDown; int carryTrim; diff --git a/companion/src/modeledit/mixerdialog.cpp b/companion/src/modeledit/mixerdialog.cpp index 225078db0..35bd7caaa 100644 --- a/companion/src/modeledit/mixerdialog.cpp +++ b/companion/src/modeledit/mixerdialog.cpp @@ -133,16 +133,11 @@ MixerDialog::MixerDialog(QWidget *parent, ModelData & model, MixData * mixdata, ui->switchesCB->setCurrentIndex(ui->switchesCB->findData(md->swtch.toValue())); ui->warningCB->setCurrentIndex(md->mixWarn); ui->mltpxCB->setCurrentIndex(md->mltpx); + ui->speedPrecCB->setCurrentIndex(md->speedPrec); + int scale=firmware->getCapability(SlowScale); float range=firmware->getCapability(SlowRange); - ui->slowDownSB->setMaximum(range / scale); - ui->slowDownSB->setSingleStep(1.0 / scale); - ui->slowDownSB->setDecimals((scale == 1 ? 0 : 1)); - ui->slowDownSB->setValue((float)md->speedDown/scale); - ui->slowUpSB->setMaximum(range / scale); - ui->slowUpSB->setSingleStep(1.0 / scale); - ui->slowUpSB->setDecimals((scale == 1 ? 0 : 1)); - ui->slowUpSB->setValue((float)md->speedUp/scale); + ui->delayDownSB->setMaximum(range / scale); ui->delayDownSB->setSingleStep(1.0 / scale); ui->delayDownSB->setDecimals((scale == 1 ? 0 : 1)); @@ -152,6 +147,16 @@ MixerDialog::MixerDialog(QWidget *parent, ModelData & model, MixData * mixdata, ui->delayUpSB->setDecimals((scale == 1 ? 0 : 1)); ui->delayUpSB->setValue((float)md->delayUp / scale); + if (md->speedPrec) scale = scale * 10; + ui->slowDownSB->setMaximum(range / scale); + ui->slowDownSB->setSingleStep(1.0 / scale); + ui->slowDownSB->setDecimals((scale == 1 ? 0 : scale == 10 ? 1 : 2)); + ui->slowDownSB->setValue((float)md->speedDown/scale); + ui->slowUpSB->setMaximum(range / scale); + ui->slowUpSB->setSingleStep(1.0 / scale); + ui->slowUpSB->setDecimals((scale == 1 ? 0 : scale == 10 ? 1 : 2)); + ui->slowUpSB->setValue((float)md->speedUp/scale); + valuesChanged(); connect(ui->mixerName,SIGNAL(editingFinished()),this,SLOT(valuesChanged())); @@ -163,6 +168,7 @@ MixerDialog::MixerDialog(QWidget *parent, ModelData & model, MixData * mixdata, connect(ui->mltpxCB,SIGNAL(currentIndexChanged(int)),this,SLOT(valuesChanged())); connect(ui->delayDownSB,SIGNAL(editingFinished()),this,SLOT(valuesChanged())); connect(ui->delayUpSB,SIGNAL(editingFinished()),this,SLOT(valuesChanged())); + connect(ui->speedPrecCB,SIGNAL(currentIndexChanged(int)),this,SLOT(valuesChanged())); connect(ui->slowDownSB,SIGNAL(editingFinished()),this,SLOT(valuesChanged())); connect(ui->slowUpSB,SIGNAL(editingFinished()),this,SLOT(valuesChanged())); @@ -209,11 +215,30 @@ void MixerDialog::valuesChanged() md->swtch = RawSwitch(ui->switchesCB->itemData(ui->switchesCB->currentIndex()).toInt()); md->mixWarn = ui->warningCB->currentIndex(); md->mltpx = (MltpxValue)ui->mltpxCB->currentIndex(); + int scale = firmware->getCapability(SlowScale); md->delayDown = round(ui->delayDownSB->value() * scale); md->delayUp = round(ui->delayUpSB->value() * scale); + + // Update values based on old precision (in case it changed) + if (md->speedPrec) scale = scale * 10; md->speedDown = round(ui->slowDownSB->value() * scale); md->speedUp = round(ui->slowUpSB->value() * scale); + + // Get new precion and update controls + md->speedPrec = ui->speedPrecCB->currentIndex(); + float range = firmware->getCapability(SlowRange); + scale = firmware->getCapability(SlowScale); + if (md->speedPrec) scale = scale * 10; + ui->slowDownSB->setMaximum(range / scale); + ui->slowDownSB->setSingleStep(1.0 / scale); + ui->slowDownSB->setDecimals((scale == 1 ? 0 : scale == 10 ? 1 : 2)); + ui->slowDownSB->setValue((float)md->speedDown / scale); + ui->slowUpSB->setMaximum(range / scale); + ui->slowUpSB->setSingleStep(1.0 / scale); + ui->slowUpSB->setDecimals((scale == 1 ? 0 : scale == 10 ? 1 : 2)); + ui->slowUpSB->setValue((float)md->speedUp / scale); + strcpy(md->name, ui->mixerName->text().toLatin1()); md->flightModes = 0; diff --git a/companion/src/modeledit/mixerdialog.ui b/companion/src/modeledit/mixerdialog.ui index e7679620d..92f62e3c1 100644 --- a/companion/src/modeledit/mixerdialog.ui +++ b/companion/src/modeledit/mixerdialog.ui @@ -6,8 +6,8 @@ 0 0 - 531 - 571 + 556 + 623 @@ -29,24 +29,226 @@ - - - - Include Trim + + + + Switch used by the mix. +If blank then the mix is considered to be "ON" all the time. - - - - Offset + + + + The source for the mixer - - + + - Weight + Curve + + + + + + + + + GV + + + + + + + The source for the mixer + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Multiplexer + +This determines how mixer values are added. + +"+" means the value of the current mix is added to the previous mixes in the same channel. +"*" means the value of the current mix is amultiplied with the previous mixes in the same channel. +"R" means the value replaces the previous values. If the switch is off the value will be ignored. + + + + ADD + + + + + MULTIPLY + + + + + REPLACE + + + + + + + + + + GV + + + + + + + The source for the mixer + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + No + + + + + Yes + + + + + + + + Mixer warning. +Setting this value will cause a beep to be emmitted when this value is active. + + + + OFF + + + + + 1 Beep + + + + + 2 Beep + + + + + 3 Beep + + + + + + + + + + + + + + + Switch + + + + + + + Flight modes + + + + + + + Include DR/Expo + + + + + + + Warning + + + + + + + The curve used by the mix + + + + + + + Multiplex + + + + + + + Source + + + + + + + Name @@ -207,226 +409,24 @@ - - + + - Name + Weight - - + + - Source + Offset - - + + - Multiplex - - - - - - - Warning - - - - - - - The curve used by the mix - - - - - - - Include DR/Expo - - - - - - - Flight modes - - - - - - - Switch - - - - - - - - - - - - - - Mixer warning. -Setting this value will cause a beep to be emmitted when this value is active. - - - - OFF - - - - - 1 Beep - - - - - 2 Beep - - - - - 3 Beep - - - - - - - - - No - - - - - Yes - - - - - - - - - - GV - - - - - - - The source for the mixer - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Multiplexer - -This determines how mixer values are added. - -"+" means the value of the current mix is added to the previous mixes in the same channel. -"*" means the value of the current mix is amultiplied with the previous mixes in the same channel. -"R" means the value replaces the previous values. If the switch is off the value will be ignored. - - - - ADD - - - - - MULTIPLY - - - - - REPLACE - - - - - - - - The source for the mixer - - - - - - - Curve - - - - - - - - - GV - - - - - - - The source for the mixer - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Switch used by the mix. -If blank then the mix is considered to be "ON" all the time. + Include Trim @@ -477,8 +477,45 @@ If blank then the mix is considered to be "ON" all the time. + + + + Slow up/dn prec + + + + + + + + 0.0 + + + + + 0.00 + + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + @@ -621,22 +658,6 @@ p, li { white-space: pre-wrap; } - - - - - 0 - 0 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index ae5f5f057..6b62d4c3d 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -442,6 +442,10 @@ QString ModelPrinter::printMixerLine(const MixData & mix, bool showMultiplex, in scale = 1; if (mix.delayDown || mix.delayUp) str += " " + tr("Delay(u%1:d%2)").arg((double)mix.delayUp / scale).arg((double)mix.delayDown / scale).toHtmlEscaped(); + if (mix.speedPrec) { + scale = scale * 10; + str += " " + tr("Slow precision(0.00)").toHtmlEscaped(); + } if (mix.speedDown || mix.speedUp) str += " " + tr("Slow(u%1:d%2)").arg((double)mix.speedUp / scale).arg((double)mix.speedDown / scale).toHtmlEscaped(); if (mix.mixWarn) diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index 3a27b49d7..318c877c6 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.h @@ -78,7 +78,7 @@ PACK(struct MixData { uint16_t carryTrim:1; uint16_t mixWarn:2; // mixer warning uint16_t mltpx:2 ENUM(MixerMultiplex); - uint16_t spare:1 SKIP; + uint16_t speedPrec:1; int32_t offset:13 CUST(in_read_weight,in_write_weight); int32_t swtch:10 CUST(r_swtchSrc,w_swtchSrc); uint32_t flightModes:9 CUST(r_flightModes, w_flightModes); diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index c767ab8a8..8666ddc23 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -113,9 +113,9 @@ void editSingleName(coord_t x, coord_t y, const char *label, char *name, uint8_t size, event_t event, uint8_t active, uint8_t old_editMode); -uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint8_t delay); +uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint8_t delay, uint8_t prec); -#define EDIT_DELAY(x, y, event, attr, str, delay) editDelay(y, event, attr, str, delay) +#define EDIT_DELAY(x, y, event, attr, str, delay, prec) editDelay(y, event, attr, str, delay, prec) #define COPY_MODE 1 #define MOVE_MODE 2 diff --git a/radio/src/gui/128x64/menu_model.cpp b/radio/src/gui/128x64/menu_model.cpp index 055a36305..7e9773f1c 100644 --- a/radio/src/gui/128x64/menu_model.cpp +++ b/radio/src/gui/128x64/menu_model.cpp @@ -21,10 +21,10 @@ #include "opentx.h" -uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint8_t delay) +uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint8_t delay, uint8_t prec) { lcdDrawTextAlignedLeft(y, str); - lcdDrawNumber(MIXES_2ND_COLUMN, y, delay, attr|PREC1|LEFT); + lcdDrawNumber(MIXES_2ND_COLUMN, y, delay, attr|prec|LEFT); if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, delay, DELAY_MAX); return delay; } diff --git a/radio/src/gui/128x64/model_flightmodes.cpp b/radio/src/gui/128x64/model_flightmodes.cpp index b3ec4371c..75fdb3565 100644 --- a/radio/src/gui/128x64/model_flightmodes.cpp +++ b/radio/src/gui/128x64/model_flightmodes.cpp @@ -155,11 +155,11 @@ void menuModelFlightModeOne(event_t event) break; #endif case ITEM_MODEL_FLIGHT_MODE_FADE_IN: - fm->fadeIn = EDIT_DELAY(0, y, event, attr, STR_FADEIN, fm->fadeIn); + fm->fadeIn = EDIT_DELAY(0, y, event, attr, STR_FADEIN, fm->fadeIn, PREC1); break; case ITEM_MODEL_FLIGHT_MODE_FADE_OUT: - fm->fadeOut = EDIT_DELAY(0, y, event, attr, STR_FADEOUT, fm->fadeOut); + fm->fadeOut = EDIT_DELAY(0, y, event, attr, STR_FADEOUT, fm->fadeOut, PREC1); break; #if defined(GVARS) diff --git a/radio/src/gui/128x64/model_mix_edit.cpp b/radio/src/gui/128x64/model_mix_edit.cpp index bb01ad2c8..ea6ddc5a2 100644 --- a/radio/src/gui/128x64/model_mix_edit.cpp +++ b/radio/src/gui/128x64/model_mix_edit.cpp @@ -35,6 +35,7 @@ enum MixFields { MIX_FIELD_MLTPX, MIX_FIELD_DELAY_UP, MIX_FIELD_DELAY_DOWN, + MIX_FIELD_SLOW_PREC, MIX_FIELD_SLOW_UP, MIX_FIELD_SLOW_DOWN, MIX_FIELD_COUNT @@ -194,19 +195,23 @@ void menuModelMixOne(event_t event) break; case MIX_FIELD_DELAY_UP: - md2->delayUp = EDIT_DELAY(0, y, event, attr, STR_DELAYUP, md2->delayUp); + md2->delayUp = EDIT_DELAY(0, y, event, attr, STR_DELAYUP, md2->delayUp, PREC1); break; case MIX_FIELD_DELAY_DOWN: - md2->delayDown = EDIT_DELAY(0, y, event, attr, STR_DELAYDOWN, md2->delayDown); + md2->delayDown = EDIT_DELAY(0, y, event, attr, STR_DELAYDOWN, md2->delayDown, PREC1); + break; + + case MIX_FIELD_SLOW_PREC: + md2->speedPrec = editChoice(MIXES_2ND_COLUMN, y, STR_MIX_SLOW_PREC, &STR_VPREC[1], md2->speedPrec, 0, 1, attr, event); break; case MIX_FIELD_SLOW_UP: - md2->speedUp = EDIT_DELAY(0, y, event, attr, STR_SLOWUP, md2->speedUp); + md2->speedUp = EDIT_DELAY(0, y, event, attr, STR_SLOWUP, md2->speedUp, (md2->speedPrec ? PREC2 : PREC1)); break; case MIX_FIELD_SLOW_DOWN: - md2->speedDown = EDIT_DELAY(0, y, event, attr, STR_SLOWDOWN, md2->speedDown); + md2->speedDown = EDIT_DELAY(0, y, event, attr, STR_SLOWDOWN, md2->speedDown, (md2->speedPrec ? PREC2 : PREC1)); break; } y += FH; diff --git a/radio/src/gui/212x64/gui.h b/radio/src/gui/212x64/gui.h index f7ff04904..0bdfba10c 100644 --- a/radio/src/gui/212x64/gui.h +++ b/radio/src/gui/212x64/gui.h @@ -132,9 +132,9 @@ void editSingleName(coord_t x, coord_t y, const char *label, char *name, uint8_t size, event_t event, uint8_t active, uint8_t old_editMode); -uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint8_t delay); +uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint8_t delay, uint8_t prec); -#define EDIT_DELAY(y, event, attr, str, delay) editDelay(y, event, attr, str, delay) +#define EDIT_DELAY(y, event, attr, str, delay, prec) editDelay(y, event, attr, str, delay, prec) void copySelection(char * dst, const char * src, uint8_t size); diff --git a/radio/src/gui/212x64/menu_model.cpp b/radio/src/gui/212x64/menu_model.cpp index aeeb0f218..fd2d120f4 100644 --- a/radio/src/gui/212x64/menu_model.cpp +++ b/radio/src/gui/212x64/menu_model.cpp @@ -46,10 +46,10 @@ const MenuHandler menuTabModel[] = { { menuModelDisplay, nullptr } }; -uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint8_t delay) +uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint8_t delay, uint8_t prec) { lcdDrawTextAlignedLeft(y, str); - lcdDrawNumber(MIXES_2ND_COLUMN, y, delay, attr|PREC1|LEFT); + lcdDrawNumber(MIXES_2ND_COLUMN, y, delay, attr|prec|LEFT); if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, delay, DELAY_MAX); return delay; } diff --git a/radio/src/gui/212x64/model_mix_edit.cpp b/radio/src/gui/212x64/model_mix_edit.cpp index 6fc15a43a..bbd2cd76a 100644 --- a/radio/src/gui/212x64/model_mix_edit.cpp +++ b/radio/src/gui/212x64/model_mix_edit.cpp @@ -35,6 +35,7 @@ enum MixFields { MIX_FIELD_MLTPX, MIX_FIELD_DELAY_UP, MIX_FIELD_DELAY_DOWN, + MIX_FIELD_SLOW_PREC, MIX_FIELD_SLOW_UP, MIX_FIELD_SLOW_DOWN, MIX_FIELD_COUNT @@ -184,19 +185,23 @@ void menuModelMixOne(event_t event) break; case MIX_FIELD_DELAY_UP: - md2->delayUp = EDIT_DELAY(y, event, attr, STR_DELAYUP, md2->delayUp); + md2->delayUp = EDIT_DELAY(y, event, attr, STR_DELAYUP, md2->delayUp, PREC1); break; case MIX_FIELD_DELAY_DOWN: - md2->delayDown = EDIT_DELAY(y, event, attr, STR_DELAYDOWN, md2->delayDown); + md2->delayDown = EDIT_DELAY(y, event, attr, STR_DELAYDOWN, md2->delayDown, PREC1); + break; + + case MIX_FIELD_SLOW_PREC: + md2->speedPrec = editChoice(MIXES_2ND_COLUMN, y, STR_MIX_SLOW_PREC, &STR_VPREC[1], md2->speedPrec, 0, 1, attr, event); break; case MIX_FIELD_SLOW_UP: - md2->speedUp = EDIT_DELAY(y, event, attr, STR_SLOWUP, md2->speedUp); + md2->speedUp = EDIT_DELAY(y, event, attr, STR_SLOWUP, md2->speedUp, (md2->speedPrec ? PREC2 : PREC1)); break; case MIX_FIELD_SLOW_DOWN: - md2->speedDown = EDIT_DELAY(y, event, attr, STR_SLOWDOWN, md2->speedDown); + md2->speedDown = EDIT_DELAY(y, event, attr, STR_SLOWDOWN, md2->speedDown, (md2->speedPrec ? PREC2 : PREC1)); break; } y += FH; diff --git a/radio/src/gui/colorlcd/mixer_edit_adv.cpp b/radio/src/gui/colorlcd/mixer_edit_adv.cpp index faf8661fa..e473aa772 100644 --- a/radio/src/gui/colorlcd/mixer_edit_adv.cpp +++ b/radio/src/gui/colorlcd/mixer_edit_adv.cpp @@ -98,16 +98,36 @@ void MixEditAdvanced::buildBody(FormWindow* form) SET_VALUE(mix->delayDown, newValue), 0, PREC1); edit->setSuffix("s"); + // Slow up/down precision +#if LCD_W > LCD_H + grid.setColSpan(2); +#endif + line = form->newLine(&grid); + new StaticText(line, rect_t{}, STR_MIX_SLOW_PREC, 0, COLOR_THEME_PRIMARY1); + new Choice(line, rect_t{}, &STR_VPREC[1], 0, 1, + GET_DEFAULT(mix->speedPrec), + [=](int newValue) { + mix->speedPrec = newValue; + slowUp->setTextFlags(mix->speedPrec ? PREC2 : PREC1); + slowUp->update(); + slowDn->setTextFlags(mix->speedPrec ? PREC2 : PREC1); + slowDn->update(); + SET_DIRTY(); + }); +#if LCD_W > LCD_H + grid.setColSpan(1); +#endif + // Slow up line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_SLOWUP, 0, COLOR_THEME_PRIMARY1); - edit = new NumberEdit(line, rect_t{0, 0, 100, 0}, 0, DELAY_MAX, GET_DEFAULT(mix->speedUp), - SET_VALUE(mix->speedUp, newValue), 0, PREC1); - edit->setSuffix("s"); + slowUp = new NumberEdit(line, rect_t{0, 0, 100, 0}, 0, DELAY_MAX, GET_DEFAULT(mix->speedUp), + SET_VALUE(mix->speedUp, newValue), 0, mix->speedPrec ? PREC2 : PREC1); + slowUp->setSuffix("s"); // Slow down new StaticText(line, rect_t{}, STR_SLOWDOWN, 0, COLOR_THEME_PRIMARY1); - edit = new NumberEdit(line, rect_t{0, 0, 100, 0}, 0, DELAY_MAX, GET_DEFAULT(mix->speedDown), - SET_VALUE(mix->speedDown, newValue), 0, PREC1); - edit->setSuffix("s"); + slowDn = new NumberEdit(line, rect_t{0, 0, 100, 0}, 0, DELAY_MAX, GET_DEFAULT(mix->speedDown), + SET_VALUE(mix->speedDown, newValue), 0, mix->speedPrec ? PREC2 : PREC1); + slowDn->setSuffix("s"); } diff --git a/radio/src/gui/colorlcd/mixer_edit_adv.h b/radio/src/gui/colorlcd/mixer_edit_adv.h index ea4b53f3b..143e9e641 100644 --- a/radio/src/gui/colorlcd/mixer_edit_adv.h +++ b/radio/src/gui/colorlcd/mixer_edit_adv.h @@ -26,6 +26,7 @@ #include "curve.h" class FormWindow; +class NumberEdit; class MixEditAdvanced : public Page { @@ -35,6 +36,8 @@ class MixEditAdvanced : public Page protected: uint8_t channel; uint8_t index; + NumberEdit* slowUp; + NumberEdit* slowDn; void buildHeader(Window *window); void buildBody(FormWindow *window); diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index 062dacbf9..6081da5b5 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -930,17 +930,18 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) // rate equals a full range for one second; if less time is passed rate is accordingly smaller // if one second passed, rate would be 2048 (full motion)*256(recalculated weight)*100(100 ticks needed for one second) int32_t currentValue = ((int32_t) v<speedPrec ? 1 : 10; if (diff > 0) { if (s_mixer_first_run_done && md->speedUp > 0) { // if a speed upwards is defined recalculate the new value according configured speed; the higher the speed the smaller the add value is - int32_t newValue = tact+rate/((int16_t)10*md->speedUp); + int32_t newValue = tact+rate/((int16_t)precMult*md->speedUp); if (newValuespeedDown > 0) { // see explanation in speedUp - int32_t newValue = tact-rate/((int16_t)10*md->speedDown); + int32_t newValue = tact-rate/((int16_t)precMult*md->speedDown); if (newValue>currentValue) currentValue = newValue; // Endposition; prevent toggling around the destination } } diff --git a/radio/src/storage/yaml/yaml_datastructs_128x64.cpp b/radio/src/storage/yaml/yaml_datastructs_128x64.cpp index 1e92b6413..e984261a4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_128x64.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_128x64.cpp @@ -397,7 +397,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), + YAML_UNSIGNED( "speedPrec", 1 ), YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index cb00ce404..d0faf9b19 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -424,7 +424,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), + YAML_UNSIGNED( "speedPrec", 1 ), YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), diff --git a/radio/src/storage/yaml/yaml_datastructs_pl18.cpp b/radio/src/storage/yaml/yaml_datastructs_pl18.cpp index 78cd8e650..61c3aec64 100644 --- a/radio/src/storage/yaml/yaml_datastructs_pl18.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_pl18.cpp @@ -424,7 +424,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), + YAML_UNSIGNED( "speedPrec", 1 ), YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t20.cpp b/radio/src/storage/yaml/yaml_datastructs_t20.cpp index 60cb7f55b..7499d556f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t20.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t20.cpp @@ -397,7 +397,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), + YAML_UNSIGNED( "speedPrec", 1 ), YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp index ea13a0783..17f2407fe 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp @@ -397,7 +397,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), + YAML_UNSIGNED( "speedPrec", 1 ), YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 1c7c459ea..008402d15 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -426,7 +426,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), + YAML_UNSIGNED( "speedPrec", 1 ), YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 1c7c459ea..008402d15 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -426,7 +426,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), + YAML_UNSIGNED( "speedPrec", 1 ), YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 4da315f64..8937da118 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -397,7 +397,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), + YAML_UNSIGNED( "speedPrec", 1 ), YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 68faae82b..aff0c3c2a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -398,7 +398,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), + YAML_UNSIGNED( "speedPrec", 1 ), YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 2cc9542de..10c65c80a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -400,7 +400,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), + YAML_UNSIGNED( "speedPrec", 1 ), YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), diff --git a/radio/src/tests/mixer.cpp b/radio/src/tests/mixer.cpp index 2af10aa51..af067eecb 100644 --- a/radio/src/tests/mixer.cpp +++ b/radio/src/tests/mixer.cpp @@ -31,11 +31,11 @@ class MixerTest : public OpenTxTest {}; GTEST_ASSERT_EQ((value), chans[(channel)]); \ } -#define CHECK_SLOW_MOVEMENT(channel, sign, duration) \ +#define CHECK_SLOW_MOVEMENT(channel, sign, duration, max_duration) \ do { \ for (int i=1; i<=(duration); i++) { \ evalFlightModeMixes(e_perout_mode_normal, 1); \ - lastAct = lastAct + (sign) * (1<<19)/500; /* 100 on ARM */ \ + lastAct = lastAct + (sign) * (1<<19)/max_duration; \ GTEST_ASSERT_EQ(256 * (lastAct >> 8), chans[(channel)]); \ } \ } while (0) @@ -701,10 +701,10 @@ TEST_F(MixerTest, SlowOnPhase) evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[0], 0); - CHECK_SLOW_MOVEMENT(0, +1, 250); + CHECK_SLOW_MOVEMENT(0, +1, 250, 500); mixerCurrentFlightMode = 1; - CHECK_SLOW_MOVEMENT(0, -1, 250); + CHECK_SLOW_MOVEMENT(0, -1, 250, 500); } TEST_F(MixerTest, SlowOnSwitchSource) @@ -721,11 +721,56 @@ TEST_F(MixerTest, SlowOnSwitchSource) s_mixer_first_run_done = true; simuSetSwitch(switchIndex, -1); - CHECK_SLOW_MOVEMENT(0, -1, 250); + CHECK_SLOW_MOVEMENT(0, -1, 250, 500); EXPECT_EQ(chans[0], -CHANNEL_MAX); simuSetSwitch(switchIndex, 1); - CHECK_SLOW_MOVEMENT(0, +1, 500); + CHECK_SLOW_MOVEMENT(0, +1, 500, 500); +} + +TEST_F(MixerTest, SlowOnPhasePrec10ms) +{ + g_model.flightModeData[1].swtch = SWSRC_FIRST_SWITCH; + g_model.mixData[0].destCh = 0; + g_model.mixData[0].mltpx = MLTPX_ADD; + g_model.mixData[0].srcRaw = MIXSRC_MAX; + g_model.mixData[0].weight = 100; + g_model.mixData[0].flightModes = 0x2 + 0x4 + 0x8 + 0x10 /*only enabled in phase 0*/; + g_model.mixData[0].speedUp = 50; + g_model.mixData[0].speedDown = 50; + g_model.mixData[0].speedPrec = 1; + + s_mixer_first_run_done = true; + mixerCurrentFlightMode = 0; + evalFlightModeMixes(e_perout_mode_normal, 0); + EXPECT_EQ(chans[0], 0); + + CHECK_SLOW_MOVEMENT(0, +1, 25, 50); + + mixerCurrentFlightMode = 1; + CHECK_SLOW_MOVEMENT(0, -1, 25, 50); +} + +TEST_F(MixerTest, SlowOnSwitchSourcePrec10ms) +{ + g_model.mixData[0].destCh = 0; + g_model.mixData[0].mltpx = MLTPX_ADD; + g_eeGeneral.switchConfig = 0x03; + g_model.mixData[0].srcRaw = MIXSRC_FIRST_SWITCH; + int switchIndex = 0; + g_model.mixData[0].weight = 100; + g_model.mixData[0].speedUp = 50; + g_model.mixData[0].speedDown = 50; + g_model.mixData[0].speedPrec = 1; + + s_mixer_first_run_done = true; + + simuSetSwitch(switchIndex, -1); + CHECK_SLOW_MOVEMENT(0, -1, 25, 50); + EXPECT_EQ(chans[0], -CHANNEL_MAX); + + simuSetSwitch(switchIndex, 1); + CHECK_SLOW_MOVEMENT(0, +1, 50, 50); } TEST_F(MixerTest, SlowDisabledOnStartup) @@ -818,7 +863,34 @@ TEST_F(MixerTest, SlowOnMultiply) s_mixer_first_run_done = true; simuSetSwitch(0, 1); - CHECK_SLOW_MOVEMENT(0, 1, 250); + CHECK_SLOW_MOVEMENT(0, 1, 250, 500); + + simuSetSwitch(0, -1); + CHECK_NO_MOVEMENT(0, CHANNEL_MAX, 250); + + simuSetSwitch(0, 1); + CHECK_NO_MOVEMENT(0, CHANNEL_MAX, 250); +} + +TEST_F(MixerTest, SlowOnMultiplyPrec10ms) +{ + g_model.mixData[0].destCh = 0; + g_model.mixData[0].mltpx = MLTPX_ADD; + g_model.mixData[0].srcRaw = MIXSRC_MAX; + g_model.mixData[0].weight = 100; + g_model.mixData[1].destCh = 0; + g_model.mixData[1].mltpx = MLTPX_MUL; + g_model.mixData[1].srcRaw = MIXSRC_MAX; + g_model.mixData[1].weight = 100; + g_model.mixData[1].swtch = SWSRC_FIRST_SWITCH; + g_model.mixData[1].speedUp = 50; + g_model.mixData[1].speedDown = 50; + g_model.mixData[1].speedPrec = 1; + + s_mixer_first_run_done = true; + + simuSetSwitch(0, 1); + CHECK_SLOW_MOVEMENT(0, 1, 25, 50); simuSetSwitch(0, -1); CHECK_NO_MOVEMENT(0, CHANNEL_MAX, 250); diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 44cfaec6c..18a75f8e3 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -1097,3 +1097,5 @@ ISTR(SORT_ORDERS); const char STR_SORT_MODELS_BY[] = TR_SORT_MODELS_BY; const char STR_CREATE_NEW[] = TR_CREATE_NEW; #endif + +const char STR_MIX_SLOW_PREC[] = TR_MIX_SLOW_PREC; diff --git a/radio/src/translations.h b/radio/src/translations.h index 835929121..17dc24152 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -1285,5 +1285,7 @@ extern const char STR_SORT_MODELS_BY[]; extern const char STR_CREATE_NEW[]; #endif +extern const char STR_MIX_SLOW_PREC[]; + #endif // _TRANSLATIONS_H_ diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index 7e33127c1..77e9cc4be 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -1271,3 +1271,5 @@ #define TR_SORT_ORDERS "名称 A-Z","名称 Z-A","不常用","常用" #define TR_SORT_MODELS_BY "排序" #define TR_CREATE_NEW "新建" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h index 6958cd016..4b08eeefc 100644 --- a/radio/src/translations/cz.h +++ b/radio/src/translations/cz.h @@ -1291,3 +1291,5 @@ #define TR_SORT_ORDERS "Název A-Z","Název Z-A","Nejméne používané","Nejvíce používané" #define TR_SORT_MODELS_BY "Seřadit modely podle" #define TR_CREATE_NEW "Vytvořit" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index b40393d9c..2d6f69a4a 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -1296,3 +1296,5 @@ #define TR_SORT_ORDERS "Navn A-Z","Navn Z-A","Sidst anvendt","Mest anvendt" #define TR_SORT_MODELS_BY "Sorter modeller" #define TR_CREATE_NEW "Opret" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index 660855e80..7f400372b 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -1287,3 +1287,5 @@ #define TR_SORT_ORDERS "Name A-Z","Name Z-A","Wenig benutzt","Meist benutzt" #define TR_SORT_MODELS_BY "Modelle sortieren nach" #define TR_CREATE_NEW "Erstelle" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index b828a1bff..eebe2ef42 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -1284,3 +1284,5 @@ #define TR_SORT_ORDERS "Name A-Z","Name Z-A","Least used","Most used" #define TR_SORT_MODELS_BY "Sort models by" #define TR_CREATE_NEW "Create" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index a4c350ad9..7284ed04a 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -1284,3 +1284,5 @@ #define TR_SORT_ORDERS "Name A-Z","Name Z-A","Least used","Most used" #define TR_SORT_MODELS_BY "Sort models by" #define TR_CREATE_NEW "Create" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h index d20dba211..50543816b 100644 --- a/radio/src/translations/fi.h +++ b/radio/src/translations/fi.h @@ -1300,3 +1300,5 @@ #define TR_SORT_ORDERS "Name A-Z","Name Z-A","Least used","Most used" #define TR_SORT_MODELS_BY "Sort models by" #define TR_CREATE_NEW "Create" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index f76925896..8ac07ae37 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -1301,3 +1301,5 @@ #define TR_SORT_ORDERS "Nom A-Z","Nom Z-A","Dernier utilisé","Couramment utilisé" #define TR_SORT_MODELS_BY "Trier modèles par" #define TR_CREATE_NEW "Créer" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/he.h b/radio/src/translations/he.h index 822b76f23..44656d60d 100644 --- a/radio/src/translations/he.h +++ b/radio/src/translations/he.h @@ -1287,3 +1287,5 @@ #define TR_SORT_ORDERS "A-Z סידור","Z-A סידור","יותר בשימוש","פחות בשימוש" #define TR_SORT_MODELS_BY "סדר תצוגה" #define TR_CREATE_NEW "יצירה חדשה" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index fa79d2bf1..925096408 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -1279,3 +1279,5 @@ #define TR_SORT_ORDERS "Nome A-Z","Nome Z-A","Meno utilizzato","Più utilizzato" #define TR_SORT_MODELS_BY "Ordina modelli per" #define TR_CREATE_NEW "Crea" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/jp.h b/radio/src/translations/jp.h index ce1256cb8..22af76998 100644 --- a/radio/src/translations/jp.h +++ b/radio/src/translations/jp.h @@ -1284,3 +1284,5 @@ #define TR_SORT_ORDERS "名称 A-Z順","名称 Z-A順","利用の少ない順","利用の多い順" #define TR_SORT_MODELS_BY "モデルをソート" #define TR_CREATE_NEW "作成" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index 19af3d065..32a16359d 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -1291,3 +1291,5 @@ #define TR_SORT_ORDERS "Name A-Z","Name Z-A","Least used","Most used" #define TR_SORT_MODELS_BY "Sort models by" #define TR_CREATE_NEW "Create" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index f1ea2f1c8..b58893b1c 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -1278,3 +1278,5 @@ #define TR_SORT_ORDERS "Nazwa A-Z","Nazwa Z-A","Najrzadziej użyty","Najczęściej użyty" #define TR_SORT_MODELS_BY "Sortuj modele" #define TR_CREATE_NEW "Utwórz" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index 850f47c74..4c35ac0ce 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -1282,3 +1282,5 @@ #define TR_SORT_ORDERS "Nome A-Z","Nome Z-A","Menos usado","Mais usado" #define TR_SORT_MODELS_BY "Ordenar modelos por" #define TR_CREATE_NEW "Criar" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/ru.h b/radio/src/translations/ru.h index ff9c4e8c5..59706cc9d 100644 --- a/radio/src/translations/ru.h +++ b/radio/src/translations/ru.h @@ -1281,3 +1281,5 @@ #define TR_SORT_ORDERS "Имя A-Z","Имя Z-A","Редко испол","Часто испол" #define TR_SORT_MODELS_BY "Сортировка моделей" #define TR_CREATE_NEW "Создать" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index 1e3fd381a..bca42fbce 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -1318,3 +1318,5 @@ #define TR_SORT_ORDERS "Namn A-Z","Namn Z-A","Minst använda","Mest använda" #define TR_SORT_MODELS_BY "Sortera modeller" #define TR_CREATE_NEW "Skapa" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h index a2a19ccc3..a6a60690e 100644 --- a/radio/src/translations/tw.h +++ b/radio/src/translations/tw.h @@ -1276,3 +1276,5 @@ #define TR_SORT_ORDERS "名稱 A-Z","名稱 Z-A","不常用","常用" #define TR_SORT_MODELS_BY "排序" #define TR_CREATE_NEW "新建" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec") diff --git a/radio/src/translations/ua.h b/radio/src/translations/ua.h index f78d9da03..5381d7043 100644 --- a/radio/src/translations/ua.h +++ b/radio/src/translations/ua.h @@ -1255,3 +1255,5 @@ #define TR_SORT_ORDERS "Назва A-Z","Назва Z-A","Найменш використ.","Найбільш використ." #define TR_SORT_MODELS_BY "Сортувати моделі за" #define TR_CREATE_NEW "Створити" + +#define TR_MIX_SLOW_PREC TR("Slow prec", "Slow up/dn prec")