diff --git a/.travis.yml b/.travis.yml
index 0caa4d788..582215347 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -25,6 +25,7 @@ env:
# - FLAVOR=9XRPRO
- FLAVOR=X9LITE
- FLAVOR=X7
+ - FLAVOR=T12
- FLAVOR=XLITE
- FLAVOR=XLITES
- FLAVOR=X9
diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt
index 5f5758186..d8fa6efc0 100644
--- a/companion/src/CMakeLists.txt
+++ b/companion/src/CMakeLists.txt
@@ -333,7 +333,11 @@ file(GLOB simulator_plugins "${CMAKE_BINARY_DIR}/Release/*opentx-*simulator${CMA
# the current flavour is not automatically added if build in the current cmake iteration, so always
# add its library name to be sure
-string(TOLOWER ${PCB} FLAVOUR)
+if(PCB STREQUAL X7 AND PCBREV STREQUAL T12)
+ set(FLAVOUR t12)
+else()
+ string(TOLOWER ${PCB} FLAVOUR)
+endif()
if(POLICY CMP0026)
cmake_policy(SET CMP0026 OLD) # https://cmake.org/cmake/help/v3.0/policy/CMP0026.html
endif()
diff --git a/companion/src/companion.qrc b/companion/src/companion.qrc
index 2458eb6b0..2b4b18f71 100644
--- a/companion/src/companion.qrc
+++ b/companion/src/companion.qrc
@@ -72,7 +72,7 @@
images/simulator/X10/left_rtn.png
images/simulator/X10/left_sys.png
images/simulator/X10/left_tele.png
- images/simulator/X10/right_ent.png
+ images/simulator/X10/right_ent.png
images/simulator/9X/9xdb.png
images/simulator/9X/9xdl.png
images/simulator/9X/9xdr.png
@@ -157,15 +157,28 @@
images/simulator/XLITE/right_left.png
images/simulator/XLITE/right_up.png
images/simulator/XLITE/right_down.png
+ images/simulator/JumperT12/right_up.png
+ images/simulator/JumperT12/right_down.png
+ images/simulator/JumperT12/right_right.png
+ images/simulator/JumperT12/right_left.png
+ images/simulator/JumperT12/left_ent.png
+ images/simulator/JumperT12/left_exit.png
+ images/simulator/JumperT12/JumperT12.png
+ images/simulator/JumperT12/JumperT12-208.png
+ images/simulator/JumperT12/JumperT12-left.png
+ images/simulator/JumperT12/JumperT12-right.png
+ images/simulator/JumperT12/JumperT12-x.png
+ images/simulator/JumperT12/JumperT12-center.png
+ images/simulator/JumperT12/JumperT12-top.png
images/wizard/ailerons.png
images/wizard/airbrakes.png
- images/wizard/elevons.png
+ images/wizard/elevons.png
images/wizard/conclusion.png
images/wizard/cyclic.png
images/wizard/fblheli.png
images/wizard/flaps.png
images/wizard/flybar.png
- images/wizard/gyro.png
+ images/wizard/gyro.png
images/wizard/helictrl.png
images/wizard/models.png
images/wizard/multirotor.png
@@ -1136,6 +1149,6 @@
themes/yerico/48/contributors.png
themes/yerico/48/stop.png
themes/yerico/48/write_eeprom.png
- themes/yerico/48/sdsync.png
+ themes/yerico/48/sdsync.png
diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp
index 761d3add6..927087ecd 100644
--- a/companion/src/firmwares/boards.cpp
+++ b/companion/src/firmwares/boards.cpp
@@ -83,6 +83,8 @@ uint32_t Boards::getFourCC(Type board)
case BOARD_STOCK:
case BOARD_M128:
return 0;
+ case BOARD_JUMPER_T12:
+ return 0x3D78746F;
case BOARD_UNKNOWN:
break;
}
@@ -112,6 +114,7 @@ const int Boards::getEEpromSize(Board::Type board)
case BOARD_TARANIS_X9D:
case BOARD_TARANIS_X9DP:
case BOARD_TARANIS_X9E:
+ case BOARD_JUMPER_T12:
return EESIZE_TARANIS;
case BOARD_UNKNOWN:
return EESIZE_MAX;
@@ -221,6 +224,18 @@ const SwitchInfo Boards::getSwitchInfo(Board::Type board, int index)
if (index < DIM(switches))
return switches[index];
}
+ else if (IS_JUMPER_T12(board)) {
+ const Board::SwitchInfo switches[] = {
+ {SWITCH_3POS, "SA"},
+ {SWITCH_3POS, "SB"},
+ {SWITCH_3POS, "SC"},
+ {SWITCH_3POS, "SD"},
+ {SWITCH_2POS, "SG"},
+ {SWITCH_2POS, "SH"}
+ };
+ if (index < DIM(switches))
+ return switches[index];
+ }
else {
const Board::SwitchInfo switches[] = {
{SWITCH_3POS, "3POS"},
@@ -247,7 +262,7 @@ const int Boards::getCapability(Board::Type board, Board::Capability capability)
case Pots:
if (IS_TARANIS_X9LITE(board))
return 1;
- else if (IS_TARANIS_SMALL(board))
+ else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
return 2;
else if (IS_TARANIS_X9E(board))
return 4;
@@ -302,6 +317,8 @@ const int Boards::getCapability(Board::Type board, Board::Capability capability)
return 4;
else if (IS_HORUS_OR_TARANIS(board))
return 8;
+ else if (IS_JUMPER_T12(board))
+ return 6;
else
return 7;
diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h
index cbd6bb327..eb70dbb0c 100644
--- a/companion/src/firmwares/boards.h
+++ b/companion/src/firmwares/boards.h
@@ -47,7 +47,8 @@ namespace Board {
BOARD_X10,
BOARD_TARANIS_XLITE,
BOARD_TARANIS_XLITES,
- BOARD_TARANIS_X9LITE
+ BOARD_TARANIS_X9LITE,
+ BOARD_JUMPER_T12
};
constexpr int BOARD_TYPE_MAX = BOARD_TARANIS_X9LITE ;
@@ -190,6 +191,7 @@ class Boards
#define IS_2560(board) (board==Board::BOARD_GRUVIN9X || board==Board::BOARD_MEGA2560)
#define IS_SKY9X(board) (board==Board::BOARD_SKY9X || board==Board::BOARD_9XRPRO || board==Board::BOARD_AR9X)
#define IS_9XRPRO(board) (board==Board::BOARD_9XRPRO)
+#define IS_JUMPER_T12(board) (board==Board::BOARD_JUMPER_T12)
#define IS_TARANIS_XLITE(board) (board==Board::BOARD_TARANIS_XLITE || board==Board::BOARD_TARANIS_XLITES)
#define IS_TARANIS_XLITES(board) (board==Board::BOARD_TARANIS_XLITES)
#define IS_TARANIS_X7(board) (board==Board::BOARD_TARANIS_X7)
diff --git a/companion/src/firmwares/generalsettings.cpp b/companion/src/firmwares/generalsettings.cpp
index 93035f9f6..46e117c36 100644
--- a/companion/src/firmwares/generalsettings.cpp
+++ b/companion/src/firmwares/generalsettings.cpp
@@ -90,7 +90,7 @@ GeneralSettings::GeneralSettings()
// Lipo 2S
vBatWarn = 66;
vBatMin = -23; // 6.7V
- vBatMax = -37; // 8.3V
+ vBatMax = -37; // 8.3V
}
else if (IS_TARANIS(board)) {
// NI-MH 7.2V, X9D, X9D+ and X7
@@ -249,6 +249,10 @@ void GeneralSettings::setDefaultControlTypes(Board::Type board)
potConfig[0] = Board::POT_WITH_DETENT;
potConfig[1] = Board::POT_WITH_DETENT;
}
+ else if (IS_JUMPER_T12(board)) {
+ potConfig[0] = Board::POT_WITH_DETENT;
+ potConfig[1] = Board::POT_WITH_DETENT;
+ }
else {
potConfig[0] = Board::POT_WITHOUT_DETENT;
potConfig[1] = Board::POT_WITHOUT_DETENT;
@@ -317,6 +321,20 @@ void GeneralSettings::convert(RadioDataConversionState & cstate)
}
}
+ if (IS_JUMPER_T12(cstate.toType)) {
+ if (IS_TARANIS_X9(cstate.fromType) || IS_HORUS(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)) {
+ strncpy(switchName[5], switchName[4], sizeof(switchName[0]));
+ strncpy(switchName[7], switchName[5], sizeof(switchName[0]));
+ }
+ }
+
// LS and RS sliders are after 2 aux sliders on X12 and X9E
if ((IS_HORUS_X12S(cstate.toType) || IS_TARANIS_X9E(cstate.toType)) && !IS_HORUS_X12S(cstate.fromType) && !IS_TARANIS_X9E(cstate.fromType)) {
strncpy(sliderName[0], sliderName[2], sizeof(sliderName[0]));
diff --git a/companion/src/firmwares/opentx/opentxeeprom.h b/companion/src/firmwares/opentx/opentxeeprom.h
index 19a075186..14639d330 100644
--- a/companion/src/firmwares/opentx/opentxeeprom.h
+++ b/companion/src/firmwares/opentx/opentxeeprom.h
@@ -35,6 +35,7 @@
#define TARANIS_XLITE_VARIANT 0x2000
#define TARANIS_XLITES_VARIANT 0x1000
#define TARANIS_X9LITE_VARIANT 0x0800
+#define JUMPER_T12_VARIANT TARANIS_X7_VARIANT
#define SIMU_STOCK_VARIANTS (GVARS_VARIANT|FRSKY_VARIANT)
#define SIMU_M128_VARIANTS (M128_VARIANT|SIMU_STOCK_VARIANTS)
diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp
index d6d323130..8a8557a31 100644
--- a/companion/src/firmwares/opentx/opentxinterface.cpp
+++ b/companion/src/firmwares/opentx/opentxinterface.cpp
@@ -66,6 +66,8 @@ const char * OpenTxEepromInterface::getName()
return "OpenTX for MEGA2560 board";
case BOARD_GRUVIN9X:
return "OpenTX for Gruvin9x board / 9X";
+ case BOARD_JUMPER_T12:
+ return "OpenTX for Jumper T12";
case BOARD_TARANIS_X9D:
return "OpenTX for FrSky Taranis X9D";
case BOARD_TARANIS_X9DP:
@@ -331,6 +333,9 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u
else if (IS_TARANIS_XLITE(board)) {
variant |= TARANIS_XLITE_VARIANT;
}
+ else if (IS_JUMPER_T12(board)) {
+ variant |= JUMPER_T12_VARIANT;
+ }
OpenTxGeneralData generator((GeneralSettings &)radioData.generalSettings, board, version, variant);
// generator.dump();
@@ -543,7 +548,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) || id.contains("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"));
case ModelTrainerEnable:
if (IS_HORUS_OR_TARANIS(board))
return 1;
@@ -552,7 +557,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case MaxVolume:
return (IS_ARM(board) ? 23 : 7);
case MaxContrast:
- if (IS_TARANIS_SMALL(board))
+ if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
return 30;
else
return 45;
@@ -644,7 +649,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case LcdWidth:
if (IS_HORUS(board))
return 480;
- else if (IS_TARANIS_SMALL(board))
+ else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
return 128;
else if (IS_TARANIS(board))
return 212;
@@ -658,7 +663,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case LcdDepth:
if (IS_HORUS(board))
return 16;
- else if (IS_TARANIS_SMALL(board))
+ else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
return 1;
else if (IS_TARANIS(board))
return 4;
@@ -708,6 +713,8 @@ int OpenTxFirmware::getCapability(::Capability capability)
return TARANIS_XLITES_VARIANT;
else if (IS_TARANIS_XLITE(board))
return TARANIS_XLITE_VARIANT;
+ else if (IS_JUMPER_T12(board))
+ return JUMPER_T12_VARIANT;
else
return 0;
case MavlinkTelemetry:
@@ -973,6 +980,11 @@ bool OpenTxEepromInterface::checkVariant(unsigned int version, unsigned int vari
variantError = true;
}
}
+ else if (IS_JUMPER_T12(board)) {
+ if (variant != JUMPER_T12_VARIANT) {
+ variantError = true;
+ }
+ }
if (variantError) {
qWarning() << " wrong variant (" << variant << ")";
@@ -1242,6 +1254,17 @@ void registerOpenTxFirmwares()
firmware->addOption("pcbdev", Firmware::tr("Use ONLY with first DEV pcb version"));
registerOpenTxFirmware(firmware);
+ /* Jumper T12 board */
+ firmware = new OpenTxFirmware("opentx-t12", QCoreApplication::translate("Firmware", "Jumper T12"), BOARD_JUMPER_T12);
+ addOpenTxCommonOptions(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"));
+ firmware->addOption("luac", Firmware::tr("Enable Lua compiler"));
+ firmware->addOption("crossfire", Firmware::tr("Support for Crossfire TX Module"));
+ addOpenTxFontOptions(firmware);
+ registerOpenTxFirmware(firmware);
+
/* 9XR-Pro */
firmware = new OpenTxFirmware("opentx-9xrpro", Firmware::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO);
addOpenTxArm9xOptions(firmware, false);
diff --git a/companion/src/firmwares/rawsource.cpp b/companion/src/firmwares/rawsource.cpp
index a42312ca2..507518150 100644
--- a/companion/src/firmwares/rawsource.cpp
+++ b/companion/src/firmwares/rawsource.cpp
@@ -615,6 +615,19 @@ 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))) {
+ // No SE and SG on T12 board
+ if (index == 4 || index == 6) {
+ index = 3; // SG and SE to SD
+ evt = RadioDataConversionState::EVT_CVRT;
+ }
+ else if (index == 5) {
+ index = 4; // SF to SF
+ }
+ else if (index == 7) {
+ index = 5; // SH to SH
+ }
+ }
// 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)) {
if (index == 4) {
@@ -624,6 +637,22 @@ 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)) {
+ if (index == 4) {
+ index = 5; // SF to SF
+ }
+ else if (index == 5) {
+ index = 7; // SH to SH
+ }
+ }
+ else if ((IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) && IS_JUMPER_T12(cstate.fromType)) {
+ if (index == 4) {
+ index = 5; // SF to SF
+ }
+ else if (index == 5) {
+ index = 7; // SH to SH
+ }
+ }
} // SOURCE_TYPE_SWITCH
// final validation (we do not pass model to isAvailable() because we don't know what has or hasn't been converted)
diff --git a/companion/src/firmwares/rawswitch.cpp b/companion/src/firmwares/rawswitch.cpp
index 55fb91c1c..6438d335e 100644
--- a/companion/src/firmwares/rawswitch.cpp
+++ b/companion/src/firmwares/rawswitch.cpp
@@ -208,6 +208,20 @@ 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))) {
+ if (srcIdx == 4 || srcIdx == 5) {
+ delta = 3; // SE to SD & SF to SF
+ if (srcIdx == 4)
+ evt = RadioDataConversionState::EVT_CVRT;
+ }
+ else if (srcIdx == 6) {
+ delta = 9; // SG to SD
+ evt = RadioDataConversionState::EVT_CVRT;
+ }
+ else if (srcIdx == 7) {
+ delta = 6; // SH to SH
+ }
+ }
// 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)) {
if (srcIdx == 4) {
@@ -217,6 +231,14 @@ 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)) {
+ if (srcIdx == 4) {
+ delta = -3; // SF to SF
+ }
+ else if (srcIdx == 5) {
+ delta = -6; // SH to SH
+ }
+ }
if (index < 0) {
delta = -delta; // invert for !switch
diff --git a/companion/src/generaledit/hardware.cpp b/companion/src/generaledit/hardware.cpp
index 1d131e1e0..bb482598e 100644
--- a/companion/src/generaledit/hardware.cpp
+++ b/companion/src/generaledit/hardware.cpp
@@ -41,6 +41,14 @@ void HardwarePanel::setupSwitchType(int index, QLabel * label, AutoLineEdit * na
label->setText("SH");
}
}
+ if (IS_JUMPER_T12(board)) {
+ if (index == 4) {
+ label->setText("SG");
+ }
+ else if (index == 5) {
+ label->setText("SH");
+ }
+ }
}
else {
label->hide();
@@ -157,7 +165,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_HORUS(board) || IS_JUMPER_T12(board)) {
ui->bluetoothMode->addItem(tr("OFF"), 0);
if (IS_TARANIS_X9E(board)) {
ui->bluetoothMode->addItem(tr("Enabled"), 1);
diff --git a/companion/src/images/simulator/JumperT12/JumperT12-208.png b/companion/src/images/simulator/JumperT12/JumperT12-208.png
new file mode 100644
index 000000000..00cb7b759
Binary files /dev/null and b/companion/src/images/simulator/JumperT12/JumperT12-208.png differ
diff --git a/companion/src/images/simulator/JumperT12/JumperT12-center.png b/companion/src/images/simulator/JumperT12/JumperT12-center.png
new file mode 100644
index 000000000..4040c2bbe
Binary files /dev/null and b/companion/src/images/simulator/JumperT12/JumperT12-center.png differ
diff --git a/companion/src/images/simulator/JumperT12/JumperT12-left.png b/companion/src/images/simulator/JumperT12/JumperT12-left.png
new file mode 100644
index 000000000..ba527bad8
Binary files /dev/null and b/companion/src/images/simulator/JumperT12/JumperT12-left.png differ
diff --git a/companion/src/images/simulator/JumperT12/JumperT12-right.png b/companion/src/images/simulator/JumperT12/JumperT12-right.png
new file mode 100644
index 000000000..80552deff
Binary files /dev/null and b/companion/src/images/simulator/JumperT12/JumperT12-right.png differ
diff --git a/companion/src/images/simulator/JumperT12/JumperT12-top.png b/companion/src/images/simulator/JumperT12/JumperT12-top.png
new file mode 100644
index 000000000..d5585597e
Binary files /dev/null and b/companion/src/images/simulator/JumperT12/JumperT12-top.png differ
diff --git a/companion/src/images/simulator/JumperT12/JumperT12-x.png b/companion/src/images/simulator/JumperT12/JumperT12-x.png
new file mode 100644
index 000000000..7230ecf56
Binary files /dev/null and b/companion/src/images/simulator/JumperT12/JumperT12-x.png differ
diff --git a/companion/src/images/simulator/JumperT12/JumperT12.png b/companion/src/images/simulator/JumperT12/JumperT12.png
new file mode 100644
index 000000000..71aa5d7a8
Binary files /dev/null and b/companion/src/images/simulator/JumperT12/JumperT12.png differ
diff --git a/companion/src/images/simulator/JumperT12/left_ent.png b/companion/src/images/simulator/JumperT12/left_ent.png
new file mode 100644
index 000000000..ba527bad8
Binary files /dev/null and b/companion/src/images/simulator/JumperT12/left_ent.png differ
diff --git a/companion/src/images/simulator/JumperT12/left_exit.png b/companion/src/images/simulator/JumperT12/left_exit.png
new file mode 100644
index 000000000..ba527bad8
Binary files /dev/null and b/companion/src/images/simulator/JumperT12/left_exit.png differ
diff --git a/companion/src/images/simulator/JumperT12/left_page.png b/companion/src/images/simulator/JumperT12/left_page.png
new file mode 100644
index 000000000..ba527bad8
Binary files /dev/null and b/companion/src/images/simulator/JumperT12/left_page.png differ
diff --git a/companion/src/images/simulator/JumperT12/right_down.png b/companion/src/images/simulator/JumperT12/right_down.png
new file mode 100644
index 000000000..80552deff
Binary files /dev/null and b/companion/src/images/simulator/JumperT12/right_down.png differ
diff --git a/companion/src/images/simulator/JumperT12/right_left.png b/companion/src/images/simulator/JumperT12/right_left.png
new file mode 100644
index 000000000..80552deff
Binary files /dev/null and b/companion/src/images/simulator/JumperT12/right_left.png differ
diff --git a/companion/src/images/simulator/JumperT12/right_right.png b/companion/src/images/simulator/JumperT12/right_right.png
new file mode 100644
index 000000000..80552deff
Binary files /dev/null and b/companion/src/images/simulator/JumperT12/right_right.png differ
diff --git a/companion/src/images/simulator/JumperT12/right_up.png b/companion/src/images/simulator/JumperT12/right_up.png
new file mode 100644
index 000000000..80552deff
Binary files /dev/null and b/companion/src/images/simulator/JumperT12/right_up.png differ
diff --git a/companion/src/simulation/CMakeLists.txt b/companion/src/simulation/CMakeLists.txt
index 030013c2f..50d2da532 100644
--- a/companion/src/simulation/CMakeLists.txt
+++ b/companion/src/simulation/CMakeLists.txt
@@ -11,6 +11,7 @@ set(simulation_SRCS
simulateduiwidgetX9E.cpp
simulateduiwidgetX10.cpp
simulateduiwidgetX12.cpp
+ simulateduiwidgetJumperT12.cpp
simulatorinterface.cpp
simulatormainwindow.cpp
simulatorstartupdialog.cpp
@@ -32,6 +33,7 @@ set(simulation_UIS
simulateduiwidgetX9E.ui
simulateduiwidgetX10.ui
simulateduiwidgetX12.ui
+ simulateduiwidgetJumperT12.ui
simulatormainwindow.ui
simulatorstartupdialog.ui
simulatorwidget.ui
diff --git a/companion/src/simulation/simulateduiwidget.h b/companion/src/simulation/simulateduiwidget.h
index 5f17440aa..0b498924c 100644
--- a/companion/src/simulation/simulateduiwidget.h
+++ b/companion/src/simulation/simulateduiwidget.h
@@ -111,6 +111,7 @@ namespace Ui {
class SimulatedUIWidgetX9E;
class SimulatedUIWidgetX10;
class SimulatedUIWidgetX12;
+ class SimulatedUIWidgetJumperT12;
}
class SimulatedUIWidget9X: public SimulatedUIWidget
@@ -213,4 +214,16 @@ class SimulatedUIWidgetX12: public SimulatedUIWidget
Ui::SimulatedUIWidgetX12 * ui;
};
+class SimulatedUIWidgetJumperT12: public SimulatedUIWidget
+{
+ Q_OBJECT
+
+ public:
+ explicit SimulatedUIWidgetJumperT12(SimulatorInterface * simulator, QWidget * parent = NULL);
+ virtual ~SimulatedUIWidgetJumperT12();
+
+ private:
+ Ui::SimulatedUIWidgetJumperT12 * ui;
+};
+
#endif // SIMULATEDUIWIDGET_H
diff --git a/companion/src/simulation/simulateduiwidgetJumperT12.cpp b/companion/src/simulation/simulateduiwidgetJumperT12.cpp
new file mode 100644
index 000000000..e69f433d3
--- /dev/null
+++ b/companion/src/simulation/simulateduiwidgetJumperT12.cpp
@@ -0,0 +1,61 @@
+#include "simulateduiwidget.h"
+#include "ui_simulateduiwidgetJumperT12.h"
+
+// NOTE: RadioUiAction(NUMBER,...): NUMBER relates to enum EnumKeys in the specific board.h
+
+SimulatedUIWidgetJumperT12::SimulatedUIWidgetJumperT12(SimulatorInterface *simulator, QWidget * parent):
+ SimulatedUIWidget(simulator, parent),
+ ui(new Ui::SimulatedUIWidgetJumperT12)
+{
+ RadioUiAction * act;
+ QPolygon polygon;
+
+ ui->setupUi(this);
+
+ act = new RadioUiAction(3, QList() << Qt::Key_Up << Qt::Key_PageUp, SIMU_STR_HLP_KEYS_GO_UP, SIMU_STR_HLP_ACT_UP);
+ addRadioWidget(ui->rightbuttons->addArea(QRect(69, 11, 60, 25), "JumperT12/right_up.png", act));
+
+ act = new RadioUiAction(2, QList() << Qt::Key_Down << Qt::Key_PageDown, SIMU_STR_HLP_KEYS_GO_DN, SIMU_STR_HLP_ACT_DN);
+ addRadioWidget(ui->rightbuttons->addArea(QRect(61, 115, 60, 25), "JumperT12/right_down.png", act));
+
+ act = new RadioUiAction(4, QList() << Qt::Key_Right << Qt::Key_Plus, SIMU_STR_HLP_KEY_RGT % "|" % SIMU_STR_HLP_KEY_PLS, SIMU_STR_HLP_ACT_PLS);
+ addRadioWidget(ui->rightbuttons->addArea(QRect(109, 53, 30, 40), "JumperT12/right_right.png", act));
+
+ act = new RadioUiAction(5, QList() << Qt::Key_Left << Qt::Key_Minus, SIMU_STR_HLP_KEY_LFT % "|" % SIMU_STR_HLP_KEY_MIN, SIMU_STR_HLP_ACT_MIN);
+ addRadioWidget(ui->rightbuttons->addArea(QRect(49, 62, 30, 40), "JumperT12/right_left.png", act));
+
+ m_mouseMidClickAction = new RadioUiAction(1, QList() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_ACTIVATE, SIMU_STR_HLP_ACT_ENT);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(21, 30, 60, 25), "JumperT12/left_ent.png", m_mouseMidClickAction));
+
+ act = new RadioUiAction(0, QList() << Qt::Key_Delete << Qt::Key_Escape << Qt::Key_Backspace, SIMU_STR_HLP_KEYS_EXIT, SIMU_STR_HLP_ACT_EXIT);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(21, 80, 60, 60), "JumperT12/left_exit.png", act));
+
+ addRadioWidget(ui->leftbuttons->addArea(QRect(9, 154, 30, 30), "JumperT12/left_scrnshot.png", m_screenshotAction));
+
+ m_backlightColors << QColor(215, 243, 255); // X7 Blue
+ m_backlightColors << QColor(166,247,159);
+ m_backlightColors << QColor(247,159,166);
+ m_backlightColors << QColor(255,195,151);
+ m_backlightColors << QColor(247,242,159);
+
+ setLcd(ui->lcd);
+
+ QString css = "#radioUiWidget {"
+ "background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:1,"
+ "stop:0 rgba(255, 255, 255, 255),"
+ "stop:0.757062 rgba(241, 238, 238, 255),"
+ "stop:1 rgba(247, 245, 245, 255));"
+ "}";
+
+ QTimer * tim = new QTimer(this);
+ tim->setSingleShot(true);
+ connect(tim, &QTimer::timeout, [this, css]() {
+ emit customStyleRequest(css);
+ });
+ tim->start(100);
+}
+
+SimulatedUIWidgetJumperT12::~SimulatedUIWidgetJumperT12()
+{
+ delete ui;
+}
diff --git a/companion/src/simulation/simulateduiwidgetJumperT12.ui b/companion/src/simulation/simulateduiwidgetJumperT12.ui
new file mode 100644
index 000000000..3f7e1479a
--- /dev/null
+++ b/companion/src/simulation/simulateduiwidgetJumperT12.ui
@@ -0,0 +1,258 @@
+
+
+ SimulatedUIWidgetJumperT12
+
+
+
+ 0
+ 0
+ 570
+ 208
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 570
+ 208
+
+
+
+
+ 570
+ 208
+
+
+
+ Jumper T12 Simulator
+
+
+ background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255, 255, 255, 255), stop:0.757062 rgba(241, 238, 238, 255), stop:1 rgba(247, 245, 245, 255));
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 10
+
+
+
+
+ 16777215
+ 10
+
+
+
+ background-color: rgb(247, 245, 245);
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 10
+
+
+
+
+ 16777215
+ 12
+
+
+
+
+ 0
+ 12
+
+
+
+ background-color: rgb(255, 255, 255);
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 157
+ 186
+
+
+
+
+ 157
+ 186
+
+
+
+ background:url(:/images/simulator/JumperT12/JumperT12-right.png)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 157
+ 186
+
+
+
+
+ 157
+ 186
+
+
+
+ background:url(:/images/simulator/JumperT12/JumperT12-left.png);
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 256
+ 10
+
+
+
+
+ 256
+ 10
+
+
+
+ background:url(:/images/simulator/JumperT12/bottom.png)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 256
+ 48
+
+
+
+
+ 256
+ 48
+
+
+
+ background:url(:/images/simulator/JumperT12/JumperT12-top.png)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 256
+ 128
+
+
+
+
+ 424
+ 128
+
+
+
+ background-color: rgb(215, 243, 255);
+
+
+
+
+
+
+
+ LcdWidget
+ QWidget
+
+ 1
+
+
+ ButtonsWidget
+ QWidget
+
+ 1
+
+
+
+
+
\ No newline at end of file
diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp
index 9a7475839..e945d7a65 100644
--- a/companion/src/simulation/simulatorwidget.cpp
+++ b/companion/src/simulation/simulatorwidget.cpp
@@ -91,6 +91,9 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato
case Board::BOARD_X10:
radioUiWidget = new SimulatedUIWidgetX10(simulator, this);
break;
+ case Board::BOARD_JUMPER_T12:
+ radioUiWidget = new SimulatedUIWidgetJumperT12(simulator, this);
+ break;
default:
radioUiWidget = new SimulatedUIWidget9X(simulator, this);
break;
diff --git a/launchpad/common/rules b/launchpad/common/rules
index 1c0ffb480..67b06466b 100755
--- a/launchpad/common/rules
+++ b/launchpad/common/rules
@@ -26,6 +26,7 @@ build:
cd $(BUILDDIR); cmake $(COMMON_OPTIONS) $(STM32_OPTIONS) -DPCB=X9D+ ../ ; make libsimulator
cd $(BUILDDIR); cmake $(COMMON_OPTIONS) $(STM32_OPTIONS) -DPCB=X9E ../ ; make libsimulator
cd $(BUILDDIR); cmake $(COMMON_OPTIONS) $(STM32_OPTIONS) -DPCB=X12S ../ ; make libsimulator
+ cd $(BUILDDIR); cmake $(COMMON_OPTIONS) $(STM32_OPTIONS) -DPCB=JUMPERT12 ../ ; make libsimulator
make -C $(BUILDDIR) companion22 simulator22
diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h
index 047d75b4a..0802b96c2 100644
--- a/radio/src/dataconstants.h
+++ b/radio/src/dataconstants.h
@@ -180,24 +180,24 @@ enum BeeperMode {
};
#if defined(PCBTARANIS) || defined(PCBHORUS)
- enum ModuleIndex {
- INTERNAL_MODULE,
- EXTERNAL_MODULE,
- SPORT_MODULE,
- };
- enum TrainerMode {
- TRAINER_MODE_MASTER_TRAINER_JACK,
- TRAINER_MODE_SLAVE,
+enum ModuleIndex {
+ INTERNAL_MODULE,
+ EXTERNAL_MODULE,
+ SPORT_MODULE,
+};
+enum TrainerMode {
+ TRAINER_MODE_MASTER_TRAINER_JACK,
+ TRAINER_MODE_SLAVE,
#if defined(PCBTARANIS)
- TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE,
- TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE,
+ TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE,
+ TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE,
#endif
- TRAINER_MODE_MASTER_BATTERY_COMPARTMENT,
+ TRAINER_MODE_MASTER_BATTERY_COMPARTMENT,
#if defined(BLUETOOTH)
- TRAINER_MODE_MASTER_BLUETOOTH,
- TRAINER_MODE_SLAVE_BLUETOOTH,
+ TRAINER_MODE_MASTER_BLUETOOTH,
+ TRAINER_MODE_SLAVE_BLUETOOTH,
#endif
- };
+};
#elif defined(PCBSKY9X)
enum ModuleIndex {
EXTERNAL_MODULE,
@@ -324,7 +324,7 @@ enum TelemetryUnit {
#endif
#if defined(PCBTARANIS)
-#define MAX_TELEM_SCRIPT_INPUTS 8
+ #define MAX_TELEM_SCRIPT_INPUTS 8
#endif
enum TelemetryScreenType {
@@ -657,9 +657,12 @@ enum MixSources {
#if defined(PCBHORUS) || defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX7)
MIXSRC_SH, LUA_EXPORT("sh", "Switch H")
#endif
-#if defined(PCBX7)
+#if defined(RADIO_X7)
MIXSRC_SI, LUA_EXPORT("si", "Switch I")
MIXSRC_SJ, LUA_EXPORT("sj", "Switch J")
+#elif defined(RADIO_T12) // keep switches for eeprom compatibity, but hide them
+ MIXSRC_SI,
+ MIXSRC_SJ,
#endif
#if defined(PCBX9E)
MIXSRC_SI, LUA_EXPORT("si", "Switch I")
@@ -842,4 +845,4 @@ enum BluetoothModes {
#define PXX2_LEN_RX_NAME 8
#define PXX2_MAX_RECEIVERS_PER_MODULE 3
-#endif // _DATACONSTANTS_H_
+#endif // _DATACONSTANTS_H_
\ No newline at end of file
diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h
index c656c5e0e..b453ba607 100644
--- a/radio/src/gui/128x64/gui.h
+++ b/radio/src/gui/128x64/gui.h
@@ -27,7 +27,7 @@
#define MENUS_SCROLLBAR_WIDTH 0
-#if defined(PCBX7) || defined(PCBX9LITE)
+#if defined(NAVIGATION_X7)
#define HEADER_LINE 0
#define HEADER_LINE_COLUMNS
#else
@@ -156,7 +156,7 @@ void title(const char * s);
#define MENU_TAB(...) const uint8_t mstate_tab[] = __VA_ARGS__
-#if defined(PCBX7) || defined(PCBX9LITE)
+#if defined(NAVIGATION_X7)
#define MENU_CHECK(tab, menu, lines_count) \
check(event, menu, tab, DIM(tab), mstate_tab, DIM(mstate_tab)-1, lines_count)
#else
@@ -169,7 +169,7 @@ void title(const char * s);
MENU_CHECK(tab, menu, lines_count); \
TITLE(title)
-#if defined(PCBX7) || defined(PCBX9LITE)
+#if defined(NAVIGATION_X7)
#define SIMPLE_MENU_NOTITLE(tab, menu, lines_count) \
check_simple(event, menu, tab, DIM(tab), lines_count);
#define SUBMENU_NOTITLE(lines_count, ...) \
diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp
index 94a688c01..8d16b6b73 100644
--- a/radio/src/gui/128x64/model_select.cpp
+++ b/radio/src/gui/128x64/model_select.cpp
@@ -76,10 +76,9 @@ void menuModelSelect(event_t event)
event = EVT_ENTRY_UP;
}
- event_t _event_ = (IS_ROTARY_BREAK(event) || IS_ROTARY_LONG(event) ? 0 : event);
-
- if ((s_copyMode && EVT_KEY_MASK(event) == KEY_EXIT) || event == EVT_KEY_BREAK(KEY_EXIT)) {
- _event_ -= KEY_EXIT;
+ event_t _event_ = event;
+ if ((s_copyMode && EVT_KEY_MASK(event) == KEY_EXIT) || event == EVT_KEY_BREAK(KEY_EXIT) || IS_ROTARY_BREAK(event) || IS_ROTARY_LONG(event)) {
+ _event_ = 0;
}
int8_t oldSub = menuVerticalPosition;
@@ -198,7 +197,7 @@ void menuModelSelect(event_t event)
}
break;
-#if defined(PCBX7) || defined(PCBX9LITE)
+#if defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
chainMenu(menuTabModel[DIM(menuTabModel)-1]);
killEvents(event);
@@ -230,7 +229,7 @@ void menuModelSelect(event_t event)
#endif
#endif
-#if defined(PCBX7) || defined(PCBX9LITE)
+#if defined(NAVIGATION_X7)
case EVT_ROTARY_LEFT:
case EVT_ROTARY_RIGHT:
#endif
@@ -271,7 +270,7 @@ void menuModelSelect(event_t event)
lcdDrawNumber(17*FW, 0, reusableBuffer.modelsel.eepromfree, RIGHT);
#endif
-#if defined(PCBX7) || defined(PCBX9LITE)
+#if defined(NAVIGATION_X7)
drawScreenIndex(MENU_MODEL_SELECT, DIM(menuTabModel), 0);
#elif defined(ROTARY_ENCODER_NAVIGATION)
drawScreenIndex(MENU_MODEL_SELECT, DIM(menuTabModel), (sub == g_eeGeneral.currModel) ? ((IS_ROTARY_ENCODER_NAVIGATION_ENABLE() && s_editMode < 0) ? INVERS|BLINK : INVERS) : 0);
diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp
index c18de6db0..972317795 100644
--- a/radio/src/gui/128x64/model_setup.cpp
+++ b/radio/src/gui/128x64/model_setup.cpp
@@ -77,7 +77,7 @@ enum MenuModelSetupItems {
ITEM_MODEL_SETUP_BEEP_CENTER,
ITEM_MODEL_SETUP_USE_GLOBAL_FUNCTIONS,
ITEM_MODEL_SETUP_REGISTRATION_ID,
-#if defined(PCBTARANIS)
+#if defined(HARDWARE_INTERNAL_MODULE)
ITEM_MODEL_SETUP_INTERNAL_MODULE_LABEL,
ITEM_MODEL_SETUP_INTERNAL_MODULE_MODE,
ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS,
@@ -154,13 +154,14 @@ enum MenuModelSetupItems {
#define IF_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? (uint8_t)(xxx) : HIDDEN_ROW)
#define IF_NOT_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? HIDDEN_ROW : (uint8_t)(xxx))
-#if defined(PCBTARANIS)
+#if defined(HARDWARE_INTERNAL_MODULE)
#define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)
#define CURRENT_RECEIVER_EDITED(k) (k - (k >= ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL ? ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_1 : ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_1))
#elif defined(PCBSKY9X)
#define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_SETUP_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE)
#else
#define CURRENT_MODULE_EDITED(k) (EXTERNAL_MODULE)
+ #define CURRENT_RECEIVER_EDITED(k) (k - ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_1)
#endif
#if defined(PCBXLITE)
@@ -511,6 +512,24 @@ void onBluetoothConnectMenu(const char * result)
}
#endif
+#if defined(HARDWARE_INTERNAL_MODULE)
+ #define INTERNAL_MODULE_ROWS \
+ LABEL(InternalModule), \
+ INTERNAL_MODULE_MODE_ROWS, \
+ INTERNAL_MODULE_CHANNELS_ROWS, \
+ IF_NOT_PXX2_MODULE(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)), \
+ IF_PXX2_MODULE(INTERNAL_MODULE, 0), \
+ ANTENNA_ROW \
+ IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), \
+ IF_PXX2_MODULE(INTERNAL_MODULE, 1), \
+ IF_PXX2_MODULE(INTERNAL_MODULE, 0), \
+ IF_PXX2_MODULE(INTERNAL_MODULE, 0), \
+ IF_PXX2_MODULE(INTERNAL_MODULE, 0), \
+ IF_PXX2_MODULE(INTERNAL_MODULE, 0),
+#else
+ #define INTERNAL_MODULE_ROWS
+#endif
+
void menuModelSetup(event_t event)
{
#if defined(EXTERNAL_ANTENNA)
@@ -549,18 +568,7 @@ void menuModelSetup(event_t event)
uint8_t((isDefaultModelRegistrationID() || (warningText && popupFunc == runPopupRegister)) ? HIDDEN_ROW : READONLY_ROW), // Registration ID
- LABEL(InternalModule),
- INTERNAL_MODULE_MODE_ROWS, // module mode (PXX(2) / None)
- INTERNAL_MODULE_CHANNELS_ROWS, // Channels min and count
- IF_NOT_PXX2_MODULE(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)),
- IF_PXX2_MODULE(INTERNAL_MODULE, 0), // RxNum
- ANTENNA_ROW
- IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe
- IF_PXX2_MODULE(INTERNAL_MODULE, 1), // Range check and Register buttons
- IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Module options
- IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver 1
- IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver 2
- IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver 3
+ INTERNAL_MODULE_ROWS
LABEL(ExternalModule),
EXTERNAL_MODULE_MODE_ROWS,
@@ -1250,7 +1258,7 @@ void menuModelSetup(event_t event)
break;
#endif
-#if defined(PCBTARANIS)
+#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS:
#endif
#if defined(PCBSKY9X)
@@ -1452,7 +1460,9 @@ void menuModelSetup(event_t event)
case ITEM_MODEL_SETUP_EXTRA_MODULE_BIND:
#endif
#if defined(PCBTARANIS)
+#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_NPXX2_BIND:
+#endif
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NPXX2_BIND:
#endif
{
@@ -1620,7 +1630,7 @@ void menuModelSetup(event_t event)
}
#endif
-#if defined(PCBTARANIS)
+#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE:
#endif
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE: {
@@ -1862,7 +1872,7 @@ void menuModelSetup(event_t event)
// some field just finished being edited
if (old_editMode > 0 && s_editMode == 0) {
switch(menuVerticalPosition) {
-#if defined(PCBTARANIS)
+#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_NPXX2_BIND:
case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM:
if (menuHorizontalPosition == 0)
diff --git a/radio/src/gui/128x64/radio_diagkeys.cpp b/radio/src/gui/128x64/radio_diagkeys.cpp
index ce17b91b1..813459aa5 100644
--- a/radio/src/gui/128x64/radio_diagkeys.cpp
+++ b/radio/src/gui/128x64/radio_diagkeys.cpp
@@ -38,65 +38,44 @@ void menuRadioDiagKeys(event_t event)
{
SIMPLE_SUBMENU(STR_MENU_RADIO_SWITCHES, 1);
- lcdDrawText(14*FW, MENU_HEADER_HEIGHT+2*FH, STR_VTRIM);
+ lcdDrawText(14*FW, MENU_HEADER_HEIGHT + 1, STR_VTRIM);
for (uint8_t i=0; i<9; i++) {
coord_t y;
if (i < NUM_TRIMS_KEYS) {
- y = MENU_HEADER_HEIGHT + FH*3 + FH*(i/2);
+ y = MENU_HEADER_HEIGHT + 1 + FH + FH*(i/2);
if (i&1) lcdDraw1bitBitmap(14*FW, y, sticks, i/2, 0);
displayKeyState(i&1? 20*FW : 18*FW, y, TRM_BASE+i);
}
- if (i < TRM_BASE) {
-#if defined(PCBX7) || defined(PCBX9LITE)
- y = MENU_HEADER_HEIGHT + FH + FH*i;
- if (i >= 2) {
- // hide PLUS and MINUS virtual buttons
- lcdDrawTextAtIndex(0, y, STR_VKEYS, (TRM_BASE-1-i), 0);
- displayKeyState(5*FW+4, y, KEY_MENU+(TRM_BASE-1-i));
- }
-#elif defined(PCBXLITE)
- y = MENU_HEADER_HEIGHT + FH*i;
- lcdDrawTextAtIndex(0, y, STR_VKEYS, (TRM_BASE-1-i), 0);
- displayKeyState(5*FW+2, y, KEY_SHIFT+(TRM_BASE-1-i));
-#else
- y = MENU_HEADER_HEIGHT + FH + FH*i;
- lcdDrawTextAtIndex(0, y, STR_VKEYS, (TRM_BASE-1-i), 0);
- displayKeyState(5*FW+2, y, KEY_MENU+(TRM_BASE-1-i));
-#endif
+ if (i <= KEY_MAX) {
+ y = MENU_HEADER_HEIGHT + 1 + FH*i;
+ lcdDrawTextAtIndex(0, y, STR_VKEYS, i, 0);
+ displayKeyState(5*FW+2, y, i);
}
-#if defined(PCBTARANIS)
- if (i < NUM_SWITCHES) {
- if (SWITCH_EXISTS(i)) {
- getvalue_t val = getValue(MIXSRC_FIRST_SWITCH+i);
- getvalue_t sw = ((val < 0) ? 3*i+1 : ((val == 0) ? 3*i+2 : 3*i+3));
- drawSwitch(8*FW+4, y, sw, 0);
- }
- }
-#else
+#if defined(PCBSKY9X)
if (i != SW_ID0) {
y = MENU_HEADER_HEIGHT +i*FH - 2*FH;
drawSwitch(8*FW, y, i+1, 0);
displaySwitchState(11*FW+2, y, i);
}
+#else
+ if (i < NUM_SWITCHES) {
+ if (SWITCH_EXISTS(i)) {
+ y = MENU_HEADER_HEIGHT + 1 + FH*i;
+ getvalue_t val = getValue(MIXSRC_FIRST_SWITCH+i);
+ getvalue_t sw = ((val < 0) ? 3*i+1 : ((val == 0) ? 3*i+2 : 3*i+3));
+ drawSwitch(8*FW+4, y, sw, 0);
+ }
+ }
#endif
}
#if defined(ROTARY_ENCODER_NAVIGATION)
-#if defined(PCBX7) || defined(PCBX9LITE)
- coord_t y = MENU_HEADER_HEIGHT + FH;
- coord_t x = 6*FW+3;
- lcdDrawTextAtIndex(0, MENU_HEADER_HEIGHT + FH , STR_VRENCODERS, 0, 0);
- lcdDrawNumber(x, y, rotencValue, RIGHT);
-#else
- coord_t y = MENU_HEADER_HEIGHT;
- coord_t x = 19*FW;
- lcdDrawTextAtIndex(14*FW, y, STR_VRENCODERS, 0, 0);
- lcdDrawNumber(x, y, rotencValue, LEFT);
+ coord_t y = MENU_HEADER_HEIGHT + 1 + FH*KEY_COUNT;
+ lcdDrawText(0, y, STR_ROTARY_ENCODER);
+ lcdDrawNumber(5*FW+FWNUM+2, y, rotencValue, RIGHT);
#endif
-#endif
-
}
diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp
index 131d16901..8fa93badc 100644
--- a/radio/src/gui/128x64/radio_hardware.cpp
+++ b/radio/src/gui/128x64/radio_hardware.cpp
@@ -147,7 +147,11 @@ enum MenuRadioHardwareItems {
#endif
#if NUM_SWITCHES == 8
+#if defined(RADIO_T12)
+#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|HIDDEN_ROW, NAVIGATION_LINE_BY_LINE|HIDDEN_ROW
+#else
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
+#endif
#elif NUM_SWITCHES == 6
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
#elif NUM_SWITCHES == 5
diff --git a/radio/src/gui/128x64/radio_setup.cpp b/radio/src/gui/128x64/radio_setup.cpp
index 3f890d678..57763a4a6 100644
--- a/radio/src/gui/128x64/radio_setup.cpp
+++ b/radio/src/gui/128x64/radio_setup.cpp
@@ -365,7 +365,7 @@ void menuRadioSetup(event_t event)
SLIDER_5POS(y, g_eeGeneral.hapticStrength, STR_HAPTICSTRENGTH, event, attr);
break;
#endif
-
+
#if defined(GYRO)
case ITEM_SETUP_GYRO_LABEL:
lcdDrawTextAlignedLeft(y, STR_GYRO_LABEL);
@@ -395,7 +395,7 @@ void menuRadioSetup(event_t event)
}
break;
#endif
-
+
case ITEM_SETUP_CONTRAST:
lcdDrawTextAlignedLeft(y, STR_CONTRAST);
lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.contrast, attr|LEFT);
diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp
index ee638ef34..21fe0a908 100644
--- a/radio/src/gui/128x64/radio_version.cpp
+++ b/radio/src/gui/128x64/radio_version.cpp
@@ -22,7 +22,7 @@
#include "opentx.h"
// TODO duplicated code
-#if defined(PCBX7) || defined(PCBX9E) || defined(PCBX9LITE)
+#if defined(ROTARY_ENCODER_NAVIGATION)
#define EVT_KEY_NEXT_LINE EVT_ROTARY_RIGHT
#define EVT_KEY_PREVIOUS_LINE EVT_ROTARY_LEFT
#else
diff --git a/radio/src/gui/128x64/view_about.cpp b/radio/src/gui/128x64/view_about.cpp
index dec2f7f94..aaec50b32 100644
--- a/radio/src/gui/128x64/view_about.cpp
+++ b/radio/src/gui/128x64/view_about.cpp
@@ -2,7 +2,7 @@
* Copyright (C) OpenTX
*
* Based on code named
- * th9x - http://code.google.com/p/th9x
+ * th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
@@ -42,7 +42,7 @@ enum AboutScreens {
#define ABOUT_X 2
#define ABOUT_INDENT 4
-#if defined(PCBX7)
+#if defined(NAVIGATION_X7)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_LONG(KEY_PAGE)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE)
#else
diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp
index 000944fe8..a8edbde72 100644
--- a/radio/src/gui/128x64/view_main.cpp
+++ b/radio/src/gui/128x64/view_main.cpp
@@ -227,7 +227,7 @@ void displayVoltageOrAlarm()
#define displayVoltageOrAlarm() displayBattVoltage()
#endif
-#if defined(PCBX7) || defined(PCBX9LITE)
+#if defined(NAVIGATION_X7)
#define EVT_KEY_CONTEXT_MENU EVT_KEY_LONG(KEY_ENTER)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE)
#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT
@@ -235,7 +235,7 @@ void displayVoltageOrAlarm()
#define EVT_KEY_MODEL_MENU EVT_KEY_BREAK(KEY_MENU)
#define EVT_KEY_GENERAL_MENU EVT_KEY_LONG(KEY_MENU)
#define EVT_KEY_TELEMETRY EVT_KEY_LONG(KEY_PAGE)
-#elif defined(PCBXLITE)
+#elif defined(NAVIGATION_XLITE)
#define EVT_KEY_CONTEXT_MENU EVT_KEY_LONG(KEY_ENTER)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_UP)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_DOWN)
diff --git a/radio/src/gui/128x64/view_statistics.cpp b/radio/src/gui/128x64/view_statistics.cpp
index 73c1c7370..04cd7b2a6 100644
--- a/radio/src/gui/128x64/view_statistics.cpp
+++ b/radio/src/gui/128x64/view_statistics.cpp
@@ -31,14 +31,14 @@ void menuStatisticsView(event_t event)
switch (event) {
case EVT_KEY_FIRST(KEY_UP):
-#if defined(PCBX7)
+#if defined(NAVIGATION_X7)
case EVT_KEY_BREAK(KEY_PAGE):
#endif
chainMenu(menuStatisticsDebug);
break;
case EVT_KEY_FIRST(KEY_DOWN):
-#if defined(PCBX7)
+#if defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
killEvents(event);
chainMenu(menuStatisticsDebug2);
@@ -136,14 +136,14 @@ void menuStatisticsDebug(event_t event)
case EVT_KEY_FIRST(KEY_UP):
-#if defined(PCBX7)
+#if defined(NAVIGATION_X7)
case EVT_KEY_BREAK(KEY_PAGE):
chainMenu(menuStatisticsDebug2);
return;
#endif
case EVT_KEY_FIRST(KEY_DOWN):
-#if defined(PCBX7)
+#if defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
#endif
killEvents(event);
@@ -250,14 +250,14 @@ void menuStatisticsDebug2(event_t event)
break;
case EVT_KEY_FIRST(KEY_UP):
-#if defined(PCBX7)
+#if defined(NAVIGATION_X7)
case EVT_KEY_BREAK(KEY_PAGE):
#endif
chainMenu(menuStatisticsView);
return;
case EVT_KEY_FIRST(KEY_DOWN):
-#if defined(PCBX7)
+#if defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
#endif
killEvents(event);
diff --git a/radio/src/gui/128x64/view_telemetry.cpp b/radio/src/gui/128x64/view_telemetry.cpp
index 4889efd5a..3f5c51067 100644
--- a/radio/src/gui/128x64/view_telemetry.cpp
+++ b/radio/src/gui/128x64/view_telemetry.cpp
@@ -216,7 +216,7 @@ enum NavigationDirection {
#define decrTelemetryScreen() direction = up
#define incrTelemetryScreen() direction = down
-#if defined(PCBXLITE)
+#if defined(NAVIGATION_XLITE)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_LONG(KEY_LEFT)
#define EVT_KEY_NEXT_VIEW EVT_KEY_LONG(KEY_RIGHT)
#elif defined(PCBX7)
diff --git a/radio/src/gui/212x64/radio_diagkeys.cpp b/radio/src/gui/212x64/radio_diagkeys.cpp
index 88beb9b25..c6e48b57e 100644
--- a/radio/src/gui/212x64/radio_diagkeys.cpp
+++ b/radio/src/gui/212x64/radio_diagkeys.cpp
@@ -30,21 +30,36 @@ void menuRadioDiagKeys(event_t event)
{
SIMPLE_SUBMENU(STR_MENU_RADIO_SWITCHES, 1);
- lcdDrawText(14*FW, MENU_HEADER_HEIGHT+2*FH, STR_VTRIM);
+ lcdDrawText(14*FW, MENU_HEADER_HEIGHT + 1, STR_VTRIM);
for (uint8_t i=0; i<9; i++) {
coord_t y;
- if (i<8) {
- y = MENU_HEADER_HEIGHT + FH*3 + FH*(i/2);
+ if (i < NUM_TRIMS_KEYS) {
+ y = MENU_HEADER_HEIGHT + 1 + FH + FH*(i/2);
if (i&1) lcdDraw1bitBitmap(14*FW, y, sticks, i/2, 0);
displayKeyState(i&1? 20*FW : 18*FW, y, TRM_BASE+i);
}
- if (i<6) {
- y = i*FH+MENU_HEADER_HEIGHT+FH;
+ if (i <= KEY_MAX) {
+ y = MENU_HEADER_HEIGHT + 1 + FH*i;
lcdDrawTextAtIndex(0, y, STR_VKEYS, (5-i), 0);
- displayKeyState(5*FW+2, y, KEY_MENU+(5-i));
+ displayKeyState(5*FW+2, y, i);
+ }
+
+ if (i < NUM_SWITCHES) {
+ if (SWITCH_EXISTS(i)) {
+ y = MENU_HEADER_HEIGHT + 1 + FH*i;
+ getvalue_t val = getValue(MIXSRC_FIRST_SWITCH+i);
+ getvalue_t sw = ((val < 0) ? 3*i+1 : ((val == 0) ? 3*i+2 : 3*i+3));
+ drawSwitch(8*FW+4, y, sw, 0);
+ }
}
}
+
+#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);
+#endif
}
diff --git a/radio/src/gui/CMakeLists.txt b/radio/src/gui/CMakeLists.txt
index c3714b044..4027337ea 100644
--- a/radio/src/gui/CMakeLists.txt
+++ b/radio/src/gui/CMakeLists.txt
@@ -33,6 +33,9 @@ set(SRC
gui/navigation/common.cpp
)
+string(TOUPPER ${NAVIGATION_TYPE} NAVIGATION_TYPE)
+add_definitions(-DNAVIGATION_${NAVIGATION_TYPE})
+
include_directories(gui gui/${GUI_DIR})
if(GUI_DIR STREQUAL 128x64 OR GUI_DIR STREQUAL 212x64)
diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp
index 19dac046f..f6a6346b0 100644
--- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp
+++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp
@@ -269,7 +269,7 @@ void menuRadioSdManager(event_t _event)
menuVerticalOffset = reusableBuffer.sdManager.offset;
break;
-#if defined(PCBX9) || defined(PCBX7) // TODO NO_MENU_KEY
+#if defined(PCBX9) || defined(RADIO_X7) // TODO NO_MENU_KEY
case EVT_KEY_LONG(KEY_MENU):
if (SD_CARD_PRESENT() && !READ_ONLY() && s_editMode == 0) {
killEvents(_event);
diff --git a/radio/src/gui/common/stdlcd/view_text.cpp b/radio/src/gui/common/stdlcd/view_text.cpp
index 0a88cae4a..53519fac9 100644
--- a/radio/src/gui/common/stdlcd/view_text.cpp
+++ b/radio/src/gui/common/stdlcd/view_text.cpp
@@ -94,7 +94,7 @@ void readTextFile(int & lines_count)
}
}
-#if defined(PCBX7) || defined(PCBX9E)
+#if defined(ROTARY_ENCODER_NAVIGATION)
#define EVT_KEY_NEXT_LINE EVT_ROTARY_RIGHT
#define EVT_KEY_PREVIOUS_LINE EVT_ROTARY_LEFT
#else
diff --git a/radio/src/gui/navigation/navigation_xlite.cpp b/radio/src/gui/navigation/navigation_xlite.cpp
index 327c3d209..dabdbd437 100644
--- a/radio/src/gui/navigation/navigation_xlite.cpp
+++ b/radio/src/gui/navigation/navigation_xlite.cpp
@@ -29,6 +29,15 @@ horzpos_t menuHorizontalPosition;
int8_t checkIncDec_Ret;
+#if defined(RADIO_T12)
+#define DBLKEYS_PRESSED_RGT_LFT(in) ((in & (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_LEFT)) == (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_LEFT))
+// set to 0
+#define DBLKEYS_PRESSED_UP_DWN(in) ((in & (KEYS_GPIO_PIN_UP + KEYS_GPIO_PIN_DOWN)) == (KEYS_GPIO_PIN_UP + KEYS_GPIO_PIN_DOWN))
+// set to max
+#define DBLKEYS_PRESSED_RGT_UP(in) ((in & (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_UP)) == (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_UP))
+// set to min
+#define DBLKEYS_PRESSED_LFT_DWN(in) ((in & (KEYS_GPIO_PIN_LEFT + KEYS_GPIO_PIN_DOWN)) == (KEYS_GPIO_PIN_LEFT + KEYS_GPIO_PIN_DOWN))
+#else
// invert the value
#define DBLKEYS_PRESSED_RGT_LFT(in) ((in & ((1<= SCRIPT_GFUNC_FIRST) && g_model.noGlobalFunctions)
return false;
-
+
CustomFunctionData & fn = (ref < SCRIPT_GFUNC_FIRST ? g_model.customFn[index] : g_eeGeneral.customFn[index]);
if (fn.func == FUNC_PLAY_SCRIPT && ZEXIST(fn.play.name)) {
@@ -883,7 +883,7 @@ void luaDoOneRunStandalone(event_t evt)
standaloneScript.state = SCRIPT_NOFILE;
luaState = INTERPRETER_RELOAD_PERMANENT_SCRIPTS;
}
-#if !defined(PCBHORUS) && !defined(PCBXLITE)
+#if defined(KEYS_GPIO_REG_MENU)
// TODO find another key and add a #define
else if (evt == EVT_KEY_LONG(KEY_MENU)) {
killEvents(evt);
diff --git a/radio/src/lua/lua_api.h b/radio/src/lua/lua_api.h
index 62887b829..e47d58d5a 100644
--- a/radio/src/lua/lua_api.h
+++ b/radio/src/lua/lua_api.h
@@ -155,11 +155,9 @@ extern uint16_t maxLuaInterval;
extern uint16_t maxLuaDuration;
extern uint8_t instructionsPercent;
-#if defined(PCBXLITE)
- #define IS_MASKABLE(key) ((key) != KEY_EXIT && (key) != KEY_ENTER)
-#elif defined(PCBTARANIS)
+#if defined(KEYS_GPIO_REG_PAGE)
#define IS_MASKABLE(key) ((key) != KEY_EXIT && (key) != KEY_ENTER && ((luaState & INTERPRETER_RUNNING_STANDALONE_SCRIPT) || (key) != KEY_PAGE))
-#elif defined(PCBHORUS)
+#else
#define IS_MASKABLE(key) ((key) != KEY_EXIT && (key) != KEY_ENTER)
#endif
struct LuaField {
diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp
index 5486ad1b7..063de86ea 100644
--- a/radio/src/opentx.cpp
+++ b/radio/src/opentx.cpp
@@ -253,8 +253,10 @@ void generalDefault()
g_eeGeneral.switchConfig = (SWITCH_TOGGLE << 10) + (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0);
#elif defined(PCBXLITE)
g_eeGeneral.switchConfig = (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0);
-#elif defined(PCBX7)
+#elif defined(RADIO_X7)
g_eeGeneral.switchConfig = 0x000006ff; // 4x3POS, 1x2POS, 1xTOGGLE
+#elif defined(RADIO_T12)
+ g_eeGeneral.switchConfig = (SWITCH_2POS << 10) + (SWITCH_2POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0);
#elif defined(PCBX9LITE)
g_eeGeneral.switchConfig = (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0);
#elif defined(PCBTARANIS) || defined(PCBHORUS)
@@ -470,11 +472,14 @@ void modelDefault(uint8_t id)
}
#endif
-#if defined(PCBTARANIS) || defined(PCBHORUS)
+#if defined(HARDWARE_INTERNAL_MODULE)
g_model.moduleData[INTERNAL_MODULE].type = IS_PXX2_INTERNAL_ENABLED() ? MODULE_TYPE_ACCESS_ISRM : MODULE_TYPE_PXX_XJT;
g_model.moduleData[INTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(INTERNAL_MODULE);
#elif defined(PCBSKY9X)
g_model.moduleData[EXTERNAL_MODULE].type = MODULE_TYPE_PPM;
+#elif defined(RADIO_T12)
+ g_model.moduleData[EXTERNAL_MODULE].type = MODULE_TYPE_NONE;
+ g_model.moduleData[EXTERNAL_MODULE].type = MODULE_TYPE_MULTIMODULE;
#endif
#if defined(PCBXLITE)
diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h
index 2ac0e6e77..fb2734d46 100644
--- a/radio/src/sdcard.h
+++ b/radio/src/sdcard.h
@@ -131,7 +131,8 @@ const char * getBasename(const char * path);
#define OTX_FOURCC 0x3B78746F // otx for Taranis X-Lite S
#elif defined(PCBXLITE)
#define OTX_FOURCC 0x3978746F // otx for Taranis X-Lite
-#elif defined(PCBX7)
+ #define O9X_FOURCC 0x3978396F // o9x for Taranis X-Lite
+#elif defined(RADIO_X7)
#define OTX_FOURCC 0x3678746F // otx for Taranis X7
#elif defined(PCBX9LITE)
#define OTX_FOURCC 0x3C78746F // otx for Taranis X9-Lite
@@ -139,6 +140,10 @@ const char * getBasename(const char * path);
#define OTX_FOURCC 0x3378746F // otx for Taranis X9D
#elif defined(PCBSKY9X)
#define OTX_FOURCC 0x3278746F // otx for sky9x
+ #define O9X_FOURCC 0x3278396F // o9x for sky9x
+#elif defined(RADIO_T12)
+ #define OTX_FOURCC 0x3D78746F // otx for Jumper T12
+ #define O9X_FOURCC 0x3D78396F // o9x for Jumper T12
#endif
bool isFileAvailable(const char * filename, bool exclDir = false);
diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp
index 133cbbeba..8bbf98260 100644
--- a/radio/src/simu.cpp
+++ b/radio/src/simu.cpp
@@ -250,8 +250,10 @@ void Open9xSim::updateKeysAndSwitches(bool start)
KEY_Down, KEY_DOWN,
KEY_Right, KEY_RIGHT,
KEY_Left, KEY_LEFT,
-#elif defined(PCBXLITE)
+#elif defined(PCBXLITE) || defined(RADIO_T12)
+ #if defined(KEYS_GPIO_REG_SHIFT)
KEY_Shift_L, KEY_SHIFT,
+ #endif
KEY_Return, KEY_ENTER,
KEY_BackSpace, KEY_EXIT,
KEY_Right, KEY_RIGHT,
diff --git a/radio/src/strhelpers.cpp b/radio/src/strhelpers.cpp
index 527a437a6..a4a787883 100644
--- a/radio/src/strhelpers.cpp
+++ b/radio/src/strhelpers.cpp
@@ -272,7 +272,11 @@ char * getSwitchString(char * dest, swsrc_t idx)
if (swinfo.quot >= 5)
*s++ = 'H' + swinfo.quot - 5;
else if (swinfo.quot == 4)
+#if defined(RADIO_T12)
+ *s++ = 'G';
+#else
*s++ = 'F';
+#endif
else
*s++ = 'A'+swinfo.quot;
#else
diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt
index 39a16d29f..87bbe0ccb 100644
--- a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt
+++ b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt
@@ -85,7 +85,7 @@ set(BOOTLOADER_SRC
bin_files.cpp
)
-if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL X9LITE)
+if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL X9E OR (PCB STREQUAL X7 AND NOT (PCBREV STREQUAL T12)) OR PCB STREQUAL X9LITE)
set(BOOTLOADER_SRC
${BOOTLOADER_SRC}
../../../../../targets/common/arm/stm32/rotary_encoder_driver.cpp
diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt
index 763ed0080..5161192e3 100644
--- a/radio/src/targets/horus/CMakeLists.txt
+++ b/radio/src/targets/horus/CMakeLists.txt
@@ -1,7 +1,7 @@
option(DISK_CACHE "Enable SD card disk cache" YES)
option(UNEXPECTED_SHUTDOWN "Enable the Unexpected Shutdown screen" YES)
option(PXX1 "PXX1 protocol support" ON)
-option(PXX2 "PXX2 protocol support" ON)
+option(PXX2 "PXX2 protocol support" OFF)
set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)")
set(CPU_TYPE STM32F4)
diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp
index 8eba192a9..5d3fc51c0 100644
--- a/radio/src/targets/simu/simpgmspace.cpp
+++ b/radio/src/targets/simu/simpgmspace.cpp
@@ -208,6 +208,13 @@ void simuSetKey(uint8_t key, bool state)
KEY_CASE(KEY_LEFT, KEYS_GPIO_REG_LEFT, KEYS_GPIO_PIN_LEFT)
KEY_CASE(KEY_UP, KEYS_GPIO_REG_UP, KEYS_GPIO_PIN_UP)
KEY_CASE(KEY_DOWN, KEYS_GPIO_REG_DOWN, KEYS_GPIO_PIN_DOWN)
+#elif defined(RADIO_T12)
+ KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_EXIT, KEYS_GPIO_PIN_EXIT)
+ KEY_CASE(KEY_ENTER, KEYS_GPIO_REG_ENTER, KEYS_GPIO_PIN_ENTER)
+ KEY_CASE(KEY_RIGHT, KEYS_GPIO_REG_RIGHT, KEYS_GPIO_PIN_RIGHT)
+ KEY_CASE(KEY_LEFT, KEYS_GPIO_REG_LEFT, KEYS_GPIO_PIN_LEFT)
+ KEY_CASE(KEY_UP, KEYS_GPIO_REG_UP, KEYS_GPIO_PIN_UP)
+ KEY_CASE(KEY_DOWN, KEYS_GPIO_REG_DOWN, KEYS_GPIO_PIN_DOWN)
#elif defined(PCBTARANIS)
KEY_CASE(KEY_MENU, KEYS_GPIO_REG_MENU, KEYS_GPIO_PIN_MENU)
KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_EXIT, KEYS_GPIO_PIN_EXIT)
diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h
index 8d3773a1b..9350ff54f 100644
--- a/radio/src/targets/sky9x/board.h
+++ b/radio/src/targets/sky9x/board.h
@@ -63,6 +63,9 @@ enum EnumKeys
KEY_RIGHT,
KEY_LEFT,
+ KEY_COUNT,
+ KEY_MAX = KEY_COUNT - 1,
+
TRM_BASE,
TRM_LH_DWN = TRM_BASE,
TRM_LH_UP,
diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt
index 03fff3ef9..a3bbbf735 100644
--- a/radio/src/targets/taranis/CMakeLists.txt
+++ b/radio/src/targets/taranis/CMakeLists.txt
@@ -4,7 +4,7 @@ option(INTERNAL_MODULE_PPM "Support for PPM internal module hack" OFF)
option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module replacement" OFF)
option(USEHORUSBT "X9E BT module replaced by Horus BT module" OFF)
option(PXX1 "PXX1 protocol support" ON)
-option(PXX2 "PXX2 protocol support" ON)
+option(PXX2 "PXX2 protocol support" OFF)
if(PCB STREQUAL X9E)
set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)")
@@ -74,13 +74,22 @@ elseif(PCB STREQUAL X7)
set(CPU_TYPE_FULL STM32F205xE) # for size report
set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld)
set(HAPTIC YES)
- set(LUA_EXPORT lua_export_x7)
- set(FLAVOUR x7)
+ if(PCBREV STREQUAL T12)
+ set(LUA_EXPORT lua_export_t12)
+ set(FLAVOUR t12)
+ set(NAVIGATION_TYPE xlite)
+ set(MULTIMODULE ON)
+ add_definitions(-DRADIO_T12)
+ else()
+ set(LUA_EXPORT lua_export_x7)
+ set(FLAVOUR x7)
+ set(NAVIGATION_TYPE x7)
+ add_definitions(-DRADIO_X7)
+ endif()
add_definitions(-DPCBX7 -DSOFTWARE_VOLUME)
add_definitions(-DEEPROM_VARIANT=0x4000)
add_definitions(-DPWR_BUTTON_${PWR_BUTTON})
set(GUI_DIR 128x64)
- set(NAVIGATION_TYPE x7)
set(BITMAPS_TARGET 9x_bitmaps)
set(FONTS_TARGET 9x_fonts_1bit)
set(LCD_DRIVER lcd_driver_spi.cpp)
@@ -98,7 +107,7 @@ elseif(PCB STREQUAL X9LITE)
add_definitions(-DBOARD_NAME="x9lite")
add_definitions(-DPCBX9LITE -DPCBX9 -DSOFTWARE_VOLUME)
add_definitions(-DEEPROM_VARIANT=0x0800)
- add_definitions(-DPWR_BUTTON_${PWR_BUTTON})
+ set(PXX2 ON)
set(GUI_DIR 128x64)
set(NAVIGATION_TYPE x7)
set(BITMAPS_TARGET 9x_bitmaps)
@@ -144,6 +153,7 @@ elseif(PCB STREQUAL XLITES)
set(LCD_DRIVER lcd_driver_spi.cpp)
set(GVAR_SCREEN model_gvars.cpp)
set(STATUS_LEDS YES)
+ set(PXX2 ON)
endif()
if(PCB STREQUAL XLITES)
@@ -185,7 +195,7 @@ if(NOT PCB STREQUAL XLITE)
)
endif()
-if(PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL X9LITE)
+if(PCB STREQUAL X9E OR (PCB STREQUAL X7 AND NOT (PCBREV STREQUAL T12)) OR PCB STREQUAL X9LITE)
set(TARGET_SRC
${TARGET_SRC}
../common/arm/stm32/rotary_encoder_driver.cpp
diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h
index b91b64378..989a71233 100644
--- a/radio/src/targets/taranis/board.h
+++ b/radio/src/targets/taranis/board.h
@@ -94,6 +94,13 @@ extern "C" {
}
#endif
+#if defined(PCBX9E) || defined(RADIO_X7) || defined(PCBX9LITE)
+// Rotary Encoder driver
+#define ROTARY_ENCODER_NAVIGATION
+void rotaryEncoderInit(void);
+void rotaryEncoderCheck(void);
+#endif
+
#define FLASHSIZE 0x80000
#define BOOTLOADER_SIZE 0x8000
#define FIRMWARE_ADDRESS 0x08000000
@@ -184,7 +191,11 @@ uint32_t isBootloaderStart(const uint8_t * buffer);
#define EXTERNAL_MODULE_OFF() EXTERNAL_MODULE_PWR_OFF()
#endif
+#if defined(RADIO_T12)
+#define IS_INTERNAL_MODULE_ON() false
+#else
#define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) == Bit_SET)
+#endif
void init_ppm(uint8_t module);
void disable_ppm(uint8_t module);
@@ -263,24 +274,45 @@ int sbusGetByte(uint8_t * byte);
// Keys driver
enum EnumKeys
{
-#if defined(PCBXLITE)
+#if defined(KEYS_GPIO_REG_SHIFT)
KEY_SHIFT,
-#else
+#endif
+
+#if defined(KEYS_GPIO_REG_MENU)
KEY_MENU,
#endif
+
KEY_EXIT,
KEY_ENTER,
-#if defined(PCBXLITE)
+
+#if defined(KEYS_GPIO_REG_DOWN)
KEY_DOWN,
KEY_UP,
+#endif
+
+#if defined(KEYS_GPIO_REG_RIGHT)
KEY_RIGHT,
KEY_LEFT,
-#else
+#endif
+
+#if defined(KEYS_GPIO_REG_PAGE)
KEY_PAGE,
+#endif
+
+#if defined(KEYS_GPIO_REG_PLUS)
KEY_PLUS,
KEY_MINUS,
#endif
+ KEY_COUNT,
+ KEY_MAX = KEY_COUNT - 1,
+
+#if defined(ROTARY_ENCODER_NAVIGATION)
+ KEY_PLUS,
+ KEY_MINUS,
+#endif
+
+
TRM_BASE,
TRM_LH_DWN = TRM_BASE,
TRM_LH_UP,
@@ -300,7 +332,7 @@ enum EnumKeys
#define KEY_DOWN KEY_PLUS
#define KEY_RIGHT KEY_PLUS
#define KEY_LEFT KEY_MINUS
-#elif defined(PCBXLITE)
+#elif defined(NAVIGATION_XLITE)
#define KEY_PLUS KEY_RIGHT
#define KEY_MINUS KEY_LEFT
#else
@@ -435,13 +467,6 @@ uint32_t readTrims(void);
#define TRIMS_PRESSED() (readTrims())
#define KEYS_PRESSED() (readKeys())
-#if defined(PCBX9E) || defined(PCBX7) || defined(PCBX9LITE)
-// Rotary Encoder driver
-#define ROTARY_ENCODER_NAVIGATION
-void rotaryEncoderInit(void);
-void rotaryEncoderCheck(void);
-#endif
-
// WDT driver
#define WDTO_500MS 500
#if defined(WATCHDOG_DISABLED) || defined(SIMU)
diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h
index 2b8dddd0a..8b5ae6377 100644
--- a/radio/src/targets/taranis/hal.h
+++ b/radio/src/targets/taranis/hal.h
@@ -46,7 +46,20 @@
#define KEYS_GPIO_PIN_LEFT GPIO_Pin_12 // PE.12
#define KEYS_GPIO_REG_RIGHT GPIOE->IDR
#define KEYS_GPIO_PIN_RIGHT GPIO_Pin_13 // PE.13
-#elif defined(PCBX7)
+#elif defined(RADIO_T12)
+ #define KEYS_GPIO_REG_EXIT GPIOD->IDR
+ #define KEYS_GPIO_PIN_EXIT GPIO_Pin_2 // PD.02
+ #define KEYS_GPIO_REG_ENTER GPIOE->IDR
+ #define KEYS_GPIO_PIN_ENTER GPIO_Pin_10 // PE.10
+ #define KEYS_GPIO_REG_UP GPIOE->IDR
+ #define KEYS_GPIO_PIN_UP GPIO_Pin_9 // PE.09
+ #define KEYS_GPIO_REG_DOWN GPIOE->IDR
+ #define KEYS_GPIO_PIN_DOWN GPIO_Pin_11 // PE.11
+ #define KEYS_GPIO_REG_LEFT GPIOD->IDR
+ #define KEYS_GPIO_PIN_LEFT GPIO_Pin_7 // PD.07
+ #define KEYS_GPIO_REG_RIGHT GPIOD->IDR
+ #define KEYS_GPIO_PIN_RIGHT GPIO_Pin_3 // PD.03
+#elif defined(RADIO_X7)
#define KEYS_GPIO_REG_PAGE GPIOD->IDR
#define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03
#define KEYS_GPIO_REG_MENU GPIOD->IDR
@@ -92,7 +105,7 @@
#define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOD
#define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource12
#define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource13
-#elif defined(PCBX7)
+#elif defined(RADIO_X7)
#define ROTARY_ENCODER_GPIO GPIOE
#define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_9 // PE.09
#define ROTARY_ENCODER_GPIO_PIN_B GPIO_Pin_11 // PE.11
@@ -121,7 +134,7 @@
#endif
// This is for SIMU: reuse rotary encoder pins to map UP and DOWN keyboard keys
-#if defined(SIMU) && (defined(PCBX9E) || defined(PCBX7) || defined(PCBX9LITE))
+#if defined(SIMU) && defined(ROTARY_ENCODER_NAVIGATION)
#define KEYS_GPIO_REG_PLUS ROTARY_ENCODER_GPIO->IDR
#define KEYS_GPIO_PIN_PLUS ROTARY_ENCODER_GPIO_PIN_A
#define KEYS_GPIO_REG_MINUS ROTARY_ENCODER_GPIO->IDR
@@ -353,8 +366,11 @@
#define SWITCHES_GPIO_PIN_G_H GPIO_Pin_3 // PF.03
#define SWITCHES_GPIO_REG_G_L GPIOF->IDR
#define SWITCHES_GPIO_PIN_G_L GPIO_Pin_4 // PF.04
-#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE)
+#elif defined(RADIO_X7) || defined(PCBXLITE) || defined(PCBX9LITE)
// no SWG
+#elif defined(RADIO_T12)
+ #define SWITCHES_GPIO_REG_G GPIOE->IDR
+ #define SWITCHES_GPIO_PIN_G GPIO_Pin_14 // PE.14
#else
#define SWITCHES_GPIO_REG_G_H GPIOE->IDR
#define SWITCHES_GPIO_PIN_G_H GPIO_Pin_9 // PE.09
@@ -457,7 +473,13 @@
#define KEYS_GPIOB_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5)
#define KEYS_GPIOC_PINS (GPIO_Pin_4 | GPIO_Pin_5)
#define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14)
-#elif defined(PCBX7)
+#elif defined(RADIO_T12)
+ #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE)
+ #define KEYS_GPIOA_PINS SWITCHES_GPIO_PIN_B_H
+ #define KEYS_GPIOC_PINS (TRIMS_GPIO_PIN_LHR | TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU)
+ #define KEYS_GPIOD_PINS (TRIMS_GPIO_PIN_LHL | KEYS_GPIO_PIN_EXIT | KEYS_GPIO_PIN_LEFT | KEYS_GPIO_PIN_RIGHT | SWITCHES_GPIO_PIN_C_L | SWITCHES_GPIO_PIN_H)
+ #define KEYS_GPIOE_PINS (KEYS_GPIO_PIN_UP | KEYS_GPIO_PIN_DOWN | KEYS_GPIO_PIN_ENTER | TRIMS_GPIO_PIN_RHR | TRIMS_GPIO_PIN_RHL | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | SWITCHES_GPIO_PIN_C_H | SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_D_H | SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_A_L | SWITCHES_GPIO_PIN_A_H | SWITCHES_GPIO_PIN_G)
+#elif defined(RADIO_X7)
#define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE)
#define KEYS_GPIOA_PINS SWITCHES_GPIO_PIN_B_H
#define KEYS_GPIOC_PINS (TRIMS_GPIO_PIN_LHR | TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU | SWITCHES_GPIO_PIN_I | SWITCHES_GPIO_PIN_J)
@@ -701,7 +723,9 @@
#endif
// Internal Module
-#define HARDWARE_INTERNAL_MODULE
+#if !defined(RADIO_T12)
+ #define HARDWARE_INTERNAL_MODULE
+#endif
#if !(defined(PCBXLITES) && !defined(PCBX9LITE))
#define INTERNAL_MODULE_PXX1
#endif
@@ -739,7 +763,7 @@
// #define INTMODULE_TIMER_IRQn TIM3_IRQn
// #define INTMODULE_TIMER_IRQHandler TIM3_IRQHandler
// #define INTMODULE_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
-#elif defined(PCBX9E) || defined(PCBX9DP) || defined(PCBX7)
+#elif defined(PCBX9E) || defined(PCBX9DP) || defined(RADIO_X7)
#define INTMODULE_PULSES
#define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2)
#define INTMODULE_RCC_APB1Periph 0
@@ -759,6 +783,27 @@
#define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream5_IRQHandler
#define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF5
#define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
+#elif defined(RADIO_T12)
+ //left here is somebody will mod the radio for internal module
+ #define INTMODULE_PULSES
+ #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2)
+ #define INTMODULE_RCC_APB1Periph 0
+ #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM1
+ #define INTMODULE_PWR_GPIO GPIOC
+ #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_6 // JUMPER INT PC.06 //X7 INT is PC.06
+ #define INTMODULE_TX_GPIO GPIOA
+ #define INTMODULE_TX_GPIO_PIN GPIO_Pin_7 // JUMPER INT PA.07 //X7 INT is PA.10
+ #define INTMODULE_TX_GPIO_PinSource GPIO_PinSource10
+ #define INTMODULE_TIMER TIM1
+ #define INTMODULE_TIMER_CC_IRQn TIM1_CC_IRQn
+ #define INTMODULE_TIMER_CC_IRQHandler TIM1_CC_IRQHandler
+ #define INTMODULE_TX_GPIO_AF GPIO_AF_TIM1
+ #define INTMODULE_DMA_CHANNEL DMA_Channel_6
+ #define INTMODULE_DMA_STREAM DMA2_Stream5
+ #define INTMODULE_DMA_STREAM_IRQn DMA2_Stream5_IRQn
+ #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream5_IRQHandler
+ #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF5
+ #define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#else
#define INTMODULE_PULSES
#define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
@@ -823,6 +868,30 @@
#define EXTMODULE_USART_DMA_CHANNEL DMA_Channel_5
#define EXTMODULE_USART_DMA_STREAM DMA2_Stream6
#define EXTMODULE_USART_DMA_STREAM_IRQn DMA2_Stream6_IRQn
+#elif defined(RADIO_T12)
+ //Jumper T12v2 external module configured
+ #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
+ #define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM8
+ #define EXTMODULE_PWR_GPIO GPIOD
+ #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // JUMPER EXT PD.08 // X7 EXT is PD.08
+ #define EXTERNAL_MODULE_PWR_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN)
+ #define EXTERNAL_MODULE_PWR_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN)
+ #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET)
+ #define EXTMODULE_TX_GPIO GPIOA
+ #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_7 // JUMPER EXT PA.07 // X7 EXT is PA.07
+ #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource7
+ #define EXTMODULE_TIMER TIM8
+ #define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH1N
+ #define EXTMODULE_TIMER_CC_IRQn TIM8_CC_IRQn
+ #define EXTMODULE_TIMER_CC_IRQHandler TIM8_CC_IRQHandler
+ #define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7
+ #define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1
+ #define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream1_IRQn
+ #define EXTMODULE_TIMER_DMA_STREAM_IRQHandler DMA2_Stream1_IRQHandler
+ #define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF1
+ #define EXTMODULE_TIMER_OUTPUT_ENABLE TIM_CCER_CC1NE
+ #define EXTMODULE_TIMER_OUTPUT_POLARITY TIM_CCER_CC1NP
+ #define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#else
#define EXTMODULE_PULSES
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
@@ -947,11 +1016,11 @@
#define TELEMETRY_DIR_GPIO GPIOD
#define TELEMETRY_DIR_GPIO_PIN GPIO_Pin_4 // PD.04
#if defined(PCBXLITE) || defined(PCBX9LITE)
-#define TELEMETRY_DIR_OUTPUT() TELEMETRY_DIR_GPIO->BSRRH = TELEMETRY_DIR_GPIO_PIN
-#define TELEMETRY_DIR_INPUT() TELEMETRY_DIR_GPIO->BSRRL = TELEMETRY_DIR_GPIO_PIN
+ #define TELEMETRY_DIR_OUTPUT() TELEMETRY_DIR_GPIO->BSRRH = TELEMETRY_DIR_GPIO_PIN
+ #define TELEMETRY_DIR_INPUT() TELEMETRY_DIR_GPIO->BSRRL = TELEMETRY_DIR_GPIO_PIN
#else
-#define TELEMETRY_DIR_OUTPUT() TELEMETRY_DIR_GPIO->BSRRL = TELEMETRY_DIR_GPIO_PIN
-#define TELEMETRY_DIR_INPUT() TELEMETRY_DIR_GPIO->BSRRH = TELEMETRY_DIR_GPIO_PIN
+ #define TELEMETRY_DIR_OUTPUT() TELEMETRY_DIR_GPIO->BSRRL = TELEMETRY_DIR_GPIO_PIN
+ #define TELEMETRY_DIR_INPUT() TELEMETRY_DIR_GPIO->BSRRH = TELEMETRY_DIR_GPIO_PIN
#endif
#define TELEMETRY_GPIO GPIOD
#define TELEMETRY_TX_GPIO_PIN GPIO_Pin_5 // PD.05
@@ -1399,4 +1468,4 @@
#define TIMER_2MHz_RCC_APB1Periph RCC_APB1Periph_TIM7
#define TIMER_2MHz_TIMER TIM7
-#endif // _HAL_H_
+#endif // _HAL_H_
\ No newline at end of file
diff --git a/radio/src/targets/taranis/lcd_driver_spi.cpp b/radio/src/targets/taranis/lcd_driver_spi.cpp
index 576d767c3..d04a6e1e0 100644
--- a/radio/src/targets/taranis/lcd_driver_spi.cpp
+++ b/radio/src/targets/taranis/lcd_driver_spi.cpp
@@ -2,7 +2,7 @@
* Copyright (C) OpenTX
*
* Based on code named
- * th9x - http://code.google.com/p/th9x
+ * th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
@@ -20,7 +20,11 @@
#include "opentx.h"
-#define LCD_CONTRAST_OFFSET 160
+#if defined(RADIO_T12)
+ #define LCD_CONTRAST_OFFSET -10
+#else
+ #define LCD_CONTRAST_OFFSET 160
+#endif
#define RESET_WAIT_DELAY_MS 300 // Wait time after LCD reset before first command
#define WAIT_FOR_DMA_END() do { } while (lcd_busy)
@@ -61,9 +65,9 @@ void lcdHardwareInit()
LCD_SPI->CR2 = 0;
LCD_SPI->CR1 |= SPI_CR1_MSTR; // Make sure in case SSM/SSI needed to be set first
LCD_SPI->CR1 |= SPI_CR1_SPE;
-
+
LCD_NCS_HIGH();
-
+
GPIO_InitStructure.GPIO_Pin = LCD_NCS_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
@@ -81,7 +85,7 @@ void lcdHardwareInit()
GPIO_InitStructure.GPIO_Pin = LCD_CLK_GPIO_PIN | LCD_MOSI_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(LCD_SPI_GPIO, &GPIO_InitStructure);
-
+
GPIO_PinAFConfig(LCD_SPI_GPIO, LCD_MOSI_GPIO_PinSource, LCD_GPIO_AF);
GPIO_PinAFConfig(LCD_SPI_GPIO, LCD_CLK_GPIO_PinSource, LCD_GPIO_AF);
@@ -103,6 +107,20 @@ void lcdHardwareInit()
#if LCD_W == 128
void lcdStart()
{
+#if defined(RADIO_T12)
+ // Jumper has the screen inverted.
+ lcdWriteCommand(0xe2); // (14) Soft reset
+ lcdWriteCommand(0xa0); // Set seg
+ lcdWriteCommand(0xc8); // Set com
+ lcdWriteCommand(0xf8); // Set booster
+ lcdWriteCommand(0x00); // 5x
+ lcdWriteCommand(0xa3); // Set bias=1/6
+ lcdWriteCommand(0x22); // Set internal rb/ra=5.0
+ lcdWriteCommand(0x2f); // All built-in power circuits on
+ lcdWriteCommand(0x24); // Set contrast
+ lcdWriteCommand(0x36); // Set Vop
+ lcdWriteCommand(0xa6); // Set display mode
+#else
lcdWriteCommand(0xe2); // (14) Soft reset
lcdWriteCommand(0xa1); // Set seg
lcdWriteCommand(0xc0); // Set com
@@ -114,6 +132,7 @@ void lcdStart()
lcdWriteCommand(0x81); // Set contrast
lcdWriteCommand(0x36); // Set Vop
lcdWriteCommand(0xa6); // Set display mode
+#endif
}
#else
void lcdStart()
@@ -155,7 +174,7 @@ void lcdWriteAddress(uint8_t x, uint8_t y)
{
lcdWriteCommand(x & 0x0F); // Set Column Address LSB CA[3:0]
lcdWriteCommand((x>>4) | 0x10); // Set Column Address MSB CA[7:4]
-
+
lcdWriteCommand((y&0x0F) | 0x60); // Set Row Address LSB RA [3:0]
lcdWriteCommand(((y>>4) & 0x0F) | 0x70); // Set Row Address MSB RA [7:4]
}
@@ -181,8 +200,10 @@ void lcdRefresh(bool wait)
for (uint8_t y=0; y < 8; y++, p+=LCD_W) {
lcdWriteCommand(0x10); // Column addr 0
lcdWriteCommand(0xB0 | y); // Page addr y
+#if !defined(RADIO_T12)
lcdWriteCommand(0x04);
-
+#endif
+
LCD_NCS_LOW();
LCD_A0_HIGH();
@@ -192,7 +213,7 @@ void lcdRefresh(bool wait)
LCD_DMA_Stream->M0AR = (uint32_t)p;
LCD_DMA_Stream->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA & TC interrupts
LCD_SPI->CR2 |= SPI_CR2_TXDMAEN;
-
+
WAIT_FOR_DMA_END();
LCD_NCS_HIGH();
@@ -204,7 +225,7 @@ void lcdRefresh(bool wait)
lcd_busy = true;
lcdWriteAddress(0, 0);
-
+
LCD_NCS_LOW();
LCD_A0_HIGH();
@@ -300,7 +321,7 @@ void lcdInitFinish()
The longer initialization time seems to only be needed for regular Taranis,
the Taranis Plus (9XE) has been tested to work without any problems at -18 deg Celsius.
Therefore the delay for T+ is lower.
-
+
If radio is reset by watchdog or boot-loader the wait is skipped, but the LCD
is initialized in any case.
@@ -316,7 +337,7 @@ void lcdInitFinish()
delay_ms(RESET_WAIT_DELAY_MS);
#endif
}
-
+
lcdStart();
lcdWriteCommand(0xAF); // dc2=1, IC into exit SLEEP MODE, dc3=1 gray=ON, dc4=1 Green Enhanc mode disabled
delay_ms(20); // needed for internal DC-DC converter startup
@@ -331,7 +352,7 @@ void lcdSetRefVolt(uint8_t val)
#if LCD_W != 128
WAIT_FOR_DMA_END();
#endif
-
+
lcdWriteCommand(0x81); // Set Vop
lcdWriteCommand(val+LCD_CONTRAST_OFFSET); // 0-255
}
diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp
index 632f0a8bb..57996e222 100644
--- a/radio/src/translations.cpp
+++ b/radio/src/translations.cpp
@@ -416,6 +416,7 @@ const char STR_GLOBAL_VAR[] = TR_GLOBAL_VAR;
const char STR_OWN[] = TR_OWN;
const char STR_DATE[] = TR_DATE;
const char STR_CHANNELS_MONITOR[] = TR_CHANNELS_MONITOR;
+const char STR_ROTARY_ENCODER[] = TR_ROTARY_ENCODER;
const char STR_MIXERS_MONITOR[] = TR_MIXERS_MONITOR;
const char STR_PATH_TOO_LONG[] = TR_PATH_TOO_LONG;
const char STR_VIEW_TEXT[] = TR_VIEW_TEXT;
diff --git a/radio/src/translations.h b/radio/src/translations.h
index 62ae35b04..4b42d33d1 100644
--- a/radio/src/translations.h
+++ b/radio/src/translations.h
@@ -597,6 +597,7 @@ extern const char STR_GVARS[];
extern const char STR_GLOBAL_VAR[];
extern const char STR_OWN[];
extern const char STR_DATE[];
+extern const char STR_ROTARY_ENCODER[];
extern const char STR_CHANNELS_MONITOR[];
extern const char STR_MIXERS_MONITOR[];
extern const char STR_PATH_TOO_LONG[];
diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt
index f926036a8..d990c6873 100644
--- a/radio/src/translations/cz.h.txt
+++ b/radio/src/translations/cz.h.txt
@@ -359,6 +359,9 @@
#if defined(PCBHORUS)
#define LEN_VKEYS "\006"
#define TR_VKEYS "Menu\0 ""Exit\0 ""Enter\0""Nahoru""Dolů\0 ""Vpravo""Vlevo"
+#elif defined(RADIO_T12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Mínus"
diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt
index b75bd5f07..ce85c99af 100644
--- a/radio/src/translations/de.h.txt
+++ b/radio/src/translations/de.h.txt
@@ -377,14 +377,17 @@
#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0"
#if defined(PCBHORUS)
-#define LEN_VKEYS "\006"
-#define TR_VKEYS "Menu\0 ""Exit\0 ""Enter\0""Up\0 ""Down\0 ""Right\0""Left"
+ #define LEN_VKEYS "\006"
+ #define TR_VKEYS "Menu\0 ""Exit\0 ""Enter\0""Up\0 ""Down\0 ""Right\0""Left"
+#elif defined(RADIO_T12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(PCBTARANIS)
-#define LEN_VKEYS "\005"
-#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
#else
-#define LEN_VKEYS "\005"
-#define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0"
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0"
#endif
#define LEN_VRENCODERS "\003"
diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt
index 35cc79e9e..a4711e3de 100644
--- a/radio/src/translations/en.h.txt
+++ b/radio/src/translations/en.h.txt
@@ -365,6 +365,9 @@
#elif defined(PCBXLITE)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(RADIO_T12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
@@ -884,7 +887,7 @@
#define TR_OWN "Own"
#define TR_DATE "Date"
#define TR_MONTHS { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
-#define TR_ROTARY_ENCODER "R.Encs"
+#define TR_ROTARY_ENCODER "R.E."
#define TR_CHANNELS_MONITOR "CHANNELS MONITOR"
#define TR_MIXERS_MONITOR "MIXERS MONITOR"
#define TR_PATH_TOO_LONG "Path too long"
diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt
index f066b56b6..aea800a1f 100644
--- a/radio/src/translations/es.h.txt
+++ b/radio/src/translations/es.h.txt
@@ -374,8 +374,22 @@
#define LEN_VSWASHTYPE "\004"
#define TR_VSWASHTYPE "---\0""120\0""120X""140\0""90\0"
-#define LEN_VKEYS "\005"
-#define TR_VKEYS TR("Menu\0""Salir""Abajo""Arrib""Dcha.""Izqd.", "Menu\0""Salir""Enter""Pgna.""Mas\0 ""Menos")
+#if defined(PCBHORUS)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Enter""Up\0 ""Down\0""Right""Left\0"
+#elif defined(PCBXLITE)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(RADIO_T12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(PCBTARANIS)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
+#else
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0"
+#endif
#define LEN_VRENCODERS "\003"
#define TR_VRENCODERS "REa""REb"
@@ -893,7 +907,7 @@
#define TR_OWN "Propio"
#define TR_DATE "Fecha"
#define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
-#define TR_ROTARY_ENCODER "R.Encs"
+#define TR_ROTARY_ENCODER "R.E."
#define TR_CHANNELS_MONITOR "MONITOR CANALES"
#define TR_MIXERS_MONITOR "MIXERS MONITOR"
#define TR_PATH_TOO_LONG "Path too long"
diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt
index c00319310..5f51ca905 100644
--- a/radio/src/translations/fi.h.txt
+++ b/radio/src/translations/fi.h.txt
@@ -374,8 +374,22 @@
#define LEN_VSWASHTYPE "\004"
#define TR_VSWASHTYPE "---\0""120\0""120X""140\0""90\0"
-#define LEN_VKEYS "\005"
-#define TR_VKEYS TR("Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0", "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus")
+#if defined(PCBHORUS)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Enter""Up\0 ""Down\0""Right""Left\0"
+#elif defined(PCBXLITE)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(RADIO_T12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(PCBTARANIS)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
+#else
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0"
+#endif
#define LEN_VRENCODERS "\003"
#define TR_VRENCODERS "REa""REb"
@@ -886,7 +900,7 @@
#define TR_OWN "Own"
#define TR_DATE "Date"
#define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
-#define TR_ROTARY_ENCODER "R.Encs"
+#define TR_ROTARY_ENCODER "R.E."
#define TR_CHANNELS_MONITOR "CHANNELS MONITOR"
#define TR_MIXERS_MONITOR "MIXERS MONITOR"
#define TR_PATH_TOO_LONG "Path too long"
diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt
index 4cd56f5c5..93da75f89 100644
--- a/radio/src/translations/fr.h.txt
+++ b/radio/src/translations/fr.h.txt
@@ -382,6 +382,9 @@
#elif defined(PCBXLITE)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Shift""Exit\0""Enter""Bas\0 ""Haut\0""Droit""Gauch"
+#elif defined(RADIO_T12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Moins"
diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt
index 22a8009fe..db7d7989d 100644
--- a/radio/src/translations/it.h.txt
+++ b/radio/src/translations/it.h.txt
@@ -376,8 +376,22 @@
#define LEN_VSWASHTYPE "\004"
#define TR_VSWASHTYPE "---\0""120\0""120X""140\0""90\0"
-#define LEN_VKEYS "\005"
-#define TR_VKEYS TR("Menù\0""EXIT\0""DN\0 ""UP\0 ""SX\0 ""DX\0 ", "Menu\0""Esci\0""Enter""Pag.\0""Più\0 ""Meno")
+#if defined(PCBHORUS)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Enter""Up\0 ""Down\0""Right""Left\0"
+#elif defined(PCBXLITE)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(RADIO_T12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(PCBTARANIS)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
+#else
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0"
+#endif
#define LEN_VRENCODERS "\003"
#define TR_VRENCODERS "REa""REb"
@@ -887,7 +901,7 @@
#define TR_OWN "Fase"
#define TR_DATE "Data"
#define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
-#define TR_ROTARY_ENCODER "R.Encs"
+#define TR_ROTARY_ENCODER "R.E."
#define TR_CHANNELS_MONITOR "MONITOR CANALI"
#define TR_MIXERS_MONITOR "MONITOR MIXER"
#define TR_PATH_TOO_LONG "Path troppo lungo"
diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt
index d84f64843..eee09834c 100644
--- a/radio/src/translations/nl.h.txt
+++ b/radio/src/translations/nl.h.txt
@@ -362,14 +362,17 @@
#define TR_VSWASHTYPE "---\0""120\0""120X""140\0""90\0"
#if defined(PCBHORUS)
-#define LEN_VKEYS "\006"
-#define TR_VKEYS "Menu\0 ""Exit\0 ""Enter\0""Up\0 ""Down\0 ""Right\0""Left"
+ #define LEN_VKEYS "\006"
+ #define TR_VKEYS "Menu\0 ""Exit\0 ""Enter\0""Up\0 ""Down\0 ""Right\0""Left"
+#elif defined(RADIO_T12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(PCBTARANIS)
-#define LEN_VKEYS "\005"
-#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
#else
-#define LEN_VKEYS "\005"
-#define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0"
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0"
#endif
#define LEN_VRENCODERS "\003"
diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt
index 6816cc440..623266069 100644
--- a/radio/src/translations/pl.h.txt
+++ b/radio/src/translations/pl.h.txt
@@ -377,8 +377,22 @@
#define LEN_VSWASHTYPE "\004"
#define TR_VSWASHTYPE "---\0""120\0""120X""140\0""90\0"
-#define LEN_VKEYS "\005"
-#define TR_VKEYS TR("Menu\0""Exit\0""Dół \0""Góra\0""Prawo""Lewo\0", "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus")
+#if defined(PCBHORUS)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Enter""Up\0 ""Down\0""Right""Left\0"
+#elif defined(PCBXLITE)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(RADIO_T12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(PCBTARANIS)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
+#else
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0"
+#endif
#define LEN_VRENCODERS "\003"
#define TR_VRENCODERS "REa""REb"
@@ -887,7 +901,7 @@
#define TR_OWN "Własność"
#define TR_DATE "Data"
#define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
-#define TR_ROTARY_ENCODER "R.Encs"
+#define TR_ROTARY_ENCODER "R.E."
#define TR_CHANNELS_MONITOR "MONITOR KANAŁÓW"
#define TR_MIXERS_MONITOR "MONITOR MIKSER"
#define TR_PATH_TOO_LONG "Ścieżka za długa"
diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt
index 37f3b8113..29a843e6f 100644
--- a/radio/src/translations/pt.h.txt
+++ b/radio/src/translations/pt.h.txt
@@ -891,7 +891,7 @@
#define TR_OWN "Propr."
#define TR_DATE "Data"
#define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
-#define TR_ROTARY_ENCODER "R.Encs"
+#define TR_ROTARY_ENCODER "R.E."
#define TR_CHANNELS_MONITOR "CHANNELS MONITOR"
#define TR_MIXERS_MONITOR "MIXERS MONITOR"
#define TR_PATH_TOO_LONG "Path too long"
diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt
index a07e6c760..c34d7c13e 100644
--- a/radio/src/translations/se.h.txt
+++ b/radio/src/translations/se.h.txt
@@ -375,14 +375,17 @@
#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0 "
#if defined(PCBHORUS)
-#define LEN_VKEYS "\006"
-#define TR_VKEYS "Menu\0 ""Exit\0 ""Enter\0""Upp\0 ""Ned\0 ""Höger\0""Vänst"
+ #define LEN_VKEYS "\006"
+ #define TR_VKEYS "Menu\0 ""Exit\0 ""Enter\0""Upp\0 ""Ned\0 ""Höger\0""Vänst"
+#elif defined(RADIO_T12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(PCBTARANIS)
-#define LEN_VKEYS "\005"
-#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
#else
-#define LEN_VKEYS "\005"
-#define TR_VKEYS "Menu\0""Exit\0""Ned\0 ""Upp\0 ""Höger""Vänst"
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Menu\0""Exit\0""Ned\0 ""Upp\0 ""Höger""Vänst"
#endif
#define LEN_VRENCODERS "\003"
diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h
index f76b953fe..4d8e42929 100644
--- a/radio/src/translations/untranslated.h
+++ b/radio/src/translations/untranslated.h
@@ -44,9 +44,12 @@
#elif defined(PCBXLITE)
#define TR_POTS_VSRCRAW "\310S1\0""\310S2\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0"
-#elif defined(PCBX7)
+#elif defined(RADIO_X7)
#define TR_POTS_VSRCRAW "\310S1\0""\310S2\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0""\312SI\0""\312SJ\0"
+#elif defined(RADIO_T12)
+ #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0"
+ #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0"
#elif defined(PCBX9LITE)
#define TR_POTS_VSRCRAW "\310S1\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0"
diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py
index 0cec51604..6c319b8cb 100755
--- a/radio/util/build-firmware.py
+++ b/radio/util/build-firmware.py
@@ -121,6 +121,14 @@ elif options[optcount] == "x12s":
maxsize = 2 * 1024 * 1024
board = BOARD_HORUS
board_family = BOARD_FAMILY_ARM
+elif options[optcount] == "t12":
+ command_options["PCB"] = "X7"
+ command_options["PCBREV"] = "T12"
+ command_options["MULTI_SPORT"] = "ON"
+ firmware_options = options_taranis_x9dp
+ maxsize = 65536 * 8
+ board = BOARD_TARANIS
+ board_family = BOARD_FAMILY_ARM
else:
exit(INVALID_BOARD)
diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh
index 38b5f98ef..9e5375353 100755
--- a/tools/commit-tests.sh
+++ b/tools/commit-tests.sh
@@ -177,6 +177,15 @@ if [[ " X12S HORUS ALL " =~ " ${FLAVOR} " ]] ; then
make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS}
fi
+if [[ " T12 ALL " =~ " ${FLAVOR} " ]] ; then
+ # OpenTX on T12
+ rm -rf *
+ cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=T12 -DHELI=YES -DGVARS=YES ${SRCDIR}
+ make -j${CORES} ${FIRMARE_TARGET}
+ make -j${CORES} libsimulator
+ make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS}
+fi
+
if [[ " DEFAULT ALL " =~ " ${FLAVOR} " ]] ; then
# Companion
rm -rf *