diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7cccabf1f..b2762bf4b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,7 +2,7 @@ project(OpenTX)
set(VERSION_MAJOR "2")
set(VERSION_MINOR "3")
-set(VERSION_REVISION "6")
+set(VERSION_REVISION "8")
set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX})
set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR})
set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX})
diff --git a/CREDITS.txt b/CREDITS.txt
index f8d4f14e6..31cfd4122 100644
--- a/CREDITS.txt
+++ b/CREDITS.txt
@@ -1707,3 +1707,5 @@ Fabrice Debonnet
James Laver
Kevin Bowens
David Frech
+Udo Kastenholz
+Julio Margarido
diff --git a/README.md b/README.md
index c966e7ed4..64e672a51 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
## OpenTX 2.3 Branch
[](https://travis-ci.org/opentx/opentx)
-[](https://discord.gg/pAmmCp2)
+[](https://discord.gg/CZCwVx2)
[](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=DJ9MASSKVW8WN)
The ongoing development on 2.3.x is done in this branch.
diff --git a/companion/src/apppreferencesdialog.cpp b/companion/src/apppreferencesdialog.cpp
index 63c260176..e3817a9ba 100644
--- a/companion/src/apppreferencesdialog.cpp
+++ b/companion/src/apppreferencesdialog.cpp
@@ -352,6 +352,13 @@ void AppPreferencesDialog::on_ge_pathButton_clicked()
}
}
+void AppPreferencesDialog::on_btnClearPos_clicked()
+{
+ SimulatorOptions opts = g.profile[g.sessionId()].simulatorOptions();
+ opts.controlsState.clear();
+ g.profile[g.sessionId()].simulatorOptions(opts);
+}
+
#if defined(JOYSTICKS)
void AppPreferencesDialog::on_joystickChkB_clicked() {
if (ui->joystickChkB->isChecked()) {
diff --git a/companion/src/apppreferencesdialog.h b/companion/src/apppreferencesdialog.h
index 8c796cf7f..7e3f6f234 100644
--- a/companion/src/apppreferencesdialog.h
+++ b/companion/src/apppreferencesdialog.h
@@ -66,6 +66,7 @@ class AppPreferencesDialog : public QDialog
void on_SplashSelect_clicked();
void on_clearImageButton_clicked();
void on_btn_appLogsDir_clicked();
+ void on_btnClearPos_clicked();
#if defined(JOYSTICKS)
void on_joystickChkB_clicked();
diff --git a/companion/src/apppreferencesdialog.ui b/companion/src/apppreferencesdialog.ui
index ca015d2dc..9ed6d0e4c 100644
--- a/companion/src/apppreferencesdialog.ui
+++ b/companion/src/apppreferencesdialog.ui
@@ -45,7 +45,7 @@
- 1
+ 0
@@ -61,22 +61,40 @@
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
5
4
-
- 0
-
-
-
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
0
@@ -728,6 +746,19 @@ Mode 4:
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Startup Settings
+
+
+
-
@@ -764,8 +795,8 @@ Mode 4:
- -
-
+
-
+
0
@@ -773,7 +804,7 @@ Mode 4:
- Startup Settings
+ Automatic Backup Folder
@@ -790,13 +821,6 @@ Mode 4:
- -
-
-
- Qt::Horizontal
-
-
-
-
@@ -807,16 +831,10 @@ Mode 4:
- -
-
-
-
- 0
- 0
-
-
-
- Automatic Backup Folder
+
-
+
+
+ Qt::Horizontal
@@ -833,37 +851,6 @@ Mode 4:
- -
-
-
-
-
-
- false
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Select Folder
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
-
-
@@ -891,6 +878,63 @@ Mode 4:
+ -
+
+
-
+
+
+ false
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Select Folder
+
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Debug Output Logging
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Enable automatic backup before writing firmware
+
+
+
-
@@ -914,16 +958,37 @@ Mode 4:
- -
-
+
-
+
+
+ Qt::Horizontal
+
+
+
+ -
+
-
+
0
0
-
- Debug Output Logging
+
-
+
+ Only show user splash images
+
+
+ -
+
+ Show user and companion splash images
+
+
+
+
+ -
+
+
+ Qt::Horizontal
@@ -961,52 +1026,26 @@ Mode 4:
- -
-
-
-
- 0
- 0
-
-
-
- Enable automatic backup before writing firmware
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
- 0
- 0
-
-
+
-
+
-
-
- Only show user splash images
-
+
+
+ true
+
+
+ false
+
+
-
-
- Show user and companion splash images
-
+
+
+ Select Folder
+
+
-
-
- -
-
-
- Qt::Horizontal
-
-
+
-
@@ -1032,34 +1071,6 @@ Mode 4:
- -
-
-
-
-
-
- true
-
-
- false
-
-
-
- -
-
-
- Select Folder
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
-
@@ -1073,6 +1084,13 @@ Mode 4:
+ -
+
+
+ Release channel
+
+
+
-
@@ -1099,6 +1117,13 @@ Mode 4:
+ -
+
+
+ Qt::Horizontal
+
+
+
-
-
@@ -1123,13 +1148,6 @@ Mode 4:
- -
-
-
- Release channel
-
-
-
-
@@ -1180,7 +1198,38 @@ Mode 4:
6
-
-
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 50
+ 16777215
+
+
+
+ 1
+
+
+ 0.500000000000000
+
+
+ 3.000000000000000
+
+
+ 0.100000000000000
+
+
+ 1.000000000000000
+
+
+
+ -
@@ -1193,14 +1242,20 @@ Mode 4:
- -
-
+
-
+
+
+
+ 0
+ 0
+
+
- Calibrate
+ Screenshot capture folder
- -
+
-
@@ -1235,31 +1290,22 @@ Mode 4:
- -
-
-
-
- 0
- 0
-
-
+
-
+
- Screenshot capture folder
+ Calibrate
- -
-
-
- Qt::Vertical
+
-
+
+
+ Select Folder
-
-
- 20
- 5
-
+
+ false
-
+
-
@@ -1274,7 +1320,7 @@ Mode 4:
- -
+
-
@@ -1287,17 +1333,20 @@ Mode 4:
- -
-
-
- Select Folder
+
-
+
+
+ Qt::Vertical
-
- false
+
+
+ 20
+ 5
+
-
+
- -
+
-
@@ -1310,7 +1359,20 @@ Mode 4:
- -
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Simulator Volume Gain
+
+
+
+ -
@@ -1348,60 +1410,30 @@ Mode 4:
- -
+
-
+
+
+ Simulator controls
+
+
+
+ -
-
+
0
0
- Remember simulator switch values
+ Save switch/pot positions on simulator exit
- -
-
-
-
- 0
- 0
-
-
+
-
+
- Simulator Volume Gain
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 50
- 16777215
-
-
-
- 1
-
-
- 0.500000000000000
-
-
- 3.000000000000000
-
-
- 0.100000000000000
-
-
- 1.000000000000000
+ Clear saved positions
diff --git a/companion/src/firmwares/moduledata.h b/companion/src/firmwares/moduledata.h
index caeaad833..83744908a 100644
--- a/companion/src/firmwares/moduledata.h
+++ b/companion/src/firmwares/moduledata.h
@@ -119,7 +119,14 @@ enum MultiModuleRFProtocols {
MODULE_SUBTYPE_MULTI_AFHDS2A_RX,
MODULE_SUBTYPE_MULTI_HOTT,
MODULE_SUBTYPE_MULTI_FX816,
- MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_FX816
+ MODULE_SUBTYPE_MULTI_BAYANG_RX,
+ MODULE_SUBTYPE_MULTI_PELIKAN,
+ MODULE_SUBTYPE_MULTI_TIGER,
+ MODULE_SUBTYPE_MULTI_XK,
+ MODULE_SUBTYPE_MULTI_XN297DUMP,
+ MODULE_SUBTYPE_MULTI_FRSKYX2,
+ MODULE_SUBTYPE_MULTI_FRSKY_R9,
+ MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_FRSKY_R9
};
enum TrainerProtocol {
diff --git a/companion/src/firmwares/multiprotocols.cpp b/companion/src/firmwares/multiprotocols.cpp
index 18b7035a9..0dcc299e9 100644
--- a/companion/src/firmwares/multiprotocols.cpp
+++ b/companion/src/firmwares/multiprotocols.cpp
@@ -40,6 +40,7 @@ static const QStringList STR_SUBTYPE_CUSTOM ({
static const QStringList STR_SUBTYPE_FLYSKY {"Standard", "V9x9", "V6x6", "V912", "CX20"};
static const QStringList STR_SUBTYPE_HUBSAN {"H107", "H301", "H501"};
static const QStringList STR_SUBTYPE_FRSKY {"D16", "D8", "D16 8ch", "V8", "D16 EU-LBT", "D16 EU-LBT 8ch"};
+static const QStringList STR_SUBTYPE_FRSKYX2 {"D16", "D16 8ch", "D16 EU-LBT", "D16 EU-LBT 8ch"};
static const QStringList STR_SUBTYPE_HISKY {"Standard", "HK310"};
static const QStringList STR_SUBTYPE_V2X2 {"Standard", "JXD506"};
static const QStringList STR_SUBTYPE_DSM {"DSM2 22ms", "DSM2 11ms", "DSMX 22ms", "DSMX 11ms"};
@@ -125,6 +126,7 @@ const Multiprotocols multiProtocols {
{MODULE_SUBTYPE_MULTI_ESKY150, 1, false, STR_SUBTYPE_ESKY150, nullptr},
{MODULE_SUBTYPE_MULTI_FX816, 0, false, STR_SUBTYPE_FX816, nullptr},
{MODULE_SUBTYPE_MULTI_HOTT, 0, true, NO_SUBTYPE, STR_MULTI_RFTUNE},
+ {MODULE_SUBTYPE_MULTI_FRSKYX2, 3, true, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE},
{MM_RF_CUSTOM_SELECTED, 7, true, STR_SUBTYPE_CUSTOM, STR_MULTI_OPTION},
// Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff)
@@ -167,7 +169,8 @@ QString Multiprotocols::protocolToString(int protocol, bool custom)
"Bayang", "ESky", "MT99XX", "MJXQ", "Shenqi", "FY326", "SFHSS", "J6 PRO","FQ777","Assan","Hontai","Open LRS",
"FlySky AFHDS2A", "Q2x2", "Walkera", "Q303", "GW008", "DM002", "Cabell", "ESky 150", "H8 3D", "Corona", "CFlie",
"Hitec", "Wfly", "Bugs", "Bugs Mini", "Traxxas", "NCC-1701-A", "E01X", "WL Heli V911S", "GD00X", "Volantex V761",
- "KFPlan KF606", "Redpine", "Potensic", "ZXS", "FlyZone", "Scanner", "FrSky RX", "FlySky AFHDS2A RX", "HoTT", "Fx816"
+ "KFPlan KF606", "Redpine", "Potensic", "ZXS", "FlyZone", "Scanner", "FrSky RX", "FlySky AFHDS2A RX", "HoTT", "Fx816",
+ "Bayang RX", "Pelikan", "Tiger", "WK", "XN297 Dump", "FrSky X 2.1", "FrSky R9"
});
if (protocol == MM_RF_CUSTOM_SELECTED || custom)
diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp
index 3609713a5..cfeb5278a 100644
--- a/companion/src/firmwares/opentx/opentxeeprom.cpp
+++ b/companion/src/firmwares/opentx/opentxeeprom.cpp
@@ -693,11 +693,13 @@ class FlightModeField: public TransformedField {
internalField.Append(new UnsignedField<8>(this, phase.fadeIn));
internalField.Append(new UnsignedField<8>(this, phase.fadeOut));
- for (int i=0; i(this, phase.rotaryEncoders[i]));
+ if (version < 219) {
+ for (int i = 0; i < rotencCount; i++) {
+ internalField.Append(new SignedField<16>(this, phase.rotaryEncoders[i]));
+ }
}
- for (int i=0; i(this, phase.gvars[i]));
}
}
diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp
index 794ad63e2..eb3750447 100644
--- a/companion/src/firmwares/opentx/opentxinterface.cpp
+++ b/companion/src/firmwares/opentx/opentxinterface.cpp
@@ -1252,6 +1252,7 @@ void registerOpenTxFirmwares()
/* FrSky Taranis X9D board */
firmware = new OpenTxFirmware("opentx-x9d", Firmware::tr("FrSky Taranis X9D"), BOARD_TARANIS_X9D);
+ firmware->addOption("noras", Firmware::tr("Disable RAS (SWR)"));
firmware->addOption("haptic", Firmware::tr("Haptic module installed"));
addOpenTxTaranisOptions(firmware);
addPPMInternalModuleHack(firmware);
@@ -1331,7 +1332,6 @@ void registerOpenTxFirmwares()
firmware->addOption("noheli", Firmware::tr("Disable HELI menu and cyclic mix support"));
firmware->addOption("nogvars", Firmware::tr("Disable Global variables"));
firmware->addOption("lua", Firmware::tr("Enable Lua custom scripts screen"));
- firmware->addOption("flexr9m", Firmware::tr("Enable non certified R9M firmwares"));
firmware->addOption("internalmulti", Firmware::tr("Support for MULTI internal module"));
addOpenTxFontOptions(firmware);
registerOpenTxFirmware(firmware);
@@ -1345,11 +1345,12 @@ void registerOpenTxFirmwares()
registerOpenTxFirmware(firmware);
addOpenTxRfOptions(firmware, FLEX);
- /* Radiomaster TX16S board */
+ // TX16S is unavailable until finalized
+ /* Radiomaster TX16S board
firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16s / TX16s Hall / TX16s Masterfire"), BOARD_RADIOMASTER_TX16S);
addOpenTxFrskyOptions(firmware);
firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module"));
- registerOpenTxFirmware(firmware);
+ registerOpenTxFirmware(firmware);*/
/* 9XR-Pro */
firmware = new OpenTxFirmware("opentx-9xrpro", Firmware::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO);
diff --git a/companion/src/imgpreferences.ui b/companion/src/imgpreferences.ui
deleted file mode 100644
index 1ba680d4d..000000000
--- a/companion/src/imgpreferences.ui
+++ /dev/null
@@ -1,500 +0,0 @@
-
-
- preferencesDialog
-
-
-
- 0
- 0
- 685
- 432
-
-
-
-
- 0
- 0
-
-
-
-
- 685
- 0
-
-
-
- Preferences
-
-
-
- QLayout::SetMinimumSize
-
-
- 2
-
-
- 4
-
- -
-
-
- 8
-
-
-
-
-
-
-
-
- true
-
-
- true
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Simu BackLight
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
-
-
-
- -
-
-
- Simulator capture folder
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Joystick
-
-
-
- -
-
-
- Remember simulator switches
-
-
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- -
-
-
- Enable
-
-
-
-
-
- -
-
-
- Use clipboard only
-
-
-
- -
-
-
- Calibrate
-
-
-
- -
-
-
-
-
-
-
-
- Blue
-
-
- -
-
- Green
-
-
- -
-
- Red
-
-
- -
-
- Orange
-
-
- -
-
- Yellow
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
-
- -
-
-
- Open Folder
-
-
- false
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
- Personal splash library
-
-
-
- -
-
-
-
-
-
- true
-
-
- true
-
-
-
- -
-
-
- Open Folder
-
-
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
-
- Include companion splashes
-
-
- -
-
- Only user defined splashes
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Splash library behaviour
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
- Custom TX splash screen
-
-
-
- -
-
-
-
-
-
- true
-
-
- true
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Open Image
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
- ...
-
-
-
- -
-
-
- ...
-
-
-
- -
-
-
- false
-
-
- Invert Pixels
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 128
- 64
-
-
-
-
- 128
- 64
-
-
-
- QFrame::Panel
-
-
- QFrame::Raised
-
-
-
-
-
- true
-
-
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
- QDialogButtonBox::Cancel|QDialogButtonBox::Ok
-
-
-
-
-
-
-
-
- backLightColor
- joystickCB
- joystickChkB
- joystickcalButton
- simuSW
- snapshotPath
- snapshotPathButton
- snapshotClipboardCKB
- libraryPath
- libraryPathButton
- splashincludeCB
- SplashFileName
- SplashSelect
- SplashLibraryDialogButton
- clearImageButton
- InvertPixels
- buttonBox
-
-
-
-
-
-
- buttonBox
- accepted()
- preferencesDialog
- accept()
-
-
- 370
- 49
-
-
- 157
- 274
-
-
-
-
- buttonBox
- rejected()
- preferencesDialog
- reject()
-
-
- 390
- 55
-
-
- 286
- 274
-
-
-
-
-
diff --git a/companion/src/simulation/joystick.cpp b/companion/src/simulation/joystick.cpp
index 87f7476f0..070825a21 100644
--- a/companion/src/simulation/joystick.cpp
+++ b/companion/src/simulation/joystick.cpp
@@ -99,8 +99,9 @@ void Joystick::processEvents()
axes[i] = moved;
}
}
- else
+ else {
axisRepeatTimers[i].restart();
+ }
}
else {
emit axisValueChanged(i, 0);
@@ -108,17 +109,20 @@ void Joystick::processEvents()
}
for (i = 0; i < numButtons; i++) {
Uint8 changed = SDL_JoystickGetButton(joystick, i);
- if ( (changed != buttons[i]) ) {
+ if ((changed != buttons[i])) {
emit buttonValueChanged(i, (bool) changed);
buttons[i] = changed;
buttonRepeatTimers[i].restart();
- } else if (autoRepeat && changed != 0) {
+ }
+ else if (autoRepeat && changed != 0) {
if ( buttonRepeatTimers[i].elapsed() >= autoRepeatDelay ) {
emit buttonValueChanged(i, (bool) changed);
buttons[i] = changed;
}
- } else
+ }
+ else {
buttonRepeatTimers[i].restart();
+ }
}
for (i = 0; i < numHats; i++) {
Uint8 changed = SDL_JoystickGetHat(joystick, i);
@@ -126,19 +130,22 @@ void Joystick::processEvents()
emit hatValueChanged(i, changed);
hats[i] = changed;
hatRepeatTimers[i].restart();
- } else if (autoRepeat && changed != 0) {
- if ( hatRepeatTimers[i].elapsed() >= autoRepeatDelay ) {
+ }
+ else if (autoRepeat && changed != 0) {
+ if (hatRepeatTimers[i].elapsed() >= autoRepeatDelay) {
emit hatValueChanged(i, changed);
hats[i] = changed;
}
- } else
+ }
+ else {
hatRepeatTimers[i].restart();
+ }
}
for (i = 0; i < numTrackballs; i++) {
int dx, dy;
SDL_JoystickGetBall(joystick, i, &dx, &dy);
- if ( dx != 0 || dy != 0 )
+ if (dx != 0 || dy != 0)
emit trackballValueChanged(i, dx, dy);
}
}
diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp
index 798c8664b..d20e34cc7 100644
--- a/companion/src/simulation/simulatorwidget.cpp
+++ b/companion/src/simulation/simulatorwidget.cpp
@@ -699,9 +699,11 @@ void SimulatorWidget::restoreRadioWidgetsState()
void SimulatorWidget::saveRadioWidgetsState(QList & state)
{
if (m_radioWidgets.size()) {
- state.clear();
- foreach (RadioWidget * rw, m_radioWidgets)
- state.append(rw->getStateData());
+ if (g.simuSW()) {
+ state.clear();
+ foreach (RadioWidget * rw, m_radioWidgets)
+ state.append(rw->getStateData());
+ }
}
}
diff --git a/companion/targets/windows/companion.nsi.in b/companion/targets/windows/companion.nsi.in
index 7ea693a1a..1a54e4b4d 100644
--- a/companion/targets/windows/companion.nsi.in
+++ b/companion/targets/windows/companion.nsi.in
@@ -117,6 +117,7 @@ Section "OpenTX Companion @VERSION_FAMILY@" SecDummy
;Registry information for add/remove programs
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX Companion @VERSION_FAMILY@" "DisplayName" "OpenTX Companion @VERSION_FAMILY@"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX Companion @VERSION_FAMILY@" "DisplayVersion" "@VERSION@"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX Companion @VERSION_FAMILY@" "UninstallString" "$\"$INSTDIR\Uninstall.exe$\""
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX Companion @VERSION_FAMILY@" "DisplayIcon" "$\"$INSTDIR\companion.exe$\""
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX Companion @VERSION_FAMILY@" "Publisher" "OpenTX"
diff --git a/radio/src/gui/128x64/lcd.cpp b/radio/src/gui/128x64/lcd.cpp
index 91baa3d19..c2c12fead 100644
--- a/radio/src/gui/128x64/lcd.cpp
+++ b/radio/src/gui/128x64/lcd.cpp
@@ -452,12 +452,12 @@ void lcdDraw8bitsNumber(coord_t x, coord_t y, int8_t val)
lcdDrawNumber(x, y, val);
}
-void lcdDrawNumber(coord_t x, coord_t y, int val, LcdFlags flags)
+void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags flags)
{
lcdDrawNumber(x, y, val, flags, 0);
}
-void lcdDrawNumber(coord_t x, coord_t y, int val, LcdFlags flags, uint8_t len)
+void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags flags, uint8_t len)
{
char str[16+1];
char *s = str+16;
diff --git a/radio/src/gui/128x64/lcd.h b/radio/src/gui/128x64/lcd.h
index f1fc72810..d066dc26d 100644
--- a/radio/src/gui/128x64/lcd.h
+++ b/radio/src/gui/128x64/lcd.h
@@ -117,8 +117,8 @@ void drawTimerWithMode(coord_t x, coord_t y, uint8_t index, LcdFlags att);
void lcdDrawHexNumber(coord_t x, coord_t y, uint32_t val, LcdFlags mode=0);
void lcdDrawHexChar(coord_t x, coord_t y, uint8_t val, LcdFlags flags=0);
-void lcdDrawNumber(coord_t x, coord_t y, int val, LcdFlags mode, uint8_t len);
-void lcdDrawNumber(coord_t x, coord_t y, int val, LcdFlags mode=0);
+void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags mode, uint8_t len);
+void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags mode=0);
void lcdDraw8bitsNumber(coord_t x, coord_t y, int8_t val);
void putsModelName(coord_t x, coord_t y, char * name, uint8_t id, LcdFlags att);
diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp
index 3a67ba80e..2f40a0d0e 100644
--- a/radio/src/gui/128x64/model_setup.cpp
+++ b/radio/src/gui/128x64/model_setup.cpp
@@ -85,6 +85,7 @@ enum MenuModelSetupItems {
ITEM_MODEL_SETUP_INTERNAL_MODULE_LABEL,
ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE,
#if defined(MULTIMODULE)
+ ITEM_MODEL_SETUP_INTERNAL_MODULE_PROTOCOL,
ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE,
ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS,
ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS,
@@ -113,6 +114,7 @@ enum MenuModelSetupItems {
ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL,
ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE,
#if defined(MULTIMODULE)
+ ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL,
ITEM_MODEL_SETUP_EXTERNAL_MODULE_SUBTYPE,
#endif
#if defined(MULTIMODULE)
@@ -208,7 +210,7 @@ inline uint8_t MODULE_TYPE_ROWS(int moduleIdx)
return 1;
#if defined(MULTIMODULE)
else if (isModuleMultimodule(moduleIdx)) {
- return 1;
+ return 0;
}
#endif
else
@@ -306,19 +308,20 @@ void onBluetoothConnectMenu(const char * result)
#if defined(HARDWARE_INTERNAL_MODULE)
#define INTERNAL_MODULE_ROWS \
LABEL(InternalModule), \
- MODULE_TYPE_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE*/ \
- MULTIMODULE_SUBTYPE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE*/ \
+ MODULE_TYPE_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE */ \
+ MULTIMODULE_TYPE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PROTOCOL */ \
+ MULTIMODULE_SUBTYPE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE */ \
MULTIMODULE_STATUS_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS */ \
- MODULE_CHANNELS_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS*/ \
+ MODULE_CHANNELS_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS */ \
IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(IF_INTERNAL_MODULE_ON(isModuleRxNumAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1))), /* *ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE */\
- IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM*/ \
+ IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM */ \
MODULE_OPTION_ROW(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_OPTIONS */ \
MULTIMODULE_MODULE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_AUTOBIND */ \
EXTERNAL_ANTENNA_ROW /* ITEM_MODEL_SETUP_INTERNAL_MODULE_ANTENNA */ \
MODULE_POWER_ROW(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_POWER */ \
IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE */ \
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_REGISTER_RANGE */ \
- IF_PXX2_MODULE(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_OPTIONS*/ \
+ IF_PXX2_MODULE(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_OPTIONS */ \
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_1 */ \
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_2 */ \
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_3 */
@@ -362,7 +365,8 @@ void menuModelSetup(event_t event)
LABEL(ExternalModule),
MODULE_TYPE_ROWS(EXTERNAL_MODULE),
- MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE)
+ MULTIMODULE_TYPE_ROWS(EXTERNAL_MODULE) // PROTOCOL
+ MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) // SUBTYPE
MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE)
MODULE_CHANNELS_ROWS(EXTERNAL_MODULE),
IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, MODULE_BIND_ROWS(EXTERNAL_MODULE)), // line reused for PPM: PPM settings
@@ -904,12 +908,6 @@ void menuModelSetup(event_t event)
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_DSM_PROTOCOLS, g_model.moduleData[moduleIdx].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
else if (isModuleR9MNonAccess(moduleIdx))
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_R9M_REGION, g_model.moduleData[moduleIdx].subType, (menuHorizontalPosition==1 ? attr : 0));
-#if defined(MULTIMODULE)
- else if (isModuleMultimodule(moduleIdx)) {
- int multi_rfProto = g_model.moduleData[moduleIdx].getMultiProtocol();
- lcdDrawMultiProtocolString(lcdNextPos + 3, y, moduleIdx, multi_rfProto, menuHorizontalPosition == 1 ? attr : 0);
- }
-#endif
if (attr && menuHorizontalPosition == 0 && moduleIdx == EXTERNAL_MODULE) {
if (s_editMode > 0) {
g_model.moduleData[moduleIdx].type = MODULE_TYPE_NONE;
@@ -958,18 +956,6 @@ void menuModelSetup(event_t event)
g_model.moduleData[moduleIdx].channelsCount = defaultModuleChannels_M8(moduleIdx);
}
}
-
-#if defined(MULTIMODULE)
- else if (isModuleMultimodule(moduleIdx)) {
- int multiRfProto = g_model.moduleData[moduleIdx].getMultiProtocol();
- CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
- if (checkIncDec_Ret) {
- g_model.moduleData[moduleIdx].setMultiProtocol(multiRfProto);
- g_model.moduleData[moduleIdx].subType = 0;
- resetMultiProtocolsOptions(moduleIdx);
- }
- }
-#endif
else {
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].subType, 0, MODULE_SUBTYPE_PXX1_LAST);
}
@@ -1004,6 +990,26 @@ void menuModelSetup(event_t event)
break;
#if defined(MULTIMODULE)
+#if defined(HARDWARE_INTERNAL_MODULE)
+ case ITEM_MODEL_SETUP_INTERNAL_MODULE_PROTOCOL:
+#endif
+ case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL:
+ {
+ lcdDrawTextAlignedLeft(y, TR_TYPE);
+ int multi_rfProto = g_model.moduleData[moduleIdx].getMultiProtocol();
+ lcdDrawMultiProtocolString(MODEL_SETUP_2ND_COLUMN, y, moduleIdx, multi_rfProto, attr);
+ if (attr) {
+ int multiRfProto = g_model.moduleData[moduleIdx].getMultiProtocol();
+ CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
+ if (checkIncDec_Ret) {
+ g_model.moduleData[moduleIdx].setMultiProtocol(multiRfProto);
+ g_model.moduleData[moduleIdx].subType = 0;
+ resetMultiProtocolsOptions(moduleIdx);
+ }
+ }
+ }
+ break;
+
#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE:
#endif
diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp
index e73c2938e..b03b13d17 100644
--- a/radio/src/gui/212x64/model_setup.cpp
+++ b/radio/src/gui/212x64/model_setup.cpp
@@ -98,6 +98,7 @@ enum MenuModelSetupItems {
ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL,
ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE,
#if defined (MULTIMODULE)
+ ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL,
ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS,
ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS,
#endif
@@ -130,8 +131,6 @@ enum MenuModelSetupItems {
#define MODEL_SETUP_2ND_COLUMN (LCD_W-17*FW-MENUS_SCROLLBAR_WIDTH-1)
#define MODEL_SETUP_3RD_COLUMN (MODEL_SETUP_2ND_COLUMN+6*FW)
-#define MODEL_SETUP_BIND_OFS 3*FW-2
-#define MODEL_SETUP_RANGE_OFS 7*FW
#define MODEL_SETUP_SET_FAILSAFE_OFS 10*FW-2
void copySelection(char * dst, const char * src, uint8_t size)
@@ -250,11 +249,6 @@ inline uint8_t EXTERNAL_MODULE_TYPE_ROW()
{
if (isModuleXJT(EXTERNAL_MODULE) || isModuleR9MNonAccess(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE))
return 1;
-#if defined(MULTIMODULE)
- else if (isModuleMultimodule(EXTERNAL_MODULE)) {
- return 1 + MULTIMODULE_RFPROTO_COLUMNS(EXTERNAL_MODULE);
- }
-#endif
else
return 0;
}
@@ -353,7 +347,7 @@ void menuModelSetup(event_t event)
LABEL(InternalModule),
INTERNAL_MODULE_TYPE_ROWS,
MODULE_CHANNELS_ROWS(INTERNAL_MODULE),
- IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(isModuleRangeAvailable(INTERNAL_MODULE)? (uint8_t)2 : (uint8_t)1)), // RxNum, Range check and Register buttons
+ IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(isModuleBindRangeAvailable(INTERNAL_MODULE)? (uint8_t)2 : (uint8_t)1)), // RxNum, Range check and Register buttons
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // RxNum for ACCESS
IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), // Range check and Register buttons
@@ -364,6 +358,7 @@ void menuModelSetup(event_t event)
LABEL(ExternalModule),
EXTERNAL_MODULE_TYPE_ROW(),
+ MULTIMODULE_TYPE_ROW(EXTERNAL_MODULE)
MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE)
MODULE_CHANNELS_ROWS(EXTERNAL_MODULE),
IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, MODULE_BIND_ROWS(EXTERNAL_MODULE)),
@@ -815,15 +810,6 @@ void menuModelSetup(event_t event)
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
else if (isModuleR9MNonAccess(EXTERNAL_MODULE))
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0));
-#if defined(MULTIMODULE)
- else if (isModuleMultimodule(EXTERNAL_MODULE)) {
- uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol();
- // Do not use MODEL_SETUP_3RD_COLUMN here since some the protocol string are so long that we cannot afford the 2 spaces (+6) here
- lcdDrawMultiProtocolString(lcdNextPos + 3, y, EXTERNAL_MODULE, multi_rfProto, menuHorizontalPosition == 1 ? attr : 0);
- if (MULTIMODULE_HAS_SUBTYPE(EXTERNAL_MODULE))
- lcdDrawMultiSubProtocolString(lcdNextPos + 3, y, EXTERNAL_MODULE, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0);
- }
-#endif
if (attr && menuHorizontalPosition == 0) {
if (s_editMode > 0) {
g_model.moduleData[EXTERNAL_MODULE].type = MODULE_TYPE_NONE;
@@ -908,6 +894,40 @@ void menuModelSetup(event_t event)
}
break;
+#if defined(MULTIMODULE)
+ case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL:
+ {
+ lcdDrawTextAlignedLeft(y, TR_TYPE);
+ uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol();
+ lcdDrawMultiProtocolString(MODEL_SETUP_2ND_COLUMN, y, EXTERNAL_MODULE, multi_rfProto, menuHorizontalPosition == 0 ? attr : 0);
+ if (MULTIMODULE_HAS_SUBTYPE(EXTERNAL_MODULE))
+ lcdDrawMultiSubProtocolString(MODEL_SETUP_3RD_COLUMN + 15, y, EXTERNAL_MODULE, g_model.moduleData[EXTERNAL_MODULE].subType,
+ menuHorizontalPosition == 1 ? attr : 0);
+ if (attr) {
+ switch (menuHorizontalPosition) {
+ case 0: {
+ int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol();
+ CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
+ if (checkIncDec_Ret) {
+ g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto);
+ g_model.moduleData[EXTERNAL_MODULE].subType = 0;
+ resetMultiProtocolsOptions(EXTERNAL_MODULE);
+ }
+ }
+ break;
+
+ case 1:
+ CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, getMaxMultiSubtype(EXTERNAL_MODULE));
+ if (checkIncDec_Ret) {
+ resetMultiProtocolsOptions(EXTERNAL_MODULE);
+ }
+ break;
+ }
+ }
+ }
+ break;
+#endif
+
case ITEM_MODEL_SETUP_TRAINER_LABEL:
lcdDrawTextAlignedLeft(y, STR_TRAINER);
break;
@@ -1093,9 +1113,8 @@ void menuModelSetup(event_t event)
}
else {
horzpos_t l_posHorz = menuHorizontalPosition;
- coord_t xOffsetBind = MODEL_SETUP_BIND_OFS;
+ coord_t bindButtonPos = MODEL_SETUP_2ND_COLUMN;
if (!isModuleRxNumAvailable(moduleIdx)) {
- xOffsetBind = 0;
lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER);
if (attr) l_posHorz += 1;
}
@@ -1103,8 +1122,8 @@ void menuModelSetup(event_t event)
lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM);
}
if (isModuleBindRangeAvailable(moduleIdx)) {
- if (xOffsetBind)
- lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2);
+ lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2);
+ bindButtonPos = lcdNextPos + FW;
if (attr && l_posHorz==0) {
if (s_editMode>0) {
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx));
@@ -1121,8 +1140,8 @@ void menuModelSetup(event_t event)
}
}
}
- lcdDrawText(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0);
- lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0);
+ lcdDrawText(bindButtonPos, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0);
+ lcdDrawText(lcdNextPos + FW, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0);
uint8_t newFlag = 0;
#if defined(MULTIMODULE)
if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) {
diff --git a/radio/src/gui/212x64/radio_diaganas.cpp b/radio/src/gui/212x64/radio_diaganas.cpp
index bea4089a4..6e1f21ced 100644
--- a/radio/src/gui/212x64/radio_diaganas.cpp
+++ b/radio/src/gui/212x64/radio_diaganas.cpp
@@ -38,12 +38,4 @@ void menuRadioDiagAnalogs(event_t event)
lcdDrawNumber(x+10*FW-1, y, (int16_t)calibratedAnalogs[CONVERT_MODE(i)]*25/256, RIGHT);
#endif
}
-
- // RAS
- if ((isModuleXJT(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) || (isModulePXX1(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON())) {
- lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+6*FH, "RAS");
- lcdDrawNumber(10*FW-1, MENU_HEADER_HEIGHT+6*FH, telemetryData.swrInternal.value(), RIGHT);
- lcdDrawText(LCD_W/2, MENU_HEADER_HEIGHT+6*FH, "XJTVER");
- lcdDrawNumber(LCD_W/2 + 10*FW-1, MENU_HEADER_HEIGHT+6*FH, telemetryData.xjtVersion, RIGHT);
- }
}
diff --git a/radio/src/gui/480x272/model_receiver_options.cpp b/radio/src/gui/480x272/model_receiver_options.cpp
index b1ab35036..90db6f7e3 100644
--- a/radio/src/gui/480x272/model_receiver_options.cpp
+++ b/radio/src/gui/480x272/model_receiver_options.cpp
@@ -46,14 +46,18 @@ void onRxOptionsUpdateConfirm(const char * result)
enum {
ITEM_RECEIVER_SETTINGS_PWM_RATE,
ITEM_RECEIVER_SETTINGS_TELEMETRY,
+ ITEM_RECEIVER_SETTINGS_TELEMETRY_25MW,
ITEM_RECEIVER_SETTINGS_SPORT_FPORT,
ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED1,
ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED2,
ITEM_RECEIVER_SETTINGS_PINMAP_FIRST
};
+#define IS_RECEIVER_CAPABILITY_ENABLED(capability) (reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilities & (1 << capability))
+#define IF_RECEIVER_CAPABILITY(capability, count) uint8_t(IS_RECEIVER_CAPABILITY_ENABLED(capability) ? count : HIDDEN_ROW)
-#define IF_RECEIVER_CAPABILITY(capability, count) uint8_t((reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilities & (1 << capability)) ? count : HIDDEN_ROW)
+#define CH_ENABLE_SPORT 4
+#define CH_ENABLE_SBUS 5
bool menuModelReceiverOptions(event_t event)
{
@@ -76,6 +80,7 @@ bool menuModelReceiverOptions(event_t event)
SUBMENU(STR_RECEIVER_OPTIONS, ICON_MODEL_SETUP, ITEM_RECEIVER_SETTINGS_PINMAP_FIRST + outputsCount, {
0, // PWM rate
isModuleR9MAccess(g_moduleIdx) && receiverVariant == PXX2_VARIANT_EU && reusableBuffer.hardwareAndSettings.moduleSettings.txPower > 14 /*25mW*/ ? READONLY_ROW : (uint8_t)0, // Telemetry
+ IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_TELEMETRY_25MW, 0),
IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_FPORT, 0),
uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW),
uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW),
@@ -156,6 +161,14 @@ bool menuModelReceiverOptions(event_t event)
}
break;
+ case ITEM_RECEIVER_SETTINGS_TELEMETRY_25MW:
+ lcdDrawText(MENUS_MARGIN_LEFT, y, "25mw Tele");
+ reusableBuffer.hardwareAndSettings.receiverSettings.telemetry25mw = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.telemetry25mw, RECEIVER_OPTIONS_2ND_COLUMN, y, attr, event);
+ if (attr && checkIncDec_Ret) {
+ reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY;
+ }
+ break;
+
case ITEM_RECEIVER_SETTINGS_SPORT_FPORT:
lcdDrawText(MENUS_MARGIN_LEFT, y, "F.Port");
reusableBuffer.hardwareAndSettings.receiverSettings.fport = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.fport, RECEIVER_OPTIONS_2ND_COLUMN, y, attr, event);
@@ -182,21 +195,43 @@ bool menuModelReceiverOptions(event_t event)
int32_t channelValue = channelOutputs[channel];
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_PIN);
lcdDrawNumber(lcdNextPos + 1, y, pin + 1);
- putsChn(100, y, channel + 1, attr);
+
+ uint8_t channelMax = sentModuleChannels(g_moduleIdx) - 1;
+ uint8_t selectionMax = channelMax;
+
+ if (IS_RECEIVER_CAPABILITY_ENABLED(RECEIVER_CAPABILITY_ENABLE_PWM_CH5_CH6)) {
+ if (CH_ENABLE_SPORT == pin || CH_ENABLE_SBUS == pin) {
+ selectionMax += 1;
+ }
+ if (CH_ENABLE_SPORT == pin && selectionMax == channel) {
+ lcdDrawText(100, y, "S.PORT", attr);
+ }
+ else if (CH_ENABLE_SBUS == pin && selectionMax == channel) {
+ lcdDrawText(100, y, "SBUS", attr);
+ }
+ else {
+ putsChn(100, y, channel + 1, attr);
+ }
+ }
+ else {
+ putsChn(100, y, channel + 1, attr);
+ }
// Channel
if (attr) {
- mapping = checkIncDec(event, mapping, 0, sentModuleChannels(g_moduleIdx) - 1);
+ mapping = checkIncDec(event, mapping, 0, selectionMax);
if (checkIncDec_Ret) {
reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY;
}
}
// Bargraph
- lcdDrawRect(RECEIVER_OPTIONS_2ND_COLUMN, y + 4, wbar + 1, 10);
- const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2);
- const coord_t xChannel = (channelValue > 0) ? RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 : RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 + 1 - lenChannel;
- lcdDrawSolidFilledRect(xChannel, y + 5, lenChannel, 8, TEXT_INVERTED_BGCOLOR);
+ if (channel <= channelMax) {
+ lcdDrawRect(RECEIVER_OPTIONS_2ND_COLUMN, y + 4, wbar + 1, 10);
+ auto lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2);
+ auto xChannel = (channelValue > 0) ? RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 : RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 + 1 - lenChannel;
+ lcdDrawSolidFilledRect(xChannel, y + 5, lenChannel, 8, TEXT_INVERTED_BGCOLOR);
+ }
}
break;
}
diff --git a/radio/src/gui/480x272/popups.cpp b/radio/src/gui/480x272/popups.cpp
index 25a28779e..2d8caeca3 100644
--- a/radio/src/gui/480x272/popups.cpp
+++ b/radio/src/gui/480x272/popups.cpp
@@ -46,7 +46,7 @@ void showAlertBox(const char * title, const char * text, const char * action, ui
lcdRefresh();
lcdSetContrast();
waitKeysReleased();
- backlightOn();
+ resetBacklightTimeout();
checkBacklight();
}
diff --git a/radio/src/gui/480x272/radio_diaganas.cpp b/radio/src/gui/480x272/radio_diaganas.cpp
index 2892457dc..88f82d748 100644
--- a/radio/src/gui/480x272/radio_diaganas.cpp
+++ b/radio/src/gui/480x272/radio_diaganas.cpp
@@ -23,7 +23,6 @@
constexpr coord_t LEFT_NAME_COLUMN = MENUS_MARGIN_LEFT;
constexpr coord_t RIGHT_NAME_COLUMN = LCD_W / 2;
constexpr coord_t ANA_OFFSET = 150;
-constexpr coord_t RAS_TOP_POSITION = LCD_H - 45;
bool menuRadioDiagAnalogs(event_t event)
{
@@ -49,14 +48,6 @@ bool menuRadioDiagAnalogs(event_t event)
#endif
}
- // RAS
- if ((isModuleXJT(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) || (isModulePXX1(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON())) {
- lcdDrawText(MENUS_MARGIN_LEFT, RAS_TOP_POSITION, "RAS : ");
- lcdDrawNumber(lcdNextPos, RAS_TOP_POSITION, telemetryData.swrInternal.value(), 0);
- lcdDrawText(LCD_W / 2, RAS_TOP_POSITION, "XJTVER : ");
- lcdDrawNumber(lcdNextPos, RAS_TOP_POSITION, telemetryData.xjtVersion, 0);
- }
-
#if (NUM_PWMSTICKS > 0) && !defined(SIMU)
lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 8 * FH, STICKS_PWM_ENABLED() ? "Sticks: PWM" : "Sticks: ANA");
#endif
diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp
index 41f93259b..23d6e85de 100644
--- a/radio/src/gui/480x272/radio_hardware.cpp
+++ b/radio/src/gui/480x272/radio_hardware.cpp
@@ -72,6 +72,8 @@ enum MenuRadioHardwareItems {
#endif
ITEM_RADIO_HARDWARE_JITTER_FILTER,
+ ITEM_RADIO_HARDWARE_RAS,
+
#if defined(SPORT_UPDATE_PWR_GPIO)
ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER,
#endif
@@ -79,7 +81,8 @@ enum MenuRadioHardwareItems {
ITEM_RADIO_HARDWARE_MAX
};
-#define HW_SETTINGS_COLUMN 150
+#define HW_SETTINGS_COLUMN1 150
+#define HW_SETTINGS_COLUMN2 200
#if defined(AUX_SERIAL)
#define AUX_SERIAL_ROW 0,
@@ -157,6 +160,7 @@ bool menuRadioHardware(event_t event)
AUX_SERIAL_ROW /* aux serial mode */
0, /* ADC filter */
+ READONLY_ROW /* RAS */,
SPORT_POWER_ROWS
1, /* Debug */
});
@@ -197,7 +201,7 @@ bool menuRadioHardware(event_t event)
case ITEM_RADIO_HARDWARE_STICK2:
case ITEM_RADIO_HARDWARE_STICK3:
case ITEM_RADIO_HARDWARE_STICK4:
- editStickHardwareSettings(HW_SETTINGS_COLUMN, y, k - ITEM_RADIO_HARDWARE_STICK1, event, attr);
+ editStickHardwareSettings(HW_SETTINGS_COLUMN1, y, k - ITEM_RADIO_HARDWARE_STICK1, event, attr);
break;
case ITEM_RADIO_HARDWARE_LS:
@@ -211,11 +215,11 @@ bool menuRadioHardware(event_t event)
uint8_t mask = (0x01 << idx);
lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+NUM_POTS+idx+1, menuHorizontalPosition < 0 ? attr : 0);
if (ZEXIST(g_eeGeneral.anaNames[NUM_STICKS+NUM_POTS+idx]) || (attr && menuHorizontalPosition == 0))
- editName(HW_SETTINGS_COLUMN, y, g_eeGeneral.anaNames[NUM_STICKS+NUM_POTS+idx], LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0);
+ editName(HW_SETTINGS_COLUMN1, y, g_eeGeneral.anaNames[NUM_STICKS+NUM_POTS+idx], LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0);
else
- lcdDrawMMM(HW_SETTINGS_COLUMN, y, 0);
+ lcdDrawMMM(HW_SETTINGS_COLUMN1, y, 0);
uint8_t potType = (g_eeGeneral.slidersConfig & mask) >> idx;
- potType = editChoice(HW_SETTINGS_COLUMN+50, y, STR_SLIDERTYPES, potType, SLIDER_NONE, SLIDER_WITH_DETENT, menuHorizontalPosition == 1 ? attr : 0, event);
+ potType = editChoice(HW_SETTINGS_COLUMN2, y, STR_SLIDERTYPES, potType, SLIDER_NONE, SLIDER_WITH_DETENT, menuHorizontalPosition == 1 ? attr : 0, event);
g_eeGeneral.slidersConfig &= ~mask;
g_eeGeneral.slidersConfig |= (potType << idx);
break;
@@ -236,11 +240,11 @@ bool menuRadioHardware(event_t event)
int index = k - ITEM_RADIO_HARDWARE_POT1;
lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+index+1, menuHorizontalPosition < 0 ? attr : 0);
if (ZEXIST(g_eeGeneral.anaNames[NUM_STICKS+index]) || (attr && menuHorizontalPosition == 0))
- editName(HW_SETTINGS_COLUMN, y, g_eeGeneral.anaNames[NUM_STICKS+index], LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0);
+ editName(HW_SETTINGS_COLUMN1, y, g_eeGeneral.anaNames[NUM_STICKS+index], LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0);
else
- lcdDrawMMM(HW_SETTINGS_COLUMN, y, 0);
+ lcdDrawMMM(HW_SETTINGS_COLUMN1, y, 0);
uint32_t potType = bfGet(g_eeGeneral.potsConfig, 2*(index), 2);
- potType = editChoice(HW_SETTINGS_COLUMN+50, y, STR_POTTYPES, potType, POT_NONE, POT_WITHOUT_DETENT, menuHorizontalPosition == 1 ? attr : 0, event);
+ potType = editChoice(HW_SETTINGS_COLUMN2, y, STR_POTTYPES, potType, POT_NONE, POT_WITHOUT_DETENT, menuHorizontalPosition == 1 ? attr : 0, event);
g_eeGeneral.potsConfig = bfSet(g_eeGeneral.potsConfig, potType, 2*index, 2);
break;
}
@@ -264,10 +268,10 @@ bool menuRadioHardware(event_t event)
int config = SWITCH_CONFIG(index);
lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, MIXSRC_FIRST_SWITCH-MIXSRC_Rud+index+1, menuHorizontalPosition < 0 ? attr : 0);
if (ZEXIST(g_eeGeneral.switchNames[index]) || (attr && menuHorizontalPosition == 0))
- editName(HW_SETTINGS_COLUMN, y, g_eeGeneral.switchNames[index], LEN_SWITCH_NAME, event, menuHorizontalPosition == 0 ? attr : 0);
+ editName(HW_SETTINGS_COLUMN1, y, g_eeGeneral.switchNames[index], LEN_SWITCH_NAME, event, menuHorizontalPosition == 0 ? attr : 0);
else
- lcdDrawMMM(HW_SETTINGS_COLUMN, y, 0);
- config = editChoice(HW_SETTINGS_COLUMN+50, y, STR_SWTYPES, config, SWITCH_NONE, SWITCH_TYPE_MAX(index), menuHorizontalPosition == 1 ? attr : 0, event);
+ lcdDrawMMM(HW_SETTINGS_COLUMN1, y, 0);
+ config = editChoice(HW_SETTINGS_COLUMN2, y, STR_SWTYPES, config, SWITCH_NONE, SWITCH_TYPE_MAX(index), menuHorizontalPosition == 1 ? attr : 0, event);
if (attr && checkIncDec_Ret) {
g_eeGeneral.switchConfig = bfSet(g_eeGeneral.switchConfig, config, 2*index, 2);
}
@@ -276,18 +280,18 @@ bool menuRadioHardware(event_t event)
case ITEM_RADIO_HARDWARE_BATTERY_CALIB:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BATT_CALIB);
- lcdDrawNumber(HW_SETTINGS_COLUMN+50, y, getBatteryVoltage(), attr|PREC2, 0, NULL, "V");
+ lcdDrawNumber(HW_SETTINGS_COLUMN2, y, getBatteryVoltage(), attr|PREC2, 0, NULL, "V");
if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.txVoltageCalibration, -127, 127);
break;
case ITEM_RADIO_HARDWARE_RTC_BATTERY:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_RTC_BATT);
- lcdDrawNumber(HW_SETTINGS_COLUMN+50, y, getRTCBatteryVoltage(), attr|PREC2, 0, NULL, "V");
+ lcdDrawNumber(HW_SETTINGS_COLUMN2, y, getRTCBatteryVoltage(), attr|PREC2, 0, NULL, "V");
break;
case ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MAXBAUDRATE);
- lcdDrawNumber(HW_SETTINGS_COLUMN+50, y, CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate], attr|LEFT);
+ lcdDrawNumber(HW_SETTINGS_COLUMN2, y, CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate], attr|LEFT);
if (attr) {
g_eeGeneral.telemetryBaudrate = DIM(CROSSFIRE_BAUDRATES) - 1 - checkIncDecModel(event, DIM(CROSSFIRE_BAUDRATES) - 1 - g_eeGeneral.telemetryBaudrate, 0, DIM(CROSSFIRE_BAUDRATES) - 1);
if (checkIncDec_Ret && IS_EXTERNAL_MODULE_ON()) {
@@ -307,40 +311,40 @@ bool menuRadioHardware(event_t event)
{
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_RTC_CHECK);
uint8_t b = 1 - g_eeGeneral.disableRtcWarning;
- g_eeGeneral.disableRtcWarning = 1 - editCheckBox(b, HW_SETTINGS_COLUMN + 50, y, attr, event);
+ g_eeGeneral.disableRtcWarning = 1 - editCheckBox(b, HW_SETTINGS_COLUMN2, y, attr, event);
break;
}
#if defined(BLUETOOTH)
case ITEM_RADIO_HARDWARE_BLUETOOTH_MODE:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BLUETOOTH);
- g_eeGeneral.bluetoothMode = editChoice(HW_SETTINGS_COLUMN+50, y, STR_BLUETOOTH_MODES, g_eeGeneral.bluetoothMode, BLUETOOTH_OFF, BLUETOOTH_TRAINER, attr, event);
+ g_eeGeneral.bluetoothMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_BLUETOOTH_MODES, g_eeGeneral.bluetoothMode, BLUETOOTH_OFF, BLUETOOTH_TRAINER, attr, event);
break;
case ITEM_RADIO_HARDWARE_BLUETOOTH_PAIRING_CODE:
lcdDrawText(INDENT_WIDTH, y, STR_BLUETOOTH_PIN_CODE);
- lcdDrawText(HW_SETTINGS_COLUMN+50, y, "000000", 0);
+ lcdDrawText(HW_SETTINGS_COLUMN2, y, "000000", 0);
break;
case ITEM_RADIO_HARDWARE_BLUETOOTH_LOCAL_ADDR:
lcdDrawText(INDENT_WIDTH, y, STR_BLUETOOTH_LOCAL_ADDR);
- lcdDrawText(HW_SETTINGS_COLUMN+50, y, bluetooth.localAddr[0] == '\0' ? "---" : bluetooth.localAddr);
+ lcdDrawText(HW_SETTINGS_COLUMN2, y, bluetooth.localAddr[0] == '\0' ? "---" : bluetooth.localAddr);
break;
case ITEM_RADIO_HARDWARE_BLUETOOTH_DISTANT_ADDR:
lcdDrawText(INDENT_WIDTH, y, STR_BLUETOOTH_DIST_ADDR);
- lcdDrawText(HW_SETTINGS_COLUMN+50, y, bluetooth.distantAddr[0] == '\0' ? "---" : bluetooth.distantAddr);
+ lcdDrawText(HW_SETTINGS_COLUMN2, y, bluetooth.distantAddr[0] == '\0' ? "---" : bluetooth.distantAddr);
break;
case ITEM_RADIO_HARDWARE_BLUETOOTH_NAME:
lcdDrawText(INDENT_WIDTH, y, STR_NAME);
- editName(HW_SETTINGS_COLUMN+50, y, g_eeGeneral.bluetoothName, LEN_BLUETOOTH_NAME, event, attr);
+ editName(HW_SETTINGS_COLUMN2, y, g_eeGeneral.bluetoothName, LEN_BLUETOOTH_NAME, event, attr);
break;
#endif
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
case ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_ANTENNA);
- reusableBuffer.radioHardware.antennaMode = editChoice(HW_SETTINGS_COLUMN+50, y, STR_ANTENNA_MODES, reusableBuffer.radioHardware.antennaMode, ANTENNA_MODE_INTERNAL, ANTENNA_MODE_EXTERNAL, attr, event);
+ reusableBuffer.radioHardware.antennaMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_ANTENNA_MODES, reusableBuffer.radioHardware.antennaMode, ANTENNA_MODE_INTERNAL, ANTENNA_MODE_EXTERNAL, attr, event);
if (!s_editMode && reusableBuffer.radioHardware.antennaMode != g_eeGeneral.antennaMode) {
if (!isExternalAntennaEnabled() && (reusableBuffer.radioHardware.antennaMode == ANTENNA_MODE_EXTERNAL || (reusableBuffer.radioHardware.antennaMode == ANTENNA_MODE_PER_MODEL && g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode == ANTENNA_MODE_EXTERNAL))) {
POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, onHardwareAntennaSwitchConfirm);
@@ -360,7 +364,7 @@ bool menuRadioHardware(event_t event)
#if defined(RADIO_TX16S)
lcdDrawText(lcdNextPos, y, " (TTL)");
#endif
- g_eeGeneral.auxSerialMode = editChoice(HW_SETTINGS_COLUMN+50, y, STR_AUX_SERIAL_MODES, g_eeGeneral.auxSerialMode, 0, UART_MODE_MAX, attr, event);
+ g_eeGeneral.auxSerialMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_AUX_SERIAL_MODES, g_eeGeneral.auxSerialMode, 0, UART_MODE_MAX, attr, event);
if (attr && checkIncDec_Ret) {
auxSerialInit(g_eeGeneral.auxSerialMode, modelTelemetryProtocol());
}
@@ -371,14 +375,32 @@ bool menuRadioHardware(event_t event)
{
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_JITTER_FILTER);
uint8_t b = 1 - g_eeGeneral.jitterFilter;
- g_eeGeneral.jitterFilter = 1 - editCheckBox(b, HW_SETTINGS_COLUMN+50, y, attr, event);
+ g_eeGeneral.jitterFilter = 1 - editCheckBox(b, HW_SETTINGS_COLUMN2, y, attr, event);
break;
}
+ case ITEM_RADIO_HARDWARE_RAS:
+#if defined(HARDWARE_INTERNAL_RAS)
+ lcdDrawText(MENUS_MARGIN_LEFT, y, "RAS");
+ if (telemetryData.swrInternal.isFresh())
+ lcdDrawNumber(HW_SETTINGS_COLUMN2, y, telemetryData.swrInternal.value());
+ else
+ lcdDrawText(HW_SETTINGS_COLUMN2, y, "---");
+ lcdDrawText(lcdNextPos, y, "/");
+#else
+ lcdDrawText(MENUS_MARGIN_LEFT, y, "Ext. RAS");
+ lcdNextPos = HW_SETTINGS_COLUMN2;
+#endif
+ if (telemetryData.swrExternal.isFresh())
+ lcdDrawNumber(lcdNextPos, y, telemetryData.swrExternal.value());
+ else
+ lcdDrawText(lcdNextPos, y, "---");
+ break;
+
#if defined(SPORT_UPDATE_PWR_GPIO)
case ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_SPORT_UPDATE_POWER_MODE);
- g_eeGeneral.sportUpdatePower = editChoice(HW_SETTINGS_COLUMN + 50, y, STR_SPORT_UPDATE_POWER_MODES, g_eeGeneral.sportUpdatePower, 0, 1, attr, event);
+ g_eeGeneral.sportUpdatePower = editChoice(HW_SETTINGS_COLUMN2, y, STR_SPORT_UPDATE_POWER_MODES, g_eeGeneral.sportUpdatePower, 0, 1, attr, event);
if (attr && checkIncDec_Ret) {
SPORT_UPDATE_POWER_INIT();
}
@@ -387,7 +409,7 @@ bool menuRadioHardware(event_t event)
case ITEM_RADIO_HARDWARE_DEBUG:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_DEBUG);
- lcdDrawText(HW_SETTINGS_COLUMN + 50, y, STR_ANALOGS_BTN, menuHorizontalPosition == 0 ? attr : 0);
+ lcdDrawText(HW_SETTINGS_COLUMN2, y, STR_ANALOGS_BTN, menuHorizontalPosition == 0 ? attr : 0);
lcdDrawText(lcdNextPos + 10, y, STR_KEYS_BTN, menuHorizontalPosition == 1 ? attr : 0);
if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) {
if (menuHorizontalPosition == 0)
diff --git a/radio/src/gui/480x272/radio_sdmanager.cpp b/radio/src/gui/480x272/radio_sdmanager.cpp
index 9a44203a5..90b5e5f57 100644
--- a/radio/src/gui/480x272/radio_sdmanager.cpp
+++ b/radio/src/gui/480x272/radio_sdmanager.cpp
@@ -18,7 +18,6 @@
* GNU General Public License for more details.
*/
-#include
#include "io/frsky_firmware_update.h"
#include "io/multi_firmware_update.h"
#include "opentx.h"
@@ -91,6 +90,49 @@ void onSdFormatConfirm(const char * result)
}
}
+#if defined(PXX2)
+void onUpdateConfirmation(const char * result)
+{
+ if (result == STR_OK) {
+ OtaUpdateInformation * destination = moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].otaUpdateInformation;
+ Pxx2OtaUpdate otaUpdate(reusableBuffer.sdManager.otaUpdateInformation.module, destination->candidateReceiversNames[destination->selectedReceiverIndex]);
+ otaUpdate.flashFirmware(destination->filename);
+ }
+ else {
+ moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL;
+ }
+}
+
+void onUpdateStateChanged()
+{
+ if (reusableBuffer.sdManager.otaUpdateInformation.step == BIND_INFO_REQUEST) {
+ uint8_t modelId = reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.modelID;
+ if (modelId > 0 && modelId < DIM(PXX2ReceiversNames)) {
+ if (isPXX2ReceiverOptionAvailable(modelId, RECEIVER_OPTION_OTA)) {
+ POPUP_CONFIRMATION(getPXX2ReceiverName(modelId), onUpdateConfirmation);
+ char *tmp = strAppend(reusableBuffer.sdManager.otaReceiverVersion, TR_CURRENT_VERSION);
+ tmp = strAppendUnsigned(tmp, 1 + reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.swVersion.major);
+ *tmp++ = '.';
+ tmp = strAppendUnsigned(tmp, reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.swVersion.minor);
+ *tmp++ = '.';
+ tmp = strAppendUnsigned(tmp, reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.swVersion.revision);
+ SET_WARNING_INFO(reusableBuffer.sdManager.otaReceiverVersion, tmp - reusableBuffer.sdManager.otaReceiverVersion, 0);
+ }
+ else {
+ POPUP_WARNING(STR_OTA_UPDATE_ERROR);
+ SET_WARNING_INFO(STR_UNSUPPORTED_RX, sizeof(TR_UNSUPPORTED_RX) - 1, 0);
+ moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL;
+ }
+ }
+ else {
+ POPUP_WARNING(STR_OTA_UPDATE_ERROR);
+ SET_WARNING_INFO(STR_UNKNOWN_RX, sizeof(TR_UNKNOWN_RX) - 1, 0);
+ moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL;
+ }
+ }
+}
+#endif
+
void onSdManagerMenu(const char * result)
{
TCHAR lfn[_MAX_LFN+1];
@@ -203,6 +245,14 @@ void onSdManagerMenu(const char * result)
multiFlashFirmware(EXTERNAL_MODULE, lfn);
}
#endif
+#if defined(PXX2)
+ else if (result == STR_FLASH_RECEIVER_OTA_BY_INTERNAL || result == STR_FLASH_RECEIVER_OTA_BY_EXTERNAL) {
+ memclear(&reusableBuffer.sdManager.otaUpdateInformation, sizeof(OtaUpdateInformation));
+ getSelectionFullPath(reusableBuffer.sdManager.otaUpdateInformation.filename);
+ reusableBuffer.sdManager.otaUpdateInformation.module = result == STR_FLASH_RECEIVER_OTA_BY_INTERNAL ? INTERNAL_MODULE : EXTERNAL_MODULE;
+ moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].startBind(&reusableBuffer.sdManager.otaUpdateInformation, onUpdateStateChanged);
+ }
+#endif
#if defined(LUA)
else if (result == STR_EXECUTE_FILE) {
getSelectionFullPath(lfn);
@@ -211,20 +261,47 @@ void onSdManagerMenu(const char * result)
#endif
}
+#if defined(PXX2)
+void onUpdateReceiverSelection(const char * result)
+{
+ if (result != STR_EXIT) {
+ reusableBuffer.sdManager.otaUpdateInformation.selectedReceiverIndex = (result - reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[0]) / sizeof(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[0]);
+ reusableBuffer.sdManager.otaUpdateInformation.step = BIND_INFO_REQUEST;
+#if defined(SIMU)
+ reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.modelID = 0x01;
+ onUpdateStateChanged();
+#endif
+ }
+ else {
+ // the user pressed [Exit]
+ moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL;
+ }
+}
+#endif
+
bool menuRadioSdManager(event_t _event)
{
+#if defined(PXX2)
+ if (EVT_KEY_MASK(_event) == KEY_EXIT && moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND) {
+ moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL;
+ CLEAR_POPUP();
+ killEvents(KEY_EXIT);
+ _event = 0;
+ }
+#endif
+
event_t event = (EVT_KEY_MASK(_event) == KEY_ENTER ? 0 : _event);
SIMPLE_MENU(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, RADIO_ICONS, menuTabGeneral, MENU_RADIO_SD_MANAGER, reusableBuffer.sdManager.count);
int index = menuVerticalPosition - menuVerticalOffset;
- switch(_event) {
+ switch (_event) {
case EVT_ENTRY:
f_chdir(ROOT_PATH);
// no break;
case EVT_ENTRY_UP:
- memset(&reusableBuffer.sdManager, 0, sizeof(reusableBuffer.sdManager));
+ memclear(&reusableBuffer.sdManager, sizeof(reusableBuffer.sdManager));
menuVerticalPosition = 0;
REFRESH_FILES();
break;
@@ -300,8 +377,12 @@ bool menuRadioSdManager(event_t _event)
if (HAS_SPORT_UPDATE_CONNECTOR() && (information.productFamily == FIRMWARE_FAMILY_RECEIVER || information.productFamily == FIRMWARE_FAMILY_SENSOR))
POPUP_MENU_ADD_ITEM(STR_FLASH_EXTERNAL_DEVICE);
#if defined(PXX2)
- if (information.productFamily == FIRMWARE_FAMILY_RECEIVER)
- POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA);
+ if (information.productFamily == FIRMWARE_FAMILY_RECEIVER) {
+ if (isReceiverOTAEnabledFromModule(INTERNAL_MODULE, information.productId))
+ POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA_BY_INTERNAL);
+ if (isReceiverOTAEnabledFromModule(EXTERNAL_MODULE, information.productId))
+ POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA_BY_EXTERNAL);
+ }
#endif
#if defined(BLUETOOTH)
if (information.productFamily == FIRMWARE_FAMILY_BLUETOOTH_CHIP)
@@ -476,6 +557,27 @@ bool menuRadioSdManager(event_t _event)
}
}
+#if defined(PXX2)
+ if (moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND) {
+ if (reusableBuffer.sdManager.otaUpdateInformation.step == BIND_INIT) {
+ if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount > 0) {
+ if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount != popupMenuItemsCount) {
+ CLEAR_POPUP();
+ popupMenuItemsCount = min(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount,PXX2_MAX_RECEIVERS_PER_MODULE);
+ for (auto rx = 0; rx < popupMenuItemsCount; rx++) {
+ popupMenuItems[rx] = reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[rx];
+ }
+ //popupMenuTitle = STR_PXX2_SELECT_RX;
+ POPUP_MENU_START(onUpdateReceiverSelection);
+ }
+ }
+ else {
+ POPUP_WAIT(STR_WAITING_FOR_RX);
+ }
+ }
+ }
+#endif
+
const char * ext = getFileExtension(reusableBuffer.sdManager.lines[index]);
if (ext && isExtensionMatching(ext, BITMAPS_EXT)) {
if (currentBitmapIndex != menuVerticalPosition) {
diff --git a/radio/src/gui/common/colorlcd/draw_functions.cpp b/radio/src/gui/common/colorlcd/draw_functions.cpp
index d78424855..1854c0057 100644
--- a/radio/src/gui/common/colorlcd/draw_functions.cpp
+++ b/radio/src/gui/common/colorlcd/draw_functions.cpp
@@ -31,7 +31,7 @@ void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFla
lcdDrawText(x, y, s, flags);
}
-void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att)
+void drawValueWithUnit(coord_t x, coord_t y, int32_t val, uint8_t unit, LcdFlags att)
{
// convertUnit(val, unit);
if (!(att & NO_UNIT) && unit != UNIT_RAW) {
diff --git a/radio/src/gui/common/colorlcd/draw_functions.h b/radio/src/gui/common/colorlcd/draw_functions.h
index 8f8ab6b3b..3d925b2af 100644
--- a/radio/src/gui/common/colorlcd/draw_functions.h
+++ b/radio/src/gui/common/colorlcd/draw_functions.h
@@ -24,7 +24,7 @@
#include "lcd.h"
void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFlags flags, const char * prefix, const char * suffix);
-void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att);
+void drawValueWithUnit(coord_t x, coord_t y, int32_t val, uint8_t unit, LcdFlags att);
int editChoice(coord_t x, coord_t y, const char * values, int value, int min, int max, LcdFlags attr, event_t event, IsValueAvailable isValueAvailable=nullptr);
uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, LcdFlags attr, event_t event);
swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event);
diff --git a/radio/src/gui/common/stdlcd/draw_functions.cpp b/radio/src/gui/common/stdlcd/draw_functions.cpp
index fe8ac60dc..1bcf7286c 100644
--- a/radio/src/gui/common/stdlcd/draw_functions.cpp
+++ b/radio/src/gui/common/stdlcd/draw_functions.cpp
@@ -84,7 +84,7 @@ void drawTrimMode(coord_t x, coord_t y, uint8_t flightMode, uint8_t idx, LcdFlag
}
}
-void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att)
+void drawValueWithUnit(coord_t x, coord_t y, int32_t val, uint8_t unit, LcdFlags att)
{
// convertUnit(val, unit);
lcdDrawNumber(x, y, val, att & (~NO_UNIT));
@@ -370,11 +370,11 @@ void drawSensorCustomValue(coord_t x, coord_t y, uint8_t sensor, int32_t value,
lcdDrawText(x, y, "OK", flags);
}
else {
- for (uint8_t i=0; i<16; i++) {
- if (value & (1 << i)) {
+ for (uint8_t i = 0; i < 16; i++) {
+ if (value & (1u << i)) {
char s[] = "CH__ KO";
- strAppendUnsigned(&s[2], i+1, 2);
- lcdDrawText(x, flags & DBLSIZE ? y+1 : y, s, flags & ~DBLSIZE);
+ strAppendUnsigned(&s[2], i + 1, 2);
+ lcdDrawText(x, flags & DBLSIZE ? y + 1 : y, s, flags & ~DBLSIZE);
break;
}
}
@@ -382,7 +382,7 @@ void drawSensorCustomValue(coord_t x, coord_t y, uint8_t sensor, int32_t value,
}
else {
if (value == 0) {
- lcdDrawText(x, flags & DBLSIZE ? y+1 : y, "Rx OK", flags & ~DBLSIZE);
+ lcdDrawText(x, flags & DBLSIZE ? y + 1 : y, "Rx OK", flags & ~DBLSIZE);
}
else {
static const char * const RXS_STATUS[] = {
@@ -398,23 +398,47 @@ void drawSensorCustomValue(coord_t x, coord_t y, uint8_t sensor, int32_t value,
"Rx1 NS",
"Rx2 NS",
};
- for (uint8_t i=0; i= RB3040_OUTPUT_FIRST_ID && telemetrySensor.id <= RB3040_OUTPUT_LAST_ID) {
+ if (telemetrySensor.subId == 0) {
+ if (value == 0) {
+ lcdDrawText(x, y, "OK", flags);
+ }
+ else {
+ for (uint8_t i = 0; i < 9; i++) {
+ if (value & (1u << i)) {
+ if (i < 8) {
+ char s[] = "CH__ KO";
+ strAppendUnsigned(&s[2], i + 17, 2);
+ lcdDrawText(x, flags & DBLSIZE ? y + 1 : y, s, flags & ~DBLSIZE);
+ break;
+ }
+ else {
+ char s[] = "S.P Ovl";
+ lcdDrawText(x, flags & DBLSIZE ? y + 1 : y, s, flags & ~DBLSIZE);
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
}
}
else if (telemetrySensor.unit == UNIT_TEXT) {
- lcdDrawSizedText(x, flags & DBLSIZE ? y+1 : y, telemetryItem.text, sizeof(telemetryItem.text), flags & ~DBLSIZE);
+ lcdDrawSizedText(x, flags & DBLSIZE ? y + 1 : y, telemetryItem.text, sizeof(telemetryItem.text), flags & ~DBLSIZE);
}
else {
if (telemetrySensor.prec > 0) {
- flags |= (telemetrySensor.prec==1 ? PREC1 : PREC2);
+ flags |= (telemetrySensor.prec == 1 ? PREC1 : PREC2);
}
drawValueWithUnit(x, y, value, telemetrySensor.unit == UNIT_CELLS ? UNIT_VOLTS : telemetrySensor.unit, flags);
}
diff --git a/radio/src/gui/common/stdlcd/draw_functions.h b/radio/src/gui/common/stdlcd/draw_functions.h
index acf4a949f..7755206e3 100644
--- a/radio/src/gui/common/stdlcd/draw_functions.h
+++ b/radio/src/gui/common/stdlcd/draw_functions.h
@@ -25,7 +25,7 @@
void lcdDrawMultiProtocolString(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t protocol, LcdFlags flags = 0);
void lcdDrawMultiSubProtocolString(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t subType, LcdFlags flags = 0);
void drawStringWithIndex(coord_t x, coord_t y, const char * str, uint8_t idx, LcdFlags att=0);
-void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att=0);
+void drawValueWithUnit(coord_t x, coord_t y, int32_t val, uint8_t unit, LcdFlags att=0);
void drawPower(coord_t x, coord_t y, int8_t dBm, LcdFlags att = 0);
void drawGVarName(coord_t x, coord_t y, int8_t index, LcdFlags flags=0);
diff --git a/radio/src/gui/common/stdlcd/model_receiver_options.cpp b/radio/src/gui/common/stdlcd/model_receiver_options.cpp
index ed4dbcd48..6ce66ee29 100644
--- a/radio/src/gui/common/stdlcd/model_receiver_options.cpp
+++ b/radio/src/gui/common/stdlcd/model_receiver_options.cpp
@@ -46,14 +46,18 @@ void onRxOptionsUpdateConfirm(const char * result)
enum {
ITEM_RECEIVER_SETTINGS_PWM_RATE,
ITEM_RECEIVER_SETTINGS_TELEMETRY,
+ ITEM_RECEIVER_SETTINGS_TELEMETRY_25MW,
ITEM_RECEIVER_SETTINGS_SPORT_FPORT,
ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED1,
ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED2,
ITEM_RECEIVER_SETTINGS_PINMAP_FIRST
};
+#define IS_RECEIVER_CAPABILITY_ENABLED(capability) (reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilities & (1 << capability))
+#define IF_RECEIVER_CAPABILITY(capability, count) uint8_t(IS_RECEIVER_CAPABILITY_ENABLED(capability) ? count : HIDDEN_ROW)
-#define IF_RECEIVER_CAPABILITY(capability, count) uint8_t((reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilities & (1 << capability)) ? count : HIDDEN_ROW)
+#define CH_ENABLE_SPORT 4
+#define CH_ENABLE_SBUS 5
void menuModelReceiverOptions(event_t event)
{
@@ -76,6 +80,7 @@ void menuModelReceiverOptions(event_t event)
SUBMENU_NOTITLE(ITEM_RECEIVER_SETTINGS_PINMAP_FIRST + outputsCount, {
0, // PWM rate
isModuleR9MAccess(g_moduleIdx) && receiverVariant == PXX2_VARIANT_EU && reusableBuffer.hardwareAndSettings.moduleSettings.txPower > 14 /*25mW*/ ? READONLY_ROW : (uint8_t)0, // Telemetry
+ IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_TELEMETRY_25MW, 0),
IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_FPORT, 0),
uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW),
uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW),
@@ -139,7 +144,7 @@ void menuModelReceiverOptions(event_t event)
switch (i) {
case ITEM_RECEIVER_SETTINGS_PWM_RATE:
- reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, isModuleR9MAccess(g_moduleIdx) ? "6.67ms PWM": "9ms PWM", attr, event);
+ reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, isModuleR9MAccess(g_moduleIdx) ? "6.67ms PWM": "7ms PWM", attr, event);
if (attr && checkIncDec_Ret) {
reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY;
}
@@ -152,6 +157,13 @@ void menuModelReceiverOptions(event_t event)
}
break;
+ case ITEM_RECEIVER_SETTINGS_TELEMETRY_25MW:
+ reusableBuffer.hardwareAndSettings.receiverSettings.telemetry25mw = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.telemetry25mw, RECEIVER_OPTIONS_2ND_COLUMN, y, "25mw Tele", attr, event);
+ if (attr && checkIncDec_Ret) {
+ reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY;
+ }
+ break;
+
case ITEM_RECEIVER_SETTINGS_SPORT_FPORT:
reusableBuffer.hardwareAndSettings.receiverSettings.fport = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.fport, RECEIVER_OPTIONS_2ND_COLUMN, y, "F.Port", attr, event);
if (attr && checkIncDec_Ret) {
@@ -174,27 +186,49 @@ void menuModelReceiverOptions(event_t event)
if (pin < reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount) {
uint8_t & mapping = reusableBuffer.hardwareAndSettings.receiverSettings.outputsMapping[pin];
uint8_t channel = g_model.moduleData[g_moduleIdx].channelsStart + mapping;
- int32_t channelValue = channelOutputs[channel];
lcdDrawText(0, y, STR_PIN);
lcdDrawNumber(lcdLastRightPos + 1, y, pin + 1);
- putsChn(7 * FW, y, channel + 1, attr);
+
+ uint8_t channelMax = sentModuleChannels(g_moduleIdx) - 1;
+ uint8_t selectionMax = channelMax;
+
+ if (IS_RECEIVER_CAPABILITY_ENABLED(RECEIVER_CAPABILITY_ENABLE_PWM_CH5_CH6)) {
+ if (CH_ENABLE_SPORT == pin || CH_ENABLE_SBUS == pin)
+ selectionMax += 1;
+
+ if (CH_ENABLE_SPORT == pin && selectionMax == channel) {
+ lcdDrawText(7 * FW, y, "S.PORT", attr);
+ }
+ else if (CH_ENABLE_SBUS == pin && selectionMax == channel) {
+ lcdDrawText(7 * FW, y, "SBUS", attr);
+ }
+ else {
+ putsChn(7 * FW, y, channel + 1, attr);
+ }
+ }
+ else {
+ putsChn(7 * FW, y, channel + 1, attr);
+ }
// Channel
if (attr) {
- mapping = checkIncDec(event, mapping, 0, sentModuleChannels(g_moduleIdx) - 1);
+ mapping = checkIncDec(event, mapping, 0, selectionMax);
if (checkIncDec_Ret) {
reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY;
}
}
// Bargraph
-#if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines
- lcdDrawRect(RECEIVER_OPTIONS_2ND_COLUMN, y + 2, wbar + 1, 4);
-#endif
- const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2);
- const coord_t xChannel = (channelValue > 0) ? RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 : RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 + 1 - lenChannel;
- lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0);
- lcdDrawHorizontalLine(xChannel, y + 4, lenChannel, SOLID, 0);
+ if (channel <= channelMax) {
+ int32_t channelValue = channelOutputs[channel];
+ #if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines
+ lcdDrawRect(RECEIVER_OPTIONS_2ND_COLUMN, y + 2, wbar + 1, 4);
+ #endif
+ auto lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2);
+ auto xChannel = (channelValue > 0) ? RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 : RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 + 1 - lenChannel;
+ lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0);
+ lcdDrawHorizontalLine(xChannel, y + 4, lenChannel, SOLID, 0);
+ }
}
break;
}
diff --git a/radio/src/gui/common/stdlcd/popups.cpp b/radio/src/gui/common/stdlcd/popups.cpp
index 6c86dff68..5725d0ad0 100644
--- a/radio/src/gui/common/stdlcd/popups.cpp
+++ b/radio/src/gui/common/stdlcd/popups.cpp
@@ -227,7 +227,7 @@ void showAlertBox(const char * title, const char * text, const char * action , u
lcdRefresh();
lcdSetContrast();
waitKeysReleased();
- backlightOn();
+ resetBacklightTimeout();
checkBacklight();
}
diff --git a/radio/src/gui/common/stdlcd/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp
index e450e1624..dde563d6a 100644
--- a/radio/src/gui/common/stdlcd/radio_hardware.cpp
+++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp
@@ -624,22 +624,23 @@ void menuRadioHardware(event_t event)
break;
case ITEM_RADIO_HARDWARE_RAS:
-#if defined(PCBX9LITE) && !defined(PCBX9LITES)
- lcdDrawTextAlignedLeft(y, "Ext. RAS");
- lcdNextPos = HW_SETTINGS_COLUMN2;
-#else
+#if defined(HARDWARE_INTERNAL_RAS)
lcdDrawTextAlignedLeft(y, "RAS");
if (telemetryData.swrInternal.isFresh())
lcdDrawNumber(HW_SETTINGS_COLUMN2, y, telemetryData.swrInternal.value());
else
lcdDrawText(HW_SETTINGS_COLUMN2, y, "---");
lcdDrawText(lcdNextPos, y, "/");
+#else
+ lcdDrawTextAlignedLeft(y, "Ext. RAS");
+ lcdNextPos = HW_SETTINGS_COLUMN2;
#endif
if (telemetryData.swrExternal.isFresh())
lcdDrawNumber(lcdNextPos, y, telemetryData.swrExternal.value());
else
lcdDrawText(lcdNextPos, y, "---");
break;
+
#if defined(SPORT_UPDATE_PWR_GPIO)
case ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER:
g_eeGeneral.sportUpdatePower = editChoice(HW_SETTINGS_COLUMN2, y, STR_SPORT_UPDATE_POWER_MODE, STR_SPORT_UPDATE_POWER_MODES, g_eeGeneral.sportUpdatePower, 0, 1, attr, event);
diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp
index fe387f307..d6def8115 100644
--- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp
+++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp
@@ -94,12 +94,12 @@ void onSdFormatConfirm(const char * result)
void onUpdateConfirmation(const char * result)
{
if (result == STR_OK) {
- OtaUpdateInformation * destination = moduleState[EXTERNAL_MODULE].otaUpdateInformation;
- Pxx2OtaUpdate otaUpdate(EXTERNAL_MODULE, destination->candidateReceiversNames[destination->selectedReceiverIndex]);
+ OtaUpdateInformation * destination = moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].otaUpdateInformation;
+ Pxx2OtaUpdate otaUpdate(reusableBuffer.sdManager.otaUpdateInformation.module, destination->candidateReceiversNames[destination->selectedReceiverIndex]);
otaUpdate.flashFirmware(destination->filename);
}
else {
- moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL;
+ moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL;
}
}
@@ -121,13 +121,13 @@ void onUpdateStateChanged()
else {
POPUP_WARNING(STR_OTA_UPDATE_ERROR);
SET_WARNING_INFO(STR_UNSUPPORTED_RX, sizeof(TR_UNSUPPORTED_RX) - 1, 0);
- moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL;
+ moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL;
}
}
else {
POPUP_WARNING(STR_OTA_UPDATE_ERROR);
SET_WARNING_INFO(STR_UNKNOWN_RX, sizeof(TR_UNKNOWN_RX) - 1, 0);
- moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL;
+ moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL;
}
}
}
@@ -246,10 +246,11 @@ void onSdManagerMenu(const char * result)
}
#endif
#if defined(PXX2)
- else if (result == STR_FLASH_RECEIVER_OTA) {
+ else if (result == STR_FLASH_RECEIVER_OTA_BY_INTERNAL || result == STR_FLASH_RECEIVER_OTA_BY_EXTERNAL) {
memclear(&reusableBuffer.sdManager.otaUpdateInformation, sizeof(OtaUpdateInformation));
getSelectionFullPath(reusableBuffer.sdManager.otaUpdateInformation.filename);
- moduleState[EXTERNAL_MODULE].startBind(&reusableBuffer.sdManager.otaUpdateInformation, onUpdateStateChanged);
+ reusableBuffer.sdManager.otaUpdateInformation.module = result == STR_FLASH_RECEIVER_OTA_BY_INTERNAL ? INTERNAL_MODULE : EXTERNAL_MODULE;
+ moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].startBind(&reusableBuffer.sdManager.otaUpdateInformation, onUpdateStateChanged);
}
#endif
#endif
@@ -274,7 +275,7 @@ void onUpdateReceiverSelection(const char * result)
}
else {
// the user pressed [Exit]
- moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL;
+ moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL;
}
}
#endif
@@ -285,12 +286,14 @@ void menuRadioSdManager(event_t _event)
int lastPos = menuVerticalPosition;
#endif
- if (moduleState[EXTERNAL_MODULE].mode == MODULE_MODE_BIND && EVT_KEY_MASK(_event) == KEY_EXIT) {
- moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL;
+#if defined(PXX2)
+ if (EVT_KEY_MASK(_event) == KEY_EXIT && moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND) {
+ moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL;
CLEAR_POPUP();
killEvents(KEY_EXIT);
_event = 0;
}
+#endif
event_t event = (EVT_KEY_MASK(_event) == KEY_ENTER ? 0 : _event);
SIMPLE_MENU(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, menuTabGeneral, MENU_RADIO_SD_MANAGER, HEADER_LINE + reusableBuffer.sdManager.count);
@@ -298,13 +301,13 @@ void menuRadioSdManager(event_t _event)
switch (_event) {
case EVT_ENTRY:
f_chdir(ROOT_PATH);
- REFRESH_FILES();
#if LCD_DEPTH > 1
lastPos = -1;
#endif
- break;
+ // no break
case EVT_ENTRY_UP:
+ memclear(&reusableBuffer.sdManager, sizeof(reusableBuffer.sdManager));
REFRESH_FILES();
break;
@@ -417,8 +420,12 @@ void menuRadioSdManager(event_t _event)
POPUP_MENU_ADD_ITEM(STR_FLASH_EXTERNAL_MODULE);
}
#if defined(PXX2)
- if (information.productFamily == FIRMWARE_FAMILY_RECEIVER)
- POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA);
+ if (information.productFamily == FIRMWARE_FAMILY_RECEIVER) {
+ if (isReceiverOTAEnabledFromModule(INTERNAL_MODULE, information.productId))
+ POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA_BY_INTERNAL);
+ if (isReceiverOTAEnabledFromModule(EXTERNAL_MODULE, information.productId))
+ POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA_BY_EXTERNAL);
+ }
#endif
#if defined(BLUETOOTH)
if (information.productFamily == FIRMWARE_FAMILY_BLUETOOTH_CHIP)
@@ -564,10 +571,10 @@ void menuRadioSdManager(event_t _event)
}
#if defined(PXX2)
- if (moduleState[EXTERNAL_MODULE].mode == MODULE_MODE_BIND) {
+ if (moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND) {
if (reusableBuffer.sdManager.otaUpdateInformation.step == BIND_INIT) {
if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount > 0) {
- if(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount != popupMenuItemsCount) {
+ if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount != popupMenuItemsCount) {
CLEAR_POPUP();
popupMenuItemsCount = min(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount,PXX2_MAX_RECEIVERS_PER_MODULE);
for (auto rx = 0; rx < popupMenuItemsCount; rx++) {
diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp
index a849dfd7a..045357b64 100644
--- a/radio/src/gui/gui_common.cpp
+++ b/radio/src/gui/gui_common.cpp
@@ -832,6 +832,7 @@ uint8_t convertMultiProtocol(uint8_t moduleIdx, uint8_t type)
const char STR_SUBTYPE_FLYSKY[] = "\004""Std\0""V9x9""V6x6""V912""CX20";
const char STR_SUBTYPE_HUBSAN[] = "\004""H107""H301""H501";
const char STR_SUBTYPE_FRSKY[] = "\007""D16\0 ""D8\0 ""D16 8ch""V8\0 ""LBT(EU)""LBT 8ch";
+const char STR_SUBTYPE_FRSKYX2[] = "\007""D16\0 ""D16 8ch""LBT(EU)""LBT 8ch";
const char STR_SUBTYPE_HISKY[] = "\005""Std\0 ""HK310";
const char STR_SUBTYPE_V2X2[] = "\006""Std\0 ""JXD506";
const char STR_SUBTYPE_DSM[] = "\006""2 22ms""2 11ms""X 22ms""X 11ms";
@@ -923,6 +924,7 @@ const mm_protocol_definition multi_protocols[] = {
{MODULE_SUBTYPE_MULTI_ESKY150, 1, false, false, STR_SUBTYPE_ESKY150, nullptr},
{MODULE_SUBTYPE_MULTI_FX816, 0, false, false, STR_SUBTYPE_FX816, nullptr},
{MODULE_SUBTYPE_MULTI_HOTT, 0, true, false, NO_SUBTYPE, STR_MULTI_RFTUNE},
+ {MODULE_SUBTYPE_MULTI_FRSKYX2, 3, true, false, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE},
{MM_RF_CUSTOM_SELECTED, 7, true, true, NO_SUBTYPE, STR_MULTI_OPTION},
// Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff)
diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h
index ccbf535eb..55233ea17 100644
--- a/radio/src/gui/gui_common.h
+++ b/radio/src/gui/gui_common.h
@@ -251,8 +251,10 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx)
}
#define MULTIMODULE_MODULE_ROWS(moduleIdx) MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTI_DISABLE_CHAN_MAP_ROW(moduleIdx), // AUTOBIND, DISABLE TELEM, DISABLE CN.MAP
+#define MULTIMODULE_TYPE_ROW(moduleIdx) isModuleMultimodule(moduleIdx) ? MULTIMODULE_RFPROTO_COLUMNS(moduleIdx) : HIDDEN_ROW,
#define MULTIMODULE_STATUS_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? TITLE_ROW : HIDDEN_ROW, (isModuleMultimodule(moduleIdx) && getMultiSyncStatus(moduleIdx).isValid()) ? TITLE_ROW : HIDDEN_ROW,
#define MULTIMODULE_MODE_ROWS(moduleIdx) (g_model.moduleData[moduleIdx].multi.customProto) ? (uint8_t) 3 : MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t)2 : (uint8_t)1
+#define MULTIMODULE_TYPE_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW,
#define MULTIMODULE_SUBTYPE_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? MULTIMODULE_RFPROTO_COLUMNS(moduleIdx) : HIDDEN_ROW,
#define MULTIMODULE_OPTIONS_ROW(moduleIdx) (isModuleMultimodule(moduleIdx) && MULTIMODULE_HASOPTIONS(moduleIdx)) ? (uint8_t) 0: HIDDEN_ROW
#define MODULE_POWER_ROW(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) || isModuleR9MNonAccess(moduleIdx)) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW
diff --git a/radio/src/io/frsky_firmware_update.cpp b/radio/src/io/frsky_firmware_update.cpp
index 7cc7135b4..2d9a62d5e 100644
--- a/radio/src/io/frsky_firmware_update.cpp
+++ b/radio/src/io/frsky_firmware_update.cpp
@@ -313,12 +313,12 @@ const char * FrskyDeviceFirmwareUpdate::doFlashFirmware(const char * filename)
}
else {
#if defined(PCBHORUS)
- information.productId = FIRMWARE_ID_XJT;
+ information.productId = FIRMWARE_ID_MODULE_XJT;
#endif
}
#if defined(PCBHORUS)
- if (module == INTERNAL_MODULE && information.productId == FIRMWARE_ID_XJT) {
+ if (module == INTERNAL_MODULE && information.productId == FIRMWARE_ID_MODULE_XJT) {
INTERNAL_MODULE_ON();
RTOS_WAIT_MS(1);
intmoduleSerialStart(38400, true, USART_Parity_No, USART_StopBits_1, USART_WordLength_8b);
diff --git a/radio/src/io/frsky_firmware_update.h b/radio/src/io/frsky_firmware_update.h
index a229edb27..4690e0215 100644
--- a/radio/src/io/frsky_firmware_update.h
+++ b/radio/src/io/frsky_firmware_update.h
@@ -24,6 +24,7 @@
#include "dataconstants.h"
#include "definitions.h"
#include "frsky_pxx2.h"
+#include "pulses/modules_helpers.h"
#include "ff.h"
enum FrskyFirmwareProductFamily {
@@ -35,12 +36,65 @@ enum FrskyFirmwareProductFamily {
FIRMWARE_FAMILY_POWER_MANAGEMENT_UNIT,
};
-enum FrskyFirmwareProductId {
- FIRMWARE_ID_NONE,
- FIRMWARE_ID_XJT = 0x01,
- FIRMWARE_ID_ISRM = 0x02,
+enum FrskyFirmwareModuleProductId {
+ FIRMWARE_ID_MODULE_NONE,
+ FIRMWARE_ID_MODULE_XJT = 0x01,
+ FIRMWARE_ID_MODULE_ISRM = 0x02,
};
+enum FrskyFirmwareReceiverProductId {
+ FIRMWARE_ID_RECEIVER_NONE,
+ FIRMWARE_ID_RECEIVER_X8R = 0x01,
+ FIRMWARE_ID_RECEIVER_RX8R = 0x02,
+ FIRMWARE_ID_RECEIVER_RX8R_PRO = 0x03,
+ FIRMWARE_ID_RECEIVER_RX6R = 0x04,
+ FIRMWARE_ID_RECEIVER_RX4R = 0x05,
+ FIRMWARE_ID_RECEIVER_G_RX8 = 0x06,
+ FIRMWARE_ID_RECEIVER_G_RX6 = 0x07,
+ FIRMWARE_ID_RECEIVER_X6R = 0x08,
+ FIRMWARE_ID_RECEIVER_X4R = 0x09,
+ FIRMWARE_ID_RECEIVER_X4R_SB = 0x0A,
+ FIRMWARE_ID_RECEIVER_XSR = 0x0B,
+ FIRMWARE_ID_RECEIVER_XSR_M = 0x0C,
+ FIRMWARE_ID_RECEIVER_RXSR = 0x0D,
+ FIRMWARE_ID_RECEIVER_S6R = 0x0E,
+ FIRMWARE_ID_RECEIVER_S8R = 0x0F,
+ FIRMWARE_ID_RECEIVER_XM = 0x10,
+ FIRMWARE_ID_RECEIVER_XMP = 0x11,
+ FIRMWARE_ID_RECEIVER_XMR = 0x12,
+ FIRMWARE_ID_RECEIVER_R9 = 0x13,
+ FIRMWARE_ID_RECEIVER_R9_SLIM = 0x14,
+ FIRMWARE_ID_RECEIVER_R9_SLIMP = 0x15,
+ FIRMWARE_ID_RECEIVER_R9_MINI = 0x16,
+ FIRMWARE_ID_RECEIVER_R9_MM = 0x17,
+ FIRMWARE_ID_RECEIVER_R9_STAB = 0x18, // R9_STAB has OTA
+ FIRMWARE_ID_RECEIVER_R9_MINI_OTA = 0x19, // this one has OTA (different bootloader)
+ FIRMWARE_ID_RECEIVER_R9_MM_OTA = 0x1A, // this one has OTA (different bootloader)
+ FIRMWARE_ID_RECEIVER_R9_SLIMP_OTA = 0x1B, // this one has OTA (different bootloader)
+ FIRMWARE_ID_RECEIVER_ARCHER_X = 0x1C, // this one has OTA (internal module)
+ FIRMWARE_ID_RECEIVER_R9MX = 0x1D, // this one has OTA
+ FIRMWARE_ID_RECEIVER_R9SX = 0x1E, // this one has OTA
+};
+
+inline bool isReceiverOTAEnabledFromModule(uint8_t moduleIdx, uint8_t productId)
+{
+ switch (productId) {
+ case FIRMWARE_ID_RECEIVER_ARCHER_X:
+ return isModuleISRM(moduleIdx);
+
+ case FIRMWARE_ID_RECEIVER_R9_STAB:
+ case FIRMWARE_ID_RECEIVER_R9_MINI_OTA:
+ case FIRMWARE_ID_RECEIVER_R9_MM_OTA:
+ case FIRMWARE_ID_RECEIVER_R9_SLIMP_OTA:
+ case FIRMWARE_ID_RECEIVER_R9MX:
+ case FIRMWARE_ID_RECEIVER_R9SX:
+ return isModuleR9M(moduleIdx);
+
+ default:
+ return false;
+ }
+}
+
PACK(struct FrSkyFirmwareInformation {
uint32_t fourcc;
uint8_t headerVersion;
@@ -69,7 +123,7 @@ class FrskyDeviceFirmwareUpdate {
};
public:
- FrskyDeviceFirmwareUpdate(ModuleIndex module):
+ explicit FrskyDeviceFirmwareUpdate(ModuleIndex module):
module(module) {
}
diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp
index 30a03355e..214e2f4e1 100644
--- a/radio/src/lua/api_general.cpp
+++ b/radio/src/lua/api_general.cpp
@@ -1751,7 +1751,7 @@ const luaR_value_entry opentxConstants[] = {
{ "EVT_VIRTUAL_INC_REPT", EVT_KEY_REPT(KEY_UP) },
#endif
-#if defined(NAVIGATION_9X) || defined(NAVIGATION_XLITE)
+#if defined(NAVIGATION_9X)
{ "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_LONG(KEY_LEFT) },
{ "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_LEFT) },
{ "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_RIGHT) },
@@ -1759,6 +1759,14 @@ const luaR_value_entry opentxConstants[] = {
{ "EVT_VIRTUAL_ENTER", EVT_KEY_BREAK(KEY_ENTER) },
{ "EVT_VIRTUAL_ENTER_LONG", EVT_KEY_LONG(KEY_ENTER) },
{ "EVT_VIRTUAL_EXIT", EVT_KEY_BREAK(KEY_EXIT) },
+#elif defined(NAVIGATION_XLITE)
+ { "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_LONG(KEY_LEFT) },
+ { "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_LONG(KEY_RIGHT) },
+ { "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_SHIFT) },
+ { "EVT_VIRTUAL_MENU_LONG", EVT_KEY_LONG(KEY_SHIFT) },
+ { "EVT_VIRTUAL_ENTER", EVT_KEY_BREAK(KEY_ENTER) },
+ { "EVT_VIRTUAL_ENTER_LONG", EVT_KEY_LONG(KEY_ENTER) },
+ { "EVT_VIRTUAL_EXIT", EVT_KEY_BREAK(KEY_EXIT) },
#elif defined(NAVIGATION_X7) || defined(NAVIGATION_X9D)
{ "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_LONG(KEY_PAGE) },
{ "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_PAGE) },
diff --git a/radio/src/lua/api_lcd.cpp b/radio/src/lua/api_lcd.cpp
index 3c2b32638..bb9172e32 100644
--- a/radio/src/lua/api_lcd.cpp
+++ b/radio/src/lua/api_lcd.cpp
@@ -62,6 +62,20 @@ static int luaLcdClear(lua_State *L)
return 0;
}
+/*luadoc
+@function lcd.resetBacklightTimeout()
+
+Reset the backlight timeout
+
+@status current Introduced in 2.3.6
+*/
+static int luaLcdResetBacklightTimeout(lua_State * L)
+{
+ if (!luaLcdAllowed) return 0;
+ resetBacklightTimeout();
+ return 0;
+}
+
/*luadoc
@function lcd.drawPoint(x, y)
@@ -861,6 +875,7 @@ static int luaRGB(lua_State *L)
const luaL_Reg lcdLib[] = {
{ "refresh", luaLcdRefresh },
{ "clear", luaLcdClear },
+ { "resetBacklightTimeout", luaLcdResetBacklightTimeout },
{ "drawPoint", luaLcdDrawPoint },
{ "drawLine", luaLcdDrawLine },
{ "drawRectangle", luaLcdDrawRectangle },
diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp
index e4b701c9c..a8100da22 100644
--- a/radio/src/mixer.cpp
+++ b/radio/src/mixer.cpp
@@ -460,7 +460,7 @@ void evalInputs(uint8_t mode)
if (mode == e_perout_mode_normal) {
if (tmp==0 || (tmp==1 && (bpanaCenter & mask))) {
anaCenter |= mask;
- if ((g_model.beepANACenter & mask) && !(bpanaCenter & mask) && !menuCalibrationState) {
+ if ((g_model.beepANACenter & mask) && !(bpanaCenter & mask) && s_mixer_first_run_done && !menuCalibrationState) {
if (!IS_POT(i) || IS_POT_SLIDER_AVAILABLE(i)) {
AUDIO_POT_MIDDLE(i);
}
diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp
index e6a20db0b..ea70e0b7b 100644
--- a/radio/src/opentx.cpp
+++ b/radio/src/opentx.cpp
@@ -687,7 +687,7 @@ void checkBacklight()
if (inputsMoved()) {
inactivity.counter = 0;
if (g_eeGeneral.backlightMode & e_backlight_mode_sticks) {
- backlightOn();
+ resetBacklightTimeout();
}
}
@@ -700,7 +700,7 @@ void checkBacklight()
}
}
-void backlightOn()
+void resetBacklightTimeout()
{
lightOffCounter = ((uint16_t)g_eeGeneral.lightAutoOff*250) << 1;
}
@@ -727,7 +727,7 @@ void doSplash()
#endif
if (SPLASH_NEEDED()) {
- backlightOn();
+ resetBacklightTimeout();
drawSplash();
#if defined(PCBSKY9X)
@@ -1977,7 +1977,7 @@ void opentxInit()
if (g_eeGeneral.backlightMode != e_backlight_mode_off) {
// on Tx start turn the light on
- backlightOn();
+ resetBacklightTimeout();
}
if (!globalData.unexpectedShutdown) {
@@ -1995,7 +1995,7 @@ void opentxInit()
lcdSetContrast();
#endif
- backlightOn();
+ resetBacklightTimeout();
startPulses();
diff --git a/radio/src/opentx.h b/radio/src/opentx.h
index c96d94e1e..cd9ac3a58 100644
--- a/radio/src/opentx.h
+++ b/radio/src/opentx.h
@@ -255,17 +255,6 @@
#include "myeeprom.h"
-inline void memclear(void * p, size_t size)
-{
- memset(p, 0, size);
-}
-
-inline bool is_memclear(void * p, size_t size)
-{
- uint8_t * buf = (uint8_t *)p;
- return buf[0] == 0 && memcmp(buf, buf + 1, size - 1) == 0;
-}
-
void memswap(void * a, void * b, uint8_t size);
#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBHORUS)
@@ -646,7 +635,7 @@ static inline void GET_ADC_IF_MIXER_NOT_RUNNING()
#include "sbus.h"
-void backlightOn();
+void resetBacklightTimeout();
void checkBacklight();
#define BITMASK(bit) (1<<(bit))
diff --git a/radio/src/opentx_helpers.h b/radio/src/opentx_helpers.h
index 8ddeba85e..866fdfb98 100644
--- a/radio/src/opentx_helpers.h
+++ b/radio/src/opentx_helpers.h
@@ -21,10 +21,23 @@
#ifndef _OPENTX_HELPERS_H_
#define _OPENTX_HELPERS_H_
+#include
+
template inline t min(t a, t b) { return a inline t max(t a, t b) { return a>b?a:b; }
template inline t sgn(t a) { return a>0 ? 1 : (a < 0 ? -1 : 0); }
template inline t limit(t mi, t x, t ma) { return min(max(mi,x),ma); }
template inline void SWAP(t & a, t & b) { t tmp = b; b = a; a = tmp; }
+inline void memclear(void * p, size_t size)
+{
+ memset(p, 0, size);
+}
+
+inline bool is_memclear(void * p, size_t size)
+{
+ uint8_t * buf = (uint8_t *)p;
+ return buf[0] == 0 && memcmp(buf, buf + 1, size - 1) == 0;
+}
+
#endif // _OPENTX_HELPERS_H_
diff --git a/radio/src/pulses/modules_constants.h b/radio/src/pulses/modules_constants.h
index ec0f8f819..efbcd1b3d 100644
--- a/radio/src/pulses/modules_constants.h
+++ b/radio/src/pulses/modules_constants.h
@@ -157,7 +157,14 @@ enum ModuleSubtypeMulti {
MODULE_SUBTYPE_MULTI_AFHDS2A_RX,
MODULE_SUBTYPE_MULTI_HOTT,
MODULE_SUBTYPE_MULTI_FX816,
- MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_FX816
+ MODULE_SUBTYPE_MULTI_BAYANG_RX,
+ MODULE_SUBTYPE_MULTI_PELIKAN,
+ MODULE_SUBTYPE_MULTI_TIGER,
+ MODULE_SUBTYPE_MULTI_XK,
+ MODULE_SUBTYPE_MULTI_XN297DUMP,
+ MODULE_SUBTYPE_MULTI_FRSKYX2,
+ MODULE_SUBTYPE_MULTI_FRSKY_R9,
+ MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_FRSKY_R9
};
#define MODULE_SUBTYPE_MULTI_XN297DP 63-3
diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h
index 4d358c36b..a1e3cee65 100644
--- a/radio/src/pulses/modules_helpers.h
+++ b/radio/src/pulses/modules_helpers.h
@@ -25,6 +25,8 @@
#include "definitions.h"
#include "opentx_helpers.h"
#include "telemetry/telemetry.h"
+#include "storage/storage.h"
+
#if defined(MULTIMODULE)
#include "telemetry/multi.h"
#endif
@@ -421,11 +423,6 @@ inline bool isModuleBindRangeAvailable(uint8_t moduleIdx)
return isModulePXX2(moduleIdx) || isModulePXX1(moduleIdx) || isModuleDSM2(moduleIdx) || isModuleMultimodule(moduleIdx);
}
-inline bool isModuleRangeAvailable(uint8_t moduleIdx)
-{
- return isModuleXJTD16(moduleIdx) || isModuleXJTLR12(moduleIdx);
-}
-
constexpr uint8_t MAX_RXNUM = 63;
inline uint8_t getMaxRxNum(uint8_t idx)
diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h
index 7d859c075..e8c3ce8af 100644
--- a/radio/src/pulses/pulses.h
+++ b/radio/src/pulses/pulses.h
@@ -121,8 +121,10 @@ class ReceiverSettings {
uint8_t receiverId;
uint8_t dirty;
uint8_t telemetryDisabled;
+ uint8_t telemetry25mw;
uint8_t pwmRate;
uint8_t fport;
+ uint8_t enablePwmCh5Ch6;
uint8_t outputsCount;
uint8_t outputsMapping[24];
};
@@ -144,6 +146,7 @@ class OtaUpdateInformation: public BindInformation {
public:
char filename[_MAX_LFN + 1];
uint32_t address;
+ uint32_t module;
};
typedef void (* ModuleCallback)();
diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp
index 323dc3c16..944be8a3a 100644
--- a/radio/src/pulses/pxx2.cpp
+++ b/radio/src/pulses/pxx2.cpp
@@ -223,6 +223,10 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module)
flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM;
if (reusableBuffer.hardwareAndSettings.receiverSettings.fport)
flag1 |= PXX2_RX_SETTINGS_FLAG1_FPORT;
+ if (reusableBuffer.hardwareAndSettings.receiverSettings.telemetry25mw)
+ flag1 |= PXX2_RX_SETTINGS_FLAG1_TELEMETRY_25MW;
+ if (reusableBuffer.hardwareAndSettings.receiverSettings.enablePwmCh5Ch6)
+ flag1 |= PXX2_RX_SETTINGS_FLAG1_ENABLE_PWM_CH5_CH6;
Pxx2Transport::addByte(flag1);
uint8_t outputsCount = min(24, reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount);
for (int i = 0; i < outputsCount; i++) {
@@ -355,6 +359,8 @@ void Pxx2Pulses::sendOtaUpdate(uint8_t module, const char * rxName, uint32_t add
if (module == EXTERNAL_MODULE)
extmoduleSendNextFrame();
+ else if (module == INTERNAL_MODULE)
+ intmoduleSendNextFrame();
}
void Pxx2Pulses::setupAuthenticationFrame(uint8_t module, uint8_t mode, const uint8_t * outputMessage)
@@ -464,7 +470,12 @@ const char * Pxx2OtaUpdate::nextStep(uint8_t step, const char * rxName, uint32_t
destination->address = address;
for (uint8_t retry = 0;; retry++) {
- extmodulePulsesData.pxx2.sendOtaUpdate(module, rxName, address, (const char *) buffer);
+ if (module == EXTERNAL_MODULE) {
+ extmodulePulsesData.pxx2.sendOtaUpdate(module, rxName, address, (const char *) buffer);
+ }
+ else if (module == INTERNAL_MODULE) {
+ intmodulePulsesData.pxx2.sendOtaUpdate(module, rxName, address, (const char *) buffer);
+ }
if (waitStep(step + 1, 20)) {
return nullptr;
}
diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h
index c739b6e3d..2fa64dcad 100644
--- a/radio/src/pulses/pxx2.h
+++ b/radio/src/pulses/pxx2.h
@@ -53,6 +53,8 @@
#define PXX2_RX_SETTINGS_FLAG1_READONLY (1 << 6)
#define PXX2_RX_SETTINGS_FLAG1_FASTPWM (1 << 4)
#define PXX2_RX_SETTINGS_FLAG1_FPORT (1 << 3)
+#define PXX2_RX_SETTINGS_FLAG1_TELEMETRY_25MW (1 << 2)
+#define PXX2_RX_SETTINGS_FLAG1_ENABLE_PWM_CH5_CH6 (1 << 1)
#define PXX2_TX_SETTINGS_FLAG0_WRITE (1 << 6)
#define PXX2_TX_SETTINGS_FLAG1_EXTERNAL_ANTENNA (1 << 3)
@@ -81,7 +83,7 @@ enum PXX2ModuleModelID {
PXX2_MODULE_ISRM_S_X10E,
PXX2_MODULE_XJT_LITE,
PXX2_MODULE_ISRM_S_X10S,
- PXX2_MODULE_ISRM_S_X9LITE,
+ PXX2_MODULE_ISRM_X9LITES,
};
static const char * const PXX2ModulesNames[] = {
@@ -98,7 +100,7 @@ static const char * const PXX2ModulesNames[] = {
"ISRM-S-X10E",
"XJT Lite",
"ISRM-S-X10S",
- "ISRM-S-X9Lite"
+ "ISRM-X9LiteS"
};
inline const char * getPXX2ModuleName(uint8_t modelId)
@@ -140,7 +142,7 @@ static const uint8_t PXX2ModuleOptions[] = {
0b00000101, // ISRM-S-X10E
0b00000001, // XJT_LITE
0b00000101, // ISRM-S-X10S
- 0b00000101, // ISRM-S-X9LITE
+ 0b00000100, // ISRM-X9LITES
};
inline uint8_t getPXX2ModuleOptions(uint8_t modelId)
@@ -189,6 +191,9 @@ static const char * const PXX2ReceiversNames[] = {
"R9-MINI-OTA", // this one has OTA (different bootloader)
"R9-MM-OTA", // this one has OTA (different bootloader)
"R9-SLIM+-OTA", // this one has OTA (different bootloader)
+ "Archer-X", // this one has OTA (internal module)
+ "R9MX", // this one has OTA
+ "R9SX", // this one has OTA
};
inline const char * getPXX2ReceiverName(uint8_t modelId)
@@ -239,6 +244,9 @@ static const uint8_t PXX2ReceiverOptions[] = {
0b11111111, // R9-MINI+OTA
0b11111111, // R9-MM+OTA
0b11111111, // R9-SLIM+OTA
+ 0b11111111, // ARCHER-X
+ 0b11111111, // R9MX
+ 0b11111111, // R9SX
};
inline uint8_t getPXX2ReceiverOptions(uint8_t modelId)
@@ -256,6 +264,8 @@ inline bool isPXX2ReceiverOptionAvailable(uint8_t modelId, uint8_t option)
enum ReceiverCapabilities {
RECEIVER_CAPABILITY_FPORT,
+ RECEIVER_CAPABILITY_TELEMETRY_25MW,
+ RECEIVER_CAPABILITY_ENABLE_PWM_CH5_CH6,
RECEIVER_CAPABILITY_COUNT
};
diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp
index 5e57bf280..b706b9891 100644
--- a/radio/src/storage/modelslist.cpp
+++ b/radio/src/storage/modelslist.cpp
@@ -110,7 +110,7 @@ void ModelCell::loadBitmap()
buffer->drawSizedText(5, 2, modelName, LEN_MODEL_NAME, SMLSIZE|TEXT_COLOR);
getTimerString(timer, 0);
for (uint8_t i = 0; i < MAX_TIMERS; i++) {
- if (partialmodel.timers[i].mode > 0 && partialmodel.timers[i].persistent) {
+ if (partialmodel.timers[i].mode != 0 && partialmodel.timers[i].persistent) {
getTimerString(timer, partialmodel.timers[i].value);
break;
}
diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp
index c226e8f7b..d3497dda7 100644
--- a/radio/src/switches.cpp
+++ b/radio/src/switches.cpp
@@ -642,7 +642,7 @@ void checkSwitches()
}
LED_ERROR_BEGIN();
- backlightOn();
+ resetBacklightTimeout();
// first - display warning
#if defined(PCBTARANIS) || defined(PCBHORUS)
diff --git a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp
index 436cb0bd7..debe8793d 100644
--- a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp
+++ b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp
@@ -104,7 +104,7 @@ void rotaryEncoderCheck()
#endif
#if !defined(BOOT)
if (g_eeGeneral.backlightMode & e_backlight_mode_keys) {
- backlightOn();
+ resetBacklightTimeout();
}
inactivity.counter = 0;
#endif
diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h
index cdc8fb084..437346078 100644
--- a/radio/src/targets/horus/board.h
+++ b/radio/src/targets/horus/board.h
@@ -146,6 +146,10 @@ void SDRAM_Init();
// Pulses driver
#define INTERNAL_MODULE_ON() GPIO_SetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN)
+#if defined(INTERNAL_MODULE_PXX1) || defined(INTERNAL_MODULE_PXX2)
+ #define HARDWARE_INTERNAL_RAS
+#endif
+
#if defined(INTMODULE_USART)
#define INTERNAL_MODULE_OFF() intmoduleStop()
#else
diff --git a/radio/src/targets/horus/keys_driver.cpp b/radio/src/targets/horus/keys_driver.cpp
index 888c4dabc..0b02a6a03 100644
--- a/radio/src/targets/horus/keys_driver.cpp
+++ b/radio/src/targets/horus/keys_driver.cpp
@@ -107,7 +107,7 @@ void readKeysAndTrims()
if ((keys_input || trims_input) && (g_eeGeneral.backlightMode & e_backlight_mode_keys)) {
// on keypress turn the light on
- backlightOn();
+ resetBacklightTimeout();
}
}
diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp
index ee4bcdb23..1aadf6e30 100644
--- a/radio/src/targets/simu/simpgmspace.cpp
+++ b/radio/src/targets/simu/simpgmspace.cpp
@@ -501,7 +501,7 @@ void readKeysAndTrims()
}
if (keysInput || trimsInput) {
- backlightOn();
+ resetBacklightTimeout();
}
}
diff --git a/radio/src/targets/sky9x/keys_driver.cpp b/radio/src/targets/sky9x/keys_driver.cpp
index 9f7dac244..f37cb52b5 100644
--- a/radio/src/targets/sky9x/keys_driver.cpp
+++ b/radio/src/targets/sky9x/keys_driver.cpp
@@ -109,7 +109,7 @@ void readKeysAndTrims()
if ((keys_input || trims_input) && (g_eeGeneral.backlightMode & e_backlight_mode_keys)) {
// on keypress turn the light on
- backlightOn();
+ resetBacklightTimeout();
}
}
diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h
index e735c8d33..acba12d76 100644
--- a/radio/src/targets/taranis/board.h
+++ b/radio/src/targets/taranis/board.h
@@ -114,12 +114,16 @@ uint32_t isBootloaderStart(const uint8_t * buffer);
#define INTERNAL_MODULE_OFF() GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN)
#endif
+#if !defined(PCBX9LITE) || defined(PCBX9LITES)
+ #define HARDWARE_INTERNAL_RAS
+#endif
+
#define EXTERNAL_MODULE_ON() EXTERNAL_MODULE_PWR_ON()
#if defined(EXTMODULE_USART)
-#define EXTERNAL_MODULE_OFF() extmoduleStop()
+ #define EXTERNAL_MODULE_OFF() extmoduleStop()
#else
-#define EXTERNAL_MODULE_OFF() EXTERNAL_MODULE_PWR_OFF()
+ #define EXTERNAL_MODULE_OFF() EXTERNAL_MODULE_PWR_OFF()
#endif
#if defined(RADIO_T12)
diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp
index ab0a6202d..0699a1c50 100644
--- a/radio/src/targets/taranis/keys_driver.cpp
+++ b/radio/src/targets/taranis/keys_driver.cpp
@@ -130,7 +130,7 @@ void readKeysAndTrims()
if ((keys_input || trims_input) && (g_eeGeneral.backlightMode & e_backlight_mode_keys)) {
#endif
// on keypress turn the light on
- backlightOn();
+ resetBacklightTimeout();
}
}
diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h
index 458a4901f..763da1b32 100644
--- a/radio/src/telemetry/frsky.h
+++ b/radio/src/telemetry/frsky.h
@@ -150,6 +150,16 @@ enum FrSkyDataState {
#define ESC_RPM_CONS_LAST_ID 0x0B6f
#define ESC_TEMPERATURE_FIRST_ID 0x0B70
#define ESC_TEMPERATURE_LAST_ID 0x0B7f
+#define RB3040_OUTPUT_FIRST_ID 0x0B80
+#define RB3040_OUTPUT_LAST_ID 0x0B8F
+#define RB3040_CH1_2_FIRST_ID 0x0B90
+#define RB3040_CH1_2_LAST_ID 0x0B9F
+#define RB3040_CH3_4_FIRST_ID 0x0BA0
+#define RB3040_CH3_4_LAST_ID 0x0BAF
+#define RB3040_CH5_6_FIRST_ID 0x0BB0
+#define RB3040_CH5_6_LAST_ID 0x0BBF
+#define RB3040_CH7_8_FIRST_ID 0x0BC0
+#define RB3040_CH7_8_LAST_ID 0x0BCF
#define X8R_FIRST_ID 0x0c20
#define X8R_LAST_ID 0x0c2F
#define S6R_FIRST_ID 0x0c30
@@ -177,6 +187,7 @@ enum FrSkyDataState {
#define DIY_STREAM_FIRST_ID 0x5000
#define DIY_STREAM_LAST_ID 0x50FF
#define FACT_TEST_ID 0xF000
+#define FRAME_LOSS_RATE_ID 0xF010
#define RSSI_ID 0xF101
#define ADC1_ID 0xF102
#define ADC2_ID 0xF103
@@ -282,10 +293,10 @@ inline bool isRasValueValid()
{
return true;
}
-#elif defined(PCBX9DP) || defined(PCBX9E)
+#elif defined(PCBTARANIS)
inline bool isRasValueValid()
{
- return telemetryData.xjtVersion != 0x0000 && telemetryData.xjtVersion != 0x00FF;
+ return telemetryData.xjtVersion != 0x00FF;
}
#elif defined(PCBHORUS)
inline bool isRasValueValid()
diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp
index 7d596ecc4..8ed11be1c 100644
--- a/radio/src/telemetry/frsky_pxx2.cpp
+++ b/radio/src/telemetry/frsky_pxx2.cpp
@@ -86,6 +86,12 @@ void processReceiverSettingsFrame(uint8_t module, const uint8_t * frame)
if (frame[4] & PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED)
destination->telemetryDisabled = 1;
+ if (frame[4] & PXX2_RX_SETTINGS_FLAG1_TELEMETRY_25MW)
+ destination->telemetry25mw = 1;
+
+ if (frame[4] & PXX2_RX_SETTINGS_FLAG1_ENABLE_PWM_CH5_CH6)
+ destination->enablePwmCh5Ch6 = 1;
+
uint8_t outputsCount = min(16, frame[0] - 4);
destination->outputsCount = outputsCount;
for (uint8_t pin = 0; pin < outputsCount; pin++) {
diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp
index 299553050..ebb90586a 100644
--- a/radio/src/telemetry/frsky_sport.cpp
+++ b/radio/src/telemetry/frsky_sport.cpp
@@ -30,6 +30,7 @@ struct FrSkySportSensor {
};
const FrSkySportSensor sportSensors[] = {
+ { FRAME_LOSS_RATE_ID, FRAME_LOSS_RATE_ID, 0, ZSTR_FLR, UNIT_PERCENT, 0 },
{ RSSI_ID, RSSI_ID, 0, ZSTR_RSSI, UNIT_DB, 0 },
#if defined(MULTIMODULE)
{ TX_RSSI_ID, TX_RSSI_ID, 0, ZSTR_TX_RSSI , UNIT_DB , 0 },
@@ -84,6 +85,15 @@ const FrSkySportSensor sportSensors[] = {
{ GASSUIT_AVG_FLOW_FIRST_ID, GASSUIT_AVG_FLOW_LAST_ID, 0, ZSTR_GASSUIT_AVG_FLOW, UNIT_MILLILITERS_PER_MINUTE, 0 },
{ SBEC_POWER_FIRST_ID, SBEC_POWER_LAST_ID, 0, ZSTR_SBEC_VOLTAGE, UNIT_VOLTS, 2 },
{ SBEC_POWER_FIRST_ID, SBEC_POWER_LAST_ID, 1, ZSTR_SBEC_CURRENT, UNIT_AMPS, 2 },
+ { RB3040_OUTPUT_FIRST_ID, RB3040_OUTPUT_LAST_ID, 0, ZSTR_RB3040_EXTRA_STATE, UNIT_BITFIELD, 0 },
+ { RB3040_CH1_2_FIRST_ID, RB3040_CH1_2_LAST_ID, 0, ZSTR_RB3040_CHANNEL1, UNIT_AMPS, 2 },
+ { RB3040_CH1_2_FIRST_ID, RB3040_CH1_2_LAST_ID, 1, ZSTR_RB3040_CHANNEL2, UNIT_AMPS, 2 },
+ { RB3040_CH3_4_FIRST_ID, RB3040_CH3_4_LAST_ID, 0, ZSTR_RB3040_CHANNEL3, UNIT_AMPS, 2 },
+ { RB3040_CH3_4_FIRST_ID, RB3040_CH3_4_LAST_ID, 1, ZSTR_RB3040_CHANNEL4, UNIT_AMPS, 2 },
+ { RB3040_CH5_6_FIRST_ID, RB3040_CH5_6_LAST_ID, 0, ZSTR_RB3040_CHANNEL5, UNIT_AMPS, 2 },
+ { RB3040_CH5_6_FIRST_ID, RB3040_CH5_6_LAST_ID, 1, ZSTR_RB3040_CHANNEL6, UNIT_AMPS, 2 },
+ { RB3040_CH7_8_FIRST_ID, RB3040_CH7_8_LAST_ID, 0, ZSTR_RB3040_CHANNEL7, UNIT_AMPS, 2 },
+ { RB3040_CH7_8_FIRST_ID, RB3040_CH7_8_LAST_ID, 1, ZSTR_RB3040_CHANNEL8, UNIT_AMPS, 2 },
{ 0, 0, 0, NULL, UNIT_RAW, 0 } // sentinel
};
@@ -167,17 +177,20 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packe
if (primId == DATA_FRAME) {
uint8_t originMask;
+ uint8_t moduleIndex;
if (origin == TELEMETRY_ENDPOINT_SPORT) {
#if defined(SIMU) && defined(INTERNAL_MODULE_PXX2)
// When running simu on ACCESS radio, we set the origin as internal module
+ moduleIndex = 0;
origin = 0;
originMask = 0x01;
#else
+ moduleIndex = isSportLineUsedByInternalModule() ? 0 : 1;
originMask = 0x04;
#endif
}
else {
- uint8_t moduleIndex = (origin >> 2);
+ moduleIndex = (origin >> 2);
originMask = 0x01 << moduleIndex;
}
uint8_t instance = physicalId + (origin << 5);
@@ -216,12 +229,12 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packe
else if (dataId == XJT_VERSION_ID) {
telemetryData.xjtVersion = HUB_DATA_U16(packet);
if (!isRasValueValid()) {
- telemetryData.setSwr(origin >> 2, 0);
+ telemetryData.setSwr(moduleIndex, 0);
}
}
else if (dataId == RAS_ID) {
if (isRasValueValid()) {
- telemetryData.setSwr(origin >> 2, SPORT_DATA_U8(packet));
+ telemetryData.setSwr(moduleIndex, SPORT_DATA_U8(packet));
}
}
@@ -308,6 +321,10 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packe
}
#endif
}
+ else if (dataId >= RB3040_CH1_2_FIRST_ID && dataId <= RB3040_CH7_8_LAST_ID) {
+ sportProcessTelemetryPacket(dataId, 0, instance, data & 0xffff);
+ sportProcessTelemetryPacket(dataId, 1, instance, (data >> 16u) & 0xffff);
+ }
else {
sportProcessTelemetryPacket(dataId, 0, instance, data);
}
diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp
index adc3120cd..738237bfc 100644
--- a/radio/src/telemetry/multi.cpp
+++ b/radio/src/telemetry/multi.cpp
@@ -555,7 +555,7 @@ void MultiModuleStatus::getStatusString(char * statusText) const
return;
}
- if (major <= 1 && minor <= 3 && revision <= 0 && patch <= 47 && SLOW_BLINK_ON_PHASE) {
+ if (major <= 1 && minor <= 3 && revision <= 0 && patch <= 78 && SLOW_BLINK_ON_PHASE) {
strcpy(statusText, STR_MODULE_UPGRADE);
}
else {
diff --git a/radio/src/telemetry/spektrum.cpp b/radio/src/telemetry/spektrum.cpp
index a71d5118b..60c9f2329 100644
--- a/radio/src/telemetry/spektrum.cpp
+++ b/radio/src/telemetry/spektrum.cpp
@@ -24,6 +24,7 @@
/*
* Documentation of the Spektrum protocol is available under
* https://www.spektrumrc.com/ProdInfo/Files/SPM_Telemetry_Developers_Specs.pdf
+ * https://github.com/SpektrumRC/SpektrumDocumentation/blob/master/Telemetry/spektrumTelemetrySensors.h
*
* Multi module adds two byte header of 0xAA [RSSI of telemetry packet] [16 byte message]
*/
@@ -49,7 +50,18 @@
#define I2C_TEXTGEN 0x0c
#define I2C_GPS 0x17
#define I2C_GPS2 0x17
+#define I2C_ESC 0x20
#define I2C_CELLS 0x3a
+
+// SMART_BAT is using fake I2C adresses compared to official Spektrum address because of subtype used only for this I2C address
+#define I2C_SMART_BAT_BASE_ADDRESS 0x42
+#define I2C_SMART_BAT_REALTIME 0x42
+#define I2C_SMART_BAT_CELLS_1_6 0x43
+#define I2C_SMART_BAT_CELLS_7_12 0x44
+#define I2C_SMART_BAT_CELLS_13_18 0x45
+#define I2C_SMART_BAT_ID 0x4A
+#define I2C_SMART_BAT_LIMITS 0x4B
+
#define I2C_QOS 0x7f
enum SpektrumDataType : uint8_t {
@@ -62,6 +74,8 @@ enum SpektrumDataType : uint8_t {
uint8bcd,
uint16bcd,
uint32bcd,
+ uint16le,
+ uint32le,
custom
};
@@ -151,7 +165,16 @@ const SpektrumSensor spektrumSensors[] = {
{0x1b, 2, int16, ZSTR_PITCH, UNIT_DEGREE, 1},
{0x1b, 4, int16, ZSTR_YAW, UNIT_DEGREE, 1},
- // {0x20, esc}, does not exist in the wild?
+ // {0x20, esc}, Smart ESC telemetry
+ {I2C_ESC, 0, uint16, ZSTR_ESC_RPM, UNIT_RPMS, 0},
+ {I2C_ESC, 2, uint16, ZSTR_ESC_VIN, UNIT_VOLTS, 2},
+ {I2C_ESC, 4, uint16, ZSTR_ESC_TFET, UNIT_CELSIUS, 1},
+ {I2C_ESC, 6, uint16, ZSTR_ESC_CUR, UNIT_MAH, 1},
+ {I2C_ESC, 8, uint16, ZSTR_ESC_TBEC, UNIT_CELSIUS, 1},
+ {I2C_ESC, 10, uint8, ZSTR_ESC_BCUR, UNIT_AMPS, 1},
+ {I2C_ESC, 11, uint8, ZSTR_ESC_VBEC, UNIT_VOLTS, 2},
+ {I2C_ESC, 12, uint8, ZSTR_ESC_THR, UNIT_PERCENT, 1},
+ {I2C_ESC, 13, uint8, ZSTR_ESC_POUT, UNIT_PERCENT, 1},
// Dual Cell monitor (0x34)
{0x34, 0, int16, ZSTR_BATT1_CURRENT, UNIT_AMPS, 1},
@@ -178,6 +201,53 @@ const SpektrumSensor spektrumSensors[] = {
{0x40, 0, int16, ZSTR_ALT, UNIT_METERS, 1},
{0x40, 2, int16, ZSTR_VSPD, UNIT_METERS_PER_SECOND, 1},
+ // Smartbat
+ //{I2C_SMART_BAT_REALTIME, 1, int8, ZSTR_SMART_BAT_BTMP, UNIT_CELSIUS, 0}, // disabled because sensor is a duplicate of cells sensors ones
+ {I2C_SMART_BAT_REALTIME, 2, uint32le, ZSTR_SMART_BAT_BCUR, UNIT_MAH, 0},
+ {I2C_SMART_BAT_REALTIME, 6, uint16le, ZSTR_SMART_BAT_BCAP, UNIT_MAH, 0},
+ {I2C_SMART_BAT_REALTIME, 8, uint16le, ZSTR_SMART_BAT_MIN_CEL, UNIT_VOLTS, 2},
+ {I2C_SMART_BAT_REALTIME, 10, uint16le, ZSTR_SMART_BAT_MAX_CEL, UNIT_VOLTS, 2},
+ //{I2C_SMART_BAT_REALTIME, 12, uint16le, "RFU[2]", UNIT_RAW, 0}, // disabled to save sensors slots
+
+ {I2C_SMART_BAT_CELLS_1_6, 1, int8, ZSTR_SMART_BAT_BTMP, UNIT_CELSIUS, 0},
+ {I2C_SMART_BAT_CELLS_1_6, 2, uint16le, ZSTR_CL01, UNIT_VOLTS, 2},
+ {I2C_SMART_BAT_CELLS_1_6, 4, uint16le, ZSTR_CL02, UNIT_VOLTS, 2},
+ {I2C_SMART_BAT_CELLS_1_6, 6, uint16le, ZSTR_CL03, UNIT_VOLTS, 2},
+ {I2C_SMART_BAT_CELLS_1_6, 8, uint16le, ZSTR_CL04, UNIT_VOLTS, 2},
+ {I2C_SMART_BAT_CELLS_1_6, 10, uint16le, ZSTR_CL05, UNIT_VOLTS, 2},
+ {I2C_SMART_BAT_CELLS_1_6, 12, uint16le, ZSTR_CL06, UNIT_VOLTS, 2},
+
+ {I2C_SMART_BAT_CELLS_7_12, 1, int8, ZSTR_SMART_BAT_BTMP, UNIT_CELSIUS, 0},
+ {I2C_SMART_BAT_CELLS_7_12, 2, uint16le, ZSTR_CL07, UNIT_VOLTS, 2},
+ {I2C_SMART_BAT_CELLS_7_12, 4, uint16le, ZSTR_CL08, UNIT_VOLTS, 2},
+ {I2C_SMART_BAT_CELLS_7_12, 6, uint16le, ZSTR_CL09, UNIT_VOLTS, 2},
+ {I2C_SMART_BAT_CELLS_7_12, 8, uint16le, ZSTR_CL10, UNIT_VOLTS, 2},
+ {I2C_SMART_BAT_CELLS_7_12, 10, uint16le, ZSTR_CL11, UNIT_VOLTS, 2},
+ {I2C_SMART_BAT_CELLS_7_12, 12, uint16le, ZSTR_CL12, UNIT_VOLTS, 2},
+
+ {I2C_SMART_BAT_CELLS_13_18, 1, int8, ZSTR_SMART_BAT_BTMP, UNIT_CELSIUS, 0},
+ {I2C_SMART_BAT_CELLS_13_18, 2, uint16le, ZSTR_CL13, UNIT_VOLTS, 2},
+ {I2C_SMART_BAT_CELLS_13_18, 4, uint16le, ZSTR_CL14, UNIT_VOLTS, 2},
+ {I2C_SMART_BAT_CELLS_13_18, 6, uint16le, ZSTR_CL15, UNIT_VOLTS, 2},
+ {I2C_SMART_BAT_CELLS_13_18, 8, uint16le, ZSTR_CL16, UNIT_VOLTS, 2},
+ {I2C_SMART_BAT_CELLS_13_18, 10, uint16le, ZSTR_CL17, UNIT_VOLTS, 2},
+ {I2C_SMART_BAT_CELLS_13_18, 12, uint16le, ZSTR_CL18, UNIT_VOLTS, 2},
+
+ //{I2C_SMART_BAT_ID, 1, uint8, "chemistery", UNIT_RAW, 0}, // disabled to save sensors slots
+ //{I2C_SMART_BAT_ID, 2, uint8, "number of cells", UNIT_RAW, 0}, // disabled to save sensors slots
+ //{I2C_SMART_BAT_ID, 3, uint8, "manufacturer code", UNIT_RAW, 0}, // disabled to save sensors slots
+ {I2C_SMART_BAT_ID, 4, uint16le, ZSTR_SMART_BAT_CYCLES, UNIT_RAW, 0},
+ //{I2C_SMART_BAT_ID, 6, uint8, "uniqueID[8]", UNIT_RAW, 0}, // disabled to save sensors slots
+
+ //{I2C_SMART_BAT_LIMITS, 1, uint8, "rfu", UNIT_RAW, 0}, // disabled to save sensors slots
+ {I2C_SMART_BAT_LIMITS, 2, uint16le, ZSTR_SMART_BAT_CAPACITY,UNIT_MAH, 0},
+ //{I2C_SMART_BAT_LIMITS, 4, uint16le, "dischargeCurrentRating", UNIT_RAW, 0}, // disabled to save sensors slots
+ //{I2C_SMART_BAT_LIMITS, 6, uint16le, "overDischarge_mV", UNIT_RAW, 0}, // disabled to save sensors slots
+ //{I2C_SMART_BAT_LIMITS, 8, uint16le, "zeroCapacity_mV", UNIT_RAW, 0}, // disabled to save sensors slots
+ //{I2C_SMART_BAT_LIMITS, 10, uint16le, "fullyCharged_mV", UNIT_RAW, 0}, // disabled to save sensors slots
+ //{I2C_SMART_BAT_LIMITS, 12, uint8, "minWorkingTemp", UNIT_RAW, 0}, // disabled to save sensors slots
+ //{I2C_SMART_BAT_LIMITS, 13, uint8, "maxWorkingTemp", UNIT_RAW, 0}, // disabled to save sensors slots
+
// 0x50-0x56 custom 3rd party sensors
//{0x50, 0, int16, ZSTR_}
@@ -248,6 +318,10 @@ static int32_t spektrumGetValue(const uint8_t *packet, int startByte, SpektrumDa
return bcdToInt8(*(uint8_t *)data);
case uint32bcd:
return bcdToInt32(*(uint32_t *)data);
+ case uint16le:
+ return (int16_t) ((uint16_t) (data[0] + (data[1] << 8)));
+ case uint32le:
+ return ((uint32_t) (data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24)));
default:
return -1;
}
@@ -274,6 +348,12 @@ void processSpektrumPacket(const uint8_t *packet)
setTelemetryValue(PROTOCOL_TELEMETRY_SPEKTRUM, (I2C_PSEUDO_TX << 8) + 0, 0, 0, packet[1], UNIT_RAW, 0);
// highest bit indicates that TM1100 is in use, ignore it
uint8_t i2cAddress = (packet[2] & 0x7f);
+
+ //SmartBat Hack
+ if (i2cAddress == I2C_SMART_BAT_BASE_ADDRESS) {
+ i2cAddress = i2cAddress + (packet[4] >> 4); // use type to create virtual I2CAddresses
+ }
+
uint8_t instance = packet[3];
if (i2cAddress == I2C_TEXTGEN) {
@@ -303,6 +383,41 @@ void processSpektrumPacket(const uint8_t *packet)
if (!isSpektrumValidValue(value, sensor->dataType))
continue;
+ // mV to VOLT PREC2 for Smart Batteries
+ if ((i2cAddress >= I2C_SMART_BAT_REALTIME && i2cAddress <= I2C_SMART_BAT_LIMITS) && sensor->unit == UNIT_VOLTS) {
+ if (value == -1) {
+ continue; // discard unavailable sensors
+ }
+ else {
+ value = value / 10;
+ }
+ }
+
+ // RPM, 10RPM (0-655340 RPM)
+ if (i2cAddress == I2C_ESC && sensor->unit == UNIT_RPMS) {
+ value = value / 10;
+ }
+
+ // Current, 10mA (0-655.34A)
+ if (i2cAddress == I2C_ESC && sensor->startByte == 6) {
+ value = value / 10;
+ }
+
+ // BEC Current, 100mA (0-25.4A)
+ if (i2cAddress == I2C_ESC && sensor->startByte == 10) {
+ value = value / 10;
+ }
+
+ // Throttle 0.5% (0-127%)
+ if (i2cAddress == I2C_ESC && sensor->startByte == 12) {
+ value = value / 2;
+ }
+
+ // Power 0.5% (0-127%)
+ if (i2cAddress == I2C_ESC && sensor->startByte == 13) {
+ value = value / 2;
+ }
+
if (i2cAddress == I2C_CELLS && sensor->unit == UNIT_VOLTS) {
// Map to FrSky style cell values
int cellIndex = (sensor->startByte / 2) << 16;
diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h
index 0d15c3c0c..4252eb9a8 100644
--- a/radio/src/telemetry/telemetry.h
+++ b/radio/src/telemetry/telemetry.h
@@ -23,6 +23,9 @@
#include "frsky.h"
#include "crossfire.h"
+#include "myeeprom.h"
+#include "io/frsky_sport.h"
+
#if defined(MULTIMODULE)
#include "spektrum.h"
#include "flysky_ibus.h"
@@ -105,7 +108,8 @@ void frskyDSetDefault(int index, uint16_t id);
extern uint8_t telemetryProtocol;
#if defined (MULTIMODULE)
- #define IS_D16_MULTI(module) ((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) && (g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH))
+ #define IS_D16_MULTI(module) (((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) && (g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH)) \
+ || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKYX2))
#define IS_HOTT_MULTI(module) (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT)
#if defined(HARDWARE_INTERNAL_MODULE)
#define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (IS_D16_MULTI(INTERNAL_MODULE)||IS_D16_MULTI(EXTERNAL_MODULE))))
diff --git a/radio/src/telemetry/telemetry_holders.h b/radio/src/telemetry/telemetry_holders.h
index 70b2b6a9c..9db8d629f 100644
--- a/radio/src/telemetry/telemetry_holders.h
+++ b/radio/src/telemetry/telemetry_holders.h
@@ -22,6 +22,7 @@
#define _TELEMETRY_HOLDERS_H_
#include
+#include
#include "../timers.h"
#define TELEMETRY_AVERAGE_COUNT 3 // we actually average one more reading!
diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp
index 1cd1c98a8..293e5abf8 100644
--- a/radio/src/translations.cpp
+++ b/radio/src/translations.cpp
@@ -428,6 +428,8 @@ const char STR_FIRMWARE_UPDATE_SUCCESS[] = TR_FIRMWARE_UPDATE_SUCCESS;
const char STR_WRITING[] = TR_WRITING;
const char STR_FLASH_EXTERNAL_DEVICE[] = TR_FLASH_EXTERNAL_DEVICE;
const char STR_FLASH_RECEIVER_OTA[] = TR_FLASH_RECEIVER_OTA;
+const char STR_FLASH_RECEIVER_OTA_BY_EXTERNAL[] = TR_FLASH_RECEIVER_OTA_BY_EXTERNAL;
+const char STR_FLASH_RECEIVER_OTA_BY_INTERNAL[] = TR_FLASH_RECEIVER_OTA_BY_INTERNAL;
const char STR_FLASH_BLUETOOTH_MODULE[] = TR_FLASH_BLUETOOTH_MODULE;
const char STR_FLASH_POWER_MANAGEMENT_UNIT[] = TR_FLASH_POWER_MANAGEMENT_UNIT;
const char STR_CONFIRM_FORMAT[] = TR_CONFIRM_FORMAT;
diff --git a/radio/src/translations.h b/radio/src/translations.h
index e11ad3197..7a28a4299 100644
--- a/radio/src/translations.h
+++ b/radio/src/translations.h
@@ -626,6 +626,8 @@ extern const char STR_VIEW_TEXT[];
extern const char STR_FLASH_BOOTLOADER[];
extern const char STR_FLASH_EXTERNAL_DEVICE[];
extern const char STR_FLASH_RECEIVER_OTA[];
+extern const char STR_FLASH_RECEIVER_OTA_BY_EXTERNAL[];
+extern const char STR_FLASH_RECEIVER_OTA_BY_INTERNAL[];
extern const char STR_FLASH_BLUETOOTH_MODULE[];
extern const char STR_FLASH_POWER_MANAGEMENT_UNIT[];
extern const char STR_CURRENT_VERSION[];
diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt
index e0f453bb8..e46a70230 100644
--- a/radio/src/translations/cz.h.txt
+++ b/radio/src/translations/cz.h.txt
@@ -821,6 +821,8 @@
#define TR_FLASH_BOOTLOADER "Flash bootloaderu"
#define TR_FLASH_EXTERNAL_DEVICE TR("Flash S.Portem", "Flash S.Portem")
#define TR_FLASH_RECEIVER_OTA "Flash příjímače OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash modulu BT", "Flash modulu Bluetooth")
#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash řízení spotř.", "Flash jednotky řízení spotřeby")
#define TR_CURRENT_VERSION TR("Současná ver. ", "Současná verze: ")
@@ -1165,6 +1167,7 @@
#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage")
#define TR_AUTH_FAILURE "Auth-failure"
+#define ZSTR_FLR "FLR"
#define ZSTR_RSSI "RSSI"
#define ZSTR_R9PW "R9PW"
#define ZSTR_RAS "SWR"
@@ -1252,7 +1255,7 @@
#define ZSTR_GATE_TIME "GteT"
#define ZSTR_ESC_VOLTAGE "EscV"
#define ZSTR_ESC_CURRENT "EscA"
-#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_RPM "Erpm"
#define ZSTR_ESC_CONSUMPTION "EscC"
#define ZSTR_ESC_TEMP "EscT"
#define ZSTR_SD1_CHANNEL "Chan"
@@ -1267,3 +1270,45 @@
#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
#define ZSTR_SBEC_VOLTAGE "BecV"
#define ZSTR_SBEC_CURRENT "BecA"
+#define ZSTR_RB3040_EXTRA_STATE "RBES"
+#define ZSTR_RB3040_CHANNEL1 "CH1A"
+#define ZSTR_RB3040_CHANNEL2 "CH2A"
+#define ZSTR_RB3040_CHANNEL3 "CH3A"
+#define ZSTR_RB3040_CHANNEL4 "CH4A"
+#define ZSTR_RB3040_CHANNEL5 "CH5A"
+#define ZSTR_RB3040_CHANNEL6 "CH6A"
+#define ZSTR_RB3040_CHANNEL7 "CH7A"
+#define ZSTR_RB3040_CHANNEL8 "CH8A"
+#define ZSTR_ESC_VIN "EVIN"
+#define ZSTR_ESC_TFET "TFET"
+#define ZSTR_ESC_CUR "ECUR"
+#define ZSTR_ESC_TBEC "TBEC"
+#define ZSTR_ESC_BCUR "CBEC"
+#define ZSTR_ESC_VBEC "VBEC"
+#define ZSTR_ESC_THR "ETHR"
+#define ZSTR_ESC_POUT "EOUT"
+#define ZSTR_SMART_BAT_BTMP "BTmp"
+#define ZSTR_SMART_BAT_BCUR "BCur"
+#define ZSTR_SMART_BAT_BCAP "BUse"
+#define ZSTR_SMART_BAT_MIN_CEL "CLMi"
+#define ZSTR_SMART_BAT_MAX_CEL "CLMa"
+#define ZSTR_SMART_BAT_CYCLES "Cycl"
+#define ZSTR_SMART_BAT_CAPACITY "BCpT"
+#define ZSTR_CL01 "Cel1"
+#define ZSTR_CL02 "Cel2"
+#define ZSTR_CL03 "Cel3"
+#define ZSTR_CL04 "Cel4"
+#define ZSTR_CL05 "Cel5"
+#define ZSTR_CL06 "Cel6"
+#define ZSTR_CL07 "Cel7"
+#define ZSTR_CL08 "Cel8"
+#define ZSTR_CL09 "Cel9"
+#define ZSTR_CL10 "Cl10"
+#define ZSTR_CL11 "Cl11"
+#define ZSTR_CL12 "Cl12"
+#define ZSTR_CL13 "Cl13"
+#define ZSTR_CL14 "Cl14"
+#define ZSTR_CL15 "Cl15"
+#define ZSTR_CL16 "Cl16"
+#define ZSTR_CL17 "Cl17"
+#define ZSTR_CL18 "Cl18"
diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt
index ae3f50756..9da0cadc6 100644
--- a/radio/src/translations/de.h.txt
+++ b/radio/src/translations/de.h.txt
@@ -823,6 +823,8 @@
#define TR_FLASH_BOOTLOADER TR("Flash bootloader","Flash bootloader") //
#define TR_FLASH_EXTERNAL_DEVICE TR("Flash ext. Gerät","Flash externes Gerät")
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetoothmodul")
#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit")
#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ")
@@ -1171,6 +1173,7 @@
#define TR_AUTH_FAILURE "Auth-failure"
// ----------------------------------------------------------------
+#define ZSTR_FLR "FLR"
#define ZSTR_RSSI "RSSI"
#define ZSTR_R9PW "R9PW"
#define ZSTR_RAS "SWR"
@@ -1258,7 +1261,7 @@
#define ZSTR_GATE_TIME "GteT"
#define ZSTR_ESC_VOLTAGE "EscV"
#define ZSTR_ESC_CURRENT "EscA"
-#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_RPM "Erpm"
#define ZSTR_ESC_CONSUMPTION "EscC"
#define ZSTR_ESC_TEMP "EscT"
#define ZSTR_SD1_CHANNEL "Chan"
@@ -1273,3 +1276,45 @@
#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
#define ZSTR_SBEC_VOLTAGE "BecV"
#define ZSTR_SBEC_CURRENT "BecA"
+#define ZSTR_RB3040_EXTRA_STATE "RBES"
+#define ZSTR_RB3040_CHANNEL1 "CH1A"
+#define ZSTR_RB3040_CHANNEL2 "CH2A"
+#define ZSTR_RB3040_CHANNEL3 "CH3A"
+#define ZSTR_RB3040_CHANNEL4 "CH4A"
+#define ZSTR_RB3040_CHANNEL5 "CH5A"
+#define ZSTR_RB3040_CHANNEL6 "CH6A"
+#define ZSTR_RB3040_CHANNEL7 "CH7A"
+#define ZSTR_RB3040_CHANNEL8 "CH8A"
+#define ZSTR_ESC_VIN "EVIN"
+#define ZSTR_ESC_TFET "TFET"
+#define ZSTR_ESC_CUR "ECUR"
+#define ZSTR_ESC_TBEC "TBEC"
+#define ZSTR_ESC_BCUR "CBEC"
+#define ZSTR_ESC_VBEC "VBEC"
+#define ZSTR_ESC_THR "ETHR"
+#define ZSTR_ESC_POUT "EOUT"
+#define ZSTR_SMART_BAT_BTMP "BTmp"
+#define ZSTR_SMART_BAT_BCUR "BCur"
+#define ZSTR_SMART_BAT_BCAP "BUse"
+#define ZSTR_SMART_BAT_MIN_CEL "CLMi"
+#define ZSTR_SMART_BAT_MAX_CEL "CLMa"
+#define ZSTR_SMART_BAT_CYCLES "Cycl"
+#define ZSTR_SMART_BAT_CAPACITY "BCpT"
+#define ZSTR_CL01 "Cel1"
+#define ZSTR_CL02 "Cel2"
+#define ZSTR_CL03 "Cel3"
+#define ZSTR_CL04 "Cel4"
+#define ZSTR_CL05 "Cel5"
+#define ZSTR_CL06 "Cel6"
+#define ZSTR_CL07 "Cel7"
+#define ZSTR_CL08 "Cel8"
+#define ZSTR_CL09 "Cel9"
+#define ZSTR_CL10 "Cl10"
+#define ZSTR_CL11 "Cl11"
+#define ZSTR_CL12 "Cl12"
+#define ZSTR_CL13 "Cl13"
+#define ZSTR_CL14 "Cl14"
+#define ZSTR_CL15 "Cl15"
+#define ZSTR_CL16 "Cl16"
+#define ZSTR_CL17 "Cl17"
+#define ZSTR_CL18 "Cl18"
diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt
index d50b5a2cd..c5211468e 100644
--- a/radio/src/translations/en.h.txt
+++ b/radio/src/translations/en.h.txt
@@ -822,6 +822,8 @@
#define TR_FLASH_BOOTLOADER "Flash bootloader"
#define TR_FLASH_EXTERNAL_DEVICE TR("Flash S.Port", "Flash S.Port device")
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
#define TR_CURRENT_VERSION TR("Curr Vers: ", "Current version: ")
@@ -1169,6 +1171,7 @@
#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage")
#define TR_AUTH_FAILURE "Auth-failure"
+#define ZSTR_FLR "FLR"
#define ZSTR_RSSI "RSSI"
#define ZSTR_R9PW "R9PW"
#define ZSTR_RAS "SWR"
@@ -1256,7 +1259,7 @@
#define ZSTR_GATE_TIME "GteT"
#define ZSTR_ESC_VOLTAGE "EscV"
#define ZSTR_ESC_CURRENT "EscA"
-#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_RPM "Erpm"
#define ZSTR_ESC_CONSUMPTION "EscC"
#define ZSTR_ESC_TEMP "EscT"
#define ZSTR_SD1_CHANNEL "Chan"
@@ -1271,3 +1274,45 @@
#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
#define ZSTR_SBEC_VOLTAGE "BecV"
#define ZSTR_SBEC_CURRENT "BecA"
+#define ZSTR_RB3040_EXTRA_STATE "RBES"
+#define ZSTR_RB3040_CHANNEL1 "CH1A"
+#define ZSTR_RB3040_CHANNEL2 "CH2A"
+#define ZSTR_RB3040_CHANNEL3 "CH3A"
+#define ZSTR_RB3040_CHANNEL4 "CH4A"
+#define ZSTR_RB3040_CHANNEL5 "CH5A"
+#define ZSTR_RB3040_CHANNEL6 "CH6A"
+#define ZSTR_RB3040_CHANNEL7 "CH7A"
+#define ZSTR_RB3040_CHANNEL8 "CH8A"
+#define ZSTR_ESC_VIN "EVIN"
+#define ZSTR_ESC_TFET "TFET"
+#define ZSTR_ESC_CUR "ECUR"
+#define ZSTR_ESC_TBEC "TBEC"
+#define ZSTR_ESC_BCUR "CBEC"
+#define ZSTR_ESC_VBEC "VBEC"
+#define ZSTR_ESC_THR "ETHR"
+#define ZSTR_ESC_POUT "EOUT"
+#define ZSTR_SMART_BAT_BTMP "BTmp"
+#define ZSTR_SMART_BAT_BCUR "BCur"
+#define ZSTR_SMART_BAT_BCAP "BUse"
+#define ZSTR_SMART_BAT_MIN_CEL "CLMi"
+#define ZSTR_SMART_BAT_MAX_CEL "CLMa"
+#define ZSTR_SMART_BAT_CYCLES "Cycl"
+#define ZSTR_SMART_BAT_CAPACITY "BCpT"
+#define ZSTR_CL01 "Cel1"
+#define ZSTR_CL02 "Cel2"
+#define ZSTR_CL03 "Cel3"
+#define ZSTR_CL04 "Cel4"
+#define ZSTR_CL05 "Cel5"
+#define ZSTR_CL06 "Cel6"
+#define ZSTR_CL07 "Cel7"
+#define ZSTR_CL08 "Cel8"
+#define ZSTR_CL09 "Cel9"
+#define ZSTR_CL10 "Cl10"
+#define ZSTR_CL11 "Cl11"
+#define ZSTR_CL12 "Cl12"
+#define ZSTR_CL13 "Cl13"
+#define ZSTR_CL14 "Cl14"
+#define ZSTR_CL15 "Cl15"
+#define ZSTR_CL16 "Cl16"
+#define ZSTR_CL17 "Cl17"
+#define ZSTR_CL18 "Cl18"
diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt
index ab7c4b98c..045855d01 100644
--- a/radio/src/translations/es.h.txt
+++ b/radio/src/translations/es.h.txt
@@ -52,8 +52,8 @@
#define LEN_VBEEPMODE "\005"
#define TR_VBEEPMODE "Mudo ""Alarm""NoKey""Todo "
-#define LEN_VBLMODE "\004"
-#define TR_VBLMODE "OFF ""Keys""Stks""Both""ON\0"
+#define LEN_VBLMODE "\005"
+#define TR_VBLMODE "OFF\0 ""Keys\0""Stks\0""Ambos""ON\0"
#define LEN_TRNMODE "\003"
#define TR_TRNMODE "OFF""+=\0"":="
@@ -63,37 +63,37 @@
#define LEN_AUX_SERIAL_MODES "\015"
#if defined(CLI) || defined(DEBUG)
-#define TR_AUX_SERIAL_MODES "Debug\0 ""Telem Mirror\0""Telemetry In\0""SBUS Trainer\0""LUA\0 "
+#define TR_AUX_SERIAL_MODES "Debug\0 ""Telem Mirror\0""Telemetria\0 ""Entrenador SBUS""LUA\0 "
#else
-#define TR_AUX_SERIAL_MODES "OFF\0 ""Telem Mirror\0""Telemetry In\0""SBUS Trainer\0""LUA\0 "
+#define TR_AUX_SERIAL_MODES "OFF\0 ""Telem Mirror\0""Telemetria\0 ""Entrenador SBUS""LUA\0 "
#endif
#define LEN_SWTYPES "\006"
-#define TR_SWTYPES "None\0 ""Toggle""2POS\0 ""3POS\0"
+#define TR_SWTYPES "Nada\0 ""Palanc""2POS\0 ""3POS\0"
#define LEN_POTTYPES TR("\013", "\017")
-#define TR_POTTYPES TR("None ""Pot w det ""Multipos ""Pot ", "None ""Pot with detent""Multipos Switch""Pot\0")
+#define TR_POTTYPES TR("Nada\0 ""Pot con fij""Multipos\0 ""Pot\0 ", "Nada\0 ""Pot con fijador""Switch multipos""Pot\0 ")
#define LEN_SLIDERTYPES "\006"
-#define TR_SLIDERTYPES "Rien\0 ""Slider"
+#define TR_SLIDERTYPES "Nada\0 ""Slider"
#define LEN_VLCD "\006"
#define TR_VLCD "NormalOptrex"
#define LEN_VPERSISTENT "\014"
-#define TR_VPERSISTENT "OFF\0 ""Flight\0 ""Manual Reset"
+#define TR_VPERSISTENT "OFF\0 ""Vuelo\0 ""Reset manual"
#define LEN_COUNTRYCODES TR("\002", "\007")
#define TR_COUNTRYCODES TR("US""JP""EU", "America""Japon\0 ""Europa\0")
#define LEN_USBMODES TR("\006", "\010")
-#define TR_USBMODES TR("Ask\0 ""Joyst\0""SDCard""Serial", "Ask\0 ""Joystick""Storage\0""Serial\0 ")
+#define TR_USBMODES TR("Pregun""Joyst\0""SDCard""Serie\0", "Pregunta""Joystick""SDCard\0 ""Serie\0 ")
#define LEN_JACKMODES "\007"
-#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer"
+#define TR_JACKMODES "Pregunt""Audio\0 ""Entrena"
#define LEN_TELEMETRY_PROTOCOLS "\017"
-#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry"
+#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetr."
#define TR_MULTI_CUSTOM "Custom"
@@ -101,16 +101,16 @@
#define TR_VTRIMINC TR("Expo ""ExFino""Fino ""Medio ""Grueso", "Exponencial""Extra Fino ""Fino ""Medio ""Grueso ")
#define LEN_VDISPLAYTRIMS "\006"
-#define TR_VDISPLAYTRIMS "No\0 ""Change""Yes\0"
+#define TR_VDISPLAYTRIMS "No\0 ""Cambiar""Si\0 "
#define LEN_VBEEPCOUNTDOWN "\006"
-#define TR_VBEEPCOUNTDOWN "SilentBeeps\0Voz\0 Haptic"
+#define TR_VBEEPCOUNTDOWN "SilencBeeps\0Voz\0 Haptic"
-#define LEN_VVARIOCENTER "\006"
-#define TR_VVARIOCENTER "Tone\0 ""Silent"
+#define LEN_VVARIOCENTER "\010"
+#define TR_VVARIOCENTER "Tono\0 ""Silencio"
-#define LEN_CURVE_TYPES "\010"
-#define TR_CURVE_TYPES "Standard""Custom\0"
+#define LEN_CURVE_TYPES "\006"
+#define TR_CURVE_TYPES "Normal""Custom"
#define LEN_RETA123 "\001"
@@ -180,9 +180,9 @@
#endif
#if defined(HAPTIC)
- #define TR_HAPTIC "Tactil\0 "
+ #define TR_HAPTIC "Haptic\0 "
#else
- #define TR_HAPTIC "[Tactil]\0 "
+ #define TR_HAPTIC "[Haptic]\0 "
#endif
#if defined(VOICE)
@@ -210,7 +210,7 @@
#if defined(GVARS)
#define TR_ADJUST_GVAR "Ajuste\0 "
#else
- #define TR_ADJUST_GVAR "[AdjustGV]"
+ #define TR_ADJUST_GVAR "[AjusteGV]"
#endif
#if defined(LUA)
@@ -231,14 +231,14 @@
#define TR_SF_SAFETY "---\0 "
#endif
-#define TR_SF_SCREENSHOT "Screenshot"
-#define TR_SF_RESERVE "[reserve]\0"
+#define TR_SF_SCREENSHOT "Captura"
+#define TR_SF_RESERVE "[reserv.]\0"
-#define TR_VFSWFUNC TR_SF_SAFETY "Aprendiz\0 ""Inst. Trim""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Volumen\0 " "SetFailsfe" "RangeCheck" "ModuleBind" TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_SF_RESERVE TR_SF_PLAY_SCRIPT TR_SF_RESERVE TR_SF_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Luz fondo\0" TR_SF_SCREENSHOT TR_SF_TEST
+#define TR_VFSWFUNC TR_SF_SAFETY "Entrena.\0 ""Inst. Trim""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Volumen\0 " "SetFailsfe" "RangeCheck" "ModuleBind" TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_SF_RESERVE TR_SF_PLAY_SCRIPT TR_SF_RESERVE TR_SF_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Luz fondo\0" TR_SF_SCREENSHOT TR_SF_TEST
#define LEN_VFSWRESET TR("\004", "\011")
-#define TR_FSW_RESET_TELEM TR("Telm", "Telemetry")
+#define TR_FSW_RESET_TELEM TR("Telm", "Telemetria")
#if defined(PCBTARANIS)
#define TR_FSW_RESET_TIMERS "Timer 1\0 ""Timer 2\0 ""Timer 3\0 "
@@ -275,8 +275,8 @@
#define LENGTH_UNIT_METR "m\0 "
#define SPEED_UNIT_METR "kmh"
- #define LEN_VUNITSSYSTEM TR("\006", "\010")
- #define TR_VUNITSSYSTEM TR("Metric""Imper.", "Metric\0 ""Imperial")
+ #define LEN_VUNITSSYSTEM "\007"
+ #define TR_VUNITSSYSTEM "Metrico""Imperial"
#define LEN_VTELEMUNIT "\003"
#define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""rad""ml\0""fOz"
@@ -360,7 +360,7 @@
#endif
#define TR_RESERVE_VSRCRAW "[--]"
-#define TR_EXTRA_VSRCRAW "Batt""Time""GPS\0" TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW "Tmr1""Tmr2""Tmr3"
+#define TR_EXTRA_VSRCRAW "Bat\0""Time""GPS\0" TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW "Tmr1""Tmr2""Tmr3"
#define LEN_VTMRMODES "\003"
#define TR_VTMRMODES "OFF""ABS""THs""TH%""THt"
@@ -368,27 +368,27 @@
#define LEN_VTRAINERMODES "\022"
#define TR_VTRAINER_MASTER_JACK "Master/Jack\0 "
#define TR_VTRAINER_SLAVE_JACK "Esclav/Jack\0 "
-#define TR_VTRAINER_MASTER_SBUS_MODULE "Master/SBUS Module"
-#define TR_VTRAINER_MASTER_CPPM_MODULE "Master/CPPM Module"
-#define TR_VTRAINER_MASTER_BATTERY "Master/Serial\0 "
-#define TR_VTRAINER_BLUETOOTH TR("Master/BT\0 ""Slave/BT\0 ", "Master/Bluetooth\0 ""Slave/Bluetooth\0 ")
+#define TR_VTRAINER_MASTER_SBUS_MODULE "Master/Modulo SBUS"
+#define TR_VTRAINER_MASTER_CPPM_MODULE "Master/Modulo CPPM"
+#define TR_VTRAINER_MASTER_BATTERY "Master/Serie\0 "
+#define TR_VTRAINER_BLUETOOTH TR("Master/BT\0 ""Esclavo/BT\0 ", "Master/Bluetooth\0 ""Esclavo/Bluetooth\0")
#define TR_VTRAINER_MULTI "Master/Multi"
#define LEN_VFAILSAFE "\011"
-#define TR_VFAILSAFE "Not set\0 ""Guardar\0 ""Adaptar\0 ""Sin pulso""Receiver\0"
+#define TR_VFAILSAFE "No\0 ""Guardar\0 ""Adaptar\0 ""Sin pulso""Receptor\0"
#define LEN_VSENSORTYPES "\012"
-#define TR_VSENSORTYPES "Custom\0 ""Calculated"
+#define TR_VSENSORTYPES "Custom\0 ""Calculado"
#define LEN_VFORMULAS "\010"
-#define TR_VFORMULAS "Add\0 ""Average\0""Min\0 ""Max\0 ""Multiply""Totalize""Cell\0 ""Consumpt""Distance"
+#define TR_VFORMULAS "Suma\0 ""Media\0 ""Min\0 ""Max\0 ""Multipl.""Total\0 ""Cell\0 ""Consumo\0""Distanc."
#define LEN_VPREC "\004"
#define TR_VPREC "0.--""0.0 ""0.00"
#define LEN_VCELLINDEX "\007"
-#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0"
+#define TR_VCELLINDEX "Menor\0 ""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Mayor\0 ""Delta\0"
#define LEN_GYROS "\004"
#define TR_GYROS "GyrX""GyrY"
@@ -433,35 +433,31 @@
#define TR_COPYINGMODEL "Copiando modelo.."
#define TR_MOVINGMODEL "Mover modelo..."
#define TR_LOADINGMODEL "Cargar modelo..."
-#define TR_NAME "Nom."
+#define TR_NAME "Nombre"
#define TR_MODELNAME "Nom.Modelo"
#define TR_PHASENAME "Nom.Fase "
#define TR_MIXNAME "Nom.Mezcla"
-#define TR_INPUTNAME "Input Name"
-#if defined(PCBTARANIS)
- #define TR_EXPONAME "Line Name"
-#else
- #define TR_EXPONAME "Nom. Expo"
-#endif
+#define TR_INPUTNAME TR("N.entr","Nombre entrada")
+#define TR_EXPONAME TR("N.expo","Nombre expo")
#define TR_BITMAP "Imagen Modelo"
#define TR_TIMER TR("Reloj","Reloj ")
#define TR_ELIMITS TR("E.Limite","Ampliar Limites")
#define TR_ETRIMS TR("E.Trims","Ampliar Trims")
#define TR_TRIMINC "Paso Trim"
-#define TR_DISPLAY_TRIMS "Display Trims"
+#define TR_DISPLAY_TRIMS "Ver Trims"
#define TR_TTRACE TR("Fuente-A", INDENT "Fuente Acelerad")
#define TR_TTRIM TR("Trim-A", INDENT "Trim Acelerad")
-#define TR_BEEPCTR TR("Ctr Beep","Center Beep")
-#define TR_USE_GLOBAL_FUNCS "Use Global Funcs"
+#define TR_BEEPCTR TR("Beep ctr","Beep centro")
+#define TR_USE_GLOBAL_FUNCS "Funcs glob."
#if defined(PCBSKY9X) && defined(REVX)
#define TR_OUTPUT_TYPE INDENT "Output"
#endif
-#define TR_PROTO TR(INDENT"Proto",INDENT"Protocol")
+#define TR_PROTO TR(INDENT"Proto",INDENT"Protocolo")
#define TR_PPMFRAME "Trama PPM"
-#define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate")
-#define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ")
+#define TR_REFRESHRATE TR(INDENT "Refresco", INDENT "Velocidad refresco")
+#define STR_WARN_BATTVOLTAGE TR(INDENT "Salida es VBAT: ", INDENT "Aviso: señal salida es VBAT: ")
#define TR_MS "ms"
-#define TR_FREQUENCY INDENT "Frequency"
+#define TR_FREQUENCY INDENT "Frequencia"
#define TR_SWITCH "Interr"
#define TR_TRIMS "Trims"
#define TR_FADEIN "Inicio"
@@ -471,14 +467,14 @@
#define OFS_CHECKTRIMS CENTER_OFS+(9*FW)
#define TR_SWASHTYPE "Tipo ciclico"
#define TR_COLLECTIVE TR("Colectivo", "Fuente Colectivo")
-#define TR_AILERON TR("Lateral cyc.", "Lateral cyc. source")
-#define TR_ELEVATOR TR("Long. cyc.", "Long. cyc. source")
+#define TR_AILERON TR("Col. lateral", "Fuente col. lateral")
+#define TR_ELEVATOR TR("Col. long. ", "Fuente col. longitudinal")
#define TR_SWASHRING "Ciclico"
#define TR_ELEDIRECTION TR("ELE Direccion","Largo cyc. direccion")
#define TR_AILDIRECTION TR("AIL Direccion","Lateral cyc. direccion")
#define TR_COLDIRECTION TR("PIT Direccion","Coll. pitch direccion")
#define TR_MODE "Modo"
-#define TR_SUBTYPE INDENT "Subtype"
+#define TR_SUBTYPE INDENT "Subtipo"
#define TR_NOFREEEXPO "No expo libre!"
#define TR_NOFREEMIXER "No mezcla lib!"
#define TR_SOURCE "Fuente"
@@ -494,27 +490,27 @@
#define TR_FLMODE TR("Modo","Modos")
#define TR_MIXWARNING "Aviso"
#define TR_OFF "OFF"
-#define TR_ANTENNA "Antenna"
-#define TR_NO_INFORMATION TR("No info", "No information")
-#define TR_MULTPX "Multpx"
-#define TR_DELAYDOWN "Delay Dn"
-#define TR_DELAYUP "Delay Up"
-#define TR_SLOWDOWN "Slow Dn"
-#define TR_SLOWUP "Slow Up"
-#define TR_MIXES "Mezclas"
+#define TR_ANTENNA "Antena"
+#define TR_NO_INFORMATION TR("Sin info", "Sin informacion")
+#define TR_MULTPX "Multipx"
+#define TR_DELAYDOWN "Atraso bajar"
+#define TR_DELAYUP "Atraso subir"
+#define TR_SLOWDOWN "Bajar lento "
+#define TR_SLOWUP "Subir lento"
+#define TR_MIXES "MEZCLAS"
#define TR_CV "CV"
#define TR_GV TR("G", "GV")
#define TR_ACHANNEL "A\004canal"
#define TR_RANGE INDENT"Alcance"
-#define TR_CENTER INDENT "Center"
+#define TR_CENTER INDENT "Centro"
#define TR_BAR "Bar"
#define TR_ALARM INDENT"Alarma"
#define TR_USRDATA "UsrData"
#define TR_BLADES INDENT"Palas"
-#define TR_SCREEN "Pantalla"
+#define TR_SCREEN "Pant. "
#define TR_SOUND_LABEL "Sonido"
#define TR_LENGTH INDENT"Longitud"
-#define TR_BEEP_LENGTH INDENT "Beep Length"
+#define TR_BEEP_LENGTH INDENT "Duracion Beep"
#define TR_SPKRPITCH INDENT"Tono"
#define TR_HAPTIC_LABEL "Tactil"
#define TR_HAPTICSTRENGTH INDENT"Intensidad"
@@ -528,36 +524,36 @@
#define TR_INACTIVITYALARM INDENT"Inactividad"
#define TR_MEMORYWARNING INDENT"Memoria Baja"
#define TR_ALARMWARNING INDENT"Sin Sonido"
-#define TR_RSSISHUTDOWNALARM TR(INDENT "Rssi Shutdown", INDENT "Check Rssi on Shutdown")
-#define TR_MODEL_STILL_POWERED "Model still powered"
-#define TR_MODEL_SHUTDOWN "Shutdown ?"
-#define TR_PRESS_ENTER_TO_CONFIRM "Press enter to confirm"
-#define TR_THROTTLE_LABEL "Throttle"
+#define TR_RSSISHUTDOWNALARM TR(INDENT "Apagado Rssi", INDENT "Check Rssi al apagar")
+#define TR_MODEL_STILL_POWERED "Modelo aun encendido"
+#define TR_MODEL_SHUTDOWN "Apagar ?"
+#define TR_PRESS_ENTER_TO_CONFIRM "Enter para confirmar"
+#define TR_THROTTLE_LABEL "Potencia"
#define TR_THROTTLEREVERSE TR("Invert_Acel", INDENT "Invertir Acel.")
#define TR_MINUTEBEEP TR("Minuto", "Cada Minuto")
-#define TR_BEEPCOUNTDOWN INDENT"Cuentaatras"
+#define TR_BEEPCOUNTDOWN INDENT"Cta. atras"
#define TR_PERSISTENT TR(INDENT"Persist.", INDENT"Persistente")
#define TR_BACKLIGHT_LABEL "Luz Fondo"
#define TR_BLDELAY INDENT"Duracion"
#define TR_BLONBRIGHTNESS INDENT"MAS Brillo"
#define TR_BLOFFBRIGHTNESS INDENT"MENOS Brillo"
#define TR_BLCOLOR INDENT "Color"
-#define TR_SPLASHSCREEN "Ptalla.inicio"
-#define TR_PWR_ON_DELAY "Pwr On delay"
-#define TR_PWR_OFF_DELAY "Pwr Off delay"
+#define TR_SPLASHSCREEN "Pant. inicio"
+#define TR_PWR_ON_DELAY "Atraso On"
+#define TR_PWR_OFF_DELAY "Atraso Off"
#define TR_THROTTLEWARNING TR("Aviso-A", INDENT "Aviso Acelerador")
#define TR_SWITCHWARNING TR("Aviso-I", INDENT "Aviso Intrptor")
#define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders")
-#define TR_SLIDERWARNING TR(INDENT "Slid. pos.", INDENT "Slider positions")
-#define TR_POTWARNING TR("Pot Warn.", INDENT "Pot Warning")
+#define TR_SLIDERWARNING TR(INDENT "Pos. slid.", INDENT "Posiciones slider")
+#define TR_POTWARNING TR("Aviso pot", INDENT "Aviso pot")
#define TR_TIMEZONE TR("Zona Hora", "GPS Zona Hora")
-#define TR_ADJUST_RTC TR("Adjust RTC", INDENT "Adjust RTC")
+#define TR_ADJUST_RTC TR("Ajustar RTC", INDENT "Ajustar RTC")
#define TR_GPS "GPS"
#define TR_RXCHANNELORD TR("Rx Orden canal", "Orden habitual canales")
#define TR_STICKS "Sticks"
#define TR_POTS "Pots"
#define TR_SWITCHES "Switches"
-#define TR_SWITCHES_DELAY "Switches Delay"
+#define TR_SWITCHES_DELAY "Atraso switch."
#define TR_SLAVE "Esclavo"
#define TR_MODESRC "Modo\006% Fuente"
#define TR_MULTIPLIER "Multiplicar"
@@ -565,22 +561,22 @@
#define TR_VTRIM "Trim- +"
#define TR_BG "BG:"
#if defined(PCBHORUS)
- #define TR_MENUTOSTART "Press [Enter] to start"
- #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]"
- #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]"
+ #define TR_MENUTOSTART "Presiona [Enter] para empezar"
+ #define TR_SETMIDPOINT "Centra sticks/pots/sliders y presiona [Enter]"
+ #define TR_MOVESTICKSPOTS "Mueve sticks, pots and sliders y presiona [Enter]"
#else
#define TR_MENUTOSTART CENTER "\010" TR_ENTER " EMPEZAR"
#define TR_SETMIDPOINT TR(CENTER "\007STICKS AL CENTRO",CENTER "\010STICKS AL CENTRO")
#define TR_MOVESTICKSPOTS CENTER "\006MOVER STICKS/POTS"
#endif
-#define TR_RXBATT "Rx Batt:"
+#define TR_RXBATT "Rx Bat.:"
#define TR_TXnRX "Tx:\0Rx:"
#define OFS_RX 4
#define TR_ACCEL "Acc:"
#define TR_NODATA CENTER "SIN DATOS"
#define TR_US "us"
-#define TR_TMIXMAXMS "Tmix max"
-#define TR_FREE_STACK "Free stack"
+#define TR_TMIXMAXMS "Tmix max"
+#define TR_FREE_STACK "Stack libre"
#define TR_MENUTORESET TR_ENTER "Resetear"
#define TR_PPM_TRAINER "TR"
#define TR_CH "CH"
@@ -589,19 +585,19 @@
#define TR_MIX "MIX"
#define TR_EEPROMLOWMEM "EEPROM mem.baja"
#define TR_ALERT "\016ALERTA"
-#define TR_PRESSANYKEYTOSKIP "Pulsar tecla omitir"
+#define TR_PRESSANYKEYTOSKIP "Pulsar tecla para omitir"
#define TR_THROTTLENOTIDLE "Aceler. Activado"
#define TR_ALARMSDISABLED "Alarmas Desact."
#define TR_PRESSANYKEY TR("\010Pulsa una Tecla", "Pulsa una Tecla")
-#define TR_BADEEPROMDATA "Datos EEprom mal"
-#define TR_BAD_RADIO_DATA "Bad Radio Data"
+#define TR_BADEEPROMDATA "Error datos EEprom"
+#define TR_BAD_RADIO_DATA "Error datos radio"
#define TR_EEPROMFORMATTING "Formateo EEPROM"
-#define TR_STORAGE_FORMAT "Storage Preparation"
+#define TR_STORAGE_FORMAT "Preparacion alamacenamiento"
#define TR_EEPROMOVERFLOW "Desborde EEPROM"
#define TR_MENURADIOSETUP "CONFIGURACION"
#define TR_MENUDATEANDTIME "FECHA Y HORA"
-#define TR_MENUTRAINER "APRENDIZ"
-#define TR_MENUSPECIALFUNCS "GLOBAL FUNCTIONS"
+#define TR_MENUTRAINER "ENTRENADOR"
+#define TR_MENUSPECIALFUNCS "FUNCIONES GLOBALES"
#define TR_MENUVERSION "VERSION"
#define TR_MENU_RADIO_SWITCHES TR("INTERUPTS", "TEST INTERUP.")
#define TR_MENU_RADIO_ANALOGS TR("ANAS", "ENTRADAS ANALOG")
@@ -611,13 +607,13 @@
#else
#define TR_TRIMS2OFFSETS "\006Trims => Offsets"
#endif
-#define TR_CHANNELS2FAILSAFE "Channels=>Failsafe"
-#define TR_CHANNEL2FAILSAFE "Channel=>Failsafe"
-#define TR_MENUMODELSEL TR("MODELSEL", "SELECCION MODELO")
-#define TR_MENUSETUP TR("CONF.", "CONF.MODELO")
-#define TR_MENUFLIGHTMODE "MODO VUELO"
-#define TR_MENUFLIGHTMODES "MODOS VUELO"
-#define TR_MENUHELISETUP "CONF. HELI"
+#define TR_CHANNELS2FAILSAFE "Canales=>Failsafe"
+#define TR_CHANNEL2FAILSAFE "Canal=>Failsafe"
+#define TR_MENUMODELSEL TR("MODELOS", "SELECCION MODELO")
+#define TR_MENUSETUP "CONFIG. MODELO"
+#define TR_MENUFLIGHTMODE "MODO DE VUELO"
+#define TR_MENUFLIGHTMODES "MODOS DE VUELO"
+#define TR_MENUHELISETUP "CONFIGURACION HELI"
// Alignment
@@ -632,143 +628,143 @@
#define TR_MENUCURVES "CURVAS"
#define TR_MENUCURVE "CURVA"
-#define TR_MENULOGICALSWITCH "AJTE.INTERUP."
-#define TR_MENULOGICALSWITCHES "AJTE.INTERUPTS."
-#define TR_MENUCUSTOMFUNC "AJTE. FUNCIONES"
+#define TR_MENULOGICALSWITCH "INTERRUP. LOGICO"
+#define TR_MENULOGICALSWITCHES "INTERRUP. LOGICOS"
+#define TR_MENUCUSTOMFUNC "FUNCIONES"
#define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS"
#define TR_MENUTELEMETRY "TELEMETRIA"
#define TR_MENUTEMPLATES "PLANTILLAS"
-#define TR_MENUSTAT "STATS"
+#define TR_MENUSTAT "ESTADISTICAS"
#define TR_MENUDEBUG "DEBUG"
-#define TR_MONITOR_CHANNELS1 "CHANNELS MONITOR 1/8"
-#define TR_MONITOR_CHANNELS2 "CHANNELS MONITOR 9/16"
-#define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR"
-#define TR_MONITOR_CHANNELS3 "CHANNELS MONITOR 17/24"
-#define TR_MONITOR_CHANNELS4 "CHANNELS MONITOR 25/32"
-#define TR_MONITOR_OUTPUT_DESC "Outputs"
-#define TR_MONITOR_MIXER_DESC "Mixers"
-#define TR_RECEIVER_NUM TR("RxNum", "Receptor No.")
-#define TR_RECEIVER "Receiver"
-#define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune")
-#define TR_MULTI_TELEMETRY "Telemetry"
-#define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency")
-#define TR_RFPOWER "RF Power"
-#define TR_MULTI_FIXEDID TR("FixedID", "Fixed ID")
-#define TR_MULTI_OPTION TR("Option", "Option value")
-#define TR_MULTI_AUTOBIND TR(INDENT "Bind Ch.",INDENT "Bind on channel")
-#define TR_DISABLE_CH_MAP TR("No Ch. map", "Disable Ch. map")
-#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
-#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
-#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
+#define TR_MONITOR_CHANNELS1 "MONITOR CANALES 1/8"
+#define TR_MONITOR_CHANNELS2 "MONITOR CANALES 9/16"
+#define TR_MONITOR_SWITCHES "MONITOR INTERRP LOGICOS"
+#define TR_MONITOR_CHANNELS3 "MONITOR CANALES 17/24"
+#define TR_MONITOR_CHANNELS4 "MONITOR CANALES 25/32"
+#define TR_MONITOR_OUTPUT_DESC "SALIDAS"
+#define TR_MONITOR_MIXER_DESC "MEZCLAS"
+#define TR_RECEIVER_NUM TR("RxNum", "Receptor No.")
+#define TR_RECEIVER "Receptor"
+#define TR_MULTI_RFTUNE TR("Sint.freq.", "RF Freq. sint.fina")
+#define TR_MULTI_TELEMETRY "Telemetria"
+#define TR_MULTI_VIDFREQ TR("Freq. Vid.", "Frecuancia Video")
+#define TR_RFPOWER "RF Power"
+#define TR_MULTI_FIXEDID TR("ID Fijo", "ID Fijo")
+#define TR_MULTI_OPTION TR("Opcion", "Valor opcion")
+#define TR_MULTI_AUTOBIND TR(INDENT "Emp Cnl",INDENT "Emparejar en canal")
+#define TR_DISABLE_CH_MAP TR("No ch map", "Desactivar mapa cnl")
+#define TR_DISABLE_TELEM TR("No Telem", "Desactivar Telemetria")
+#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetectar formato")
+#define TR_MULTI_LOWPOWER TR(INDENT "Baja potencia", INDENT "Modo de baja potencia")
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
-#define TR_MODULE_TELEM_ON TR("ON", "Enabled")
-#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")
-#define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode")
-#define TR_MODULE_NO_INPUT TR("No input", "No serial input")
-#define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)")
-#define TR_MODULE_WAITFORBIND "Bind to load protocol"
-#define TR_MODULE_BINDING "Binding"
-#define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required")
-#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended")
-#define TR_REBIND "Rebinding required"
-#define TR_REG_OK "Registration ok"
-#define TR_BIND_OK "Bind successful"
-#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON"
-#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF"
-#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON"
-#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF"
-#define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid")
-#define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status")
-#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Proto Sync Status")
-#define TR_MULTI_SERVOFREQ TR("Servo rate", "Servo update rate")
-#define TR_MULTI_MAX_THROW TR("Max. Throw", "Enable max. throw")
-#define TR_MULTI_RFCHAN TR("RF Channel", "Select RF channel")
-#define TR_SYNCMENU "Sync " TR_ENTER
-#define TR_LIMIT INDENT"Limite"
-#define TR_MINRSSI "Min Rssi"
-#define TR_LATITUDE "Latitud"
-#define TR_LONGITUDE "Longitud"
-#define TR_GPSCOORD TR("GPS Coords", "GPS formato coordenadas")
-#define TR_VARIO TR("Vario", "Variometro")
-#define TR_PITCH_AT_ZERO INDENT "Pitch at Zero"
-#define TR_PITCH_AT_MAX INDENT "Pitch at Max"
-#define TR_REPEAT_AT_ZERO INDENT "Repeat at Zero"
-#define TR_SHUTDOWN "APAGANDO"
-#define TR_SAVEMODEL "Saving model settings"
-#define TR_BATT_CALIB "Calib.bateria"
-#define TR_CURRENT_CALIB "Calib. actual"
-#define TR_VOLTAGE INDENT"Voltaje"
-#define TR_CURRENT INDENT"Actual"
-#define TR_SELECT_MODEL "Selec Modelo"
-#define TR_CREATE_CATEGORY "Create Category"
-#define TR_RENAME_CATEGORY "Rename Category"
-#define TR_DELETE_CATEGORY "Delete Category"
-#define TR_CREATE_MODEL "Crear Modelo"
-#define TR_DUPLICATE_MODEL "Duplicate Model"
-#define TR_COPY_MODEL "Copiar Modelo"
-#define TR_MOVE_MODEL "Mover Modelo"
-#define TR_BACKUP_MODEL "Copia Sgdad Mod."
-#define TR_DELETE_MODEL "Borrar Modelo"
-#define TR_RESTORE_MODEL "Restaurar Modelo"
-#define TR_DELETE_ERROR "Delete error"
-#define TR_CAT_NOT_EMPTY "Category is not empty"
-#define TR_SDCARD_ERROR "SDCARD Error"
-#define TR_NO_SDCARD "No SDCARD"
-#define TR_WAITING_FOR_RX "Waiting for RX..."
-#define TR_WAITING_FOR_TX "Waiting for TX..."
-#define TR_NO_TOOLS "No tools available"
+#define TR_MODULE_TELEM_ON TR("ON", "Activado")
+#define TR_DISABLE_INTERNAL TR("Desac.RF int", "Desactivar modulo interno RF")
+#define TR_MODULE_NO_SERIAL_MODE TR("No modo serie", "No en modo serie")
+#define TR_MODULE_NO_INPUT TR("Sin señal", "Sin señal")
+#define TR_MODULE_NO_TELEMETRY TR3( "No telemetria", "No MULTI_TELEMETRY", "No telemetria (activa MULTI_TELEMETRY)")
+#define TR_MODULE_WAITFORBIND "Emparejar con protocolo"
+#define TR_MODULE_BINDING "Emparejando"
+#define TR_MODULE_UPGRADE_ALERT TR3("Actualizar", "Actualizar modulo", "Actualizar\nmodulo")
+#define TR_MODULE_UPGRADE TR("Act recom", "Actualizar modulo recomendado")
+#define TR_REBIND "Reemparejar "
+#define TR_REG_OK "Registro ok"
+#define TR_BIND_OK "Emparejado ok"
+#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON"
+#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF"
+#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON"
+#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF"
+#define TR_PROTOCOL_INVALID TR("Prot. invalido", "Protocolo invalido")
+#define TR_MODULE_STATUS TR(INDENT "EStado", INDENT "Estado modulo")
+#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Estado proto sync")
+#define TR_MULTI_SERVOFREQ TR("V ref serv", "Vel. refr. servo")
+#define TR_MULTI_MAX_THROW TR("Max. Throw", "Activar max. throw")
+#define TR_MULTI_RFCHAN TR("Canal RF", "Selecciona canal RF")
+#define TR_SYNCMENU "Sync " TR_ENTER
+#define TR_LIMIT INDENT"Limite"
+#define TR_MINRSSI "Min Rssi"
+#define TR_LATITUDE "Latitud"
+#define TR_LONGITUDE "Longitud"
+#define TR_GPSCOORD TR("Coords GPS", "GPS formato coordenadas")
+#define TR_VARIO TR("Vario", "Variometro")
+#define TR_PITCH_AT_ZERO INDENT "Pitch en cero"
+#define TR_PITCH_AT_MAX INDENT "Pitch en max"
+#define TR_REPEAT_AT_ZERO INDENT "Repet. en cero"
+#define TR_SHUTDOWN "APAGANDO"
+#define TR_SAVEMODEL "Grabando modelo"
+#define TR_BATT_CALIB "Calib.bat."
+#define TR_CURRENT_CALIB "Calib. actual"
+#define TR_VOLTAGE INDENT"Voltaje"
+#define TR_CURRENT INDENT"Actual"
+#define TR_SELECT_MODEL "Selec Modelo"
+#define TR_CREATE_CATEGORY "Crear categoria"
+#define TR_RENAME_CATEGORY "Renombrar categoria"
+#define TR_DELETE_CATEGORY "Borrar categoria"
+#define TR_CREATE_MODEL "Crear modelo"
+#define TR_DUPLICATE_MODEL "Duplicar modelo"
+#define TR_COPY_MODEL "Copiar modelo"
+#define TR_MOVE_MODEL "Mover modelo"
+#define TR_BACKUP_MODEL "Copia sgdad mod."
+#define TR_DELETE_MODEL "Borrar modelo"
+#define TR_RESTORE_MODEL "Restaurar modelo"
+#define TR_DELETE_ERROR "Error de borrado"
+#define TR_CAT_NOT_EMPTY "Categoria no esta vacia"
+#define TR_SDCARD_ERROR "Error SDCARD"
+#define TR_NO_SDCARD "No SDCARD"
+#define TR_WAITING_FOR_RX "Esperando a RX..."
+#define TR_WAITING_FOR_TX "Esperando a TX..."
+#define TR_NO_TOOLS "No hay utils"
#define TR_NORMAL "Normal"
-#define TR_NOT_INVERTED "Not inv"
-#define TR_NOT_CONNECTED "!Connected"
-#define TR_CONNECTED "Connected"
+#define TR_NOT_INVERTED "No inv"
+#define TR_NOT_CONNECTED "!Conectado"
+#define TR_CONNECTED "Conectado"
#define TR_FLEX_915 "Flex 915MHz"
#define TR_FLEX_868 "Flex 868MHz"
-#define TR_16CH_WITHOUT_TELEMETRY TR("16CH without telem.", "16CH without telemetry")
-#define TR_16CH_WITH_TELEMETRY TR("16CH with telem.", "16CH with telemetry")
-#define TR_8CH_WITH_TELEMETRY TR("8CH with telem.", "8CH with telemetry")
-#define TR_EXT_ANTENNA "Ext. antenna"
+#define TR_16CH_WITHOUT_TELEMETRY TR("16CH sin telem.", "16CH sin telemetria")
+#define TR_16CH_WITH_TELEMETRY TR("16CH con telem.", "16CH con telemetria")
+#define TR_8CH_WITH_TELEMETRY TR("8CH con telem.", "8CH con telemetria")
+#define TR_EXT_ANTENNA "Antena ext."
#define TR_PIN "Pin"
-#define TR_UPDATE_RX_OPTIONS "Update RX options?"
-#define TR_UPDATE_TX_OPTIONS "Update TX options?"
-#define TR_MODULES_RX_VERSION "Modules / RX version"
-#define TR_MENU_MODULES_RX_VERSION "MODULES / RX VERSION"
-#define TR_MENU_FIRM_OPTIONS "FIRMWARE OPTIONS"
+#define TR_UPDATE_RX_OPTIONS "Actualizar opciones RX?"
+#define TR_UPDATE_TX_OPTIONS "Actualizar opciones TX?"
+#define TR_MODULES_RX_VERSION "Modulos / version RX"
+#define TR_MENU_MODULES_RX_VERSION "MODULOS / VERSION RX"
+#define TR_MENU_FIRM_OPTIONS "OPCIONES FIRMWARE"
#define TR_GYRO "Gyro"
#define TR_STICKS_POTS_SLIDERS "Sticks/Pots/Sliders"
#define TR_PWM_STICKS_POTS_SLIDERS "PWM Sticks/Pots/Sliders"
-#define TR_RF_PROTOCOL "RF Protocol"
-#define TR_MODULE_OPTIONS "Module options"
-#define TR_POWER "Power"
-#define TR_NO_TX_OPTIONS "No TX options"
-#define TR_RTC_BATT "RTC Batt"
-#define TR_POWER_METER_EXT "Power Meter (EXT)"
-#define TR_POWER_METER_INT "Power Meter (INT)"
-#define TR_SPECTRUM_ANALYSER_EXT "Spectrum (EXT)"
-#define TR_SPECTRUM_ANALYSER_INT "Spectrum (INT)"
-#define TR_SDCARD_FULL "SD Card Full"
-#define TR_NEEDS_FILE "NEEDS FILE"
+#define TR_RF_PROTOCOL "Protocolo RF"
+#define TR_MODULE_OPTIONS "Opciones modulo"
+#define TR_POWER "Potencia"
+#define TR_NO_TX_OPTIONS "Sin pciones TX"
+#define TR_RTC_BATT "Bat. RTC"
+#define TR_POWER_METER_EXT "Medidor potencia(EXT)"
+#define TR_POWER_METER_INT "Medidor potencia(INT)"
+#define TR_SPECTRUM_ANALYSER_EXT "Spectro (EXT)"
+#define TR_SPECTRUM_ANALYSER_INT "Spectro (INT)"
+#define TR_SDCARD_FULL "SD Card llena"
+#define TR_NEEDS_FILE "NECESITA ARCHIVO"
#define TR_EXT_MULTI_SPEC "opentx-inv"
#define TR_INT_MULTI_SPEC "stm-opentx-noinv"
#define TR_INCOMPATIBLE "Incompatible"
#define TR_WARNING "AVISO"
#define TR_EEPROMWARN "EEPROM"
-#define TR_STORAGE_WARNING "STORAGE"
-#define TR_EEPROM_CONVERTING "EEPROM Converting"
+#define TR_STORAGE_WARNING "ALMAC."
+#define TR_EEPROM_CONVERTING "Convirtiendo EEPROM"
#define TR_THROTTLEWARN "ACELERADOR"
#define TR_ALARMSWARN "ALARMAS"
#define TR_SWITCHWARN "INTERPTOR"
#define TR_FAILSAFEWARN "FAILSAFE"
#define TR_TEST_WARNING TR("TESTING", "TEST BUILD")
-#define TR_TEST_NOTSAFE "Use for tests only"
-#define TR_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ")
-#define TR_WARN_RTC_BATTERY_LOW "RTC Battery low"
-#define TR_WARN_MULTI_LOWPOWER "Low power mode"
-#define TR_BATTERY "BATTERY"
-#define TR_WRONG_PCBREV "Wrong PCB detected"
-#define TR_EMERGENCY_MODE "EMERGENCY MODE"
-#define TR_PCBREV_ERROR "PCB error"
-#define TR_NO_FAILSAFE "Failsafe not set"
-#define TR_KEYSTUCK "Key stuck"
+#define TR_TEST_NOTSAFE "Usar solo para test"
+#define TR_WRONG_SDCARDVERSION TR("Ver esperada: ","Version esperada: ")
+#define TR_WARN_RTC_BATTERY_LOW "Bateria RTC baja"
+#define TR_WARN_MULTI_LOWPOWER "Modo baja potencia"
+#define TR_BATTERY "BATERiA"
+#define TR_WRONG_PCBREV "Placa PCB erronea"
+#define TR_EMERGENCY_MODE "MODO EMERGENCIA"
+#define TR_PCBREV_ERROR "Error PCB"
+#define TR_NO_FAILSAFE "Failsafe no fijado"
+#define TR_KEYSTUCK "Tecla atascada"
#define TR_INVERT_THR TR("Invertir Acel?", "Invertir Acel.?")
#define TR_SPEAKER_VOLUME INDENT "Volumen"
#define TR_LCD "LCD"
@@ -788,20 +784,20 @@
#define TR_SD_CARD "SD CARD"
#define TR_SDHC_CARD "SD-HC CARD"
#define TR_NO_SOUNDS_ON_SD "Sin sonidos en SD"
-#define TR_NO_MODELS_ON_SD "Sin Modelos en SD"
+#define TR_NO_MODELS_ON_SD "Sin modelos en SD"
#define TR_NO_BITMAPS_ON_SD "Sin imagenes en SD"
-#define TR_NO_SCRIPTS_ON_SD "No Scripts on SD"
+#define TR_NO_SCRIPTS_ON_SD "No scripts en SD"
#define TR_SCRIPT_SYNTAX_ERROR "Script syntax error"
#define TR_SCRIPT_PANIC "Script panic"
#define TR_SCRIPT_KILLED "Script killed"
-#define TR_SCRIPT_ERROR "Unknown error"
+#define TR_SCRIPT_ERROR "Error desconocido"
#define TR_PLAY_FILE "Play"
#define TR_DELETE_FILE "Borrar"
#define TR_COPY_FILE "Copiar"
#define TR_RENAME_FILE "Renombrar"
-#define TR_ASSIGN_BITMAP "Asignar Imagen"
-#define TR_ASSIGN_SPLASH "Splash screen"
-#define TR_EXECUTE_FILE "Execute"
+#define TR_ASSIGN_BITMAP "Asignar imagen"
+#define TR_ASSIGN_SPLASH "Pant. bienvenida"
+#define TR_EXECUTE_FILE "Ejecutar"
#define TR_REMOVED "Borrado"
#define TR_SD_INFO "Informacion"
#define TR_SD_FORMAT "Formatear"
@@ -813,17 +809,17 @@
#define TR_MAXBAUDRATE "Max bauds"
#define TR_BLUETOOTH "Bluetooth"
-#define TR_BLUETOOTH_DISC "Discover"
+#define TR_BLUETOOTH_DISC "Buscar"
#define TR_BLUETOOTH_INIT "Init"
-#define TR_BLUETOOTH_DIST_ADDR "Dist addr"
-#define TR_BLUETOOTH_LOCAL_ADDR "Local addr"
-#define TR_BLUETOOTH_PIN_CODE "PIN code"
-#define TR_BAUDRATE "BT Baudrate"
-#define LEN_BLUETOOTH_MODES "\011"
+#define TR_BLUETOOTH_DIST_ADDR "Dir. remota"
+#define TR_BLUETOOTH_LOCAL_ADDR "Dir. local"
+#define TR_BLUETOOTH_PIN_CODE "Codigo PIN"
+#define TR_BAUDRATE "Velocidad BT"
+#define LEN_BLUETOOTH_MODES "\012"
#if defined(PCBX9E)
-#define TR_BLUETOOTH_MODES "---\0 ""Enabled\0 "
+#define TR_BLUETOOTH_MODES "---\0 ""Activo\0 "
#else
-#define TR_BLUETOOTH_MODES "---\0 ""Telemetry""Trainer\0"
+#define TR_BLUETOOTH_MODES "---\0 ""Telemetria""Entrenador"
#endif
#define TR_SD_INFO_TITLE "SD INFO"
#define TR_SD_TYPE "Tipo:"
@@ -831,180 +827,183 @@
#define TR_SD_SECTORS "Sectores:"
#define TR_SD_SIZE "Tamaño:"
#define TR_TYPE INDENT "Tipo"
-#define TR_GLOBAL_VARS "Global Variables"
-#define TR_GVARS "GLOBAL V."
-#define TR_GLOBAL_VAR "Global Variable"
-#define TR_MENUGLOBALVARS "GLOBAL VARIABLES"
-#define TR_OWN "Propio"
-#define TR_DATE "Fecha"
-#define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
-#define TR_ROTARY_ENCODER "R.E."
-#define TR_CHANNELS_MONITOR "MONITOR CANALES"
-#define TR_MIXERS_MONITOR "MIXERS MONITOR"
-#define TR_PATH_TOO_LONG "Path too long"
-#define TR_VIEW_TEXT "View text"
-#define TR_FLASH_BOOTLOADER "Flash bootloader"
-#define TR_FLASH_EXTERNAL_DEVICE "Flash External Device"
-#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
-#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
-#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
-#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ")
-#define TR_FLASH_INTERNAL_MODULE "Flash Internal Module"
-#define TR_FLASH_INTERNAL_MULTI TR("Flash Int. Multi", "Flash Internal Multi")
-#define TR_FLASH_EXTERNAL_MODULE "Flash external module"
-#define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi")
-#define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error")
-#define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful"
-#define TR_WRITING "Writing..."
-#define TR_CONFIRM_FORMAT "Confirm Format?"
-#define TR_INTERNALRF "Interna RF"
-#define TR_INTERNAL_MODULE TR("Int. module","Internal module")
-#define TR_EXTERNAL_MODULE TR("Ext. module","External module")
-#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required"
-#define TR_TELEMETRY_DISABLED "Telem. disabled"
-#define TR_MORE_OPTIONS_AVAILABLE "More options available"
-#define TR_NO_MODULE_INFORMATION "No module information"
-#define TR_EXTERNALRF "Externa RF"
-#define TR_FAILSAFE INDENT"Modo sgdad."
-#define TR_FAILSAFESET "AJUSTES SGDAD."
+#define TR_GLOBAL_VARS "Variables globales"
+#define TR_GVARS "V. GLOBAL"
+#define TR_GLOBAL_VAR "Variable global"
+#define TR_MENUGLOBALVARS "VARIABLES GLOBALES"
+#define TR_OWN "Propio"
+#define TR_DATE "Fecha"
+#define TR_MONTHS { "Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic" }
+#define TR_ROTARY_ENCODER "R.E."
+#define TR_CHANNELS_MONITOR "MONITOR CANALES"
+#define TR_MIXERS_MONITOR "MONITOR MEZCLAS"
+#define TR_PATH_TOO_LONG "Path muy largo"
+#define TR_VIEW_TEXT "Ver texto"
+#define TR_FLASH_BOOTLOADER "Flash bootloader"
+#define TR_FLASH_EXTERNAL_DEVICE "Flash disp. externo"
+#define TR_FLASH_RECEIVER_OTA "Flash RX OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA"
+#define TR_FLASH_BLUETOOTH_MODULE TR("Flash modulo BT", "Flash modulo bluetooth")
+#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash unid. pwr mngt"
+#define TR_CURRENT_VERSION TR("Vers. actual", "Version actual: ")
+#define TR_FLASH_INTERNAL_MODULE TR("Flash modulo int", "Flash modulo interno")
+#define TR_FLASH_INTERNAL_MULTI TR("Flash Multi int", "Flash Multi interno")
+#define TR_FLASH_EXTERNAL_MODULE TR("Flash modulo ext", "Flash modulo externo")
+#define TR_FLASH_EXTERNAL_MULTI TR("Flash Multi ext", "Flash Multi externo")
+#define TR_FIRMWARE_UPDATE_ERROR TR("Error act FW","Error actualiz. firmware")
+#define TR_FIRMWARE_UPDATE_SUCCESS "Flash ok"
+#define TR_WRITING "Escribiendo..."
+#define TR_CONFIRM_FORMAT "Confirmar formato?"
+#define TR_INTERNALRF "RF interna"
+#define TR_INTERNAL_MODULE TR("Modulo int","Modulo interno")
+#define TR_EXTERNAL_MODULE TR("Modulo ext","Modulo externo")
+#define TR_OPENTX_UPGRADE_REQUIRED "Actualiz. OpenTX requerida"
+#define TR_TELEMETRY_DISABLED "Telem. inactiva"
+#define TR_MORE_OPTIONS_AVAILABLE "Mas opciones disp."
+#define TR_NO_MODULE_INFORMATION "Sin informacion modulo"
+#define TR_EXTERNALRF "RF externa"
+#define TR_FAILSAFE INDENT"Modo sgdad."
+#define TR_FAILSAFESET "AJUSTES SGDAD."
#define TR_REG_ID "Reg. ID"
-#define TR_OWNER_ID "Owner ID"
+#define TR_OWNER_ID "Pers. ID"
#define TR_PINMAPSET "PINMAP"
-#define TR_HOLD "Hold"
+#define TR_HOLD "Hold"
#define TR_HOLD_UPPERCASE "HOLD"
-#define TR_NONE "None"
-#define TR_NONE_UPPERCASE "NONE"
-#define TR_MENUSENSOR "SENSOR"
-#define TR_POWERMETER_PEAK "Peak"
-#define TR_POWERMETER_POWER "Power"
+#define TR_NONE "Nada"
+#define TR_NONE_UPPERCASE "NADA"
+#define TR_MENUSENSOR "SENSOR"
+#define TR_POWERMETER_PEAK "Pico"
+#define TR_POWERMETER_POWER "Potencia"
#define TR_POWERMETER_ATTN "Attn"
-#define TR_POWERMETER_FREQ "Freq."
-#define TR_MENUTOOLS "TOOLS"
-#define TR_TURN_OFF_RECEIVER "Turn off receiver"
-#define TR_STOPPING "Stopping..."
-#define TR_MENU_SPECTRUM_ANALYSER "SPECTRUM ANALYSER"
-#define TR_MENU_POWER_METER "POWER METER"
-#define TR_SENSOR "SENSOR"
-#define TR_COUNTRYCODE "Codigo Pais"
-#define TR_USBMODE "USB Mode"
-#define TR_JACKMODE "Jack Mode"
-#define TR_VOICELANG "Idioma voces"
-#define TR_UNITSSYSTEM "Unidades"
-#define TR_EDIT "Editar"
-#define TR_INSERT_BEFORE "Insertar antes"
-#define TR_INSERT_AFTER "Insertar despues"
-#define TR_COPY "Copiar"
+#define TR_POWERMETER_FREQ "Frec."
+#define TR_MENUTOOLS "UTILS"
+#define TR_TURN_OFF_RECEIVER "Apaga el receptor"
+#define TR_STOPPING "Parando..."
+#define TR_MENU_SPECTRUM_ANALYSER "ANALIZADOR DE ESPECTRO"
+#define TR_MENU_POWER_METER "MEDIDOR POTENCIA"
+#define TR_SENSOR "SENSOR"
+#define TR_COUNTRYCODE "Codigo Pais"
+#define TR_USBMODE "Modo USB"
+#define TR_JACKMODE "Modo Jack"
+#define TR_VOICELANG "Idioma voces"
+#define TR_UNITSSYSTEM "Unidades"
+#define TR_EDIT "Editar"
+#define TR_INSERT_BEFORE "Insertar antes"
+#define TR_INSERT_AFTER "Insertar despues"
+#define TR_COPY "Copiar"
#define TR_MOVE "Mover"
#define TR_PASTE "Pegar"
#define TR_DELETE "Borrar"
#define TR_INSERT "Insertar"
#define TR_RESET_FLIGHT "Reset Vuelo"
-#define TR_RESET_TIMER1 "Reset Reloj1"
-#define TR_RESET_TIMER2 "Reset Reloj2"
-#define TR_RESET_TIMER3 "Reset Reloj3"
+#define TR_RESET_TIMER1 "Reset Reloj 1"
+#define TR_RESET_TIMER2 "Reset Reloj 2"
+#define TR_RESET_TIMER3 "Reset Reloj 3"
#define TR_RESET_TELEMETRY "Reset Telemetria"
#define TR_STATISTICS "Estadisticas"
#define TR_ABOUT_US "Nosotros"
-#define TR_USB_JOYSTICK "USB Joystick (HID)"
-#define TR_USB_MASS_STORAGE "USB Storage (SD)"
-#define TR_USB_SERIAL "USB Serial (Debug)"
-#define TR_SETUP_SCREENS "Setup screens"
-#define TR_MONITOR_SCREENS "Monitors"
+#define TR_USB_JOYSTICK "Joystick USB (HID)"
+#define TR_USB_MASS_STORAGE "Almaz. USB (SD)"
+#define TR_USB_SERIAL "Serie USB (Debug)"
+#define TR_SETUP_SCREENS "Pantallas config"
+#define TR_MONITOR_SCREENS "Monitores"
#define TR_AND_SWITCH "AND Inter."
#define TR_SF "CF"
#define TR_GF "GF"
#define TR_SPEAKER INDENT"Altavoz"
#define TR_BUZZER INDENT"Zumbador"
#define TR_BYTES "bytes"
-#define TR_MODULE_BIND "[Enlace]"
-#define TR_POWERMETER_ATTN_NEEDED "Attenuator needed"
-#define TR_PXX2_SELECT_RX "Select RX..."
-#define TR_PXX2_DEFAULT ""
-#define TR_BT_SELECT_DEVICE "Select device..."
-#define TR_DISCOVER "Discover"
+#define TR_MODULE_BIND "[Enl.]"
+#define TR_POWERMETER_ATTN_NEEDED "Necesita atenuador"
+#define TR_PXX2_SELECT_RX "Selecciona RX..."
+#define TR_PXX2_DEFAULT ""
+#define TR_BT_SELECT_DEVICE "Selecciona dispositivo..."
+#define TR_DISCOVER "Buscar"
#define TR_BUTTON_INIT BUTTON("Init")
-#define TR_WAITING "Waiting..."
-#define TR_RECEIVER_DELETE "Delete receiver?"
-#define TR_RECEIVER_RESET "Reset receiver?"
-#define TR_SHARE "Share"
-#define TR_BIND "Bind"
-#define TR_REGISTER TR("Reg", "Register")
-#define TR_MODULE_RANGE "[Limites]"
-#define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS")
-#define TR_DEL_BUTTON BUTTON(TR("Del", "Delete"))
+#define TR_WAITING "Espera..."
+#define TR_RECEIVER_DELETE "Borrar receptor?"
+#define TR_RECEIVER_RESET "Reset receptor?"
+#define TR_SHARE "Compartido"
+#define TR_BIND "Emparejar"
+#define TR_REGISTER TR("Reg", "Registrar")
+#define TR_MODULE_RANGE "[Lim.]"
+#define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "OPCIONES RECEPTOR")
+#define TR_DEL_BUTTON BUTTON(TR("Del", "Borrar"))
#define TR_RESET_BTN "[Reset]"
#define TR_DEBUG "Debug"
#define TR_KEYS_BTN BUTTON(TR("SW","Switches"))
#define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs"))
-#define TR_CALIBRATION "Calibration"
+#define TR_CALIBRATION "Calibracion"
#define TR_SET "[Ajuste]"
-#define TR_TRAINER "Aprendiz"
+#define TR_TRAINER "Entrena."
#define TR_CHANS "Chans"
#define TR_ANTENNAPROBLEM CENTER "¡Problema antena TX!"
#define TR_MODELIDUSED TR("ID en uso", "ID modelo en uso")
#define TR_MODULE "Modulo"
-#define TR_RX_NAME "Rx Name"
-#define TR_TELEMETRY_TYPE TR("Type", "Telemetry Type")
-#define TR_TELEMETRY_SENSORS "Sensors"
-#define TR_VALUE "Value"
-#define TR_TOPLCDTIMER "Top LCD Timer"
-#define TR_UNIT "Unit"
-#define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..."
-#define TR_CHANNELRANGE INDENT "Gama de canales"
-#define TR_ANTENNACONFIRM1 "EXT. ANTENNA"
+#define TR_RX_NAME "Nombre Rx"
+#define TR_TELEMETRY_TYPE TR("Tipo", "Tipo telemetria")
+#define TR_TELEMETRY_SENSORS "Sensores"
+#define TR_VALUE "Valor"
+#define TR_TOPLCDTIMER "Timer LCD superior"
+#define TR_UNIT "Unidad"
+#define TR_TELEMETRY_NEWSENSOR INDENT "Añadir nuevo sensor..."
+#define TR_CHANNELRANGE INDENT "Canales"
+#define TR_ANTENNACONFIRM1 "ANTENA EXT."
#if defined(PCBX12S)
#define LEN_ANTENNA_MODES "\023"
-#define TR_ANTENNA_MODES "Internal\0 ""Ask\0 ""Per model\0 ""Internal + External"
+#define TR_ANTENNA_MODES "Interna\0 ""Preguntar\0 ""Por modelo\0 ""Interno + Externo\0 "
#else
#define LEN_ANTENNA_MODES "\011"
-#define TR_ANTENNA_MODES "Internal\0""Ask\0 ""Per model""External"
+#define TR_ANTENNA_MODES "Interna\0 ""Preguntar\0""Por model""Externa\0 "
#endif
-#define TR_USE_INTERNAL_ANTENNA TR("Use int. antenna", "Use internal antenna")
-#define TR_USE_EXTERNAL_ANTENNA TR("Use ext. antenna", "Use external antenna")
-#define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!")
-#define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
-#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"
-#define TR_MODULE_PROTOCOL_EU_WARN_LINE1 "Requires EU"
-#define TR_MODULE_PROTOCOL_WARN_LINE2 "certified firmware"
+#define TR_USE_INTERNAL_ANTENNA TR("Usa antena int.", "Usa antena interna")
+#define TR_USE_EXTERNAL_ANTENNA TR("Use antena ext.", "Usa antena externa")
+#define TR_ANTENNACONFIRM2 TR("Revisa antena", "Revisa que la antena este instalada!")
+
+#define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "No requerido"
+#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requiere FCC"
+#define TR_MODULE_PROTOCOL_EU_WARN_LINE1 "Requiere EU"
+#define TR_MODULE_PROTOCOL_WARN_LINE2 "firmware certificado"
#define TR_LOWALARM INDENT "Alarma baja"
-#define TR_CRITICALALARM INDENT "Alarma Critica"
-#define TR_RSSIALARM_WARN TR("RSSI","TELEMETRY RSSI")
-#define TR_NO_RSSIALARM TR(INDENT "Alarms disabled", INDENT "Telemetry alarms disabled")
-#define TR_DISABLE_ALARM TR(INDENT "Disable alarms", INDENT "Disable telemetry alarms")
-#define TR_ENABLE_POPUP "Enable Popup"
-#define TR_DISABLE_POPUP "Disable Popup"
+#define TR_CRITICALALARM INDENT "Alarma critica"
+#define TR_RSSIALARM_WARN TR("RSSI","TELEMETRY RSSI")
+#define TR_NO_RSSIALARM TR(INDENT "Alarmas desact.", INDENT "Alarmas telemetria desact.")
+#define TR_DISABLE_ALARM TR(INDENT "Desact. alarmas", INDENT "Desact. alarmas telem.")
+#define TR_ENABLE_POPUP "Activa Popup"
+#define TR_DISABLE_POPUP "Desactiva Popup"
#define TR_POPUP "Popup"
#define TR_MIN "Min"
#define TR_MAX "Max"
#define TR_CURVE_PRESET "Preset..."
#define TR_PRESET "Preset"
#define TR_MIRROR "Mirror"
-#define TR_CLEAR "Clear"
+#define TR_CLEAR "Borrar"
#define TR_RESET "Reset"
#define TR_RESET_SUBMENU "Reset..."
-#define TR_COUNT "Count"
+#define TR_COUNT "Puntos"
#define TR_PT "pt"
#define TR_PTS "pts"
-#define TR_SMOOTH "Smooth"
-#define TR_COPY_STICKS_TO_OFS TR("Cpy stick->subtrim", "Copy Sticks To Offset")
-#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Cpy min/max to all", "Copy min/max/center to all outputs")
-#define TR_COPY_TRIMS_TO_OFS TR("Cpy trim->subtrim", "Copy trims to subtrim")
+#define TR_SMOOTH "Suaviz"
+#define TR_COPY_STICKS_TO_OFS TR("Copia stick->subtr", "Copia Sticks a Offset")
+#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Copia min/max a sal", "Copia min/max/ctr a salidas")
+#define TR_COPY_TRIMS_TO_OFS TR("Copia trim->subtr", "Copia trims a subtrim")
#define TR_INCDEC "Inc/Decrement"
-#define TR_GLOBALVAR "Global Var"
-#define TR_MIXSOURCE "Mixer Source"
-#define TR_CONSTANT "Constant"
+#define TR_GLOBALVAR "Var global"
+#define TR_MIXSOURCE "Entrada mixer"
+#define TR_CONSTANT "Constante"
#define TR_PERSISTENT_MAH INDENT "Valor mAh"
-#define TR_PREFLIGHT "Preflight Checks"
-#define TR_CHECKLIST INDENT "Display Checklist"
+#define TR_PREFLIGHT "Chequeos Prevuelo"
+#define TR_CHECKLIST INDENT "Lista verif"
#define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset")
-#define TR_AUX_SERIAL_MODE "Serial port"
+#define TR_AUX_SERIAL_MODE "Puerto serie"
#define TR_SCRIPT "Script"
-#define TR_INPUTS "Inputs"
-#define TR_OUTPUTS "Outputs"
-#define STR_EEBACKUP "Backup the EEPROM"
-#define STR_FACTORYRESET "Factory reset"
-#define TR_CONFIRMRESET "Erase ALL models and settings?"
-#define TR_TOO_MANY_LUA_SCRIPTS "Too many Lua scripts!"
+#define TR_INPUTS "Entradas"
+#define TR_OUTPUTS "Salidas"
+#define STR_EEBACKUP "Copia seg. EEPROM"
+#define STR_FACTORYRESET "Rest. fabrica"
+#define TR_CONFIRMRESET "Borrar TODOS los modelos y configuracion?"
+#define TR_TOO_MANY_LUA_SCRIPTS "Demasiados Lua scripts!"
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
@@ -1013,10 +1012,10 @@
// Horus and Taranis column headers
#define TR_PHASES_HEADERS_NAME "Nombre"
#define TR_PHASES_HEADERS_SW "Interrup"
-#define TR_PHASES_HEADERS_RUD_TRIM "Rudder Trim"
-#define TR_PHASES_HEADERS_ELE_TRIM "Elevator Trim"
-#define TR_PHASES_HEADERS_THT_TRIM "Throttle Trim"
-#define TR_PHASES_HEADERS_AIL_TRIM "Aileron Trim"
+#define TR_PHASES_HEADERS_RUD_TRIM "Trim timon"
+#define TR_PHASES_HEADERS_ELE_TRIM "Trim elevador"
+#define TR_PHASES_HEADERS_THT_TRIM "Trim potencia"
+#define TR_PHASES_HEADERS_AIL_TRIM "Trim aleron"
#define TR_PHASES_HEADERS_CH5_TRIM "Trim 5"
#define TR_PHASES_HEADERS_CH6_TRIM "Trim 6"
#define TR_PHASES_HEADERS_FAD_IN "Aparecer"
@@ -1027,7 +1026,7 @@
#define TR_LIMITS_HEADERS_MIN "Min"
#define TR_LIMITS_HEADERS_MAX "Max"
#define TR_LIMITS_HEADERS_DIRECTION "Direccion"
-#define TR_LIMITS_HEADERS_CURVE "Curve"
+#define TR_LIMITS_HEADERS_CURVE "Curva"
#define TR_LIMITS_HEADERS_PPMCENTER "Centrado PPM"
#define TR_LIMITS_HEADERS_SUBTRIMMODE "Simetrica"
@@ -1038,19 +1037,19 @@
#define TR_LSW_HEADERS_DURATION "Duracion"
#define TR_LSW_HEADERS_DELAY "Retardo"
-#define TR_GVAR_HEADERS_NAME "Name"
-#define TR_GVAR_HEADERS_FM0 "Value on FM0"
-#define TR_GVAR_HEADERS_FM1 "Value on FM1"
-#define TR_GVAR_HEADERS_FM2 "Value on FM2"
-#define TR_GVAR_HEADERS_FM3 "Value on FM3"
-#define TR_GVAR_HEADERS_FM4 "Value on FM4"
-#define TR_GVAR_HEADERS_FM5 "Value on FM5"
-#define TR_GVAR_HEADERS_FM6 "Value on FM6"
-#define TR_GVAR_HEADERS_FM7 "Value on FM7"
-#define TR_GVAR_HEADERS_FM8 "Value on FM8"
+#define TR_GVAR_HEADERS_NAME "Nombre"
+#define TR_GVAR_HEADERS_FM0 "Valor en FM0"
+#define TR_GVAR_HEADERS_FM1 "Valor en FM1"
+#define TR_GVAR_HEADERS_FM2 "Valor en FM2"
+#define TR_GVAR_HEADERS_FM3 "Valor en FM3"
+#define TR_GVAR_HEADERS_FM4 "Valor en FM4"
+#define TR_GVAR_HEADERS_FM5 "Valor en FM5"
+#define TR_GVAR_HEADERS_FM6 "Valor en FM6"
+#define TR_GVAR_HEADERS_FM7 "Valor en FM7"
+#define TR_GVAR_HEADERS_FM8 "Valor en FM8"
// Horus footer descriptions
-#define TR_LSW_DESCRIPTIONS { "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" }
+#define TR_LSW_DESCRIPTIONS { "Tipo de comparacion o funcion", "Primera variable", "Segunda variable o constante", "Segunda variable o constante", "Condicion adicional para activar linea", "Duracion minima de switch logico", "Duracion minima TRUE para activar switch logico" }
// Taranis About screen
#define TR_ABOUTUS "Nosotros"
@@ -1083,8 +1082,8 @@
#define TR_ABOUT_KJELL_1 "Kjell Kernen"
#define TR_ABOUT_KJELL_2 "www.open-tx.org main author"
-#define TR_ABOUT_KJELL_3 "OpenTX Recorder author"
-#define TR_ABOUT_KJELL_4 "Companion contributor"
+#define TR_ABOUT_KJELL_3 "Autor OpenTX Recorder"
+#define TR_ABOUT_KJELL_4 "Colaborador Companion"
#define TR_ABOUT_MARTIN_1 "Martin Hotar"
#define TR_ABOUT_MARTIN_2 "Dise\201o grafico"
@@ -1092,7 +1091,7 @@
#if defined(PCBTARANIS)
#define TR_ABOUT_HARDWARE_1 "FrSky"
#define TR_ABOUT_HARDWARE_2 "Productor dise\201o de hardware"
- #define TR_ABOUT_HARDWARE_3 "Firmware contributor"
+ #define TR_ABOUT_HARDWARE_3 "Colaborador firmware"
#else
#define TR_ABOUT_HARDWARE_1 "Brent Nelson"
#define TR_ABOUT_HARDWARE_2 "Sky9x dise\201ador/productor"
@@ -1114,82 +1113,83 @@
#define TR_WAV_VOLUME "Volumen Wav"
#define TR_BG_VOLUME "Volumen Bg"
-#define TR_TOP_BAR "Top Bar"
-#define TR_FLASH_ERASE "Flash erase..."
-#define TR_FLASH_WRITE "Flash write..."
-#define TR_OTA_UPDATE "OTA update..."
-#define TR_MODULE_RESET "Module reset..."
-#define TR_UNKNOWN_RX "Unknown RX"
-#define TR_UNSUPPORTED_RX "Unsupported RX"
-#define TR_OTA_UPDATE_ERROR "OTA update error"
-#define TR_DEVICE_RESET "Device reset..."
-#define TR_ALTITUDE INDENT "Altitude"
-#define TR_SCALE "Scale"
-#define TR_VIEW_CHANNELS "View Channels"
-#define TR_VIEW_NOTES "View Notes"
-#define TR_MODEL_SELECT "Model Select"
-#define TR_MODS_FORBIDDEN "Modifications forbidden!"
-#define TR_UNLOCKED "Unlocked"
+#define TR_TOP_BAR "Panel superior"
+#define TR_FLASH_ERASE "Borrar flash..."
+#define TR_FLASH_WRITE "Escrivir flash..."
+#define TR_OTA_UPDATE "Actualizacion OTA..."
+#define TR_MODULE_RESET "Reset modulo..."
+#define TR_UNKNOWN_RX "RX deconocido"
+#define TR_UNSUPPORTED_RX "RX no soportado"
+#define TR_OTA_UPDATE_ERROR "Error actualizacion OTA"
+#define TR_DEVICE_RESET "Reset dispositivo..."
+#define TR_ALTITUDE INDENT "Altitud"
+#define TR_SCALE "Escala"
+#define TR_VIEW_CHANNELS "Ver Canales"
+#define TR_VIEW_NOTES "Ver Notas"
+#define TR_MODEL_SELECT "Seleccionar modelo"
+#define TR_MODS_FORBIDDEN "Modificacions prohibidas!"
+#define TR_UNLOCKED "Desbloqueado"
#define TR_ID "ID"
#define TR_PRECISION "Precision"
#define TR_RATIO "Ratio"
#define TR_FORMULA "Formula"
#define TR_CELLINDEX "Cell index"
#define TR_LOGS "Logs"
-#define TR_OPTIONS "Options"
-#define TR_FIRMWARE_OPTIONS "Firmware options"
+#define TR_OPTIONS "Opciones"
+#define TR_FIRMWARE_OPTIONS "Opciones firmware"
#define TR_ALTSENSOR "Alt sensor"
#define TR_CELLSENSOR "Cell sensor"
#define TR_GPSSENSOR "GPS sensor"
#define TR_CURRENTSENSOR "Sensor"
#define TR_AUTOOFFSET "Auto Offset"
-#define TR_ONLYPOSITIVE "Positive"
-#define TR_FILTER "Filter"
-#define TR_TELEMETRYFULL TR("All slots full!", "All telemetry slots full!")
+#define TR_ONLYPOSITIVE "Positivo"
+#define TR_FILTER "Filtro"
+#define TR_TELEMETRYFULL TR("Telem. llena!", "Todas las entradas de telemetria llenas!")
#define TR_SERVOS_OK "Servos OK"
#define TR_SERVOS_KO "Servos KO"
-#define TR_INVERTED_SERIAL INDENT "Invert"
-#define TR_IGNORE_INSTANCE INDENT "Ignore instance"
-#define TR_DISCOVER_SENSORS "Discover new sensors"
-#define TR_STOP_DISCOVER_SENSORS "Stop discovery"
-#define TR_DELETE_ALL_SENSORS "Delete all sensors"
-#define TR_CONFIRMDELETE "Really " LCDW_128_480_LINEBREAK "delete all ?"
-#define TR_SELECT_WIDGET "Select widget"
-#define TR_REMOVE_WIDGET "Remove widget"
-#define TR_WIDGET_SETTINGS "Widget settings"
-#define TR_REMOVE_SCREEN "Remove screen"
-#define TR_SETUP_WIDGETS "Setup widgets"
-#define TR_USER_INTERFACE "User interface"
-#define TR_THEME "Theme"
-#define TR_SETUP "Setup"
-#define TR_MAINVIEWX "Main view X"
-#define TR_LAYOUT "Layout"
-#define TR_ADDMAINVIEW "Add main view"
-#define TR_BACKGROUND_COLOR "Background color"
-#define TR_MAIN_COLOR "Main color"
-#define TR_TEXT_VIEWER "Text Viewer"
+#define TR_INVERTED_SERIAL INDENT "Invertir"
+#define TR_IGNORE_INSTANCE INDENT "Ignorar instancia"
+#define TR_DISCOVER_SENSORS "Buscar nuevos sensores"
+#define TR_STOP_DISCOVER_SENSORS "Parar busqueda"
+#define TR_DELETE_ALL_SENSORS "Borrar sensores"
+#define TR_CONFIRMDELETE "Seguro " LCDW_128_480_LINEBREAK "borrar todo ?"
+#define TR_SELECT_WIDGET "Seleccionar widget"
+#define TR_REMOVE_WIDGET "Borrar widget"
+#define TR_WIDGET_SETTINGS "Config. widget"
+#define TR_REMOVE_SCREEN "Borar pantalla"
+#define TR_SETUP_WIDGETS "Config. widgets"
+#define TR_USER_INTERFACE "Interfaz"
+#define TR_THEME "Tema"
+#define TR_SETUP "Configiracion"
+#define TR_MAINVIEWX "Vista pral. X"
+#define TR_LAYOUT "Diseño"
+#define TR_ADDMAINVIEW "Añadir vista pral."
+#define TR_BACKGROUND_COLOR "Color de fondo"
+#define TR_MAIN_COLOR "Color principal"
+#define TR_TEXT_VIEWER "Visor de texto"
#define TR_MENU_INPUTS "\314Inputs"
#define TR_MENU_LUA "\322Lua scripts"
#define TR_MENU_STICKS "\307Sticks"
#define TR_MENU_POTS "\310Pots"
#define TR_MENU_MAX "\315MAX"
-#define TR_MENU_HELI "\316Cyclic"
+#define TR_MENU_HELI "\316Ciclico"
#define TR_MENU_TRIMS "\313Trims"
#define TR_MENU_SWITCHES "\312Switches"
#define TR_MENU_LOGICAL_SWITCHES "\312Logical Switches"
-#define TR_MENU_TRAINER "\317Trainer"
-#define TR_MENU_CHANNELS "\320Channels"
+#define TR_MENU_TRAINER "\317Entrenador"
+#define TR_MENU_CHANNELS "\320Canales"
#define TR_MENU_GVARS "\311GVars"
-#define TR_MENU_TELEMETRY "\321Telemetry"
-#define TR_MENU_DISPLAY "DISPLAY"
-#define TR_MENU_OTHER "Other"
-#define TR_MENU_INVERT "Invert"
-#define TR_JITTER_FILTER "ADC Filter"
-#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage")
-#define TR_AUTH_FAILURE "Auth-failure"
+#define TR_MENU_TELEMETRY "\321Telemetria"
+#define TR_MENU_DISPLAY "Monitor"
+#define TR_MENU_OTHER "Otros"
+#define TR_MENU_INVERT "Invertir"
+#define TR_JITTER_FILTER "Filtro ADC"
+#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltaje")
+#define TR_AUTH_FAILURE "Fallo auth."
+#define ZSTR_FLR "FLR"
#define ZSTR_RSSI "RSSI"
#define ZSTR_R9PW "R9PW"
#define ZSTR_RAS "SWR"
@@ -1277,7 +1277,7 @@
#define ZSTR_GATE_TIME "GteT"
#define ZSTR_ESC_VOLTAGE "EscV"
#define ZSTR_ESC_CURRENT "EscA"
-#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_RPM "Erpm"
#define ZSTR_ESC_CONSUMPTION "EscC"
#define ZSTR_ESC_TEMP "EscT"
#define ZSTR_SD1_CHANNEL "Chan"
@@ -1292,3 +1292,45 @@
#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
#define ZSTR_SBEC_VOLTAGE "BecV"
#define ZSTR_SBEC_CURRENT "BecA"
+#define ZSTR_RB3040_EXTRA_STATE "RBES"
+#define ZSTR_RB3040_CHANNEL1 "CH1A"
+#define ZSTR_RB3040_CHANNEL2 "CH2A"
+#define ZSTR_RB3040_CHANNEL3 "CH3A"
+#define ZSTR_RB3040_CHANNEL4 "CH4A"
+#define ZSTR_RB3040_CHANNEL5 "CH5A"
+#define ZSTR_RB3040_CHANNEL6 "CH6A"
+#define ZSTR_RB3040_CHANNEL7 "CH7A"
+#define ZSTR_RB3040_CHANNEL8 "CH8A"
+#define ZSTR_ESC_VIN "EVIN"
+#define ZSTR_ESC_TFET "TFET"
+#define ZSTR_ESC_CUR "ECUR"
+#define ZSTR_ESC_TBEC "TBEC"
+#define ZSTR_ESC_BCUR "CBEC"
+#define ZSTR_ESC_VBEC "VBEC"
+#define ZSTR_ESC_THR "ETHR"
+#define ZSTR_ESC_POUT "EOUT"
+#define ZSTR_SMART_BAT_BTMP "BTmp"
+#define ZSTR_SMART_BAT_BCUR "BCur"
+#define ZSTR_SMART_BAT_BCAP "BUse"
+#define ZSTR_SMART_BAT_MIN_CEL "CLMi"
+#define ZSTR_SMART_BAT_MAX_CEL "CLMa"
+#define ZSTR_SMART_BAT_CYCLES "Cycl"
+#define ZSTR_SMART_BAT_CAPACITY "BCpT"
+#define ZSTR_CL01 "Cel1"
+#define ZSTR_CL02 "Cel2"
+#define ZSTR_CL03 "Cel3"
+#define ZSTR_CL04 "Cel4"
+#define ZSTR_CL05 "Cel5"
+#define ZSTR_CL06 "Cel6"
+#define ZSTR_CL07 "Cel7"
+#define ZSTR_CL08 "Cel8"
+#define ZSTR_CL09 "Cel9"
+#define ZSTR_CL10 "Cl10"
+#define ZSTR_CL11 "Cl11"
+#define ZSTR_CL12 "Cl12"
+#define ZSTR_CL13 "Cl13"
+#define ZSTR_CL14 "Cl14"
+#define ZSTR_CL15 "Cl15"
+#define ZSTR_CL16 "Cl16"
+#define ZSTR_CL17 "Cl17"
+#define ZSTR_CL18 "Cl18"
\ No newline at end of file
diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt
index 19f24ff02..b3665f787 100644
--- a/radio/src/translations/fi.h.txt
+++ b/radio/src/translations/fi.h.txt
@@ -840,6 +840,8 @@
#define TR_FLASH_BOOTLOADER "Flash bootloader"
#define TR_FLASH_EXTERNAL_DEVICE "Flash External Device"
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ")
@@ -1178,6 +1180,7 @@
#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage")
#define TR_AUTH_FAILURE "Auth-failure"
+#define ZSTR_FLR "FLR"
#define ZSTR_RSSI "RSSI"
#define ZSTR_R9PW "R9PW"
#define ZSTR_RAS "SWR"
@@ -1265,7 +1268,7 @@
#define ZSTR_GATE_TIME "GteT"
#define ZSTR_ESC_VOLTAGE "EscV"
#define ZSTR_ESC_CURRENT "EscA"
-#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_RPM "Erpm"
#define ZSTR_ESC_CONSUMPTION "EscC"
#define ZSTR_ESC_TEMP "EscT"
#define ZSTR_SD1_CHANNEL "Chan"
@@ -1279,3 +1282,45 @@
#define ZSTR_GASSUIT_MAX_FLOW "GMFl"
#define ZSTR_SBEC_VOLTAGE "BecV"
#define ZSTR_SBEC_CURRENT "BecA"
+#define ZSTR_RB3040_EXTRA_STATE "RBES"
+#define ZSTR_RB3040_CHANNEL1 "CH1A"
+#define ZSTR_RB3040_CHANNEL2 "CH2A"
+#define ZSTR_RB3040_CHANNEL3 "CH3A"
+#define ZSTR_RB3040_CHANNEL4 "CH4A"
+#define ZSTR_RB3040_CHANNEL5 "CH5A"
+#define ZSTR_RB3040_CHANNEL6 "CH6A"
+#define ZSTR_RB3040_CHANNEL7 "CH7A"
+#define ZSTR_RB3040_CHANNEL8 "CH8A"
+#define ZSTR_ESC_VIN "EVIN"
+#define ZSTR_ESC_TFET "TFET"
+#define ZSTR_ESC_CUR "ECUR"
+#define ZSTR_ESC_TBEC "TBEC"
+#define ZSTR_ESC_BCUR "CBEC"
+#define ZSTR_ESC_VBEC "VBEC"
+#define ZSTR_ESC_THR "ETHR"
+#define ZSTR_ESC_POUT "EOUT"
+#define ZSTR_SMART_BAT_BTMP "BTmp"
+#define ZSTR_SMART_BAT_BCUR "BCur"
+#define ZSTR_SMART_BAT_BCAP "BUse"
+#define ZSTR_SMART_BAT_MIN_CEL "CLMi"
+#define ZSTR_SMART_BAT_MAX_CEL "CLMa"
+#define ZSTR_SMART_BAT_CYCLES "Cycl"
+#define ZSTR_SMART_BAT_CAPACITY "BCpT"
+#define ZSTR_CL01 "Cel1"
+#define ZSTR_CL02 "Cel2"
+#define ZSTR_CL03 "Cel3"
+#define ZSTR_CL04 "Cel4"
+#define ZSTR_CL05 "Cel5"
+#define ZSTR_CL06 "Cel6"
+#define ZSTR_CL07 "Cel7"
+#define ZSTR_CL08 "Cel8"
+#define ZSTR_CL09 "Cel9"
+#define ZSTR_CL10 "Cl10"
+#define ZSTR_CL11 "Cl11"
+#define ZSTR_CL12 "Cl12"
+#define ZSTR_CL13 "Cl13"
+#define ZSTR_CL14 "Cl14"
+#define ZSTR_CL15 "Cl15"
+#define ZSTR_CL16 "Cl16"
+#define ZSTR_CL17 "Cl17"
+#define ZSTR_CL18 "Cl18"
\ No newline at end of file
diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt
index 3dcde7dcd..c9bb7a649 100644
--- a/radio/src/translations/fr.h.txt
+++ b/radio/src/translations/fr.h.txt
@@ -842,6 +842,8 @@
#define TR_FLASH_BOOTLOADER "Flasher BootLoader"
#define TR_FLASH_EXTERNAL_DEVICE TR("Flasher S.Port", "Flasher S.Port externe")
#define TR_FLASH_RECEIVER_OTA "Flasher RX OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash module BT", "Flash module Bluetooth")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flasher pwr mngt unit"
#define TR_CURRENT_VERSION "Version courante :"
@@ -1193,6 +1195,7 @@
#define TR_RTC_CHECK TR("Vérif. RTC", "Vérif. pile RTC")
#define TR_AUTH_FAILURE "Auth-failure"
+#define ZSTR_FLR "FLR"
#define ZSTR_RSSI "RSSI"
#define ZSTR_R9PW "R9PW"
#define ZSTR_RAS "SWR"
@@ -1280,7 +1283,7 @@
#define ZSTR_GATE_TIME "GteT"
#define ZSTR_ESC_VOLTAGE "EscV"
#define ZSTR_ESC_CURRENT "EscA"
-#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_RPM "Erpm"
#define ZSTR_ESC_CONSUMPTION "EscC"
#define ZSTR_ESC_TEMP "EscT"
#define ZSTR_SD1_CHANNEL "Chan"
@@ -1295,3 +1298,45 @@
#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
#define ZSTR_SBEC_VOLTAGE "BecV"
#define ZSTR_SBEC_CURRENT "BecA"
+#define ZSTR_RB3040_EXTRA_STATE "RBES"
+#define ZSTR_RB3040_CHANNEL1 "CH1A"
+#define ZSTR_RB3040_CHANNEL2 "CH2A"
+#define ZSTR_RB3040_CHANNEL3 "CH3A"
+#define ZSTR_RB3040_CHANNEL4 "CH4A"
+#define ZSTR_RB3040_CHANNEL5 "CH5A"
+#define ZSTR_RB3040_CHANNEL6 "CH6A"
+#define ZSTR_RB3040_CHANNEL7 "CH7A"
+#define ZSTR_RB3040_CHANNEL8 "CH8A"
+#define ZSTR_ESC_VIN "EVIN"
+#define ZSTR_ESC_TFET "TFET"
+#define ZSTR_ESC_CUR "ECUR"
+#define ZSTR_ESC_TBEC "TBEC"
+#define ZSTR_ESC_BCUR "CBEC"
+#define ZSTR_ESC_VBEC "VBEC"
+#define ZSTR_ESC_THR "ETHR"
+#define ZSTR_ESC_POUT "EOUT"
+#define ZSTR_SMART_BAT_BTMP "BTmp"
+#define ZSTR_SMART_BAT_BCUR "BCur"
+#define ZSTR_SMART_BAT_BCAP "BUse"
+#define ZSTR_SMART_BAT_MIN_CEL "CLMi"
+#define ZSTR_SMART_BAT_MAX_CEL "CLMa"
+#define ZSTR_SMART_BAT_CYCLES "Cycl"
+#define ZSTR_SMART_BAT_CAPACITY "BCpT"
+#define ZSTR_CL01 "Cel1"
+#define ZSTR_CL02 "Cel2"
+#define ZSTR_CL03 "Cel3"
+#define ZSTR_CL04 "Cel4"
+#define ZSTR_CL05 "Cel5"
+#define ZSTR_CL06 "Cel6"
+#define ZSTR_CL07 "Cel7"
+#define ZSTR_CL08 "Cel8"
+#define ZSTR_CL09 "Cel9"
+#define ZSTR_CL10 "Cl10"
+#define ZSTR_CL11 "Cl11"
+#define ZSTR_CL12 "Cl12"
+#define ZSTR_CL13 "Cl13"
+#define ZSTR_CL14 "Cl14"
+#define ZSTR_CL15 "Cl15"
+#define ZSTR_CL16 "Cl16"
+#define ZSTR_CL17 "Cl17"
+#define ZSTR_CL18 "Cl18"
\ No newline at end of file
diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt
index 4644bf056..11f4c411c 100644
--- a/radio/src/translations/it.h.txt
+++ b/radio/src/translations/it.h.txt
@@ -842,6 +842,8 @@
#define TR_FLASH_BOOTLOADER "Prog. bootloader"
#define TR_FLASH_EXTERNAL_DEVICE "Progr. dispositivo Esterno"
#define TR_FLASH_RECEIVER_OTA TR("Prog. RX OTA", INDENT "Prog. ricevente OTA")
+#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Prog. mod. BT", INDENT "Prog. modulo Bluetooth")
#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Prog. PMU", "Program. PMU")
#define TR_CURRENT_VERSION TR("Vers. currente ", "Versione corrente: ")
@@ -1187,6 +1189,7 @@
#define TR_RTC_CHECK TR("Controllo RTC", "Controllo voltaggio RTC")
#define TR_AUTH_FAILURE "Auth-failure"
+#define ZSTR_FLR "FLR"
#define ZSTR_RSSI "RSSI"
#define ZSTR_R9PW "R9PW"
#define ZSTR_RAS "SWR"
@@ -1274,7 +1277,7 @@
#define ZSTR_GATE_TIME "GteT"
#define ZSTR_ESC_VOLTAGE "EscV"
#define ZSTR_ESC_CURRENT "EscA"
-#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_RPM "Erpm"
#define ZSTR_ESC_CONSUMPTION "EscC"
#define ZSTR_ESC_TEMP "EscT"
#define ZSTR_SD1_CHANNEL "Chan"
@@ -1289,3 +1292,45 @@
#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
#define ZSTR_SBEC_VOLTAGE "BecV"
#define ZSTR_SBEC_CURRENT "BecA"
+#define ZSTR_RB3040_EXTRA_STATE "RBES"
+#define ZSTR_RB3040_CHANNEL1 "CH1A"
+#define ZSTR_RB3040_CHANNEL2 "CH2A"
+#define ZSTR_RB3040_CHANNEL3 "CH3A"
+#define ZSTR_RB3040_CHANNEL4 "CH4A"
+#define ZSTR_RB3040_CHANNEL5 "CH5A"
+#define ZSTR_RB3040_CHANNEL6 "CH6A"
+#define ZSTR_RB3040_CHANNEL7 "CH7A"
+#define ZSTR_RB3040_CHANNEL8 "CH8A"
+#define ZSTR_ESC_VIN "EVIN"
+#define ZSTR_ESC_TFET "TFET"
+#define ZSTR_ESC_CUR "ECUR"
+#define ZSTR_ESC_TBEC "TBEC"
+#define ZSTR_ESC_BCUR "CBEC"
+#define ZSTR_ESC_VBEC "VBEC"
+#define ZSTR_ESC_THR "ETHR"
+#define ZSTR_ESC_POUT "EOUT"
+#define ZSTR_SMART_BAT_BTMP "BTmp"
+#define ZSTR_SMART_BAT_BCUR "BCur"
+#define ZSTR_SMART_BAT_BCAP "BUse"
+#define ZSTR_SMART_BAT_MIN_CEL "CLMi"
+#define ZSTR_SMART_BAT_MAX_CEL "CLMa"
+#define ZSTR_SMART_BAT_CYCLES "Cycl"
+#define ZSTR_SMART_BAT_CAPACITY "BCpT"
+#define ZSTR_CL01 "Cel1"
+#define ZSTR_CL02 "Cel2"
+#define ZSTR_CL03 "Cel3"
+#define ZSTR_CL04 "Cel4"
+#define ZSTR_CL05 "Cel5"
+#define ZSTR_CL06 "Cel6"
+#define ZSTR_CL07 "Cel7"
+#define ZSTR_CL08 "Cel8"
+#define ZSTR_CL09 "Cel9"
+#define ZSTR_CL10 "Cl10"
+#define ZSTR_CL11 "Cl11"
+#define ZSTR_CL12 "Cl12"
+#define ZSTR_CL13 "Cl13"
+#define ZSTR_CL14 "Cl14"
+#define ZSTR_CL15 "Cl15"
+#define ZSTR_CL16 "Cl16"
+#define ZSTR_CL17 "Cl17"
+#define ZSTR_CL18 "Cl18"
\ No newline at end of file
diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt
index 50d624d2c..9ff3650ce 100644
--- a/radio/src/translations/nl.h.txt
+++ b/radio/src/translations/nl.h.txt
@@ -828,6 +828,8 @@
#define TR_FLASH_BOOTLOADER "Flash bootloader"
#define TR_FLASH_EXTERNAL_DEVICE "Flash extern Apparaat"
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ")
@@ -1179,6 +1181,7 @@
#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage")
#define TR_AUTH_FAILURE "Auth-failure"
+#define ZSTR_FLR "FLR"
#define ZSTR_RSSI "RSSI"
#define ZSTR_R9PW "R9PW"
#define ZSTR_RAS "SWR"
@@ -1266,7 +1269,7 @@
#define ZSTR_GATE_TIME "GteT"
#define ZSTR_ESC_VOLTAGE "EscV"
#define ZSTR_ESC_CURRENT "EscA"
-#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_RPM "Erpm"
#define ZSTR_ESC_CONSUMPTION "EscC"
#define ZSTR_ESC_TEMP "EscT"
#define ZSTR_SD1_CHANNEL "Chan"
@@ -1281,3 +1284,45 @@
#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
#define ZSTR_SBEC_VOLTAGE "BecV"
#define ZSTR_SBEC_CURRENT "BecA"
+#define ZSTR_RB3040_EXTRA_STATE "RBES"
+#define ZSTR_RB3040_CHANNEL1 "CH1A"
+#define ZSTR_RB3040_CHANNEL2 "CH2A"
+#define ZSTR_RB3040_CHANNEL3 "CH3A"
+#define ZSTR_RB3040_CHANNEL4 "CH4A"
+#define ZSTR_RB3040_CHANNEL5 "CH5A"
+#define ZSTR_RB3040_CHANNEL6 "CH6A"
+#define ZSTR_RB3040_CHANNEL7 "CH7A"
+#define ZSTR_RB3040_CHANNEL8 "CH8A"
+#define ZSTR_ESC_VIN "EVIN"
+#define ZSTR_ESC_TFET "TFET"
+#define ZSTR_ESC_CUR "ECUR"
+#define ZSTR_ESC_TBEC "TBEC"
+#define ZSTR_ESC_BCUR "CBEC"
+#define ZSTR_ESC_VBEC "VBEC"
+#define ZSTR_ESC_THR "ETHR"
+#define ZSTR_ESC_POUT "EOUT"
+#define ZSTR_SMART_BAT_BTMP "BTmp"
+#define ZSTR_SMART_BAT_BCUR "BCur"
+#define ZSTR_SMART_BAT_BCAP "BUse"
+#define ZSTR_SMART_BAT_MIN_CEL "CLMi"
+#define ZSTR_SMART_BAT_MAX_CEL "CLMa"
+#define ZSTR_SMART_BAT_CYCLES "Cycl"
+#define ZSTR_SMART_BAT_CAPACITY "BCpT"
+#define ZSTR_CL01 "Cel1"
+#define ZSTR_CL02 "Cel2"
+#define ZSTR_CL03 "Cel3"
+#define ZSTR_CL04 "Cel4"
+#define ZSTR_CL05 "Cel5"
+#define ZSTR_CL06 "Cel6"
+#define ZSTR_CL07 "Cel7"
+#define ZSTR_CL08 "Cel8"
+#define ZSTR_CL09 "Cel9"
+#define ZSTR_CL10 "Cl10"
+#define ZSTR_CL11 "Cl11"
+#define ZSTR_CL12 "Cl12"
+#define ZSTR_CL13 "Cl13"
+#define ZSTR_CL14 "Cl14"
+#define ZSTR_CL15 "Cl15"
+#define ZSTR_CL16 "Cl16"
+#define ZSTR_CL17 "Cl17"
+#define ZSTR_CL18 "Cl18"
\ No newline at end of file
diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt
index 1034c98d9..e721da2ed 100644
--- a/radio/src/translations/pl.h.txt
+++ b/radio/src/translations/pl.h.txt
@@ -841,6 +841,8 @@
#define TR_FLASH_BOOTLOADER "Flash bootloader"
#define TR_FLASH_EXTERNAL_DEVICE "Sflashuj Moduł Zewnętrzny"
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ")
@@ -1186,6 +1188,7 @@
#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage")
#define TR_AUTH_FAILURE "Auth-failure"
+#define ZSTR_FLR "FLR"
#define ZSTR_RSSI "RSSI"
#define ZSTR_R9PW "R9PW"
#define ZSTR_RAS "SWR"
@@ -1273,7 +1276,7 @@
#define ZSTR_GATE_TIME "GteT"
#define ZSTR_ESC_VOLTAGE "EscV"
#define ZSTR_ESC_CURRENT "EscA"
-#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_RPM "Erpm"
#define ZSTR_ESC_CONSUMPTION "EscC"
#define ZSTR_ESC_TEMP "EscT"
#define ZSTR_SD1_CHANNEL "Chan"
@@ -1288,3 +1291,45 @@
#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
#define ZSTR_SBEC_VOLTAGE "BecV"
#define ZSTR_SBEC_CURRENT "BecA"
+#define ZSTR_RB3040_EXTRA_STATE "RBES"
+#define ZSTR_RB3040_CHANNEL1 "CH1A"
+#define ZSTR_RB3040_CHANNEL2 "CH2A"
+#define ZSTR_RB3040_CHANNEL3 "CH3A"
+#define ZSTR_RB3040_CHANNEL4 "CH4A"
+#define ZSTR_RB3040_CHANNEL5 "CH5A"
+#define ZSTR_RB3040_CHANNEL6 "CH6A"
+#define ZSTR_RB3040_CHANNEL7 "CH7A"
+#define ZSTR_RB3040_CHANNEL8 "CH8A"
+#define ZSTR_ESC_VIN "EVIN"
+#define ZSTR_ESC_TFET "TFET"
+#define ZSTR_ESC_CUR "ECUR"
+#define ZSTR_ESC_TBEC "TBEC"
+#define ZSTR_ESC_BCUR "CBEC"
+#define ZSTR_ESC_VBEC "VBEC"
+#define ZSTR_ESC_THR "ETHR"
+#define ZSTR_ESC_POUT "EOUT"
+#define ZSTR_SMART_BAT_BTMP "BTmp"
+#define ZSTR_SMART_BAT_BCUR "BCur"
+#define ZSTR_SMART_BAT_BCAP "BUse"
+#define ZSTR_SMART_BAT_MIN_CEL "CLMi"
+#define ZSTR_SMART_BAT_MAX_CEL "CLMa"
+#define ZSTR_SMART_BAT_CYCLES "Cycl"
+#define ZSTR_SMART_BAT_CAPACITY "BCpT"
+#define ZSTR_CL01 "Cel1"
+#define ZSTR_CL02 "Cel2"
+#define ZSTR_CL03 "Cel3"
+#define ZSTR_CL04 "Cel4"
+#define ZSTR_CL05 "Cel5"
+#define ZSTR_CL06 "Cel6"
+#define ZSTR_CL07 "Cel7"
+#define ZSTR_CL08 "Cel8"
+#define ZSTR_CL09 "Cel9"
+#define ZSTR_CL10 "Cl10"
+#define ZSTR_CL11 "Cl11"
+#define ZSTR_CL12 "Cl12"
+#define ZSTR_CL13 "Cl13"
+#define ZSTR_CL14 "Cl14"
+#define ZSTR_CL15 "Cl15"
+#define ZSTR_CL16 "Cl16"
+#define ZSTR_CL17 "Cl17"
+#define ZSTR_CL18 "Cl18"
\ No newline at end of file
diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt
index 6b3aaaf0e..87650f390 100644
--- a/radio/src/translations/pt.h.txt
+++ b/radio/src/translations/pt.h.txt
@@ -831,6 +831,8 @@
#define TR_FLASH_BOOTLOADER "Flash bootloader"
#define TR_FLASH_EXTERNAL_DEVICE "Flash External Device"
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ")
@@ -1175,6 +1177,7 @@
#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage")
#define TR_AUTH_FAILURE "Auth-failure"
+#define ZSTR_FLR "FLR"
#define ZSTR_RSSI "RSSI"
#define ZSTR_R9PW "R9PW"
#define ZSTR_RAS "SWR"
@@ -1262,7 +1265,7 @@
#define ZSTR_GATE_TIME "GteT"
#define ZSTR_ESC_VOLTAGE "EscV"
#define ZSTR_ESC_CURRENT "EscA"
-#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_RPM "Erpm"
#define ZSTR_ESC_CONSUMPTION "EscC"
#define ZSTR_ESC_TEMP "EscT"
#define ZSTR_SD1_CHANNEL "Chan"
@@ -1277,3 +1280,45 @@
#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
#define ZSTR_SBEC_VOLTAGE "BecV"
#define ZSTR_SBEC_CURRENT "BecA"
+#define ZSTR_RB3040_EXTRA_STATE "RBES"
+#define ZSTR_RB3040_CHANNEL1 "CH1A"
+#define ZSTR_RB3040_CHANNEL2 "CH2A"
+#define ZSTR_RB3040_CHANNEL3 "CH3A"
+#define ZSTR_RB3040_CHANNEL4 "CH4A"
+#define ZSTR_RB3040_CHANNEL5 "CH5A"
+#define ZSTR_RB3040_CHANNEL6 "CH6A"
+#define ZSTR_RB3040_CHANNEL7 "CH7A"
+#define ZSTR_RB3040_CHANNEL8 "CH8A"
+#define ZSTR_ESC_VIN "EVIN"
+#define ZSTR_ESC_TFET "TFET"
+#define ZSTR_ESC_CUR "ECUR"
+#define ZSTR_ESC_TBEC "TBEC"
+#define ZSTR_ESC_BCUR "CBEC"
+#define ZSTR_ESC_VBEC "VBEC"
+#define ZSTR_ESC_THR "ETHR"
+#define ZSTR_ESC_POUT "EOUT"
+#define ZSTR_SMART_BAT_BTMP "BTmp"
+#define ZSTR_SMART_BAT_BCUR "BCur"
+#define ZSTR_SMART_BAT_BCAP "BUse"
+#define ZSTR_SMART_BAT_MIN_CEL "CLMi"
+#define ZSTR_SMART_BAT_MAX_CEL "CLMa"
+#define ZSTR_SMART_BAT_CYCLES "Cycl"
+#define ZSTR_SMART_BAT_CAPACITY "BCpT"
+#define ZSTR_CL01 "Cel1"
+#define ZSTR_CL02 "Cel2"
+#define ZSTR_CL03 "Cel3"
+#define ZSTR_CL04 "Cel4"
+#define ZSTR_CL05 "Cel5"
+#define ZSTR_CL06 "Cel6"
+#define ZSTR_CL07 "Cel7"
+#define ZSTR_CL08 "Cel8"
+#define ZSTR_CL09 "Cel9"
+#define ZSTR_CL10 "Cl10"
+#define ZSTR_CL11 "Cl11"
+#define ZSTR_CL12 "Cl12"
+#define ZSTR_CL13 "Cl13"
+#define ZSTR_CL14 "Cl14"
+#define ZSTR_CL15 "Cl15"
+#define ZSTR_CL16 "Cl16"
+#define ZSTR_CL17 "Cl17"
+#define ZSTR_CL18 "Cl18"
\ No newline at end of file
diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt
index 663d90be3..6fba79f01 100644
--- a/radio/src/translations/se.h.txt
+++ b/radio/src/translations/se.h.txt
@@ -841,6 +841,8 @@
#define TR_FLASH_BOOTLOADER "Skriv BootLoader"
#define TR_FLASH_EXTERNAL_DEVICE "Flash External Device"
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA"
+#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ")
@@ -1186,6 +1188,7 @@
#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage")
#define TR_AUTH_FAILURE "Auth-failure"
+#define ZSTR_FLR "FLR"
#define ZSTR_RSSI "RSSI"
#define ZSTR_R9PW "R9PW"
#define ZSTR_RAS "SWR"
@@ -1273,7 +1276,7 @@
#define ZSTR_GATE_TIME "GteT"
#define ZSTR_ESC_VOLTAGE "EscV"
#define ZSTR_ESC_CURRENT "EscA"
-#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_RPM "Erpm"
#define ZSTR_ESC_CONSUMPTION "EscC"
#define ZSTR_ESC_TEMP "EscT"
#define ZSTR_SD1_CHANNEL "Chan"
@@ -1288,3 +1291,45 @@
#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
#define ZSTR_SBEC_VOLTAGE "BecV"
#define ZSTR_SBEC_CURRENT "BecA"
+#define ZSTR_RB3040_EXTRA_STATE "RBES"
+#define ZSTR_RB3040_CHANNEL1 "CH1A"
+#define ZSTR_RB3040_CHANNEL2 "CH2A"
+#define ZSTR_RB3040_CHANNEL3 "CH3A"
+#define ZSTR_RB3040_CHANNEL4 "CH4A"
+#define ZSTR_RB3040_CHANNEL5 "CH5A"
+#define ZSTR_RB3040_CHANNEL6 "CH6A"
+#define ZSTR_RB3040_CHANNEL7 "CH7A"
+#define ZSTR_RB3040_CHANNEL8 "CH8A"
+#define ZSTR_ESC_VIN "EVIN"
+#define ZSTR_ESC_TFET "TFET"
+#define ZSTR_ESC_CUR "ECUR"
+#define ZSTR_ESC_TBEC "TBEC"
+#define ZSTR_ESC_BCUR "CBEC"
+#define ZSTR_ESC_VBEC "VBEC"
+#define ZSTR_ESC_THR "ETHR"
+#define ZSTR_ESC_POUT "EOUT"
+#define ZSTR_SMART_BAT_BTMP "BTmp"
+#define ZSTR_SMART_BAT_BCUR "BCur"
+#define ZSTR_SMART_BAT_BCAP "BUse"
+#define ZSTR_SMART_BAT_MIN_CEL "CLMi"
+#define ZSTR_SMART_BAT_MAX_CEL "CLMa"
+#define ZSTR_SMART_BAT_CYCLES "Cycl"
+#define ZSTR_SMART_BAT_CAPACITY "BCpT"
+#define ZSTR_CL01 "Cel1"
+#define ZSTR_CL02 "Cel2"
+#define ZSTR_CL03 "Cel3"
+#define ZSTR_CL04 "Cel4"
+#define ZSTR_CL05 "Cel5"
+#define ZSTR_CL06 "Cel6"
+#define ZSTR_CL07 "Cel7"
+#define ZSTR_CL08 "Cel8"
+#define ZSTR_CL09 "Cel9"
+#define ZSTR_CL10 "Cl10"
+#define ZSTR_CL11 "Cl11"
+#define ZSTR_CL12 "Cl12"
+#define ZSTR_CL13 "Cl13"
+#define ZSTR_CL14 "Cl14"
+#define ZSTR_CL15 "Cl15"
+#define ZSTR_CL16 "Cl16"
+#define ZSTR_CL17 "Cl17"
+#define ZSTR_CL18 "Cl18"
\ No newline at end of file
diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h
index 15361a065..cbef5238b 100644
--- a/radio/src/translations/untranslated.h
+++ b/radio/src/translations/untranslated.h
@@ -125,4 +125,4 @@
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
#define LEN_MULTI_PROTOCOLS "\007"
-#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FSky 2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 "
+#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FSky 2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayangR""Pelikan""Tiger\0 ""WK\0 ""XN297DU""FrSkyX2""FrSkyR9"