diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt
index f33f430ad..3cf15d85f 100644
--- a/companion/src/CMakeLists.txt
+++ b/companion/src/CMakeLists.txt
@@ -351,6 +351,8 @@ elseif(PCB STREQUAL X10 AND PCBREV STREQUAL T16)
set(FLAVOUR t16)
elseif(PCB STREQUAL X10 AND PCBREV STREQUAL TX16S)
set(FLAVOUR tx16s)
+elseif(PCB STREQUAL X10 AND PCBREV STREQUAL T18)
+ set(FLAVOUR t18)
else()
string(TOLOWER ${PCB} FLAVOUR)
endif()
diff --git a/companion/src/companion.qrc b/companion/src/companion.qrc
index ce172fbb7..cddc2fa3e 100644
--- a/companion/src/companion.qrc
+++ b/companion/src/companion.qrc
@@ -190,6 +190,16 @@
images/simulator/JumperT16/left_tele.png
images/simulator/JumperT16/right_ent.png
images/simulator/JumperT16/right_rtn.png
+ images/simulator/JumperT18/left.png
+ images/simulator/JumperT18/right.png
+ images/simulator/JumperT18/top.png
+ images/simulator/JumperT18/bottom.png
+ images/simulator/JumperT18/left_mdl.png
+ images/simulator/JumperT18/left_page.png
+ images/simulator/JumperT18/left_sys.png
+ images/simulator/JumperT18/left_tele.png
+ images/simulator/JumperT18/right_ent.png
+ images/simulator/JumperT18/right_rtn.png
images/simulator/TX16S/left.png
images/simulator/TX16S/right.png
images/simulator/TX16S/top.png
diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp
index a189e16c8..a39fe3369 100644
--- a/companion/src/firmwares/boards.cpp
+++ b/companion/src/firmwares/boards.cpp
@@ -81,6 +81,8 @@ uint32_t Boards::getFourCC(Type board)
return 0x3D78746F;
case BOARD_JUMPER_T16:
return 0x3F78746F;
+ case BOARD_JUMPER_T18:
+ return 0x4078746F;
case BOARD_RADIOMASTER_TX16S:
return 0x3878746F;
case BOARD_UNKNOWN:
@@ -116,6 +118,7 @@ int Boards::getEEpromSize(Board::Type board)
case BOARD_X10:
case BOARD_X10_EXPRESS:
case BOARD_JUMPER_T16:
+ case BOARD_JUMPER_T18:
case BOARD_RADIOMASTER_TX16S:
return 0;
}
@@ -147,6 +150,7 @@ int Boards::getFlashSize(Type board)
case BOARD_X10:
case BOARD_X10_EXPRESS:
case BOARD_JUMPER_T16:
+ case BOARD_JUMPER_T18:
case BOARD_RADIOMASTER_TX16S:
return FSIZE_HORUS;
case BOARD_UNKNOWN:
@@ -507,6 +511,8 @@ QString Boards::getBoardName(Board::Type board)
return "Horus X10/X10S Express";
case BOARD_JUMPER_T16:
return "Jumper T16";
+ case BOARD_JUMPER_T18:
+ return "Jumper T18";
case BOARD_RADIOMASTER_TX16S:
return "Radiomaster TX16S";
default:
diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h
index 937703eda..ed5ab9e25 100644
--- a/companion/src/firmwares/boards.h
+++ b/companion/src/firmwares/boards.h
@@ -51,9 +51,10 @@ namespace Board {
BOARD_JUMPER_T12,
BOARD_JUMPER_T16,
BOARD_RADIOMASTER_TX16S,
+ BOARD_JUMPER_T18,
};
- constexpr int BOARD_TYPE_MAX = BOARD_RADIOMASTER_TX16S ;
+ constexpr int BOARD_TYPE_MAX = BOARD_JUMPER_T18;
enum PotType
{
@@ -207,6 +208,11 @@ inline bool IS_JUMPER_T16(Board::Type board)
return board == Board::BOARD_JUMPER_T16;
}
+inline bool IS_JUMPER_T18(Board::Type board)
+{
+ return board == Board::BOARD_JUMPER_T18;
+}
+
inline bool IS_RADIOMASTER_TX16S(Board::Type board)
{
return board == Board::BOARD_RADIOMASTER_TX16S;
@@ -214,7 +220,7 @@ inline bool IS_RADIOMASTER_TX16S(Board::Type board)
inline bool IS_FAMILY_T16(Board::Type board)
{
- return board == Board::BOARD_JUMPER_T16 || board == Board::BOARD_RADIOMASTER_TX16S;
+ return board == Board::BOARD_JUMPER_T16 || board == Board::BOARD_RADIOMASTER_TX16S || board == Board::BOARD_JUMPER_T18;
}
inline bool IS_TARANIS_XLITE(Board::Type board)
diff --git a/companion/src/firmwares/generalsettings.h b/companion/src/firmwares/generalsettings.h
index a111cac1e..cdb72d9c8 100644
--- a/companion/src/firmwares/generalsettings.h
+++ b/companion/src/firmwares/generalsettings.h
@@ -142,6 +142,7 @@ class GeneralSettings {
unsigned int countryCode;
bool jitterFilter;
bool rtcCheckDisable;
+ bool keysBacklight;
unsigned int imperial;
char ttsLanguage[2+1];
int beepVolume;
diff --git a/companion/src/firmwares/multiprotocols.cpp b/companion/src/firmwares/multiprotocols.cpp
index 737bd36ed..f6ab2ac12 100644
--- a/companion/src/firmwares/multiprotocols.cpp
+++ b/companion/src/firmwares/multiprotocols.cpp
@@ -26,8 +26,8 @@
#define STR_MULTI_SUBTYPE QT_TRANSLATE_NOOP("Multiprotocols", "Subtype")
#define STR_MULTI_VIDFREQ QT_TRANSLATE_NOOP("Multiprotocols", "Video TX frequency")
#define STR_MULTI_RFTUNE QT_TRANSLATE_NOOP("Multiprotocols", "CC2500 frequency fine tune")
+#define STR_MULTI_RFPOWER QT_TRANSLATE_NOOP("Multiprotocols", "RF power")
#define STR_MULTI_TELEMETRY QT_TRANSLATE_NOOP("Multiprotocols", "Telemetry")
-#define STR_MULTI_RFPOWER QT_TRANSLATE_NOOP("Multiprotocols", "Radio output power")
#define STR_MULTI_SERVOFREQ QT_TRANSLATE_NOOP("Multiprotocols", "Servo output frequency")
#define STR_MULTI_OPTION QT_TRANSLATE_NOOP("Multiprotocols", "Option value")
#define STR_MULTI_FIXEDID QT_TRANSLATE_NOOP("Multiprotocols", "Fixed ID value")
diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp
index 8b0e8643d..b7e4d8644 100644
--- a/companion/src/firmwares/opentx/opentxeeprom.cpp
+++ b/companion/src/firmwares/opentx/opentxeeprom.cpp
@@ -2607,7 +2607,13 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
else
internalField.Append(new SpareBitsField<2>(this));
internalField.Append(new BoolField<1>(this, generalData.rtcCheckDisable));
- internalField.Append(new SpareBitsField<2>(this));
+ if (IS_JUMPER_T18(board)) {
+ internalField.Append(new BoolField<1>(this, generalData.keysBacklight));
+ internalField.Append(new SpareBitsField<1>(this));
+ }
+ else {
+ internalField.Append(new SpareBitsField<2>(this));
+ }
for (int i=0; i<4; i++) {
internalField.Append(new SignedField<16>(this, generalData.trainer.calib[i]));
diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp
index f329d98bb..ea13bdb18 100644
--- a/companion/src/firmwares/opentx/opentxinterface.cpp
+++ b/companion/src/firmwares/opentx/opentxinterface.cpp
@@ -62,6 +62,8 @@ const char * OpenTxEepromInterface::getName()
return "OpenTX for Jumper T12";
case BOARD_JUMPER_T16:
return "OpenTX for Jumper T16";
+ case BOARD_JUMPER_T18:
+ return "OpenTX for Jumper T18";
case BOARD_RADIOMASTER_TX16S:
return "OpenTX for Radiomaster TX16S";
case BOARD_TARANIS_X9D:
@@ -738,7 +740,7 @@ bool OpenTxFirmware::isAvailable(PulsesProtocol proto, int port)
case PULSES_ACCST_ISRM_D16:
return IS_ACCESS_RADIO(board, id);
case PULSES_MULTIMODULE:
- return id.contains("internalmulti") || IS_RADIOMASTER_TX16S(board);
+ return id.contains("internalmulti") || IS_RADIOMASTER_TX16S(board) || IS_JUMPER_T18(board);
default:
return false;
}
@@ -1276,6 +1278,13 @@ void registerOpenTxFirmwares()
firmware->addOptionsGroup({opt_bt, opt_internal_gps});
registerOpenTxFirmware(firmware);
+ /* Jumper T18 board */
+ firmware = new OpenTxFirmware("opentx-t18", Firmware::tr("Jumper T18"), BOARD_JUMPER_T18);
+ addOpenTxFrskyOptions(firmware);
+ firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module"));
+ registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, FLEX);
+
/* 9XR-Pro */
firmware = new OpenTxFirmware("opentx-9xrpro", Firmware::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO);
addOpenTxArm9xOptions(firmware, false);
diff --git a/companion/src/generaledit/generalsetup.cpp b/companion/src/generaledit/generalsetup.cpp
index 773e66734..16ef5b271 100644
--- a/companion/src/generaledit/generalsetup.cpp
+++ b/companion/src/generaledit/generalsetup.cpp
@@ -197,6 +197,12 @@ ui(new Ui::GeneralSetup)
ui->label_OFFBright->hide();
}
+ if (!IS_JUMPER_T18(firmware->getBoard())) {
+ ui->keysBl_ChkB->hide();
+ ui->keysBl_ChkB->setDisabled(true);
+ ui->label_KeysBl->hide();
+ }
+
if (!firmware->getCapability(SoundMod)) {
ui->soundModeCB->setDisabled(true);
ui->label_soundMode->hide();
diff --git a/companion/src/generaledit/generalsetup.ui b/companion/src/generaledit/generalsetup.ui
index 98f9e76dd..7353b9c4b 100644
--- a/companion/src/generaledit/generalsetup.ui
+++ b/companion/src/generaledit/generalsetup.ui
@@ -554,348 +554,13 @@
-
-
-
-
-
-
- 0
- 0
-
-
-
- 23
-
-
-
- -
-
-
- RotEnc Navigation
-
-
-
- -
-
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Stick reverse
-
-
-
- -
-
-
-
-
-
-
-
-
- This is the switch selectrion for turning on the backlight (if installed).
-
-
-
-
- -1
-
-
-
- -
-
-
- Backlight flash on alarm
-
-
-
- -
-
-
- Backlight Auto OFF after
-
-
-
- -
-
-
- Backlight Switch
-
-
-
- -
-
-
- ms
-
-
- 200
-
-
- 1000
-
-
- 10
-
-
- 500
-
-
-
-
-
-
- Voice Language
-
-
-
- -
-
-
- Hz
-
-
- 300
-
-
- 1100
-
-
- 10
-
-
- 700
-
-
-
- -
-
-
-
-
-
- 1
-
-
-
- -
-
-
- 2
-
-
-
- -
-
-
- 3
-
-
-
- -
-
-
- 4
-
-
-
-
-
- -
-
-
- Vario repeat at zero
-
-
-
- -
-
-
- Vario pitch at zero
-
-
-
- -
-
-
- FAI Mode
-
-
-
- -
-
-
- Backlight OFF Brightness
-
-
-
- -
-
-
- 100
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
-
-
-
-
-
- If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds.
-
-
- sec
-
-
- 600
-
-
- 5
-
-
-
- -
-
-
-
-
-
-
-
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">LCD Screen Contrast</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Values can be 20-45</span></p></body></html>
-
-
- 1
-
-
- 20
-
-
- 1
-
-
-
- -
-
-
- Hz
-
-
- 1300
-
-
- 2900
-
-
- 10
-
-
- 1700
-
-
-
- -
Timeshift from UTC
- -
-
-
- 5
-
-
- 100
-
-
-
- -
-
-
-
-
- America
-
-
- -
-
- Japan
-
-
- -
-
- Europe
-
-
-
-
- -
-
-
- If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio.
-
-
-
-
-
-
- -
-
-
-
-
- Beeper
-
-
- -
-
- Speaker
-
-
- -
-
- BeeperVoice
-
-
- -
-
- SpeakerVoice
-
-
-
-
- -
-
-
- Backlight Brightness
-
-
-
-
-
@@ -992,24 +657,288 @@ p, li { white-space: pre-wrap; }
- -
-
+
-
+
+
+ -
+
- Backlight color
+ Sound Mode
- -
-
+
-
+
- Vario pitch at max
+
- -
-
+
-
+
+
-
+
+
+ 1
+
+
+
+ -
+
+
+ 2
+
+
+
+ -
+
+
+ 3
+
+
+
+ -
+
+
+ 4
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ This is the switch selectrion for turning on the backlight (if installed).
+
+
+
+
+ -1
+
+
+
+ -
+
+
+ Hz
+
+
+ 300
+
+
+ 1100
+
+
+ 10
+
+
+ 700
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+ -
+
+
+ ms
+
+
+ 200
+
+
+ 1000
+
+
+ 10
+
+
+ 500
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
- Speaker Pitch (spkr only)
+ Stick reverse
+
+
+
+ -
+
+
+ nnnnnnNN
+
+
+ 8
+
+
+
+ -
+
+
-
+
+ Beeper
+
+
+ -
+
+ Speaker
+
+
+ -
+
+ BeeperVoice
+
+
+ -
+
+ SpeakerVoice
+
+
+
+
+ -
+
+
+ Backlight OFF Brightness
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ 23
+
+
+
+ -
+
+
+ RotEnc Navigation
+
+
+
+ -
+
+
+ 5
+
+
+ 100
+
+
+
+ -
+
+
+ Backlight Switch
+
+
+
+ -
+
+
-
+
+ America
+
+
+ -
+
+ Japan
+
+
+ -
+
+ Europe
+
+
+
+
+ -
+
+
+ Vario pitch at zero
+
+
+
+ -
+
+
+ If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio.
+
+
+
+
+
+
+ -
+
+
+ Backlight Auto OFF after
+
+
+
+ -
+
+
+ Hz
+
+
+ 1300
+
+
+ 2900
+
+
+ 10
+
+
+ 1700
+
+
+
+ -
+
+
+ 100
+
+
+
+ -
+
+
+ FAI Mode
@@ -1044,31 +973,56 @@ p, li { white-space: pre-wrap; }
- -
+
-
+
+
+ Backlight color
+
+
+
+ -
+
+
+ Owner Registration ID
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+ If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds.
+
+
+ sec
+
+
+ 600
+
+
+ 5
+
+
+
+ -
Country Code
- -
-
-
- -
-
-
- Sound Mode
-
-
-
- -
-
-
- Speaker Volume
-
-
-
- -
+
-
-
@@ -1098,36 +1052,96 @@ p, li { white-space: pre-wrap; }
- -
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
+
-
+
- Owner Registration ID
+ Backlight Brightness
- -
-
-
- nnnnnnNN
+
-
+
+
+ Vario repeat at zero
-
- 8
+
+
+ -
+
+
+ Voice Language
+
+
+
+ -
+
+
+ Backlight flash on alarm
+
+
+
+ -
+
+
+ Vario pitch at max
+
+
+
+ -
+
+
+ -
+
+
+ Speaker Pitch (spkr only)
+
+
+
+ -
+
+
+ Speaker Volume
+
+
+
+ -
+
+
+
+
+
+
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">LCD Screen Contrast</span></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Values can be 20-45</span></p></body></html>
+
+
+ 1
+
+
+ 20
+
+
+ 1
+
+
+
+ -
+
+
+ Keys Backlight
+
+
+
+ -
+
+
+
diff --git a/companion/src/images/simulator/JumperT18/bottom.png b/companion/src/images/simulator/JumperT18/bottom.png
new file mode 100644
index 000000000..8f0d29f7e
Binary files /dev/null and b/companion/src/images/simulator/JumperT18/bottom.png differ
diff --git a/companion/src/images/simulator/JumperT18/left.png b/companion/src/images/simulator/JumperT18/left.png
new file mode 100755
index 000000000..4683595ec
Binary files /dev/null and b/companion/src/images/simulator/JumperT18/left.png differ
diff --git a/companion/src/images/simulator/JumperT18/left_mdl.png b/companion/src/images/simulator/JumperT18/left_mdl.png
new file mode 100755
index 000000000..8260dad5d
Binary files /dev/null and b/companion/src/images/simulator/JumperT18/left_mdl.png differ
diff --git a/companion/src/images/simulator/JumperT18/left_page.png b/companion/src/images/simulator/JumperT18/left_page.png
new file mode 100755
index 000000000..5fbeafbde
Binary files /dev/null and b/companion/src/images/simulator/JumperT18/left_page.png differ
diff --git a/companion/src/images/simulator/JumperT18/left_sys.png b/companion/src/images/simulator/JumperT18/left_sys.png
new file mode 100755
index 000000000..777f996e4
Binary files /dev/null and b/companion/src/images/simulator/JumperT18/left_sys.png differ
diff --git a/companion/src/images/simulator/JumperT18/left_tele.png b/companion/src/images/simulator/JumperT18/left_tele.png
new file mode 100755
index 000000000..3867d3eed
Binary files /dev/null and b/companion/src/images/simulator/JumperT18/left_tele.png differ
diff --git a/companion/src/images/simulator/JumperT18/right.png b/companion/src/images/simulator/JumperT18/right.png
new file mode 100644
index 000000000..fced173dd
Binary files /dev/null and b/companion/src/images/simulator/JumperT18/right.png differ
diff --git a/companion/src/images/simulator/JumperT18/right_ent.png b/companion/src/images/simulator/JumperT18/right_ent.png
new file mode 100644
index 000000000..eaf7c6acc
Binary files /dev/null and b/companion/src/images/simulator/JumperT18/right_ent.png differ
diff --git a/companion/src/images/simulator/JumperT18/right_rtn.png b/companion/src/images/simulator/JumperT18/right_rtn.png
new file mode 100644
index 000000000..bf3d51d7d
Binary files /dev/null and b/companion/src/images/simulator/JumperT18/right_rtn.png differ
diff --git a/companion/src/images/simulator/JumperT18/top.png b/companion/src/images/simulator/JumperT18/top.png
new file mode 100644
index 000000000..3bc1784ee
Binary files /dev/null and b/companion/src/images/simulator/JumperT18/top.png differ
diff --git a/companion/src/simulation/CMakeLists.txt b/companion/src/simulation/CMakeLists.txt
index 8acadd92a..a03090888 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
+ simulateduiwidgetJumperT18.cpp
simulateduiwidgetTX16S.cpp
simulatorinterface.cpp
simulatormainwindow.cpp
@@ -39,6 +40,7 @@ set(simulation_UIS
simulateduiwidgetX12.ui
simulateduiwidgetJumperT12.ui
simulateduiwidgetJumperT16.ui
+ simulateduiwidgetJumperT18.ui
simulateduiwidgetTX16S.ui
simulatormainwindow.ui
simulatorstartupdialog.ui
diff --git a/companion/src/simulation/simulateduiwidget.h b/companion/src/simulation/simulateduiwidget.h
index 75dd3ebfd..8419840c5 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 SimulatedUIWidgetJumperT18;
class SimulatedUIWidgetTX16S;
}
@@ -252,6 +253,18 @@ class SimulatedUIWidgetJumperT16: public SimulatedUIWidget
Ui::SimulatedUIWidgetJumperT16 * ui;
};
+class SimulatedUIWidgetJumperT18: public SimulatedUIWidget
+{
+ Q_OBJECT
+
+ public:
+ explicit SimulatedUIWidgetJumperT18(SimulatorInterface * simulator, QWidget * parent = nullptr);
+ virtual ~SimulatedUIWidgetJumperT18();
+
+ private:
+ Ui::SimulatedUIWidgetJumperT18 * ui;
+};
+
class SimulatedUIWidgetTX16S: public SimulatedUIWidget
{
Q_OBJECT
diff --git a/companion/src/simulation/simulateduiwidgetJumperT18.cpp b/companion/src/simulation/simulateduiwidgetJumperT18.cpp
new file mode 100644
index 000000000..1a66138ca
--- /dev/null
+++ b/companion/src/simulation/simulateduiwidgetJumperT18.cpp
@@ -0,0 +1,69 @@
+/*
+ * 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_simulateduiwidgetJumperT18.h"
+
+SimulatedUIWidgetJumperT18::SimulatedUIWidgetJumperT18(SimulatorInterface *simulator, QWidget * parent):
+ SimulatedUIWidget(simulator, parent),
+ ui(new Ui::SimulatedUIWidgetJumperT18)
+{
+ 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->leftbuttons->addArea(QRect(60, 90, 80, 35), "JumperT18/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(25, 5, 100, 40), "JumperT18/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(60, 180, 80, 35), "JumperT18/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(20, 5, 100, 40), "JumperT18/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(60, 140, 80, 35), "JumperT18/left.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(25, 90, 70, 130), "JumperT18/right_ent.png", m_mouseMidClickAction));
+
+ addRadioWidget(ui->leftbuttons->addArea(QRect(10, 245, 30, 30), "JumperT18/left_scrnsht.png", m_screenshotAction));
+
+ m_backlightColors << QColor(47, 123, 227);
+
+ setLcd(ui->lcd);
+}
+
+SimulatedUIWidgetJumperT18::~SimulatedUIWidgetJumperT18()
+{
+ delete ui;
+}
diff --git a/companion/src/simulation/simulateduiwidgetJumperT18.ui b/companion/src/simulation/simulateduiwidgetJumperT18.ui
new file mode 100644
index 000000000..1c14df404
--- /dev/null
+++ b/companion/src/simulation/simulateduiwidgetJumperT18.ui
@@ -0,0 +1,197 @@
+
+
+ SimulatedUIWidgetJumperT18
+
+
+
+ 0
+ 0
+ 825
+ 292
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 825
+ 292
+
+
+
+
+ 825
+ 292
+
+
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 131
+ 289
+
+
+
+
+ 131
+ 289
+
+
+
+ background:url(:/images/simulator/JumperT18/right.png)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 480
+ 272
+
+
+
+
+ 480
+ 272
+
+
+
+
+ 5
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 131
+ 289
+
+
+
+
+ 131
+ 289
+
+
+
+ true
+
+
+ background:url(:/images/simulator/JumperT18/left.png);
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 480
+ 10
+
+
+
+
+ 480
+ 10
+
+
+
+
+ 5
+
+
+
+ background:url(:/images/simulator/JumperT18/top.png)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 480
+ 10
+
+
+
+
+ 480
+ 10
+
+
+
+
+ 5
+ false
+
+
+
+ background:url(:/images/simulator/JumperT18/bottom.png)
+
+
+
+
+
+
+
+ LcdWidget
+ QWidget
+
+ 1
+
+
+ ButtonsWidget
+ QWidget
+
+ 1
+
+
+
+
+
diff --git a/companion/src/simulation/simulatorstartupdialog.cpp b/companion/src/simulation/simulatorstartupdialog.cpp
index 32d343321..b7faf0261 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|16)", Qt::CaseInsensitive));
+ return name.contains(QRegExp("(x12|x10|horus|16|18)", Qt::CaseInsensitive));
}
bool SimulatorStartupDialog::usesCategorizedStorage()
diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp
index d20e34cc7..f70813442 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_JUMPER_T18:
+ radioUiWidget = new SimulatedUIWidgetJumperT18(simulator, this);
+ break;
case Board::BOARD_RADIOMASTER_TX16S:
radioUiWidget = new SimulatedUIWidgetTX16S(simulator, this);
break;
diff --git a/radio/sdcard/horus/THEMES/Darkblue/t18.bmp b/radio/sdcard/horus/THEMES/Darkblue/t18.bmp
new file mode 100755
index 000000000..c1220ca1b
Binary files /dev/null and b/radio/sdcard/horus/THEMES/Darkblue/t18.bmp differ
diff --git a/radio/sdcard/horus/THEMES/Default/t18.bmp b/radio/sdcard/horus/THEMES/Default/t18.bmp
new file mode 100755
index 000000000..c1220ca1b
Binary files /dev/null and b/radio/sdcard/horus/THEMES/Default/t18.bmp differ
diff --git a/radio/src/bitmaps/480x272/CMakeLists.txt b/radio/src/bitmaps/480x272/CMakeLists.txt
index 9337292af..4ae20e970 100644
--- a/radio/src/bitmaps/480x272/CMakeLists.txt
+++ b/radio/src/bitmaps/480x272/CMakeLists.txt
@@ -1,6 +1,9 @@
if(PCB STREQUAL X12S)
set(BITMAP_TARGET_PREFIX x12s)
set(BITMAP_FMT_SUFFIX "")
+elseif(PCB STREQUAL X10 AND PCBREV STREQUAL T18)
+ set(BITMAP_TARGET_PREFIX x10)
+ set(BITMAP_FMT_SUFFIX "")
else()
set(BITMAP_TARGET_PREFIX x10)
set(BITMAP_FMT_SUFFIX "-R")
diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h
index f164b1ce2..876ae9875 100644
--- a/radio/src/datastructs.h
+++ b/radio/src/datastructs.h
@@ -744,7 +744,12 @@ PACK(struct RadioData {
uint8_t backlightMode:3;
int8_t antennaMode:2;
uint8_t disableRtcWarning:1;
+#if defined(KEYS_BACKLIGHT_GPIO)
+ uint8_t keysBacklight:1;
+ int8_t spare1:1;
+#else
int8_t spare1:2;
+#endif
NOBACKUP(TrainerData trainer);
NOBACKUP(uint8_t view); // index of view in main screen
NOBACKUP(BUZZER_FIELD); /* 2bits */
diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp
index 658a90a4e..f6b1773fa 100644
--- a/radio/src/gui/128x64/model_setup.cpp
+++ b/radio/src/gui/128x64/model_setup.cpp
@@ -1544,7 +1544,10 @@ void menuModelSetup(event_t event)
if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A)
optionValue = 50 + 5 * optionValue;
- lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr);
+ if (multi_proto == MODULE_SUBTYPE_MULTI_FRSKY_R9)
+ lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_POWER, optionValue, LEFT | attr);
+ else
+ lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr);
if (attr) {
int8_t min, max;
getMultiOptionValues(multi_proto, min, max);
diff --git a/radio/src/gui/128x64/radio_diagkeys.cpp b/radio/src/gui/128x64/radio_diagkeys.cpp
index a5840754a..a3d058c3e 100644
--- a/radio/src/gui/128x64/radio_diagkeys.cpp
+++ b/radio/src/gui/128x64/radio_diagkeys.cpp
@@ -76,6 +76,6 @@ void menuRadioDiagKeys(event_t event)
#if defined(ROTARY_ENCODER_NAVIGATION)
coord_t y = MENU_HEADER_HEIGHT + 1 + FH*KEY_COUNT;
lcdDrawText(0, y, STR_ROTARY_ENCODER);
- lcdDrawNumber(5*FW+FWNUM+2, y, rotencValue, RIGHT);
+ lcdDrawNumber(5*FW+FWNUM+2, y, rotencValue / ROTARY_ENCODER_GRANULARITY, RIGHT);
#endif
}
diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp
index e6d8758e2..829a7eee9 100644
--- a/radio/src/gui/212x64/model_setup.cpp
+++ b/radio/src/gui/212x64/model_setup.cpp
@@ -1309,7 +1309,10 @@ void menuModelSetup(event_t event)
if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A)
optionValue = 50 + 5 * optionValue;
- lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr);
+ if (multi_proto == MODULE_SUBTYPE_MULTI_FRSKY_R9)
+ lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_POWER, optionValue, LEFT | attr);
+ else
+ lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr);
if (attr) {
int8_t min, max;
getMultiOptionValues(multi_proto, min, max);
diff --git a/radio/src/gui/212x64/radio_diagkeys.cpp b/radio/src/gui/212x64/radio_diagkeys.cpp
index 56b8d102c..acb883513 100644
--- a/radio/src/gui/212x64/radio_diagkeys.cpp
+++ b/radio/src/gui/212x64/radio_diagkeys.cpp
@@ -59,6 +59,6 @@ void menuRadioDiagKeys(event_t event)
#if defined(ROTARY_ENCODER_NAVIGATION)
coord_t y = MENU_HEADER_HEIGHT + 1 + FH*KEY_COUNT;
lcdDrawText(0, y, STR_ROTARY_ENCODER);
- lcdDrawNumber(5*FW+FWNUM+2, y, rotencValue, RIGHT);
+ lcdDrawNumber(5*FW+FWNUM+2, y, rotencValue / ROTARY_ENCODER_GRANULARITY, RIGHT);
#endif
}
diff --git a/radio/src/gui/480x272/bitmapbuffer.h b/radio/src/gui/480x272/bitmapbuffer.h
index b9cdc0381..9cca2916a 100644
--- a/radio/src/gui/480x272/bitmapbuffer.h
+++ b/radio/src/gui/480x272/bitmapbuffer.h
@@ -25,7 +25,7 @@
#include "colors.h"
#include "rle.h"
-#if defined(PCBX10) && !defined(SIMU)
+#if defined(LCD_VERTICAL_INVERT)
#define MOVE_PIXEL_RIGHT(p, count) p -= count
#else
#define MOVE_PIXEL_RIGHT(p, count) p += count
@@ -100,7 +100,7 @@ class BitmapBufferBase
inline const display_t * getPixelPtr(coord_t x, coord_t y) const
{
-#if defined(PCBX10) && !defined(SIMU)
+#if defined(LCD_VERTICAL_INVERT)
x = width - x - 1;
y = height - y - 1;
#endif
@@ -201,7 +201,7 @@ class BitmapBuffer: public BitmapBufferBase
inline const display_t * getPixelPtr(coord_t x, coord_t y) const
{
-#if defined(PCBX10) && !defined(SIMU)
+#if defined(LCD_VERTICAL_INVERT)
x = width - x - 1;
y = height - y - 1;
#endif
@@ -210,7 +210,7 @@ class BitmapBuffer: public BitmapBufferBase
inline display_t * getPixelPtr(coord_t x, coord_t y)
{
-#if defined(PCBX10) && !defined(SIMU)
+#if defined(LCD_VERTICAL_INVERT)
x = width - x - 1;
y = height - y - 1;
#endif
diff --git a/radio/src/gui/480x272/lcd.h b/radio/src/gui/480x272/lcd.h
index dfb42e829..d6c8dfa11 100644
--- a/radio/src/gui/480x272/lcd.h
+++ b/radio/src/gui/480x272/lcd.h
@@ -156,7 +156,7 @@ void putsChnLetter(coord_t x, coord_t y, uint8_t idx, LcdFlags attr);
#define DOTTED 0x55
#define STASHED 0x33
-#if defined(PCBX10) && !defined(SIMU)
+#if defined(LCD_VERTICAL_INVERT)
#define PIXEL_PTR(x, y) &displayBuf[(LCD_H*LCD_W-1) - (y)*LCD_W - (x)]
#else
#define PIXEL_PTR(x, y) &displayBuf[(y)*LCD_W + (x)]
diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp
index ebda41874..4fc0a1e75 100644
--- a/radio/src/gui/480x272/model_setup.cpp
+++ b/radio/src/gui/480x272/model_setup.cpp
@@ -1686,7 +1686,10 @@ bool menuModelSetup(event_t event)
if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A)
optionValue = 50 + 5 * optionValue;
- lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr);
+ if (multi_proto == MODULE_SUBTYPE_MULTI_FRSKY_R9)
+ lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_POWER, optionValue, LEFT | attr);
+ else
+ lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr);
if (attr) {
int8_t min, max;
getMultiOptionValues(multi_proto, min, max);
diff --git a/radio/src/gui/480x272/radio_diagkeys.cpp b/radio/src/gui/480x272/radio_diagkeys.cpp
index 9e26ebe86..31a3941a4 100644
--- a/radio/src/gui/480x272/radio_diagkeys.cpp
+++ b/radio/src/gui/480x272/radio_diagkeys.cpp
@@ -73,7 +73,7 @@ bool menuRadioDiagKeys(event_t event)
#if defined(ROTARY_ENCODER_NAVIGATION)
coord_t y = MENU_HEADER_HEIGHT + FH * (8 - KEY_START);
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_ROTARY_ENCODER);
- lcdDrawNumber(70, y, rotencValue, 0);
+ lcdDrawNumber(70, y, rotencValue / ROTARY_ENCODER_GRANULARITY, 0);
#endif
return true;
diff --git a/radio/src/gui/480x272/radio_setup.cpp b/radio/src/gui/480x272/radio_setup.cpp
index 0eb630928..f3cdb9a61 100644
--- a/radio/src/gui/480x272/radio_setup.cpp
+++ b/radio/src/gui/480x272/radio_setup.cpp
@@ -65,6 +65,9 @@ enum menuRadioSetupItems {
ITEM_SETUP_BACKLIGHT_DELAY,
ITEM_SETUP_BRIGHTNESS,
ITEM_SETUP_DIM_LEVEL,
+#if defined(KEYS_BACKLIGHT_GPIO)
+ ITEM_SETUP_KEYS_BACKLIGHT,
+#endif
ITEM_SETUP_FLASH_BEEP,
CASE_PWR_BUTTON_PRESS(ITEM_SETUP_PWR_OFF_SPEED)
#if defined(PXX2)
@@ -110,6 +113,11 @@ bool menuRadioSetup(event_t event)
#else
#define FAI_CHOICE_ROW
#endif
+#if defined(KEYS_BACKLIGHT_GPIO)
+ #define BACKLIGHT_ROWS LABEL(BACKLIGHT), 0, 0, 0, 0, 0, 0,
+#else
+ #define BACKLIGHT_ROWS LABEL(BACKLIGHT), 0, 0, 0, 0, 0,
+#endif
MENU(STR_MENURADIOSETUP, RADIO_ICONS, menuTabGeneral, MENU_RADIO_SETUP, ITEM_SETUP_MAX, {
2|NAVIGATION_LINE_BY_LINE, 2|NAVIGATION_LINE_BY_LINE, 1|NAVIGATION_LINE_BY_LINE, // Date Time Bat range
@@ -117,7 +125,7 @@ bool menuRadioSetup(event_t event)
CASE_VARIO(LABEL(VARIO)) CASE_VARIO(0) CASE_VARIO(0) CASE_VARIO(0) CASE_VARIO(0)
CASE_HAPTIC(LABEL(HAPTIC)) CASE_HAPTIC(0) CASE_HAPTIC(0) CASE_HAPTIC(0)
LABEL(ALARMS), 0, 0, 0, 0,
- LABEL(BACKLIGHT), 0, 0, 0, 0, 0,
+ BACKLIGHT_ROWS
CASE_PWR_BUTTON_PRESS(0)
CASE_PXX2(0) // owner registration ID
CASE_GPS(LABEL(GPS))
@@ -373,7 +381,7 @@ bool menuRadioSetup(event_t event)
break;
case ITEM_SETUP_BACKLIGHT_MODE:
- lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODE);
+ lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH , y, STR_MODE);
g_eeGeneral.backlightMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_VBLMODE, g_eeGeneral.backlightMode, e_backlight_mode_off, e_backlight_mode_on, attr, event);
break;
@@ -388,7 +396,6 @@ bool menuRadioSetup(event_t event)
editName(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID, event, attr);
break;
#endif
-
case ITEM_SETUP_BACKLIGHT_DELAY:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BLDELAY);
lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.lightAutoOff*5, attr|LEFT, 0, NULL, "s");
@@ -405,6 +412,13 @@ bool menuRadioSetup(event_t event)
g_eeGeneral.blOffBright = editSlider(RADIO_SETUP_2ND_COLUMN, y, event, g_eeGeneral.blOffBright, BACKLIGHT_LEVEL_MIN, BACKLIGHT_LEVEL_MAX, attr);
break;
+#if defined(KEYS_BACKLIGHT_GPIO)
+ case ITEM_SETUP_KEYS_BACKLIGHT:
+ lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH , y, STR_KEYS_BACKLIGHT);
+ g_eeGeneral.keysBacklight = editCheckBox(g_eeGeneral.keysBacklight, RADIO_SETUP_2ND_COLUMN, y, attr, event ) ;
+ break;
+#endif
+
#if defined(PWR_BUTTON_PRESS)
case ITEM_SETUP_PWR_OFF_SPEED:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_PWR_OFF_DELAY);
diff --git a/radio/src/gui/480x272/themes/darkblue.cpp b/radio/src/gui/480x272/themes/darkblue.cpp
index 05a8b2e1f..ec4b51fb2 100644
--- a/radio/src/gui/480x272/themes/darkblue.cpp
+++ b/radio/src/gui/480x272/themes/darkblue.cpp
@@ -139,6 +139,8 @@ class DarkblueTheme: public Theme
delete calibHorus;
#if defined(RADIO_T16)
calibHorus = BitmapBuffer::load(getThemePath("t16.bmp"));
+#elif defined(RADIO_T18)
+ calibHorus = BitmapBuffer::load(getThemePath("t18.bmp"));
#elif defined(RADIO_TX16S)
calibHorus = BitmapBuffer::load(getThemePath("tx16s.bmp"));
#elif defined(PCBX10)
diff --git a/radio/src/gui/480x272/themes/default.cpp b/radio/src/gui/480x272/themes/default.cpp
index b90ccd1a2..740f30e39 100644
--- a/radio/src/gui/480x272/themes/default.cpp
+++ b/radio/src/gui/480x272/themes/default.cpp
@@ -176,6 +176,8 @@ class DefaultTheme: public Theme
delete calibHorus;
#if defined(RADIO_T16)
calibHorus = BitmapBuffer::load(getThemePath("t16.bmp"));
+#elif defined(RADIO_T18)
+ calibHorus = BitmapBuffer::load(getThemePath("t18.bmp"));
#elif defined(RADIO_TX16S)
calibHorus = BitmapBuffer::load(getThemePath("tx16s.bmp"));
#elif defined(PCBX10)
diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp
index 16929cc7e..59153faa7 100644
--- a/radio/src/gui/gui_common.cpp
+++ b/radio/src/gui/gui_common.cpp
@@ -921,7 +921,8 @@ const char* mm_options_strings::options[] = {
STR_MULTI_TELEMETRY,
STR_MULTI_SERVOFREQ,
STR_MULTI_MAX_THROW,
- STR_MULTI_RFCHAN
+ STR_MULTI_RFCHAN,
+ STR_MULTI_RFPOWER
};
const mm_protocol_definition multi_protocols[] = {
diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp
index 3186e8975..77bb1b894 100644
--- a/radio/src/opentx.cpp
+++ b/radio/src/opentx.cpp
@@ -2073,6 +2073,10 @@ int main()
inline uint32_t PWR_PRESS_SHUTDOWN_DELAY()
{
+ // Instant off when both power button are pressed
+ if (pwrForcePressed())
+ return 0;
+
return (2 - g_eeGeneral.pwrOffSpeed) * 100;
}
diff --git a/radio/src/opentx.h b/radio/src/opentx.h
index ba7aefbdf..d73027a6e 100644
--- a/radio/src/opentx.h
+++ b/radio/src/opentx.h
@@ -536,7 +536,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_FAMILY_T16)
+#elif defined(RADIO_FAMILY_T16) && !defined(RADIO_T18)
#define ROTARY_ENCODER_GRANULARITY (1)
#else
#define ROTARY_ENCODER_GRANULARITY (2)
diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h
index 5f2cca40f..e13eaf2fb 100644
--- a/radio/src/pulses/modules_helpers.h
+++ b/radio/src/pulses/modules_helpers.h
@@ -666,6 +666,10 @@ inline void getMultiOptionValues(int8_t multi_proto, int8_t & min, int8_t & max)
min = -1;
max = 84;
break;
+ case MODULE_SUBTYPE_MULTI_FRSKY_R9:
+ min = 0; // 10mW
+ max = 5; // 300mW
+ break;
default:
min = -128;
max = 127;
diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h
index 645e527d3..c54e185a1 100644
--- a/radio/src/sdcard.h
+++ b/radio/src/sdcard.h
@@ -128,6 +128,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_T18)
+ #define OTX_FOURCC 0x4078746F // otx for Jumper T18
#elif defined(RADIO_TX16S)
#define OTX_FOURCC 0x3878746F // otx for Radiomaster TX16S
#elif defined(PCBX10)
diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp
index 6360b9676..62eb5a7eb 100644
--- a/radio/src/targets/common/arm/stm32/adc_driver.cpp
+++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp
@@ -24,6 +24,8 @@
// 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_T18)
+ 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)
diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp
index 59027be27..cd337fb7f 100644
--- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp
+++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp
@@ -197,7 +197,8 @@ int main()
RCC_AHB1PeriphClockCmd(PWR_RCC_AHB1Periph | KEYS_RCC_AHB1Periph |
LCD_RCC_AHB1Periph | BACKLIGHT_RCC_AHB1Periph |
- AUX_SERIAL_RCC_AHB1Periph | AUX2_SERIAL_RCC_AHB1Periph | I2C_RCC_AHB1Periph |
+ AUX_SERIAL_RCC_AHB1Periph | AUX2_SERIAL_RCC_AHB1Periph |
+ I2C_RCC_AHB1Periph | KEYS_BACKLIGHT_RCC_AHB1Periph |
SD_RCC_AHB1Periph, ENABLE);
RCC_APB1PeriphClockCmd(ROTARY_ENCODER_RCC_APB1Periph | LCD_RCC_APB1Periph | BACKLIGHT_RCC_APB1Periph |
diff --git a/radio/src/targets/common/arm/stm32/pwr_driver.cpp b/radio/src/targets/common/arm/stm32/pwr_driver.cpp
index f488d19fa..220b5fdfd 100644
--- a/radio/src/targets/common/arm/stm32/pwr_driver.cpp
+++ b/radio/src/targets/common/arm/stm32/pwr_driver.cpp
@@ -51,6 +51,12 @@ void pwrInit()
GPIO_InitStructure.GPIO_Pin = PWR_SWITCH_GPIO_PIN;
GPIO_Init(PWR_SWITCH_GPIO, &GPIO_InitStructure);
+#if defined(PWR_EXTRA_SWITCH_GPIO)
+ // PWR Extra switch
+ GPIO_InitStructure.GPIO_Pin = PWR_EXTRA_SWITCH_GPIO_PIN;
+ GPIO_Init(PWR_EXTRA_SWITCH_GPIO, &GPIO_InitStructure);
+#endif
+
#if defined(PCBREV_HARDCODED)
hardwareOptions.pcbrev = PCBREV_HARDCODED;
#elif defined(PCBREV_GPIO_PIN)
@@ -101,9 +107,20 @@ void pwrOff()
GPIO_ResetBits(PWR_ON_GPIO, PWR_ON_GPIO_PIN);
}
+#if defined(PWR_EXTRA_SWITCH_GPIO)
+bool pwrForcePressed()
+{
+ return (GPIO_ReadInputDataBit(PWR_SWITCH_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET && GPIO_ReadInputDataBit(PWR_EXTRA_SWITCH_GPIO, PWR_EXTRA_SWITCH_GPIO_PIN) == Bit_RESET);
+}
+#endif
+
bool pwrPressed()
{
+#if defined(PWR_EXTRA_SWITCH_GPIO)
+ return (GPIO_ReadInputDataBit(PWR_SWITCH_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET || GPIO_ReadInputDataBit(PWR_EXTRA_SWITCH_GPIO, PWR_EXTRA_SWITCH_GPIO_PIN) == Bit_RESET);
+#else
return GPIO_ReadInputDataBit(PWR_SWITCH_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET;
+#endif
}
void pwrResetHandler()
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 debe8793d..00b3c76f8 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_FAMILY_T16)
+#if defined(RADIO_FAMILY_T16) && !defined(RADIO_T18)
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 4fa4238de..20348968f 100644
--- a/radio/src/targets/horus/CMakeLists.txt
+++ b/radio/src/targets/horus/CMakeLists.txt
@@ -71,6 +71,13 @@ if (PCB STREQUAL X10)
set(AUX2_SERIAL ON)
endif()
set(INTERNAL_GPS_BAUDRATE "9600" CACHE STRING "Baud rate for internal GPS")
+ elseif (PCBREV STREQUAL T18)
+ set(FLAVOUR t18)
+ set(LUA_EXPORT lua_export_t16)
+ add_definitions(-DRADIO_T18)
+ add_definitions(-DRADIO_FAMILY_T16)
+ option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON)
+ option(BLUETOOTH "Support for bluetooth module" OFF)
else()
set(FLAVOUR x10)
option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON)
diff --git a/radio/src/targets/horus/backlight_driver.cpp b/radio/src/targets/horus/backlight_driver.cpp
index e141cf5dd..13f73f1ee 100644
--- a/radio/src/targets/horus/backlight_driver.cpp
+++ b/radio/src/targets/horus/backlight_driver.cpp
@@ -32,6 +32,15 @@ void backlightInit()
GPIO_Init(BACKLIGHT_GPIO, &GPIO_InitStructure);
GPIO_PinAFConfig(BACKLIGHT_GPIO, BACKLIGHT_GPIO_PinSource, BACKLIGHT_GPIO_AF);
+#if defined(KEYS_BACKLIGHT_GPIO)
+ GPIO_InitStructure.GPIO_Pin = KEYS_BACKLIGHT_GPIO_PIN;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
+ GPIO_Init(KEYS_BACKLIGHT_GPIO, &GPIO_InitStructure);
+#endif
+
// TIMER init
#if defined(PCBX12S) && PCBREV >= 13
BACKLIGHT_TIMER->ARR = 100;
@@ -72,6 +81,15 @@ void backlightEnable(uint8_t dutyCycle)
BACKLIGHT_TIMER->CCR3 = BACKLIGHT_LEVEL_MAX - dutyCycle;
#endif
+#if defined(KEYS_BACKLIGHT_GPIO) && !defined(BOOT)
+ if (dutyCycle == 0 || g_eeGeneral.keysBacklight == 0) {
+ GPIO_ResetBits(KEYS_BACKLIGHT_GPIO, KEYS_BACKLIGHT_GPIO_PIN);
+ }
+ else {
+ GPIO_SetBits(KEYS_BACKLIGHT_GPIO, KEYS_BACKLIGHT_GPIO_PIN);
+ }
+#endif
+
if (dutyCycle == 0) {
BACKLIGHT_TIMER->BDTR &= ~TIM_BDTR_MOE;
}
diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp
index 49a0f13f7..cb379e6fe 100644
--- a/radio/src/targets/horus/board.cpp
+++ b/radio/src/targets/horus/board.cpp
@@ -103,6 +103,7 @@ void boardInit()
LED_RCC_AHB1Periph |
LCD_RCC_AHB1Periph |
BACKLIGHT_RCC_AHB1Periph |
+ KEYS_BACKLIGHT_RCC_AHB1Periph |
SD_RCC_AHB1Periph |
AUDIO_RCC_AHB1Periph |
KEYS_RCC_AHB1Periph |
diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h
index 44d8a5d10..41a8f96ee 100644
--- a/radio/src/targets/horus/board.h
+++ b/radio/src/targets/horus/board.h
@@ -492,6 +492,11 @@ void pwrOn();
void pwrOff();
void pwrResetHandler();
bool pwrPressed();
+#if defined(PWR_EXTRA_SWITCH_GPIO)
+ bool pwrForcePressed();
+#else
+ #define pwrForcePressed() false
+#endif
uint32_t pwrPressedDuration();
// USB Charger
@@ -555,6 +560,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_T18)
+ #define USB_NAME "Jumper T18"
+ #define USB_MANUFACTURER 'J', 'u', 'm', 'p', 'e', 'r', ' ', ' ' /* 8 bytes */
+ #define USB_PRODUCT 'T', '1', '8', ' ', ' ', ' ', ' ', ' ' /* 8 Bytes */
#elif defined(RADIO_TX16S)
#define USB_NAME "RadioMas TX16S"
#define USB_MANUFACTURER 'R', 'a', 'd', 'i', 'o', 'M', 'a', 's' /* 8 bytes */
diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h
index 5e7cd04c2..12b2a4630 100644
--- a/radio/src/targets/horus/hal.h
+++ b/radio/src/targets/horus/hal.h
@@ -322,7 +322,7 @@
#define ADC_TRANSFER_COMPLETE() (ADC_DMA->LISR & DMA_LISR_TCIF0)
#if defined(RADIO_TX16S)
#define ADC_VREF_PREC2 330
- #elif defined(RADIO_T16)
+ #elif defined(RADIO_T16) || defined(RADIO_T18)
#define ADC_VREF_PREC2 300
#else
#define ADC_VREF_PREC2 250
@@ -330,11 +330,21 @@
#endif
// Power
+#if defined(RADIO_T18)
+#define PWR_RCC_AHB1Periph RCC_AHB1Periph_GPIOJ | RCC_AHB1Periph_GPIOB
+#define PWR_ON_GPIO GPIOJ
+#define PWR_ON_GPIO_PIN GPIO_Pin_1 // PJ.01
+#define PWR_SWITCH_GPIO GPIOJ
+#define PWR_SWITCH_GPIO_PIN GPIO_Pin_0 // PJ.00
+#define PWR_EXTRA_SWITCH_GPIO GPIOB
+#define PWR_EXTRA_SWITCH_GPIO_PIN GPIO_Pin_0 // PB.00
+#else
#define PWR_RCC_AHB1Periph RCC_AHB1Periph_GPIOJ
#define PWR_ON_GPIO GPIOJ
#define PWR_ON_GPIO_PIN GPIO_Pin_1 // PJ.01
#define PWR_SWITCH_GPIO GPIOJ
#define PWR_SWITCH_GPIO_PIN GPIO_Pin_0 // PJ.00
+#endif
// USB Charger
#if defined(USB_CHARGER)
@@ -514,6 +524,9 @@
#define LCD_GPIO_NRST GPIOI
#define LCD_GPIO_PIN_NRST GPIO_Pin_10 // PI.10
#endif
+#if defined(PCBX10) && !defined(RADIO_T18) && !defined(SIMU)
+ #define LCD_VERTICAL_INVERT
+#endif
#define LTDC_IRQ_PRIO 4
#define DMA_SCREEN_IRQ_PRIO 6
@@ -549,6 +562,14 @@
#define BACKLIGHT_GPIO_AF GPIO_AF_TIM8
#define BACKLIGHT_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#endif
+#if defined(RADIO_T18)
+ #define KEYS_BACKLIGHT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC
+ #define KEYS_BACKLIGHT_GPIO GPIOC
+ #define KEYS_BACKLIGHT_GPIO_PIN GPIO_Pin_4 // PC.04
+ #define KEYS_BACKLIGHT_GPIO_PinSource GPIO_PinSource4
+#else
+ #define KEYS_BACKLIGHT_RCC_AHB1Periph 0
+#endif
// SD
#define SD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
diff --git a/radio/src/targets/horus/lcd_driver.cpp b/radio/src/targets/horus/lcd_driver.cpp
index 444994d02..42d2c3837 100644
--- a/radio/src/targets/horus/lcd_driver.cpp
+++ b/radio/src/targets/horus/lcd_driver.cpp
@@ -20,14 +20,25 @@
#include "opentx.h"
-#define HBP 42
-#define VBP 12
+#if defined(RADIO_T18)
+ #define HBP 43
+ #define VBP 12
-#define HSW 2
-#define VSW 10
+ #define HSW 2
+ #define VSW 4
-#define HFP 3
-#define VFP 2
+ #define HFP 8
+ #define VFP 8
+#else
+ #define HBP 42
+ #define VBP 12
+
+ #define HSW 2
+ #define VSW 10
+
+ #define HFP 3
+ #define VFP 2
+#endif
#define LCD_FIRST_LAYER 0
#define LCD_SECOND_LAYER 1
@@ -315,7 +326,11 @@ void LCD_Init(void)
{
/* Reset the LCD --------------------------------------------------------*/
LCD_NRSTConfig();
+#if defined(RADIO_T18) // T18 seems to have eractic display issue if NRST is ever driven low
+ NRST_HIGH();
+#else
lcd_reset();
+#endif
/* Configure the LCD Control pins */
LCD_AF_GPIOConfig();
@@ -383,7 +398,7 @@ void lcdInit(void)
void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color)
{
-#if defined(PCBX10)
+#if defined(LCD_VERTICAL_INVERT)
x = destw - (x + w);
y = desth - (y + h);
#endif
@@ -415,7 +430,7 @@ void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, ui
void DMACopyBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srch, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h)
{
-#if defined(PCBX10)
+#if defined(LCD_VERTICAL_INVERT)
x = destw - (x + w);
y = desth - (y + h);
srcx = srcw - (srcx + w);
@@ -458,7 +473,7 @@ void DMACopyBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x,
void DMACopyAlphaBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srch, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h)
{
-#if defined(PCBX10)
+#if defined(LCD_VERTICAL_INVERT)
x = destw - (x + w);
y = desth - (y + h);
srcx = srcw - (srcx + w);
diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h
index 4a8587194..8b1c7275c 100644
--- a/radio/src/targets/sky9x/board.h
+++ b/radio/src/targets/sky9x/board.h
@@ -377,6 +377,7 @@ void pwrOn();
uint32_t pwrCheck();
bool pwrPressed();
#define UNEXPECTED_SHUTDOWN() (g_eeGeneral.unexpectedShutdown)
+#define pwrForcePressed() (false)
// EEPROM driver
#define EEPROM_SIZE (4*1024*1024/8)
diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h
index 7dd0050a5..62ad32a5f 100644
--- a/radio/src/targets/taranis/board.h
+++ b/radio/src/targets/taranis/board.h
@@ -648,6 +648,7 @@ bool pwrPressed();
uint32_t pwrPressedDuration();
#endif
void pwrResetHandler();
+#define pwrForcePressed() false
#if defined(SIMU)
#define UNEXPECTED_SHUTDOWN() false
diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h
index cfe9830b7..65462c576 100644
--- a/radio/src/targets/taranis/hal.h
+++ b/radio/src/targets/taranis/hal.h
@@ -1639,6 +1639,7 @@
#define BACKLIGHT_GPIO_PinSource GPIO_PinSource8
#define BACKLIGHT_GPIO_AF GPIO_AF_TIM10
#endif
+#define KEYS_BACKLIGHT_RCC_AHB1Periph 0
// LCD driver
#if defined(PCBX9E)
diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp
index ab57c5a33..43dccb554 100644
--- a/radio/src/translations.cpp
+++ b/radio/src/translations.cpp
@@ -96,6 +96,7 @@ ISTR(INPUTNAMES);
#if defined(MULTIMODULE)
ISTR(MULTI_PROTOCOLS);
+ISTR(MULTI_POWER);
#endif
#if defined(BLUETOOTH)
@@ -654,6 +655,7 @@ const char STR_GYRO_MAX[] = TR_GYRO_MAX;
#if defined(PWM_BACKLIGHT) || defined(COLORLCD)
const char STR_BLONBRIGHTNESS[] = TR_BLONBRIGHTNESS;
const char STR_BLOFFBRIGHTNESS[] = TR_BLOFFBRIGHTNESS;
+const char STR_KEYS_BACKLIGHT[] = TR_KEYS_BACKLIGHT;
#endif
const char STR_TIMEZONE[] = TR_TIMEZONE;
@@ -694,6 +696,7 @@ const char STR_BIND_OK[] = TR_BIND_OK;
const char STR_MULTI_CUSTOM[] = TR_MULTI_CUSTOM;
const char STR_MULTI_RFTUNE[] = TR_MULTI_RFTUNE;
+const char STR_MULTI_RFPOWER[] = TR_MULTI_RFPOWER;
const char STR_MULTI_TELEMETRY[] = TR_MULTI_TELEMETRY;
const char STR_MULTI_VIDFREQ[] = TR_MULTI_VIDFREQ;
const char STR_MULTI_OPTION[] = TR_MULTI_OPTION;
diff --git a/radio/src/translations.h b/radio/src/translations.h
index a4b9fbb32..f428b3057 100644
--- a/radio/src/translations.h
+++ b/radio/src/translations.h
@@ -159,10 +159,8 @@ extern const char STR_XJT_ACCST_RF_PROTOCOLS[];
extern const char STR_ISRM_RF_PROTOCOLS[];
extern const char STR_R9M_PXX2_RF_PROTOCOLS[];
extern const char STR_DSM_PROTOCOLS[];
-
-#if defined(MULTIMODULE)
extern const char STR_MULTI_PROTOCOLS[];
-#endif
+extern const char STR_MULTI_POWER[];
#if defined(AFHDS3)
extern const char STR_AFHDS3_ONE_TO_ONE_TELEMETRY[];
@@ -305,6 +303,7 @@ extern const char STR_BLDELAY[];
#if defined(PWM_BACKLIGHT) || defined(COLORLCD)
extern const char STR_BLONBRIGHTNESS[];
extern const char STR_BLOFFBRIGHTNESS[];
+extern const char STR_KEYS_BACKLIGHT[];
#endif
extern const char STR_SPLASHSCREEN[];
@@ -399,6 +398,7 @@ extern const char STR_MULTI_FIXEDID[];
extern const char STR_MULTI_OPTION[];
extern const char STR_MULTI_VIDFREQ[];
extern const char STR_MULTI_RFTUNE[];
+extern const char STR_MULTI_RFPOWER[];
extern const char STR_MULTI_TELEMETRY[];
extern const char STR_MULTI_AUTOBIND[];
extern const char STR_DISABLE_CH_MAP[];
diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt
index 7ae453e04..d6563c16c 100644
--- a/radio/src/translations/cz.h.txt
+++ b/radio/src/translations/cz.h.txt
@@ -522,6 +522,7 @@
#define TR_BLDELAY INDENT"Zhasnout po"
#define TR_BLONBRIGHTNESS TR3(INDENT"Jas Zap.", INDENT"Jas Zap.", INDENT"Jas zapnutého LCD")
#define TR_BLOFFBRIGHTNESS TR3(INDENT"Jas Vyp.", INDENT"Jas Vyp.", INDENT"Jas vypnutého LCD")
+#define TR_KEYS_BACKLIGHT "Keys backlight"
#define TR_BLCOLOR INDENT "Barva"
#define TR_SPLASHSCREEN TR("úvodní logo", "Zobrazit úvodní logo")
#define TR_PWR_ON_DELAY "Pwr On delay"
@@ -628,6 +629,7 @@
#define TR_RECEIVER_NUM TR("RX číslo", "Číslo přijímače")
#define TR_RECEIVER "Přijímač"
#define TR_MULTI_RFTUNE TR(INDENT "Ladění frek", INDENT "Jemné ladění frek. RF")
+#define TR_MULTI_RFPOWER "RF power"
#define TR_MULTI_TELEMETRY "Telemetrie"
#define TR_MULTI_VIDFREQ TR(INDENT "Freq. videa", INDENT "Frekvence videa")
#define TR_RFPOWER "Výkon RF"
diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt
index e0e4eb437..f816a7269 100644
--- a/radio/src/translations/de.h.txt
+++ b/radio/src/translations/de.h.txt
@@ -524,6 +524,7 @@
#define TR_BLDELAY INDENT "Dauer"
#define TR_BLONBRIGHTNESS INDENT "An-Helligkeit"
#define TR_BLOFFBRIGHTNESS INDENT "Aus-Helligkeit"
+#define TR_KEYS_BACKLIGHT "Keys backlight"
#define TR_BLCOLOR INDENT "Farbe"
#define TR_SPLASHSCREEN TR("Startbild Ein", "Startbild Anzeigedauer")
#define TR_PWR_ON_DELAY "Pwr On delay"
@@ -630,6 +631,7 @@
#define TR_RECEIVER_NUM TR("Empf Nr.", "Empfänger Nummer")
#define TR_RECEIVER "Empfänger"
#define TR_MULTI_RFTUNE TR(INDENT "RF Freq.", INDENT "RF Freq. Feintuning")
+#define TR_MULTI_RFPOWER "RF power"
#define TR_MULTI_TELEMETRY "Telemetry"
#define TR_MULTI_VIDFREQ TR(INDENT "Vid. Freq.", INDENT "Video Frequenz")
#define TR_RFPOWER "RF Power"
diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt
index a270a1f34..f902dfa60 100644
--- a/radio/src/translations/en.h.txt
+++ b/radio/src/translations/en.h.txt
@@ -523,6 +523,7 @@
#define TR_BLDELAY INDENT "Duration"
#define TR_BLONBRIGHTNESS INDENT "ON brightness"
#define TR_BLOFFBRIGHTNESS INDENT "OFF brightness"
+#define TR_KEYS_BACKLIGHT "Keys backlight"
#define TR_BLCOLOR INDENT "Color"
#define TR_SPLASHSCREEN "Splash screen"
#define TR_PWR_ON_DELAY "Pwr On delay"
@@ -629,6 +630,7 @@
#define TR_RECEIVER_NUM TR("RxNum", "Receiver No.")
#define TR_RECEIVER "Receiver"
#define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune")
+#define TR_MULTI_RFPOWER "RF power"
#define TR_MULTI_TELEMETRY "Telemetry"
#define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency")
#define TR_RFPOWER "RF Power"
diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt
index 822ace072..d7dbd2b15 100644
--- a/radio/src/translations/es.h.txt
+++ b/radio/src/translations/es.h.txt
@@ -522,6 +522,7 @@
#define TR_BLDELAY INDENT"Duración"
#define TR_BLONBRIGHTNESS INDENT"MAS brillo"
#define TR_BLOFFBRIGHTNESS INDENT"MENOS brillo"
+#define TR_KEYS_BACKLIGHT "Keys backlight"
#define TR_BLCOLOR INDENT "Color"
#define TR_SPLASHSCREEN "Pantalla inicio"
#define TR_PWR_ON_DELAY TR("Atraso On", "Atraso encendido")
@@ -631,6 +632,7 @@
#define TR_RECEIVER_NUM TR("Num Rx", "Receptor No.")
#define TR_RECEIVER "Receptor"
#define TR_MULTI_RFTUNE TR("Sint.freq.", "RF Freq. sint.fina")
+#define TR_MULTI_RFPOWER "RF power"
#define TR_MULTI_TELEMETRY "Telemetría"
#define TR_MULTI_VIDFREQ TR("Freq.vídeo", "Frecuencia vídeo")
#define TR_RFPOWER "RF Power"
diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt
index ec28eabcb..579eb25bf 100644
--- a/radio/src/translations/fi.h.txt
+++ b/radio/src/translations/fi.h.txt
@@ -536,6 +536,7 @@
#define TR_BLDELAY INDENT"Duration"
#define TR_BLONBRIGHTNESS INDENT"ON Brightness"
#define TR_BLOFFBRIGHTNESS INDENT"OFF Brightness"
+#define TR_KEYS_BACKLIGHT "Keys backlight"
#define TR_BLCOLOR INDENT "Color"
#define TR_SPLASHSCREEN "Splash screen"
#define TR_PWR_ON_DELAY "Pwr On delay"
@@ -647,6 +648,7 @@
#define TR_RECEIVER_NUM TR("RxNum", "Receiver No.")
#define TR_RECEIVER "Receiver"
#define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune")
+#define TR_MULTI_RFPOWER "RF power"
#define TR_MULTI_TELEMETRY "Telemetry"
#define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency")
#define TR_RFPOWER "RF Power"
diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt
index 466effb38..a914772d5 100644
--- a/radio/src/translations/fr.h.txt
+++ b/radio/src/translations/fr.h.txt
@@ -542,6 +542,7 @@
#define TR_BLDELAY INDENT "Durée"
#define TR_BLONBRIGHTNESS INDENT "Luminosité ON"
#define TR_BLOFFBRIGHTNESS INDENT "Luminosité OFF"
+#define TR_KEYS_BACKLIGHT "Keys backlight"
#define TR_BLCOLOR INDENT "Couleur"
#define TR_SPLASHSCREEN "Logo d'accueil"
#define TR_PWR_ON_DELAY "Délai btn ON"
@@ -650,6 +651,7 @@
#define TR_RECEIVER_NUM TR("NumRx", "No. récepteur")
#define TR_RECEIVER "Récept."
#define TR_MULTI_RFTUNE TR(INDENT "Ajust.fréq", INDENT "Ajustement fréq.")
+#define TR_MULTI_RFPOWER "RF power"
#define TR_MULTI_TELEMETRY "Télémétrie"
#define TR_MULTI_VIDFREQ TR(INDENT "Fréq. vidéo", INDENT "Fréquence vidéo")
#define TR_RFPOWER TR("Puiss. RF", "Puissance RF")
diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt
index cea9b2716..126955a6d 100644
--- a/radio/src/translations/it.h.txt
+++ b/radio/src/translations/it.h.txt
@@ -544,6 +544,7 @@
#define TR_BLDELAY INDENT "Durata"
#define TR_BLONBRIGHTNESS TR(INDENT "Lumin. ON", INDENT "Luminosità ON")
#define TR_BLOFFBRIGHTNESS TR(INDENT "Lumin. OFF", INDENT "Luminosità OFF")
+#define TR_KEYS_BACKLIGHT "Keys backlight"
#define TR_BLCOLOR INDENT "Colore"
#define TR_SPLASHSCREEN TR("Sch. avvio", "Schermata d'avvio")
#define TR_PWR_ON_DELAY "Rit. accens."
@@ -649,6 +650,7 @@
#define TR_RECEIVER_NUM TR("RxNum", "Ricevente N.")
#define TR_RECEIVER "Ricevente"
#define TR_MULTI_RFTUNE TR("Tune RF", "Tune fine Freq. RF")
+#define TR_MULTI_RFPOWER "RF power"
#define TR_MULTI_TELEMETRY "Telemetria"
#define TR_MULTI_VIDFREQ TR("Freq. video", "Frequenza video")
#define TR_RFPOWER "Potenza RF"
diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt
index 5c4310875..6c1138094 100644
--- a/radio/src/translations/nl.h.txt
+++ b/radio/src/translations/nl.h.txt
@@ -525,6 +525,7 @@
#define TR_BLDELAY INDENT "Duur"
#define TR_BLONBRIGHTNESS INDENT "Aan-Helderheid"
#define TR_BLOFFBRIGHTNESS INDENT "Uit-Helderheid"
+#define TR_KEYS_BACKLIGHT "Keys backlight"
#define TR_BLCOLOR INDENT "Kleur"
#define TR_SPLASHSCREEN "Startscherm Aan"
#define TR_PWR_ON_DELAY "Pwr On delay"
@@ -635,6 +636,7 @@
#define TR_RECEIVER_NUM TR("RxNum", "Receiver Nr.")
#define TR_RECEIVER "Receiver"
#define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune")
+#define TR_MULTI_RFPOWER "RF power"
#define TR_MULTI_TELEMETRY "Telemetry"
#define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency")
#define TR_RFPOWER "RF Power"
diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt
index 9f3efa84f..38b03063a 100644
--- a/radio/src/translations/pl.h.txt
+++ b/radio/src/translations/pl.h.txt
@@ -543,6 +543,7 @@
#define TR_BLDELAY INDENT"Czas trwania"
#define TR_BLONBRIGHTNESS INDENT"Jasnośc wł."
#define TR_BLOFFBRIGHTNESS INDENT"Jasność wył."
+#define TR_KEYS_BACKLIGHT "Keys backlight"
#define TR_BLCOLOR INDENT "Color"
#define TR_SPLASHSCREEN "Logo ekranu"
#define TR_PWR_ON_DELAY "Pwr On delay"
@@ -648,6 +649,7 @@
#define TR_RECEIVER_NUM TR("Nr RX", "Nr odbiornika")
#define TR_RECEIVER INDENT "Receiver"
#define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune")
+#define TR_MULTI_RFPOWER "RF power"
#define TR_MULTI_TELEMETRY "Telemetry"
#define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency")
#define TR_RFPOWER "RF Power"
diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt
index e11cd03e6..e6a3ecfb1 100644
--- a/radio/src/translations/pt.h.txt
+++ b/radio/src/translations/pt.h.txt
@@ -529,6 +529,7 @@
#define TR_BLDELAY INDENT "Tempo Backlight"
#define TR_BLONBRIGHTNESS INDENT "ON Brightness"
#define TR_BLOFFBRIGHTNESS INDENT "OFF Brightness"
+#define TR_KEYS_BACKLIGHT "Keys backlight"
#define TR_BLCOLOR INDENT "Color"
#define TR_SPLASHSCREEN "Splash screen"
#define TR_PWR_ON_DELAY "Pwr On delay"
@@ -639,6 +640,7 @@
#define TR_RECEIVER "Receiver"
#define TR_SYNCMENU "Sync [MENU]"
#define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune")
+#define TR_MULTI_RFPOWER "RF power"
#define TR_MULTI_TELEMETRY "Telemetry"
#define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency")
#define TR_RFPOWER "RF Power"
diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt
index ab1e44f3b..079127692 100644
--- a/radio/src/translations/se.h.txt
+++ b/radio/src/translations/se.h.txt
@@ -542,6 +542,7 @@
#define TR_BLDELAY INDENT "Av efter"
#define TR_BLONBRIGHTNESS INDENT "På Ljusstyrka"
#define TR_BLOFFBRIGHTNESS INDENT "Av Ljusstyrka"
+#define TR_KEYS_BACKLIGHT "Keys backlight"
#define TR_SPLASHSCREEN "Startbild"
#define TR_PWR_ON_DELAY "Pwr On delay"
#define TR_PWR_OFF_DELAY "Pwr Off delay"
@@ -648,6 +649,7 @@
#define TR_RECEIVER "Receiver"
#define TR_SYNCMENU "Synk [MENU]"
#define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune")
+#define TR_MULTI_RFPOWER "RF power"
#define TR_MULTI_TELEMETRY "Telemetry"
#define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency")
#define TR_RFPOWER "RF Power"
diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h
index 97a431879..32acdcb84 100644
--- a/radio/src/translations/untranslated.h
+++ b/radio/src/translations/untranslated.h
@@ -125,8 +125,10 @@
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
#define LEN_MULTI_PROTOCOLS "\007"
+#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FlSky2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayanRX""Pelikan""Tiger\0 ""XK\0 ""XN297DU""FrSkyX2""FrSkyR9""Propel\0""FrSkyL\0""Skyarte""ESky-v2""DSM RX\0""JJRC345""Q90C\0 "
-#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FlSky2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayanRX""Pelikan""Tiger\0 ""XK\0 ""XN297DU""FrSkyX2""FrSkyR9""Propel\0""FrSkyL\0""Skyartc""ESky-v2""DSM RX\0""JJRC345""Q90C\0 "
+#define LEN_MULTI_POWER "\005"
+#define TR_MULTI_POWER "10mW\0""25mW\0""50mW\0""100mW""200mW""300mW""500mW""1W\0 ""2W\0 "
#define LEN_AFHDS3_PROTOCOLS "\x008"
#define TR_AFHDS3_PROTOCOLS "PWM/IBUS""PWM/SBUS""PPM/IBUS""PPM/SBUS"
diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py
index 76bade5b6..487fe1f03 100755
--- a/radio/util/build-firmware.py
+++ b/radio/util/build-firmware.py
@@ -148,6 +148,11 @@ def main():
cmake_options["PCBREV"] = "T16"
firmware_options = options_jumper_t16
maxsize = 2 * 1024 * 1024
+ elif board_name == "t18":
+ cmake_options["PCB"] = "X10"
+ cmake_options["PCBREV"] = "T18"
+ firmware_options = options_jumper_t16
+ maxsize = 2 * 1024 * 1024
elif board_name == "tx16s":
cmake_options["PCB"] = "X10"
cmake_options["PCBREV"] = "TX16S"
diff --git a/tools/build-companion-nightly.sh b/tools/build-companion-nightly.sh
index 98d6653e6..fbf8f7166 100755
--- a/tools/build-companion-nightly.sh
+++ b/tools/build-companion-nightly.sh
@@ -106,6 +106,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=TX16S ${SRCDIR}
make -j${JOBS} libsimulator
rm CMakeCache.txt
+cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=T18 ${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-jumper.py b/tools/build-jumper.py
index ab3fb9e45..6e7f3d733 100755
--- a/tools/build-jumper.py
+++ b/tools/build-jumper.py
@@ -25,6 +25,12 @@ boards = {
"PCBREV": "T16",
"INTERNAL_MODULE_MULTI": "YES",
"DEFAULT_MODE": "2",
+ },
+ "T18": {
+ "PCB": "X10",
+ "PCBREV": "T18",
+ "INTERNAL_MODULE_MULTI": "YES",
+ "DEFAULT_MODE": "2",
}
}