diff --git a/CMakeLists.txt b/CMakeLists.txt
index a61bad048..5fd4eaf54 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,7 +6,7 @@ set(VERSION_REVISION "0")
set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX})
set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR})
set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX})
-set(SDCARD_REVISION "0025")
+set(SDCARD_REVISION "0026")
set(SDCARD_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}V${SDCARD_REVISION})
cmake_minimum_required(VERSION 2.8)
diff --git a/CREDITS.txt b/CREDITS.txt
index 3ed94c926..52e7ad5f4 100644
--- a/CREDITS.txt
+++ b/CREDITS.txt
@@ -1685,3 +1685,22 @@ Gary Garland
Stefano Boggia
Jean-Jacques Pointel
Ferenc Kunkli
+Sven Müller
+Taavi Tuisk
+Thomas Floyd
+Matthew LePard
+Peter Schneider
+Michel Garbarino
+Achim Stolze
+Fernando Rimoldi
+Bernard Delpy
+Daniel Dubovsky
+Jonathan Starch
+Coolwind
+Benoit Pichereau
+Darko Perković
+Burt Pickard-Richardson
+Roland Nittby
+Frank Barbas
+Scott McCoy
+Fabrice Debonnet
diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt
index e01657c33..b867acb74 100644
--- a/companion/src/CMakeLists.txt
+++ b/companion/src/CMakeLists.txt
@@ -351,6 +351,8 @@ elseif(PCB STREQUAL X10 AND PCBREV STREQUAL EXPRESS)
set(FLAVOUR x10express)
elseif(PCB STREQUAL X10 AND PCBREV STREQUAL T16)
set(FLAVOUR t16)
+elseif(PCB STREQUAL X10 AND PCBREV STREQUAL TX16S)
+ set(FLAVOUR tx16s)
else()
string(TOLOWER ${PCB} FLAVOUR)
endif()
diff --git a/companion/src/apppreferencesdialog.cpp b/companion/src/apppreferencesdialog.cpp
index c17d5c88d..63c260176 100644
--- a/companion/src/apppreferencesdialog.cpp
+++ b/companion/src/apppreferencesdialog.cpp
@@ -541,7 +541,7 @@ void AppPreferencesDialog::populateFirmwareOptions(const Firmware * firmware)
// TODO: Remove once splash replacement supported on Horus
// NOTE: 480x272 image causes issues on screens <800px high, needs a solution like scrolling once reinstated
- if (IS_HORUS(baseFw->getBoard())) {
+ if (IS_FAMILY_HORUS_OR_T16(baseFw->getBoard())) {
ui->widget_splashImage->hide();
ui->SplashFileName->setText("");
}
diff --git a/companion/src/companion.qrc b/companion/src/companion.qrc
index f91782c50..ce172fbb7 100644
--- a/companion/src/companion.qrc
+++ b/companion/src/companion.qrc
@@ -190,6 +190,17 @@
images/simulator/JumperT16/left_tele.png
images/simulator/JumperT16/right_ent.png
images/simulator/JumperT16/right_rtn.png
+ images/simulator/TX16S/left.png
+ images/simulator/TX16S/right.png
+ images/simulator/TX16S/top.png
+ images/simulator/TX16S/bottom.png
+ images/simulator/TX16S/left_page.png
+ images/simulator/TX16S/left_page2.png
+ images/simulator/TX16S/left_rtn.png
+ images/simulator/TX16S/left_sys.png
+ images/simulator/TX16S/left_tele.png
+ images/simulator/TX16S/right_ent.png
+ images/simulator/TX16S/right_mdl.png
images/wizard/ailerons.png
images/wizard/airbrakes.png
images/wizard/elevons.png
diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp
index acfc70004..cfadf5936 100644
--- a/companion/src/firmwares/boards.cpp
+++ b/companion/src/firmwares/boards.cpp
@@ -92,6 +92,8 @@ uint32_t Boards::getFourCC(Type board)
return 0x3D78746F;
case BOARD_JUMPER_T16:
return 0x3F78746F;
+ case BOARD_RADIOMASTER_TX16S:
+ return 0x3878746F;
case BOARD_UNKNOWN:
break;
}
@@ -132,6 +134,7 @@ int Boards::getEEpromSize(Board::Type board)
case BOARD_X10:
case BOARD_X10_EXPRESS:
case BOARD_JUMPER_T16:
+ case BOARD_RADIOMASTER_TX16S:
return 0;
}
@@ -169,6 +172,7 @@ int Boards::getFlashSize(Type board)
case BOARD_X10:
case BOARD_X10_EXPRESS:
case BOARD_JUMPER_T16:
+ case BOARD_RADIOMASTER_TX16S:
return FSIZE_HORUS;
case BOARD_UNKNOWN:
return FSIZE_MAX;
@@ -284,7 +288,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
return 2;
else if (IS_TARANIS_X9E(board))
return 4;
- else if (IS_HORUS_X10(board) || IS_JUMPER_T16(board))
+ else if (IS_HORUS_X10(board) || IS_FAMILY_T16(board))
return 5;
else if (IS_HORUS_X12S(board))
return 3;
@@ -300,13 +304,13 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
case Sliders:
if (IS_HORUS_X12S(board) || IS_TARANIS_X9E(board))
return 4;
- else if (IS_TARANIS_X9D(board) || IS_HORUS_X10(board) || IS_JUMPER_T16(board))
+ else if (IS_TARANIS_X9D(board) || IS_HORUS_X10(board) || IS_FAMILY_T16(board))
return 2;
else
return 0;
case MouseAnalogs:
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
return 2;
else
return 0;
@@ -343,7 +347,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
return 9;
else if (IS_TARANIS(board))
return 8;
- else if (IS_HORUS(board))
+ else if (IS_FAMILY_HORUS_OR_T16(board))
return 10;
else
return 7;
@@ -363,7 +367,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
return 9;
case NumTrims:
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
return 6;
else
return 4;
@@ -467,7 +471,7 @@ QString Boards::getAnalogInputName(Board::Type board, int index)
if (index < DIM(pots))
return pots[index];
}
- else if (IS_HORUS_X10(board) || IS_JUMPER_T16(board)) {
+ else if (IS_HORUS_X10(board) || IS_FAMILY_T16(board)) {
const QString pots[] = {
"S1",
"6P",
@@ -536,6 +540,8 @@ QString Boards::getBoardName(Board::Type board)
return "Horus X10/X10S Express";
case BOARD_JUMPER_T16:
return "Jumper T16";
+ case BOARD_RADIOMASTER_TX16S:
+ return "Radiomaster TX16S";
default:
return tr("Unknown");
}
diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h
index 74e690ebf..e4149a298 100644
--- a/companion/src/firmwares/boards.h
+++ b/companion/src/firmwares/boards.h
@@ -54,9 +54,10 @@ namespace Board {
BOARD_TARANIS_X9LITES,
BOARD_JUMPER_T12,
BOARD_JUMPER_T16,
+ BOARD_RADIOMASTER_TX16S,
};
- constexpr int BOARD_TYPE_MAX = BOARD_JUMPER_T16 ;
+ constexpr int BOARD_TYPE_MAX = BOARD_RADIOMASTER_TX16S ;
enum PotType
{
@@ -230,6 +231,16 @@ inline bool IS_JUMPER_T16(Board::Type board)
return board == Board::BOARD_JUMPER_T16;
}
+inline bool IS_RADIOMASTER_TX16S(Board::Type board)
+{
+ return board == Board::BOARD_RADIOMASTER_TX16S;
+}
+
+inline bool IS_FAMILY_T16(Board::Type board)
+{
+ return board == Board::BOARD_JUMPER_T16 || board == Board::BOARD_RADIOMASTER_TX16S;
+}
+
inline bool IS_TARANIS_XLITE(Board::Type board)
{
return board == Board::BOARD_TARANIS_XLITE || board == Board::BOARD_TARANIS_XLITES;
@@ -300,19 +311,24 @@ inline bool IS_HORUS_X12S(Board::Type board)
return board == Board::BOARD_HORUS_X12S;
}
-inline bool IS_HORUS(Board::Type board)
+inline bool IS_FAMILY_HORUS(Board::Type board)
{
- return IS_HORUS_X12S(board) || IS_HORUS_X10(board) || IS_JUMPER_T16(board);
+ return IS_HORUS_X12S(board) || IS_HORUS_X10(board);
+}
+
+inline bool IS_FAMILY_HORUS_OR_T16(Board::Type board)
+{
+ return IS_FAMILY_HORUS(board) || IS_FAMILY_T16(board);
}
inline bool IS_HORUS_OR_TARANIS(Board::Type board)
{
- return IS_HORUS(board) || IS_TARANIS(board);
+ return IS_FAMILY_HORUS_OR_T16(board) || IS_TARANIS(board);
}
inline bool IS_STM32(Board::Type board)
{
- return IS_TARANIS(board) || IS_HORUS(board);
+ return IS_TARANIS(board) || IS_FAMILY_HORUS_OR_T16(board);
}
inline bool IS_ARM(Board::Type board)
@@ -322,7 +338,7 @@ inline bool IS_ARM(Board::Type board)
inline bool HAS_LARGE_LCD(Board::Type board)
{
- return IS_HORUS(board) || IS_TARANIS_X9(board);
+ return IS_FAMILY_HORUS_OR_T16(board) || IS_TARANIS_X9(board);
}
inline bool HAS_EXTERNAL_ANTENNA(Board::Type board)
@@ -333,7 +349,7 @@ inline bool HAS_EXTERNAL_ANTENNA(Board::Type board)
inline bool IS_ACCESS_RADIO(Board::Type board, QString &id)
{
return (IS_TARANIS_XLITES(board) || IS_TARANIS_X9LITE(board) || board == Board::BOARD_TARANIS_X9DP_2019 || board == Board::BOARD_X10_EXPRESS || IS_TARANIS_X7_ACCESS(board) ||
- (IS_HORUS(board) && id.contains("internalaccess")));
+ (IS_FAMILY_HORUS_OR_T16(board) && id.contains("internalaccess")));
}
#endif // _BOARDS_H_
diff --git a/companion/src/firmwares/generalsettings.cpp b/companion/src/firmwares/generalsettings.cpp
index 6cb9fdb9f..1676e913c 100644
--- a/companion/src/firmwares/generalsettings.cpp
+++ b/companion/src/firmwares/generalsettings.cpp
@@ -88,7 +88,7 @@ GeneralSettings::GeneralSettings()
vBatMin = -5; //8,5V
vBatMax = -5; //11,5V
}
- else if (IS_TARANIS_XLITE(board) || IS_HORUS_X10(board) || IS_JUMPER_T16(board)) {
+ else if (IS_TARANIS_XLITE(board) || IS_HORUS_X10(board) || IS_FAMILY_T16(board)) {
// Lipo 2S
vBatWarn = 66;
vBatMin = -23; // 6.7V
@@ -106,7 +106,7 @@ GeneralSettings::GeneralSettings()
backlightMode = 3; // keys and sticks
// backlightBright = 0; // 0 = 100%
- if (IS_HORUS(board)) {
+ if (IS_FAMILY_HORUS_OR_T16(board)) {
backlightOffBright = 20;
}
@@ -116,7 +116,7 @@ GeneralSettings::GeneralSettings()
if (IS_JUMPER_T16(board))
strcpy(bluetoothName, "t16");
- else if (IS_HORUS(board)) {
+ else if (IS_FAMILY_HORUS_OR_T16(board)) {
strcpy(bluetoothName, "horus");
}
else if (IS_TARANIS_X9E(board) || IS_TARANIS_SMALL(board)) {
@@ -236,7 +236,7 @@ void GeneralSettings::setDefaultControlTypes(Board::Type board)
}
// TODO: move to Boards, like with switches
- if (IS_HORUS(board)) {
+ if (IS_FAMILY_HORUS_OR_T16(board)) {
potConfig[0] = Board::POT_WITH_DETENT;
potConfig[1] = Board::POT_MULTIPOS_SWITCH;
potConfig[2] = Board::POT_WITH_DETENT;
@@ -269,7 +269,7 @@ void GeneralSettings::setDefaultControlTypes(Board::Type board)
sliderConfig[2] = Board::SLIDER_WITH_DETENT;
sliderConfig[3] = Board::SLIDER_WITH_DETENT;
}
- else if (IS_TARANIS_X9(board) || IS_HORUS_X10(board) || IS_JUMPER_T16(board)) {
+ else if (IS_TARANIS_X9(board) || IS_HORUS_X10(board) || IS_FAMILY_T16(board)) {
sliderConfig[0] = Board::SLIDER_WITH_DETENT;
sliderConfig[1] = Board::SLIDER_WITH_DETENT;
}
@@ -313,27 +313,27 @@ void GeneralSettings::convert(RadioDataConversionState & cstate)
// SE and SG are skipped on X7 board
if (IS_TARANIS_X7(cstate.toType)) {
- if (IS_TARANIS_X9(cstate.fromType) || IS_HORUS(cstate.fromType)) {
+ if (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType)) {
strncpy(switchName[4], switchName[5], sizeof(switchName[4]));
strncpy(switchName[5], switchName[7], sizeof(switchName[5]));
}
}
else if (IS_TARANIS_X7(cstate.fromType)) {
- if (IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) {
+ if (IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) {
strncpy(switchName[5], switchName[4], sizeof(switchName[5]));
strncpy(switchName[7], switchName[5], sizeof(switchName[7]));
}
}
if (IS_JUMPER_T12(cstate.toType)) {
- if (IS_TARANIS_X9(cstate.fromType) || IS_HORUS(cstate.fromType)) {
+ if (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType)) {
strncpy(switchName[4], switchName[5], sizeof(switchName[0]));
strncpy(switchName[5], switchName[7], sizeof(switchName[0]));
}
}
else if (IS_JUMPER_T12(cstate.fromType)) {
- if (IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) {
+ if (IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) {
strncpy(switchName[5], switchName[4], sizeof(switchName[0]));
strncpy(switchName[7], switchName[5], sizeof(switchName[0]));
}
@@ -349,7 +349,7 @@ void GeneralSettings::convert(RadioDataConversionState & cstate)
strncpy(sliderName[3], sliderName[1], sizeof(sliderName[3]));
}
- if (IS_HORUS(cstate.toType)) {
+ if (IS_FAMILY_HORUS_OR_T16(cstate.toType)) {
// 6P switch is only on Horus (by default)
if (cstate.fromBoard.getCapability(Board::FactoryInstalledPots) == 2) {
strncpy(potName[2], potName[1], sizeof(potName[2]));
diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp
index 18dfc7379..3609713a5 100644
--- a/companion/src/firmwares/opentx/opentxeeprom.cpp
+++ b/companion/src/firmwares/opentx/opentxeeprom.cpp
@@ -36,7 +36,7 @@ inline int MAX_SWITCHES(Board::Type board, int version)
if (version <= 218) {
if (IS_TARANIS_X7(board))
return 6;
- if (IS_TARANIS_X9D(board) || IS_HORUS(board))
+ if (IS_TARANIS_X9D(board) || IS_FAMILY_HORUS_OR_T16(board))
return 8;
if (IS_TARANIS_XLITE(board))
return 4;
@@ -63,7 +63,7 @@ inline int MAX_SWITCHES_POSITION(Board::Type board, int version)
inline int POTS_CONFIG_SIZE(Board::Type board, int version)
{
- if (version >= 219 && IS_HORUS(board))
+ if (version >= 219 && IS_FAMILY_HORUS_OR_T16(board))
return 16;
return 8;
@@ -71,44 +71,44 @@ inline int POTS_CONFIG_SIZE(Board::Type board, int version)
inline int MAX_POTS(Board::Type board, int version)
{
- if (version <= 218 && IS_HORUS(board))
+ if (version <= 218 && IS_FAMILY_HORUS_OR_T16(board))
return 3;
return Boards::getCapability(board, Board::Pots);
}
inline int MAX_POTS_STORAGE(Board::Type board, int version)
{
- if (version <= 218 && IS_HORUS(board))
+ if (version <= 218 && IS_FAMILY_HORUS_OR_T16(board))
return 3;
- if (version >= 219 && IS_HORUS(board))
+ if (version >= 219 && IS_FAMILY_HORUS_OR_T16(board))
return 5;
return Boards::getCapability(board, Board::Pots);
}
inline int MAX_POTS_SOURCES(Board::Type board, int version)
{
- if (version <= 218 && IS_HORUS(board))
+ if (version <= 218 && IS_FAMILY_HORUS_OR_T16(board))
return 5;
return Boards::getCapability(board, Board::Pots);
}
inline int MAX_SLIDERS_STORAGE(Board::Type board, int version)
{
- if (version >= 219 && IS_HORUS(board))
+ if (version >= 219 && IS_FAMILY_HORUS_OR_T16(board))
return 4;
return Boards::getCapability(board, Board::Sliders);
}
inline int MAX_SLIDERS_SOURCES(Board::Type board, int version)
{
- if (version <= 218 && IS_HORUS(board))
+ if (version <= 218 && IS_FAMILY_HORUS_OR_T16(board))
return 2;
return Boards::getCapability(board, Board::Sliders);
}
inline int SLIDERS_CONFIG_SIZE(Board::Type board, int version)
{
- if (version >= 219 && IS_HORUS(board))
+ if (version >= 219 && IS_FAMILY_HORUS_OR_T16(board))
return 8;
return 4;
@@ -119,7 +119,7 @@ inline int SWITCHES_CONFIG_SIZE(Board::Type board, int version)
if (IS_TARANIS_X9E(board))
return 64;
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
return 32;
if (version >= 219 && IS_TARANIS_X9D(board))
@@ -139,11 +139,11 @@ inline int SWITCHES_CONFIG_SIZE(Board::Type board, int version)
#define MAX_CUSTOM_FUNCTIONS(board, version) 64
#define MAX_CURVES(board, version) ((version >= 219 || HAS_LARGE_LCD(board)) ? 32 : 16)
#define MAX_GVARS(board, version) 9
-#define MAX_SCRIPTS(board) (IS_HORUS(board) ? 9 : 7)
-#define MAX_TELEMETRY_SENSORS(board, version) (version <= 218 ? 32 : ((IS_HORUS(board) || IS_TARANIS_X9(board)) ? 60 : 40))
+#define MAX_SCRIPTS(board) (IS_FAMILY_HORUS_OR_T16(board) ? 9 : 7)
+#define MAX_TELEMETRY_SENSORS(board, version) (version <= 218 ? 32 : ((IS_FAMILY_HORUS_OR_T16(board) || IS_TARANIS_X9(board)) ? 60 : 40))
#define NUM_PPM_INPUTS(board, version) 16
#define ROTENC_COUNT(board, version) ((IS_STM32(board) && version >= 218) ? 0 : 1)
-#define MAX_AUX_TRIMS(board) (IS_HORUS(board) ? 2 : 0)
+#define MAX_AUX_TRIMS(board) (IS_FAMILY_HORUS_OR_T16(board) ? 2 : 0)
inline int switchIndex(int i, Board::Type board, unsigned int version)
{
@@ -810,7 +810,7 @@ class MixField: public TransformedField {
internalField.Append(new UnsignedField<8>(this, mix.delayDown));
internalField.Append(new UnsignedField<8>(this, mix.speedUp));
internalField.Append(new UnsignedField<8>(this, mix.speedDown));
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
internalField.Append(new ZCharField<6>(this, mix.name));
else if (HAS_LARGE_LCD(board) && version <= 218)
internalField.Append(new ZCharField<8>(this, mix.name));
@@ -946,7 +946,7 @@ class InputField: public TransformedField {
internalField.Append(new UnsignedField<9>(this, expo.flightModes));
internalField.Append(new SignedField<8>(this, _weight, "Weight"));
internalField.Append(new SpareBitsField<1>(this));
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
internalField.Append(new ZCharField<6>(this, expo.name));
else if (HAS_LARGE_LCD(board) && version <= 218)
internalField.Append(new ZCharField<8>(this, expo.name));
@@ -1809,7 +1809,7 @@ class Frsky218Field: public StructField {
rssiConversionTable[0] = RSSIConversionTable(0);
rssiConversionTable[1] = RSSIConversionTable(1);
- if (!IS_HORUS(board)) {
+ if (!IS_FAMILY_HORUS_OR_T16(board)) {
Append(new UnsignedField<8>(this, frsky.voltsSource, "Volts Source"));
Append(new UnsignedField<8>(this, frsky.altitudeSource, "Altitude Source"));
@@ -2251,7 +2251,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig
qDebug() << QString("OpenTxModelData::OpenTxModelData(name: %1, board: %2, ver: %3, var: %4)").arg(name).arg(board).arg(version).arg(variant);
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
internalField.Append(new ZCharField<15>(this, modelData.name, "Model name"));
else if (HAS_LARGE_LCD(board))
internalField.Append(new ZCharField<12>(this, modelData.name, "Model name"));
@@ -2262,7 +2262,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig
internalField.Append(new UnsignedField<8>(this, modelData.moduleData[1].modelId));
if (HAS_LARGE_LCD(board)) {
- if (version >= 219 && IS_HORUS(board))
+ if (version >= 219 && IS_FAMILY_HORUS_OR_T16(board))
internalField.Append(new CharField<14>(this, modelData.bitmap, true, "Model bitmap"));
else
internalField.Append(new CharField<10>(this, modelData.bitmap, true, "Model bitmap"));
@@ -2330,7 +2330,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig
internalField.Append(new UnsignedField<8>(this, modelData.thrTraceSrc, "Throttle Source"));
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
internalField.Append(new SwitchesWarningField<32>(this, modelData.switchWarningStates, board, version));
else if (IS_TARANIS_X9E(board))
internalField.Append(new SwitchesWarningField<64>(this, modelData.switchWarningStates, board, version));
@@ -2345,7 +2345,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig
internalField.Append(new UnsignedField<32>(this, modelData.switchWarningEnable));
else if (version >= 219 && IS_TARANIS_X9D(board))
internalField.Append(new UnsignedField<16>(this, modelData.switchWarningEnable));
- else if (!IS_HORUS(board))
+ else if (!IS_FAMILY_HORUS_OR_T16(board))
internalField.Append(new UnsignedField<8>(this, modelData.switchWarningEnable));
for (int i=0; i(this, modelData.toplcdTimer));
}
- if (IS_HORUS(board)) {
+ if (IS_FAMILY_HORUS_OR_T16(board)) {
for (int i = 0; i < 5; i++) {
internalField.Append(new CharField<610>(this, modelData.customScreenData[i], false, "Custom screen blob"));
}
@@ -2508,7 +2508,7 @@ void OpenTxModelData::beforeExport()
{
// qDebug() << QString("before export model") << modelData.name;
- if (IS_HORUS(board)) {
+ if (IS_FAMILY_HORUS_OR_T16(board)) {
uint32_t newSwitchWarningStates = 0;
for (int i = 0; i < MAX_SWITCHES(board, version); i++) {
uint8_t value = (modelData.switchWarningStates >> (2*i)) & 0x03;
@@ -2524,7 +2524,7 @@ void OpenTxModelData::afterImport()
{
qCDebug(eepromImport) << QString("OpenTxModelData::afterImport()") << modelData.name;
- if (IS_HORUS(board)) {
+ if (IS_FAMILY_HORUS_OR_T16(board)) {
uint32_t newSwitchWarningStates = 0;
for (int i = 0; i < MAX_SWITCHES(board, version); i++) {
uint8_t value = (modelData.switchWarningStates >> (3*i)) & 0x07;
@@ -2572,7 +2572,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
internalField.Append(new UnsignedField<16>(this, chkSum));
- if (!IS_HORUS(board)) {
+ if (!IS_FAMILY_HORUS_OR_T16(board)) {
internalField.Append(new UnsignedField<8>(this, generalData.currModelIndex));
internalField.Append(new UnsignedField<8>(this, generalData.contrast));
}
@@ -2617,7 +2617,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
internalField.Append(new UnsignedField<8>(this, generalData.inactivityTimer));
internalField.Append(new UnsignedField<3>(this, generalData.telemetryBaudrate));
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
internalField.Append(new SpareBitsField<3>(this));
else if (IS_TARANIS(board))
internalField.Append(new SignedField<3>(this, generalData.splashDuration));
@@ -2632,11 +2632,11 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
internalField.Append(new SignedField<8>(this, generalData.PPM_Multiplier));
internalField.Append(new SignedField<8>(this, generalData.hapticLength));
- if (version < 218 || (!IS_TARANIS(board) && !IS_HORUS(board))) {
+ if (version < 218 || (!IS_TARANIS(board) && !IS_FAMILY_HORUS_OR_T16(board))) {
internalField.Append(new UnsignedField<8>(this, generalData.reNavigation));
}
- if (!IS_TARANIS(board) && !IS_HORUS(board)) {
+ if (!IS_TARANIS(board) && !IS_FAMILY_HORUS_OR_T16(board)) {
internalField.Append(new UnsignedField<8>(this, generalData.stickReverse));
}
@@ -2715,7 +2715,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
if (IS_STM32(board)) {
if (version >= 218) {
internalField.Append(new UnsignedField<4>(this, generalData.auxSerialMode));
- if (IS_HORUS(board) && version >= 219) {
+ if (IS_FAMILY_HORUS_OR_T16(board) && version >= 219) {
internalField.Append(new SpareBitsField<4>(this));
}
else {
@@ -2735,7 +2735,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
}
}
- if (IS_HORUS(board)) {
+ if (IS_FAMILY_HORUS_OR_T16(board)) {
for (int i=0; i(this, generalData.switchConfig[i]));
@@ -2747,7 +2747,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
for (int i=0; i= 3))
+ if (version <= 218 && IS_FAMILY_HORUS_OR_T16(board) && (i >= 3))
offset += 2;
if (i < MAX_POTS_STORAGE(board, version))
@@ -2756,7 +2756,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
internalField.Append(new SpareBitsField<2>(this));
}
- if (IS_HORUS(board) && version >= 219) {
+ if (IS_FAMILY_HORUS_OR_T16(board) && version >= 219) {
for (int i=0; i(this, generalData.sliderConfig[i]));
@@ -2765,7 +2765,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
}
}
- if (!IS_HORUS(board)) {
+ if (!IS_FAMILY_HORUS_OR_T16(board)) {
internalField.Append(new UnsignedField<8>(this, generalData.backlightColor));
}
}
@@ -2793,7 +2793,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
}
}
- if (IS_HORUS(board)) {
+ if (IS_FAMILY_HORUS_OR_T16(board)) {
for (int i=0; i(this, generalData.switchName[i], "Switch name"));
}
@@ -2832,7 +2832,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
}
}
- if (IS_HORUS(board)) {
+ if (IS_FAMILY_HORUS_OR_T16(board)) {
internalField.Append(new SpareBitsField<1>(this));
internalField.Append(new UnsignedField<7>(this, generalData.backlightOffBright));
internalField.Append(new ZCharField<10>(this, generalData.bluetoothName, "Bluetooth name"));
@@ -2842,7 +2842,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
internalField.Append(new ZCharField<10>(this, generalData.bluetoothName, "Bluetooth name"));
}
- if (IS_HORUS(board)) {
+ if (IS_FAMILY_HORUS_OR_T16(board)) {
internalField.Append(new CharField<8>(this, generalData.themeName, true, "Theme name"));
for (int i=0; i<5; i++) {
internalField.Append(new CharField<8>(this, (char *)generalData.themeOptionValue[i], true, "Theme blob"));
diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp
index 741db16b6..d22964cb0 100644
--- a/companion/src/firmwares/opentx/opentxinterface.cpp
+++ b/companion/src/firmwares/opentx/opentxinterface.cpp
@@ -70,6 +70,8 @@ const char * OpenTxEepromInterface::getName()
return "OpenTX for Jumper T12";
case BOARD_JUMPER_T16:
return "OpenTX for Jumper T16";
+ case BOARD_RADIOMASTER_TX16S:
+ return "OpenTX for Radiomaster TX16S";
case BOARD_TARANIS_X9D:
return "OpenTX for FrSky Taranis X9D";
case BOARD_TARANIS_X9DP:
@@ -175,7 +177,7 @@ bool OpenTxEepromInterface::loadFromByteArray(T & dest, const QByteArray & data)
{
uint32_t fourcc = *((uint32_t*)&data.data()[0]);
if (Boards::getFourCC(board) != fourcc) {
- if (IS_HORUS(board) && fourcc == 0x3178396F) {
+ if (IS_FAMILY_HORUS_OR_T16(board) && fourcc == 0x3178396F) {
qDebug() << QString().sprintf("%s: Deprecated fourcc used %x vs %x", getName(), fourcc, Boards::getFourCC(board));
}
else {
@@ -441,7 +443,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
{
switch (capability) {
case Models:
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
return 0;
else if (IS_ARM(board))
return 60;
@@ -457,7 +459,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
else
return id.contains("imperial") ? 1 : 0;
case ModelImage:
- return (board == BOARD_TARANIS_X9D || IS_TARANIS_PLUS(board) || board == BOARD_TARANIS_X9DP_2019 || IS_HORUS(board));
+ return (board == BOARD_TARANIS_X9D || IS_TARANIS_PLUS(board) || board == BOARD_TARANIS_X9DP_2019 || IS_FAMILY_HORUS_OR_T16(board));
case HasBeeper:
return (!IS_ARM(board));
case HasPxxCountry:
@@ -495,7 +497,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
else
return 0;
case ModelName:
- return (IS_HORUS(board) ? 15 : (HAS_LARGE_LCD(board) ? 12 : 10));
+ return (IS_FAMILY_HORUS_OR_T16(board) ? 15 : (HAS_LARGE_LCD(board) ? 12 : 10));
case FlightModesName:
return (IS_HORUS_OR_TARANIS(board) ? 10 : 6);
case GvarsName:
@@ -562,7 +564,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case SoundPitch:
return 1;
case Haptic:
- return (IS_2560(board) || IS_SKY9X(board) || IS_TARANIS_PLUS(board) || IS_TARANIS_SMALL(board) || IS_TARANIS_X9E(board) || IS_HORUS(board) || IS_JUMPER_T12(board) || id.contains("haptic"));
+ return (IS_2560(board) || IS_SKY9X(board) || IS_TARANIS_PLUS(board) || IS_TARANIS_SMALL(board) || IS_TARANIS_X9E(board) || IS_FAMILY_HORUS_OR_T16(board) || IS_JUMPER_T12(board) || id.contains("haptic"));
case ModelTrainerEnable:
if (IS_HORUS_OR_TARANIS(board) && board!=Board::BOARD_TARANIS_XLITE)
return 1;
@@ -610,7 +612,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case TelemetryBars:
return 1;
case TelemetryCustomScreens:
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
return 0;
else
return IS_ARM(board) ? 4 : 2;
@@ -663,7 +665,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case HasSDLogs:
return ((IS_2560(board) || IS_ARM(board)) ? true : false);
case LcdWidth:
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
return 480;
else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
return 128;
@@ -672,12 +674,12 @@ int OpenTxFirmware::getCapability(::Capability capability)
else
return 128;
case LcdHeight:
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
return 272;
else
return 64;
case LcdDepth:
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
return 16;
else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
return 1;
@@ -747,7 +749,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case DangerousFunctions:
return id.contains("danger") ? 1 : 0;
case HasModelCategories:
- return IS_HORUS(board);
+ return IS_FAMILY_HORUS_OR_T16(board);
case HasSwitchableJack:
return IS_TARANIS_XLITES(board);
case PwrButtonPress:
@@ -782,9 +784,9 @@ bool OpenTxFirmware::isAvailable(PulsesProtocol proto, int port)
return true;
case PULSES_PXX_XJT_X16:
case PULSES_PXX_XJT_LR12:
- return !IS_ACCESS_RADIO(board, id) && board != BOARD_JUMPER_T16;
+ return !IS_ACCESS_RADIO(board, id) && !IS_FAMILY_T16(board);
case PULSES_PXX_XJT_D8:
- return !(IS_ACCESS_RADIO(board, id) || id.contains("eu")) && board != BOARD_JUMPER_T16;
+ return !(IS_ACCESS_RADIO(board, id) || id.contains("eu")) && !IS_FAMILY_T16(board);
case PULSES_PPM:
return id.contains("internalppm");
case PULSES_ACCESS_ISRM:
@@ -814,7 +816,7 @@ bool OpenTxFirmware::isAvailable(PulsesProtocol proto, int port)
case PULSES_CROSSFIRE:
return true;
case PULSES_ACCESS_R9M:
- return IS_TARANIS_XLITE(board) || IS_TARANIS_X9LITE(board) || board == BOARD_TARANIS_X9DP_2019 || board == BOARD_X10_EXPRESS || (IS_HORUS(board) && id.contains("internalaccess"));
+ return IS_TARANIS_XLITE(board) || IS_TARANIS_X9LITE(board) || board == BOARD_TARANIS_X9DP_2019 || board == BOARD_X10_EXPRESS || (IS_FAMILY_HORUS_OR_T16(board) && id.contains("internalaccess"));
case PULSES_PXX_R9M_LITE:
case PULSES_ACCESS_R9M_LITE:
case PULSES_ACCESS_R9M_LITE_PRO:
@@ -1170,14 +1172,22 @@ void addOpenTxCommonOptions(OpenTxFirmware * firmware)
firmware->addOption("nooverridech", Firmware::tr("No OverrideCH functions available"));
}
-void addOpenTxRfOptions(OpenTxFirmware * firmware, bool flex = true)
+enum RfOptions {
+ NONE = 0,
+ EU = 1 << 0,
+ FLEX = 1 << 1
+};
+
+void addOpenTxRfOptions(OpenTxFirmware * firmware, uint8_t options)
{
static const Firmware::Option opt_eu("eu", Firmware::tr("Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015"));
static const Firmware::Option opt_fl("flexr9m", Firmware::tr("Enable non certified firmwares"));
- if (flex)
+ if (options == EU + FLEX)
firmware->addOptionsGroup({opt_eu, opt_fl});
- else
+ else if (options == EU)
firmware->addOption(opt_eu);
+ else if (options == FLEX)
+ firmware->addOption(opt_fl);
}
void addOpenTxFontOptions(OpenTxFirmware * firmware)
@@ -1191,7 +1201,6 @@ void addOpenTxFrskyOptions(OpenTxFirmware * firmware)
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"));
- addOpenTxRfOptions(firmware);
}
void addOpenTxTaranisOptions(OpenTxFirmware * firmware)
@@ -1220,7 +1229,7 @@ void addOpenTxArm9xOptions(OpenTxFirmware * firmware, bool dblkeys = true)
if (dblkeys)
firmware->addOption("dblkeys", Firmware::tr("Enable resetting values by pressing up and down at the same time"));
addOpenTxFontOptions(firmware);
- addOpenTxRfOptions(firmware, true);
+ addOpenTxRfOptions(firmware, FLEX);
}
void registerOpenTxFirmwares()
@@ -1233,11 +1242,13 @@ void registerOpenTxFirmwares()
addOpenTxTaranisOptions(firmware);
addPPMInternalModuleHack(firmware);
registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, EU + FLEX);
/* FrSky Taranis X9D+ 2019 board */
firmware = new OpenTxFirmware("opentx-x9d+2019", Firmware::tr("FrSky Taranis X9D+ 2019"), BOARD_TARANIS_X9DP_2019);
addOpenTxTaranisOptions(firmware);
registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, FLEX);
/* FrSky Taranis X9D board */
firmware = new OpenTxFirmware("opentx-x9d", Firmware::tr("FrSky Taranis X9D"), BOARD_TARANIS_X9D);
@@ -1245,6 +1256,7 @@ void registerOpenTxFirmwares()
addOpenTxTaranisOptions(firmware);
addPPMInternalModuleHack(firmware);
registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, EU + FLEX);
/* FrSky Taranis X9E board */
firmware = new OpenTxFirmware("opentx-x9e", Firmware::tr("FrSky Taranis X9E"), BOARD_TARANIS_X9E);
@@ -1253,48 +1265,57 @@ void registerOpenTxFirmwares()
addOpenTxTaranisOptions(firmware);
addPPMInternalModuleHack(firmware);
registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, EU + FLEX);
/* FrSky X9-Lite board */
firmware = new OpenTxFirmware("opentx-x9lite", Firmware::tr("FrSky Taranis X9-Lite"), BOARD_TARANIS_X9LITE);
addOpenTxTaranisOptions(firmware);
registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, FLEX);
/* FrSky X9-LiteS board */
firmware = new OpenTxFirmware("opentx-x9lites", Firmware::tr("FrSky Taranis X9-Lite S"), BOARD_TARANIS_X9LITES);
addOpenTxTaranisOptions(firmware);
registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, FLEX);
/* FrSky X7 board */
firmware = new OpenTxFirmware("opentx-x7", Firmware::tr("FrSky Taranis X7 / X7S"), BOARD_TARANIS_X7);
addOpenTxTaranisOptions(firmware);
registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, EU + FLEX);
/* FrSky X7 Access board */
firmware = new OpenTxFirmware("opentx-x7access", Firmware::tr("FrSky Taranis X7 / X7S Access"), BOARD_TARANIS_X7_ACCESS);
addOpenTxTaranisOptions(firmware);
registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, FLEX);
/* FrSky X-Lite S/PRO board */
firmware = new OpenTxFirmware("opentx-xlites", Firmware::tr("FrSky Taranis X-Lite S/PRO"), BOARD_TARANIS_XLITES);
addOpenTxTaranisOptions(firmware);
registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, FLEX);
/* FrSky X-Lite board */
firmware = new OpenTxFirmware("opentx-xlite", Firmware::tr("FrSky Taranis X-Lite"), BOARD_TARANIS_XLITE);
// firmware->addOption("stdr9m", Firmware::tr("Use JR-sized R9M module"));
addOpenTxTaranisOptions(firmware);
registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, EU + FLEX);
/* FrSky X10 board */
firmware = new OpenTxFirmware("opentx-x10", Firmware::tr("FrSky Horus X10 / X10S"), BOARD_X10);
addOpenTxFrskyOptions(firmware);
firmware->addOption("internalaccess", Firmware::tr("Support for ACCESS internal module replacement"));
registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, EU + FLEX);
/* FrSky X10 Express board */
firmware = new OpenTxFirmware("opentx-x10express", Firmware::tr("FrSky Horus X10 Express / X10S Express"), BOARD_X10_EXPRESS);
addOpenTxFrskyOptions(firmware);
registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, FLEX);
/* FrSky X12 (Horus) board */
firmware = new OpenTxFirmware("opentx-x12s", Firmware::tr("FrSky Horus X12S"), BOARD_HORUS_X12S);
@@ -1302,6 +1323,7 @@ void registerOpenTxFirmwares()
firmware->addOption("internalaccess", Firmware::tr("Support for ACCESS internal module replacement"));
firmware->addOption("pcbdev", Firmware::tr("Use ONLY with first DEV pcb version"));
registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, EU + FLEX);
/* Jumper T12 board */
firmware = new OpenTxFirmware("opentx-t12", QCoreApplication::translate("Firmware", "Jumper T12 / T12 Pro"), BOARD_JUMPER_T12);
@@ -1313,6 +1335,7 @@ void registerOpenTxFirmwares()
firmware->addOption("internalmulti", Firmware::tr("Support for MULTI internal module"));
addOpenTxFontOptions(firmware);
registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, FLEX);
/* Jumper T16 board */
firmware = new OpenTxFirmware("opentx-t16", Firmware::tr("Jumper T16 / T16+ / T16 Pro"), BOARD_JUMPER_T16);
@@ -1320,6 +1343,13 @@ void registerOpenTxFirmwares()
firmware->addOption("internalmulti", Firmware::tr("Support for MULTI internal module"));
firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module"));
registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, FLEX);
+
+ /* Radiomaster TX16S board */
+ firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16S"), BOARD_RADIOMASTER_TX16S);
+ addOpenTxFrskyOptions(firmware);
+ firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module"));
+ registerOpenTxFirmware(firmware);
/* 9XR-Pro */
firmware = new OpenTxFirmware("opentx-9xrpro", Firmware::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO);
diff --git a/companion/src/firmwares/radiodata.cpp b/companion/src/firmwares/radiodata.cpp
index 0710910a0..8054e5b1a 100644
--- a/companion/src/firmwares/radiodata.cpp
+++ b/companion/src/firmwares/radiodata.cpp
@@ -116,7 +116,7 @@ void RadioData::convert(RadioDataConversionState & cstate)
}
}
- if (IS_HORUS(cstate.toType)) {
+ if (IS_FAMILY_HORUS_OR_T16(cstate.toType)) {
fixModelFilenames();
}
diff --git a/companion/src/firmwares/rawsource.cpp b/companion/src/firmwares/rawsource.cpp
index 47171c29f..401eb9781 100644
--- a/companion/src/firmwares/rawsource.cpp
+++ b/companion/src/firmwares/rawsource.cpp
@@ -580,13 +580,13 @@ RawSource RawSource::convert(RadioDataConversionState & cstate)
}
}
- if (IS_TARANIS(cstate.toType) && IS_HORUS(cstate.fromType)) {
+ if (IS_TARANIS(cstate.toType) && IS_FAMILY_HORUS_OR_T16(cstate.fromType)) {
if (index == 6)
index = 5; // pot S2 to S2
else if (index == 5)
index = -1; // 6P on Horus doesn't exist on Taranis
}
- else if (IS_HORUS(cstate.toType) && IS_TARANIS(cstate.fromType) && index == 5)
+ else if (IS_FAMILY_HORUS_OR_T16(cstate.toType) && IS_TARANIS(cstate.fromType) && index == 5)
{
index = 6; // pot S2 to S2
}
@@ -602,7 +602,7 @@ RawSource RawSource::convert(RadioDataConversionState & cstate)
}
}
- if (IS_TARANIS_X7(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_HORUS(cstate.fromType))) {
+ if (IS_TARANIS_X7(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) {
// No SE and SG on X7 board
if (index == 4 || index == 6) {
index = 3; // SG and SE to SD
@@ -615,7 +615,7 @@ RawSource RawSource::convert(RadioDataConversionState & cstate)
index = 5; // SH to SH
}
}
- else if (IS_JUMPER_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_HORUS(cstate.fromType))) {
+ else if (IS_JUMPER_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) {
// No SE and SG on T12 board
if (index == 4 || index == 6) {
index = 3; // SG and SE to SD
@@ -629,7 +629,7 @@ RawSource RawSource::convert(RadioDataConversionState & cstate)
}
}
// Compensate for SE and SG on X9/Horus board if converting from X7
- else if ((IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) && IS_TARANIS_X7(cstate.fromType)) {
+ else if ((IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) && IS_TARANIS_X7(cstate.fromType)) {
if (index == 4) {
index = 5; // SF to SF
}
@@ -637,7 +637,7 @@ RawSource RawSource::convert(RadioDataConversionState & cstate)
index = 7; // SH to SH
}
}
- else if ((IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) && IS_JUMPER_T12(cstate.fromType)) {
+ else if ((IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) && IS_JUMPER_T12(cstate.fromType)) {
if (index == 4) {
index = 5; // SF to SF
}
@@ -645,7 +645,7 @@ RawSource RawSource::convert(RadioDataConversionState & cstate)
index = 7; // SH to SH
}
}
- else if ((IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) && IS_JUMPER_T12(cstate.fromType)) {
+ else if ((IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) && IS_JUMPER_T12(cstate.fromType)) {
if (index == 4) {
index = 5; // SF to SF
}
diff --git a/companion/src/firmwares/rawswitch.cpp b/companion/src/firmwares/rawswitch.cpp
index 1d91f242a..a689ceea7 100644
--- a/companion/src/firmwares/rawswitch.cpp
+++ b/companion/src/firmwares/rawswitch.cpp
@@ -197,7 +197,7 @@ RawSwitch RawSwitch::convert(RadioDataConversionState & cstate)
}
// No SE and SG on X7 board
- if (IS_TARANIS_X7(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_HORUS(cstate.fromType))) {
+ if (IS_TARANIS_X7(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) {
if (srcIdx == 4 || srcIdx == 5) {
delta = 3; // SE to SD & SF to SF
if (srcIdx == 4)
@@ -211,7 +211,7 @@ RawSwitch RawSwitch::convert(RadioDataConversionState & cstate)
delta = 6; // SH to SH
}
}
- else if (IS_JUMPER_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_HORUS(cstate.fromType))) {
+ else if (IS_JUMPER_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) {
if (srcIdx == 4 || srcIdx == 5) {
delta = 3; // SE to SD & SF to SF
if (srcIdx == 4)
@@ -226,7 +226,7 @@ RawSwitch RawSwitch::convert(RadioDataConversionState & cstate)
}
}
// Compensate for SE and SG on X9/Horus board if converting from X7
- else if ((IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) && IS_TARANIS_X7(cstate.fromType)) {
+ else if ((IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) && IS_TARANIS_X7(cstate.fromType)) {
if (srcIdx == 4) {
delta = -3; // SF to SF
}
@@ -234,7 +234,7 @@ RawSwitch RawSwitch::convert(RadioDataConversionState & cstate)
delta = -6; // SH to SH
}
}
- else if ((IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) && IS_JUMPER_T12(cstate.fromType)) {
+ else if ((IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) && IS_JUMPER_T12(cstate.fromType)) {
if (srcIdx == 4) {
delta = -3; // SF to SF
}
diff --git a/companion/src/generaledit/generalsetup.cpp b/companion/src/generaledit/generalsetup.cpp
index 38db4d31a..1f74e2734 100644
--- a/companion/src/generaledit/generalsetup.cpp
+++ b/companion/src/generaledit/generalsetup.cpp
@@ -191,7 +191,7 @@ ui(new Ui::GeneralSetup)
ui->label_BLBright->hide();
}
- if (!IS_HORUS(firmware->getBoard())) {
+ if (!IS_FAMILY_HORUS_OR_T16(firmware->getBoard())) {
ui->OFFBright_SB->hide();
ui->OFFBright_SB->setDisabled(true);
ui->label_OFFBright->hide();
@@ -241,7 +241,7 @@ ui(new Ui::GeneralSetup)
ui->rssiPowerOffWarnChkB->hide();
}
- if (IS_HORUS(firmware->getBoard())) {
+ if (IS_FAMILY_HORUS_OR_T16(firmware->getBoard())) {
ui->splashScreenChkB->hide();
ui->splashScreenDuration->hide();
ui->splashScreenLabel->hide();
diff --git a/companion/src/generaledit/hardware.cpp b/companion/src/generaledit/hardware.cpp
index 737882d78..4f530aa78 100644
--- a/companion/src/generaledit/hardware.cpp
+++ b/companion/src/generaledit/hardware.cpp
@@ -172,7 +172,7 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings
ui->txCurrentCalibrationLabel->hide();
}
- if (IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board)|| IS_TARANIS_X9E(board) || IS_HORUS(board)) {
+ if (IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board)|| IS_TARANIS_X9E(board) || IS_FAMILY_HORUS_OR_T16(board)) {
ui->bluetoothMode->addItem(tr("OFF"), 0);
if (IS_TARANIS_X9E(board)) {
ui->bluetoothMode->addItem(tr("Enabled"), 1);
@@ -189,7 +189,7 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings
ui->bluetoothWidget->hide();
}
- if ((IS_HORUS(board) && board != Board::BOARD_X10_EXPRESS) || (IS_TARANIS_XLITE(board) && !IS_TARANIS_XLITES(board))) {
+ if ((IS_FAMILY_HORUS_OR_T16(board) && board != Board::BOARD_X10_EXPRESS) || (IS_TARANIS_XLITE(board) && !IS_TARANIS_XLITES(board))) {
ui->antennaMode->addItem(tr("Internal"), -2);
ui->antennaMode->addItem(tr("Ask"), -1);
ui->antennaMode->addItem(tr("Per model"), 0);
diff --git a/companion/src/images/simulator/TX16S/bottom.png b/companion/src/images/simulator/TX16S/bottom.png
new file mode 100755
index 000000000..8f0d29f7e
Binary files /dev/null and b/companion/src/images/simulator/TX16S/bottom.png differ
diff --git a/companion/src/images/simulator/TX16S/left.png b/companion/src/images/simulator/TX16S/left.png
new file mode 100755
index 000000000..ded33bf62
Binary files /dev/null and b/companion/src/images/simulator/TX16S/left.png differ
diff --git a/companion/src/images/simulator/TX16S/left_page.png b/companion/src/images/simulator/TX16S/left_page.png
new file mode 100755
index 000000000..306d044f4
Binary files /dev/null and b/companion/src/images/simulator/TX16S/left_page.png differ
diff --git a/companion/src/images/simulator/TX16S/left_page2.png b/companion/src/images/simulator/TX16S/left_page2.png
new file mode 100755
index 000000000..c104c148b
Binary files /dev/null and b/companion/src/images/simulator/TX16S/left_page2.png differ
diff --git a/companion/src/images/simulator/TX16S/left_rtn.png b/companion/src/images/simulator/TX16S/left_rtn.png
new file mode 100755
index 000000000..0080f271a
Binary files /dev/null and b/companion/src/images/simulator/TX16S/left_rtn.png differ
diff --git a/companion/src/images/simulator/TX16S/left_sys.png b/companion/src/images/simulator/TX16S/left_sys.png
new file mode 100755
index 000000000..31eeb409f
Binary files /dev/null and b/companion/src/images/simulator/TX16S/left_sys.png differ
diff --git a/companion/src/images/simulator/TX16S/left_tele.png b/companion/src/images/simulator/TX16S/left_tele.png
new file mode 100755
index 000000000..6b925f22c
Binary files /dev/null and b/companion/src/images/simulator/TX16S/left_tele.png differ
diff --git a/companion/src/images/simulator/TX16S/right.png b/companion/src/images/simulator/TX16S/right.png
new file mode 100755
index 000000000..f07ca05bf
Binary files /dev/null and b/companion/src/images/simulator/TX16S/right.png differ
diff --git a/companion/src/images/simulator/TX16S/right_ent.png b/companion/src/images/simulator/TX16S/right_ent.png
new file mode 100755
index 000000000..9f407a2cf
Binary files /dev/null and b/companion/src/images/simulator/TX16S/right_ent.png differ
diff --git a/companion/src/images/simulator/TX16S/right_mdl.png b/companion/src/images/simulator/TX16S/right_mdl.png
new file mode 100755
index 000000000..67ca5a0d3
Binary files /dev/null and b/companion/src/images/simulator/TX16S/right_mdl.png differ
diff --git a/companion/src/images/simulator/TX16S/top.png b/companion/src/images/simulator/TX16S/top.png
new file mode 100755
index 000000000..3bc1784ee
Binary files /dev/null and b/companion/src/images/simulator/TX16S/top.png differ
diff --git a/companion/src/logsdialog.cpp b/companion/src/logsdialog.cpp
index e60318c69..b7fa54f16 100644
--- a/companion/src/logsdialog.cpp
+++ b/companion/src/logsdialog.cpp
@@ -761,7 +761,7 @@ void LogsDialog::setFlightSessions()
int noSesions = sessions.size()-1;
QString label = QString("%1 ").arg(noSesions);
label += tr(noSesions > 1 ? "sessions" : "session");
- label += " <" + tr("total duration ") + generateDuration(getRecordTimeStamp(1), getRecordTimeStamp(n-1)) + ">";
+ label += " <" + tr("time span") + generateDuration(getRecordTimeStamp(1), getRecordTimeStamp(n-1)) + ">";
ui->sessions_CB->addItem(label);
// add individual sessions
diff --git a/companion/src/mainwindow.cpp b/companion/src/mainwindow.cpp
index dcae212df..35e15968b 100644
--- a/companion/src/mainwindow.cpp
+++ b/companion/src/mainwindow.cpp
@@ -930,7 +930,7 @@ void MainWindow::readEeprom()
{
Board::Type board = getCurrentBoard();
QString tempFile;
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
tempFile = generateProcessUniqueTempFileName("temp.otx");
else if (IS_ARM(board))
tempFile = generateProcessUniqueTempFileName("temp.bin");
@@ -975,7 +975,7 @@ bool MainWindow::readEepromFromRadio(const QString & filename)
void MainWindow::writeBackup()
{
- if (IS_HORUS(getCurrentBoard())) {
+ if (IS_FAMILY_HORUS_OR_T16(getCurrentBoard())) {
QMessageBox::information(this, CPN_STR_APP_NAME, tr("This function is not yet implemented"));
return;
// TODO implementation
@@ -992,7 +992,7 @@ void MainWindow::writeFlash(QString fileToFlash)
void MainWindow::readBackup()
{
- if (IS_HORUS(getCurrentBoard())) {
+ if (IS_FAMILY_HORUS_OR_T16(getCurrentBoard())) {
QMessageBox::information(this, CPN_STR_APP_NAME, tr("This function is not yet implemented"));
return;
// TODO implementation
@@ -1078,7 +1078,7 @@ void MainWindow::updateMenus()
compareAct->setEnabled(activeChild);
writeEepromAct->setEnabled(activeChild);
readEepromAct->setEnabled(true);
- if (IS_HORUS(getCurrentBoard())) {
+ if (IS_FAMILY_HORUS_OR_T16(getCurrentBoard())) {
writeBUToRadioAct->setEnabled(false);
readBUToFileAct->setEnabled(false);
}
@@ -1086,7 +1086,7 @@ void MainWindow::updateMenus()
writeBUToRadioAct->setEnabled(true);
readBUToFileAct->setEnabled(true);
}
- editSplashAct->setDisabled(IS_HORUS(getCurrentBoard()));
+ editSplashAct->setDisabled(IS_FAMILY_HORUS_OR_T16(getCurrentBoard()));
foreach (QAction * act, fileWindowActions) {
if (!act)
diff --git a/companion/src/mdichild.cpp b/companion/src/mdichild.cpp
index c31697a9f..3c8c7c214 100644
--- a/companion/src/mdichild.cpp
+++ b/companion/src/mdichild.cpp
@@ -534,7 +534,7 @@ void MdiChild::initModelsList()
connect(modelsListModel, &QAbstractItemModel::dataChanged, this, &MdiChild::onDataChanged);
ui->modelsList->setModel(modelsListModel);
- if (IS_HORUS(board)) {
+ if (IS_FAMILY_HORUS_OR_T16(board)) {
ui->modelsList->setIndentation(20);
// ui->modelsList->resetIndentation(); // introduced in next Qt versions ...
}
@@ -1531,7 +1531,7 @@ int MdiChild::askQuestion(const QString & msg, QMessageBox::StandardButtons butt
void MdiChild::writeEeprom() // write to Tx
{
Board::Type board = getCurrentBoard();
- if (IS_HORUS(board)) {
+ if (IS_FAMILY_HORUS_OR_T16(board)) {
QString radioPath = findMassstoragePath("RADIO", true);
qDebug() << "Searching for SD card, found" << radioPath;
if (radioPath.isEmpty()) {
diff --git a/companion/src/modeledit/flightmode.ui b/companion/src/modeledit/flightmode.ui
index ab279a437..f3dff650e 100644
--- a/companion/src/modeledit/flightmode.ui
+++ b/companion/src/modeledit/flightmode.ui
@@ -58,7 +58,7 @@
- -
+
-
Qt::Horizontal
@@ -85,24 +85,18 @@
-
-
-
-
-
-
- 0
- 0
-
-
+
-
+
Qt::Horizontal
-
- QSlider::TicksBothSides
+
+
+ 40
+ 20
+
-
- 25
-
-
+
-
@@ -136,25 +130,6 @@
- -
-
-
-
- 0
- 0
-
-
-
- Qt::Horizontal
-
-
- QSlider::TicksBothSides
-
-
- 25
-
-
-
-
@@ -166,16 +141,6 @@
-
-
-
-
-
- trim1
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
-
-
@@ -284,11 +249,59 @@
+ -
+
+
+ trim1
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::Horizontal
+
+
+ QSlider::TicksBothSides
+
+
+ 25
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::Horizontal
+
+
+ QSlider::TicksBothSides
+
+
+ 25
+
+
+
-
@@ -299,7 +312,7 @@
-
-
+
-
@@ -310,65 +323,6 @@
- -
-
-
- trim3
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
-
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
- -
-
-
- Qt::AlignCenter
-
-
- true
-
-
- -896
-
-
- 896
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
-
-
-
-
@@ -418,23 +372,201 @@
+ -
+
+
-
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+ -
+
+
+ -
+
+
+ Qt::AlignCenter
+
+
+ true
+
+
+ -896
+
+
+ 896
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+ -
+
+
+ trim3
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
- -
-
+
-
+
+
-
+
+
+ trim6
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
-
+
+
+ -
+
+
+ Qt::AlignCenter
+
+
+ true
+
+
+ -896
+
+
+ 896
+
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+ QSizePolicy::Minimum
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+ -
+
Qt::Horizontal
-
-
- 40
- 20
-
+
+ QSlider::TicksBothSides
-
+
+ 25
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QSlider::TicksBothSides
+
+
+ 25
+
+
+
+ -
+
+
-
+
+
+ trim5
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
-
+
+
+ -
+
+
+ Qt::AlignCenter
+
+
+ true
+
+
+ -896
+
+
+ 896
+
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+ QSizePolicy::Minimum
+
+
+
+ 20
+ 40
+
+
+
+
+
diff --git a/companion/src/modeledit/flightmodes.cpp b/companion/src/modeledit/flightmodes.cpp
index e1b01c1a9..53f5d7585 100644
--- a/companion/src/modeledit/flightmodes.cpp
+++ b/companion/src/modeledit/flightmodes.cpp
@@ -80,20 +80,28 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI
}
// The trims
- QString labels[CPN_MAX_STICKS];
+ QString labels[CPN_MAX_TRIMS];
for(int i=0; i < CPN_MAX_STICKS; i++) {
labels[i] = firmware->getAnalogInputName(i);
}
+ labels[4] = "T5";
+ labels[5] = "T6";
-
- trimsLabel << ui->trim1Label << ui->trim2Label << ui->trim3Label << ui->trim4Label;
- trimsUse << ui->trim1Use << ui->trim2Use << ui->trim3Use << ui->trim4Use;
- trimsValue << ui->trim1Value << ui->trim2Value << ui->trim3Value << ui->trim4Value;
- trimsSlider << ui->trim1Slider << ui->trim2Slider << ui->trim3Slider << ui->trim4Slider;
+ trimsLabel << ui->trim1Label << ui->trim2Label << ui->trim3Label << ui->trim4Label << ui->trim5Label << ui->trim6Label;
+ trimsUse << ui->trim1Use << ui->trim2Use << ui->trim3Use << ui->trim4Use << ui->trim5Use << ui->trim6Use;
+ trimsValue << ui->trim1Value << ui->trim2Value << ui->trim3Value << ui->trim4Value << ui->trim5Value << ui->trim6Value;
+ trimsSlider << ui->trim1Slider << ui->trim2Slider << ui->trim3Slider << ui->trim4Slider << ui->trim5Slider << ui->trim6Slider;
Board::Type board = firmware->getBoard();
- for (int i=0; i<4; i++) {
+ for (int i = getBoardCapability(board,Board::NumTrims); i < CPN_MAX_TRIMS; i++) {
+ trimsLabel[i]->hide();
+ trimsUse[i]->hide();
+ trimsValue[i]->hide();
+ trimsSlider[i]->hide();
+ }
+
+ for (int i = 0; i < getBoardCapability(board,Board::NumTrims); i++) {
trimsLabel[i]->setText(labels[CONVERT_MODE(i+1)-1]);
QComboBox * cb = trimsUse[i];
@@ -293,7 +301,7 @@ void FlightModePanel::update()
ui->fadeIn->setValue(float(phase.fadeIn)/scale);
ui->fadeOut->setValue(float(phase.fadeOut)/scale);
- for (int i=0; i<4; i++) {
+ for (int i = 0; i < getBoardCapability(firmware->getBoard(), Board::NumTrims); i++) {
int trimsMax = firmware->getCapability(ExtendedTrimsRange);
if (trimsMax == 0 || !model->extendedTrims) {
trimsMax = firmware->getCapability(TrimsRange);
diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp
index 77988a2e7..5e193faec 100644
--- a/companion/src/modeledit/setup.cpp
+++ b/companion/src/modeledit/setup.cpp
@@ -209,7 +209,7 @@ ModulePanel::ModulePanel(QWidget * parent, ModelData & model, ModuleData & modul
ui->trainerMode->setItemData(TRAINER_MODE_SLAVE_BLUETOOTH, 0, Qt::UserRole - 1);
}
- if (!IS_JUMPER_T16(firmware->getBoard())) {
+ if (!IS_FAMILY_T16(firmware->getBoard())) {
ui->trainerMode->setItemData(TRAINER_MODE_MULTI, 0, Qt::UserRole - 1);
}
@@ -1001,7 +1001,7 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge
QDir qd(path);
if (qd.exists()) {
QStringList filters;
- if(IS_HORUS(board)) {
+ if(IS_FAMILY_HORUS_OR_T16(board)) {
filters << "*.bmp" << "*.jpg" << "*.png";
foreach ( QString file, qd.entryList(filters, QDir::Files) ) {
QFileInfo fi(file);
@@ -1032,17 +1032,17 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge
ui->image->setCurrentIndex(ui->image->count()-1);
QString fileName = path;
fileName.append(model.bitmap);
- if (!IS_HORUS(board))
+ if (!IS_FAMILY_HORUS_OR_T16(board))
fileName.append(".bmp");
QImage image(fileName);
- if (image.isNull() && !IS_HORUS(board)) {
+ if (image.isNull() && !IS_FAMILY_HORUS_OR_T16(board)) {
fileName = path;
fileName.append(model.bitmap);
fileName.append(".BMP");
image.load(fileName);
}
if (!image.isNull()) {
- if (IS_HORUS(board)) {
+ if (IS_FAMILY_HORUS_OR_T16(board)) {
ui->imagePreview->setFixedSize(QSize(192, 114));
ui->imagePreview->setPixmap(QPixmap::fromImage(image.scaled(192, 114)));
}
@@ -1281,17 +1281,17 @@ void SetupPanel::on_image_currentIndexChanged(int index)
if (qd.exists()) {
QString fileName=path;
fileName.append(model->bitmap);
- if (!IS_HORUS(board))
+ if (!IS_FAMILY_HORUS_OR_T16(board))
fileName.append(".bmp");
QImage image(fileName);
- if (image.isNull() && !IS_HORUS(board)) {
+ if (image.isNull() && !IS_FAMILY_HORUS_OR_T16(board)) {
fileName=path;
fileName.append(model->bitmap);
fileName.append(".BMP");
image.load(fileName);
}
if (!image.isNull()) {
- if (IS_HORUS(board)) {
+ if (IS_FAMILY_HORUS_OR_T16(board)) {
ui->imagePreview->setFixedSize(QSize(192, 114));
ui->imagePreview->setPixmap(QPixmap::fromImage(image.scaled(192, 114)));
}
diff --git a/companion/src/modelslist.cpp b/companion/src/modelslist.cpp
index 2fb5cc329..864c10028 100644
--- a/companion/src/modelslist.cpp
+++ b/companion/src/modelslist.cpp
@@ -145,7 +145,7 @@ TreeModel::TreeModel(RadioData * radioData, QObject * parent):
if (!hasCategories)
labels << tr("Index");
labels << tr("Name");
- if (!(IS_HORUS(board) || IS_SKY9X(board))) {
+ if (!(IS_FAMILY_HORUS_OR_T16(board) || IS_SKY9X(board))) {
labels << tr("Size");
}
labels << tr("RX #");
@@ -651,7 +651,7 @@ void TreeModel::refresh()
EEPROMInterface * eepromInterface = getCurrentEEpromInterface();
Board::Type board = eepromInterface->getBoard();
TreeItem * defaultCategoryItem = NULL;
- bool hasEepromSizeData = (IS_HORUS(board) ? false : true);
+ bool hasEepromSizeData = (IS_FAMILY_HORUS_OR_T16(board) ? false : true);
if (hasEepromSizeData) {
availableEEpromSize = Boards::getEEpromSize(board) - 64; // let's consider fat
diff --git a/companion/src/radiointerface.cpp b/companion/src/radiointerface.cpp
index 6c2c50052..c3214958a 100644
--- a/companion/src/radiointerface.cpp
+++ b/companion/src/radiointerface.cpp
@@ -314,7 +314,7 @@ bool readEeprom(const QString & filename, ProgressWidget * progress)
return false;
}
- if (IS_HORUS(board)) {
+ if (IS_FAMILY_HORUS_OR_T16(board)) {
QString radioPath = findMassstoragePath("RADIO", true);
qDebug() << "Searching for SD card, found" << radioPath;
if (radioPath.isEmpty()) {
diff --git a/companion/src/simulation/CMakeLists.txt b/companion/src/simulation/CMakeLists.txt
index 0142241b2..767933edf 100644
--- a/companion/src/simulation/CMakeLists.txt
+++ b/companion/src/simulation/CMakeLists.txt
@@ -14,6 +14,7 @@ set(simulation_SRCS
simulateduiwidgetX12.cpp
simulateduiwidgetJumperT12.cpp
simulateduiwidgetJumperT16.cpp
+ simulateduiwidgetTX16S.cpp
simulatorinterface.cpp
simulatormainwindow.cpp
simulatorstartupdialog.cpp
@@ -38,6 +39,7 @@ set(simulation_UIS
simulateduiwidgetX12.ui
simulateduiwidgetJumperT12.ui
simulateduiwidgetJumperT16.ui
+ simulateduiwidgetTX16S.ui
simulatormainwindow.ui
simulatorstartupdialog.ui
simulatorwidget.ui
diff --git a/companion/src/simulation/simulateduiwidget.h b/companion/src/simulation/simulateduiwidget.h
index d688c641a..75dd3ebfd 100644
--- a/companion/src/simulation/simulateduiwidget.h
+++ b/companion/src/simulation/simulateduiwidget.h
@@ -113,6 +113,7 @@ namespace Ui {
class SimulatedUIWidgetX12;
class SimulatedUIWidgetJumperT12;
class SimulatedUIWidgetJumperT16;
+ class SimulatedUIWidgetTX16S;
}
class SimulatedUIWidget9X: public SimulatedUIWidget
@@ -251,5 +252,17 @@ class SimulatedUIWidgetJumperT16: public SimulatedUIWidget
Ui::SimulatedUIWidgetJumperT16 * ui;
};
+class SimulatedUIWidgetTX16S: public SimulatedUIWidget
+{
+ Q_OBJECT
+
+ public:
+ explicit SimulatedUIWidgetTX16S(SimulatorInterface * simulator, QWidget * parent = nullptr);
+ virtual ~SimulatedUIWidgetTX16S();
+
+ private:
+ Ui::SimulatedUIWidgetTX16S * ui;
+};
+
#endif // SIMULATEDUIWIDGET_H
diff --git a/companion/src/simulation/simulateduiwidgetJumperT16.cpp b/companion/src/simulation/simulateduiwidgetJumperT16.cpp
index 317fdb24c..66fc7f36e 100644
--- a/companion/src/simulation/simulateduiwidgetJumperT16.cpp
+++ b/companion/src/simulation/simulateduiwidgetJumperT16.cpp
@@ -34,27 +34,27 @@ SimulatedUIWidgetJumperT16::SimulatedUIWidgetJumperT16(SimulatorInterface *simul
// add actions in order of appearance on the help menu
act = new RadioUiAction(3, QList() << Qt::Key_Up, SIMU_STR_HLP_KEY_UP, SIMU_STR_HLP_ACT_MDL);
- addRadioWidget(ui->leftbuttons->addArea(QRect(10, 70, 80, 35), "JumperT16/left_mdl.png", act));
+ addRadioWidget(ui->leftbuttons->addArea(QRect(50, 70, 80, 35), "JumperT16/left_mdl.png", act));
act = new RadioUiAction(6, QList() << Qt::Key_Left, SIMU_STR_HLP_KEY_LFT, SIMU_STR_HLP_ACT_SYS);
- addRadioWidget(ui->leftbuttons->addArea(QRect(10, 10, 80, 35), "JumperT16/left_sys.png", act));
+ addRadioWidget(ui->leftbuttons->addArea(QRect(25, 10, 95, 35), "JumperT16/left_sys.png", act));
act = new RadioUiAction(5, QList() << Qt::Key_Right, SIMU_STR_HLP_KEY_RGT, SIMU_STR_HLP_ACT_TELE);
- addRadioWidget(ui->leftbuttons->addArea(QRect(10, 190, 80, 35), "JumperT16/left_tele.png", act));
+ addRadioWidget(ui->leftbuttons->addArea(QRect(50, 190, 80, 35), "JumperT16/left_tele.png", act));
act = new RadioUiAction(4, QList() << Qt::Key_Down << Qt::Key_Delete << Qt::Key_Escape << Qt::Key_Backspace,
SIMU_STR_HLP_KEY_DN % "
" % SIMU_STR_HLP_KEYS_EXIT, SIMU_STR_HLP_ACT_RTN);
- addRadioWidget(ui->rightbuttons->addArea(QRect(35, 10, 80, 35), "JumperT16/right_rtn.png", act));
+ addRadioWidget(ui->rightbuttons->addArea(QRect(50, 10, 95, 35), "JumperT16/right_rtn.png", act));
act = new RadioUiAction(1, QList() << Qt::Key_PageDown, SIMU_STR_HLP_KEY_PGDN, SIMU_STR_HLP_ACT_PGDN);
- addRadioWidget(ui->leftbuttons->addArea(QRect(10, 131, 80, 35), "JumperT16/left_page.png", act));
+ addRadioWidget(ui->leftbuttons->addArea(QRect(50, 131, 80, 35), "JumperT16/left_page.png", act));
m_scrollUpAction = new RadioUiAction(-1, QList() << Qt::Key_Minus, SIMU_STR_HLP_KEY_MIN % "|" % SIMU_STR_HLP_MOUSE_UP, SIMU_STR_HLP_ACT_ROT_LFT);
m_scrollDnAction = new RadioUiAction(-1, QList() << Qt::Key_Plus << Qt::Key_Equal, SIMU_STR_HLP_KEY_PLS % "|" % SIMU_STR_HLP_MOUSE_DN, SIMU_STR_HLP_ACT_ROT_RGT);
connectScrollActions();
m_mouseMidClickAction = new RadioUiAction(2, QList() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_ACTIVATE, SIMU_STR_HLP_ACT_ROT_DN);
- addRadioWidget(ui->rightbuttons->addArea(QRect(45, 70, 100, 160), "JumperT16/right_ent.png", m_mouseMidClickAction));
+ addRadioWidget(ui->rightbuttons->addArea(QRect(55, 90, 56, 120), "JumperT16/right_ent.png", m_mouseMidClickAction));
addRadioWidget(ui->leftbuttons->addArea(QRect(10, 252, 30, 30), "JumperT16/left_scrnsht.png", m_screenshotAction));
diff --git a/companion/src/simulation/simulateduiwidgetTX16S.cpp b/companion/src/simulation/simulateduiwidgetTX16S.cpp
new file mode 100644
index 000000000..db1d5fa8b
--- /dev/null
+++ b/companion/src/simulation/simulateduiwidgetTX16S.cpp
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) OpenTX
+ *
+ * Based on code named
+ * th9x - http://code.google.com/p/th9x
+ * er9x - http://code.google.com/p/er9x
+ * gruvin9x - http://code.google.com/p/gruvin9x
+ *
+ * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+// NOTE: RadioUiAction(NUMBER,...): NUMBER relates to enum EnumKeys in the specific board.h
+
+#include "simulateduiwidget.h"
+#include "ui_simulateduiwidgetTX16S.h"
+
+SimulatedUIWidgetTX16S::SimulatedUIWidgetTX16S(SimulatorInterface *simulator, QWidget * parent):
+ SimulatedUIWidget(simulator, parent),
+ ui(new Ui::SimulatedUIWidgetTX16S)
+{
+ RadioUiAction * act;
+
+ ui->setupUi(this);
+
+ // add actions in order of appearance on the help menu
+
+ act = new RadioUiAction(3, QList() << Qt::Key_Up, SIMU_STR_HLP_KEY_UP, SIMU_STR_HLP_ACT_MDL);
+ addRadioWidget(ui->rightbuttons->addArea(QRect(10, 0, 80, 35), "TX16S/right_mdl.png", act));
+
+ m_mouseMidClickAction = new RadioUiAction(2, QList() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_ACTIVATE, SIMU_STR_HLP_ACT_ROT_DN);
+ addRadioWidget(ui->rightbuttons->addArea(QRect(45, 70, 100, 160), "TX16S/right_ent.png", m_mouseMidClickAction));
+
+ act = new RadioUiAction(6, QList() << Qt::Key_Left, SIMU_STR_HLP_KEY_LFT, SIMU_STR_HLP_ACT_SYS);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(32, 1, 80, 35), "TX16S/left_sys.png", act));
+
+ act = new RadioUiAction(5, QList() << Qt::Key_Right, SIMU_STR_HLP_KEY_RGT, SIMU_STR_HLP_ACT_TELE);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(55, 220, 80, 35), "TX16S/left_tele.png", act));
+
+ act = new RadioUiAction(1, QList() << Qt::Key_PageDown, SIMU_STR_HLP_KEY_PGDN, SIMU_STR_HLP_ACT_PGDN);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(55, 115, 80, 35), "TX16S/left_page.png", act));
+
+ act = new RadioUiAction(0, QList() << Qt::Key_PageUp, SIMU_STR_HLP_KEY_PGUP, SIMU_STR_HLP_ACT_PGUP);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(55, 160, 80, 35), "TX16S/left_page2.png", act));
+
+ act = new RadioUiAction(4, QList() << Qt::Key_Down << Qt::Key_Delete << Qt::Key_Escape << Qt::Key_Backspace,
+ SIMU_STR_HLP_KEY_DN % "
" % SIMU_STR_HLP_KEYS_EXIT, SIMU_STR_HLP_ACT_RTN);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(55, 55, 80, 35), "TX16S/left_rtn.png", act));
+
+ m_scrollUpAction = new RadioUiAction(-1, QList() << Qt::Key_Minus, SIMU_STR_HLP_KEY_MIN % "|" % SIMU_STR_HLP_MOUSE_UP, SIMU_STR_HLP_ACT_ROT_LFT);
+ m_scrollDnAction = new RadioUiAction(-1, QList() << Qt::Key_Plus << Qt::Key_Equal, SIMU_STR_HLP_KEY_PLS % "|" % SIMU_STR_HLP_MOUSE_DN, SIMU_STR_HLP_ACT_ROT_RGT);
+ connectScrollActions();
+
+ addRadioWidget(ui->leftbuttons->addArea(QRect(10, 252, 30, 30), "TX16S/left_scrnsht.png", m_screenshotAction));
+
+ m_backlightColors << QColor(47, 123, 227);
+
+ setLcd(ui->lcd);
+}
+
+SimulatedUIWidgetTX16S::~SimulatedUIWidgetTX16S()
+{
+ delete ui;
+}
diff --git a/companion/src/simulation/simulateduiwidgetTX16S.ui b/companion/src/simulation/simulateduiwidgetTX16S.ui
new file mode 100644
index 000000000..e5137d992
--- /dev/null
+++ b/companion/src/simulation/simulateduiwidgetTX16S.ui
@@ -0,0 +1,197 @@
+
+
+ SimulatedUIWidgetTX16S
+
+
+
+ 0
+ 0
+ 825
+ 292
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 825
+ 292
+
+
+
+
+ 825
+ 292
+
+
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 174
+ 292
+
+
+
+
+ 174
+ 292
+
+
+
+ background:url(:/images/simulator/TX16S/right.png)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 480
+ 272
+
+
+
+
+ 480
+ 272
+
+
+
+
+ 5
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 174
+ 292
+
+
+
+
+ 174
+ 292
+
+
+
+ true
+
+
+ background:url(:/images/simulator/TX16S/left.png);
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 480
+ 10
+
+
+
+
+ 480
+ 10
+
+
+
+
+ 5
+
+
+
+ background:url(:/images/simulator/TX16S/top.png)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 480
+ 10
+
+
+
+
+ 480
+ 10
+
+
+
+
+ 5
+ false
+
+
+
+ background:url(:/images/simulator/TX16S/bottom.png)
+
+
+
+
+
+
+
+ LcdWidget
+ QWidget
+
+ 1
+
+
+ ButtonsWidget
+ QWidget
+
+ 1
+
+
+
+
+
diff --git a/companion/src/simulation/simulatorstartupdialog.cpp b/companion/src/simulation/simulatorstartupdialog.cpp
index 57272bf99..32d343321 100644
--- a/companion/src/simulation/simulatorstartupdialog.cpp
+++ b/companion/src/simulation/simulatorstartupdialog.cpp
@@ -86,7 +86,7 @@ void SimulatorStartupDialog::changeEvent(QEvent *e)
// FIXME : need a better way to check for this
bool SimulatorStartupDialog::usesCategorizedStorage(const QString & name)
{
- return name.contains(QRegExp("(x12|x10|horus|t16)", Qt::CaseInsensitive));
+ return name.contains(QRegExp("(x12|x10|horus|16)", Qt::CaseInsensitive));
}
bool SimulatorStartupDialog::usesCategorizedStorage()
diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp
index 2a472fc00..798c8664b 100644
--- a/companion/src/simulation/simulatorwidget.cpp
+++ b/companion/src/simulation/simulatorwidget.cpp
@@ -94,6 +94,9 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato
case Board::BOARD_JUMPER_T16:
radioUiWidget = new SimulatedUIWidgetJumperT16(simulator, this);
break;
+ case Board::BOARD_RADIOMASTER_TX16S:
+ radioUiWidget = new SimulatedUIWidgetTX16S(simulator, this);
+ break;
default:
radioUiWidget = new SimulatedUIWidget9X(simulator, this);
break;
@@ -270,7 +273,7 @@ bool SimulatorWidget::setRadioData(RadioData * radioData)
saveTempRadioData = (flags & SIMULATOR_FLAGS_STANDALONE);
- if (IS_HORUS(m_board))
+ if (IS_FAMILY_HORUS_OR_T16(m_board))
ret = useTempDataPath(true);
if (ret) {
diff --git a/companion/src/storage/categorized.cpp b/companion/src/storage/categorized.cpp
index 9ca248cc4..d659ae81f 100644
--- a/companion/src/storage/categorized.cpp
+++ b/companion/src/storage/categorized.cpp
@@ -93,7 +93,7 @@ bool CategorizedStorageFormat::load(RadioData & radioData)
return false;
}
strncpy(radioData.models[modelIndex].filename, qPrintable(fileName), sizeof(radioData.models[modelIndex].filename));
- if (IS_HORUS(board) && !strcmp(radioData.generalSettings.currModelFilename, qPrintable(fileName))) {
+ if (IS_FAMILY_HORUS_OR_T16(board) && !strcmp(radioData.generalSettings.currModelFilename, qPrintable(fileName))) {
radioData.generalSettings.currModelIndex = modelIndex;
qDebug() << "currModelIndex =" << modelIndex;
}
diff --git a/companion/src/storage/rlefile.cpp b/companion/src/storage/rlefile.cpp
index b4d9da611..fe297339f 100644
--- a/companion/src/storage/rlefile.cpp
+++ b/companion/src/storage/rlefile.cpp
@@ -239,7 +239,7 @@ void RleFile::EeFsSetDat(unsigned int blk, unsigned int ofs, const uint8_t *buf,
unsigned int RleFile::EeFsGetFree()
{
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
return 0;
unsigned int ret = 0;
@@ -261,7 +261,7 @@ unsigned int RleFile::EeFsGetFree()
*/
void RleFile::EeFsFree(unsigned int blk)
{
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
return;
unsigned int i = blk;
@@ -281,7 +281,7 @@ void RleFile::EeFsFree(unsigned int blk)
*/
unsigned int RleFile::EeFsAlloc()
{
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
return 0;
unsigned int ret = (IS_ARM(board) ? eeFsArm->freeList : eeFs->freeList);
if (ret) {
@@ -296,7 +296,7 @@ unsigned int RleFile::EeFsAlloc()
unsigned int RleFile::size(unsigned int id)
{
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
return 0;
else
return IS_ARM(board) ? eeFsArm->files[id].size : eeFs->files[id].size;
@@ -304,7 +304,7 @@ unsigned int RleFile::size(unsigned int id)
unsigned int RleFile::openRd(unsigned int i_fileId)
{
- if (IS_HORUS(board)) {
+ if (IS_FAMILY_HORUS_OR_T16(board)) {
return 1;
}
else if (IS_SKY9X(board)) {
@@ -341,7 +341,7 @@ unsigned int RleFile::openRd(unsigned int i_fileId)
unsigned int RleFile::read(uint8_t *buf, unsigned int i_len)
{
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
return 0;
unsigned int len = IS_ARM(board) ? eeFsArm->files[m_fileId].size : eeFs->files[m_fileId].size;
@@ -364,7 +364,7 @@ unsigned int RleFile::read(uint8_t *buf, unsigned int i_len)
// G: Read runlength (RLE) compressed bytes into buf.
unsigned int RleFile::readRlc12(uint8_t *buf, unsigned int i_len, bool rlc2)
{
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
return 0;
memset(buf, 0, i_len);
@@ -550,7 +550,7 @@ void RleFile::closeTrunc()
unsigned int RleFile::writeRlc1(unsigned int i_fileId, unsigned int typ, const uint8_t *buf, unsigned int i_len)
{
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
return 0;
create(i_fileId, typ);
@@ -599,7 +599,7 @@ unsigned int RleFile::writeRlc1(unsigned int i_fileId, unsigned int typ, const u
*/
unsigned int RleFile::writeRlc2(unsigned int i_fileId, unsigned int typ, const uint8_t *buf, unsigned int i_len)
{
- if (IS_HORUS(board))
+ if (IS_FAMILY_HORUS_OR_T16(board))
return 0;
if (IS_SKY9X(board)) {
diff --git a/companion/src/translations/companion_fr.ts b/companion/src/translations/companion_fr.ts
index 8f69bf1bb..98fb5663a 100644
--- a/companion/src/translations/companion_fr.ts
+++ b/companion/src/translations/companion_fr.ts
@@ -728,58 +728,58 @@ Manche Droit: Profondeur, Direction
Boards
-
+
Left Horizontal
Gauche Horizontal
-
+
Left Vertical
Gauche Vertical
-
+
Right Vertical
Droit Vertical
-
+
Right Horizontal
Droit Horizontal
-
+
Aux. 1
-
+
Aux. 2
-
-
+
+
Unknown
Inconnu
-
+
Rud
Dir
-
+
Ele
Prf
-
+
Thr
Gaz
-
+
Ail
@@ -1581,7 +1581,7 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import
Trainer
- Écolage
+ Écolage Manches
@@ -1605,193 +1605,198 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import
+ Trainer Channels
+ Écolage Channels
+
+
+
Instant Trim
Trims instantanés
-
+
Play Sound
Jouer Son
-
+
Haptic
Vibreur
-
+
Reset
Remise à zéro
-
+
Set Timer %1
Définir chrono %1
-
+
Vario
-
+
Play Track
Jouer fichier
-
+
Play Both
Jouer les deux
-
+
Play Value
Lire valeur
-
+
Play Script
Exécuter script
-
+
SD Logs
Logs SD
-
+
Volume
-
+
Backlight
Rétroéclairage
-
+
Screenshot
Capture d'écran
-
+
Background Music
Musique de fond
-
+
Background Music Pause
Pause musique de fond
-
+
Adjust %1
Ajuster %1
-
+
SetFailsafe Int. Module
Définir failsafe module interne
-
+
SetFailsafe Ext. Module
Définir failsafe module externe
-
+
RangeCheck Int. Module
Test portée module interne
-
+
RangeCheck Ext. Module
Test portée module externe
-
+
Bind Int. Module
Bind module interne
-
+
Bind Ext. Module
Bind module externe
-
+
Timer1
Chrono 1
-
+
Timer2
Chrono 2
-
+
Timer3
Chrono 3
-
+
Flight
Vol
-
+
Telemetry
Télémétrie
-
+
Rotary Encoder
Sélecteur Rotatif
-
+
REa
-
+
REb
-
+
s
-
-
-
+
+
+
<font color=red><b>Inconsistent parameter</b></font>
<font color=red><b>Paramètre inconsistant</b></font>
-
+
Value
Valeur
-
+
played once, not during startup
!1x Lu une fois, mais pas à la mise en route
-
+
repeat(%1s)
Répéter chaque %1s
-
+
DISABLED
DESACTIVE
-
+
CFN
FPN
@@ -2114,13 +2119,13 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import
OpenTX n'accepte que %1 points au maximum entre toutes les courbes
-
-
+
+
OpenTX on this board doesn't accept this function
OpenTX ne supporte pas cette fonction sur cette carte
-
+
OpenTX doesn't accept this radio protocol
OpenTX ne supporte pas ce protocole radio
@@ -2200,12 +2205,12 @@ Pour <b>retirer un filtre de l'historique</b>, sélectionnez-le
Basculer le filtre on/off.
-
+
<html><head><style>kbd {background-color: palette(alternate-base); font-size: large; white-space: nowrap;}</style></head><body><p>The filter supports two syntax types: basic matching with common wildcards as well as full Perl-style (<code>pcre</code>) Regular Expressions.</p><p>By default a filter will only show lines which match (<b>inclusive</b>). To make an <b>exclusive</b> filter which removes matching lines, prefix the filter expression with a <kbd>!</kbd> (exclamation mark).</p><p>To use <b>Regular Expressions</b> (RegEx), prefix the filter text with a <kbd>/</kbd> (slash) or <kbd>^</kbd> (up caret). <ul><li>Put the <kbd>/</kbd> or <kbd>^</kbd> after the exclusive <kbd>!</kbd> indicator if you're using one.</li><li>By default the match is case-sensitive. To make it insensitive, add the typical <kbd>/i</kbd> (slash i) operator at the end of your RegEx.</li><li>If you use a caret (^) to denote a RegEx, it will become part of the Reg. Ex. (that is, matches from start of line).</li><li>If the RegEx is invalid, the filter edit field should show a red border and you will not be able to enable the filter.</li><li>A useful resource for testing REs (with a full reference) can be found at <a href="http://www.regexr.com/">http://www.regexr.com/</a></li></ul></p><p>To use <b>basic matching</b> just type any text.<ul><li>Wildcards: <kbd>*</kbd> (asterisk) matches zero or more of any character(s), and <kbd>?</kbd> (question mark) matches any single character.</li><li>The match is always case-insensitive.</li><li>The match always starts from the beginning of a log line. To ignore characters at the start, use a leading <kbd>*</kbd> wildcard.</li><li>A trailing <kbd>*</kbd> is always implied (that is, matches anything to the end of the log line). To avoid this, use a RegEx.</li><li>You can match literal wildcard characters by prefixing them with a <kbd>\</kbd> (backslash) character (eg. "foo\*bar" matches "foo*bar").</li></ul></p><p>After <b>editing text</b>, press ENTER or TAB key (or click anywhere outside the box) to update the filter.</p><p>To <b>remove an entry</b> from the filter selector list, first choose it, and while in the line editor press <kbd>Shift-Delete</kbd> (or <kbd>Shift-Backspace</kbd>) key combination. The default filters cannot be removed. Up to 50 filters are stored.</p></body></html>
<html><head><style>kbd {background-color: palette(alternate-base); font-size: large; white-space: nowrap;}</style></head><body><p>Le filtre supporte deux types de syntaxes: la recherche simple utilisant les métacaractères ou la recherche avancée utilisant les expressions régulières (<code>RegEx</code>) de type Perl.</p><p>Par défaut, un filtre ne montre que les lignes qui correspondent (<b>inclusif</b>). Pour faire un filtre <b>exclusif</b> qui supprime les lignes de correspondance, préfixez l'expression du filtre avec un <kbd>!</kbd> (point d'exclamation).</p><p>Pour utiliser les <b>Expressions Régulières</b> (RegEx), préfixez le texte du filtre avec un <kbd>/</kbd> (slash) ou <kbd>^</kbd> (accent circonflexe).<ul><li>Il faut mettre le <kbd>!</kbd> <u>avant</u> le <kbd>/</kbd> ou <kbd>^</kbd> dans le cas d'un filtre exclusif.</li><li>Par défaut, la correspondance est sensible à la casse (ex: a ≠ A). Pour la rendre insensible (ex: a = A), ajoutez l'opérateur typique <kbd>/i</kbd> (slash i) à la fin de votre RegEx.</li><li>Si vous utilisez un <kbd>^</kbd> pour désigner une RegEx, il deviendra une partie de la RegEx (<kbd>^</kbd> est le caractère de début de chaîne).</li><li>Si la RegEx n'est pas valide, le champ d'édition du filtre affichera une bordure rouge et vous ne pourrez pas activer le filtre.</li><li>Une ressource utile pour tester les RegExs (avec une référence complète) peut être trouvée sur le site <a href="http://www.regexr.com/">http://www.regexr.com/</a> (tutoriel en français: <a href="http://perl.mines-albi.fr/DocFr/perlretut.html">Expressions rationnelles/régulières en Perl</a>)</li></ul></p><p>Pour utiliser la <b>recherche simple</b>, tapez simplement le texte recherché.<ul><li>Métacaractères: le quantificateur <kbd>*</kbd> (astérisque) correspond à zéro ou plus de n'importe quel caractère, et le quantificateur <kbd>?</kbd> (point d'interrogation) correspond à un caractère unique.</li><li>La correspondance est toujours sensible à la casse.</li><li>La correspondance commence toujours au début du Log. Pour ignorer les caractères au début, utilisez le métacaractère <kbd>*</kbd>.</li><li>Un métacaractère <kbd>*</kbd> est implicitement ajouté à la fin (ainsi, toutes les correspondances valides soient bien affichées jusqu'à la fin du Log). Si vous voulez éviter ce métacaractère implicite, il faut utiliser une RegEx.</li><li>Pour rechercher un caractère qui est lui-même un métacaractère, il faut préfixer avec un <kbd>\</kbd> (backslash) (ex: "<i>toto\*titi</i>" correspond à "<i>toto*titi</i>").</li></ul></p><p>Quand l'<b>édition</b> est terminée, appuyez sur la touche ENTRER ou TAB (ou cliquez n'importe où à l'extérieur du champ du filtre) afin de mettre à jour le filtre.</p><p>Pour <b>retirer un filtre de l'historique</b>, sélectionnez-le d'abord, puis faite le raccourci clavier <kbd>Shift-Suppr</kbd> (ou <kbd>Shift-Retour Arrière</kbd>). Les filtres par défaut ne peuvent pas être effacés. Jusqu'à 50 filtres peuvent être mémorisés.</p></body></html>
-
+
Debug Console Filter Help
Aide sur les filtres pour la console de débogage
@@ -2857,267 +2862,278 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont
Firmware
-
+
Channel values displayed in us
Positions de voies affichées en µs
-
+
No OverrideCH functions available
Désactive la fonction spéciale "Remplacer VOIExx"
-
+
Possibility to enable FAI MODE (no telemetry) at field
Possibilité d'activer le mode FAI (télémétrie désactivée) sur le terrain
-
+
FAI MODE (no telemetry) always enabled
Mode FAI (télémétrie toujours désactivée)
-
+
Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015
Masque le protocole D8. Légalement obligatoire sur les radios Européennes importées après le 1er janvier 2015
-
-
+
+
Disable HELI menu and cyclic mix support
Supprimer le menu HELICO et les mixages cycliques
-
-
+
+
Disable Global variables
Supprimer le support des variables globales
-
-
+
+
Enable Lua custom scripts screen
Activer l'écran des scripts Lua personnalisés
-
+
Support for PPM internal module hack
Support du remplacement du module interne par un module PPM
-
+
Use alternative SQT5 font
Utiliser la police alternative SQT5
-
+
Disable RAS (SWR)
Désactiver le RAS (SWR). Utile uniquement pour les X9D+ avec un RAS/SWR non fonctionnel
-
+
Pots use in menus navigation
Support de la navigation dans les menus avec les POTS
-
+
FrSky Taranis X9D+
-
+
FrSky Taranis X9D+ 2019
-
+
FrSky Taranis X9D
-
+
Haptic module installed
Module vibreur installé
-
+
FrSky Taranis X9E
-
+
Confirmation before radio shutdown
Confirmation avant l'arrêt de la radio
-
+
Horus gimbals installed (Hall sensors)
Manches Horus à effet HALL installés
-
+
FrSky Taranis X9-Lite
-
+
FrSky Taranis X9-Lite S
-
+
FrSky Taranis X7 / X7S
-
+
+ FrSky Taranis X7 / X7S Access
+
+
+
+
FrSky Taranis X-Lite S/PRO
-
+
FrSky Taranis X-Lite
-
+
FrSky Horus X10 / X10S
-
-
+
+
Support for ACCESS internal module replacement
Prise en charge du module de remplacement interne ACCESS
-
+
FrSky Horus X10 Express / X10S Express
-
+
FrSky Horus X12S
-
+
Use ONLY with first DEV pcb version
Exclusivement pour les Horus DEV
-
+
Enable non certified R9M firmwares
Activer les firmwares R9M non certifiés
-
-
+
+
Support for MULTI internal module
Prise en charge du module MULTI interne
-
+
+
Support for bluetooth module
Prise en charge du module Bluetooth
-
+
+ Radiomaster TX16S
+
+
+
+
Turnigy 9XR-PRO
-
+
Enable HELI menu and cyclic mix support
Activer le menu hélico et les mixages CCPM
-
+
Global variables
Variables globales
-
+
Enable non certified firmwares
Activer les firmwares non certifiés
-
+
In model setup menus automatically set source by moving the control
Sélectionner les sources des mixeurs en bougeant le contrôle désiré
-
+
In model setup menus automatically set switch by moving the control
Sélectionner les interrupteurs en bougeant le contrôle désiré
-
+
No graphical check boxes and sliders
Pas de cases à cocher et de curseurs graphiques
-
+
Battery graph
Graphique de la batterie
-
+
Don't use bold font for highlighting active items
Ne pas mettre les lignes actives en gras
-
+
Turnigy 9XR with m128 chip
Turnigy 9XR avec une puce m128
-
+
Turnigy 9XR
-
+
9X with stock board
9X avec carte mère d'origine
-
+
Enable resetting values by pressing up and down at the same time
Permet la remise à zéro des valeurs en pressant haut-bas en même temps, valeur min avec gauche/bas, valeur max avec haut/droite, inversion avec gauche/droite
-
+
9X with stock board and m128 chip
Carte 9x avec un chip m128
-
+
9X with AR9X board
9X avec carte AR9X
-
+
Jumper T12 / T12 Pro
-
+
Jumper T16 / T16+ / T16 Pro
-
+
9X with Sky9x board
9X avec carte Sky9x
-
+
9X with Gruvin9x board
9X avec carte Gruvin9x
-
+
DIY MEGA2560 radio
Radio DIY à base de MEGA2560
@@ -4047,7 +4063,7 @@ Communs à tous les modèles d'une même EEPROM.
GeneralSettings
-
+
Radio Settings
Paramètres de la radio
@@ -6025,8 +6041,8 @@ Les colonnes contenant l'altitude "GAlt" et la vitesse "GSpd
- total duration
- durée totale
+ time span
+ plage de temps
@@ -6057,14 +6073,14 @@ Les colonnes contenant l'altitude "GAlt" et la vitesse "GSpd
MainWindow
-
-
+
+
Edit
Édition
-
-
+
+
File
Fichier
@@ -6114,17 +6130,17 @@ Les colonnes contenant l'altitude "GAlt" et la vitesse "GSpd
Notes de version
-
+
Compare models
Comparer les modèles
-
+
Show fuses dialog
Afficher les paramètres des fusibles
-
+
A monochrome black icon theme
Thème avec icônes monochromes noires
@@ -6147,214 +6163,214 @@ Nous recommandons de lire attentivement les notes de version à l'aide du b
-
+
Synchronize SD
Synchroniser la carte SD
-
+
New
Nouveau
-
+
Open...
Ouvrir...
-
+
A monochrome white icon theme
Thème avec icônes monochromes blanches
-
+
A monochrome blue icon theme
Thème avec icônes monochromes bleues
-
+
Small
Petites
-
+
Use small toolbar icons
Petites icônes de barre d'outils
-
+
Use normal size toolbar icons
Icônes de barre d'outils normales
-
+
Normal
Normales
-
+
Use big toolbar icons
Grosses icônes de barre d'outils
-
+
Big
Grandes
-
+
Use huge toolbar icons
Immenses icônes de barre d'outils
-
+
Huge
Immenses
-
+
List programmers...
Lister les programmateurs...
-
+
Fuses...
Fusibles...
-
+
Read Firmware from Radio
Lire le firmware de la radio
-
+
Read firmware from Radio
Lire le firmware de la radio
-
+
Write Firmware to Radio
Transférer le firmware à la radio
-
+
Write firmware to Radio
Transférer le firmware à la radio
-
+
Add Radio Profile
Ajouter un profil de radio
-
+
Manuals and other Documents
Manuels et documents
-
+
Open the OpenTX document page in a web browser
Ouvre la page de documentation d'OpenTX dans un navigateur
-
+
Write Models and Settings To Radio
Transférer les paramètres et modèles vers la radio
-
+
Write Models and Settings to Radio
Transférer les paramètres et modèles vers la radio
-
+
Read Models and Settings from Radio
Lire les paramètres et modèles depuis la radio
-
+
OpenTX Companion %1 - Radio: %2 - Profile: %3
OpenTX Companion %1 - Radio: %2 - Profil: %3
-
+
List of recently used files
Liste des fichiers récemment utilisés
-
+
Radio Profiles
Profil radio
-
+
Create or Select Radio Profiles
Créer ou Sélectionner un profil radio
-
+
Configure Communications...
Configurer les communications...
-
+
Configure software for communicating with the Radio
Configurer le programme gérant les communications avec la radio
-
+
Write Backup to Radio
Transférer une sauvegarde à la radio
-
+
Write Backup from file to Radio
Transférer une sauvegarde à la radio
-
+
Backup Radio to File
Sauvegarder la radio
-
+
Save a complete backup file of all settings and model data in the Radio
Créer une copie de sauvegarde de tous les paramètres et modèles de la radio
-
+
Contributors...
Contributeurs...
-
+
A tribute to those who have contributed to OpenTX and Companion
Remerciements à tout ceux qui ont contribué à OpenTX et Companion
-
+
SD card synchronization
Synchronisation de la carte SD
-
+
Recent Files
Fichiers récents
-
+
Set Icon Theme
Choisir le thème d'icônes
-
+
Set Icon Size
Choisir la taille des icônes
-
+
Write
Ecrire
@@ -6374,12 +6390,12 @@ Nous recommandons de lire attentivement les notes de version à l'aide du b
Si vous trouvez ce programme utile, merci de le supporter par une <a href='%1'>donation</a>
-
+
Ready
Prêt
-
+
Show the application's About box
Afficher la fenêtre "A propos" de l'application
@@ -6391,7 +6407,7 @@ Nous recommandons de lire attentivement les notes de version à l'aide du b
-
+
Open Models and Settings file
Ouvrir un fichier de paramètres et modèles
@@ -6402,7 +6418,7 @@ Nous recommandons de lire attentivement les notes de version à l'aide du b
Fichier sauvegardé
-
+
Read Models and Settings From Radio
Lire les paramètres et modèles depuis la radio
@@ -6437,7 +6453,7 @@ Nous recommandons de lire attentivement les notes de version à l'aide du b
Language non valide
-
+
Some text will not be translated until the next time you start Companion. Please note that some translations may not be complete.
Certains textes ne seront pas traduits avant le prochain redémarrage de Companion. Veuillez noter que certaines traductions peuvent ne pas être complètes.
@@ -6493,78 +6509,78 @@ Nous recommandons de lire attentivement les notes de version à l'aide du b
-
+
Create a new Models and Settings file
Créer un nouveau fichier de paramètres et modèles
-
-
+
+
Save Models and Settings file
Enregistrer le fichier de paramètres et modèles
-
+
Save
Enregistrer
-
+
Save As...
Enregistrer sous...
-
+
Close
Fermer
-
+
Close Models and Settings file
Fermer le fichier de paramètres et modèles
-
+
Exit the application
Quitter l'application
-
+
Exit
Quitter
-
+
Create a new Radio Settings Profile
Créer un nouveau profil de paramètres et modèles
-
+
Copy Current Radio Profile
Copier le profil radio actuel
-
+
Duplicate current Radio Settings Profile
Dupliquer les paramètres radio du profil actuel
-
+
Delete the current Radio Settings Profile
Supprimer les paramètres radio du profil actuel
-
+
Use default system language.
Utiliser le langage système par défaut.
-
+
Use %1 language (some translations may not be complete).
Utiliser la langue %1 (certaines traductions peuvent être incomplètes).
-
+
Classical
Classique
@@ -6693,287 +6709,287 @@ Do you wish to continue?
Pas de Radio ou carte SD de détectée !
-
+
Release notes...
Notes de version...
-
+
Show release notes
Afficher les notes de version
-
+
Delete Current Radio Profile...
Supprimer le profil radio actuel...
-
+
Export Application Settings..
Exporter Préférences Application...
-
+
Save all the current %1 and Simulator settings (including radio profiles) to a file.
Enregistrez tous les paramètres actuels %1 et du simulateur (y compris les profils radio) dans un fichier.
-
+
Import Application Settings..
Importer les paramètres de l'application...
-
+
Load %1 and Simulator settings from a prevously exported settings file.
Charger les paramètres %1 et les paramètres de Simulation depuis un fichier précédemment exporté.
-
+
Tabbed Windows
Fenêtres à onglets
-
+
Use tabs to arrange open windows.
Utilisez les onglets pour organiser les fenêtres ouvertes.
-
+
Tile Windows
Titre de la fenêtre
-
+
Arrange open windows across all the available space.
Disposez les fenêtres ouvertes sur tout l'espace disponible.
-
+
Cascade Windows
Fenêtres en cascade
-
+
Arrange all open windows in a stack.
Organisez toutes les fenêtres ouvertes dans une pile.
-
+
Close All Windows
Fermer toutes les fenêtres
-
+
Closes all open files (prompts to save if necessary.
Fermer tous les fichiers ouverts (proposer de sauvegarder si nécessaire).
-
+
Window
Fenêtre
-
+
Ctrl+Shift+S
-
+
Ctrl+Alt+L
-
+
Ctrl+Alt+D
-
+
Ctrl+Alt+R
-
+
The classic companion9x icon theme
Thème d'icônes classique de Companion
-
+
Yerico
-
+
Yellow round honey sweet icon theme
Thème d'icônes rondes jaunes
-
+
Monochrome
-
+
MonoWhite
Monochrome Blanc
-
+
Alt+%1
-
+
- Copy
- Copier
-
+
Companion :: Open files warning
Companion::Ouvrir les fichiers d'avertissement
-
+
Please save or close modified file(s) before deleting the active profile.
Veuillez sauvegarder ou fermer le(s) fichier(s) modifié(s) avant de supprimer le profil actif.
-
+
Not possible to remove profile
Impossible de supprimer le profil
-
+
The default profile can not be removed.
Le profil par défaut ne peut pas être supprimé.
-
+
Confirm Delete Profile
Confirmer la suppression du profil
-
+
Are you sure you wish to delete the "%1" radio profile? There is no way to undo this action!
Etes-vous sûr de vouloir supprimer le profil radio %1? Cette action est irréversible!
-
+
Please save or close all modified files before importing settings
Veuillez sauvegarder ou fermer tous les fichiers modifiés avant d'importer les paramètres
-
+
<html><p>%1 and Simulator settings can be imported (restored) from a previosly saved export (backup) file. This will replace current settings with any settings found in the file.</p><p>An automatic backup of the current settings will be attempted. But if the current settings are useful then it is recommended that you make a manual backup first.</p><p>For best results when importing settings, <b>close any other %1 windows you may have open, and make sure the standalone Simulator application is not running.</p><p>Do you wish to continue?</p></html>
<html><p>%1 et les paramètres du simulateur peuvent être importés (restaurés) à partir d’un fichier d’exportation (sauvegarde) préalablement sauvegardé. Ceci remplacera les paramètres actuels par tous les paramètres trouvés dans le fichier.</p><p>Une sauvegarde automatique des paramètres actuels sera tentée. Mais si les paramètres actuels sont utiles, il est recommandé de commencer par une sauvegarde manuelle.</p><p>Pour obtenir de meilleurs résultats lors de l'importation des paramètres,<b> fermez les autres fenêtres %1 que vous avez éventuellement ouvertes et assurez-vous que l'application autonome Simulator n'est pas en cours d'exécution. </p><p>Souhaitez-vous continuer? </p></html>
-
+
Confirm Settings Import
Confirmer les paramètres d'importation
-
+
Select %1:
Sélectionnez %1:
-
+
backup
sauvegarde
-
+
Press the 'Ignore' button to continue anyway.
Appuyez sur le bouton 'Ignorer' pour continuer quand même.
-
+
The settings could not be imported.
Les paramètres n'ont pas pu être importés.
-
+
<html><p>New settings have been imported from:<br> %1.</p><p>%2 will now re-initialize.</p><p>Note that you may need to close and restart %2 before some settings like language and icon theme take effect.</p>
<html><p>Les nouveaux paramètres ont été importés depuis:<br> %1. </p><p>%2 sera maintenant réinitialisé.</p><p>Notez que vous devrez peut-être fermer et redémarrer %2 avant que certains paramètres tels que la langue et le thème d’icône prennent effet.</p>
-
+
<p>The previous settings were backed up to:<br> %1</p>
<p>Les paramètres précédents ont été sauvegardés sous:<br> %1 </p>
-
+
MonoBlue
Monochrome Bleu
-
+
System language
Langue du système
-
+
About...
A propos...
-
+
View Log File...
Ouvrir un Log...
-
+
Open and view log file
Ouvrir et visualiser un log
-
+
Settings...
Préférences...
-
+
Edit Settings
Éditer les préférences
-
+
Download...
Télécharger...
-
+
Download firmware and voice files
Télécharger firmware et fichiers son
-
+
Check for Updates...
Vérifier les mises à jour...
-
+
Check OpenTX and Companion updates
Vérifier les mises à jour d'OpenTX et Companion
-
+
Compare Models...
Comparer 2 modèles...
-
+
Edit Radio Splash Image...
Éditer l'écran d'accueil de la radio...
-
+
Edit the splash image of your Radio
Éditer l'écran d'accueil de la radio
-
+
List available programmers
Lister les programmateurs supportés
@@ -6990,8 +7006,8 @@ Do you wish to continue?
Aucune mise à jour disponible.
-
-
+
+
Help
Aide
@@ -7011,27 +7027,27 @@ Do you wish to continue?
A propos de Companion
-
+
Set Menu Language
Choisir la langue des menus
-
+
Settings
Paramètres
-
+
Read/Write
Transfert
-
+
%2
-
+
New Radio
Nouvelle radio
@@ -7328,11 +7344,6 @@ Do you wish to continue?
Companion :: Conversion Result for %1
Companion :: Résultat de conversion de %1
-
-
- Unable to find Horus radio SD card!
- Impossible de trouver la carte SD de la Horus !
-
Models and Settings written
@@ -7399,6 +7410,11 @@ Do you wish to continue?
<p><b>Currently selected radio type (%1) is not compatible with file %3 (from %2), models and settings need to be converted.</b></p>
<p><b>Le type de radio actuellement sélectionné (%1) n'est pas compatible avec le fichier %3 (à partir de %2), les modèles et les paramètres doivent être convertis.</b></p>
+
+
+ Unable to find radio SD card!
+ Impossible de trouver la carte SD de la radio!
+
Open backup Models and Settings file
@@ -8961,12 +8977,12 @@ Mixage actif par défaut si non-renseigné.
ModuleData
-
+
Positive
-
+
Negative
Négative
@@ -9047,47 +9063,47 @@ Mixage actif par défaut si non-renseigné.
ModulePanel
-
+
Value
Valeur
-
+
Hold
Maintien
-
+
No Pulse
Pas d'impulsion
-
+
Ask
Demander
-
+
Internal
Interne
-
+
Internal + External
Interne + Externe
-
+
External
Externe
-
+
Autodetect Format
Format Détection auto
-
+
Bind on channel
Bind avec VOIE
@@ -9589,7 +9605,7 @@ Mixage actif par défaut si non-renseigné.
DÉFAUT
-
+
Custom - proto %1)
Personnaliser - proto %1)
@@ -9620,22 +9636,22 @@ Mixage actif par défaut si non-renseigné.
OpenTxEepromInterface
-
+
Unknown error
Erreur inconnue
-
+
... plus %1 errors
... plus %1 erreurs
-
+
Cannot write radio settings
Impossible d'écrire les paramètres de la radio
-
+
Cannot write model %1
Impossible d'écrire le modèle %1
@@ -9908,8 +9924,8 @@ Mixage actif par défaut si non-renseigné.
- Unable to find Horus radio SD card!
- Impossible de trouver la carte SD de la Horus !
+ Unable to find radio SD card!
+ Impossible de trouver la carte SD de la radio!
@@ -11025,22 +11041,22 @@ Si cette option est cochée, la voie des gaz est inversée: le ralenti est &apo
SetupPanel
-
+
Timer %1
Chrono %1
-
+
THR
GAZ
-
+
Profile Settings
Paramètres du profil
-
+
SD structure path not specified or invalid
Chemin de la structure SD non spécifié ou invalide
@@ -11764,62 +11780,62 @@ La valeur par défaut est configurée dans le profil radio sélectionné.Simulateur Radio (%1)
-
+
Could not determine startup data source.
Impossible de déterminer les données source.
-
+
Could not load data, possibly wrong format.
Impossible de charger les données, mauvais format.
-
+
Data Load Error
Erreur de lecture des données
-
+
Invalid startup data provided. Plese specify a proper file/path.
Données de démarrage fournies non valides. Veuillez spécifier un fichier/chemin approprié.
-
+
Simulator Startup Error
Erreur de démarrage du simulateur
-
+
Error saving data: could open file for writing: '%1'
Erreur de sauvegarde des données: impossible d'écrire le fichier '%1'
-
+
Error saving data: could not get data from simulator interface.
Erreur de sauvegarde des données: impossible de récupérer les données depuis l'interface de simulation.
-
+
An unexpected error occurred while attempting to save radio data to file '%1'.
Une erreur inattendue s'est produite lors de l'enregistrement des données radio dans le fichier '%1'.
-
+
Data Save Error
Erreur de sauvegarde des données
-
+
Cannot open joystick, joystick disabled
Impossible d'accéder au Joystick, Joystick désactivé
-
+
Radio firmware error: %1
Erreur firmware radio: %1
-
+
- Flight Mode %1 (#%2)
- Phase de Vol %1 (#%2)
diff --git a/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua b/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua
index 18b72623c..106ad939d 100644
--- a/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua
+++ b/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua
@@ -72,7 +72,7 @@ local function incrField(step)
end
else
local min, max = 0, 0
- if field.type <= 5 then
+ if ((field.type <= 5) or (field.type == 8)) then
min = field.min
max = field.max
step = field.step * step
@@ -239,25 +239,21 @@ local function fieldFloatLoad(field, data, offset)
field.default = fieldGetValue(data, offset+12, 4)
fieldUnsignedToSigned(field, 4)
field.prec = data[offset+16]
- if field.prec > 2 then
- field.prec = 2
+ if field.prec > 3 then
+ field.prec = 3
end
field.step = fieldGetValue(data, offset+17, 4)
field.unit, offset = fieldGetString(data, offset+21)
end
+local function formatFloat(num, decimals)
+ local mult = 10^(decimals or 0)
+ local val = num / mult
+ return string.format("%." .. decimals .. "f", val)
+end
+
local function fieldFloatDisplay(field, y, attr)
- local attrnum
- if field.prec == 1 then
- attrnum = LEFT + attr + PREC1
- elseif field.prec == 2 then
- attrnum = LEFT + attr + PREC2
- else
- attrnum = LEFT + attr
- end
- -- lcd.drawNumber(140, y, field.value, attrnum) -- NOTE: original code getLastPos not available in Horus
- -- lcd.drawText(lcd.getLastPos(), y, field.unit, attr) -- NOTE: original code getLastPos not available in Horus
- lcd.drawText(140, y, field.value .. field.unit, attr) -- NOTE: Concenated fields instead of get lastPos
+ lcd.drawText(140, y, formatFloat(field.value, field.prec) .. field.unit, attr)
end
local function fieldFloatSave(field)
@@ -423,7 +419,7 @@ end
-- Main
local function runDevicePage(event)
- if event == EVT_EXIT_BREAK then -- exit script
+ if event == EVT_VIRTUAL_EXIT then -- exit script
if edit == true then
edit = false
local field = getField(lineIndex)
@@ -455,9 +451,9 @@ local function runDevicePage(event)
end
end
elseif edit then
- if event == EVT_VIRTUAL_INC then
+ if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
incrField(1)
- elseif event == EVT_VIRTUAL_DEC then
+ elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
incrField(-1)
end
else
diff --git a/radio/sdcard/horus/SCRIPTS/TOOLS/FrSky SBEC.lua b/radio/sdcard/horus/SCRIPTS/TOOLS/FrSky SBEC.lua
index 15c94c4e6..4e05de057 100644
--- a/radio/sdcard/horus/SCRIPTS/TOOLS/FrSky SBEC.lua
+++ b/radio/sdcard/horus/SCRIPTS/TOOLS/FrSky SBEC.lua
@@ -273,11 +273,6 @@ local function run(event)
if event == nil then
error("Cannot run as a model script!")
return 2
- elseif event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST or event == EVT_SHIFT_BREAK then
- --selectPage(1)
- elseif event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST or event == EVT_SHIFT_LONG then
- --killEvents(event);
- --selectPage(-1)
end
local result = pages[page](event)
diff --git a/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua b/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua
index add0dfac1..c6361454e 100644
--- a/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua
+++ b/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua
@@ -91,9 +91,9 @@ end
-- Main
local function runFieldsPage(event)
- if event == EVT_EXIT_BREAK then -- exit script
+ if event == EVT_VIRTUAL_EXIT then -- exit script
return 2
- elseif event == EVT_ENTER_BREAK or event == EVT_ROT_BREAK then -- toggle editing/selecting current field
+ elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field
if fields[current][5] ~= nil then
edit = not edit
if edit == false then
@@ -101,15 +101,15 @@ local function runFieldsPage(event)
end
end
elseif edit then
- if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT then
+ if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
addField(1)
- elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT then
+ elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
addField(-1)
end
else
- if event == EVT_MINUS_FIRST or event == EVT_ROT_RIGHT then
+ if event == EVT_VIRTUAL_NEXT then
selectField(1)
- elseif event == EVT_PLUS_FIRST or event == EVT_ROT_LEFT then
+ elseif event == EVT_VIRTUAL_PREV then
selectField(-1)
end
end
@@ -465,9 +465,9 @@ local function run(event)
if event == nil then
error("Cannot be run as a model script!")
return 2
- elseif (event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST) and page < #pages-1 then
+ elseif event == EVT_VIRTUAL_NEXT_PAGE and page < #pages-1 then
selectPage(1)
- elseif (event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST) and page > 1 then
+ elseif event == EVT_VIRTUAL_PREV_PAGE and page > 1 then
killEvents(event);
selectPage(-1)
end
diff --git a/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua b/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua
index 975689b7a..0000673d1 100755
--- a/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua
+++ b/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua
@@ -91,9 +91,9 @@ end
-- Main
local function runFieldsPage(event)
- if event == EVT_EXIT_BREAK then -- exit script
+ if event == EVT_VIRTUAL_EXIT then -- exit script
return 2
- elseif event == EVT_ENTER_BREAK or event == EVT_ROT_BREAK then -- toggle editing/selecting current field
+ elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field
if fields[current][5] ~= nil then
edit = not edit
if edit == false then
@@ -101,15 +101,15 @@ local function runFieldsPage(event)
end
end
elseif edit then
- if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT then
+ if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
addField(1)
- elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT then
+ elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
addField(-1)
end
else
- if event == EVT_MINUS_FIRST or event == EVT_ROT_RIGHT then
+ if event == EVT_VIRTUAL_NEXT then
selectField(1)
- elseif event == EVT_PLUS_FIRST or event == EVT_ROT_LEFT then
+ elseif event == EVT_VIRTUAL_PREV then
selectField(-1)
end
end
@@ -465,9 +465,9 @@ local function run(event)
if event == nil then
error("Cannot be run as a model script!")
return 2
- elseif (event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST) and page < #pages-1 then
+ elseif event == EVT_VIRTUAL_NEXT_PAGE and page < #pages-1 then
selectPage(1)
- elseif (event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST) and page > 1 then
+ elseif event == EVT_VIRTUAL_PREV_PAGE and page > 1 then
killEvents(event);
selectPage(-1)
end
diff --git a/radio/sdcard/horus/SxR Calibrate/SxR_Calibrate.lua b/radio/sdcard/horus/SxR Calibrate/SxR_Calibrate.lua
index ac2c6e9ea..a40a3978e 100755
--- a/radio/sdcard/horus/SxR Calibrate/SxR_Calibrate.lua
+++ b/radio/sdcard/horus/SxR Calibrate/SxR_Calibrate.lua
@@ -237,9 +237,9 @@ end
-- Main
local function runFieldsPage(event)
- if event == EVT_EXIT_BREAK then -- exit script
+ if event == EVT_VIRTUAL_EXIT then -- exit script
return 2
- elseif event == EVT_ENTER_BREAK or event == EVT_ROT_BREAK then -- toggle editing/selecting current field
+ elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field
if fields[current][4] ~= nil then
edit = not edit
if edit == false then
@@ -247,15 +247,15 @@ local function runFieldsPage(event)
end
end
elseif edit then
- if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT then
+ if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
addField(1)
- elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT then
+ elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
addField(-1)
end
else
- if event == EVT_MINUS_FIRST or event == EVT_ROT_RIGHT then
+ if event == EVT_VIRTUAL_NEXT then
selectField(1)
- elseif event == EVT_PLUS_FIRST or event == EVT_ROT_LEFT then
+ elseif event == EVT_VIRTUAL_PREV then
selectField(-1)
end
end
@@ -313,11 +313,11 @@ local function runCalibrationPage(event)
lcd.drawBitmap(Bitmap.open("img/done.bmp"),200, 100)
lcd.drawText(160, 220, "Press [RTN] when ready", attr)
end
- if calibrationStep > 6 and (event == EVT_ENTER_BREAK or event == EVT_EXIT_BREAK) then
+ if calibrationStep > 6 and (event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT) then
return 2
- elseif event == EVT_ENTER_BREAK then
+ elseif event == EVT_VIRTUAL_ENTER then
calibrationState = 1
- elseif event == EVT_EXIT_BREAK then
+ elseif event == EVT_VIRTUAL_EXIT then
if calibrationStep > 0 then
calibrationStep = 0
end
@@ -341,9 +341,9 @@ local function run(event)
if event == nil then
error("Cannot be run as a model script!")
return 2
- elseif event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST then
+ elseif event == EVT_VIRTUAL_NEXT_PAGE then
selectPage(1)
- elseif event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST then
+ elseif event == EVT_VIRTUAL_PREV_PAGE then
killEvents(event);
selectPage(-1)
end
diff --git a/radio/sdcard/horus/THEMES/Darkblue/shutdown.bmp b/radio/sdcard/horus/THEMES/Darkblue/shutdown.bmp
new file mode 100755
index 000000000..be7034db7
Binary files /dev/null and b/radio/sdcard/horus/THEMES/Darkblue/shutdown.bmp differ
diff --git a/radio/sdcard/horus/THEMES/Darkblue/tx16s.bmp b/radio/sdcard/horus/THEMES/Darkblue/tx16s.bmp
new file mode 100755
index 000000000..826fc35f0
Binary files /dev/null and b/radio/sdcard/horus/THEMES/Darkblue/tx16s.bmp differ
diff --git a/radio/sdcard/horus/THEMES/Default/tx16s.bmp b/radio/sdcard/horus/THEMES/Default/tx16s.bmp
new file mode 100644
index 000000000..49a08c396
Binary files /dev/null and b/radio/sdcard/horus/THEMES/Default/tx16s.bmp differ
diff --git a/radio/sdcard/horus/WIDGETS/BattCheck/main.lua b/radio/sdcard/horus/WIDGETS/BattCheck/main.lua
index ddd83039d..abe3460d5 100755
--- a/radio/sdcard/horus/WIDGETS/BattCheck/main.lua
+++ b/radio/sdcard/horus/WIDGETS/BattCheck/main.lua
@@ -16,11 +16,16 @@
---- # #
---- #########################################################################
+-- Horus Widget to display the levels of lipo battery with per cell indication
+-- 3djc & Offer Shmuely
+-- Date: 2020
+-- ver: 0.4
+
local _options = {
- { "Sensor", SOURCE, 0 },
+ { "Sensor", SOURCE, 0 }, -- default to 'Cels'
{ "Color", COLOR, WHITE },
{ "Shadow", BOOL, 0 },
- { "LowestCell", BOOL, 1 }
+ { "LowestCell", BOOL, 1 } -- 0=main voltage display shows all-cell-voltage, 1=main voltage display shows lowest-cell
}
-- This function is run once at the creation of the widget
@@ -29,12 +34,12 @@ local function create(zone, options)
zone = zone,
options = options,
counter = 0,
-
shadowed = 0,
+
no_telem_blink = 0,
isDataAvailable = 0,
cellDataLive = {0,0,0,0,0,0},
- cellDataHistoryLowest = {0,0,0,0,0,0},
+ cellDataHistoryLowest = {5,5,5,5,5,5},
cellDataHistoryCellLowest = 5,
cellMax = 0,
cellMin = 0,
@@ -112,51 +117,47 @@ local function calculateBatteryData(wgt)
return
end
-
-- this is necessary for simu where cell-count can change
if #wgt.cellDataHistoryLowest ~= #newCellData then
wgt.cellDataHistoryLowest = {}
for k, v in pairs(newCellData) do
- wgt.cellDataHistoryLowest[k] = v
- end
- end
- -- stores the lowest cell values in historical table
- for k, v in pairs(newCellData) do
- if v < wgt.cellDataHistoryLowest[k] then
- wgt.cellDataHistoryLowest[k] = v
+ wgt.cellDataHistoryLowest[k] = 5 -- invalid reading, set high value so the min() will update it soon
end
end
- --- calc highest of all cels
local cellMax = 0
+ local cellMin = 5
+ local cellSum = 0
for k, v in pairs(newCellData) do
+ -- stores the lowest cell values in historical table
+ if v > 1 and v < wgt.cellDataHistoryLowest[k] then -- min 1v to consider a valid reading
+ wgt.cellDataHistoryLowest[k] = v
+
+ --- calc history lowest of all cells
+ if v < wgt.cellDataHistoryCellLowest then
+ wgt.cellDataHistoryCellLowest = v
+ end
+
+ end
+
+ -- calc highest of all cells
if v > cellMax then
cellMax = v
end
- end
- wgt.cellMax = cellMax
- --- calc lowest of all cels
- local cellMin = 5
- for k, v in pairs(newCellData) do
- if v < cellMin and v > 1 then -- >1 to ignore invalid values
+ --- calc lowest of all cells
+ if v < cellMin and v > 1 then -- min 1v to consider a valid reading
cellMin = v
end
- end
- wgt.cellMin = cellMin
-
- --- calc history lowest of all cells
- if cellMin < wgt.cellDataHistoryCellLowest and cellMin > 1 then -- >1 to ignore invalid values
- wgt.cellDataHistoryCellLowest = cellMin
- end
-
- wgt.cellCount = #newCellData
-
- --- sum of all cells
- local cellSum = 0
- for k, v in pairs(newCellData) do
+ --- sum of all cells
cellSum = cellSum + v
+
+
end
+
+ wgt.cellMin = cellMin
+ wgt.cellMax = cellMax
+ wgt.cellCount = #newCellData
wgt.cellSum = cellSum
--- average of all cells
@@ -328,7 +329,7 @@ local function refreshZoneLarge(wgt)
lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y, wgt.cellPercent .. "%", RIGHT + DBLSIZE + CUSTOM_COLOR + wgt.shadowed)
lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + 30, string.format("%2.1fV", wgt.mainValue), RIGHT + DBLSIZE + CUSTOM_COLOR + wgt.shadowed)
- lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + 70, string.format("%2.1fV %2.1fS", wgt.secondaryValue, wgt.cellCount), RIGHT + SMLSIZE + CUSTOM_COLOR + wgt.shadowed)
+ lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + 70, string.format("%2.1fV %dS", wgt.secondaryValue, wgt.cellCount), RIGHT + SMLSIZE + CUSTOM_COLOR + wgt.shadowed)
-- fill batt
lcd.setColor(CUSTOM_COLOR, getPercentColor(wgt.cellPercent))
lcd.drawFilledRectangle(wgt.zone.x + myBatt.x, wgt.zone.y + myBatt.y + myBatt.h + myBatt.cath_h - math.floor(wgt.cellPercent / 100 * myBatt.h), myBatt.w, math.floor(wgt.cellPercent / 100 * myBatt.h), CUSTOM_COLOR)
@@ -372,7 +373,7 @@ local function refreshZoneXLarge(wgt)
lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + myBatt.y, wgt.cellPercent .. "%", RIGHT + DBLSIZE + CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink)
lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + myBatt.y + 30, string.format("%2.1fV", wgt.mainValue), RIGHT + DBLSIZE + CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink)
- lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + myBatt.y + 105, string.format("%2.1fV %2.1fS", wgt.secondaryValue, wgt.cellCount), RIGHT + SMLSIZE + CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink)
+ lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + myBatt.y + 105, string.format("%2.1fV %dS", wgt.secondaryValue, wgt.cellCount), RIGHT + SMLSIZE + CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink)
-- draw cells
local pos = { { x = 111, y = 38 }, { x = 164, y = 38 }, { x = 217, y = 38 }, { x = 111, y = 57 }, { x = 164, y = 57 }, { x = 217, y = 57 } }
diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/CROSSFIRE/device.lua b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/CROSSFIRE/device.lua
index 8ccdbf285..b6115d088 100644
--- a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/CROSSFIRE/device.lua
+++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/CROSSFIRE/device.lua
@@ -72,7 +72,7 @@ local function incrField(step)
end
else
local min, max = 0, 0
- if field.type <= 5 then
+ if ((field.type <= 5) or (field.type == 8)) then
min = field.min
max = field.max
step = field.step * step
@@ -238,23 +238,21 @@ local function fieldFloatLoad(field, data, offset)
field.default = fieldGetValue(data, offset+12, 4)
fieldUnsignedToSigned(field, 4)
field.prec = data[offset+16]
- if field.prec > 2 then
- field.prec = 2
+ if field.prec > 3 then
+ field.prec = 3
end
field.step = fieldGetValue(data, offset+17, 4)
field.unit, offset = fieldGetString(data, offset+21)
end
+local function formatFloat(num, decimals)
+ local mult = 10^(decimals or 0)
+ local val = num / mult
+ return string.format("%." .. decimals .. "f", val)
+end
+
local function fieldFloatDisplay(field, y, attr)
- local attrnum
- if field.prec == 1 then
- attrnum = LEFT + attr + PREC1
- elseif field.prec == 2 then
- attrnum = LEFT + attr + PREC2
- else
- attrnum = LEFT + attr
- end
- lcd.drawNumber(89, y, field.value, attrnum)
+ lcd.drawText(89, y, formatFloat(field.value, field.prec), LEFT + attr)
lcd.drawText(lcd.getLastPos(), y, field.unit, attr)
end
diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky SBEC.lua b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky SBEC.lua
index 15c94c4e6..4e05de057 100644
--- a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky SBEC.lua
+++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky SBEC.lua
@@ -273,11 +273,6 @@ local function run(event)
if event == nil then
error("Cannot run as a model script!")
return 2
- elseif event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST or event == EVT_SHIFT_BREAK then
- --selectPage(1)
- elseif event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST or event == EVT_SHIFT_LONG then
- --killEvents(event);
- --selectPage(-1)
end
local result = pages[page](event)
diff --git a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/delta.lua b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/delta.lua
index b30185e2f..bcd9238f4 100755
--- a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/delta.lua
+++ b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/delta.lua
@@ -52,10 +52,10 @@ end
local function fieldIncDec(event, value, max, force)
if edit or force==true then
- if event == EVT_ROT_LEFT or event == EVT_UP_BREAK then
+ if event == EVT_VIRTUAL_PREV or event == EVT_VIRTUAL_PREV_REPT then
value = (value + max)
dirty = true
- elseif event == EVT_ROT_RIGHT or event == EVT_DOWN_BREAK then
+ elseif event == EVT_VIRTUAL_NEXT or event == EVT_VIRTUAL_NEXT_REPT then
value = (value + max + 2)
dirty = true
end
@@ -66,12 +66,12 @@ end
local function valueIncDec(event, value, min, max)
if edit then
- if event == EVT_ROT_RIGHT or event == EVT_RIGHT_BREAK then
+ if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
if value < max then
value = (value + 1)
dirty = true
end
- elseif event == EVT_ROT_LEFT or event == EVT_LEFT_BREAK then
+ elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
if value > min then
value = (value - 1)
dirty = true
@@ -82,22 +82,22 @@ local function valueIncDec(event, value, min, max)
end
local function navigate(event, fieldMax, prevPage, nextPage)
- if event == EVT_ENTER_BREAK then
+ if event == EVT_VIRTUAL_ENTER then
edit = not edit
dirty = true
elseif edit then
- if event == EVT_EXIT_BREAK then
+ if event == EVT_VIRTUAL_EXIT then
edit = false
dirty = true
elseif not dirty then
dirty = blinkChanged()
end
else
- if event == EVT_PAGE_BREAK or event==EVT_RIGHT_BREAK then
+ if event == EVT_VIRTUAL_NEXT then
page = nextPage
field = 0
dirty = true
- elseif event == EVT_PAGE_LONG or event==EVT_LEFT_BREAK then
+ elseif event == EVT_VIRTUAL_PREV then
page = prevPage
field = 0
killEvents(event);
@@ -120,7 +120,7 @@ local function getFieldFlags(position)
end
local function channelIncDec(event, value)
- if not edit and event==EVT_MENU_BREAK then
+ if not edit and event==EVT_VIRTUAL_MENU then
servoPage = value
dirty = true
else
@@ -276,7 +276,7 @@ local function servoMenu(event)
limits.revert = fieldIncDec(event, limits.revert, 1)
end
model.setOutput(servoPage, limits)
- elseif event == EVT_EXIT_BREAK then
+ elseif event == EVT_VIRTUAL_EXIT then
servoPage = nil
dirty = true
end
@@ -348,9 +348,9 @@ local function confirmationMenu(event)
navigate(event, fieldsMax, RUDDER_PAGE, page)
- if event == EVT_EXIT_BREAK then
+ if event == EVT_VIRTUAL_EXIT then
return 2
- elseif event == EVT_ENTER_LONG then
+ elseif event == EVT_VIRTUAL_ENTER_LONG then
killEvents(event)
applySettings()
return 2
diff --git a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua
index ebc7c536f..f4677ed4e 100755
--- a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua
+++ b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua
@@ -58,10 +58,10 @@ end
local function fieldIncDec(event, value, max, force)
if edit or force==true then
- if event == EVT_ROT_RIGHT then
+ if event == EVT_VIRTUAL_INC then
value = (value + max)
dirty = true
- elseif event == EVT_ROT_LEFT then
+ elseif event == EVT_VIRTUAL_DEC then
value = (value + max + 2)
dirty = true
end
@@ -72,12 +72,12 @@ end
local function valueIncDec(event, value, min, max)
if edit then
- if event == EVT_ROT_RIGHT or event == EVT_RIGHT_FIRST then
+ if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
if value < max then
value = (value + 1)
dirty = true
end
- elseif event == EVT_ROT_LEFT or event == EVT_LEFT_FIRST then
+ elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
if value > min then
value = (value - 1)
dirty = true
@@ -88,11 +88,11 @@ local function valueIncDec(event, value, min, max)
end
local function navigate(event, fieldMax, prevPage, nextPage)
- if event == EVT_ENTER_BREAK then
+ if event == EVT_VIRTUAL_ENTER then
edit = not edit
dirty = true
elseif edit then
- if event == EVT_EXIT_BREAK then
+ if event == EVT_VIRTUAL_EXIT then
edit = false
dirty = true
elseif not dirty then
@@ -126,7 +126,7 @@ local function getFieldFlags(position)
end
local function channelIncDec(event, value)
- if not edit and event==EVT_MENU_BREAK then
+ if not edit and event==EVT_VIRTUAL_MENU then
servoPage = value
dirty = true
else
@@ -137,12 +137,12 @@ end
local function switchValueIncDec(event, value, min, max)
if edit then
- if event == EVT_ROT_RIGHT or event == EVT_RIGHT_FIRST then
+ if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
if value < max then
value = (value + 1)
dirty = true
end
- elseif event == EVT_ROT_LEFT or event == EVT_LEFT_FIRST then
+ elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
if value > min then
value = (value - 1)
dirty = true
@@ -153,7 +153,7 @@ local function switchValueIncDec(event, value, min, max)
end
local function switchIncDec(event, value)
- if not edit and event==EVT_MENU_BREAK then
+ if not edit and event== EVT_VIRTUAL_MENU then
servoPage = value
dirty = true
else
@@ -399,9 +399,9 @@ local function confirmationMenu(event)
navigate(event, fieldsMax, BEEPER_PAGE, page)
- if event == EVT_EXIT_BREAK then
+ if event == EVT_VIRTUAL_EXIT then
return 2
- elseif event == EVT_ENTER_LONG then
+ elseif event == EVT_VIRTUAL_ENTER_LONG then
killEvents(event)
applySettings()
return 2
diff --git a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/plane.lua b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/plane.lua
index 6558b8f12..26282cdf7 100755
--- a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/plane.lua
+++ b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/plane.lua
@@ -62,10 +62,10 @@ end
local function fieldIncDec(event, value, max, force)
if edit or force==true then
- if event == EVT_ROT_LEFT or event == EVT_UP_BREAK then
+ if event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
value = (value + max)
dirty = true
- elseif event == EVT_ROT_RIGHT or event == EVT_DOWN_BREAK then
+ elseif event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
value = (value + max + 2)
dirty = true
end
@@ -76,12 +76,12 @@ end
local function valueIncDec(event, value, min, max)
if edit then
- if event == EVT_ROT_RIGHT or event == EVT_RIGHT_BREAK then
+ if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
if value < max then
value = (value + 1)
dirty = true
end
- elseif event == EVT_ROT_LEFT or event == EVT_LEFT_BREAK then
+ elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
if value > min then
value = (value - 1)
dirty = true
@@ -92,11 +92,11 @@ local function valueIncDec(event, value, min, max)
end
local function navigate(event, fieldMax, prevPage, nextPage)
- if event == EVT_ENTER_BREAK then
+ if event == EVT_VIRTUAL_ENTER then
edit = not edit
dirty = true
elseif edit then
- if event == EVT_EXIT_BREAK then
+ if event == EVT_VIRTUAL_EXIT then
edit = false
dirty = true
elseif not dirty then
@@ -130,7 +130,7 @@ local function getFieldFlags(position)
end
local function channelIncDec(event, value)
- if not edit and event==EVT_MENU_BREAK then
+ if not edit and event==EVT_VIRTUAL_MENU then
servoPage = value
dirty = true
else
@@ -420,7 +420,7 @@ local function servoMenu(event)
limits.revert = fieldIncDec(event, limits.revert, 1)
end
model.setOutput(servoPage, limits)
- elseif event == EVT_EXIT_BREAK then
+ elseif event == EVT_VIRTUAL_EXIT then
servoPage = nil
dirty = true
end
@@ -544,9 +544,9 @@ local function confirmationMenu(event)
navigate(event, fieldsMax, TAIL_PAGE, page)
- if event == EVT_EXIT_BREAK then
+ if event == EVT_VIRTUAL_EXIT then
return 2
- elseif event == EVT_ENTER_LONG then
+ elseif event == EVT_VIRTUAL_ENTER_LONG then
killEvents(event)
applySettings()
return 2
diff --git a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/wizard.lua b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/wizard.lua
index 2568f22b9..06f365c9c 100755
--- a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/wizard.lua
+++ b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/wizard.lua
@@ -23,9 +23,9 @@ local MODELTYPE_QUAD = 2
-- Common functions
local function fieldIncDec(event, value, max)
- if event == EVT_ROT_LEFT or event == EVT_UP_BREAK then
+ if event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
value = (value + max)
- elseif event == EVT_ROT_RIGHT or event == EVT_DOWN_BREAK then
+ elseif event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
value = (value + max + 2)
end
value = (value % (max+1))
@@ -53,7 +53,7 @@ end
local function modelTypeMenu(event)
drawModelChoiceMenu()
- if event == EVT_ENTER_BREAK then
+ if event == EVT_VIRTUAL_ENTER then
if modelType == MODELTYPE_PLANE then
return "plane.lua"
elseif modelType == MODELTYPE_DELTA then
@@ -73,7 +73,7 @@ local function run(event)
error("Cannot be run as a model script!")
end
- if event == EVT_EXIT_BREAK then
+ if event == EVT_VIRTUAL_EXIT then
return 2
end
diff --git a/radio/sdcard/taranis-x7/SCRIPTS/snake.lua b/radio/sdcard/taranis-x7/SCRIPTS/snake.lua
index 012a9f1e1..d3a1914bb 100644
--- a/radio/sdcard/taranis-x7/SCRIPTS/snake.lua
+++ b/radio/sdcard/taranis-x7/SCRIPTS/snake.lua
@@ -127,7 +127,7 @@ local function run(event)
raise("Cannot be run as a model script!")
end
- if event == EVT_EXIT_BREAK then
+ if event == EVT_VIRTUAL_EXIT then
return 2
end
diff --git a/radio/sdcard/taranis-x7/SxR Calibrate/SxR_Calibrate.lua b/radio/sdcard/taranis-x7/SxR Calibrate/SxR_Calibrate.lua
index 5b2e141a8..b9e406691 100644
--- a/radio/sdcard/taranis-x7/SxR Calibrate/SxR_Calibrate.lua
+++ b/radio/sdcard/taranis-x7/SxR Calibrate/SxR_Calibrate.lua
@@ -62,10 +62,10 @@ local function runWarningPage(event)
lcd.drawText(0, 30, "power, and a level surface.", SMLSIZE)
lcd.drawText(0, 40, "Press [Enter] when ready", SMLSIZE)
lcd.drawText(0, 50, "Press [Exit] to cancel", SMLSIZE)
- if event == EVT_ENTER_BREAK then
+ if event == EVT_VIRTUAL_ENTER then
selectPage(1)
return 0
- elseif event == EVT_EXIT_BREAK then
+ elseif event == EVT_VIRTUAL_EXIT then
return 2
end
return 0
@@ -186,9 +186,9 @@ end
-- Main
local function runFieldsPage(event)
- if event == EVT_EXIT_BREAK then -- exit script
+ if event == EVT_VIRTUAL_EXIT then -- exit script
return 2
- elseif event == EVT_ENTER_BREAK then -- toggle editing/selecting current field
+ elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field
if fields[current][4] ~= nil then
edit = not edit
if edit == false then
@@ -196,15 +196,15 @@ local function runFieldsPage(event)
end
end
elseif edit then
- if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT or event == EVT_DOWN_BREAK then
+ if event == EVT_VIRTUAL_NEXT or event == EVT_VIRTUAL_NEXT_REP then
addField(1)
- elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT or event == EVT_UP_BREAK then
+ elseif event == EVT_VIRTUAL_PREV or event == EVT_VIRTUAL_PREV_REP then
addField(-1)
end
else
- if event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_UP_BREAK then
+ if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REP then
selectField(1)
- elseif event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_DOWN_BREAK then
+ elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REP then
selectField(-1)
end
end
@@ -260,9 +260,9 @@ local function runCalibrationPage(event)
-- lcd.drawText(10, 19, "Done",0)
lcd.drawText(0, 56, "Press [Exit] when ready", attr)
end
- if calibrationStep > 6 and (event == EVT_ENTER_BREAK or event == EVT_EXIT_BREAK) then
+ if calibrationStep > 6 and (event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT) then
return 2
- elseif event == EVT_ENTER_BREAK and positionConfirmed then
+ elseif event == EVT_VIRTUAL_ENTER and positionConfirmed then
calibrationState = 1
positionConfirmed = 0
end
@@ -284,9 +284,9 @@ local function run(event)
if event == nil then
error("Cannot be run as a model script!")
return 2
- elseif event == EVT_PAGE_BREAK or event==EVT_RIGHT_BREAK then
+ elseif event == EVT_VIRTUAL_NEXT_PAGE then
selectPage(1)
- elseif event == EVT_PAGE_LONG or event==EVT_LEFT_BREAK then
+ elseif event == EVT_VIRTUAL_PREV_PAGE then
killEvents(event);
selectPage(-1)
end
diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/CROSSFIRE/device.lua b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/CROSSFIRE/device.lua
index 58416af36..833ec6d83 100644
--- a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/CROSSFIRE/device.lua
+++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/CROSSFIRE/device.lua
@@ -72,7 +72,7 @@ local function incrField(step)
end
else
local min, max = 0, 0
- if field.type <= 5 then
+ if ((field.type <= 5) or (field.type == 8)) then
min = field.min
max = field.max
step = field.step * step
@@ -238,23 +238,21 @@ local function fieldFloatLoad(field, data, offset)
field.default = fieldGetValue(data, offset+12, 4)
fieldUnsignedToSigned(field, 4)
field.prec = data[offset+16]
- if field.prec > 2 then
- field.prec = 2
+ if field.prec > 3 then
+ field.prec = 3
end
field.step = fieldGetValue(data, offset+17, 4)
field.unit, offset = fieldGetString(data, offset+21)
end
+local function formatFloat(num, decimals)
+ local mult = 10^(decimals or 0)
+ local val = num / mult
+ return string.format("%." .. decimals .. "f", val)
+end
+
local function fieldFloatDisplay(field, y, attr)
- local attrnum
- if field.prec == 1 then
- attrnum = LEFT + attr + PREC1
- elseif field.prec == 2 then
- attrnum = LEFT + attr + PREC2
- else
- attrnum = LEFT + attr
- end
- lcd.drawNumber(140, y, field.value, attrnum)
+ lcd.drawText(140, y, formatFloat(field.value, field.prec), LEFT + attr)
lcd.drawText(lcd.getLastPos(), y, field.unit, attr)
end
diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky SBEC.lua b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky SBEC.lua
index 15c94c4e6..4e05de057 100644
--- a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky SBEC.lua
+++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky SBEC.lua
@@ -273,11 +273,6 @@ local function run(event)
if event == nil then
error("Cannot run as a model script!")
return 2
- elseif event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST or event == EVT_SHIFT_BREAK then
- --selectPage(1)
- elseif event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST or event == EVT_SHIFT_LONG then
- --killEvents(event);
- --selectPage(-1)
end
local result = pages[page](event)
diff --git a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/delta.lua b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/delta.lua
index 06af19541..cf559c6b2 100644
--- a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/delta.lua
+++ b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/delta.lua
@@ -52,10 +52,10 @@ end
local function fieldIncDec(event, value, max, force)
if edit or force==true then
- if event == EVT_PLUS_BREAK or event == EVT_ROT_LEFT then
+ if event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
value = (value + max)
dirty = true
- elseif event == EVT_MINUS_BREAK or event == EVT_ROT_RIGHT then
+ elseif event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
value = (value + max + 2)
dirty = true
end
@@ -66,12 +66,12 @@ end
local function valueIncDec(event, value, min, max)
if edit then
- if event == EVT_PLUS_FIRST or event == EVT_PLUS_REPT or event == EVT_ROT_RIGHT then
+ if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
if value < max then
value = (value + 1)
dirty = true
end
- elseif event == EVT_MINUS_FIRST or event == EVT_MINUS_REPT or event == EVT_ROT_LEFT then
+ elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
if value > min then
value = (value - 1)
dirty = true
@@ -82,11 +82,11 @@ local function valueIncDec(event, value, min, max)
end
local function navigate(event, fieldMax, prevPage, nextPage)
- if event == EVT_ENTER_BREAK then
+ if event == EVT_VIRTUAL_ENTER then
edit = not edit
dirty = true
elseif edit then
- if event == EVT_EXIT_BREAK then
+ if event == EVT_VIRTUAL_EXIT then
edit = false
dirty = true
elseif not dirty then
@@ -120,7 +120,7 @@ local function getFieldFlags(position)
end
local function channelIncDec(event, value)
- if not edit and event==EVT_MENU_BREAK then
+ if not edit and event == EVT_VIRTUAL_MENU then
servoPage = value
dirty = true
else
@@ -284,7 +284,7 @@ local function servoMenu(event)
limits.revert = fieldIncDec(event, limits.revert, 1)
end
model.setOutput(servoPage, limits)
- elseif event == EVT_EXIT_BREAK then
+ elseif event == EVT_VIRTUAL_EXIT then
servoPage = nil
dirty = true
end
@@ -357,9 +357,9 @@ local function confirmationMenu(event)
navigate(event, fieldsMax, RUDDER_PAGE, page)
- if event == EVT_EXIT_BREAK then
+ if event == EVT_VIRTUAL_EXIT then
return 2
- elseif event == EVT_ENTER_LONG then
+ elseif event == EVT_VIRTUAL_ENTER_LONG then
killEvents(event)
applySettings()
return 2
diff --git a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua
index 773abafad..3296626ad 100644
--- a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua
+++ b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua
@@ -57,10 +57,10 @@ end
local function fieldIncDec(event, value, max, force)
if edit or force==true then
- if event == EVT_PLUS_BREAK or event == EVT_ROT_LEFT then
+ if event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
value = (value + max)
dirty = true
- elseif event == EVT_MINUS_BREAK or event == EVT_ROT_RIGHT then
+ elseif event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
value = (value + max + 2)
dirty = true
end
@@ -71,12 +71,12 @@ end
local function valueIncDec(event, value, min, max)
if edit then
- if event == EVT_PLUS_FIRST or event == EVT_PLUS_REPT or event == EVT_ROT_RIGHT then
+ if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
if value < max then
value = (value + 1)
dirty = true
end
- elseif event == EVT_MINUS_FIRST or event == EVT_MINUS_REPT or event == EVT_ROT_LEFT then
+ elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
if value > min then
value = (value - 1)
dirty = true
@@ -87,11 +87,11 @@ local function valueIncDec(event, value, min, max)
end
local function navigate(event, fieldMax, prevPage, nextPage)
- if event == EVT_ENTER_BREAK then
+ if event == EVT_VIRTUAL_ENTER then
edit = not edit
dirty = true
elseif edit then
- if event == EVT_EXIT_BREAK then
+ if event == EVT_VIRTUAL_EXIT then
edit = false
dirty = true
elseif not dirty then
@@ -125,7 +125,7 @@ local function getFieldFlags(position)
end
local function channelIncDec(event, value)
- if not edit and event==EVT_MENU_BREAK then
+ if not edit and event == EVT_VIRTUAL_MENU then
servoPage = value
dirty = true
else
@@ -136,12 +136,12 @@ end
local function switchValueIncDec(event, value, min, max)
if edit then
- if event == EVT_PLUS_FIRST or event == EVT_PLUS_REPT or event == EVT_ROT_RIGHT then
+ if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
if value < max then
value = (value + 1)
dirty = true
end
- elseif event == EVT_MINUS_FIRST or event == EVT_MINUS_REPT or event == EVT_ROT_LEFT then
+ elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
if value > min then
value = (value - 1)
dirty = true
@@ -152,7 +152,7 @@ local function switchValueIncDec(event, value, min, max)
end
local function switchIncDec(event, value)
- if not edit and event==EVT_MENU_BREAK then
+ if not edit and event == EVT_VIRTUAL_MENU then
servoPage = value
dirty = true
else
@@ -415,9 +415,9 @@ local function confirmationMenu(event)
navigate(event, fieldsMax, BEEPER_PAGE, page)
- if event == EVT_EXIT_BREAK then
+ if event == EVT_VIRTUAL_EXIT then
return 2
- elseif event == EVT_ENTER_LONG then
+ elseif event == EVT_VIRTUAL_ENTER_LONG then
killEvents(event)
applySettings()
return 2
diff --git a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/plane.lua b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/plane.lua
index 5a75fbcc1..7d20bd97e 100644
--- a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/plane.lua
+++ b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/plane.lua
@@ -62,10 +62,10 @@ end
local function fieldIncDec(event, value, max, force)
if edit or force==true then
- if event == EVT_PLUS_BREAK or event == EVT_ROT_LEFT then
+ if event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
value = (value + max)
dirty = true
- elseif event == EVT_MINUS_BREAK or event == EVT_ROT_RIGHT then
+ elseif event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
value = (value + max + 2)
dirty = true
end
@@ -76,12 +76,12 @@ end
local function valueIncDec(event, value, min, max)
if edit then
- if event == EVT_PLUS_FIRST or event == EVT_PLUS_REPT or event == EVT_ROT_RIGHT then
+ if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
if value < max then
value = (value + 1)
dirty = true
end
- elseif event == EVT_MINUS_FIRST or event == EVT_MINUS_REPT or event == EVT_ROT_LEFT then
+ elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
if value > min then
value = (value - 1)
dirty = true
@@ -92,11 +92,11 @@ local function valueIncDec(event, value, min, max)
end
local function navigate(event, fieldMax, prevPage, nextPage)
- if event == EVT_ENTER_BREAK then
+ if event == EVT_VIRTUAL_ENTER then
edit = not edit
dirty = true
elseif edit then
- if event == EVT_EXIT_BREAK then
+ if event == EVT_VIRTUAL_EXIT then
edit = false
dirty = true
elseif not dirty then
@@ -130,7 +130,7 @@ local function getFieldFlags(position)
end
local function channelIncDec(event, value)
- if not edit and event==EVT_MENU_BREAK then
+ if not edit and event == EVT_VIRTUAL_MENU then
servoPage = value
dirty = true
else
@@ -425,7 +425,7 @@ local function servoMenu(event)
limits.revert = fieldIncDec(event, limits.revert, 1)
end
model.setOutput(servoPage, limits)
- elseif event == EVT_EXIT_BREAK then
+ elseif event == EVT_VIRTUAL_EXIT then
servoPage = nil
dirty = true
end
@@ -550,9 +550,9 @@ local function confirmationMenu(event)
navigate(event, fieldsMax, TAIL_PAGE, page)
- if event == EVT_EXIT_BREAK then
+ if event == EVT_VIRTUAL_EXIT then
return 2
- elseif event == EVT_ENTER_LONG then
+ elseif event == EVT_VIRTUAL_ENTER_LONG then
killEvents(event)
applySettings()
return 2
diff --git a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/wizard.lua b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/wizard.lua
index 463522765..7d330daae 100644
--- a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/wizard.lua
+++ b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/wizard.lua
@@ -25,10 +25,10 @@ local MODELTYPE_QUAD = 2
-- Common functions
local function fieldIncDec(event, value, max)
- if event == EVT_PLUS_BREAK or event == EVT_ROT_LEFT or event == EVT_PLUS_REPT then
+ if event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then
value = (value + max)
dirty = true
- elseif event == EVT_MINUS_BREAK or event == EVT_ROT_RIGHT or event == EVT_MINUS_REPT then
+ elseif event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then
value = (value + max + 2)
dirty = true
end
@@ -56,7 +56,7 @@ local function modelTypeMenu(event)
drawModelChoiceMenu()
dirty = false
end
- if event == EVT_ENTER_BREAK then
+ if event == EVT_VIRTUAL_ENTER then
if modelType == MODELTYPE_PLANE then
return "plane.lua"
elseif modelType == MODELTYPE_DELTA then
@@ -77,7 +77,7 @@ local function run(event)
error("Cannot be run as a model script!")
end
- if event == EVT_EXIT_BREAK then
+ if event == EVT_VIRTUAL_EXIT then
return 2
end
return modelTypeMenu(event)
diff --git a/radio/sdcard/taranis-x9/SCRIPTS/snake.lua b/radio/sdcard/taranis-x9/SCRIPTS/snake.lua
index 012a9f1e1..d3a1914bb 100644
--- a/radio/sdcard/taranis-x9/SCRIPTS/snake.lua
+++ b/radio/sdcard/taranis-x9/SCRIPTS/snake.lua
@@ -127,7 +127,7 @@ local function run(event)
raise("Cannot be run as a model script!")
end
- if event == EVT_EXIT_BREAK then
+ if event == EVT_VIRTUAL_EXIT then
return 2
end
diff --git a/radio/sdcard/taranis-x9/SxR Calibrate/SxR_Calibrate.lua b/radio/sdcard/taranis-x9/SxR Calibrate/SxR_Calibrate.lua
index 5a03b1db0..a9c636f30 100644
--- a/radio/sdcard/taranis-x9/SxR Calibrate/SxR_Calibrate.lua
+++ b/radio/sdcard/taranis-x9/SxR Calibrate/SxR_Calibrate.lua
@@ -60,10 +60,10 @@ local function runWarningPage(event)
lcd.drawText(0, 30, "power supply and a flat level surface (desk,...)", SMLSIZE)
lcd.drawText(0, 40, "Press [Enter] when ready", SMLSIZE)
lcd.drawText(0, 50, "Press [Exit] when cancel", SMLSIZE)
- if event == EVT_ENTER_BREAK then
+ if event == EVT_VIRTUAL_ENTER then
selectPage(1)
return 0
- elseif event == EVT_EXIT_BREAK then
+ elseif event == EVT_VIRTUAL_EXIT then
return 2
end
return 0
@@ -184,9 +184,9 @@ end
-- Main
local function runFieldsPage(event)
- if event == EVT_EXIT_BREAK then -- exit script
+ if event == EVT_VIRTUAL_EXIT then -- exit script
return 2
- elseif event == EVT_ENTER_BREAK then -- toggle editing/selecting current field
+ elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field
if fields[current][4] ~= nil then
edit = not edit
if edit == false then
@@ -194,15 +194,15 @@ local function runFieldsPage(event)
end
end
elseif edit then
- if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT then
+ if event == EVT_VIRTUAL_NEXT or event == EVT_VIRTUAL_NEXT_REP then
addField(1)
- elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT then
+ elseif event == EVT_VIRTUAL_PREV or event == EVT_VIRTUAL_PREV_REP then
addField(-1)
end
else
- if event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT then
+ if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REP then
selectField(1)
- elseif event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT then
+ elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REP then
selectField(-1)
end
end
@@ -235,11 +235,11 @@ local function runCalibrationPage(event)
lcd.drawPixmap(10, 19, "bmp/done.bmp")
lcd.drawText(0, 56, "Press [Exit] when ready", attr)
end
- if calibrationStep > 6 and (event == EVT_ENTER_BREAK or event == EVT_EXIT_BREAK) then
+ if calibrationStep > 6 and (event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT) then
return 2
- elseif event == EVT_ENTER_BREAK then
+ elseif event == EVT_VIRTUAL_ENTER then
calibrationState = 1
- elseif event == EVT_EXIT_BREAK then
+ elseif event == EVT_VIRTUAL_EXIT then
if calibrationStep > 0 then
calibrationStep = 0
end
@@ -261,9 +261,9 @@ local function run(event)
if event == nil then
error("Cannot be run as a model script!")
return 2
- elseif event == EVT_PAGE_BREAK then
+ elseif event == EVT_VIRTUAL_NEXT_PAGE then
selectPage(1)
- elseif event == EVT_PAGE_LONG then
+ elseif event == EVT_VIRTUAL_PREV_PAGE then
killEvents(event);
selectPage(-1)
end
diff --git a/radio/src/bitmaps/480x272/mask_txbat_charging.png b/radio/src/bitmaps/480x272/mask_txbat_charging.png
new file mode 100755
index 000000000..99a895151
Binary files /dev/null and b/radio/src/bitmaps/480x272/mask_txbat_charging.png differ
diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h
index 34838ff32..85fb38f06 100644
--- a/radio/src/dataconstants.h
+++ b/radio/src/dataconstants.h
@@ -192,6 +192,8 @@ enum TrainerMode {
#if defined(PCBTARANIS)
TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE,
TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE,
+#endif
+#if defined(PCBTARANIS) || defined(AUX_SERIAL)
TRAINER_MODE_MASTER_BATTERY_COMPARTMENT,
#endif
TRAINER_MODE_MASTER_BLUETOOTH,
@@ -206,7 +208,7 @@ enum TrainerMode {
};
#endif
-#if defined(RADIO_T16) || defined(ALLOW_TRAINER_MULTI)
+#if defined(RADIO_FAMILY_T16) || defined(ALLOW_TRAINER_MULTI)
#define TRAINER_MODE_MAX() TRAINER_MODE_MULTI
#elif defined(BLUETOOTH)
#define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE_BLUETOOTH
diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h
index c972d8ec4..c42249d39 100644
--- a/radio/src/gui/128x64/gui.h
+++ b/radio/src/gui/128x64/gui.h
@@ -300,7 +300,7 @@ void showAlertBox(const char * title, const char * text, const char * action , u
#define LOAD_MODEL_BITMAP()
#define IS_MAIN_VIEW_DISPLAYED() menuHandlers[0] == menuMainView
-#define IS_TELEMETRY_VIEW_DISPLAYED() menuHandlers[0] == menuViewTelemetryFrsky
+#define IS_TELEMETRY_VIEW_DISPLAYED() menuHandlers[0] == menuViewTelemetry
#define IS_OTHER_VIEW_DISPLAYED() false
void editCurveRef(coord_t x, coord_t y, CurveRef & curve, event_t event, LcdFlags flags);
diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h
index ccde94cc9..daa3f1885 100644
--- a/radio/src/gui/128x64/menus.h
+++ b/radio/src/gui/128x64/menus.h
@@ -45,16 +45,16 @@ inline bool isModelMenuDisplayed()
void onMainViewMenu(const char * result);
void menuFirstCalib(event_t event);
void menuMainView(event_t event);
-void menuViewTelemetryFrsky(event_t event);
+void menuViewTelemetry(event_t event);
void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomFunctionsContext * functionsContext);
enum MenuRadioIndexes
{
- MENU_RADIO_SETUP,
- CASE_SDCARD(MENU_RADIO_SD_MANAGER)
#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE)
MENU_RADIO_TOOLS,
#endif
+ CASE_SDCARD(MENU_RADIO_SD_MANAGER)
+ MENU_RADIO_SETUP,
MENU_RADIO_SPECIAL_FUNCTIONS,
MENU_RADIO_TRAINER,
MENU_RADIO_HARDWARE,
@@ -76,11 +76,11 @@ void menuRadioPowerMeter(event_t event);
void menuRadioCalibration(event_t event);
static const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = {
- menuRadioSetup,
- CASE_SDCARD(menuRadioSdManager)
#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE)
menuRadioTools,
#endif
+ CASE_SDCARD(menuRadioSdManager)
+ menuRadioSetup,
menuRadioSpecialFunctions,
menuRadioTrainer,
menuRadioHardware,
diff --git a/radio/src/gui/128x64/model_flightmodes.cpp b/radio/src/gui/128x64/model_flightmodes.cpp
index 673d550ae..ff469dca2 100644
--- a/radio/src/gui/128x64/model_flightmodes.cpp
+++ b/radio/src/gui/128x64/model_flightmodes.cpp
@@ -113,7 +113,11 @@ void menuModelFlightModeOne(event_t event)
lcdDrawTextAlignedLeft(y, STR_TRIMS);
for (uint8_t t = 0; t < NUM_STICKS; t++) {
drawTrimMode(MIXES_2ND_COLUMN + (t*2*FW), y, s_currIdx, t, menuHorizontalPosition == t ? attr : 0);
+#if defined(NAVIGATION_9X)
+ if (s_editMode > 0 && attr && menuHorizontalPosition == t) {
+#else
if (s_editMode >= 0 && attr && menuHorizontalPosition == t) {
+#endif
trim_t & v = fm->trim[t];
v.mode = checkIncDec(event, v.mode==TRIM_MODE_NONE ? -1 : v.mode, -1, k==0 ? 0 : 2*MAX_FLIGHT_MODES-1, EE_MODEL, isTrimModeAvailable);
}
diff --git a/radio/src/gui/128x64/model_logical_switches.cpp b/radio/src/gui/128x64/model_logical_switches.cpp
index 90fc08481..0ce6bb44b 100644
--- a/radio/src/gui/128x64/model_logical_switches.cpp
+++ b/radio/src/gui/128x64/model_logical_switches.cpp
@@ -83,7 +83,7 @@ void menuModelLogicalSwitchOne(event_t event)
uint8_t new_cstate = lswFamily(cs->func);
if (cstate != new_cstate) {
if (new_cstate == LS_FAMILY_TIMER) {
- cs->v1 = cs->v2 = 0;
+ cs->v1 = cs->v2 = -119;
}
else if (new_cstate == LS_FAMILY_EDGE) {
cs->v1 = 0; cs->v2 = -129; cs->v3 = 0;
diff --git a/radio/src/gui/128x64/model_outputs.cpp b/radio/src/gui/128x64/model_outputs.cpp
index fa8b3e394..ad0439a1b 100644
--- a/radio/src/gui/128x64/model_outputs.cpp
+++ b/radio/src/gui/128x64/model_outputs.cpp
@@ -215,6 +215,9 @@ void onLimitsMenu(const char *result)
else if (result == STR_EDIT) {
pushMenu(menuModelLimitsOne);
}
+ else if (result == STR_COPY_MIN_MAX_TO_OUTPUTS) {
+ copyMinMaxToOutputs(s_currIdx);
+ }
}
void menuModelLimits(event_t event)
@@ -240,6 +243,7 @@ void menuModelLimits(event_t event)
POPUP_MENU_ADD_ITEM(STR_RESET);
POPUP_MENU_ADD_ITEM(STR_COPY_TRIMS_TO_OFS);
POPUP_MENU_ADD_ITEM(STR_COPY_STICKS_TO_OFS);
+ POPUP_MENU_ADD_ITEM(STR_COPY_MIN_MAX_TO_OUTPUTS);
POPUP_MENU_START(onLimitsMenu);
}
diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp
index a423adf83..3a8824504 100644
--- a/radio/src/gui/128x64/view_main.cpp
+++ b/radio/src/gui/128x64/view_main.cpp
@@ -369,7 +369,7 @@ void menuMainView(event_t event)
break;
case EVT_KEY_GENERAL_MENU:
- pushMenu(menuRadioSetup);
+ pushMenu(menuRadioTools);
killEvents(event);
break;
#endif
@@ -397,7 +397,7 @@ void menuMainView(event_t event)
#endif
case EVT_KEY_TELEMETRY:
- chainMenu(menuViewTelemetryFrsky);
+ chainMenu(menuViewTelemetry);
killEvents(event);
break;
diff --git a/radio/src/gui/128x64/view_telemetry.cpp b/radio/src/gui/128x64/view_telemetry.cpp
index f6d5d7301..86d369377 100644
--- a/radio/src/gui/128x64/view_telemetry.cpp
+++ b/radio/src/gui/128x64/view_telemetry.cpp
@@ -206,79 +206,3 @@ bool displayTelemetryScreen()
return true;
}
-
-enum NavigationDirection {
- none,
- up,
- down
-};
-#define decrTelemetryScreen() direction = up
-#define incrTelemetryScreen() direction = down
-
-#if defined(NAVIGATION_XLITE)
- #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_LEFT) && IS_SHIFT_PRESSED())
- #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_LONG(KEY_RIGHT) && IS_SHIFT_PRESSED())
-#elif defined(NAVIGATION_X7)
- #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_PAGE))
- #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_BREAK(KEY_PAGE))
-#elif defined(NAVIGATION_9X)
- #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_UP))
- #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_LONG(KEY_DOWN))
-#else
- #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_UP))
- #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_DOWN))
-#endif
-
-void menuViewTelemetryFrsky(event_t event)
-{
- enum NavigationDirection direction = none;
-
- if (event == EVT_KEY_FIRST(KEY_EXIT) && TELEMETRY_SCREEN_TYPE(s_frsky_view) != TELEMETRY_SCREEN_TYPE_SCRIPT) {
- killEvents(event);
- chainMenu(menuMainView);
- }
-#if defined(LUA)
- else if (event == EVT_KEY_LONG(KEY_EXIT)) {
- killEvents(event);
- chainMenu(menuMainView);
- }
-#endif
- else if (EVT_KEY_PREVIOUS_VIEW(event)) {
- killEvents(event);
- decrTelemetryScreen();
- }
- else if (EVT_KEY_NEXT_VIEW(event)) {
- killEvents(event);
- incrTelemetryScreen();
- }
- else if (event == EVT_KEY_LONG(KEY_ENTER)) {
- killEvents(event);
- POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY);
- POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT);
- POPUP_MENU_START(onMainViewMenu);
- }
-
- for (int i=0; i<=TELEMETRY_SCREEN_TYPE_MAX; i++) {
- if (direction == up) {
- if (s_frsky_view-- == 0)
- s_frsky_view = TELEMETRY_VIEW_MAX;
- }
- else if (direction == down) {
- if (s_frsky_view++ == TELEMETRY_VIEW_MAX)
- s_frsky_view = 0;
- }
- else {
- direction = down;
- }
- if (displayTelemetryScreen()) {
- return;
- }
- }
-
- drawTelemetryTopBar();
- lcdDrawText(2*FW, 3*FH, "No Telemetry Screens");
- displayRssiLine();
-}
-
-#undef EVT_KEY_PREVIOUS_VIEW
-#undef EVT_KEY_NEXT_VIEW
diff --git a/radio/src/gui/212x64/gui.h b/radio/src/gui/212x64/gui.h
index 72ffe038b..70e6615bf 100644
--- a/radio/src/gui/212x64/gui.h
+++ b/radio/src/gui/212x64/gui.h
@@ -301,7 +301,7 @@ FlightModesType editFlightModes(coord_t x, coord_t y, event_t event, FlightModes
#endif
#define IS_MAIN_VIEW_DISPLAYED() menuHandlers[0] == menuMainView
-#define IS_TELEMETRY_VIEW_DISPLAYED() menuHandlers[0] == menuViewTelemetryFrsky
+#define IS_TELEMETRY_VIEW_DISPLAYED() menuHandlers[0] == menuViewTelemetry
#define IS_OTHER_VIEW_DISPLAYED() (menuHandlers[0] == menuMainViewChannelsMonitor || menuHandlers[0] == menuChannelsView)
#endif // _GUI_H_
diff --git a/radio/src/gui/212x64/menu_radio.cpp b/radio/src/gui/212x64/menu_radio.cpp
index 082424e07..6e7647a72 100644
--- a/radio/src/gui/212x64/menu_radio.cpp
+++ b/radio/src/gui/212x64/menu_radio.cpp
@@ -21,11 +21,11 @@
#include "opentx.h"
const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = {
- menuRadioSetup,
- menuRadioSdManager,
#if defined(LUA) || defined(PXX2)
menuRadioTools,
#endif
+ menuRadioSdManager,
+ menuRadioSetup,
menuRadioSpecialFunctions,
menuRadioTrainer,
menuRadioHardware,
diff --git a/radio/src/gui/212x64/menus.h b/radio/src/gui/212x64/menus.h
index 24da83e0f..bdfb8f591 100644
--- a/radio/src/gui/212x64/menus.h
+++ b/radio/src/gui/212x64/menus.h
@@ -39,7 +39,7 @@ void menuFirstCalib(event_t event);
void menuMainViewChannelsMonitor(event_t event);
void menuChannelsView(event_t event);
void menuMainView(event_t event);
-void menuViewTelemetryFrsky(event_t event);
+void menuViewTelemetry(event_t event);
void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomFunctionsContext * functionsContext);
void menuModelNotes(event_t event);
void menuStatisticsView(event_t event);
@@ -52,11 +52,11 @@ void menuTraceBuffer(event_t event);
#endif
enum MenuRadioIndexes {
- MENU_RADIO_SETUP,
- MENU_RADIO_SD_MANAGER,
#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE)
MENU_RADIO_TOOLS,
#endif
+ MENU_RADIO_SD_MANAGER,
+ MENU_RADIO_SETUP,
MENU_RADIO_SPECIAL_FUNCTIONS,
MENU_RADIO_TRAINER,
MENU_RADIO_HARDWARE,
diff --git a/radio/src/gui/212x64/model_outputs.cpp b/radio/src/gui/212x64/model_outputs.cpp
index f944c04c4..54261d88b 100644
--- a/radio/src/gui/212x64/model_outputs.cpp
+++ b/radio/src/gui/212x64/model_outputs.cpp
@@ -86,6 +86,9 @@ void onLimitsMenu(const char *result)
copyTrimsToOffset(ch);
storageDirty(EE_MODEL);
}
+ else if (result == STR_COPY_MIN_MAX_TO_OUTPUTS) {
+ copyMinMaxToOutputs(ch);
+ }
}
void menuModelLimits(event_t event)
@@ -142,6 +145,7 @@ void menuModelLimits(event_t event)
POPUP_MENU_ADD_ITEM(STR_RESET);
POPUP_MENU_ADD_ITEM(STR_COPY_TRIMS_TO_OFS);
POPUP_MENU_ADD_ITEM(STR_COPY_STICKS_TO_OFS);
+ POPUP_MENU_ADD_ITEM(STR_COPY_MIN_MAX_TO_OUTPUTS);
POPUP_MENU_START(onLimitsMenu);
}
diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp
index 262302f5f..f893863d0 100644
--- a/radio/src/gui/212x64/model_setup.cpp
+++ b/radio/src/gui/212x64/model_setup.cpp
@@ -353,7 +353,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(isModuleFailsafeAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1)),
+ 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_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
diff --git a/radio/src/gui/212x64/view_main.cpp b/radio/src/gui/212x64/view_main.cpp
index cf4192164..5cd64e749 100644
--- a/radio/src/gui/212x64/view_main.cpp
+++ b/radio/src/gui/212x64/view_main.cpp
@@ -455,7 +455,7 @@ void menuMainView(event_t event)
break;
case EVT_KEY_LONG(KEY_MENU):
- pushMenu(menuRadioSetup);
+ pushMenu(menuRadioTools);
killEvents(event);
break;
#endif
@@ -470,7 +470,7 @@ void menuMainView(event_t event)
break;
case EVT_KEY_LONG(KEY_PAGE):
- chainMenu(menuViewTelemetryFrsky);
+ chainMenu(menuViewTelemetry);
killEvents(event);
break;
diff --git a/radio/src/gui/212x64/view_telemetry.cpp b/radio/src/gui/212x64/view_telemetry.cpp
index 04dc411c5..fa8740667 100644
--- a/radio/src/gui/212x64/view_telemetry.cpp
+++ b/radio/src/gui/212x64/view_telemetry.cpp
@@ -200,65 +200,3 @@ bool displayTelemetryScreen()
return true;
}
-enum NavigationDirection {
- none,
- up,
- down
-};
-
-#define decrTelemetryScreen() direction = up
-#define incrTelemetryScreen() direction = down
-
-void menuViewTelemetryFrsky(event_t event)
-{
- enum NavigationDirection direction = none;
-
- switch (event) {
- case EVT_KEY_FIRST(KEY_EXIT):
- case EVT_KEY_LONG(KEY_EXIT):
- killEvents(event);
- chainMenu(menuMainView);
- break;
-
- case EVT_KEY_LONG(KEY_PAGE):
- killEvents(event);
- // no break;
-
- case EVT_KEY_FIRST(KEY_UP):
- decrTelemetryScreen();
- break;
-
- case EVT_KEY_BREAK(KEY_PAGE):
- case EVT_KEY_FIRST(KEY_DOWN):
- incrTelemetryScreen();
- break;
-
- case EVT_KEY_LONG(KEY_ENTER):
- killEvents(event);
- POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY);
- POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT);
- POPUP_MENU_START(onMainViewMenu);
- break;
- }
-
- for (int i=0; i<=TELEMETRY_SCREEN_TYPE_MAX; i++) {
- if (direction == up) {
- if (s_frsky_view-- == 0)
- s_frsky_view = TELEMETRY_VIEW_MAX;
- }
- else if (direction == down) {
- if (s_frsky_view++ == TELEMETRY_VIEW_MAX)
- s_frsky_view = 0;
- }
- else {
- direction = down;
- }
- if (displayTelemetryScreen()) {
- return;
- }
- }
-
- drawTelemetryTopBar();
- lcdDrawText(8*FW, 3*FH, "No Telemetry Screens");
- displayRssiLine();
-}
diff --git a/radio/src/gui/colorlcd/bitmaps.cpp b/radio/src/gui/colorlcd/bitmaps.cpp
index 91e417e29..a66602f93 100644
--- a/radio/src/gui/colorlcd/bitmaps.cpp
+++ b/radio/src/gui/colorlcd/bitmaps.cpp
@@ -64,6 +64,10 @@ const uint8_t LBM_TOPMENU_TXBATT[] = {
#include "mask_txbat.lbm"
};
+const uint8_t LBM_TOPMENU_TXBATT_CHARGING[] = {
+#include "mask_txbat_charging.lbm"
+};
+
const uint8_t LBM_TOPMENU_ANTENNA[] = {
#include "mask_antenna.lbm"
};
diff --git a/radio/src/gui/colorlcd/bitmaps.h b/radio/src/gui/colorlcd/bitmaps.h
index 67d149872..7c163867c 100644
--- a/radio/src/gui/colorlcd/bitmaps.h
+++ b/radio/src/gui/colorlcd/bitmaps.h
@@ -34,6 +34,7 @@ extern const uint8_t LBM_TOPMENU_VOLUME_3[];
extern const uint8_t LBM_TOPMENU_VOLUME_4[];
extern const uint8_t LBM_TOPMENU_VOLUME_SCALE[];
extern const uint8_t LBM_TOPMENU_TXBATT[];
+extern const uint8_t LBM_TOPMENU_TXBATT_CHARGING[];
extern const uint8_t LBM_HTRIM_FRAME[];
extern const uint8_t LBM_VTRIM_FRAME[];
extern const uint8_t LBM_TRIM_SHADOW[];
diff --git a/radio/src/gui/colorlcd/view_text.cpp b/radio/src/gui/colorlcd/view_text.cpp
index 3038887bf..a7969d21f 100644
--- a/radio/src/gui/colorlcd/view_text.cpp
+++ b/radio/src/gui/colorlcd/view_text.cpp
@@ -56,7 +56,7 @@ bool menuTextView(event_t event)
}
for (int i=0; idrawTextMaxWidth(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + i * FH, reusableBuffer.viewText.lines[i], 0, LCD_W - 2 * MENUS_MARGIN_LEFT);
}
#if 0
diff --git a/radio/src/gui/common/stdlcd/CMakeLists.txt b/radio/src/gui/common/stdlcd/CMakeLists.txt
index f57959f06..f3b021c37 100644
--- a/radio/src/gui/common/stdlcd/CMakeLists.txt
+++ b/radio/src/gui/common/stdlcd/CMakeLists.txt
@@ -16,6 +16,7 @@ set(GUI_SRC
../common/stdlcd/radio_hardware.cpp
../common/stdlcd/radio_version.cpp
../common/stdlcd/radio_trainer.cpp
+ ../common/stdlcd/view_telemetry.cpp
model_curve_edit.cpp
)
diff --git a/radio/src/gui/common/stdlcd/radio_tools.cpp b/radio/src/gui/common/stdlcd/radio_tools.cpp
index e7e16efcd..8a1cd4498 100644
--- a/radio/src/gui/common/stdlcd/radio_tools.cpp
+++ b/radio/src/gui/common/stdlcd/radio_tools.cpp
@@ -87,23 +87,7 @@ void menuRadioTools(event_t event)
uint8_t index = 0;
-#if defined(INTERNAL_MODULE_PXX2)
- if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER))
- addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE);
- if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER))
- addRadioModuleTool(index++, STR_POWER_METER_INT, menuRadioPowerMeter, INTERNAL_MODULE);
-#elif defined(INTERNAL_MODULE_MULTI)
- addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE);
-#endif
-#if defined(PXX2)|| defined(MULTIMODULE)
- if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER) || isModuleMultimodule(EXTERNAL_MODULE))
- addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_EXT, menuRadioSpectrumAnalyser, EXTERNAL_MODULE);
-#endif
-#if defined(PXX2)
- if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER))
- addRadioModuleTool(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE);
-#endif
#if defined(LUA)
FILINFO fno;
@@ -127,6 +111,24 @@ void menuRadioTools(event_t event)
}
#endif
+#if defined(INTERNAL_MODULE_PXX2)
+ if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER))
+ addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE);
+
+ if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER))
+ addRadioModuleTool(index++, STR_POWER_METER_INT, menuRadioPowerMeter, INTERNAL_MODULE);
+#elif defined(INTERNAL_MODULE_MULTI)
+ addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE);
+#endif
+#if defined(PXX2)|| defined(MULTIMODULE)
+ if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER) || isModuleMultimodule(EXTERNAL_MODULE))
+ addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_EXT, menuRadioSpectrumAnalyser, EXTERNAL_MODULE);
+#endif
+#if defined(PXX2)
+ if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER))
+ addRadioModuleTool(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE);
+#endif
+
if (index == 0) {
lcdDrawCenteredText(LCD_H/2, STR_NO_TOOLS);
}
diff --git a/radio/src/gui/common/stdlcd/view_telemetry.cpp b/radio/src/gui/common/stdlcd/view_telemetry.cpp
new file mode 100644
index 000000000..e2bf39503
--- /dev/null
+++ b/radio/src/gui/common/stdlcd/view_telemetry.cpp
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) OpenTX
+ *
+ * Based on code named
+ * th9x - http://code.google.com/p/th9x
+ * er9x - http://code.google.com/p/er9x
+ * gruvin9x - http://code.google.com/p/gruvin9x
+ *
+ * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "opentx.h"
+
+extern bool displayTelemetryScreen();
+extern void displayRssiLine();
+
+enum NavigationDirection {
+ NAVIGATION_DIRECTION_NONE,
+ NAVIGATION_DIRECTION_UP,
+ NAVIGATION_DIRECTION_DOWN
+};
+#define decrTelemetryScreen() direction = NAVIGATION_DIRECTION_UP
+#define incrTelemetryScreen() direction = NAVIGATION_DIRECTION_DOWN
+
+#if defined(NAVIGATION_XLITE)
+ #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_LEFT) && IS_SHIFT_PRESSED())
+ #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_LONG(KEY_RIGHT) && IS_SHIFT_PRESSED())
+#elif defined(NAVIGATION_X7) || defined(NAVIGATION_X9D)
+ #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_PAGE))
+ #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_BREAK(KEY_PAGE))
+#elif defined(NAVIGATION_9X)
+ #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_UP))
+ #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_LONG(KEY_DOWN))
+#else
+ #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_UP))
+ #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_DOWN))
+#endif
+
+void menuViewTelemetry(event_t event)
+{
+ enum NavigationDirection direction = NAVIGATION_DIRECTION_NONE;
+
+ if (event == EVT_KEY_FIRST(KEY_EXIT) && TELEMETRY_SCREEN_TYPE(s_frsky_view) != TELEMETRY_SCREEN_TYPE_SCRIPT) {
+ killEvents(event);
+ chainMenu(menuMainView);
+ }
+#if defined(LUA)
+ else if (event == EVT_KEY_LONG(KEY_EXIT)) {
+ killEvents(event);
+ chainMenu(menuMainView);
+ }
+#endif
+ else if (EVT_KEY_PREVIOUS_VIEW(event)) {
+ killEvents(event);
+ decrTelemetryScreen();
+ }
+ else if (EVT_KEY_NEXT_VIEW(event)) {
+ killEvents(event);
+ incrTelemetryScreen();
+ }
+ else if (event == EVT_KEY_LONG(KEY_ENTER)) {
+ killEvents(event);
+ POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY);
+ POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT);
+ POPUP_MENU_START(onMainViewMenu);
+ }
+
+ for (int i=0; i<=TELEMETRY_SCREEN_TYPE_MAX; i++) {
+ if (direction == NAVIGATION_DIRECTION_UP) {
+ if (s_frsky_view-- == 0)
+ s_frsky_view = TELEMETRY_VIEW_MAX;
+ }
+ else if (direction == NAVIGATION_DIRECTION_DOWN) {
+ if (s_frsky_view++ == TELEMETRY_VIEW_MAX)
+ s_frsky_view = 0;
+ }
+ else {
+ direction = NAVIGATION_DIRECTION_DOWN;
+ }
+ if (displayTelemetryScreen()) {
+ return;
+ }
+ }
+
+ drawTelemetryTopBar();
+ lcdDrawText(LCD_W / 2, 3 * FH, "No Telemetry Screens", CENTERED);
+ displayRssiLine();
+}
+
+#undef EVT_KEY_PREVIOUS_VIEW
+#undef EVT_KEY_NEXT_VIEW
diff --git a/radio/src/io/multi_firmware_update.cpp b/radio/src/io/multi_firmware_update.cpp
index bd8020cef..f3105e61e 100644
--- a/radio/src/io/multi_firmware_update.cpp
+++ b/radio/src/io/multi_firmware_update.cpp
@@ -528,7 +528,7 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename)
pausePulses();
-#if defined(INTERNAL_MODULE_MULTI)
+#if defined(HARDWARE_INTERNAL_MODULE)
uint8_t intPwr = IS_INTERNAL_MODULE_ON();
INTERNAL_MODULE_OFF();
#endif
@@ -546,7 +546,7 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename)
/* wait 2s off */
watchdogSuspend(500 /*5s*/);
- RTOS_WAIT_MS(2000);
+ RTOS_WAIT_MS(3000);
const char * result = driver->flashFirmware(&file, getBasename(filename));
f_close(&file);
@@ -575,7 +575,7 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename)
// reset telemetry protocol
telemetryInit(255);
-#if defined(INTERNAL_MODULE_MULTI)
+#if defined(HARDWARE_INTERNAL_MODULE)
if (intPwr) {
INTERNAL_MODULE_ON();
setupPulsesInternalModule();
diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp
index f65bebdf6..d42e7e9a6 100644
--- a/radio/src/lua/api_general.cpp
+++ b/radio/src/lua/api_general.cpp
@@ -28,7 +28,7 @@
#if defined(PCBX12S)
#include "lua/lua_exports_x12s.inc" // this line must be after lua headers
-#elif defined(RADIO_T16)
+#elif defined(RADIO_FAMILY_T16)
#include "lua/lua_exports_t16.inc"
#elif defined(PCBX10)
#include "lua/lua_exports_x10.inc"
@@ -456,6 +456,10 @@ static int luaSportTelemetryPush(lua_State * L)
lua_pushboolean(L, outputTelemetryBuffer.isAvailable());
return 1;
}
+ else if (lua_gettop(L) > int(sizeof(SportTelemetryPacket))) {
+ lua_pushboolean(L, false);
+ return 1;
+ }
uint16_t dataId = luaL_checkunsigned(L, 3);
@@ -653,6 +657,10 @@ static int luaCrossfireTelemetryPush(lua_State * L)
if (lua_gettop(L) == 0) {
lua_pushboolean(L, outputTelemetryBuffer.isAvailable());
}
+ else if (lua_gettop(L) > TELEMETRY_OUTPUT_BUFFER_SIZE ) {
+ lua_pushboolean(L, false);
+ return 1;
+ }
else if (outputTelemetryBuffer.isAvailable()) {
uint8_t command = luaL_checkunsigned(L, 1);
luaL_checktype(L, 2, LUA_TTABLE);
diff --git a/radio/src/lua/api_lcd.cpp b/radio/src/lua/api_lcd.cpp
index 4953b0230..020b41c7b 100644
--- a/radio/src/lua/api_lcd.cpp
+++ b/radio/src/lua/api_lcd.cpp
@@ -71,6 +71,8 @@ Draw a single pixel at (x,y) position
@param y (positive number) y position
+@param flags (optional) lcdflags
+
@notice Taranis has an LCD display width of 212 pixels and height of 64 pixels.
Position (0,0) is at top left. Y axis is negative, top line is 0,
bottom line is 63. Drawing on an existing black pixel produces white pixel (TODO check this!)
@@ -82,7 +84,8 @@ static int luaLcdDrawPoint(lua_State *L)
if (!luaLcdAllowed) return 0;
int x = luaL_checkinteger(L, 1);
int y = luaL_checkinteger(L, 2);
- lcdDrawPoint(x, y);
+ LcdFlags att = luaL_optunsigned(L, 3, 0);
+ lcdDrawPoint(x, y, att);
return 0;
}
@@ -95,14 +98,14 @@ Draw a straight line on LCD
@param x2,y2 (positive numbers) end coordinate
-@param pattern TODO
+@param pattern SOLID or DOTTED
-@param flags TODO
+@param flags lcdflags
@notice If the start or the end of the line is outside the LCD dimensions, then the
whole line will not be drawn (starting from OpenTX 2.1.5)
-@status current Introduced in 2.0.0
+@status current Introduced in 2.0.0, flags introduced in 2.3.6
*/
static int luaLcdDrawLine(lua_State *L)
{
diff --git a/radio/src/lua/api_model.cpp b/radio/src/lua/api_model.cpp
index f3e5c36d1..0fd75a5c3 100644
--- a/radio/src/lua/api_model.cpp
+++ b/radio/src/lua/api_model.cpp
@@ -182,8 +182,9 @@ Get model timer parameters
* `countdownBeep` (number) countdown beep (0 = silent, 1 = beeps, 2 = voice)
* `minuteBeep` (boolean) minute beep
* `persistent` (number) persistent timer
+ * `name` (string) timer name
-@status current Introduced in 2.0.0
+@status current Introduced in 2.0.0, name added in 2.3.6
*/
static int luaModelGetTimer(lua_State *L)
{
@@ -197,6 +198,7 @@ static int luaModelGetTimer(lua_State *L)
lua_pushtableinteger(L, "countdownBeep", timer.countdownBeep);
lua_pushtableboolean(L, "minuteBeep", timer.minuteBeep);
lua_pushtableinteger(L, "persistent", timer.persistent);
+ lua_pushtablezstring(L, "name", timer.name);
}
else {
lua_pushnil(L);
@@ -216,7 +218,7 @@ Set model timer parameters
@notice If a parameter is missing from the value, then
that parameter remains unchanged.
-@status current Introduced in 2.0.0
+@status current Introduced in 2.0.0, name added in 2.3.6
*/
static int luaModelSetTimer(lua_State *L)
{
@@ -246,6 +248,10 @@ static int luaModelSetTimer(lua_State *L)
else if (!strcmp(key, "persistent")) {
timer.persistent = luaL_checkinteger(L, -1);
}
+ if (!strcmp(key, "name")) {
+ const char * name = luaL_checkstring(L, -1);
+ str2zchar(timer.name, name, sizeof(timer.name));
+ }
}
storageDirty(EE_MODEL);
}
diff --git a/radio/src/lua/interface.cpp b/radio/src/lua/interface.cpp
index 65bb79879..5f0fc3af2 100644
--- a/radio/src/lua/interface.cpp
+++ b/radio/src/lua/interface.cpp
@@ -953,7 +953,7 @@ bool luaDoOneRunPermanentScript(event_t evt, int i, uint32_t scriptType)
TelemetryScriptData & script = g_model.screens[sid.reference-SCRIPT_TELEMETRY_FIRST].script;
filename = script.file;
#endif
- if ((scriptType & RUN_TELEM_FG_SCRIPT) && (menuHandlers[0]==menuViewTelemetryFrsky && sid.reference==SCRIPT_TELEMETRY_FIRST+s_frsky_view)) {
+ if ((scriptType & RUN_TELEM_FG_SCRIPT) && (menuHandlers[0]==menuViewTelemetry && sid.reference==SCRIPT_TELEMETRY_FIRST+s_frsky_view)) {
lua_rawgeti(lsScripts, LUA_REGISTRYINDEX, sid.run);
lua_pushunsigned(lsScripts, evt);
inputsCount = 1;
diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp
index dc31330e8..a09fb0e63 100644
--- a/radio/src/opentx.cpp
+++ b/radio/src/opentx.cpp
@@ -1767,6 +1767,25 @@ void copyTrimsToOffset(uint8_t ch)
storageDirty(EE_MODEL);
}
+void copyMinMaxToOutputs(uint8_t ch)
+{
+ LimitData *ld = limitAddress(ch);
+ int16_t min = ld->min;
+ int16_t max = ld->max;
+ int16_t center = ld->ppmCenter;
+
+ pauseMixerCalculations();
+
+ for (uint8_t chan = 0; chan < MAX_OUTPUT_CHANNELS; chan++) {
+ ld = limitAddress(chan);
+ ld->min = min;
+ ld->max = max;
+ ld->ppmCenter = center;
+ }
+
+ resumeMixerCalculations();
+ storageDirty(EE_MODEL);
+}
#if defined(STARTUP_ANIMATION)
diff --git a/radio/src/opentx.h b/radio/src/opentx.h
index 64799b951..56dfda875 100644
--- a/radio/src/opentx.h
+++ b/radio/src/opentx.h
@@ -563,7 +563,7 @@ bool setTrimValue(uint8_t phase, uint8_t idx, int trim);
#if defined(PCBSKY9X)
#define ROTARY_ENCODER_GRANULARITY (2 << g_eeGeneral.rotarySteps)
-#elif defined(RADIO_T16)
+#elif defined(RADIO_FAMILY_T16)
#define ROTARY_ENCODER_GRANULARITY (1)
#else
#define ROTARY_ENCODER_GRANULARITY (2)
@@ -851,6 +851,7 @@ void instantTrim();
void evalTrims();
void copyTrimsToOffset(uint8_t ch);
void copySticksToOffset(uint8_t ch);
+void copyMinMaxToOutputs(uint8_t ch);
void moveTrimsToOffsets();
typedef uint16_t ACTIVE_PHASES_TYPE;
@@ -1339,9 +1340,7 @@ extern uint16_t s_anaFilt[NUM_ANALOGS];
#if defined(JITTER_MEASURE)
extern JitterMeter rawJitter[NUM_ANALOGS];
extern JitterMeter avgJitter[NUM_ANALOGS];
-#if defined(PCBHORUS)
- #define JITTER_MEASURE_ACTIVE() (menuHandlers[menuLevel] == menuStatsAnalogs)
-#elif defined(PCBTARANIS)
+#if defined(PCBHORUS) || defined(PCBTARANIS)
#define JITTER_MEASURE_ACTIVE() (menuHandlers[menuLevel] == menuRadioDiagAnalogs)
#elif defined(CLI)
#define JITTER_MEASURE_ACTIVE() (1)
diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h
index eddf2e822..e2984df28 100644
--- a/radio/src/pulses/modules_helpers.h
+++ b/radio/src/pulses/modules_helpers.h
@@ -471,6 +471,11 @@ 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.cpp b/radio/src/pulses/pulses.cpp
index 289485bf2..42f04fb26 100755
--- a/radio/src/pulses/pulses.cpp
+++ b/radio/src/pulses/pulses.cpp
@@ -380,7 +380,7 @@ bool setupPulsesInternalModule(uint8_t protocol)
#endif
default:
- scheduleNextMixerCalculation(INTERNAL_MODULE, 50/*ms*/);
+ scheduleNextMixerCalculation(INTERNAL_MODULE, 10 /*ms*/); // used for USB sim for example
return false;
}
}
diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h
index d8bb578c2..bb0498d6f 100644
--- a/radio/src/sdcard.h
+++ b/radio/src/sdcard.h
@@ -130,6 +130,8 @@ const char * getBasename(const char * path);
#define OTX_FOURCC 0x3478746F // otx for X12S
#elif defined(RADIO_T16)
#define OTX_FOURCC 0x3F78746F // otx for Jumper T16
+#elif defined(RADIO_TX16S)
+ #define OTX_FOURCC 0x3878746F // otx for Radiomaster TX16S
#elif defined(PCBX10)
#define OTX_FOURCC 0x3778746F // otx for X10
#elif defined(PCBX9E)
diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp
index 2a690972b..3972ab86c 100644
--- a/radio/src/targets/common/arm/stm32/adc_driver.cpp
+++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp
@@ -24,13 +24,15 @@
// not needed
#elif defined(RADIO_T16)
const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,1, -1,1, -1,1};
+#elif defined(RADIO_TX16S)
+ const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, 1,1,1, -1,1, -1,1};
#elif defined(PCBX10)
const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, 1,1, 1, -1};
#elif defined(PCBX9E)
#if defined(HORUS_STICKS)
- const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,-1,-1,1, -1,1,-1, -1,-1,-1};
+ const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,-1,-1,1, -1,1,1, -1,-1,-1};
#else
- const int8_t adcDirection[NUM_ANALOGS] = {1,1,-1,-1, -1,-1,-1,1, -1,1,-1, -1,-1,-1};
+ const int8_t adcDirection[NUM_ANALOGS] = {1,1,-1,-1, -1,-1,-1,1, -1,1,1, -1,-1,-1};
#endif
const uint8_t adcMapping[NUM_ANALOGS] = { 0 /*STICK1*/, 1 /*STICK2*/, 2 /*STICK3*/, 3 /*STICK4*/,
11 /*POT1*/, 4 /*POT2*/, 5 /*POT3*/, 6 /*POT4*/,
diff --git a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp
index f9598bb27..e36f435a2 100644
--- a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp
+++ b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp
@@ -19,6 +19,7 @@
*/
#include "opentx.h"
+#include "targets/horus/board.h"
uint8_t auxSerialMode = 0;
Fifo auxSerialTxFifo;
@@ -44,6 +45,13 @@ void auxSerialSetup(unsigned int baudrate, bool dma)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(AUX_SERIAL_GPIO, &GPIO_InitStructure);
+#if defined(AUX_SERIAL_PWR_GPIO)
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
+ GPIO_InitStructure.GPIO_Pin = AUX_SERIAL_PWR_GPIO_PIN;
+ GPIO_Init(AUX_SERIAL_PWR_GPIO, &GPIO_InitStructure);
+#endif
+
USART_InitStructure.USART_BaudRate = baudrate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
@@ -154,6 +162,7 @@ void auxSerialSbusInit()
{
auxSerialSetup(SBUS_BAUDRATE, true);
AUX_SERIAL_USART->CR1 |= USART_CR1_M | USART_CR1_PCE ;
+ AUX_SERIAL_POWER_ON();
}
void auxSerialStop()
diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt
index 50da4b2cf..c750e9f5a 100644
--- a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt
+++ b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt
@@ -122,11 +122,20 @@ if(PCB STREQUAL X10 OR PCB STREQUAL X12S OR PCB STREQUAL NV14)
../../../../../syscalls.c
)
+if(USB_CHARGER)
+ set(BOOTLOADER_SRC
+ ${BOOTLOADER_SRC}
+ ../../../../../targets/${TARGET_DIR}/usb_charger_driver.cpp
+ ../../../../../targets/${TARGET_DIR}/led_driver.cpp
+ )
+ endif()
+
if(DEBUG)
set(BOOTLOADER_SRC
${BOOTLOADER_SRC}
../../../../../${STM32LIB_DIR}/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_usart.c
../../../../../serial.cpp
+ ../../../../../targets/common/arm/stm32/aux_serial_driver.cpp
)
endif()
else()
diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp
index ef8792564..a2e4a4a1a 100644
--- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp
+++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp
@@ -205,11 +205,26 @@ int main()
AUX_SERIAL_RCC_APB1Periph |
SD_RCC_APB1Periph, ENABLE);
- RCC_APB2PeriphClockCmd(LCD_RCC_APB2Periph | BACKLIGHT_RCC_APB2Periph | RCC_APB2Periph_SYSCFG, ENABLE);
+ RCC_APB2PeriphClockCmd(LCD_RCC_APB2Periph | BACKLIGHT_RCC_APB2Periph | RCC_APB2Periph_SYSCFG | AUX_SERIAL_RCC_APB2Periph, ENABLE);
pwrInit();
keysInit();
+ // USB charger handling
+#if defined(USB_CHARGER)
+ if (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE() && !pwrPressed()) {
+ ledInit();
+ usbChargerInit();
+ ledOff();
+ while (!pwrPressed()) {
+ if(usbChargerLed())
+ GPIO_SetBits(LED_GPIO, LED_GREEN_GPIO_PIN);
+ else
+ ledOff();
+ }
+ }
+#endif
+
// wait a bit for the inputs to stabilize...
if (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) {
for (uint32_t i = 0; i < 150000; i++) {
diff --git a/radio/src/targets/common/arm/stm32/pwr_driver.cpp b/radio/src/targets/common/arm/stm32/pwr_driver.cpp
index 751279da8..f488d19fa 100644
--- a/radio/src/targets/common/arm/stm32/pwr_driver.cpp
+++ b/radio/src/targets/common/arm/stm32/pwr_driver.cpp
@@ -54,9 +54,11 @@ void pwrInit()
#if defined(PCBREV_HARDCODED)
hardwareOptions.pcbrev = PCBREV_HARDCODED;
#elif defined(PCBREV_GPIO_PIN)
- GPIO_ResetBits(PCBREV_GPIO, PCBREV_GPIO_PIN);
+ #if defined(PCBREV_GPIO_PULL_DOWN)
+ GPIO_ResetBits(PCBREV_GPIO, PCBREV_GPIO_PIN);
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
+ #endif
GPIO_InitStructure.GPIO_Pin = PCBREV_GPIO_PIN;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(PCBREV_GPIO, &GPIO_InitStructure);
hardwareOptions.pcbrev = PCBREV_VALUE();
#endif
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 f43090f04..436cb0bd7 100644
--- a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp
+++ b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp
@@ -71,7 +71,7 @@ void rotaryEncoderInit()
void rotaryEncoderCheck()
{
-#if defined(RADIO_T16)
+#if defined(RADIO_FAMILY_T16)
static uint8_t state = 0;
uint8_t pins = ROTARY_ENCODER_POSITION();
diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt
index 36abd74e9..74c7e6ae4 100644
--- a/radio/src/targets/horus/CMakeLists.txt
+++ b/radio/src/targets/horus/CMakeLists.txt
@@ -66,8 +66,20 @@ if (PCB STREQUAL X10)
set(FLAVOUR t16)
set(LUA_EXPORT lua_export_t16)
add_definitions(-DRADIO_T16)
+ add_definitions(-DRADIO_FAMILY_T16)
option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" OFF)
option(BLUETOOTH "Support for bluetooth module" OFF)
+ elseif (PCBREV STREQUAL TX16S)
+ set(FLAVOUR tx16s)
+ set(LUA_EXPORT lua_export_t16)
+ add_definitions(-DRADIO_TX16S)
+ add_definitions(-DRADIO_FAMILY_T16)
+ option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON)
+ option(BLUETOOTH "Support for bluetooth module" OFF)
+ if (NOT BLUETOOTH)
+ set(AUX_SERIAL ON)
+ endif()
+ set(USB_CHARGER YES)
else()
set(FLAVOUR x10)
option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON)
@@ -165,15 +177,26 @@ set(TARGET_SRC
../common/arm/stm32/rotary_encoder_driver.cpp
)
+if(USB_CHARGER)
+ set(TARGET_SRC ${TARGET_SRC} usb_charger_driver.cpp)
+ add_definitions(-DUSB_CHARGER)
+endif()
+
if(BLUETOOTH)
add_definitions(-DBLUETOOTH)
set(TARGET_SRC ${TARGET_SRC} ../common/arm/stm32/bluetooth_driver.cpp)
set(SRC ${SRC} bluetooth.cpp)
endif()
+if (AUX_SERIAL)
+ add_definitions(-DAUX_SERIAL)
+ set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp)
+endif()
+
set(FIRMWARE_TARGET_SRC
${FIRMWARE_TARGET_SRC}
${LCD_DRIVER}
+ ${AUX_SERIAL_DRIVER}
board.cpp
backlight_driver.cpp
../common/arm/stm32/pwr_driver.cpp
diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp
index ac6e4e1f8..3e8ad4752 100644
--- a/radio/src/targets/horus/board.cpp
+++ b/radio/src/targets/horus/board.cpp
@@ -41,7 +41,19 @@ void watchdogInit(unsigned int duration)
IWDG->KR = 0xCCCC; // start
}
-#if defined(PCBX10) && !defined(RADIO_T16)
+#if defined(AUX_SERIAL_PWR_GPIO)
+void auxSerialPowerOn()
+{
+ GPIO_SetBits(AUX_SERIAL_PWR_GPIO, AUX_SERIAL_PWR_GPIO_PIN);
+}
+
+void auxSerialPowerOff()
+{
+ GPIO_ResetBits(AUX_SERIAL_PWR_GPIO, AUX_SERIAL_PWR_GPIO_PIN);
+}
+#endif
+
+#if HAS_SPORT_UPDATE_CONNECTOR()
void sportUpdateInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
@@ -83,6 +95,7 @@ void boardInit()
HAPTIC_RCC_AHB1Periph |
INTMODULE_RCC_AHB1Periph |
EXTMODULE_RCC_AHB1Periph |
+ I2C_TOUCH_RCC_AHB1Periph |
GPS_RCC_AHB1Periph |
SPORT_UPDATE_RCC_AHB1Periph,
ENABLE);
@@ -98,6 +111,7 @@ void boardInit()
AUDIO_RCC_APB1Periph |
INTMODULE_RCC_APB1Periph |
EXTMODULE_RCC_APB1Periph |
+ I2C_TOUCH_RCC_APB1Periph |
GPS_RCC_APB1Periph |
BACKLIGHT_RCC_APB1Periph,
ENABLE);
@@ -110,6 +124,7 @@ void boardInit()
EXTMODULE_RCC_APB2Periph |
TELEMETRY_RCC_APB2Periph |
BT_RCC_APB2Periph |
+ AUX_SERIAL_RCC_APB2Periph |
BACKLIGHT_RCC_APB2Periph,
ENABLE);
@@ -119,6 +134,10 @@ void boardInit()
__enable_irq();
+#if defined(DEBUG) && defined(AUX_SERIAL)
+ auxSerialInit(UART_MODE_DEBUG, 0); // default serial mode (None if DEBUG not defined)
+#endif
+
TRACE("\nHorus board started :)");
TRACE("RCC->CSR = %08x", RCC->CSR);
@@ -162,7 +181,7 @@ void boardInit()
ledInit();
-#if defined(PCBX10) && !defined(RADIO_T16)
+#if HAS_SPORT_UPDATE_CONNECTOR()
sportUpdateInit();
#endif
diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h
index c68793d38..545805e93 100644
--- a/radio/src/targets/horus/board.h
+++ b/radio/src/targets/horus/board.h
@@ -59,7 +59,7 @@ extern uint16_t sessionTimer;
#define SLAVE_MODE() (g_model.trainerData.mode == TRAINER_MODE_SLAVE)
-#if defined(PCBX10) && !defined(RADIO_T16)
+#if defined(PCBX10) && !defined(RADIO_FAMILY_T16)
#define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_SET)
#else
#define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_RESET)
@@ -490,6 +490,10 @@ void pwrResetHandler();
bool pwrPressed();
uint32_t pwrPressedDuration();
+// USB Charger
+void usbChargerInit();
+bool usbChargerLed();
+
// Led driver
void ledInit();
void ledOff();
@@ -527,7 +531,7 @@ void backlightEnable(uint8_t dutyCycle = 0);
#define BACKLIGHT_LEVEL_MAX 100
#if defined(PCBX12S)
#define BACKLIGHT_LEVEL_MIN 5
-#elif defined(RADIO_T16)
+#elif defined(RADIO_FAMILY_T16)
#define BACKLIGHT_LEVEL_MIN 1
#else
#define BACKLIGHT_LEVEL_MIN 46
@@ -547,6 +551,10 @@ void usbJoystickUpdate();
#define USB_NAME "Jumper T16"
#define USB_MANUFACTURER 'J', 'u', 'm', 'p', 'e', 'r', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'T', '1', '6', ' ', ' ', ' ', ' ', ' ' /* 8 Bytes */
+#elif defined(RADIO_TX16S)
+ #define USB_NAME "RadioMas TX16S"
+ #define USB_MANUFACTURER 'R', 'a', 'd', 'i', 'o', 'M', 'a', 's' /* 8 bytes */
+ #define USB_PRODUCT 'T', 'X', '1', '6', 'S', ' ', ' ', ' ' /* 8 Bytes */
#elif defined(PCBX10)
#define USB_NAME "FrSky X10"
#define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */
@@ -590,7 +598,7 @@ extern uint32_t telemetryErrors;
void telemetryPortInvertedInit(uint32_t baudrate);
// Sport update driver
-#if defined(PCBX10) && !defined(RADIO_T16)
+#if HAS_SPORT_UPDATE_CONNECTOR()
void sportUpdatePowerOn();
void sportUpdatePowerOff();
#define SPORT_UPDATE_POWER_ON() sportUpdatePowerOn()
@@ -600,6 +608,26 @@ void sportUpdatePowerOff();
#define SPORT_UPDATE_POWER_OFF()
#endif
+// Second serial port driver
+#if defined(AUX_SERIAL_GPIO)
+#define DEBUG_BAUDRATE 115200
+extern uint8_t auxSerialMode;
+void auxSerialInit(unsigned int mode, unsigned int protocol);
+void auxSerialPutc(char c);
+#define auxSerialTelemetryInit(protocol) auxSerialInit(UART_MODE_TELEMETRY, protocol)
+void auxSerialSbusInit();
+void auxSerialStop();
+void auxSerialPowerOn();
+void auxSerialPowerOff();
+#if defined(AUX_SERIAL_PWR_GPIO)
+#define AUX_SERIAL_POWER_ON() auxSerialPowerOn()
+#define AUX_SERIAL__POWER_OFF() auxSerialPowerOff()
+#else
+#define AUX_SERIAL_POWER_ON()
+#define AUX_SERIAL__POWER_OFF()
+#endif
+#endif
+
// Haptic driver
void hapticInit();
void hapticDone();
diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h
index 59309e03d..44b2e81ca 100644
--- a/radio/src/targets/horus/hal.h
+++ b/radio/src/targets/horus/hal.h
@@ -38,6 +38,21 @@
#define KEYS_GPIO_PIN_DOWN GPIO_Pin_6 // PI.06
#define KEYS_GPIO_REG_RIGHT GPIOC->IDR
#define KEYS_GPIO_PIN_RIGHT GPIO_Pin_4 // PC.04
+#elif defined(RADIO_TX16S)
+ #define KEYS_GPIO_REG_ENTER GPIOI->IDR
+ #define KEYS_GPIO_PIN_ENTER GPIO_Pin_8 // PI.08
+ #define KEYS_GPIO_REG_PGUP GPIOC->IDR
+ #define KEYS_GPIO_PIN_PGUP GPIO_Pin_13 // PC.13
+ #define KEYS_GPIO_REG_PGDN GPIOI->IDR
+ #define KEYS_GPIO_PIN_PGDN GPIO_Pin_11 // PI.11
+ #define KEYS_GPIO_REG_UP GPIOI->IDR
+ #define KEYS_GPIO_PIN_UP GPIO_Pin_6 // PI.06
+ #define KEYS_GPIO_REG_DOWN GPIOI->IDR
+ #define KEYS_GPIO_PIN_DOWN GPIO_Pin_4 // PI.04
+ #define KEYS_GPIO_REG_LEFT GPIOI->IDR
+ #define KEYS_GPIO_PIN_LEFT GPIO_Pin_7 // PI.07
+ #define KEYS_GPIO_REG_RIGHT GPIOI->IDR
+ #define KEYS_GPIO_PIN_RIGHT GPIO_Pin_5 // PI.05
#elif defined(PCBX10)
#define KEYS_GPIO_REG_ENTER GPIOI->IDR
#define KEYS_GPIO_PIN_ENTER GPIO_Pin_8 // PI.08
@@ -183,7 +198,7 @@
#define TRIMS_GPIO_PIN_RVU GPIO_Pin_12 // PJ.12
#define TRIMS_GPIO_REG_RHR GPIOD->IDR
#define TRIMS_GPIO_PIN_RHR GPIO_Pin_7 // PD.07
- #if defined(RADIO_T16)
+ #if defined(RADIO_FAMILY_T16)
#define TRIMS_GPIO_REG_LSU GPIOD->IDR
#define TRIMS_GPIO_PIN_LSU GPIO_Pin_13 // PD.13
#define TRIMS_GPIO_REG_LSD GPIOJ->IDR
@@ -212,6 +227,9 @@
#define KEYS_GPIOJ_PINS (SWITCHES_GPIO_PIN_D_H | TRIMS_GPIO_PIN_RVU | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_RSD)
#elif defined(PCBX10)
#define KEYS_GPIOB_PINS (GPIO_Pin_12 | GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_8 | GPIO_Pin_9)
+#if defined(RADIO_TX16S)
+ #define KEYS_GPIOC_PINS (GPIO_Pin_13)
+#endif
#define KEYS_GPIOD_PINS (GPIO_Pin_11 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_13)
#define KEYS_GPIOE_PINS (GPIO_Pin_3)
#define KEYS_GPIOG_PINS (SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L | SWITCHES_GPIO_PIN_H | TRIMS_GPIO_PIN_LVD)
@@ -288,7 +306,7 @@
#define ADC_DMA_Stream DMA2_Stream0
#define ADC_SET_DMA_FLAGS() ADC_DMA->LIFCR = (DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0)
#define ADC_TRANSFER_COMPLETE() (ADC_DMA->LISR & DMA_LISR_TCIF0)
- #if defined(RADIO_T16)
+ #if defined(RADIO_FAMILY_T16)
#define ADC_VREF_PREC2 300
#else
#define ADC_VREF_PREC2 250
@@ -302,9 +320,23 @@
#define PWR_SWITCH_GPIO GPIOJ
#define PWR_SWITCH_GPIO_PIN GPIO_Pin_0 // PJ.00
+// USB Charger
+#if defined(USB_CHARGER)
+#define USB_CHARGER_RCC_AHB1Periph RCC_AHB1Periph_GPIOG
+#define USB_CHARGER_GPIO GPIOG
+#define USB_CHARGER_GPIO_PIN GPIO_Pin_11 // PG.11
+#else
+#define USB_CHARGER_RCC_AHB1Periph 0
+#endif
+
// S.Port update connector
-#define SPORT_MAX_BAUDRATE 250000 // < 400000
-#if defined(PCBX10) && !defined(RADIO_T16)
+#if defined(RADIO_FAMILY_T16)
+ #define SPORT_MAX_BAUDRATE 400000
+#else
+ #define SPORT_MAX_BAUDRATE 250000 // < 400000
+#endif
+
+#if defined(PCBX10) && !defined(RADIO_FAMILY_T16)
#define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOH
#define SPORT_UPDATE_PWR_GPIO GPIOH
#define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_13 // PH.13
@@ -346,6 +378,7 @@
#if defined(PCBX12S)
#define AUX_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1)
#define AUX_SERIAL_RCC_APB1Periph RCC_APB1Periph_USART3
+ #define AUX_SERIAL_RCC_APB2Periph 0
#define AUX_SERIAL_GPIO GPIOB
#define AUX_SERIAL_GPIO_PIN_TX GPIO_Pin_10 // PB.10
#define AUX_SERIAL_GPIO_PIN_RX GPIO_Pin_11 // PB.11
@@ -357,15 +390,51 @@
#define AUX_SERIAL_USART_IRQn USART3_IRQn
#define AUX_SERIAL_DMA_Stream_RX DMA1_Stream1
#define AUX_SERIAL_DMA_Channel_RX DMA_Channel_4
+#elif defined(RADIO_TX16S) && !defined(BLUETOOTH)
+ #define AUX_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_DMA2)
+ #define AUX_SERIAL_RCC_APB1Periph 0
+ #define AUX_SERIAL_RCC_APB2Periph RCC_APB2Periph_USART6
+ #define AUX_SERIAL_USART USART6
+ #define AUX_SERIAL_GPIO_AF GPIO_AF_USART6
+ #define AUX_SERIAL_USART_IRQn USART6_IRQn
+ #define AUX_SERIAL_GPIO GPIOG
+ #define AUX_SERIAL_GPIO_PIN_TX GPIO_Pin_14 // PG.14
+ #define AUX_SERIAL_GPIO_PIN_RX GPIO_Pin_9 // PG.09
+ #define AUX_SERIAL_GPIO_PinSource_TX GPIO_PinSource14
+ #define AUX_SERIAL_GPIO_PinSource_RX GPIO_PinSource9
+ #define AUX_SERIAL_USART_IRQHandler USART6_IRQHandler
+ #define AUX_SERIAL_DMA_Stream_RX DMA2_Stream6
+ #define AUX_SERIAL_DMA_Channel_RX DMA_Channel_5
+ #define AUX_SERIAL_PWR_GPIO GPIOB
+ #define AUX_SERIAL_PWR_GPIO_PIN GPIO_Pin_0 // PB.00
+ #define TRAINER_BATTERY_COMPARTMENT
+
+ #define AUX2_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1)
+ #define AUX2_SERIAL_PWR_GPIO GPIOA
+ #define AUX2_SERIAL_PWR_GPIO_PIN GPIO_Pin_15 // PA.15
+ #define AUX2_SERIAL_RCC_APB1Periph RCC_APB1Periph_USART3
+ #define AUX2_SERIAL_RCC_APB2Periph 0
+ #define AUX2_SERIAL_GPIO GPIOB
+ #define AUX2_SERIAL_GPIO_PIN_TX GPIO_Pin_10 // PB.10
+ #define AUX2_SERIAL_GPIO_PIN_RX GPIO_Pin_11 // PB.11
+ #define AUX2_SERIAL_GPIO_PinSource_TX GPIO_PinSource10
+ #define AUX2_SERIAL_GPIO_PinSource_RX GPIO_PinSource11
+ #define AUX2_SERIAL_GPIO_AF GPIO_AF_USART3
+ #define AUX2_SERIAL_USART USART3
+ #define AUX2_SERIAL_USART_IRQHandler USART3_IRQHandler
+ #define AUX2_SERIAL_USART_IRQn USART3_IRQn
+ #define AUX2_SERIAL_DMA_Stream_RX DMA1_Stream1
+ #define AUX2_SERIAL_DMA_Channel_RX DMA_Channel_4
#else
#define AUX_SERIAL_RCC_AHB1Periph 0
#define AUX_SERIAL_RCC_APB1Periph 0
+ #define AUX_SERIAL_RCC_APB2Periph 0
#endif
// Telemetry
#define TELEMETRY_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1)
#define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2
-#define TELEMETRY_RCC_APB2Periph RCC_APB2Periph_TIM10
+#define TELEMETRY_RCC_APB2Periph RCC_APB2Periph_TIM11
#define TELEMETRY_DIR_GPIO GPIOD
#define TELEMETRY_DIR_GPIO_PIN GPIO_Pin_4 // PD.04
#define TELEMETRY_GPIO GPIOD
@@ -549,12 +618,16 @@
#define AUDIO_DMA DMA1
#endif
-#if defined(RADIO_T16)
+#if defined(RADIO_FAMILY_T16)
#define AUDIO_UNMUTE_DELAY 120 // ms
#define AUDIO_MUTE_DELAY 500 // ms
#endif
// I2C Bus
+#if defined(RADIO_TX16S)
+#define I2C_RCC_AHB1Periph 0
+#define I2C_RCC_APB1Periph 0
+#else
#define I2C_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
#define I2C_RCC_APB1Periph RCC_APB1Periph_I2C1
#define I2C I2C1
@@ -565,6 +638,7 @@
#define I2C_SCL_GPIO_PinSource GPIO_PinSource8
#define I2C_SDA_GPIO_PinSource GPIO_PinSource9
#define I2C_SPEED 400000
+#endif
// Haptic
#define HAPTIC_PWM
@@ -593,7 +667,7 @@
#endif
// Internal Module
-#if !defined(RADIO_T16)
+#if !defined(RADIO_FAMILY_T16)
#define EXTERNAL_ANTENNA
#endif
#define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2)
@@ -758,8 +832,27 @@
#define TIMER_2MHz_RCC_APB1Periph RCC_APB1Periph_TIM7
#define TIMER_2MHz_TIMER TIM7
+// Touch
+#if defined(HARDWARE_TOUCH)
+#define I2C_TOUCH_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
+#define I2C_TOUCH_RCC_APB1Periph RCC_APB1Periph_I2C1
+#define I2C_TOUCH I2C1
+#define I2C_TOUCH_GPIO GPIOB
+#define I2C_TOUCH_SCL_GPIO_PIN GPIO_Pin_8 // PB.08
+#define I2C_TOUCH_SDA_GPIO_PIN GPIO_Pin_7 // PB.07
+
+#define I2C_TOUCH_RESET_GPIO GPIOF
+#define I2C_TOUCH_RESET_GPIO_PIN GPIO_Pin_10 // PF.10
+#define I2C_TOUCH_INT_GPIO GPIOH
+#define I2C_TOUCH_INT_GPIO_PIN GPIO_Pin_2 // PH.02
+#else
+#define I2C_TOUCH_RCC_AHB1Periph 0
+#define I2C_TOUCH_RCC_APB1Periph 0
+#endif
+
// Bluetooth
#define STORAGE_BLUETOOTH
+#if defined(BLUETOOTH)
#define BT_RCC_APB2Periph RCC_APB2Periph_USART6
#define BT_USART USART6
#define BT_GPIO_AF GPIO_AF_USART6
@@ -770,6 +863,9 @@
#define BT_TX_GPIO_PinSource GPIO_PinSource14
#define BT_RX_GPIO_PinSource GPIO_PinSource9
#define BT_USART_IRQHandler USART6_IRQHandler
+#else
+#define BT_RCC_APB2Periph 0
+#endif
#if defined(PCBX12S)
#if PCBREV >= 13
#define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOI | RCC_AHB1Periph_GPIOG)
diff --git a/radio/src/targets/horus/keys_driver.cpp b/radio/src/targets/horus/keys_driver.cpp
index 9879135dd..888c4dabc 100644
--- a/radio/src/targets/horus/keys_driver.cpp
+++ b/radio/src/targets/horus/keys_driver.cpp
@@ -24,7 +24,7 @@ uint32_t readKeys()
{
uint32_t result = 0;
-#if defined(PCBX12S)
+#if defined(KEYS_GPIO_REG_PGUP)
if (~KEYS_GPIO_REG_PGUP & KEYS_GPIO_PIN_PGUP)
result |= 1 << KEY_PGUP;
#endif
diff --git a/radio/src/targets/horus/telemetry_driver.cpp b/radio/src/targets/horus/telemetry_driver.cpp
index ecd73b6ab..ffb1cbc2c 100644
--- a/radio/src/targets/horus/telemetry_driver.cpp
+++ b/radio/src/targets/horus/telemetry_driver.cpp
@@ -156,7 +156,6 @@ void telemetryPortInvertedInit(uint32_t baudrate)
rxBitCount = 0;
// configure bit sample timer
- RCC->APB2ENR |= RCC_APB2ENR_TIM11EN;
TELEMETRY_TIMER->PSC = (PERI2_FREQUENCY * TIMER_MULT_APB2) / 2000000 - 1; // 0.5uS
TELEMETRY_TIMER->CCER = 0;
TELEMETRY_TIMER->CCMR1 = 0;
diff --git a/radio/src/targets/horus/usb_charger_driver.cpp b/radio/src/targets/horus/usb_charger_driver.cpp
new file mode 100644
index 000000000..3ba915318
--- /dev/null
+++ b/radio/src/targets/horus/usb_charger_driver.cpp
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) OpenTX
+ *
+ * Based on code named
+ * th9x - http://code.google.com/p/th9x
+ * er9x - http://code.google.com/p/er9x
+ * gruvin9x - http://code.google.com/p/gruvin9x
+ *
+ * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "opentx.h"
+
+void usbChargerInit()
+{
+ GPIO_InitTypeDef GPIO_InitStructure;
+ GPIO_InitStructure.GPIO_Pin = USB_CHARGER_RCC_AHB1Periph;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
+ GPIO_Init(USB_CHARGER_GPIO, &GPIO_InitStructure);
+}
+
+bool usbChargerLed()
+{
+ return GPIO_ReadInputDataBit(USB_CHARGER_GPIO, USB_CHARGER_GPIO_PIN) == Bit_RESET;
+}
+
diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp
index 2dfa0a886..3cd6742f3 100644
--- a/radio/src/targets/taranis/board.cpp
+++ b/radio/src/targets/taranis/board.cpp
@@ -113,7 +113,8 @@ void boardInit()
INTMODULE_RCC_APB2Periph |
EXTMODULE_RCC_APB2Periph |
TRAINER_MODULE_RCC_APB2Periph |
- BT_RCC_APB2Periph,
+ BT_RCC_APB2Periph |
+ TELEMETRY_RCC_APB2Periph,
ENABLE);
#if defined(BLUETOOTH) && !defined(PCBX9E)
diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h
index d7f8d3ff6..bc9f762e2 100644
--- a/radio/src/targets/taranis/board.h
+++ b/radio/src/targets/taranis/board.h
@@ -786,6 +786,8 @@ void auxSerialPutc(char c);
#define auxSerialTelemetryInit(protocol) auxSerialInit(UART_MODE_TELEMETRY, protocol)
void auxSerialSbusInit();
void auxSerialStop();
+#define AUX_SERIAL_POWER_ON()
+#define AUX_SERIAL__POWER_OFF()
#endif
// BT driver
diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h
index 2a7ca0ad9..b8d1c7177 100644
--- a/radio/src/targets/taranis/hal.h
+++ b/radio/src/targets/taranis/hal.h
@@ -754,7 +754,7 @@
#define ADC_EXT_SET_DMA_FLAGS() ADC_DMA->LIFCR = (DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0)
#define ADC_EXT_TRANSFER_COMPLETE() (ADC_DMA->LISR & DMA_LISR_TCIF0)
#define ADC_EXT_SAMPTIME 3 // sample time = 56 cycles
- #define ADC_VREF_PREC2 200
+ #define ADC_VREF_PREC2 300
#elif defined(PCBX9DP)
#define HARDWARE_POT1
#define HARDWARE_POT2
@@ -1309,10 +1309,12 @@
#if defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019)
#define AUX_SERIAL_RCC_AHB1Periph 0
#define AUX_SERIAL_RCC_APB1Periph 0
+ #define AUX_SERIAL_RCC_APB2Periph 0
#else
#define TRAINER_BATTERY_COMPARTMENT
#define AUX_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1)
#define AUX_SERIAL_RCC_APB1Periph RCC_APB1Periph_USART3
+ #define AUX_SERIAL_RCC_APB2Periph 0
#define AUX_SERIAL_GPIO GPIOB
#define AUX_SERIAL_GPIO_PIN_TX GPIO_Pin_10 // PB.10
#define AUX_SERIAL_GPIO_PIN_RX GPIO_Pin_11 // PB.11
@@ -1329,6 +1331,7 @@
// Telemetry
#define TELEMETRY_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1)
#define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2
+#define TELEMETRY_RCC_APB2Periph RCC_APB2Periph_TIM11
#define TELEMETRY_DIR_GPIO GPIOD
#define TELEMETRY_DIR_GPIO_PIN GPIO_Pin_4 // PD.04
#if defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) || defined(RADIO_X7ACCESS)
@@ -1375,6 +1378,7 @@
#define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOA
#define PCBREV_GPIO GPIOA
#define PCBREV_GPIO_PIN GPIO_Pin_14 // PA.14
+ #define PCBREV_GPIO_PULL_DOWN
#define PCBREV_VALUE() GPIO_ReadInputDataBit(PCBREV_GPIO, PCBREV_GPIO_PIN)
#else
#define PCBREV_RCC_AHB1Periph 0
diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp
index 3c9618f03..e5b0d8cfe 100644
--- a/radio/src/targets/taranis/telemetry_driver.cpp
+++ b/radio/src/targets/taranis/telemetry_driver.cpp
@@ -117,7 +117,6 @@ void telemetryPortInvertedInit(uint32_t baudrate)
rxBitCount = 0;
// configure bit sample timer
- RCC->APB2ENR |= RCC_APB2ENR_TIM11EN;
TELEMETRY_TIMER->PSC = (PERI2_FREQUENCY * TIMER_MULT_APB2) / 2000000 - 1; // 0.5uS
TELEMETRY_TIMER->CCER = 0;
TELEMETRY_TIMER->CCMR1 = 0;
diff --git a/radio/src/telemetry/crossfire.cpp b/radio/src/telemetry/crossfire.cpp
index 79063fde1..eb08dc9ed 100644
--- a/radio/src/telemetry/crossfire.cpp
+++ b/radio/src/telemetry/crossfire.cpp
@@ -21,31 +21,32 @@
#include "opentx.h"
const CrossfireSensor crossfireSensors[] = {
- {LINK_ID, 0, STR_SENSOR_RX_RSSI1, UNIT_DB, 0},
- {LINK_ID, 1, STR_SENSOR_RX_RSSI2, UNIT_DB, 0},
- {LINK_ID, 2, STR_SENSOR_RX_QUALITY, UNIT_PERCENT, 0},
- {LINK_ID, 3, STR_SENSOR_RX_SNR, UNIT_DB, 0},
- {LINK_ID, 4, STR_SENSOR_ANTENNA, UNIT_RAW, 0},
- {LINK_ID, 5, STR_SENSOR_RF_MODE, UNIT_RAW, 0},
- {LINK_ID, 6, STR_SENSOR_TX_POWER, UNIT_MILLIWATTS, 0},
- {LINK_ID, 7, STR_SENSOR_TX_RSSI, UNIT_DB, 0},
- {LINK_ID, 8, STR_SENSOR_TX_QUALITY, UNIT_PERCENT, 0},
- {LINK_ID, 9, STR_SENSOR_TX_SNR, UNIT_DB, 0},
- {BATTERY_ID, 0, STR_SENSOR_BATT, UNIT_VOLTS, 1},
- {BATTERY_ID, 1, STR_SENSOR_CURR, UNIT_AMPS, 1},
- {BATTERY_ID, 2, STR_SENSOR_CAPACITY, UNIT_MAH, 0},
- {GPS_ID, 0, STR_SENSOR_GPS, UNIT_GPS_LATITUDE, 0},
- {GPS_ID, 0, STR_SENSOR_GPS, UNIT_GPS_LONGITUDE, 0},
- {GPS_ID, 2, STR_SENSOR_GSPD, UNIT_KMH, 1},
- {GPS_ID, 3, STR_SENSOR_HDG, UNIT_DEGREE, 3},
- {GPS_ID, 4, STR_SENSOR_ALT, UNIT_METERS, 0},
- {GPS_ID, 5, STR_SENSOR_SATELLITES, UNIT_RAW, 0},
- {ATTITUDE_ID, 0, STR_SENSOR_PITCH, UNIT_RADIANS, 3},
- {ATTITUDE_ID, 1, STR_SENSOR_ROLL, UNIT_RADIANS, 3},
- {ATTITUDE_ID, 2, STR_SENSOR_YAW, UNIT_RADIANS, 3},
- {FLIGHT_MODE_ID, 0, STR_SENSOR_FLIGHT_MODE, UNIT_TEXT, 0},
- {CF_VARIO_ID, 0, STR_SENSOR_VSPD, UNIT_METERS_PER_SECOND, 2},
- {0, 0, "UNKNOWN", UNIT_RAW, 0},
+ {LINK_ID, 0, STR_SENSOR_RX_RSSI1, UNIT_DB, 0},
+ {LINK_ID, 1, STR_SENSOR_RX_RSSI2, UNIT_DB, 0},
+ {LINK_ID, 2, STR_SENSOR_RX_QUALITY, UNIT_PERCENT, 0},
+ {LINK_ID, 3, STR_SENSOR_RX_SNR, UNIT_DB, 0},
+ {LINK_ID, 4, STR_SENSOR_ANTENNA, UNIT_RAW, 0},
+ {LINK_ID, 5, STR_SENSOR_RF_MODE, UNIT_RAW, 0},
+ {LINK_ID, 6, STR_SENSOR_TX_POWER, UNIT_MILLIWATTS, 0},
+ {LINK_ID, 7, STR_SENSOR_TX_RSSI, UNIT_DB, 0},
+ {LINK_ID, 8, STR_SENSOR_TX_QUALITY, UNIT_PERCENT, 0},
+ {LINK_ID, 9, STR_SENSOR_TX_SNR, UNIT_DB, 0},
+ {BATTERY_ID, 0, STR_SENSOR_BATT, UNIT_VOLTS, 1},
+ {BATTERY_ID, 1, STR_SENSOR_CURR, UNIT_AMPS, 1},
+ {BATTERY_ID, 2, STR_SENSOR_CAPACITY, UNIT_MAH, 0},
+ {BATTERY_ID, 3, ZSTR_BATT_PERCENT, UNIT_PERCENT, 0},
+ {GPS_ID, 0, STR_SENSOR_GPS, UNIT_GPS_LATITUDE, 0},
+ {GPS_ID, 0, STR_SENSOR_GPS, UNIT_GPS_LONGITUDE, 0},
+ {GPS_ID, 2, STR_SENSOR_GSPD, UNIT_KMH, 1},
+ {GPS_ID, 3, STR_SENSOR_HDG, UNIT_DEGREE, 3},
+ {GPS_ID, 4, STR_SENSOR_ALT, UNIT_METERS, 0},
+ {GPS_ID, 5, STR_SENSOR_SATELLITES, UNIT_RAW, 0},
+ {ATTITUDE_ID, 0, STR_SENSOR_PITCH, UNIT_RADIANS, 3},
+ {ATTITUDE_ID, 1, STR_SENSOR_ROLL, UNIT_RADIANS, 3},
+ {ATTITUDE_ID, 2, STR_SENSOR_YAW, UNIT_RADIANS, 3},
+ {FLIGHT_MODE_ID, 0, STR_SENSOR_FLIGHT_MODE, UNIT_TEXT, 0},
+ {CF_VARIO_ID, 0, STR_SENSOR_VSPD, UNIT_METERS_PER_SECOND, 2},
+ {0, 0, "UNKNOWN", UNIT_RAW, 0},
};
const CrossfireSensor & getCrossfireSensor(uint8_t id, uint8_t subId)
@@ -157,6 +158,8 @@ void processCrossfireTelemetryFrame()
processCrossfireTelemetryValue(BATT_CURRENT_INDEX, value);
if (getCrossfireTelemetryValue<3>(7, value))
processCrossfireTelemetryValue(BATT_CAPACITY_INDEX, value);
+ if (getCrossfireTelemetryValue<1>(10, value))
+ processCrossfireTelemetryValue(BATT_REMAINING_INDEX, value);
break;
case ATTITUDE_ID:
diff --git a/radio/src/telemetry/crossfire.h b/radio/src/telemetry/crossfire.h
index c3d49e125..7dedd6141 100644
--- a/radio/src/telemetry/crossfire.h
+++ b/radio/src/telemetry/crossfire.h
@@ -64,6 +64,7 @@ enum CrossfireSensorIndexes {
BATT_VOLTAGE_INDEX,
BATT_CURRENT_INDEX,
BATT_CAPACITY_INDEX,
+ BATT_REMAINING_INDEX,
GPS_LATITUDE_INDEX,
GPS_LONGITUDE_INDEX,
GPS_GROUND_SPEED_INDEX,
@@ -81,7 +82,6 @@ enum CrossfireSensorIndexes {
void processCrossfireTelemetryData(uint8_t data);
void crossfireSetDefault(int index, uint8_t id, uint8_t subId);
-#if SPORT_MAX_BAUDRATE < 400000
const uint32_t CROSSFIRE_BAUDRATES[] = {
400000,
115200,
@@ -90,6 +90,7 @@ const uint8_t CROSSFIRE_FRAME_PERIODS[] = {
4,
16,
};
+#if SPORT_MAX_BAUDRATE < 400000
#define CROSSFIRE_BAUDRATE CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate]
#define CROSSFIRE_PERIOD CROSSFIRE_FRAME_PERIODS[g_eeGeneral.telemetryBaudrate]
#else
diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h
index e99c0f237..458a4901f 100644
--- a/radio/src/telemetry/frsky.h
+++ b/radio/src/telemetry/frsky.h
@@ -282,16 +282,16 @@ inline bool isRasValueValid()
{
return true;
}
-#elif defined(PCBX10)
-inline bool isRasValueValid()
-{
- return false;
-}
#elif defined(PCBX9DP) || defined(PCBX9E)
inline bool isRasValueValid()
{
return telemetryData.xjtVersion != 0x0000 && telemetryData.xjtVersion != 0x00FF;
}
+#elif defined(PCBHORUS)
+inline bool isRasValueValid()
+{
+ return true;
+}
#else
inline bool isRasValueValid()
{
diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp
index 7b2a2ffb4..70595992a 100644
--- a/radio/src/telemetry/multi.cpp
+++ b/radio/src/telemetry/multi.cpp
@@ -316,6 +316,13 @@ static void processMultiTelemetryPaket(const uint8_t * packet, uint8_t module)
uint8_t len = packet[1];
const uint8_t * data = packet + 2;
+#if defined(AUX_SERIAL)
+ if (g_eeGeneral.auxSerialMode == UART_MODE_TELEMETRY_MIRROR) {
+ for (uint8_t c=0; c < len; c++)
+ auxSerialPutc(packet[c]);
+ }
+#endif
+
// Switch type
switch (type) {
case MultiStatus:
diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h
index 1356da53c..c0b4ade7b 100644
--- a/radio/src/telemetry/telemetry.h
+++ b/radio/src/telemetry/telemetry.h
@@ -173,6 +173,7 @@ void logTelemetryWriteByte(uint8_t data);
#define LOG_TELEMETRY_WRITE_START()
#define LOG_TELEMETRY_WRITE_BYTE(data)
#endif
+#define TELEMETRY_OUTPUT_BUFFER_SIZE 64
class OutputTelemetryBuffer {
public:
@@ -214,7 +215,8 @@ class OutputTelemetryBuffer {
void pushByte(uint8_t byte)
{
- data[size++] = byte;
+ if (size < TELEMETRY_OUTPUT_BUFFER_SIZE)
+ data[size++] = byte;
}
void pushByteWithBytestuffing(uint8_t byte)
@@ -246,7 +248,7 @@ class OutputTelemetryBuffer {
public:
union {
SportTelemetryPacket sport;
- uint8_t data[16];
+ uint8_t data[TELEMETRY_OUTPUT_BUFFER_SIZE];
};
uint8_t size;
uint8_t timeout;
diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp
index 897d5cb59..26cdc159e 100644
--- a/radio/src/tests/conversions.cpp
+++ b/radio/src/tests/conversions.cpp
@@ -222,7 +222,7 @@ TEST(Conversions, ConversionX7From22)
}
#endif
-#if defined(PCBX10)
+#if defined(PCBX10) && !defined(RADIO_FAMILY_T16)
TEST(Conversions, ConversionX10From22)
{
simuFatfsSetPaths(TESTS_BUILD_PATH "/model_22_x10/", TESTS_BUILD_PATH "/model_22_x10/");
diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp
index a681b168a..04a715b3a 100644
--- a/radio/src/translations.cpp
+++ b/radio/src/translations.cpp
@@ -649,6 +649,7 @@ const char STR_PT[] = TR_PT;
const char STR_PTS[] = TR_PTS;
const char STR_SMOOTH[] = TR_SMOOTH;
const char STR_COPY_STICKS_TO_OFS[] = TR_COPY_STICKS_TO_OFS;
+const char STR_COPY_MIN_MAX_TO_OUTPUTS[] = TR_COPY_MIN_MAX_TO_OUTPUTS;
const char STR_COPY_TRIMS_TO_OFS[] = TR_COPY_TRIMS_TO_OFS;
const char STR_INCDEC[] = TR_INCDEC;
const char STR_GLOBALVAR[] = TR_GLOBALVAR;
diff --git a/radio/src/translations.h b/radio/src/translations.h
index fe5b1ff31..e01a2e2b0 100644
--- a/radio/src/translations.h
+++ b/radio/src/translations.h
@@ -945,6 +945,7 @@ extern const char STR_PT[];
extern const char STR_PTS[];
extern const char STR_SMOOTH[];
extern const char STR_COPY_STICKS_TO_OFS[];
+extern const char STR_COPY_MIN_MAX_TO_OUTPUTS[];
extern const char STR_COPY_TRIMS_TO_OFS[];
extern const char STR_INCDEC[];
extern const char STR_GLOBALVAR[];
diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt
index ce91291a2..33f2f4c94 100644
--- a/radio/src/translations/cz.h.txt
+++ b/radio/src/translations/cz.h.txt
@@ -971,6 +971,7 @@
#define TR_PTS " b."
#define TR_SMOOTH "Hladká"
#define TR_COPY_STICKS_TO_OFS TR("Páky do subtrimu", "Kopie pák do subtrimu")
+#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("Trimy do subtrimu", "Kopíe trimů do subtrimu")
#define TR_INCDEC "Zvěšit/Zmenšit"
#define TR_GLOBALVAR "Glob. proměnná"
@@ -1169,3 +1170,106 @@
#define TR_JITTER_FILTER "ADC Filtr"
#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage")
#define TR_AUTH_FAILURE "Auth-failure"
+
+#define ZSTR_RSSI "RSSI"
+#define ZSTR_R9PW "R9PW"
+#define ZSTR_RAS "SWR"
+#define ZSTR_A1 "A1"
+#define ZSTR_A2 "A2"
+#define ZSTR_A3 "A3"
+#define ZSTR_A4 "A4"
+#define ZSTR_BATT "RxBt"
+#define ZSTR_ALT "Alt"
+#define ZSTR_TEMP1 "Tmp1"
+#define ZSTR_TEMP2 "Tmp2"
+#define ZSTR_TEMP3 "Tmp3"
+#define ZSTR_TEMP4 "Tmp4"
+#define ZSTR_RPM2 "RPM2"
+#define ZSTR_PRES "Pres"
+#define ZSTR_ODO1 "Odo1"
+#define ZSTR_ODO2 "Odo2"
+#define ZSTR_TXV "TX_V"
+#define ZSTR_CURR_SERVO1 "CSv1"
+#define ZSTR_CURR_SERVO2 "CSv2"
+#define ZSTR_CURR_SERVO3 "CSv3"
+#define ZSTR_CURR_SERVO4 "CSv4"
+#define ZSTR_DIST "Dist"
+#define ZSTR_ARM "Arm"
+#define ZSTR_C50 "C50"
+#define ZSTR_C200 "C200"
+#define ZSTR_RPM "RPM"
+#define ZSTR_FUEL "Fuel"
+#define ZSTR_VSPD "VSpd"
+#define ZSTR_ACCX "AccX"
+#define ZSTR_ACCY "AccY"
+#define ZSTR_ACCZ "AccZ"
+#define ZSTR_GYROX "GYRX"
+#define ZSTR_GYROY "GYRY"
+#define ZSTR_GYROZ "GYRZ"
+#define ZSTR_CURR "Curr"
+#define ZSTR_CAPACITY "Capa"
+#define ZSTR_VFAS "VFAS"
+#define ZSTR_BATT_PERCENT "Bat%"
+#define ZSTR_ASPD "ASpd"
+#define ZSTR_GSPD "GSpd"
+#define ZSTR_HDG "Hdg"
+#define ZSTR_SATELLITES "Sats"
+#define ZSTR_CELLS "Cels"
+#define ZSTR_GPSALT "GAlt"
+#define ZSTR_GPSDATETIME "Date"
+#define ZSTR_GPS "GPS"
+#define ZSTR_BATT1_VOLTAGE "RB1V"
+#define ZSTR_BATT2_VOLTAGE "RB2V"
+#define ZSTR_BATT1_CURRENT "RB1A"
+#define ZSTR_BATT2_CURRENT "RB2A"
+#define ZSTR_BATT1_CONSUMPTION "RB1C"
+#define ZSTR_BATT2_CONSUMPTION "RB2C"
+#define ZSTR_BATT1_TEMP "RB1T"
+#define ZSTR_BATT2_TEMP "RB2T"
+#define ZSTR_RB_STATE "RBS"
+#define ZSTR_CHANS_STATE "RBCS"
+#define ZSTR_RX_RSSI1 "1RSS"
+#define ZSTR_RX_RSSI2 "2RSS"
+#define ZSTR_RX_QUALITY "RQly"
+#define ZSTR_RX_SNR "RSNR"
+#define ZSTR_RX_NOISE "RNse"
+#define ZSTR_ANTENNA "ANT"
+#define ZSTR_RF_MODE "RFMD"
+#define ZSTR_TX_POWER "TPWR"
+#define ZSTR_TX_RSSI "TRSS"
+#define ZSTR_TX_QUALITY "TQly"
+#define ZSTR_TX_SNR "TSNR"
+#define ZSTR_TX_NOISE "TNse"
+#define ZSTR_PITCH "Ptch"
+#define ZSTR_ROLL "Roll"
+#define ZSTR_YAW "Yaw"
+#define ZSTR_FLIGHT_MODE "FM"
+#define ZSTR_THROTTLE "Thr"
+#define ZSTR_QOS_A "FdeA"
+#define ZSTR_QOS_B "FdeB"
+#define ZSTR_QOS_L "FdeL"
+#define ZSTR_QOS_R "FdeR"
+#define ZSTR_QOS_F "FLss"
+#define ZSTR_QOS_H "Hold"
+#define ZSTR_BIND "BIND"
+#define ZSTR_LAP_NUMBER "Lap "
+#define ZSTR_GATE_NUMBER "Gate"
+#define ZSTR_LAP_TIME "LapT"
+#define ZSTR_GATE_TIME "GteT"
+#define ZSTR_ESC_VOLTAGE "EscV"
+#define ZSTR_ESC_CURRENT "EscA"
+#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_CONSUMPTION "EscC"
+#define ZSTR_ESC_TEMP "EscT"
+#define ZSTR_SD1_CHANNEL "Chan"
+#define ZSTR_GASSUIT_TEMP1 "GTp1"
+#define ZSTR_GASSUIT_TEMP2 "GTp2"
+#define ZSTR_GASSUIT_RPM "GRPM"
+#define ZSTR_GASSUIT_FLOW "GFlo"
+#define ZSTR_GASSUIT_CONS "GFue"
+#define ZSTR_GASSUIT_RES_VOL "GRVl"
+#define ZSTR_GASSUIT_RES_PERC "GRPc"
+#define ZSTR_GASSUIT_MAX_FLOW "GMFl"
+#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
+#define ZSTR_SBEC_VOLTAGE "BecV"
+#define ZSTR_SBEC_CURRENT "BecA"
diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt
index 77a139eeb..fe11e08f3 100644
--- a/radio/src/translations/de.h.txt
+++ b/radio/src/translations/de.h.txt
@@ -657,15 +657,15 @@
#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_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Modul\nUpdate nötig")
+#define TR_MODULE_UPGRADE TR("Upg. advised", "Modulupdate empfohlen")
#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_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem AN"
+#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem AUS"
+#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem AN"
+#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem AUS"
#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")
@@ -689,18 +689,18 @@
#define TR_VOLTAGE TR(INDENT "Spg", INDENT "Spannungsquelle") //9XR-Pro
#define TR_CURRENT TR(INDENT "Strom", INDENT "Stromquelle")
#define TR_SELECT_MODEL "Modell auswählen"
-#define TR_CREATE_CATEGORY "Modelltyp erzeugen"
+#define TR_CREATE_CATEGORY "Modelltyp erstellen"
#define TR_RENAME_CATEGORY "Modelltyp umbenennen"
#define TR_DELETE_CATEGORY "Modelltyp löschen"
-#define TR_CREATE_MODEL "Neues Modell"
+#define TR_CREATE_MODEL TR("Neues Modell" , "Neues Modell erstellen")
#define TR_DUPLICATE_MODEL "Kopiere Modell"
#define TR_COPY_MODEL "Kopiere Modell"
#define TR_MOVE_MODEL "Verschiebe Modell"
#define TR_BACKUP_MODEL "Modell auf SD-Karte" //9XR-Pro
-#define TR_DELETE_MODEL "Modell löschen" // TODO merged into DELETEMODEL?
+#define TR_DELETE_MODEL "Lösche Modell" // TODO merged into DELETEMODEL?
#define TR_RESTORE_MODEL TR("Modell wiederher.", "Modell wiederherstellen")
-#define TR_DELETE_ERROR "Fehler beim Löschen"
-#define TR_CAT_NOT_EMPTY "Kategorie nicht leer"
+#define TR_DELETE_ERROR "Fehler beim\nLöschen"
+#define TR_CAT_NOT_EMPTY "Modelltyp nicht leer"
#define TR_SDCARD_ERROR "SD-Kartenfehler"
#define TR_SDCARD "SD Card"
#define TR_NO_FILES_ON_SD "No files on SD!"
@@ -834,19 +834,19 @@
#define TR_MIXERS_MONITOR "==>Mischer Monitor"
#define TR_PATH_TOO_LONG "Pfad zu Lang"
#define TR_VIEW_TEXT "View Text"
-#define TR_FLASH_BOOTLOADER TR("Flash bootloader","Flash bootloader selbst") //
+#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_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
+#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: ")
#define TR_FLASH_INTERNAL_MODULE TR("Flash int. XJT","Flash internes XJT-Modul")
-#define TR_FLASH_INTERNAL_MULTI TR("Flash Int. Multi", "Flash Internal Multi")
-#define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. mod","Flash extern 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_FLASH_INTERNAL_MULTI TR("Flash Int. Multi", "Flash int. Multimodul")
+#define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. mod","Flash ext. Modul")
+#define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash ext. Multimodul")
+#define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware Updatefehler")
+#define TR_FIRMWARE_UPDATE_SUCCESS TR3("Flash successful","Flash successful","Update erfolgreich")
+#define TR_WRITING "Schreibe..."
#define TR_CONFIRM_FORMAT "Formatieren bestätigen?"
#define TR_INTERNALRF "Internes HF-Modul"
#define TR_INTERNAL_MODULE TR("Int. module","Internal module")
@@ -977,14 +977,15 @@
#define TR_PRESET "Preset"
#define TR_MIRROR "Spiegeln"
#define TR_CLEAR "Löschen"
-#define TR_RESET TR("Servowert reset","Servowerte rücksetzen")
+#define TR_RESET TR("Servowert reset","Servowerte zurücksetzen")
#define TR_RESET_SUBMENU TR("Reset Werte ==>", "Reset=>Timer Flug Telem")
#define TR_COUNT "Punkte"
#define TR_PT "Pt"
#define TR_PTS "Pts"
#define TR_SMOOTH "Runden"
-#define TR_COPY_STICKS_TO_OFS TR("Copy Stk ->Subtrim", "Kopie Stick to Servo-Mitte")
-#define TR_COPY_TRIMS_TO_OFS TR("Copy Trim->Subtrim", "Kopie Trimm to Servo-Mitte") // "Trim to Subtrim"
+#define TR_COPY_STICKS_TO_OFS TR3("Copy Stk ->Subtrim", "Kopiere Stick zu Subtrim", "Kopiere Knüppelposition auf Subtrim")
+#define TR_COPY_MIN_MAX_TO_OUTPUTS TR3("Cpy min/max to all", "Kopiere min/max zu allen" , "Kopiere Limits & Mitte auf alle Kanäle")
+#define TR_COPY_TRIMS_TO_OFS TR3("Copy Trim->Subtrim", "Kopiere Trimm zu Subtrim" , "Kopiere Trimmposition auf Subtrim") // "Trim to Subtrim"
#define TR_INCDEC "Inc/Decrement"
#define TR_GLOBALVAR "Global Var"
#define TR_MIXSOURCE "Mixer Quelle"
@@ -1183,3 +1184,105 @@
#define TR_AUTH_FAILURE "Auth-failure"
// ----------------------------------------------------------------
+#define ZSTR_RSSI "RSSI"
+#define ZSTR_R9PW "R9PW"
+#define ZSTR_RAS "SWR"
+#define ZSTR_A1 "A1"
+#define ZSTR_A2 "A2"
+#define ZSTR_A3 "A3"
+#define ZSTR_A4 "A4"
+#define ZSTR_BATT "RxBt"
+#define ZSTR_ALT "Alt"
+#define ZSTR_TEMP1 "Tmp1"
+#define ZSTR_TEMP2 "Tmp2"
+#define ZSTR_TEMP3 "Tmp3"
+#define ZSTR_TEMP4 "Tmp4"
+#define ZSTR_RPM2 "RPM2"
+#define ZSTR_PRES "Pres"
+#define ZSTR_ODO1 "Odo1"
+#define ZSTR_ODO2 "Odo2"
+#define ZSTR_TXV "TX_V"
+#define ZSTR_CURR_SERVO1 "CSv1"
+#define ZSTR_CURR_SERVO2 "CSv2"
+#define ZSTR_CURR_SERVO3 "CSv3"
+#define ZSTR_CURR_SERVO4 "CSv4"
+#define ZSTR_DIST "Dist"
+#define ZSTR_ARM "Arm"
+#define ZSTR_C50 "C50"
+#define ZSTR_C200 "C200"
+#define ZSTR_RPM "RPM"
+#define ZSTR_FUEL "Fuel"
+#define ZSTR_VSPD "VSpd"
+#define ZSTR_ACCX "AccX"
+#define ZSTR_ACCY "AccY"
+#define ZSTR_ACCZ "AccZ"
+#define ZSTR_GYROX "GYRX"
+#define ZSTR_GYROY "GYRY"
+#define ZSTR_GYROZ "GYRZ"
+#define ZSTR_CURR "Curr"
+#define ZSTR_CAPACITY "Capa"
+#define ZSTR_VFAS "VFAS"
+#define ZSTR_BATT_PERCENT "Bat%"
+#define ZSTR_ASPD "ASpd"
+#define ZSTR_GSPD "GSpd"
+#define ZSTR_HDG "Hdg"
+#define ZSTR_SATELLITES "Sats"
+#define ZSTR_CELLS "Cels"
+#define ZSTR_GPSALT "GAlt"
+#define ZSTR_GPSDATETIME "Date"
+#define ZSTR_GPS "GPS"
+#define ZSTR_BATT1_VOLTAGE "RB1V"
+#define ZSTR_BATT2_VOLTAGE "RB2V"
+#define ZSTR_BATT1_CURRENT "RB1A"
+#define ZSTR_BATT2_CURRENT "RB2A"
+#define ZSTR_BATT1_CONSUMPTION "RB1C"
+#define ZSTR_BATT2_CONSUMPTION "RB2C"
+#define ZSTR_BATT1_TEMP "RB1T"
+#define ZSTR_BATT2_TEMP "RB2T"
+#define ZSTR_RB_STATE "RBS"
+#define ZSTR_CHANS_STATE "RBCS"
+#define ZSTR_RX_RSSI1 "1RSS"
+#define ZSTR_RX_RSSI2 "2RSS"
+#define ZSTR_RX_QUALITY "RQly"
+#define ZSTR_RX_SNR "RSNR"
+#define ZSTR_RX_NOISE "RNse"
+#define ZSTR_ANTENNA "ANT"
+#define ZSTR_RF_MODE "RFMD"
+#define ZSTR_TX_POWER "TPWR"
+#define ZSTR_TX_RSSI "TRSS"
+#define ZSTR_TX_QUALITY "TQly"
+#define ZSTR_TX_SNR "TSNR"
+#define ZSTR_TX_NOISE "TNse"
+#define ZSTR_PITCH "Ptch"
+#define ZSTR_ROLL "Roll"
+#define ZSTR_YAW "Yaw"
+#define ZSTR_FLIGHT_MODE "FM"
+#define ZSTR_THROTTLE "Thr"
+#define ZSTR_QOS_A "FdeA"
+#define ZSTR_QOS_B "FdeB"
+#define ZSTR_QOS_L "FdeL"
+#define ZSTR_QOS_R "FdeR"
+#define ZSTR_QOS_F "FLss"
+#define ZSTR_QOS_H "Hold"
+#define ZSTR_BIND "BIND"
+#define ZSTR_LAP_NUMBER "Lap "
+#define ZSTR_GATE_NUMBER "Gate"
+#define ZSTR_LAP_TIME "LapT"
+#define ZSTR_GATE_TIME "GteT"
+#define ZSTR_ESC_VOLTAGE "EscV"
+#define ZSTR_ESC_CURRENT "EscA"
+#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_CONSUMPTION "EscC"
+#define ZSTR_ESC_TEMP "EscT"
+#define ZSTR_SD1_CHANNEL "Chan"
+#define ZSTR_GASSUIT_TEMP1 "GTp1"
+#define ZSTR_GASSUIT_TEMP2 "GTp2"
+#define ZSTR_GASSUIT_RPM "GRPM"
+#define ZSTR_GASSUIT_FLOW "GFlo"
+#define ZSTR_GASSUIT_CONS "GFue"
+#define ZSTR_GASSUIT_RES_VOL "GRVl"
+#define ZSTR_GASSUIT_RES_PERC "GRPc"
+#define ZSTR_GASSUIT_MAX_FLOW "GMFl"
+#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
+#define ZSTR_SBEC_VOLTAGE "BecV"
+#define ZSTR_SBEC_CURRENT "BecA"
diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt
index a4e43a972..f3af3d5be 100644
--- a/radio/src/translations/en.h.txt
+++ b/radio/src/translations/en.h.txt
@@ -983,6 +983,7 @@
#define TR_PTS "pts"
#define TR_SMOOTH "Smooth"
#define TR_COPY_STICKS_TO_OFS TR("Cpy stick->subtrim", "Copy sticks to subtrim")
+#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_INCDEC "Inc/Decrement"
#define TR_GLOBALVAR "Global var"
@@ -1178,4 +1179,107 @@
#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"
\ No newline at end of file
+#define TR_AUTH_FAILURE "Auth-failure"
+
+#define ZSTR_RSSI "RSSI"
+#define ZSTR_R9PW "R9PW"
+#define ZSTR_RAS "SWR"
+#define ZSTR_A1 "A1"
+#define ZSTR_A2 "A2"
+#define ZSTR_A3 "A3"
+#define ZSTR_A4 "A4"
+#define ZSTR_BATT "RxBt"
+#define ZSTR_ALT "Alt"
+#define ZSTR_TEMP1 "Tmp1"
+#define ZSTR_TEMP2 "Tmp2"
+#define ZSTR_TEMP3 "Tmp3"
+#define ZSTR_TEMP4 "Tmp4"
+#define ZSTR_RPM2 "RPM2"
+#define ZSTR_PRES "Pres"
+#define ZSTR_ODO1 "Odo1"
+#define ZSTR_ODO2 "Odo2"
+#define ZSTR_TXV "TX_V"
+#define ZSTR_CURR_SERVO1 "CSv1"
+#define ZSTR_CURR_SERVO2 "CSv2"
+#define ZSTR_CURR_SERVO3 "CSv3"
+#define ZSTR_CURR_SERVO4 "CSv4"
+#define ZSTR_DIST "Dist"
+#define ZSTR_ARM "Arm"
+#define ZSTR_C50 "C50"
+#define ZSTR_C200 "C200"
+#define ZSTR_RPM "RPM"
+#define ZSTR_FUEL "Fuel"
+#define ZSTR_VSPD "VSpd"
+#define ZSTR_ACCX "AccX"
+#define ZSTR_ACCY "AccY"
+#define ZSTR_ACCZ "AccZ"
+#define ZSTR_GYROX "GYRX"
+#define ZSTR_GYROY "GYRY"
+#define ZSTR_GYROZ "GYRZ"
+#define ZSTR_CURR "Curr"
+#define ZSTR_CAPACITY "Capa"
+#define ZSTR_VFAS "VFAS"
+#define ZSTR_BATT_PERCENT "Bat%"
+#define ZSTR_ASPD "ASpd"
+#define ZSTR_GSPD "GSpd"
+#define ZSTR_HDG "Hdg"
+#define ZSTR_SATELLITES "Sats"
+#define ZSTR_CELLS "Cels"
+#define ZSTR_GPSALT "GAlt"
+#define ZSTR_GPSDATETIME "Date"
+#define ZSTR_GPS "GPS"
+#define ZSTR_BATT1_VOLTAGE "RB1V"
+#define ZSTR_BATT2_VOLTAGE "RB2V"
+#define ZSTR_BATT1_CURRENT "RB1A"
+#define ZSTR_BATT2_CURRENT "RB2A"
+#define ZSTR_BATT1_CONSUMPTION "RB1C"
+#define ZSTR_BATT2_CONSUMPTION "RB2C"
+#define ZSTR_BATT1_TEMP "RB1T"
+#define ZSTR_BATT2_TEMP "RB2T"
+#define ZSTR_RB_STATE "RBS"
+#define ZSTR_CHANS_STATE "RBCS"
+#define ZSTR_RX_RSSI1 "1RSS"
+#define ZSTR_RX_RSSI2 "2RSS"
+#define ZSTR_RX_QUALITY "RQly"
+#define ZSTR_RX_SNR "RSNR"
+#define ZSTR_RX_NOISE "RNse"
+#define ZSTR_ANTENNA "ANT"
+#define ZSTR_RF_MODE "RFMD"
+#define ZSTR_TX_POWER "TPWR"
+#define ZSTR_TX_RSSI "TRSS"
+#define ZSTR_TX_QUALITY "TQly"
+#define ZSTR_TX_SNR "TSNR"
+#define ZSTR_TX_NOISE "TNse"
+#define ZSTR_PITCH "Ptch"
+#define ZSTR_ROLL "Roll"
+#define ZSTR_YAW "Yaw"
+#define ZSTR_FLIGHT_MODE "FM"
+#define ZSTR_THROTTLE "Thr"
+#define ZSTR_QOS_A "FdeA"
+#define ZSTR_QOS_B "FdeB"
+#define ZSTR_QOS_L "FdeL"
+#define ZSTR_QOS_R "FdeR"
+#define ZSTR_QOS_F "FLss"
+#define ZSTR_QOS_H "Hold"
+#define ZSTR_BIND "BIND"
+#define ZSTR_LAP_NUMBER "Lap "
+#define ZSTR_GATE_NUMBER "Gate"
+#define ZSTR_LAP_TIME "LapT"
+#define ZSTR_GATE_TIME "GteT"
+#define ZSTR_ESC_VOLTAGE "EscV"
+#define ZSTR_ESC_CURRENT "EscA"
+#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_CONSUMPTION "EscC"
+#define ZSTR_ESC_TEMP "EscT"
+#define ZSTR_SD1_CHANNEL "Chan"
+#define ZSTR_GASSUIT_TEMP1 "GTp1"
+#define ZSTR_GASSUIT_TEMP2 "GTp2"
+#define ZSTR_GASSUIT_RPM "GRPM"
+#define ZSTR_GASSUIT_FLOW "GFlo"
+#define ZSTR_GASSUIT_CONS "GFue"
+#define ZSTR_GASSUIT_RES_VOL "GRVl"
+#define ZSTR_GASSUIT_RES_PERC "GRPc"
+#define ZSTR_GASSUIT_MAX_FLOW "GMFl"
+#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
+#define ZSTR_SBEC_VOLTAGE "BecV"
+#define ZSTR_SBEC_CURRENT "BecA"
diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt
index 07bc633e5..4b9aba50e 100644
--- a/radio/src/translations/es.h.txt
+++ b/radio/src/translations/es.h.txt
@@ -1006,6 +1006,7 @@
#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_INCDEC "Inc/Decrement"
#define TR_GLOBALVAR "Global Var"
@@ -1204,3 +1205,106 @@
#define TR_JITTER_FILTER "ADC Filter"
#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage")
#define TR_AUTH_FAILURE "Auth-failure"
+
+#define ZSTR_RSSI "RSSI"
+#define ZSTR_R9PW "R9PW"
+#define ZSTR_RAS "SWR"
+#define ZSTR_A1 "A1"
+#define ZSTR_A2 "A2"
+#define ZSTR_A3 "A3"
+#define ZSTR_A4 "A4"
+#define ZSTR_BATT "RxBt"
+#define ZSTR_ALT "Alt"
+#define ZSTR_TEMP1 "Tmp1"
+#define ZSTR_TEMP2 "Tmp2"
+#define ZSTR_TEMP3 "Tmp3"
+#define ZSTR_TEMP4 "Tmp4"
+#define ZSTR_RPM2 "RPM2"
+#define ZSTR_PRES "Pres"
+#define ZSTR_ODO1 "Odo1"
+#define ZSTR_ODO2 "Odo2"
+#define ZSTR_TXV "TX_V"
+#define ZSTR_CURR_SERVO1 "CSv1"
+#define ZSTR_CURR_SERVO2 "CSv2"
+#define ZSTR_CURR_SERVO3 "CSv3"
+#define ZSTR_CURR_SERVO4 "CSv4"
+#define ZSTR_DIST "Dist"
+#define ZSTR_ARM "Arm"
+#define ZSTR_C50 "C50"
+#define ZSTR_C200 "C200"
+#define ZSTR_RPM "RPM"
+#define ZSTR_FUEL "Fuel"
+#define ZSTR_VSPD "VSpd"
+#define ZSTR_ACCX "AccX"
+#define ZSTR_ACCY "AccY"
+#define ZSTR_ACCZ "AccZ"
+#define ZSTR_GYROX "GYRX"
+#define ZSTR_GYROY "GYRY"
+#define ZSTR_GYROZ "GYRZ"
+#define ZSTR_CURR "Curr"
+#define ZSTR_CAPACITY "Capa"
+#define ZSTR_VFAS "VFAS"
+#define ZSTR_BATT_PERCENT "Bat%"
+#define ZSTR_ASPD "ASpd"
+#define ZSTR_GSPD "GSpd"
+#define ZSTR_HDG "Hdg"
+#define ZSTR_SATELLITES "Sats"
+#define ZSTR_CELLS "Cels"
+#define ZSTR_GPSALT "GAlt"
+#define ZSTR_GPSDATETIME "Date"
+#define ZSTR_GPS "GPS"
+#define ZSTR_BATT1_VOLTAGE "RB1V"
+#define ZSTR_BATT2_VOLTAGE "RB2V"
+#define ZSTR_BATT1_CURRENT "RB1A"
+#define ZSTR_BATT2_CURRENT "RB2A"
+#define ZSTR_BATT1_CONSUMPTION "RB1C"
+#define ZSTR_BATT2_CONSUMPTION "RB2C"
+#define ZSTR_BATT1_TEMP "RB1T"
+#define ZSTR_BATT2_TEMP "RB2T"
+#define ZSTR_RB_STATE "RBS"
+#define ZSTR_CHANS_STATE "RBCS"
+#define ZSTR_RX_RSSI1 "1RSS"
+#define ZSTR_RX_RSSI2 "2RSS"
+#define ZSTR_RX_QUALITY "RQly"
+#define ZSTR_RX_SNR "RSNR"
+#define ZSTR_RX_NOISE "RNse"
+#define ZSTR_ANTENNA "ANT"
+#define ZSTR_RF_MODE "RFMD"
+#define ZSTR_TX_POWER "TPWR"
+#define ZSTR_TX_RSSI "TRSS"
+#define ZSTR_TX_QUALITY "TQly"
+#define ZSTR_TX_SNR "TSNR"
+#define ZSTR_TX_NOISE "TNse"
+#define ZSTR_PITCH "Ptch"
+#define ZSTR_ROLL "Roll"
+#define ZSTR_YAW "Yaw"
+#define ZSTR_FLIGHT_MODE "FM"
+#define ZSTR_THROTTLE "Thr"
+#define ZSTR_QOS_A "FdeA"
+#define ZSTR_QOS_B "FdeB"
+#define ZSTR_QOS_L "FdeL"
+#define ZSTR_QOS_R "FdeR"
+#define ZSTR_QOS_F "FLss"
+#define ZSTR_QOS_H "Hold"
+#define ZSTR_BIND "BIND"
+#define ZSTR_LAP_NUMBER "Lap "
+#define ZSTR_GATE_NUMBER "Gate"
+#define ZSTR_LAP_TIME "LapT"
+#define ZSTR_GATE_TIME "GteT"
+#define ZSTR_ESC_VOLTAGE "EscV"
+#define ZSTR_ESC_CURRENT "EscA"
+#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_CONSUMPTION "EscC"
+#define ZSTR_ESC_TEMP "EscT"
+#define ZSTR_SD1_CHANNEL "Chan"
+#define ZSTR_GASSUIT_TEMP1 "GTp1"
+#define ZSTR_GASSUIT_TEMP2 "GTp2"
+#define ZSTR_GASSUIT_RPM "GRPM"
+#define ZSTR_GASSUIT_FLOW "GFlo"
+#define ZSTR_GASSUIT_CONS "GFue"
+#define ZSTR_GASSUIT_RES_VOL "GRVl"
+#define ZSTR_GASSUIT_RES_PERC "GRPc"
+#define ZSTR_GASSUIT_MAX_FLOW "GMFl"
+#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
+#define ZSTR_SBEC_VOLTAGE "BecV"
+#define ZSTR_SBEC_CURRENT "BecA"
diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt
index b29732355..cf555a465 100644
--- a/radio/src/translations/fi.h.txt
+++ b/radio/src/translations/fi.h.txt
@@ -1000,6 +1000,7 @@
#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_INCDEC "Inc/Decrement"
#define TR_GLOBALVAR "Global Var"
@@ -1192,3 +1193,105 @@
#define TR_JITTER_FILTER "ADC Filter"
#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage")
#define TR_AUTH_FAILURE "Auth-failure"
+
+#define ZSTR_RSSI "RSSI"
+#define ZSTR_R9PW "R9PW"
+#define ZSTR_RAS "SWR"
+#define ZSTR_A1 "A1"
+#define ZSTR_A2 "A2"
+#define ZSTR_A3 "A3"
+#define ZSTR_A4 "A4"
+#define ZSTR_BATT "RxBt"
+#define ZSTR_ALT "Alt"
+#define ZSTR_TEMP1 "Tmp1"
+#define ZSTR_TEMP2 "Tmp2"
+#define ZSTR_TEMP3 "Tmp3"
+#define ZSTR_TEMP4 "Tmp4"
+#define ZSTR_RPM2 "RPM2"
+#define ZSTR_PRES "Pres"
+#define ZSTR_ODO1 "Odo1"
+#define ZSTR_ODO2 "Odo2"
+#define ZSTR_TXV "TX_V"
+#define ZSTR_CURR_SERVO1 "CSv1"
+#define ZSTR_CURR_SERVO2 "CSv2"
+#define ZSTR_CURR_SERVO3 "CSv3"
+#define ZSTR_CURR_SERVO4 "CSv4"
+#define ZSTR_DIST "Dist"
+#define ZSTR_ARM "Arm"
+#define ZSTR_C50 "C50"
+#define ZSTR_C200 "C200"
+#define ZSTR_RPM "RPM"
+#define ZSTR_FUEL "Fuel"
+#define ZSTR_VSPD "VSpd"
+#define ZSTR_ACCX "AccX"
+#define ZSTR_ACCY "AccY"
+#define ZSTR_ACCZ "AccZ"
+#define ZSTR_GYROX "GYRX"
+#define ZSTR_GYROY "GYRY"
+#define ZSTR_GYROZ "GYRZ"
+#define ZSTR_CURR "Curr"
+#define ZSTR_CAPACITY "Capa"
+#define ZSTR_VFAS "VFAS"
+#define ZSTR_BATT_PERCENT "Bat%"
+#define ZSTR_ASPD "ASpd"
+#define ZSTR_GSPD "GSpd"
+#define ZSTR_HDG "Hdg"
+#define ZSTR_SATELLITES "Sats"
+#define ZSTR_CELLS "Cels"
+#define ZSTR_GPSALT "GAlt"
+#define ZSTR_GPSDATETIME "Date"
+#define ZSTR_GPS "GPS"
+#define ZSTR_BATT1_VOLTAGE "RB1V"
+#define ZSTR_BATT2_VOLTAGE "RB2V"
+#define ZSTR_BATT1_CURRENT "RB1A"
+#define ZSTR_BATT2_CURRENT "RB2A"
+#define ZSTR_BATT1_CONSUMPTION "RB1C"
+#define ZSTR_BATT2_CONSUMPTION "RB2C"
+#define ZSTR_BATT1_TEMP "RB1T"
+#define ZSTR_BATT2_TEMP "RB2T"
+#define ZSTR_RB_STATE "RBS"
+#define ZSTR_CHANS_STATE "RBCS"
+#define ZSTR_RX_RSSI1 "1RSS"
+#define ZSTR_RX_RSSI2 "2RSS"
+#define ZSTR_RX_QUALITY "RQly"
+#define ZSTR_RX_SNR "RSNR"
+#define ZSTR_RX_NOISE "RNse"
+#define ZSTR_ANTENNA "ANT"
+#define ZSTR_RF_MODE "RFMD"
+#define ZSTR_TX_POWER "TPWR"
+#define ZSTR_TX_RSSI "TRSS"
+#define ZSTR_TX_QUALITY "TQly"
+#define ZSTR_TX_SNR "TSNR"
+#define ZSTR_TX_NOISE "TNse"
+#define ZSTR_PITCH "Ptch"
+#define ZSTR_ROLL "Roll"
+#define ZSTR_YAW "Yaw"
+#define ZSTR_FLIGHT_MODE "FM"
+#define ZSTR_THROTTLE "Thr"
+#define ZSTR_QOS_A "FdeA"
+#define ZSTR_QOS_B "FdeB"
+#define ZSTR_QOS_L "FdeL"
+#define ZSTR_QOS_R "FdeR"
+#define ZSTR_QOS_F "FLss"
+#define ZSTR_QOS_H "Hold"
+#define ZSTR_BIND "BIND"
+#define ZSTR_LAP_NUMBER "Lap "
+#define ZSTR_GATE_NUMBER "Gate"
+#define ZSTR_LAP_TIME "LapT"
+#define ZSTR_GATE_TIME "GteT"
+#define ZSTR_ESC_VOLTAGE "EscV"
+#define ZSTR_ESC_CURRENT "EscA"
+#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_CONSUMPTION "EscC"
+#define ZSTR_ESC_TEMP "EscT"
+#define ZSTR_SD1_CHANNEL "Chan"
+#define ZSTR_GASSUIT_TEMP1 "GTp1"
+#define ZSTR_GASSUIT_TEMP2 "GTp2"
+#define ZSTR_GASSUIT_RPM "GRPM"
+#define ZSTR_GASSUIT_FLOW "GFlo"
+#define ZSTR_GASSUIT_CONS "GFue"
+#define ZSTR_GASSUIT_RES_VOL "GRVl"
+#define ZSTR_GASSUIT_RES_PERC "GRPc"
+#define ZSTR_GASSUIT_MAX_FLOW "GMFl"
+#define ZSTR_SBEC_VOLTAGE "BecV"
+#define ZSTR_SBEC_CURRENT "BecA"
diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt
index 97f7e18cf..4f49e2678 100644
--- a/radio/src/translations/fr.h.txt
+++ b/radio/src/translations/fr.h.txt
@@ -1000,6 +1000,7 @@
#define TR_PTS "pts"
#define TR_SMOOTH "Lissage"
#define TR_COPY_STICKS_TO_OFS TR("Cpy stick->subtrim", "Manche vers subtrim")
+#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", "Trim vers subtrim")
#define TR_INCDEC "Inc/décrementer"
#define TR_GLOBALVAR "Var. globale"
@@ -1205,3 +1206,106 @@
#define TR_JITTER_FILTER "Filtre ADC"
#define TR_RTC_CHECK TR("Vérif. RTC", "Vérif. pile RTC")
#define TR_AUTH_FAILURE "Auth-failure"
+
+#define ZSTR_RSSI "RSSI"
+#define ZSTR_R9PW "R9PW"
+#define ZSTR_RAS "SWR"
+#define ZSTR_A1 "A1"
+#define ZSTR_A2 "A2"
+#define ZSTR_A3 "A3"
+#define ZSTR_A4 "A4"
+#define ZSTR_BATT "BtRx"
+#define ZSTR_ALT "Alt"
+#define ZSTR_TEMP1 "Tmp1"
+#define ZSTR_TEMP2 "Tmp2"
+#define ZSTR_TEMP3 "Tmp3"
+#define ZSTR_TEMP4 "Tmp4"
+#define ZSTR_RPM2 "RPM2"
+#define ZSTR_PRES "Pres"
+#define ZSTR_ODO1 "Odo1"
+#define ZSTR_ODO2 "Odo2"
+#define ZSTR_TXV "TX_V"
+#define ZSTR_CURR_SERVO1 "CSv1"
+#define ZSTR_CURR_SERVO2 "CSv2"
+#define ZSTR_CURR_SERVO3 "CSv3"
+#define ZSTR_CURR_SERVO4 "CSv4"
+#define ZSTR_DIST "Dist"
+#define ZSTR_ARM "Arm"
+#define ZSTR_C50 "C50"
+#define ZSTR_C200 "C200"
+#define ZSTR_RPM "RPM"
+#define ZSTR_FUEL "Fuel"
+#define ZSTR_VSPD "VSpd"
+#define ZSTR_ACCX "AccX"
+#define ZSTR_ACCY "AccY"
+#define ZSTR_ACCZ "AccZ"
+#define ZSTR_GYROX "GYRX"
+#define ZSTR_GYROY "GYRY"
+#define ZSTR_GYROZ "GYRZ"
+#define ZSTR_CURR "Curr"
+#define ZSTR_CAPACITY "Capa"
+#define ZSTR_VFAS "VFAS"
+#define ZSTR_BATT_PERCENT "Bat%"
+#define ZSTR_ASPD "ASpd"
+#define ZSTR_GSPD "GSpd"
+#define ZSTR_HDG "Hdg"
+#define ZSTR_SATELLITES "Sats"
+#define ZSTR_CELLS "Cels"
+#define ZSTR_GPSALT "GAlt"
+#define ZSTR_GPSDATETIME "Date"
+#define ZSTR_GPS "GPS"
+#define ZSTR_BATT1_VOLTAGE "RB1V"
+#define ZSTR_BATT2_VOLTAGE "RB2V"
+#define ZSTR_BATT1_CURRENT "RB1A"
+#define ZSTR_BATT2_CURRENT "RB2A"
+#define ZSTR_BATT1_CONSUMPTION "RB1C"
+#define ZSTR_BATT2_CONSUMPTION "RB2C"
+#define ZSTR_BATT1_TEMP "RB1T"
+#define ZSTR_BATT2_TEMP "RB2T"
+#define ZSTR_RB_STATE "RBS"
+#define ZSTR_CHANS_STATE "RBCS"
+#define ZSTR_RX_RSSI1 "1RSS"
+#define ZSTR_RX_RSSI2 "2RSS"
+#define ZSTR_RX_QUALITY "RQly"
+#define ZSTR_RX_SNR "RSNR"
+#define ZSTR_RX_NOISE "RNse"
+#define ZSTR_ANTENNA "ANT"
+#define ZSTR_RF_MODE "RFMD"
+#define ZSTR_TX_POWER "TPWR"
+#define ZSTR_TX_RSSI "TRSS"
+#define ZSTR_TX_QUALITY "TQly"
+#define ZSTR_TX_SNR "TSNR"
+#define ZSTR_TX_NOISE "TNse"
+#define ZSTR_PITCH "Ptch"
+#define ZSTR_ROLL "Roll"
+#define ZSTR_YAW "Yaw"
+#define ZSTR_FLIGHT_MODE "PV"
+#define ZSTR_THROTTLE "Thr"
+#define ZSTR_QOS_A "FdeA"
+#define ZSTR_QOS_B "FdeB"
+#define ZSTR_QOS_L "FdeL"
+#define ZSTR_QOS_R "FdeR"
+#define ZSTR_QOS_F "FLss"
+#define ZSTR_QOS_H "Hold"
+#define ZSTR_BIND "BIND"
+#define ZSTR_LAP_NUMBER "Lap "
+#define ZSTR_GATE_NUMBER "Gate"
+#define ZSTR_LAP_TIME "LapT"
+#define ZSTR_GATE_TIME "GteT"
+#define ZSTR_ESC_VOLTAGE "EscV"
+#define ZSTR_ESC_CURRENT "EscA"
+#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_CONSUMPTION "EscC"
+#define ZSTR_ESC_TEMP "EscT"
+#define ZSTR_SD1_CHANNEL "Chan"
+#define ZSTR_GASSUIT_TEMP1 "GTp1"
+#define ZSTR_GASSUIT_TEMP2 "GTp2"
+#define ZSTR_GASSUIT_RPM "GRPM"
+#define ZSTR_GASSUIT_FLOW "GFlo"
+#define ZSTR_GASSUIT_CONS "GFue"
+#define ZSTR_GASSUIT_RES_VOL "GRVl"
+#define ZSTR_GASSUIT_RES_PERC "GRPc"
+#define ZSTR_GASSUIT_MAX_FLOW "GMFl"
+#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
+#define ZSTR_SBEC_VOLTAGE "BecV"
+#define ZSTR_SBEC_CURRENT "BecA"
diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt
index 0d8c9456a..58f945cd2 100644
--- a/radio/src/translations/it.h.txt
+++ b/radio/src/translations/it.h.txt
@@ -1005,6 +1005,7 @@
#define TR_PTS "pti"
#define TR_SMOOTH "Smussa"
#define TR_COPY_STICKS_TO_OFS TR(INDENT "Cp. stick->subtrim", INDENT "Copia Sticks su Subtrim")
+#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(INDENT "Cp. trim->subtrim", INDENT "Copia Trims su Subtrim")
#define TR_INCDEC "Inc/Decrementa"
#define TR_GLOBALVAR "Var Globale"
@@ -1204,3 +1205,106 @@
#define TR_JITTER_FILTER "Filtro ADC"
#define TR_RTC_CHECK TR("Controllo RTC", "Controllo voltaggio RTC")
#define TR_AUTH_FAILURE "Auth-failure"
+
+#define ZSTR_RSSI "RSSI"
+#define ZSTR_R9PW "R9PW"
+#define ZSTR_RAS "SWR"
+#define ZSTR_A1 "A1"
+#define ZSTR_A2 "A2"
+#define ZSTR_A3 "A3"
+#define ZSTR_A4 "A4"
+#define ZSTR_BATT "RxBt"
+#define ZSTR_ALT "Alt"
+#define ZSTR_TEMP1 "Tmp1"
+#define ZSTR_TEMP2 "Tmp2"
+#define ZSTR_TEMP3 "Tmp3"
+#define ZSTR_TEMP4 "Tmp4"
+#define ZSTR_RPM2 "RPM2"
+#define ZSTR_PRES "Pres"
+#define ZSTR_ODO1 "Odo1"
+#define ZSTR_ODO2 "Odo2"
+#define ZSTR_TXV "TX_V"
+#define ZSTR_CURR_SERVO1 "CSv1"
+#define ZSTR_CURR_SERVO2 "CSv2"
+#define ZSTR_CURR_SERVO3 "CSv3"
+#define ZSTR_CURR_SERVO4 "CSv4"
+#define ZSTR_DIST "Dist"
+#define ZSTR_ARM "Arm"
+#define ZSTR_C50 "C50"
+#define ZSTR_C200 "C200"
+#define ZSTR_RPM "RPM"
+#define ZSTR_FUEL "Fuel"
+#define ZSTR_VSPD "VSpd"
+#define ZSTR_ACCX "AccX"
+#define ZSTR_ACCY "AccY"
+#define ZSTR_ACCZ "AccZ"
+#define ZSTR_GYROX "GYRX"
+#define ZSTR_GYROY "GYRY"
+#define ZSTR_GYROZ "GYRZ"
+#define ZSTR_CURR "Curr"
+#define ZSTR_CAPACITY "Capa"
+#define ZSTR_VFAS "VFAS"
+#define ZSTR_BATT_PERCENT "Bat%"
+#define ZSTR_ASPD "ASpd"
+#define ZSTR_GSPD "GSpd"
+#define ZSTR_HDG "Hdg"
+#define ZSTR_SATELLITES "Sats"
+#define ZSTR_CELLS "Cels"
+#define ZSTR_GPSALT "GAlt"
+#define ZSTR_GPSDATETIME "Data"
+#define ZSTR_GPS "GPS"
+#define ZSTR_BATT1_VOLTAGE "RB1V"
+#define ZSTR_BATT2_VOLTAGE "RB2V"
+#define ZSTR_BATT1_CURRENT "RB1A"
+#define ZSTR_BATT2_CURRENT "RB2A"
+#define ZSTR_BATT1_CONSUMPTION "RB1C"
+#define ZSTR_BATT2_CONSUMPTION "RB2C"
+#define ZSTR_BATT1_TEMP "RB1T"
+#define ZSTR_BATT2_TEMP "RB2T"
+#define ZSTR_RB_STATE "RBS"
+#define ZSTR_CHANS_STATE "RBCS"
+#define ZSTR_RX_RSSI1 "1RSS"
+#define ZSTR_RX_RSSI2 "2RSS"
+#define ZSTR_RX_QUALITY "RQly"
+#define ZSTR_RX_SNR "RSNR"
+#define ZSTR_RX_NOISE "RNse"
+#define ZSTR_ANTENNA "ANT"
+#define ZSTR_RF_MODE "RFMD"
+#define ZSTR_TX_POWER "TPWR"
+#define ZSTR_TX_RSSI "TRSS"
+#define ZSTR_TX_QUALITY "TQly"
+#define ZSTR_TX_SNR "TSNR"
+#define ZSTR_TX_NOISE "TNse"
+#define ZSTR_PITCH "Ptch"
+#define ZSTR_ROLL "Roll"
+#define ZSTR_YAW "Yaw"
+#define ZSTR_FLIGHT_MODE "FM"
+#define ZSTR_THROTTLE "Thr"
+#define ZSTR_QOS_A "FdeA"
+#define ZSTR_QOS_B "FdeB"
+#define ZSTR_QOS_L "FdeL"
+#define ZSTR_QOS_R "FdeR"
+#define ZSTR_QOS_F "FLss"
+#define ZSTR_QOS_H "Hold"
+#define ZSTR_BIND "BIND"
+#define ZSTR_LAP_NUMBER "Lap "
+#define ZSTR_GATE_NUMBER "Gate"
+#define ZSTR_LAP_TIME "LapT"
+#define ZSTR_GATE_TIME "GteT"
+#define ZSTR_ESC_VOLTAGE "EscV"
+#define ZSTR_ESC_CURRENT "EscA"
+#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_CONSUMPTION "EscC"
+#define ZSTR_ESC_TEMP "EscT"
+#define ZSTR_SD1_CHANNEL "Chan"
+#define ZSTR_GASSUIT_TEMP1 "GTp1"
+#define ZSTR_GASSUIT_TEMP2 "GTp2"
+#define ZSTR_GASSUIT_RPM "GRPM"
+#define ZSTR_GASSUIT_FLOW "GFlo"
+#define ZSTR_GASSUIT_CONS "GFue"
+#define ZSTR_GASSUIT_RES_VOL "GRVl"
+#define ZSTR_GASSUIT_RES_PERC "GRPc"
+#define ZSTR_GASSUIT_MAX_FLOW "GMFl"
+#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
+#define ZSTR_SBEC_VOLTAGE "BecV"
+#define ZSTR_SBEC_CURRENT "BecA"
diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt
index 5d36f4590..6e06ff4b9 100644
--- a/radio/src/translations/nl.h.txt
+++ b/radio/src/translations/nl.h.txt
@@ -986,6 +986,7 @@
#define TR_PTS "Ptn"
#define TR_SMOOTH "Zacht"
#define TR_COPY_STICKS_TO_OFS TR("Cpy stick->subtrim", "Kopieer Sticks naar Subtrim")
+#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", "Kopieer Trim naar Subtrim")
#define TR_INCDEC "Inc/Decrement"
#define TR_GLOBALVAR "Globale Var"
@@ -1191,3 +1192,106 @@
#define TR_JITTER_FILTER "ADC Filter"
#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage")
#define TR_AUTH_FAILURE "Auth-failure"
+
+#define ZSTR_RSSI "RSSI"
+#define ZSTR_R9PW "R9PW"
+#define ZSTR_RAS "SWR"
+#define ZSTR_A1 "A1"
+#define ZSTR_A2 "A2"
+#define ZSTR_A3 "A3"
+#define ZSTR_A4 "A4"
+#define ZSTR_BATT "RxBt"
+#define ZSTR_ALT "Alt"
+#define ZSTR_TEMP1 "Tmp1"
+#define ZSTR_TEMP2 "Tmp2"
+#define ZSTR_TEMP3 "Tmp3"
+#define ZSTR_TEMP4 "Tmp4"
+#define ZSTR_RPM2 "RPM2"
+#define ZSTR_PRES "Pres"
+#define ZSTR_ODO1 "Odo1"
+#define ZSTR_ODO2 "Odo2"
+#define ZSTR_TXV "TX_V"
+#define ZSTR_CURR_SERVO1 "CSv1"
+#define ZSTR_CURR_SERVO2 "CSv2"
+#define ZSTR_CURR_SERVO3 "CSv3"
+#define ZSTR_CURR_SERVO4 "CSv4"
+#define ZSTR_DIST "Dist"
+#define ZSTR_ARM "Arm"
+#define ZSTR_C50 "C50"
+#define ZSTR_C200 "C200"
+#define ZSTR_RPM "RPM"
+#define ZSTR_FUEL "Fuel"
+#define ZSTR_VSPD "VSpd"
+#define ZSTR_ACCX "AccX"
+#define ZSTR_ACCY "AccY"
+#define ZSTR_ACCZ "AccZ"
+#define ZSTR_GYROX "GYRX"
+#define ZSTR_GYROY "GYRY"
+#define ZSTR_GYROZ "GYRZ"
+#define ZSTR_CURR "Curr"
+#define ZSTR_CAPACITY "Capa"
+#define ZSTR_VFAS "VFAS"
+#define ZSTR_BATT_PERCENT "Bat%"
+#define ZSTR_ASPD "ASpd"
+#define ZSTR_GSPD "GSpd"
+#define ZSTR_HDG "Hdg"
+#define ZSTR_SATELLITES "Sats"
+#define ZSTR_CELLS "Cels"
+#define ZSTR_GPSALT "GAlt"
+#define ZSTR_GPSDATETIME "Date"
+#define ZSTR_GPS "GPS"
+#define ZSTR_BATT1_VOLTAGE "RB1V"
+#define ZSTR_BATT2_VOLTAGE "RB2V"
+#define ZSTR_BATT1_CURRENT "RB1A"
+#define ZSTR_BATT2_CURRENT "RB2A"
+#define ZSTR_BATT1_CONSUMPTION "RB1C"
+#define ZSTR_BATT2_CONSUMPTION "RB2C"
+#define ZSTR_BATT1_TEMP "RB1T"
+#define ZSTR_BATT2_TEMP "RB2T"
+#define ZSTR_RB_STATE "RBS"
+#define ZSTR_CHANS_STATE "RBCS"
+#define ZSTR_RX_RSSI1 "1RSS"
+#define ZSTR_RX_RSSI2 "2RSS"
+#define ZSTR_RX_QUALITY "RQly"
+#define ZSTR_RX_SNR "RSNR"
+#define ZSTR_RX_NOISE "RNse"
+#define ZSTR_ANTENNA "ANT"
+#define ZSTR_RF_MODE "RFMD"
+#define ZSTR_TX_POWER "TPWR"
+#define ZSTR_TX_RSSI "TRSS"
+#define ZSTR_TX_QUALITY "TQly"
+#define ZSTR_TX_SNR "TSNR"
+#define ZSTR_TX_NOISE "TNse"
+#define ZSTR_PITCH "Ptch"
+#define ZSTR_ROLL "Roll"
+#define ZSTR_YAW "Yaw"
+#define ZSTR_FLIGHT_MODE "FM"
+#define ZSTR_THROTTLE "Thr"
+#define ZSTR_QOS_A "FdeA"
+#define ZSTR_QOS_B "FdeB"
+#define ZSTR_QOS_L "FdeL"
+#define ZSTR_QOS_R "FdeR"
+#define ZSTR_QOS_F "FLss"
+#define ZSTR_QOS_H "Hold"
+#define ZSTR_BIND "BIND"
+#define ZSTR_LAP_NUMBER "Lap "
+#define ZSTR_GATE_NUMBER "Gate"
+#define ZSTR_LAP_TIME "LapT"
+#define ZSTR_GATE_TIME "GteT"
+#define ZSTR_ESC_VOLTAGE "EscV"
+#define ZSTR_ESC_CURRENT "EscA"
+#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_CONSUMPTION "EscC"
+#define ZSTR_ESC_TEMP "EscT"
+#define ZSTR_SD1_CHANNEL "Chan"
+#define ZSTR_GASSUIT_TEMP1 "GTp1"
+#define ZSTR_GASSUIT_TEMP2 "GTp2"
+#define ZSTR_GASSUIT_RPM "GRPM"
+#define ZSTR_GASSUIT_FLOW "GFlo"
+#define ZSTR_GASSUIT_CONS "GFue"
+#define ZSTR_GASSUIT_RES_VOL "GRVl"
+#define ZSTR_GASSUIT_RES_PERC "GRPc"
+#define ZSTR_GASSUIT_MAX_FLOW "GMFl"
+#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
+#define ZSTR_SBEC_VOLTAGE "BecV"
+#define ZSTR_SBEC_CURRENT "BecA"
diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt
index dcede8cd0..509dc031a 100644
--- a/radio/src/translations/pl.h.txt
+++ b/radio/src/translations/pl.h.txt
@@ -1001,6 +1001,7 @@
#define TR_PTS "pkty"
#define TR_SMOOTH "Gładka"
#define TR_COPY_STICKS_TO_OFS TR("Cpy stick->subtrim", "Skopiuj Drążki Do Offsetu")
+#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", "Skopiuj Trymery Do subtrymerów")
#define TR_INCDEC "Zwiększ/Zmnie"
#define TR_GLOBALVAR "Zm.Global."
@@ -1200,3 +1201,106 @@
#define TR_JITTER_FILTER "ADC Filter"
#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage")
#define TR_AUTH_FAILURE "Auth-failure"
+
+#define ZSTR_RSSI "RSSI"
+#define ZSTR_R9PW "R9PW"
+#define ZSTR_RAS "SWR"
+#define ZSTR_A1 "A1"
+#define ZSTR_A2 "A2"
+#define ZSTR_A3 "A3"
+#define ZSTR_A4 "A4"
+#define ZSTR_BATT "RxBt"
+#define ZSTR_ALT "Alt"
+#define ZSTR_TEMP1 "Tmp1"
+#define ZSTR_TEMP2 "Tmp2"
+#define ZSTR_TEMP3 "Tmp3"
+#define ZSTR_TEMP4 "Tmp4"
+#define ZSTR_RPM2 "RPM2"
+#define ZSTR_PRES "Pres"
+#define ZSTR_ODO1 "Odo1"
+#define ZSTR_ODO2 "Odo2"
+#define ZSTR_TXV "TX_V"
+#define ZSTR_CURR_SERVO1 "CSv1"
+#define ZSTR_CURR_SERVO2 "CSv2"
+#define ZSTR_CURR_SERVO3 "CSv3"
+#define ZSTR_CURR_SERVO4 "CSv4"
+#define ZSTR_DIST "Dist"
+#define ZSTR_ARM "Arm"
+#define ZSTR_C50 "C50"
+#define ZSTR_C200 "C200"
+#define ZSTR_RPM "RPM"
+#define ZSTR_FUEL "Fuel"
+#define ZSTR_VSPD "VSpd"
+#define ZSTR_ACCX "AccX"
+#define ZSTR_ACCY "AccY"
+#define ZSTR_ACCZ "AccZ"
+#define ZSTR_GYROX "GYRX"
+#define ZSTR_GYROY "GYRY"
+#define ZSTR_GYROZ "GYRZ"
+#define ZSTR_CURR "Curr"
+#define ZSTR_CAPACITY "Capa"
+#define ZSTR_VFAS "VFAS"
+#define ZSTR_BATT_PERCENT "Bat%"
+#define ZSTR_ASPD "ASpd"
+#define ZSTR_GSPD "GSpd"
+#define ZSTR_HDG "Hdg"
+#define ZSTR_SATELLITES "Sats"
+#define ZSTR_CELLS "Cels"
+#define ZSTR_GPSALT "GAlt"
+#define ZSTR_GPSDATETIME "Date"
+#define ZSTR_GPS "GPS"
+#define ZSTR_BATT1_VOLTAGE "RB1V"
+#define ZSTR_BATT2_VOLTAGE "RB2V"
+#define ZSTR_BATT1_CURRENT "RB1A"
+#define ZSTR_BATT2_CURRENT "RB2A"
+#define ZSTR_BATT1_CONSUMPTION "RB1C"
+#define ZSTR_BATT2_CONSUMPTION "RB2C"
+#define ZSTR_BATT1_TEMP "RB1T"
+#define ZSTR_BATT2_TEMP "RB2T"
+#define ZSTR_RB_STATE "RBS"
+#define ZSTR_CHANS_STATE "RBCS"
+#define ZSTR_RX_RSSI1 "1RSS"
+#define ZSTR_RX_RSSI2 "2RSS"
+#define ZSTR_RX_QUALITY "RQly"
+#define ZSTR_RX_SNR "RSNR"
+#define ZSTR_RX_NOISE "RNse"
+#define ZSTR_ANTENNA "ANT"
+#define ZSTR_RF_MODE "RFMD"
+#define ZSTR_TX_POWER "TPWR"
+#define ZSTR_TX_RSSI "TRSS"
+#define ZSTR_TX_QUALITY "TQly"
+#define ZSTR_TX_SNR "TSNR"
+#define ZSTR_TX_NOISE "TNse"
+#define ZSTR_PITCH "Ptch"
+#define ZSTR_ROLL "Roll"
+#define ZSTR_YAW "Yaw"
+#define ZSTR_FLIGHT_MODE "FM"
+#define ZSTR_THROTTLE "Thr"
+#define ZSTR_QOS_A "FdeA"
+#define ZSTR_QOS_B "FdeB"
+#define ZSTR_QOS_L "FdeL"
+#define ZSTR_QOS_R "FdeR"
+#define ZSTR_QOS_F "FLss"
+#define ZSTR_QOS_H "Hold"
+#define ZSTR_BIND "BIND"
+#define ZSTR_LAP_NUMBER "Lap "
+#define ZSTR_GATE_NUMBER "Gate"
+#define ZSTR_LAP_TIME "LapT"
+#define ZSTR_GATE_TIME "GteT"
+#define ZSTR_ESC_VOLTAGE "EscV"
+#define ZSTR_ESC_CURRENT "EscA"
+#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_CONSUMPTION "EscC"
+#define ZSTR_ESC_TEMP "EscT"
+#define ZSTR_SD1_CHANNEL "Chan"
+#define ZSTR_GASSUIT_TEMP1 "GTp1"
+#define ZSTR_GASSUIT_TEMP2 "GTp2"
+#define ZSTR_GASSUIT_RPM "GRPM"
+#define ZSTR_GASSUIT_FLOW "GFlo"
+#define ZSTR_GASSUIT_CONS "GFue"
+#define ZSTR_GASSUIT_RES_VOL "GRVl"
+#define ZSTR_GASSUIT_RES_PERC "GRPc"
+#define ZSTR_GASSUIT_MAX_FLOW "GMFl"
+#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
+#define ZSTR_SBEC_VOLTAGE "BecV"
+#define ZSTR_SBEC_CURRENT "BecA"
diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt
index ae5fae78b..c8b12d8d7 100644
--- a/radio/src/translations/pt.h.txt
+++ b/radio/src/translations/pt.h.txt
@@ -991,6 +991,7 @@
#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_INCDEC "Inc/Decrement"
#define TR_GLOBALVAR "Global Var"
@@ -1189,3 +1190,106 @@
#define TR_JITTER_FILTER "ADC Filter"
#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage")
#define TR_AUTH_FAILURE "Auth-failure"
+
+#define ZSTR_RSSI "RSSI"
+#define ZSTR_R9PW "R9PW"
+#define ZSTR_RAS "SWR"
+#define ZSTR_A1 "A1"
+#define ZSTR_A2 "A2"
+#define ZSTR_A3 "A3"
+#define ZSTR_A4 "A4"
+#define ZSTR_BATT "RxBt"
+#define ZSTR_ALT "Alt"
+#define ZSTR_TEMP1 "Tmp1"
+#define ZSTR_TEMP2 "Tmp2"
+#define ZSTR_TEMP3 "Tmp3"
+#define ZSTR_TEMP4 "Tmp4"
+#define ZSTR_RPM2 "RPM2"
+#define ZSTR_PRES "Pres"
+#define ZSTR_ODO1 "Odo1"
+#define ZSTR_ODO2 "Odo2"
+#define ZSTR_TXV "TX_V"
+#define ZSTR_CURR_SERVO1 "CSv1"
+#define ZSTR_CURR_SERVO2 "CSv2"
+#define ZSTR_CURR_SERVO3 "CSv3"
+#define ZSTR_CURR_SERVO4 "CSv4"
+#define ZSTR_DIST "Dist"
+#define ZSTR_ARM "Arm"
+#define ZSTR_C50 "C50"
+#define ZSTR_C200 "C200"
+#define ZSTR_RPM "RPM"
+#define ZSTR_FUEL "Fuel"
+#define ZSTR_VSPD "VSpd"
+#define ZSTR_ACCX "AccX"
+#define ZSTR_ACCY "AccY"
+#define ZSTR_ACCZ "AccZ"
+#define ZSTR_GYROX "GYRX"
+#define ZSTR_GYROY "GYRY"
+#define ZSTR_GYROZ "GYRZ"
+#define ZSTR_CURR "Curr"
+#define ZSTR_CAPACITY "Capa"
+#define ZSTR_VFAS "VFAS"
+#define ZSTR_BATT_PERCENT "Bat%"
+#define ZSTR_ASPD "ASpd"
+#define ZSTR_GSPD "GSpd"
+#define ZSTR_HDG "Hdg"
+#define ZSTR_SATELLITES "Sats"
+#define ZSTR_CELLS "Cels"
+#define ZSTR_GPSALT "GAlt"
+#define ZSTR_GPSDATETIME "Date"
+#define ZSTR_GPS "GPS"
+#define ZSTR_BATT1_VOLTAGE "RB1V"
+#define ZSTR_BATT2_VOLTAGE "RB2V"
+#define ZSTR_BATT1_CURRENT "RB1A"
+#define ZSTR_BATT2_CURRENT "RB2A"
+#define ZSTR_BATT1_CONSUMPTION "RB1C"
+#define ZSTR_BATT2_CONSUMPTION "RB2C"
+#define ZSTR_BATT1_TEMP "RB1T"
+#define ZSTR_BATT2_TEMP "RB2T"
+#define ZSTR_RB_STATE "RBS"
+#define ZSTR_CHANS_STATE "RBCS"
+#define ZSTR_RX_RSSI1 "1RSS"
+#define ZSTR_RX_RSSI2 "2RSS"
+#define ZSTR_RX_QUALITY "RQly"
+#define ZSTR_RX_SNR "RSNR"
+#define ZSTR_RX_NOISE "RNse"
+#define ZSTR_ANTENNA "ANT"
+#define ZSTR_RF_MODE "RFMD"
+#define ZSTR_TX_POWER "TPWR"
+#define ZSTR_TX_RSSI "TRSS"
+#define ZSTR_TX_QUALITY "TQly"
+#define ZSTR_TX_SNR "TSNR"
+#define ZSTR_TX_NOISE "TNse"
+#define ZSTR_PITCH "Ptch"
+#define ZSTR_ROLL "Roll"
+#define ZSTR_YAW "Yaw"
+#define ZSTR_FLIGHT_MODE "FM"
+#define ZSTR_THROTTLE "Thr"
+#define ZSTR_QOS_A "FdeA"
+#define ZSTR_QOS_B "FdeB"
+#define ZSTR_QOS_L "FdeL"
+#define ZSTR_QOS_R "FdeR"
+#define ZSTR_QOS_F "FLss"
+#define ZSTR_QOS_H "Hold"
+#define ZSTR_BIND "BIND"
+#define ZSTR_LAP_NUMBER "Lap "
+#define ZSTR_GATE_NUMBER "Gate"
+#define ZSTR_LAP_TIME "LapT"
+#define ZSTR_GATE_TIME "GteT"
+#define ZSTR_ESC_VOLTAGE "EscV"
+#define ZSTR_ESC_CURRENT "EscA"
+#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_CONSUMPTION "EscC"
+#define ZSTR_ESC_TEMP "EscT"
+#define ZSTR_SD1_CHANNEL "Chan"
+#define ZSTR_GASSUIT_TEMP1 "GTp1"
+#define ZSTR_GASSUIT_TEMP2 "GTp2"
+#define ZSTR_GASSUIT_RPM "GRPM"
+#define ZSTR_GASSUIT_FLOW "GFlo"
+#define ZSTR_GASSUIT_CONS "GFue"
+#define ZSTR_GASSUIT_RES_VOL "GRVl"
+#define ZSTR_GASSUIT_RES_PERC "GRPc"
+#define ZSTR_GASSUIT_MAX_FLOW "GMFl"
+#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
+#define ZSTR_SBEC_VOLTAGE "BecV"
+#define ZSTR_SBEC_CURRENT "BecA"
diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt
index 91e661111..de9bb5e12 100644
--- a/radio/src/translations/se.h.txt
+++ b/radio/src/translations/se.h.txt
@@ -1004,6 +1004,7 @@
#define TR_PTS "pkt"
#define TR_SMOOTH "Mjuk"
#define TR_COPY_STICKS_TO_OFS TR("Cpy stick->subtrim", "Spara spakar som subtrim")
+#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", "Spara trimmar som subtrim")
#define TR_INCDEC "Inkr/Dekrement"
#define TR_GLOBALVAR "Globala Var"
@@ -1203,3 +1204,106 @@
#define TR_JITTER_FILTER "ADC Filter"
#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage")
#define TR_AUTH_FAILURE "Auth-failure"
+
+#define ZSTR_RSSI "RSSI"
+#define ZSTR_R9PW "R9PW"
+#define ZSTR_RAS "SWR"
+#define ZSTR_A1 "A1"
+#define ZSTR_A2 "A2"
+#define ZSTR_A3 "A3"
+#define ZSTR_A4 "A4"
+#define ZSTR_BATT "RxBt"
+#define ZSTR_ALT "Alt"
+#define ZSTR_TEMP1 "Tmp1"
+#define ZSTR_TEMP2 "Tmp2"
+#define ZSTR_TEMP3 "Tmp3"
+#define ZSTR_TEMP4 "Tmp4"
+#define ZSTR_RPM2 "RPM2"
+#define ZSTR_PRES "Pres"
+#define ZSTR_ODO1 "Odo1"
+#define ZSTR_ODO2 "Odo2"
+#define ZSTR_TXV "TX_V"
+#define ZSTR_CURR_SERVO1 "CSv1"
+#define ZSTR_CURR_SERVO2 "CSv2"
+#define ZSTR_CURR_SERVO3 "CSv3"
+#define ZSTR_CURR_SERVO4 "CSv4"
+#define ZSTR_DIST "Dist"
+#define ZSTR_ARM "Arm"
+#define ZSTR_C50 "C50"
+#define ZSTR_C200 "C200"
+#define ZSTR_RPM "RPM"
+#define ZSTR_FUEL "Fuel"
+#define ZSTR_VSPD "VSpd"
+#define ZSTR_ACCX "AccX"
+#define ZSTR_ACCY "AccY"
+#define ZSTR_ACCZ "AccZ"
+#define ZSTR_GYROX "GYRX"
+#define ZSTR_GYROY "GYRY"
+#define ZSTR_GYROZ "GYRZ"
+#define ZSTR_CURR "Curr"
+#define ZSTR_CAPACITY "Capa"
+#define ZSTR_VFAS "VFAS"
+#define ZSTR_BATT_PERCENT "Bat%"
+#define ZSTR_ASPD "ASpd"
+#define ZSTR_GSPD "GSpd"
+#define ZSTR_HDG "Hdg"
+#define ZSTR_SATELLITES "Sats"
+#define ZSTR_CELLS "Cels"
+#define ZSTR_GPSALT "GAlt"
+#define ZSTR_GPSDATETIME "Date"
+#define ZSTR_GPS "GPS"
+#define ZSTR_BATT1_VOLTAGE "RB1V"
+#define ZSTR_BATT2_VOLTAGE "RB2V"
+#define ZSTR_BATT1_CURRENT "RB1A"
+#define ZSTR_BATT2_CURRENT "RB2A"
+#define ZSTR_BATT1_CONSUMPTION "RB1C"
+#define ZSTR_BATT2_CONSUMPTION "RB2C"
+#define ZSTR_BATT1_TEMP "RB1T"
+#define ZSTR_BATT2_TEMP "RB2T"
+#define ZSTR_RB_STATE "RBS"
+#define ZSTR_CHANS_STATE "RBCS"
+#define ZSTR_RX_RSSI1 "1RSS"
+#define ZSTR_RX_RSSI2 "2RSS"
+#define ZSTR_RX_QUALITY "RQly"
+#define ZSTR_RX_SNR "RSNR"
+#define ZSTR_RX_NOISE "RNse"
+#define ZSTR_ANTENNA "ANT"
+#define ZSTR_RF_MODE "RFMD"
+#define ZSTR_TX_POWER "TPWR"
+#define ZSTR_TX_RSSI "TRSS"
+#define ZSTR_TX_QUALITY "TQly"
+#define ZSTR_TX_SNR "TSNR"
+#define ZSTR_TX_NOISE "TNse"
+#define ZSTR_PITCH "Ptch"
+#define ZSTR_ROLL "Roll"
+#define ZSTR_YAW "Yaw"
+#define ZSTR_FLIGHT_MODE "FM"
+#define ZSTR_THROTTLE "Thr"
+#define ZSTR_QOS_A "FdeA"
+#define ZSTR_QOS_B "FdeB"
+#define ZSTR_QOS_L "FdeL"
+#define ZSTR_QOS_R "FdeR"
+#define ZSTR_QOS_F "FLss"
+#define ZSTR_QOS_H "Hold"
+#define ZSTR_BIND "BIND"
+#define ZSTR_LAP_NUMBER "Lap "
+#define ZSTR_GATE_NUMBER "Gate"
+#define ZSTR_LAP_TIME "LapT"
+#define ZSTR_GATE_TIME "GteT"
+#define ZSTR_ESC_VOLTAGE "EscV"
+#define ZSTR_ESC_CURRENT "EscA"
+#define ZSTR_ESC_RPM "EscR"
+#define ZSTR_ESC_CONSUMPTION "EscC"
+#define ZSTR_ESC_TEMP "EscT"
+#define ZSTR_SD1_CHANNEL "Chan"
+#define ZSTR_GASSUIT_TEMP1 "GTp1"
+#define ZSTR_GASSUIT_TEMP2 "GTp2"
+#define ZSTR_GASSUIT_RPM "GRPM"
+#define ZSTR_GASSUIT_FLOW "GFlo"
+#define ZSTR_GASSUIT_CONS "GFue"
+#define ZSTR_GASSUIT_RES_VOL "GRVl"
+#define ZSTR_GASSUIT_RES_PERC "GRPc"
+#define ZSTR_GASSUIT_MAX_FLOW "GMFl"
+#define ZSTR_GASSUIT_AVG_FLOW "GAFl"
+#define ZSTR_SBEC_VOLTAGE "BecV"
+#define ZSTR_SBEC_CURRENT "BecA"
diff --git a/radio/src/translations/tts_pt.cpp b/radio/src/translations/tts_pt.cpp
index 34a3ff75b..a909227f5 100644
--- a/radio/src/translations/tts_pt.cpp
+++ b/radio/src/translations/tts_pt.cpp
@@ -96,7 +96,6 @@ I18N_PLAY_FUNCTION(pt, playNumber, getvalue_t number, uint8_t unit, uint8_t att)
number = -number;
}
-
int8_t mode = MODE(att);
if (mode > 0) {
if (mode == 2) {
@@ -127,13 +126,20 @@ I18N_PLAY_FUNCTION(pt, playNumber, getvalue_t number, uint8_t unit, uint8_t att)
if (number == 0)
number = -1;
}
- if (number >= 100) {
- PUSH_NUMBER_PROMPT(PT_PROMPT_CENTO + number/100);
+
+ if (number > 100) {
+ PUSH_NUMBER_PROMPT(PT_PROMPT_CEM + number/100);
number %= 100;
if (number == 0)
number = -1;
}
- PUSH_NUMBER_PROMPT(PT_PROMPT_ZERO+number);
+
+ if (number == 100) {
+ PUSH_NUMBER_PROMPT(PT_PROMPT_CEM);
+ }
+ else {
+ PUSH_NUMBER_PROMPT(PT_PROMPT_ZERO + number);
+ }
if (unit) {
PT_PUSH_UNIT_PROMPT(unit);
diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h
index d04eefab4..f008b1a7c 100644
--- a/radio/src/translations/untranslated.h
+++ b/radio/src/translations/untranslated.h
@@ -71,7 +71,9 @@
#define TR_VSWITCHES "---" "ID0""ID1""ID2" "THR""RUD""ELE""AIL""GEA""TRN" TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_ON_ONE_SWITCHES
#endif
-#if defined(PCBHORUS)
+#if defined(PCBHORUS) && defined(AUX_SERIAL)
+ #define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_BATTERY TR_VTRAINER_BLUETOOTH TR_VTRAINER_MULTI
+#elif defined(PCBHORUS)
#define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_BLUETOOTH TR_VTRAINER_MULTI
#elif defined(PCBTARANIS)
#define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_SBUS_MODULE TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY TR_VTRAINER_BLUETOOTH TR_VTRAINER_MULTI
diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py
index 9658e605d..373e4a41d 100755
--- a/radio/util/build-firmware.py
+++ b/radio/util/build-firmware.py
@@ -149,6 +149,11 @@ def main():
cmake_options["PCBREV"] = "T16"
firmware_options = options_jumper_t16
maxsize = 2 * 1024 * 1024
+ elif board_name == "tx16s":
+ cmake_options["PCB"] = "X10"
+ cmake_options["PCBREV"] = "TX16S"
+ firmware_options = options_jumper_t16
+ maxsize = 2 * 1024 * 1024
else:
exit(INVALID_BOARD)
diff --git a/radio/util/tts_es.py b/radio/util/tts_es.py
index 3b436ecd6..01d28d3dd 100755
--- a/radio/util/tts_es.py
+++ b/radio/util/tts_es.py
@@ -70,6 +70,7 @@ for s, f in [("me tienes abandonada", "inactiv"),
("A1 crítica", "a1_red"),
("Alarma A2", "a2_org"),
("A2 crítica", "a2_red"),
+ ("Bienvenido a open t equis", "hello"),
("recepcion de señal baja", "rssi_org"),
("recepción de señal crítica", "rssi_red"),
("Problemas con la antena del transmisor", "swr_red"),
@@ -77,7 +78,7 @@ for s, f in [("me tienes abandonada", "inactiv"),
("Telemetría disponible", "telemok"),
("servo overload", "servoko"),
("power overload", "rxko"),
- ("receiver still connected", "modelpwr"),
+ ("El receptor esta conectado", "modelpwr"),
]:
systemSounds.append((s, filename(f)))
for i, s in enumerate(["cronómetro", "cronómetro", "transmisión", "recepción", "A1", "A2", "altitud", "motor",
diff --git a/tools/build-companion-nightly.sh b/tools/build-companion-nightly.sh
index bd5eb97ad..683e0e4d6 100755
--- a/tools/build-companion-nightly.sh
+++ b/tools/build-companion-nightly.sh
@@ -98,6 +98,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=T16 -DINTERNAL_MODULE_MULTI=YES ${SRC
make -j${JOBS} libsimulator
rm CMakeCache.txt
+cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=TX16S ${SRCDIR}
+make -j${JOBS} libsimulator
+rm CMakeCache.txt
+
cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=EXPRESS ${SRCDIR}
make -j${JOBS} libsimulator
rm CMakeCache.txt
diff --git a/tools/build-companion-release.sh b/tools/build-companion-release.sh
index 0529e9154..34757a3e8 100755
--- a/tools/build-companion-release.sh
+++ b/tools/build-companion-release.sh
@@ -98,6 +98,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=T16 -DINTERNAL_MODULE_MULTI=YES ${SRC
make -j${JOBS} libsimulator
rm CMakeCache.txt
+cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=TX16S ${SRCDIR}
+make -j${JOBS} libsimulator
+rm CMakeCache.txt
+
cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=EXPRESS ${SRCDIR}
make -j${JOBS} libsimulator
rm CMakeCache.txt
diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh
index 9e470343c..a15b698e7 100755
--- a/tools/commit-tests.sh
+++ b/tools/commit-tests.sh
@@ -184,6 +184,24 @@ if [[ " X10 COLORLCD ALL " =~ \ ${FLAVOR}\ ]] ; then
make -j"${CORES}" tests-radio
fi
+if [[ " T16 COLORLCD ALL " =~ \ ${FLAVOR}\ ]] ; then
+ # OpenTX on T16 boards
+ rm -rf ./*
+ cmake "${COMMON_OPTIONS}" -DPCB=X10 -DPCBREV=T16 -DHELI=YES -DLUA=YES -DGVARS=YES "${SRCDIR}"
+ make -j"${CORES}" ${FIRMARE_TARGET}
+ make -j"${CORES}" libsimulator
+ make -j"${CORES}" tests-radio
+fi
+
+if [[ " TX16S COLORLCD ALL " =~ \ ${FLAVOR}\ ]] ; then
+ # OpenTX on TX16S boards
+ rm -rf ./*
+ cmake "${COMMON_OPTIONS}" -DPCB=X10 -DPCBREV=TX16S -DHELI=YES -DLUA=YES -DGVARS=YES "${SRCDIR}"
+ make -j"${CORES}" ${FIRMARE_TARGET}
+ make -j"${CORES}" libsimulator
+ make -j"${CORES}" tests-radio
+fi
+
if [[ " X12S COLORLCD ALL " =~ \ ${FLAVOR}\ ]] ; then
# OpenTX on X12S
rm -rf ./*