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 +
lcdwidget.h
+ 1 +
+ + ButtonsWidget + QWidget +
buttonswidget.h
+ 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", } }