diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt
index ad023d67d..3d27550e6 100644
--- a/companion/src/CMakeLists.txt
+++ b/companion/src/CMakeLists.txt
@@ -343,6 +343,8 @@ if(PCB STREQUAL X7 AND PCBREV STREQUAL ACCESS)
set(FLAVOUR x7access)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T12)
set(FLAVOUR t12)
+elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TX12)
+ set(FLAVOUR tx12)
elseif(PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019)
set(FLAVOUR x9d+2019)
elseif(PCB STREQUAL X10 AND PCBREV STREQUAL EXPRESS)
diff --git a/companion/src/companion.qrc b/companion/src/companion.qrc
index cddc2fa3e..fbbacdb48 100644
--- a/companion/src/companion.qrc
+++ b/companion/src/companion.qrc
@@ -179,6 +179,17 @@
images/simulator/JumperT12/JumperT12-x.png
images/simulator/JumperT12/JumperT12-center.png
images/simulator/JumperT12/JumperT12-top.png
+ images/simulator/TX12/left.png
+ images/simulator/TX12/left-pageup.png
+ images/simulator/TX12/left-pagedn.png
+ images/simulator/TX12/left-rtn.png
+ images/simulator/TX12/left-sys.png
+ images/simulator/TX12/left-tele.png
+ images/simulator/TX12/right.png
+ images/simulator/TX12/right-ent.png
+ images/simulator/TX12/right-mdl.png
+ images/simulator/TX12/bottom.png
+ images/simulator/TX12/top.png
images/simulator/JumperT16/left.png
images/simulator/JumperT16/right.png
images/simulator/JumperT16/top.png
diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp
index 5e0ceeb86..570b3cdfc 100644
--- a/companion/src/firmwares/boards.cpp
+++ b/companion/src/firmwares/boards.cpp
@@ -85,6 +85,8 @@ uint32_t Boards::getFourCC(Type board)
return 0x4078746F;
case BOARD_RADIOMASTER_TX16S:
return 0x3878746F;
+ case BOARD_RADIOMASTER_TX12:
+ return 0x4178746F;
case BOARD_UNKNOWN:
break;
}
@@ -111,6 +113,7 @@ int Boards::getEEpromSize(Board::Type board)
case BOARD_TARANIS_X9DP_2019:
case BOARD_TARANIS_X9E:
case BOARD_JUMPER_T12:
+ case BOARD_RADIOMASTER_TX12:
return EESIZE_TARANIS;
case BOARD_UNKNOWN:
return EESIZE_MAX;
@@ -145,6 +148,7 @@ int Boards::getFlashSize(Type board)
case BOARD_TARANIS_X9DP_2019:
case BOARD_TARANIS_X9E:
case BOARD_JUMPER_T12:
+ case BOARD_RADIOMASTER_TX12:
return FSIZE_TARANIS;
case BOARD_HORUS_X12S:
case BOARD_X10:
@@ -201,6 +205,20 @@ SwitchInfo Boards::getSwitchInfo(Board::Type board, int index)
if (index < DIM(switches))
return switches[index];
}
+ else if (IS_RADIOMASTER_TX12(board)) {
+ const Board::SwitchInfo switches[] = {
+ {SWITCH_TOGGLE, "SA"},
+ {SWITCH_3POS, "SB"},
+ {SWITCH_3POS, "SC"},
+ {SWITCH_TOGGLE, "SD"},
+ {SWITCH_3POS, "SE"},
+ {SWITCH_3POS, "SF"},
+ {SWITCH_2POS, "SI"},
+ {SWITCH_2POS, "SJ"}
+ };
+ if (index < DIM(switches))
+ return switches[index];
+ }
else if (IS_JUMPER_T12(board)) {
const Board::SwitchInfo switches[] = {
{SWITCH_3POS, "SA"},
@@ -263,7 +281,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
case Pots:
if (IS_TARANIS_X9LITE(board))
return 1;
- else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
+ else if (IS_TARANIS_SMALL(board))
return 2;
else if (IS_TARANIS_X9E(board))
return 4;
@@ -318,8 +336,8 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
return 7;
else if (IS_TARANIS_X7(board))
return 8;
- else if (IS_JUMPER_T12(board))
- return 6;
+ else if (IS_FAMILY_T12(board))
+ return 8;
else if (IS_TARANIS_XLITE(board))
return 6;
else if (board == Board::BOARD_TARANIS_X9DP_2019)
@@ -334,6 +352,8 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
case FactoryInstalledSwitches:
if (IS_TARANIS_X9E(board))
return 8;
+ if (IS_FAMILY_T12(board))
+ return 6;
if (IS_HORUS_X12S(board))
return 8;
else
@@ -515,6 +535,8 @@ QString Boards::getBoardName(Board::Type board)
return "Jumper T18";
case BOARD_RADIOMASTER_TX16S:
return "Radiomaster TX16S";
+ case BOARD_RADIOMASTER_TX12:
+ return "Radiomaster TX12";
default:
return tr("Unknown");
}
diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h
index 2ecf3c2fe..1e1588485 100644
--- a/companion/src/firmwares/boards.h
+++ b/companion/src/firmwares/boards.h
@@ -52,9 +52,10 @@ namespace Board {
BOARD_JUMPER_T16,
BOARD_RADIOMASTER_TX16S,
BOARD_JUMPER_T18,
+ BOARD_RADIOMASTER_TX12,
};
- constexpr int BOARD_TYPE_MAX = BOARD_JUMPER_T18;
+ constexpr int BOARD_TYPE_MAX = BOARD_RADIOMASTER_TX12;
enum PotType
{
@@ -218,11 +219,21 @@ inline bool IS_RADIOMASTER_TX16S(Board::Type board)
return board == Board::BOARD_RADIOMASTER_TX16S;
}
+inline bool IS_RADIOMASTER_TX12(Board::Type board)
+{
+ return board == Board::BOARD_RADIOMASTER_TX12;
+}
+
inline bool IS_FAMILY_T16(Board::Type board)
{
return board == Board::BOARD_JUMPER_T16 || board == Board::BOARD_RADIOMASTER_TX16S || board == Board::BOARD_JUMPER_T18;
}
+inline bool IS_FAMILY_T12(Board::Type board)
+{
+ return board == Board::BOARD_JUMPER_T12 || board == Board::BOARD_RADIOMASTER_TX12;
+}
+
inline bool IS_TARANIS_XLITE(Board::Type board)
{
return board == Board::BOARD_TARANIS_XLITE || board == Board::BOARD_TARANIS_XLITES;
@@ -273,14 +284,14 @@ inline bool IS_TARANIS_X9E(Board::Type board)
return board == Board::BOARD_TARANIS_X9E;
}
-inline bool IS_TARANIS(Board::Type board)
-{
- return IS_TARANIS_X9(board) || IS_TARANIS_X7(board) || IS_TARANIS_X9LITE(board) || IS_TARANIS_XLITE(board) || IS_JUMPER_T12(board);
-}
-
inline bool IS_TARANIS_SMALL(Board::Type board)
{
- return IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board) || IS_TARANIS_X9LITE(board) || IS_JUMPER_T12(board);
+ return IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board) || IS_TARANIS_X9LITE(board) || IS_FAMILY_T12(board);
+}
+
+inline bool IS_TARANIS(Board::Type board)
+{
+ return IS_TARANIS_X9(board) || IS_TARANIS_SMALL(board);
}
inline bool IS_HORUS_X10(Board::Type board)
diff --git a/companion/src/firmwares/generalsettings.cpp b/companion/src/firmwares/generalsettings.cpp
index f307dbf26..005900c93 100644
--- a/companion/src/firmwares/generalsettings.cpp
+++ b/companion/src/firmwares/generalsettings.cpp
@@ -253,11 +253,11 @@ void GeneralSettings::setDefaultControlTypes(Board::Type board)
potConfig[0] = Board::POT_WITHOUT_DETENT;
potConfig[1] = Board::POT_WITH_DETENT;
}
- else if (IS_TARANIS(board)) {
+ else if (IS_FAMILY_T12(board)) {
potConfig[0] = Board::POT_WITH_DETENT;
potConfig[1] = Board::POT_WITH_DETENT;
}
- else if (IS_JUMPER_T12(board)) {
+ else if (IS_TARANIS(board)) {
potConfig[0] = Board::POT_WITH_DETENT;
potConfig[1] = Board::POT_WITH_DETENT;
}
@@ -329,14 +329,14 @@ void GeneralSettings::convert(RadioDataConversionState & cstate)
}
}
- if (IS_JUMPER_T12(cstate.toType)) {
+ if (IS_FAMILY_T12(cstate.toType)) {
if (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType)) {
strncpy(switchName[4], switchName[5], sizeof(switchName[0]));
strncpy(switchName[5], switchName[7], sizeof(switchName[0]));
}
}
- else if (IS_JUMPER_T12(cstate.fromType)) {
+ else if (IS_FAMILY_T12(cstate.fromType)) {
if (IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) {
strncpy(switchName[5], switchName[4], sizeof(switchName[0]));
strncpy(switchName[7], switchName[5], sizeof(switchName[0]));
diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp
index 5f02afee6..30666ca79 100644
--- a/companion/src/firmwares/opentx/opentxeeprom.cpp
+++ b/companion/src/firmwares/opentx/opentxeeprom.cpp
@@ -45,7 +45,7 @@ inline int MAX_SWITCHES(Board::Type board, int version)
if (IS_TARANIS_X9D(board))
return 9;
- if (IS_JUMPER_T12(board))
+ if (IS_FAMILY_T12(board))
return 8;
return Boards::getCapability(board, Board::Switches);
diff --git a/companion/src/firmwares/opentx/opentxeeprom.h b/companion/src/firmwares/opentx/opentxeeprom.h
index bb55b5687..aabbe2284 100644
--- a/companion/src/firmwares/opentx/opentxeeprom.h
+++ b/companion/src/firmwares/opentx/opentxeeprom.h
@@ -36,6 +36,7 @@
#define TARANIS_X9LITE_VARIANT 0x0800
#define TARANIS_X9LITES_VARIANT 0x0801
#define JUMPER_T12_VARIANT 0x4001
+#define RADIOMASTER_TX12_VARIANT 0x4002
class OpenTxGeneralData: public TransformedField {
public:
diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp
index 005a29c40..2e35c51db 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 Jumper T18";
case BOARD_RADIOMASTER_TX16S:
return "OpenTX for Radiomaster TX16S";
+ case BOARD_RADIOMASTER_TX12:
+ return "OpenTX for Radiomaster TX12";
case BOARD_TARANIS_X9D:
return "OpenTX for FrSky Taranis X9D";
case BOARD_TARANIS_X9DP:
@@ -334,7 +336,9 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u
else if (IS_JUMPER_T12(board)) {
variant |= JUMPER_T12_VARIANT;
}
-
+ else if (IS_RADIOMASTER_TX12(board)) {
+ variant |= RADIOMASTER_TX12_VARIANT;
+ }
OpenTxGeneralData generator((GeneralSettings &)radioData.generalSettings, board, version, variant);
// generator.dump();
QByteArray data;
@@ -520,7 +524,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case MaxVolume:
return 23;
case MaxContrast:
- if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
+ if (IS_TARANIS_SMALL(board))
return 30;
else
return 45;
@@ -615,7 +619,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case LcdWidth:
if (IS_FAMILY_HORUS_OR_T16(board))
return 480;
- else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
+ else if (IS_TARANIS_SMALL(board))
return 128;
else if (IS_TARANIS(board))
return 212;
@@ -629,7 +633,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case LcdDepth:
if (IS_FAMILY_HORUS_OR_T16(board))
return 16;
- else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
+ else if (IS_TARANIS_SMALL(board))
return 1;
else if (IS_TARANIS(board))
return 4;
@@ -679,6 +683,8 @@ int OpenTxFirmware::getCapability(::Capability capability)
return TARANIS_XLITE_VARIANT;
else if (IS_JUMPER_T12(board))
return JUMPER_T12_VARIANT;
+ else if (IS_RADIOMASTER_TX12(board))
+ return RADIOMASTER_TX12_VARIANT;
else
return 0;
case MavlinkTelemetry:
@@ -733,9 +739,9 @@ bool OpenTxFirmware::isAvailable(PulsesProtocol proto, int port)
return true;
case PULSES_PXX_XJT_X16:
case PULSES_PXX_XJT_LR12:
- return !IS_ACCESS_RADIO(board, id) && !IS_FAMILY_T16(board) && !IS_JUMPER_T12(board);
+ return !IS_ACCESS_RADIO(board, id) && !IS_FAMILY_T16(board) && !IS_FAMILY_T12(board);
case PULSES_PXX_XJT_D8:
- return !(IS_ACCESS_RADIO(board, id) || id.contains("eu")) && !IS_FAMILY_T16(board) && !IS_JUMPER_T12(board);
+ return !(IS_ACCESS_RADIO(board, id) || id.contains("eu")) && !IS_FAMILY_T16(board) && !IS_FAMILY_T12(board);
case PULSES_ACCESS_ISRM:
case PULSES_ACCST_ISRM_D16:
return IS_ACCESS_RADIO(board, id);
@@ -943,6 +949,11 @@ bool OpenTxEepromInterface::checkVariant(unsigned int version, unsigned int vari
variantError = true;
}
}
+ else if (IS_RADIOMASTER_TX12(board)) {
+ if (variant != RADIOMASTER_TX12_VARIANT) {
+ variantError = true;
+ }
+ }
else if (IS_TARANIS(board)) {
if (variant != 0) {
variantError = true;
@@ -1273,6 +1284,16 @@ void registerOpenTxFirmwares()
addOpenTxRfOptions(firmware, FLEX);
registerOpenTxFirmware(firmware);
+ /* Radiomaster TX12 board */
+ firmware = new OpenTxFirmware("opentx-tx12", QCoreApplication::translate("Firmware", "Radiomaster TX12"), BOARD_RADIOMASTER_TX12);
+ 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"));
+ addOpenTxFontOptions(firmware);
+ registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, FLEX + AFHDS3);
+
/* Radiomaster TX16S board */
firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16S / SE / Hall / Masterfire"), BOARD_RADIOMASTER_TX16S);
addOpenTxFrskyOptions(firmware);
diff --git a/companion/src/firmwares/rawsource.cpp b/companion/src/firmwares/rawsource.cpp
index 92377fe0a..67a640c33 100644
--- a/companion/src/firmwares/rawsource.cpp
+++ b/companion/src/firmwares/rawsource.cpp
@@ -364,7 +364,7 @@ RawSource RawSource::convert(RadioDataConversionState & cstate)
if (index >= 0)
evt = RadioDataConversionState::EVT_CVRT;
}
- else if (IS_JUMPER_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) {
+ else if (IS_FAMILY_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) {
// No SE and SG on T12 board
index = toSwitchList.indexOf("SD");
if (index >= 0)
diff --git a/companion/src/firmwares/rawswitch.cpp b/companion/src/firmwares/rawswitch.cpp
index 8c1685a25..10d3f7fa3 100644
--- a/companion/src/firmwares/rawswitch.cpp
+++ b/companion/src/firmwares/rawswitch.cpp
@@ -200,7 +200,7 @@ RawSwitch RawSwitch::convert(RadioDataConversionState & cstate)
if (newIdx >= 0)
evt = RadioDataConversionState::EVT_CVRT;
}
- else if (IS_JUMPER_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) {
+ else if (IS_FAMILY_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) {
// No SE and SG on T12 board
newIdx = toSwitchList.indexOf("SD");
if (newIdx >= 0)
diff --git a/companion/src/generaledit/hardware.cpp b/companion/src/generaledit/hardware.cpp
index d718bd759..babf828dd 100644
--- a/companion/src/generaledit/hardware.cpp
+++ b/companion/src/generaledit/hardware.cpp
@@ -47,7 +47,15 @@ void HardwarePanel::setupSwitchType(int index, QLabel * label, AutoLineEdit * na
label->setText("SJ");
}
}
- if (IS_JUMPER_T12(board)) {
+ else if (IS_RADIOMASTER_TX12(board)) {
+ if (index == 6) {
+ label->setText("SI");
+ }
+ else if (index == 7) {
+ label->setText("SJ");
+ }
+ }
+ else if (IS_FAMILY_T12(board)) {
if (index == 4) {
label->setText("SG");
}
@@ -152,7 +160,7 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings
setupSwitchType(2, ui->scLabel, ui->scName, ui->scType);
setupSwitchType(3, ui->sdLabel, ui->sdName, ui->sdType);
setupSwitchType(4, ui->seLabel, ui->seName, ui->seType);
- setupSwitchType(5, ui->sfLabel, ui->sfName, ui->sfType, false); //switch does not support 3POS
+ setupSwitchType(5, ui->sfLabel, ui->sfName, ui->sfType);
setupSwitchType(6, ui->sgLabel, ui->sgName, ui->sgType);
setupSwitchType(7, ui->shLabel, ui->shName, ui->shType, false); //switch does not support 3POS
setupSwitchType(8, ui->siLabel, ui->siName, ui->siType);
diff --git a/companion/src/images/simulator/TX12/bottom.png b/companion/src/images/simulator/TX12/bottom.png
new file mode 100644
index 000000000..52a35bceb
Binary files /dev/null and b/companion/src/images/simulator/TX12/bottom.png differ
diff --git a/companion/src/images/simulator/TX12/left-pagedn.png b/companion/src/images/simulator/TX12/left-pagedn.png
new file mode 100755
index 000000000..3f83d370c
Binary files /dev/null and b/companion/src/images/simulator/TX12/left-pagedn.png differ
diff --git a/companion/src/images/simulator/TX12/left-pageup.png b/companion/src/images/simulator/TX12/left-pageup.png
new file mode 100755
index 000000000..203fd73e7
Binary files /dev/null and b/companion/src/images/simulator/TX12/left-pageup.png differ
diff --git a/companion/src/images/simulator/TX12/left-rtn.png b/companion/src/images/simulator/TX12/left-rtn.png
new file mode 100755
index 000000000..8269d8853
Binary files /dev/null and b/companion/src/images/simulator/TX12/left-rtn.png differ
diff --git a/companion/src/images/simulator/TX12/left-sys.png b/companion/src/images/simulator/TX12/left-sys.png
new file mode 100755
index 000000000..472b412eb
Binary files /dev/null and b/companion/src/images/simulator/TX12/left-sys.png differ
diff --git a/companion/src/images/simulator/TX12/left-tele.png b/companion/src/images/simulator/TX12/left-tele.png
new file mode 100755
index 000000000..d7971d791
Binary files /dev/null and b/companion/src/images/simulator/TX12/left-tele.png differ
diff --git a/companion/src/images/simulator/TX12/left.png b/companion/src/images/simulator/TX12/left.png
new file mode 100755
index 000000000..e7f5522c1
Binary files /dev/null and b/companion/src/images/simulator/TX12/left.png differ
diff --git a/companion/src/images/simulator/TX12/right-ent.png b/companion/src/images/simulator/TX12/right-ent.png
new file mode 100755
index 000000000..8534cceb2
Binary files /dev/null and b/companion/src/images/simulator/TX12/right-ent.png differ
diff --git a/companion/src/images/simulator/TX12/right-mdl.png b/companion/src/images/simulator/TX12/right-mdl.png
new file mode 100755
index 000000000..4343626ea
Binary files /dev/null and b/companion/src/images/simulator/TX12/right-mdl.png differ
diff --git a/companion/src/images/simulator/TX12/right.png b/companion/src/images/simulator/TX12/right.png
new file mode 100755
index 000000000..0f33cae7c
Binary files /dev/null and b/companion/src/images/simulator/TX12/right.png differ
diff --git a/companion/src/images/simulator/TX12/top.png b/companion/src/images/simulator/TX12/top.png
new file mode 100644
index 000000000..ceb68a4c1
Binary files /dev/null and b/companion/src/images/simulator/TX12/top.png differ
diff --git a/companion/src/simulation/CMakeLists.txt b/companion/src/simulation/CMakeLists.txt
index a03090888..9b9cbc130 100644
--- a/companion/src/simulation/CMakeLists.txt
+++ b/companion/src/simulation/CMakeLists.txt
@@ -15,6 +15,7 @@ set(simulation_SRCS
simulateduiwidgetJumperT12.cpp
simulateduiwidgetJumperT16.cpp
simulateduiwidgetJumperT18.cpp
+ simulateduiwidgetTX12.cpp
simulateduiwidgetTX16S.cpp
simulatorinterface.cpp
simulatormainwindow.cpp
@@ -41,6 +42,7 @@ set(simulation_UIS
simulateduiwidgetJumperT12.ui
simulateduiwidgetJumperT16.ui
simulateduiwidgetJumperT18.ui
+ simulateduiwidgetTX12.ui
simulateduiwidgetTX16S.ui
simulatormainwindow.ui
simulatorstartupdialog.ui
diff --git a/companion/src/simulation/simulateduiwidget.h b/companion/src/simulation/simulateduiwidget.h
index 8419840c5..66939f429 100644
--- a/companion/src/simulation/simulateduiwidget.h
+++ b/companion/src/simulation/simulateduiwidget.h
@@ -115,6 +115,7 @@ namespace Ui {
class SimulatedUIWidgetJumperT16;
class SimulatedUIWidgetJumperT18;
class SimulatedUIWidgetTX16S;
+ class SimulatedUIWidgetTX12;
}
class SimulatedUIWidget9X: public SimulatedUIWidget
@@ -265,6 +266,19 @@ class SimulatedUIWidgetJumperT18: public SimulatedUIWidget
Ui::SimulatedUIWidgetJumperT18 * ui;
};
+class SimulatedUIWidgetTX12: public SimulatedUIWidget
+{
+ Q_OBJECT
+
+ public:
+ explicit SimulatedUIWidgetTX12(SimulatorInterface * simulator, QWidget * parent = nullptr);
+ virtual ~SimulatedUIWidgetTX12();
+
+ private:
+ Ui::SimulatedUIWidgetTX12 * ui;
+};
+
+
class SimulatedUIWidgetTX16S: public SimulatedUIWidget
{
Q_OBJECT
diff --git a/companion/src/simulation/simulateduiwidgetTX12.cpp b/companion/src/simulation/simulateduiwidgetTX12.cpp
new file mode 100644
index 000000000..8e7c518f0
--- /dev/null
+++ b/companion/src/simulation/simulateduiwidgetTX12.cpp
@@ -0,0 +1,67 @@
+#include "simulateduiwidget.h"
+#include "ui_simulateduiwidgetTX12.h"
+
+// NOTE: RadioUiAction(NUMBER,...): NUMBER relates to enum EnumKeys in the specific board.h
+
+SimulatedUIWidgetTX12::SimulatedUIWidgetTX12(SimulatorInterface *simulator, QWidget * parent):
+ SimulatedUIWidget(simulator, parent),
+ ui(new Ui::SimulatedUIWidgetTX12)
+{
+ RadioUiAction * act;
+
+ ui->setupUi(this);
+
+ // add actions in order of appearance on the help menu
+
+ act = new RadioUiAction(5, QList() << Qt::Key_Up, SIMU_STR_HLP_KEY_UP, SIMU_STR_HLP_ACT_MDL);
+ addRadioWidget(ui->rightbuttons->addArea(QRect(60, 5, 90, 60), "TX12/right-mdl.png", act));
+
+ m_mouseMidClickAction = new RadioUiAction(1, QList() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_ACTIVATE, SIMU_STR_HLP_ACT_ROT_DN);
+ addRadioWidget(ui->rightbuttons->addArea(QRect(45, 100, 70, 120), "TX12/right-ent.png", m_mouseMidClickAction));
+
+ act = new RadioUiAction(4, QList() << Qt::Key_Left, SIMU_STR_HLP_KEY_LFT, SIMU_STR_HLP_ACT_SYS);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(35, 5, 80, 50), "TX12/left-sys.png", act));
+
+ act = new RadioUiAction(6, QList() << Qt::Key_Right, SIMU_STR_HLP_KEY_RGT, SIMU_STR_HLP_ACT_TELE);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(90, 210, 80, 35), "TX12/left-tele.png", act));
+
+ act = new RadioUiAction(3, QList() << Qt::Key_PageDown, SIMU_STR_HLP_KEY_PGDN, SIMU_STR_HLP_ACT_PGDN);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(75, 125, 80, 35), "TX12/left-pagedn.png", act));
+
+ act = new RadioUiAction(2, QList() << Qt::Key_PageUp, SIMU_STR_HLP_KEY_PGUP, SIMU_STR_HLP_ACT_PGUP);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(80, 170, 80, 35), "TX12/left-pageup.png", act));
+
+ act = new RadioUiAction(0, QList() << Qt::Key_Down << Qt::Key_Delete << Qt::Key_Escape << Qt::Key_Backspace, SIMU_STR_HLP_KEYS_EXIT, SIMU_STR_HLP_ACT_EXIT);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(70, 85, 80, 35), "TX12/left-rtn.png", act));
+
+ m_scrollUpAction = new RadioUiAction(-1, QList() << Qt::Key_Minus << Qt::Key_Equal << Qt::Key_Left, SIMU_STR_HLP_KEYS_GO_LFT, SIMU_STR_HLP_ACT_ROT_LFT);
+ m_scrollDnAction = new RadioUiAction(-1, QList() << Qt::Key_Plus << Qt::Key_Right, SIMU_STR_HLP_KEYS_GO_RGT, SIMU_STR_HLP_ACT_ROT_RGT);
+ connectScrollActions();
+
+ 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);
+}
+
+SimulatedUIWidgetTX12::~SimulatedUIWidgetTX12()
+{
+ delete ui;
+}
diff --git a/companion/src/simulation/simulateduiwidgetTX12.ui b/companion/src/simulation/simulateduiwidgetTX12.ui
new file mode 100644
index 000000000..8d51ba2e6
--- /dev/null
+++ b/companion/src/simulation/simulateduiwidgetTX12.ui
@@ -0,0 +1,258 @@
+
+
+ SimulatedUIWidgetTX12
+
+
+
+ 0
+ 0
+ 641
+ 272
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 641
+ 272
+
+
+
+
+ 641
+ 272
+
+
+
+ Taranis TX12 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
+
+
+
+
+ 196
+ 253
+
+
+
+
+ 196
+ 253
+
+
+
+ background:url(:/images/simulator/TX12/left.png);
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 256
+ 128
+
+
+
+
+ 424
+ 128
+
+
+
+ background-color: rgb(215, 243, 255);
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 189
+ 253
+
+
+
+
+ 189
+ 253
+
+
+
+ background:url(:/images/simulator/TX12/right.png)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 261
+ 101
+
+
+
+
+ 261
+ 101
+
+
+
+ background:url(:/images/simulator/TX12/top.png)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 261
+ 24
+
+
+
+
+ 261
+ 24
+
+
+
+ background:url(:/images/simulator/TX12/bottom.png)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 10
+
+
+
+
+ 16777215
+ 12
+
+
+
+
+ 0
+ 12
+
+
+
+ background-color: rgb(255, 255, 255);
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 10
+
+
+
+
+ 16777215
+ 10
+
+
+
+ background-color: rgb(247, 245, 245);
+
+
+
+
+
+
+
+
+
+
+ LcdWidget
+ QWidget
+
+ 1
+
+
+ ButtonsWidget
+ QWidget
+
+ 1
+
+
+
+
+
diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp
index f70813442..cab7600d4 100644
--- a/companion/src/simulation/simulatorwidget.cpp
+++ b/companion/src/simulation/simulatorwidget.cpp
@@ -97,6 +97,9 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato
case Board::BOARD_JUMPER_T18:
radioUiWidget = new SimulatedUIWidgetJumperT18(simulator, this);
break;
+ case Board::BOARD_RADIOMASTER_TX12:
+ radioUiWidget = new SimulatedUIWidgetTX12(simulator, this);
+ break;
case Board::BOARD_RADIOMASTER_TX16S:
radioUiWidget = new SimulatedUIWidgetTX16S(simulator, this);
break;
diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h
index 214bcad8c..7cc47a1ce 100644
--- a/radio/src/dataconstants.h
+++ b/radio/src/dataconstants.h
@@ -208,7 +208,13 @@ enum TrainerMode {
};
#endif
-#if defined(RADIO_FAMILY_T16) || (defined(RADIO_T12) && defined(INTERNAL_MODULE_MULTI)) || defined(ALLOW_TRAINER_MULTI)
+#if defined(RADIO_T16) && !defined(INTERNAL_MODULE_MULTI)
+#if defined(BLUETOOTH)
+ #define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE_BLUETOOTH
+#else
+ #define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE
+#endif
+#elif defined(INTERNAL_MODULE_MULTI) || defined(ALLOW_TRAINER_MULTI)
#define TRAINER_MODE_MAX() TRAINER_MODE_MULTI
#elif defined(BLUETOOTH)
#define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE_BLUETOOTH
diff --git a/radio/src/gui/128x64/model_curve_edit.cpp b/radio/src/gui/128x64/model_curve_edit.cpp
index 2cbe5f758..66f153b4d 100644
--- a/radio/src/gui/128x64/model_curve_edit.cpp
+++ b/radio/src/gui/128x64/model_curve_edit.cpp
@@ -165,8 +165,13 @@ void menuModelCurveOne(event_t event)
}
break;
-#if defined(NAVIGATION_X7)
- case EVT_KEY_LONG(KEY_MENU):
+#if defined(NAVIGATION_X7_TX12)
+ case EVT_KEY_FIRST(KEY_MODEL):
+ pushMenu(menuChannelsView);
+ killEvents(event);
+ break;
+#elif defined(NAVIGATION_X7)
+ case EVT_KEY_FIRST(KEY_MENU):
pushMenu(menuChannelsView);
killEvents(event);
break;
diff --git a/radio/src/gui/128x64/model_input_edit.cpp b/radio/src/gui/128x64/model_input_edit.cpp
index ab1b5aced..840e41a82 100644
--- a/radio/src/gui/128x64/model_input_edit.cpp
+++ b/radio/src/gui/128x64/model_input_edit.cpp
@@ -49,8 +49,13 @@ enum ExposFields {
void menuModelExpoOne(event_t event)
{
-#if defined(NAVIGATION_X7)
- if (event == EVT_KEY_LONG(KEY_MENU)) {
+#if defined(NAVIGATION_X7_TX12)
+ if (event == EVT_KEY_FIRST(KEY_MODEL)) {
+ pushMenu(menuChannelsView);
+ killEvents(event);
+ }
+#elif defined(NAVIGATION_X7)
+ if (event == EVT_KEY_FIRST(KEY_MENU)) {
pushMenu(menuChannelsView);
killEvents(event);
}
diff --git a/radio/src/gui/128x64/model_mix_edit.cpp b/radio/src/gui/128x64/model_mix_edit.cpp
index 45e8cd383..92e10ee69 100644
--- a/radio/src/gui/128x64/model_mix_edit.cpp
+++ b/radio/src/gui/128x64/model_mix_edit.cpp
@@ -85,8 +85,13 @@ void drawOffsetBar(uint8_t x, uint8_t y, MixData * md)
void menuModelMixOne(event_t event)
{
-#if defined(NAVIGATION_X7)
- if (event == EVT_KEY_LONG(KEY_MENU)) {
+#if defined(NAVIGATION_X7_TX12)
+ if (event == EVT_KEY_FIRST(KEY_MODEL)) {
+ pushMenu(menuChannelsView);
+ killEvents(event);
+ }
+#elif defined(NAVIGATION_X7)
+ if (event == EVT_KEY_FIRST(KEY_MENU)) {
pushMenu(menuChannelsView);
killEvents(event);
}
diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp
index bbd21b221..f3efd28d5 100644
--- a/radio/src/gui/128x64/model_select.cpp
+++ b/radio/src/gui/128x64/model_select.cpp
@@ -203,7 +203,16 @@ void menuModelSelect(event_t event)
}
break;
-#if defined(NAVIGATION_X7)
+#if defined(NAVIGATION_X7_TX12)
+ case EVT_KEY_FIRST(KEY_PAGEUP):
+ chainMenu(menuTabModel[DIM(menuTabModel)-1]);
+ killEvents(event);
+ break;
+
+ case EVT_KEY_FIRST(KEY_PAGEDN):
+ chainMenu(menuModelSetup);
+ break;
+#elif defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
chainMenu(menuTabModel[DIM(menuTabModel)-1]);
killEvents(event);
diff --git a/radio/src/gui/128x64/view_about.cpp b/radio/src/gui/128x64/view_about.cpp
index aaec50b32..02e8e4508 100644
--- a/radio/src/gui/128x64/view_about.cpp
+++ b/radio/src/gui/128x64/view_about.cpp
@@ -42,7 +42,10 @@ enum AboutScreens {
#define ABOUT_X 2
#define ABOUT_INDENT 4
-#if defined(NAVIGATION_X7)
+#if defined(NAVIGATION_X7_TX12)
+#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_PAGEUP)
+#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGEDN)
+#elif 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_channels.cpp b/radio/src/gui/128x64/view_channels.cpp
index ccd8fc9b3..f71d833c1 100644
--- a/radio/src/gui/128x64/view_channels.cpp
+++ b/radio/src/gui/128x64/view_channels.cpp
@@ -26,7 +26,12 @@ constexpr coord_t CHANNEL_GAUGE_OFFSET = CHANNEL_VALUE_OFFSET;
constexpr coord_t CHANNEL_BAR_WIDTH = 70;
constexpr coord_t CHANNEL_PROPERTIES_OFFSET = CHANNEL_GAUGE_OFFSET + CHANNEL_BAR_WIDTH + 2;
-#if defined(NAVIGATION_X7)
+#if defined(NAVIGATION_X7_TX12)
+#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_PAGEUP)
+#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGEDN)
+#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT
+#define EVT_KEY_PREVIOUS_PAGE EVT_ROTARY_LEFT
+#elif defined(NAVIGATION_X7)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_LONG(KEY_PAGE)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE)
#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT
@@ -54,7 +59,7 @@ void menuChannelsViewCommon(event_t event)
memclear(&reusableBuffer.viewChannels, sizeof(reusableBuffer.viewChannels));
break;
- case EVT_KEY_FIRST(KEY_ENTER):
+ case EVT_KEY_BREAK(KEY_ENTER):
reusableBuffer.viewChannels.mixersView = !reusableBuffer.viewChannels.mixersView;
break;
}
diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp
index a6f77528b..e125fffe2 100644
--- a/radio/src/gui/128x64/view_main.cpp
+++ b/radio/src/gui/128x64/view_main.cpp
@@ -209,7 +209,16 @@ void displayVoltageOrAlarm()
#define displayVoltageOrAlarm() displayBattVoltage()
#endif
-#if defined(NAVIGATION_X7)
+#if defined(NAVIGATION_X7_TX12)
+#define EVT_KEY_CONTEXT_MENU EVT_KEY_LONG(KEY_ENTER)
+#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_FIRST(KEY_PAGEUP)
+#define EVT_KEY_NEXT_VIEW EVT_KEY_FIRST(KEY_PAGEDN)
+#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT
+#define EVT_KEY_PREVIOUS_PAGE EVT_ROTARY_LEFT
+#define EVT_KEY_MODEL_MENU EVT_KEY_LONG(KEY_MODEL)
+#define EVT_KEY_GENERAL_MENU EVT_KEY_LONG(KEY_SYS)
+#define EVT_KEY_TELEMETRY EVT_KEY_FIRST(KEY_TELE)
+#elif 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
diff --git a/radio/src/gui/128x64/view_statistics.cpp b/radio/src/gui/128x64/view_statistics.cpp
index 2296e93b0..2b46be36e 100644
--- a/radio/src/gui/128x64/view_statistics.cpp
+++ b/radio/src/gui/128x64/view_statistics.cpp
@@ -31,14 +31,21 @@ void menuStatisticsView(event_t event)
switch (event) {
case EVT_KEY_FIRST(KEY_UP):
-#if defined(NAVIGATION_X7)
+#if defined(NAVIGATION_X7_TX12)
+ case EVT_KEY_BREAK(KEY_PAGEDN):
+#elif defined(NAVIGATION_X7)
case EVT_KEY_BREAK(KEY_PAGE):
#endif
+
chainMenu(menuStatisticsDebug);
break;
case EVT_KEY_FIRST(KEY_DOWN):
-#if defined(NAVIGATION_X7)
+#if defined(NAVIGATION_X7_TX12)
+ case EVT_KEY_BREAK(KEY_PAGEUP):
+ killEvents(event);
+ chainMenu(menuStatisticsDebug2);
+#elif defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
killEvents(event);
chainMenu(menuStatisticsDebug2);
@@ -133,7 +140,12 @@ void menuStatisticsDebug(event_t event)
break;
case EVT_KEY_FIRST(KEY_UP):
-#if defined(NAVIGATION_X7)
+#if defined(NAVIGATION_X7_TX12)
+ case EVT_KEY_BREAK(KEY_PAGEDN):
+ disableVBatBridge();
+ chainMenu(menuStatisticsDebug2);
+ break;
+#elif defined(NAVIGATION_X7)
case EVT_KEY_BREAK(KEY_PAGE):
disableVBatBridge();
chainMenu(menuStatisticsDebug2);
@@ -141,7 +153,9 @@ void menuStatisticsDebug(event_t event)
#endif
case EVT_KEY_FIRST(KEY_DOWN):
-#if defined(NAVIGATION_X7)
+#if defined(NAVIGATION_X7_TX12)
+ case EVT_KEY_BREAK(KEY_PAGEUP):
+#elif defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
#endif
killEvents(event);
@@ -264,14 +278,18 @@ void menuStatisticsDebug2(event_t event)
break;
case EVT_KEY_FIRST(KEY_UP):
-#if defined(NAVIGATION_X7)
+#if defined(NAVIGATION_X7_TX12)
+ case EVT_KEY_BREAK(KEY_PAGEDN):
+#elif defined(NAVIGATION_X7)
case EVT_KEY_BREAK(KEY_PAGE):
#endif
chainMenu(menuStatisticsView);
return;
case EVT_KEY_FIRST(KEY_DOWN):
-#if defined(NAVIGATION_X7)
+#if defined(NAVIGATION_X7_TX12)
+ case EVT_KEY_BREAK(KEY_PAGEUP):
+#elif defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
#endif
killEvents(event);
diff --git a/radio/src/gui/common/stdlcd/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp
index 8824d6a57..fca6e047c 100644
--- a/radio/src/gui/common/stdlcd/radio_hardware.cpp
+++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp
@@ -262,6 +262,8 @@ void onHardwareAntennaSwitchConfirm(const char * result)
#define SWITCH_TYPE_MAX(sw) (SWITCH_3POS)
#elif defined(PCBX9E)
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS)
+#elif defined(RADIO_TX12)
+ #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SA - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SD - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS)
#else
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - MIXSRC_FIRST_SWITCH <= sw) ? SWITCH_2POS : SWITCH_3POS)
#endif
diff --git a/radio/src/gui/common/stdlcd/view_telemetry.cpp b/radio/src/gui/common/stdlcd/view_telemetry.cpp
index 61b506269..d4b2bac0b 100644
--- a/radio/src/gui/common/stdlcd/view_telemetry.cpp
+++ b/radio/src/gui/common/stdlcd/view_telemetry.cpp
@@ -34,6 +34,9 @@ enum NavigationDirection {
#if defined(NAVIGATION_XLITE)
#define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_LEFT) && IS_SHIFT_PRESSED())
#define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_LONG(KEY_RIGHT) && IS_SHIFT_PRESSED())
+#elif defined(NAVIGATION_X7_TX12)
+ #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_UP))
+ #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_DOWN))
#elif defined(NAVIGATION_X7) || defined(NAVIGATION_X9D)
#define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_PAGE))
#define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_BREAK(KEY_PAGE))
diff --git a/radio/src/gui/navigation/navigation_x7.cpp b/radio/src/gui/navigation/navigation_x7.cpp
index bc835a375..ac4a4bbdd 100644
--- a/radio/src/gui/navigation/navigation_x7.cpp
+++ b/radio/src/gui/navigation/navigation_x7.cpp
@@ -217,7 +217,11 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t
if (menuTab) {
int cc = curr;
switch (event) {
+#if defined(NAVIGATION_X7_TX12)
+ case EVT_KEY_FIRST(KEY_PAGEUP):
+#else
case EVT_KEY_LONG(KEY_PAGE):
+#endif
if (s_editMode>0)
break;
@@ -228,7 +232,11 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t
killEvents(event);
break;
+#if defined(NAVIGATION_X7_TX12)
+ case EVT_KEY_FIRST(KEY_PAGEDN):
+#else
case EVT_KEY_BREAK(KEY_PAGE):
+#endif
if (s_editMode>0)
break;
diff --git a/radio/src/lua/CMakeLists.txt b/radio/src/lua/CMakeLists.txt
index 9c5a952bb..5b89c1f65 100644
--- a/radio/src/lua/CMakeLists.txt
+++ b/radio/src/lua/CMakeLists.txt
@@ -28,5 +28,6 @@ if(PYTHONINTERP_FOUND)
add_lua_export_target(x10 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10)
add_lua_export_target(x12s ${LUA_INCLUDES} -DPCBHORUS -DPCBX12S)
add_lua_export_target(t12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_T12)
+ add_lua_export_target(tx12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_TX12)
add_lua_export_target(t16 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10 -DRADIO_T16)
endif()
diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp
index 7722b8ae8..37634ae1c 100644
--- a/radio/src/lua/api_general.cpp
+++ b/radio/src/lua/api_general.cpp
@@ -40,6 +40,8 @@
#include "lua/lua_exports_x7.inc"
#elif defined(RADIO_T12)
#include "lua/lua_exports_t12.inc"
+#elif defined(RADIO_TX12)
+ #include "lua/lua_exports_tx12.inc"
#elif defined(PCBX9LITES)
#include "lua/lua_exports_x9lites.inc"
#elif defined(PCBX9LITE)
@@ -1779,7 +1781,9 @@ const luaR_value_entry opentxConstants[] = {
#endif
#if !defined(PCBXLITE) && !defined(PCBX9LITE)
{ "MIXSRC_SF", MIXSRC_SF },
+#if !defined(RADIO_TX12)
{ "MIXSRC_SH", MIXSRC_SH },
+#endif
#endif
{ "MIXSRC_CH1", MIXSRC_CH1 },
{ "SWSRC_LAST", SWSRC_LAST_LOGICAL_SWITCH },
@@ -1878,10 +1882,17 @@ const luaR_value_entry opentxConstants[] = {
{ "EVT_VIRTUAL_ENTER_LONG", EVT_KEY_LONG(KEY_ENTER) },
{ "EVT_VIRTUAL_EXIT", EVT_KEY_BREAK(KEY_EXIT) },
#elif defined(NAVIGATION_X7) || defined(NAVIGATION_X9D)
+#if defined(RADIO_TX12)
+ { "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_BREAK(KEY_PAGEUP) },
+ { "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_PAGEDN) },
+ { "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_MODEL) },
+ { "EVT_VIRTUAL_MENU_LONG", EVT_KEY_LONG(KEY_MODEL) },
+#else
{ "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_LONG(KEY_PAGE) },
{ "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_PAGE) },
{ "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_MENU) },
{ "EVT_VIRTUAL_MENU_LONG", EVT_KEY_LONG(KEY_MENU) },
+#endif
{ "EVT_VIRTUAL_ENTER", EVT_KEY_BREAK(KEY_ENTER) },
{ "EVT_VIRTUAL_ENTER_LONG", EVT_KEY_LONG(KEY_ENTER) },
{ "EVT_VIRTUAL_EXIT", EVT_KEY_BREAK(KEY_EXIT) },
diff --git a/radio/src/opentx.h b/radio/src/opentx.h
index 8e444409c..67158e075 100644
--- a/radio/src/opentx.h
+++ b/radio/src/opentx.h
@@ -539,6 +539,8 @@ bool setTrimValue(uint8_t phase, uint8_t idx, int trim);
#define ROTARY_ENCODER_GRANULARITY (2 << g_eeGeneral.rotarySteps)
#elif defined(RADIO_FAMILY_T16) && !defined(RADIO_T18)
#define ROTARY_ENCODER_GRANULARITY (1)
+#elif defined(RADIO_TX12)
+ #define ROTARY_ENCODER_GRANULARITY (1)
#else
#define ROTARY_ENCODER_GRANULARITY (2)
#endif
diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h
index fb586174c..fc9a06b92 100644
--- a/radio/src/sdcard.h
+++ b/radio/src/sdcard.h
@@ -143,6 +143,8 @@ const char * getBasename(const char * path);
#define OTX_FOURCC 0x3978746F // otx for Taranis X-Lite
#elif defined(RADIO_T12)
#define OTX_FOURCC 0x3D78746F // otx for Jumper T12
+#elif defined(RADIO_TX12)
+ #define OTX_FOURCC 0x4178746F // otx for Radiomaster TX12
#elif defined(PCBX7)
#define OTX_FOURCC 0x3678746F // otx for Taranis X7 / X7S / X7 Express / X7S Express
#elif defined(PCBX9LITES)
diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp
index 293170127..6d086e100 100644
--- a/radio/src/simu.cpp
+++ b/radio/src/simu.cpp
@@ -265,6 +265,14 @@ void OpenTxSim::updateKeysAndSwitches(bool start)
KEY_Left, KEY_LEFT,
KEY_Up, KEY_UP,
KEY_Down, KEY_DOWN,
+#elif defined(RADIO_TX12)
+ KEY_Page_Up, KEY_PAGEUP,
+ KEY_Page_Down, KEY_PAGEDN,
+ KEY_Return, KEY_ENTER,
+ KEY_Up, KEY_MODEL,
+ KEY_Down, KEY_EXIT,
+ KEY_Right, KEY_TELE,
+ KEY_Left, KEY_SYS,
#elif defined(PCBTARANIS)
KEY_Page_Up, KEY_MENU,
#if defined(KEYS_GPIO_REG_PAGE)
diff --git a/radio/src/strhelpers.cpp b/radio/src/strhelpers.cpp
index 50abd71bc..b8f68b11f 100644
--- a/radio/src/strhelpers.cpp
+++ b/radio/src/strhelpers.cpp
@@ -290,7 +290,7 @@ char * getSwitchName(char * dest, swsrc_t idx)
}
else {
*dest++ = 'S';
-#if defined(PCBX7)
+#if defined(PCBX7) && !defined(RADIO_TX12)
if (swinfo.quot >= 5)
*dest++ = 'H' + swinfo.quot - 5;
else if (swinfo.quot == 4)
diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp
index d3497dda7..bf230850d 100644
--- a/radio/src/switches.cpp
+++ b/radio/src/switches.cpp
@@ -126,9 +126,15 @@ uint64_t check3PosSwitchPosition(uint8_t idx, uint8_t sw, bool startup)
void getSwitchesPosition(bool startup)
{
uint64_t newPos = 0;
+#if defined(RADIO_TX12)
+ CHECK_2POS(SW_SA);
+ CHECK_3POS(0, SW_SB);
+ CHECK_3POS(1, SW_SC);
+#else
CHECK_3POS(0, SW_SA);
CHECK_3POS(1, SW_SB);
CHECK_3POS(2, SW_SC);
+#endif
#if defined(PCBX9LITES)
CHECK_2POS(SW_SD);
@@ -146,6 +152,10 @@ void getSwitchesPosition(bool startup)
#elif defined(PCBXLITE)
CHECK_3POS(3, SW_SD);
// no SWE, SWF, SWG and SWH on XLITE
+#elif defined(RADIO_TX12)
+ CHECK_2POS(SW_SD);
+ CHECK_3POS(2, SW_SE);
+ CHECK_3POS(3, SW_SF);
#elif defined(PCBX7)
CHECK_3POS(3, SW_SD);
CHECK_2POS(SW_SF);
diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp
index 62eb5a7eb..c6f5ee182 100644
--- a/radio/src/targets/common/arm/stm32/adc_driver.cpp
+++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp
@@ -44,6 +44,8 @@
const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,-1, 1,1, 1, 1};
#elif defined(PCBX9D)
const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,0, 1,1, 1, 1};
+#elif defined(RADIO_TX12)
+ const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, -1,-1, 1, 1};
#elif defined(PCBX7)
const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, 1,1, 1, 1};
#elif defined(PCBX9LITE)
diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt
index b94180761..55bcdeb66 100644
--- a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt
+++ b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt
@@ -96,7 +96,7 @@ if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL X9E OR (PCB STREQUAL X9
)
endif()
-if(PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES)
+if(BLUETOOTH)
set(BOOTLOADER_SRC
${BOOTLOADER_SRC}
../../../../../targets/common/arm/stm32/bluetooth_driver.cpp
diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp
index cd337fb7f..b849fa8a2 100644
--- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp
+++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp
@@ -247,7 +247,7 @@ int main()
backlightInit();
backlightEnable();
-#if defined(PCBX7) || defined(PCBXLITE)
+#if defined(BLUETOOTH)
// we shutdown the bluetooth module now to be sure it will be detected on firmware start
bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE, false);
#endif
diff --git a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp
index 00b3c76f8..570e134b1 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) && !defined(RADIO_T18)
+#if (defined(RADIO_FAMILY_T16) && !defined(RADIO_T18)) || defined(RADIO_TX12)
static uint8_t state = 0;
uint8_t pins = ROTARY_ENCODER_POSITION();
diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h
index 01826dfa3..fc2948be0 100644
--- a/radio/src/targets/horus/board.h
+++ b/radio/src/targets/horus/board.h
@@ -575,9 +575,9 @@ void usbJoystickUpdate();
#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 */
- #define USB_PRODUCT 'T', 'X', '1', '6', 'S', ' ', ' ', ' ' /* 8 Bytes */
+ #define USB_NAME "RM TX16S"
+ #define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */
+ #define USB_PRODUCT 'R', 'M', ' ', 'T', 'X', '1', '6', 'S' /* 8 Bytes */
#elif defined(PCBX10)
#define USB_NAME "FrSky X10"
#define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */
diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt
index 95d1b423b..e7c2be86d 100644
--- a/radio/src/targets/taranis/CMakeLists.txt
+++ b/radio/src/targets/taranis/CMakeLists.txt
@@ -124,6 +124,18 @@ elseif(PCB STREQUAL X7)
set(LUA_EXPORT lua_export_t12)
add_definitions(-DRADIO_T12)
add_definitions(-DEEPROM_VARIANT=0x4001)
+ elseif(PCBREV STREQUAL TX12)
+ option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON)
+ set(FLAVOUR tx12)
+ set(NAVIGATION_TYPE x7)
+ set(CPU_TYPE STM32F2)
+ set(CPU_TYPE_FULL STM32F205xE) # for size report
+ set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld)
+ set(ROTARY_ENCODER YES)
+ set(LUA_EXPORT lua_export_tx12)
+ set(BLUETOOTH NO)
+ add_definitions(-DRADIO_TX12)
+ add_definitions(-DEEPROM_VARIANT=0x4002)
elseif(PCBREV STREQUAL ACCESS)
option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF)
option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON)
@@ -294,7 +306,7 @@ if(INTERNAL_MODULE_SERIAL)
${TARGET_SRC}
../common/arm/stm32/intmodule_serial_driver.cpp
)
-elseif(NOT (PCB STREQUAL X7 AND PCBREV STREQUAL T12))
+elseif(INTERNAL_MODULE_PXX1 OR INTERNAL_MODULE_PXX2)
set(TARGET_SRC
${TARGET_SRC}
intmodule_pulses_driver.cpp
diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp
index 521ab1d9b..b038fc0f7 100644
--- a/radio/src/targets/taranis/board.cpp
+++ b/radio/src/targets/taranis/board.cpp
@@ -265,10 +265,16 @@ void boardOff()
// this function must not return!
}
+#if defined (RADIO_TX12)
+ #define BATTERY_DIVIDER 22830
+#else
+ #define BATTERY_DIVIDER 26214
+#endif
+
uint16_t getBatteryVoltage()
{
int32_t instant_vbat = anaIn(TX_VOLTAGE); // using filtered ADC value on purpose
- instant_vbat = (instant_vbat * BATT_SCALE * (128 + g_eeGeneral.txVoltageCalibration) ) / 26214;
+ instant_vbat = (instant_vbat * BATT_SCALE * (128 + g_eeGeneral.txVoltageCalibration) ) / BATTERY_DIVIDER;
instant_vbat += 20; // add 0.2V because of the diode TODO check if this is needed, but removal will break existing calibrations!
return (uint16_t)instant_vbat;
}
diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h
index 63ff281e4..d9092fcdc 100644
--- a/radio/src/targets/taranis/board.h
+++ b/radio/src/targets/taranis/board.h
@@ -27,6 +27,9 @@
#include "board_common.h"
#include "hal.h"
+#if defined(RADIO_TX12)
+ #define NAVIGATION_X7_TX12
+#endif
#if defined(ROTARY_ENCODER_NAVIGATION)
// Rotary Encoder driver
@@ -239,6 +242,26 @@ enum EnumKeys
KEY_PAGE,
#endif
+#if defined(KEYS_GPIO_REG_PAGEUP)
+ KEY_PAGEUP,
+#endif
+
+#if defined(KEYS_GPIO_REG_PAGEDN)
+ KEY_PAGEDN,
+#endif
+
+#if defined(KEYS_GPIO_REG_SYS)
+ KEY_SYS,
+#endif
+
+#if defined(KEYS_GPIO_REG_MDL)
+ KEY_MODEL,
+#endif
+
+#if defined(KEYS_GPIO_REG_TELE)
+ KEY_TELE,
+#endif
+
#if defined(KEYS_GPIO_REG_PLUS)
KEY_PLUS,
KEY_MINUS,
@@ -308,8 +331,11 @@ enum EnumSwitches
SW_SG,
SW_SH
};
-#define IS_3POS(x) ((x) != SW_SF && (x) != SW_SH)
-
+#if defined(RADIO_TX12)
+ #define IS_3POS(x) ((x) != SW_SA && (x) != SW_SD)
+#else
+ #define IS_3POS(x) ((x) != SW_SF && (x) != SW_SH)
+#endif
enum EnumSwitchesPositions
{
SW_SA0,
@@ -324,7 +350,7 @@ enum EnumSwitchesPositions
SW_SD0,
SW_SD1,
SW_SD2,
-#if defined(PCBX9) || defined(PCBXLITES) || defined(PCBX9LITES)
+#if defined(PCBX9) || defined(PCBXLITES) || defined(PCBX9LITES) || defined(RADIO_TX12)
SW_SE0,
SW_SE1,
SW_SE2,
@@ -339,7 +365,7 @@ enum EnumSwitchesPositions
SW_SG1,
SW_SG2,
#endif
-#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX7)
+#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || (defined(PCBX7) && !defined(RADIO_TX12))
SW_SH0,
SW_SH1,
SW_SH2,
@@ -411,6 +437,11 @@ enum EnumSwitchesPositions
#define STORAGE_NUM_SWITCHES NUM_SWITCHES
#define DEFAULT_SWITCH_CONFIG (SWITCH_2POS << 10) + (SWITCH_2POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0)
#define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 0) + (POT_WITHOUT_DETENT << 2); // S1 = pot without detent, S2 = pot with detent
+#elif defined(RADIO_TX12)
+ #define NUM_SWITCHES 8
+ #define STORAGE_NUM_SWITCHES NUM_SWITCHES
+ #define DEFAULT_SWITCH_CONFIG (SWITCH_3POS << 10) + (SWITCH_3POS << 8) + (SWITCH_TOGGLE << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_TOGGLE << 0)
+ #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2);
#elif defined(PCBX7ACCESS)
#define NUM_SWITCHES 7
#define STORAGE_NUM_SWITCHES 8
@@ -675,9 +706,15 @@ uint8_t isBacklightEnabled();
#if !defined(SIMU)
void usbJoystickUpdate();
#endif
-#define USB_NAME "FrSky Taranis"
-#define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */
-#define USB_PRODUCT 'T', 'a', 'r', 'a', 'n', 'i', 's', ' ' /* 8 Bytes */
+#if defined(RADIO_TX12)
+ #define USB_NAME "Radiomaster TX12"
+ #define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */
+ #define USB_PRODUCT 'R', 'M', ' ', 'T', 'X', '1', '2', ' ' /* 8 Bytes */
+#else
+ #define USB_NAME "FrSky Taranis"
+ #define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */
+ #define USB_PRODUCT 'T', 'a', 'r', 'a', 'n', 'i', 's', ' ' /* 8 Bytes */
+#endif
#if defined(__cplusplus) && !defined(SIMU)
}
@@ -848,7 +885,11 @@ void ledBlue();
#define IS_LCD_RESET_NEEDED() true
#define LCD_CONTRAST_MIN 10
#define LCD_CONTRAST_MAX 30
-#define LCD_CONTRAST_DEFAULT 15
+#if defined(RADIO_TX12)
+ #define LCD_CONTRAST_DEFAULT 21
+#else
+ #define LCD_CONTRAST_DEFAULT 15
+#endif
#endif
#if defined(PCBX9D) || defined(PCBX9E) || (defined(PCBX9DP) && PCBREV < 2019)
diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h
index aa4601577..4f82d94c2 100644
--- a/radio/src/targets/taranis/hal.h
+++ b/radio/src/targets/taranis/hal.h
@@ -59,6 +59,21 @@
#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_TX12)
+ #define KEYS_GPIO_REG_PAGEUP GPIOD->IDR
+ #define KEYS_GPIO_PIN_PAGEUP GPIO_Pin_3 // PD.03
+ #define KEYS_GPIO_REG_PAGEDN GPIOD->IDR
+ #define KEYS_GPIO_PIN_PAGEDN GPIO_Pin_7 // PD.07
+ #define KEYS_GPIO_REG_EXIT GPIOB->IDR
+ #define KEYS_GPIO_PIN_EXIT GPIO_Pin_3 // PB.03
+ #define KEYS_GPIO_REG_ENTER GPIOA->IDR
+ #define KEYS_GPIO_PIN_ENTER GPIO_Pin_13 // PA.13
+ #define KEYS_GPIO_REG_SYS GPIOB->IDR
+ #define KEYS_GPIO_PIN_SYS GPIO_Pin_4 // PB.04
+ #define KEYS_GPIO_REG_MDL GPIOE->IDR
+ #define KEYS_GPIO_PIN_MDL GPIO_Pin_11 // PE.11
+ #define KEYS_GPIO_REG_TELE GPIOD->IDR
+ #define KEYS_GPIO_PIN_TELE GPIO_Pin_2 // PD.02
#elif defined(PCBX7)
#define KEYS_GPIO_REG_PAGE GPIOD->IDR
#define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03
@@ -156,7 +171,23 @@
#define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOE
#define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource10
#define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource12
+#elif defined(RADIO_TX12)
+ #define ROTARY_ENCODER_NAVIGATION
+ #define ROTARY_ENCODER_GPIO GPIOE
+ #define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_9 // PE.9
+ #define ROTARY_ENCODER_GPIO_PIN_B GPIO_Pin_10 // PE.10
+ #define ROTARY_ENCODER_POSITION() ((ROTARY_ENCODER_GPIO->IDR >> 9) & 0x03)
+ #define ROTARY_ENCODER_EXTI_LINE1 EXTI_Line9
+ #define ROTARY_ENCODER_EXTI_LINE2 EXTI_Line10
+ #define ROTARY_ENCODER_EXTI_IRQn1 EXTI9_5_IRQn
+ #define ROTARY_ENCODER_EXTI_IRQHandler1 EXTI9_5_IRQHandler
+ #define ROTARY_ENCODER_EXTI_IRQn2 EXTI15_10_IRQn
+ #define ROTARY_ENCODER_EXTI_IRQHandler2 EXTI15_10_IRQHandler
+ #define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOE
+ #define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource9
+ #define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource10
#endif
+
#if defined(ROTARY_ENCODER_NAVIGATION)
#define ROTARY_ENCODER_RCC_APB1Periph RCC_APB1Periph_TIM5
#define ROTARY_ENCODER_TIMER TIM5
@@ -296,6 +327,11 @@
#define SWITCHES_GPIO_PIN_A_H GPIO_Pin_1 // PE.01
#define SWITCHES_GPIO_REG_A_L GPIOE->IDR
#define SWITCHES_GPIO_PIN_A_L GPIO_Pin_0 // PE.00
+#elif defined(RADIO_TX12)
+ #define STORAGE_SWITCH_A
+ #define HARDWARE_SWITCH_A
+ #define SWITCHES_GPIO_REG_A GPIOC->IDR
+ #define SWITCHES_GPIO_PIN_A GPIO_Pin_13 // PC.13
#elif defined(PCBX7)
#define STORAGE_SWITCH_A
#define HARDWARE_SWITCH_A
@@ -363,6 +399,13 @@
#define SWITCHES_GPIO_PIN_C_L GPIO_Pin_2 // PE.02
#define SWITCHES_GPIO_REG_C_H GPIOE->IDR
#define SWITCHES_GPIO_PIN_C_H GPIO_Pin_3 // PE.03
+#elif defined(RADIO_TX12)
+ #define STORAGE_SWITCH_C
+ #define HARDWARE_SWITCH_C
+ #define SWITCHES_GPIO_REG_C_L GPIOD->IDR
+ #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_11 // PD.11
+ #define SWITCHES_GPIO_REG_C_H GPIOE->IDR
+ #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_0 // PE.00
#elif defined(PCBX7)
#define STORAGE_SWITCH_C
#define HARDWARE_SWITCH_C
@@ -405,6 +448,11 @@
#define SWITCHES_GPIO_PIN_D_L GPIO_Pin_4 // PB.04
#define SWITCHES_GPIO_REG_D_H GPIOB->IDR
#define SWITCHES_GPIO_PIN_D_H GPIO_Pin_5 // PB.05
+#elif defined(RADIO_TX12)
+ #define STORAGE_SWITCH_D
+ #define HARDWARE_SWITCH_D
+ #define SWITCHES_GPIO_REG_D GPIOE->IDR
+ #define SWITCHES_GPIO_PIN_D GPIO_Pin_8 // PE.08
#elif defined(PCBX7)
#define STORAGE_SWITCH_D
#define HARDWARE_SWITCH_D
@@ -446,6 +494,13 @@
#define HARDWARE_SWITCH_E
#define SWITCHES_GPIO_REG_E GPIOA->IDR
#define SWITCHES_GPIO_PIN_E GPIO_Pin_5 // PA.05
+#elif defined(RADIO_TX12)
+ #define STORAGE_SWITCH_E
+ #define HARDWARE_SWITCH_E
+ #define SWITCHES_GPIO_REG_E_H GPIOE->IDR
+ #define SWITCHES_GPIO_PIN_E_H GPIO_Pin_13 // PE.13
+ #define SWITCHES_GPIO_REG_E_L GPIOE->IDR
+ #define SWITCHES_GPIO_PIN_E_L GPIO_Pin_7 // PE.07
#elif defined(PCBX7)
// no SWE
#else
@@ -477,6 +532,13 @@
#define SWITCHES_GPIO_PIN_F GPIO_Pin_3 // PC.03
#elif defined(PCBX9LITE)
// no SWF
+#elif defined(RADIO_TX12)
+ #define STORAGE_SWITCH_F
+ #define HARDWARE_SWITCH_F
+ #define SWITCHES_GPIO_REG_F_L GPIOE->IDR
+ #define SWITCHES_GPIO_PIN_F_L GPIO_Pin_1 // PE.01
+ #define SWITCHES_GPIO_REG_F_H GPIOE->IDR
+ #define SWITCHES_GPIO_PIN_F_H GPIO_Pin_2 // PE.02
#elif defined(PCBX7)
#define STORAGE_SWITCH_F
#define HARDWARE_SWITCH_F
@@ -524,6 +586,7 @@
#define SWITCHES_GPIO_PIN_H GPIO_Pin_14 // PD.14
#elif defined(PCBXLITE) || defined(PCBX9LITE)
// no SWH
+#elif defined(RADIO_TX12)
#elif defined(PCBX7)
#define STORAGE_SWITCH_H
#define HARDWARE_SWITCH_H
@@ -552,7 +615,16 @@
#define SWITCHES_GPIO_REG_I GPIOC->IDR
#define SWITCHES_GPIO_PIN_I GPIO_Pin_13 // PC.13
#define STORAGE_SWITCH_J
-#elif defined(PCBX7)
+#elif defined(RADIO_TX12)
+ #define STORAGE_SWITCH_I
+ #define HARDWARE_SWITCH_I
+ #define SWITCHES_GPIO_REG_I GPIOE->IDR
+ #define SWITCHES_GPIO_PIN_I GPIO_Pin_14 // PE.14
+ #define STORAGE_SWITCH_J
+ #define HARDWARE_SWITCH_J
+ #define SWITCHES_GPIO_REG_J GPIOD->IDR
+ #define SWITCHES_GPIO_PIN_J GPIO_Pin_14 // PD.14
+#elif defined(PCBX7)
#define STORAGE_SWITCH_I
#define HARDWARE_SWITCH_I
#define SWITCHES_GPIO_REG_I GPIOC->IDR
@@ -662,11 +734,18 @@
#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(RADIO_T12)
- #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE)
+ #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE)
#define KEYS_GPIOA_PINS GPIO_Pin_5
#define KEYS_GPIOC_PINS (GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3)
#define KEYS_GPIOD_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15)
#define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15)
+#elif defined(RADIO_TX12)
+ #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE)
+ #define KEYS_GPIOA_PINS (GPIO_Pin_13 | GPIO_Pin_5)
+ #define KEYS_GPIOB_PINS (GPIO_Pin_3 | GPIO_Pin_4)
+ #define KEYS_GPIOC_PINS (GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_13)
+ #define KEYS_GPIOD_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15)
+ #define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8| GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15)
#elif defined(RADIO_X7ACCESS)
#define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE)
#define KEYS_GPIOA_PINS GPIO_Pin_5
@@ -1073,8 +1152,10 @@
#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)
+#elif defined(RADIO_T12) || defined(RADIO_TX12)
#define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1)
+ #define INTMODULE_RCC_APB1Periph (RCC_APB1Periph_USART3 | RCC_APB1Periph_TIM2)
+ #define INTMODULE_RCC_APB2Periph 0
#define INTMODULE_PWR_GPIO GPIOC
#define INTMODULE_PWR_GPIO_PIN GPIO_Pin_6 // PC.06
#define INTMODULE_GPIO GPIOB
@@ -1086,8 +1167,6 @@
#define INTMODULE_GPIO_AF GPIO_AF_USART3
#define INTMODULE_USART_IRQn USART3_IRQn
#define INTMODULE_USART_IRQHandler USART3_IRQHandler
- #define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2
- #define INTMODULE_RCC_APB2Periph RCC_APB1Periph_USART3
#define INTMODULE_TIMER TIM2
#define INTMODULE_TIMER_IRQn TIM2_IRQn
#define INTMODULE_TIMER_IRQHandler TIM2_IRQHandler
@@ -1163,30 +1242,6 @@
#define EXTMODULE_USART_TX_DMA_STREAM DMA2_Stream6
#define EXTMODULE_USART_RX_DMA_CHANNEL DMA_Channel_5
#define EXTMODULE_USART_RX_DMA_STREAM DMA2_Stream1
-#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)
#elif defined(RADIO_X9DP2019)
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
#define EXTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM8 | RCC_APB2Periph_USART6)
@@ -1211,22 +1266,22 @@
#define EXTMODULE_TIMER_OUTPUT_POLARITY TIM_CCER_CC2NP
#define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#else
- #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 // 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 // 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 // TIM8_UP
- #define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1 // TIM8_UP
+ #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 // 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
+ #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource7 // PA.07
+ #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
@@ -1369,7 +1424,7 @@
#define TELEMETRY_EXTI_IRQn EXTI9_5_IRQn
#define TELEMETRY_EXTI_TRIGGER EXTI_Trigger_Rising
-#if defined(RADIO_X7) || defined(RADIO_X7ACCESS)
+#if defined(RADIO_X7) || defined(RADIO_X7ACCESS) || defined(RADIO_TX12)
#define TELEMETRY_EXTI_REUSE_INTERRUPT_ROTARY_ENCODER
#elif defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019)
#define TELEMETRY_EXTI_IRQHandler EXTI9_5_IRQHandler
@@ -1382,7 +1437,7 @@
#define TELEMETRY_TIMER_IRQHandler TIM1_TRG_COM_TIM11_IRQHandler
// PCBREV
-#if defined(PCBX7)
+#if defined(RADIO_X7)
#define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOA
#define PCBREV_GPIO GPIOA
#define PCBREV_GPIO_PIN GPIO_Pin_14 // PA.14
@@ -1465,7 +1520,7 @@
#define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource7
#define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line7
#define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI9_5_IRQn
-#elif defined(RADIO_X7)
+#elif defined(RADIO_X7) || defined(RADIO_TX12)
#define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER
#define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC
@@ -1650,6 +1705,9 @@
#define KEYS_BACKLIGHT_RCC_AHB1Periph 0
// LCD driver
+#if defined(RADIO_TX12) || defined(RADIO_T12)
+ #define LCD_VERTICAL_INVERT
+#endif
#if defined(PCBX9E)
#define LCD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1)
#define LCD_RCC_APB1Periph RCC_APB1Periph_SPI3
@@ -1842,6 +1900,12 @@
#define AUDIO_SPEAKER_ENABLE_GPIO_PIN GPIO_Pin_14 // PD.14
#define HEADPHONE_TRAINER_SWITCH_GPIO GPIOD
#define HEADPHONE_TRAINER_SWITCH_GPIO_PIN GPIO_Pin_9 // PD.09
+#elif defined(RADIO_TX12)
+ #define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1)
+ #define AUDIO_MUTE_GPIO GPIOE
+ #define AUDIO_MUTE_GPIO_PIN GPIO_Pin_12 // PE.12
+ #define AUDIO_UNMUTE_DELAY 150 // ms
+ #define AUDIO_MUTE_DELAY 500 // ms
#else
#define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1)
#endif
@@ -1930,7 +1994,7 @@
#define BT_TX_GPIO_PinSource GPIO_PinSource14
#define BT_RX_GPIO_PinSource GPIO_PinSource9
#define BT_USART_IRQHandler USART6_IRQHandler
-#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITES) || defined(RADIO_X9DP2019)
+#elif defined(RADIO_X7) || defined(PCBXLITE) || defined(PCBX9LITES) || defined(RADIO_X9DP2019)
#define STORAGE_BLUETOOTH
#define BT_RCC_APB1Periph RCC_APB1Periph_USART3
#define BT_RCC_APB2Periph 0
@@ -1962,7 +2026,7 @@
#define BT_USART_IRQn USART3_IRQn
// #define BT_DMA_Stream_RX DMA1_Stream1
// #define BT_DMA_Channel_RX DMA_Channel_4
-#elif defined(PCBX9D) || defined(PCBX9DP)
+#elif defined(PCBX9D) || defined(PCBX9DP) || defined(RADIO_T12) || defined(RADIO_TX12)
#define STORAGE_BLUETOOTH
#define BT_RCC_AHB1Periph 0
#define BT_RCC_APB1Periph 0
diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp
index 0699a1c50..6883740c4 100644
--- a/radio/src/targets/taranis/keys_driver.cpp
+++ b/radio/src/targets/taranis/keys_driver.cpp
@@ -37,6 +37,31 @@ uint32_t readKeys()
result |= 1 << KEY_PAGE;
#endif
+#if defined(KEYS_GPIO_PIN_PAGEUP)
+ if (~KEYS_GPIO_REG_PAGEUP & KEYS_GPIO_PIN_PAGEUP)
+ result |= 1 << KEY_PAGEUP;
+#endif
+
+#if defined(KEYS_GPIO_PIN_PAGEDN)
+ if (~KEYS_GPIO_REG_PAGEDN & KEYS_GPIO_PIN_PAGEDN)
+ result |= 1 << KEY_PAGEDN;
+#endif
+
+#if defined(KEYS_GPIO_PIN_SYS)
+ if (~KEYS_GPIO_REG_SYS & KEYS_GPIO_PIN_SYS)
+ result |= 1 << KEY_SYS;
+#endif
+
+#if defined(KEYS_GPIO_PIN_MDL)
+ if (~KEYS_GPIO_REG_MDL & KEYS_GPIO_PIN_MDL)
+ result |= 1 << KEY_MODEL;
+#endif
+
+#if defined(KEYS_GPIO_PIN_TELE)
+ if (~KEYS_GPIO_REG_TELE & KEYS_GPIO_PIN_TELE)
+ result |= 1 << KEY_TELE;
+#endif
+
if (~KEYS_GPIO_REG_EXIT & KEYS_GPIO_PIN_EXIT)
result |= 1 << KEY_EXIT;
@@ -115,7 +140,7 @@ void readKeysAndTrims()
{
uint8_t index = 0;
uint32_t keys_input = readKeys();
- for (uint8_t i = 1; i != uint8_t(1 << TRM_BASE); i <<= 1) {
+ for (unsigned i = 1; i != unsigned(1 << TRM_BASE); i <<= 1) {
keys[index++].input(keys_input & i);
}
@@ -175,10 +200,15 @@ uint32_t switchState(uint8_t index)
uint32_t xxx = 0;
switch (index) {
+#if defined(RADIO_TX12)
+ ADD_2POS_CASE(A);
+ ADD_3POS_CASE(B, 1);
+ ADD_3POS_CASE(C, 2);
+#else
ADD_3POS_CASE(A, 0);
ADD_3POS_CASE(B, 1);
ADD_3POS_CASE(C, 2);
-
+#endif
#if defined(PCBX9LITES)
ADD_2POS_CASE(D);
ADD_2POS_CASE(E);
@@ -201,6 +231,10 @@ uint32_t switchState(uint8_t index)
ADD_2POS_CASE(H);
ADD_2POS_CASE(I);
// no SWJ on XLITE
+#elif defined(RADIO_TX12)
+ ADD_2POS_CASE(D);
+ ADD_3POS_CASE(E, 4);
+ ADD_3POS_CASE(F, 5);
#elif defined(PCBX7)
ADD_3POS_CASE(D, 3);
ADD_2POS_CASE(F);
diff --git a/radio/src/targets/taranis/lcd_driver_spi.cpp b/radio/src/targets/taranis/lcd_driver_spi.cpp
index 6936ae85f..e1efa8e15 100644
--- a/radio/src/targets/taranis/lcd_driver_spi.cpp
+++ b/radio/src/targets/taranis/lcd_driver_spi.cpp
@@ -20,7 +20,7 @@
#include "opentx.h"
-#if defined(RADIO_T12)
+#if defined(RADIO_T12) || defined(RADIO_TX12)
#define LCD_CONTRAST_OFFSET -10
#else
#define LCD_CONTRAST_OFFSET 160
@@ -107,8 +107,8 @@ void lcdHardwareInit()
#if LCD_W == 128
void lcdStart()
{
-#if defined(RADIO_T12)
- // Jumper has the screen inverted.
+#if defined(LCD_VERTICAL_INVERT)
+ // T12 and TX12 have the screen inverted.
lcdWriteCommand(0xe2); // (14) Soft reset
lcdWriteCommand(0xa0); // Set seg
lcdWriteCommand(0xc8); // Set com
@@ -201,7 +201,7 @@ 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)
+#if !defined(LCD_VERTICAL_INVERT)
lcdWriteCommand(0x04);
#endif
diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt
index e7f444bc6..2c9fbdbd7 100644
--- a/radio/src/translations/cz.h.txt
+++ b/radio/src/translations/cz.h.txt
@@ -291,6 +291,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Dolů\0""Nhoru""Vprvo""Vlevo"
+#elif defined(RADIO_TX12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\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 7aeadda27..2630a74fb 100644
--- a/radio/src/translations/de.h.txt
+++ b/radio/src/translations/de.h.txt
@@ -297,6 +297,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(RADIO_TX12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt
index e291f6055..bda4e8a9d 100644
--- a/radio/src/translations/en.h.txt
+++ b/radio/src/translations/en.h.txt
@@ -297,6 +297,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(RADIO_TX12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt
index 2d60db7c6..3af6b1a5d 100644
--- a/radio/src/translations/es.h.txt
+++ b/radio/src/translations/es.h.txt
@@ -294,6 +294,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(RADIO_TX12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt
index 6634f3b17..ec06cb50b 100644
--- a/radio/src/translations/fi.h.txt
+++ b/radio/src/translations/fi.h.txt
@@ -315,6 +315,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(RADIO_TX12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt
index b057e6d27..762e65bb3 100644
--- a/radio/src/translations/fr.h.txt
+++ b/radio/src/translations/fr.h.txt
@@ -317,6 +317,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(RADIO_TX12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\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 1fca66b10..dd6919244 100644
--- a/radio/src/translations/it.h.txt
+++ b/radio/src/translations/it.h.txt
@@ -318,6 +318,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(RADIO_TX12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt
index a53344085..8cb0f9433 100644
--- a/radio/src/translations/nl.h.txt
+++ b/radio/src/translations/nl.h.txt
@@ -295,6 +295,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(RADIO_TX12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt
index e38d4d7f0..2b88a8103 100644
--- a/radio/src/translations/pl.h.txt
+++ b/radio/src/translations/pl.h.txt
@@ -315,6 +315,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(RADIO_TX12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt
index 653ebb650..b55071de6 100644
--- a/radio/src/translations/pt.h.txt
+++ b/radio/src/translations/pt.h.txt
@@ -302,8 +302,22 @@
#define LEN_VSWASHTYPE "\004"
#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0"
-#define LEN_VKEYS "\005"
-#define TR_VKEYS TR("Menu\0""Sair\0""Desce""Sobe\0""Direi""Esqda", "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus")
+#if defined(PCBHORUS)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "PGUP\0""PGDN\0""ENTER""MDL\0 ""RTN\0 ""TELE\0""SYS\0 "
+#elif defined(RADIO_T12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(RADIO_TX12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\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""Ned\0 ""Upp\0 ""Höger""Vänst"
+#endif
#define LEN_VSWITCHES "\003"
#define LEN_VSRCRAW "\004"
diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt
index 5bb905ede..c28fce6d9 100644
--- a/radio/src/translations/se.h.txt
+++ b/radio/src/translations/se.h.txt
@@ -304,11 +304,14 @@
#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0 "
#if defined(PCBHORUS)
- #define LEN_VKEYS "\005"
- #define TR_VKEYS "PGUP\0""PGDN\0""ENTER""MDL\0 ""RTN\0 ""TELE\0""SYS\0 "
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "PGUP\0""PGDN\0""ENTER""MDL\0 ""RTN\0 ""TELE\0""SYS\0 "
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
+#elif defined(RADIO_TX12)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h
index 8f13d4cea..fd1969440 100644
--- a/radio/src/translations/untranslated.h
+++ b/radio/src/translations/untranslated.h
@@ -44,6 +44,9 @@
#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(RADIO_TX12)
+ #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0"
+ #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SI\0""\312SJ\0"
#elif defined(PCBX7)
#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"
diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py
index c27e6b58a..ff271f3d1 100755
--- a/radio/util/build-firmware.py
+++ b/radio/util/build-firmware.py
@@ -146,6 +146,11 @@ def main():
cmake_options["PCBREV"] = "T12"
firmware_options = options_jumper_t12
maxsize = 65536 * 8
+ elif board_name == "t12":
+ cmake_options["PCB"] = "X7"
+ cmake_options["PCBREV"] = "TX12"
+ firmware_options = options_radiomaster_tx12
+ maxsize = 65536 * 8
elif board_name == "t16":
cmake_options["PCB"] = "X10"
cmake_options["PCBREV"] = "T16"
diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py
index 8b34e6bf6..f4438db44 100755
--- a/radio/util/fwoptions.py
+++ b/radio/util/fwoptions.py
@@ -246,6 +246,18 @@ options_jumper_t18 = {
"bluetooth": ("BLUETOOTH", "YES", "NO"),
}
+options_radiomaster_tx12 = {
+ "noheli": ("HELI", "NO", "YES"),
+ "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"),
+ "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"),
+ "nogvars": ("GVARS", "NO", "YES"),
+ "faimode": ("FAI", "YES", None),
+ "faichoice": ("FAI", "CHOICE", None),
+ "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"),
+ "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None),
+ "afhds3": ("AFHDS3", "YES", "NO")
+}
+
options_radiomaster_tx16s = {
"noheli": ("HELI", "NO", "YES"),
"ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"),
diff --git a/tools/build-companion-nightly.sh b/tools/build-companion-nightly.sh
index fbf8f7166..a0406f691 100755
--- a/tools/build-companion-nightly.sh
+++ b/tools/build-companion-nightly.sh
@@ -70,6 +70,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=T12 ${SRCDIR}
make -j${JOBS} libsimulator
rm CMakeCache.txt
+cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=TX12 ${SRCDIR}
+make -j${JOBS} libsimulator
+rm CMakeCache.txt
+
cmake ${COMMON_OPTIONS} -DPCB=X9D ${SRCDIR}
make -j${JOBS} libsimulator
rm CMakeCache.txt
diff --git a/tools/build-companion-release.sh b/tools/build-companion-release.sh
index b73ce8ed2..463645dc2 100755
--- a/tools/build-companion-release.sh
+++ b/tools/build-companion-release.sh
@@ -70,6 +70,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=T12 ${SRCDIR}
make -j${JOBS} libsimulator
rm CMakeCache.txt
+cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=TX12 ${SRCDIR}
+make -j${JOBS} libsimulator
+rm CMakeCache.txt
+
cmake ${COMMON_OPTIONS} -DPCB=X9D ${SRCDIR}
make -j${JOBS} libsimulator
rm CMakeCache.txt
diff --git a/tools/build-radiomaster.py b/tools/build-radiomaster.py
index 83faa31bb..985bc705a 100755
--- a/tools/build-radiomaster.py
+++ b/tools/build-radiomaster.py
@@ -18,6 +18,16 @@ boards = {
"PCB": "X10",
"PCBREV": "TX16S",
"DEFAULT_MODE": "2",
+ },
+ "TX12_1": {
+ "PCB": "X7",
+ "PCBREV": "TX12",
+ "DEFAULT_MODE": "1",
+ },
+ "TX12_2": {
+ "PCB": "X7",
+ "PCBREV": "TX12",
+ "DEFAULT_MODE": "2",
}
}