From 84c86f718be6f64b64fc0cbf7913974b9831a1f4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 4 Jan 2021 12:14:40 +0100 Subject: [PATCH] Jumper TLite support --- companion/src/CMakeLists.txt | 2 + companion/src/companion.qrc | 10 + companion/src/firmwares/boards.cpp | 28 +- companion/src/firmwares/boards.h | 12 +- companion/src/firmwares/generalsettings.cpp | 10 + companion/src/firmwares/opentx/opentxeeprom.h | 1 + .../src/firmwares/opentx/opentxinterface.cpp | 26 +- companion/src/generaledit/hardware.cpp | 4 +- .../images/simulator/JumperTLITE/bottom.png | Bin 0 -> 27316 bytes .../simulator/JumperTLITE/center_LCD.png | Bin 0 -> 472 bytes .../src/images/simulator/JumperTLITE/left.png | Bin 0 -> 31718 bytes .../images/simulator/JumperTLITE/right.png | Bin 0 -> 29322 bytes .../src/images/simulator/JumperTLITE/top.png | Bin 0 -> 5947 bytes companion/src/simulation/CMakeLists.txt | 2 + companion/src/simulation/simulateduiwidget.h | 13 + .../simulateduiwidgetJumperTLITE.cpp | 60 ++++ .../simulateduiwidgetJumperTLITE.ui | 258 ++++++++++++++++++ companion/src/simulation/simulatorwidget.cpp | 3 + radio/src/gui/128x64/radio_setup.cpp | 4 +- .../src/gui/common/stdlcd/radio_hardware.cpp | 14 +- radio/src/gui/navigation/navigation_9x.cpp | 4 +- radio/src/gui/navigation/navigation_xlite.cpp | 10 - radio/src/lua/CMakeLists.txt | 1 + radio/src/lua/api_general.cpp | 2 + radio/src/pulses/pulses.cpp | 2 +- radio/src/sdcard.h | 2 + radio/src/simu.cpp | 2 +- .../targets/common/arm/stm32/adc_driver.cpp | 5 +- .../arm/stm32/bootloader/CMakeLists.txt | 2 +- radio/src/targets/horus/CMakeLists.txt | 1 + radio/src/targets/horus/hal.h | 2 + radio/src/targets/taranis/CMakeLists.txt | 13 + radio/src/targets/taranis/board.h | 27 +- radio/src/targets/taranis/hal.h | 67 ++++- radio/src/targets/taranis/keys_driver.cpp | 7 + radio/src/targets/taranis/lcd_driver_spi.cpp | 2 +- radio/src/translations/cz.h.txt | 2 +- radio/src/translations/de.h.txt | 2 +- radio/src/translations/en.h.txt | 2 +- radio/src/translations/es.h.txt | 2 +- radio/src/translations/fi.h.txt | 2 +- radio/src/translations/fr.h.txt | 2 +- radio/src/translations/it.h.txt | 2 +- radio/src/translations/nl.h.txt | 2 +- radio/src/translations/pl.h.txt | 2 +- radio/src/translations/pt.h.txt | 2 +- radio/src/translations/se.h.txt | 2 +- radio/src/translations/untranslated.h | 2 +- tools/build-jumper.py | 7 +- tools/commit-tests.sh | 18 ++ 50 files changed, 591 insertions(+), 54 deletions(-) create mode 100644 companion/src/images/simulator/JumperTLITE/bottom.png create mode 100644 companion/src/images/simulator/JumperTLITE/center_LCD.png create mode 100644 companion/src/images/simulator/JumperTLITE/left.png create mode 100644 companion/src/images/simulator/JumperTLITE/right.png create mode 100644 companion/src/images/simulator/JumperTLITE/top.png create mode 100644 companion/src/simulation/simulateduiwidgetJumperTLITE.cpp create mode 100644 companion/src/simulation/simulateduiwidgetJumperTLITE.ui diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index 3d27550e6..2f05ab859 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 TLITE) + set(FLAVOUR tlite) elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TX12) set(FLAVOUR tx12) elseif(PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) diff --git a/companion/src/companion.qrc b/companion/src/companion.qrc index fbbacdb48..e4d15c183 100644 --- a/companion/src/companion.qrc +++ b/companion/src/companion.qrc @@ -179,6 +179,16 @@ images/simulator/JumperT12/JumperT12-x.png images/simulator/JumperT12/JumperT12-center.png images/simulator/JumperT12/JumperT12-top.png + images/simulator/JumperTLITE/bottom.png + images/simulator/JumperTLITE/bottom_right.png + images/simulator/JumperTLITE/bottom_left.png + images/simulator/JumperTLITE/left.png + images/simulator/JumperTLITE/left_top.png + images/simulator/JumperTLITE/left_bottom.png + images/simulator/JumperTLITE/right.png + images/simulator/JumperTLITE/right_top.png + images/simulator/JumperTLITE/right_bottom.png + images/simulator/JumperTLITE/top.png images/simulator/TX12/left.png images/simulator/TX12/left-pageup.png images/simulator/TX12/left-pagedn.png diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index 35f7a0bab..23179fd60 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -79,6 +79,8 @@ uint32_t Boards::getFourCC(Type board) return 0x3278746F; case BOARD_JUMPER_T12: return 0x3D78746F; + case BOARD_JUMPER_TLITE: + return 0x4278746F; case BOARD_JUMPER_T16: return 0x3F78746F; case BOARD_JUMPER_T18: @@ -113,6 +115,7 @@ int Boards::getEEpromSize(Board::Type board) case BOARD_TARANIS_X9DP_2019: case BOARD_TARANIS_X9E: case BOARD_JUMPER_T12: + case BOARD_JUMPER_TLITE: case BOARD_RADIOMASTER_TX12: return EESIZE_TARANIS; case BOARD_UNKNOWN: @@ -148,6 +151,7 @@ int Boards::getFlashSize(Type board) case BOARD_TARANIS_X9DP_2019: case BOARD_TARANIS_X9E: case BOARD_JUMPER_T12: + case BOARD_JUMPER_TLITE: case BOARD_RADIOMASTER_TX12: return FSIZE_TARANIS; case BOARD_HORUS_X12S: @@ -181,7 +185,7 @@ SwitchInfo Boards::getSwitchInfo(Board::Type board, int index) if (index < DIM(switches)) return switches[index]; } - else if (IS_TARANIS_XLITE(board)) { + else if (IS_TARANIS_XLITE(board) || IS_JUMPER_TLITE(board)) { const Board::SwitchInfo switches[] = { {SWITCH_3POS, "SA"}, {SWITCH_3POS, "SB"}, @@ -294,7 +298,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability) case Sticks: return 4; - case Pots: + case Pots: // Storage pots if (IS_TARANIS_X9LITE(board)) return 1; else if (IS_TARANIS_SMALL(board)) @@ -308,6 +312,12 @@ int Boards::getCapability(Board::Type board, Board::Capability capability) else return 3; + case AvailablePots: + if (IS_JUMPER_TLITE(board)) + return 0; + else + return getCapability(board, Pots); + case FactoryInstalledPots: if (IS_TARANIS_X9(board)) return 2; @@ -365,9 +375,17 @@ int Boards::getCapability(Board::Type board, Board::Capability capability) else return 7; + case AvailableSwitches: + if (IS_JUMPER_TLITE(board)) + return 4; + else + return getCapability(board, Switches); + case FactoryInstalledSwitches: if (IS_TARANIS_X9E(board)) return 8; + else if (IS_JUMPER_TLITE(board)) + return 4; if (IS_FAMILY_T12(board)) return 6; if (IS_HORUS_X12S(board)) @@ -515,8 +533,6 @@ QString Boards::getBoardName(Board::Type board) return "Taranis X7/X7S"; case BOARD_TARANIS_X7_ACCESS: return "Taranis X7/X7S Access"; - case BOARD_JUMPER_T12: - return "Jumper T12"; case BOARD_TARANIS_XLITE: return "Taranis X-Lite"; case BOARD_TARANIS_XLITES: @@ -545,6 +561,10 @@ QString Boards::getBoardName(Board::Type board) return "Horus X10/X10S"; case BOARD_X10_EXPRESS: return "Horus X10/X10S Express"; + case BOARD_JUMPER_T12: + return "Jumper T12"; + case BOARD_JUMPER_TLITE: + return "Jumper T-Lite"; case BOARD_JUMPER_T16: return "Jumper T16"; case BOARD_JUMPER_T18: diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index 1e1588485..a1ef1c629 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -53,9 +53,10 @@ namespace Board { BOARD_RADIOMASTER_TX16S, BOARD_JUMPER_T18, BOARD_RADIOMASTER_TX12, + BOARD_JUMPER_TLITE }; - constexpr int BOARD_TYPE_MAX = BOARD_RADIOMASTER_TX12; + constexpr int BOARD_TYPE_MAX = BOARD_JUMPER_TLITE; enum PotType { @@ -117,6 +118,7 @@ namespace Board { enum Capability { Sticks, Pots, + AvailablePots, FactoryInstalledPots, Sliders, MouseAnalogs, @@ -126,6 +128,7 @@ namespace Board { MultiposPotsPositions, Switches, SwitchPositions, + AvailableSwitches, FactoryInstalledSwitches, NumTrims, NumTrimSwitches @@ -204,6 +207,11 @@ inline bool IS_JUMPER_T12(Board::Type board) return board == Board::BOARD_JUMPER_T12; } +inline bool IS_JUMPER_TLITE(Board::Type board) +{ + return board == Board::BOARD_JUMPER_TLITE; +} + inline bool IS_JUMPER_T16(Board::Type board) { return board == Board::BOARD_JUMPER_T16; @@ -231,7 +239,7 @@ inline bool IS_FAMILY_T16(Board::Type board) inline bool IS_FAMILY_T12(Board::Type board) { - return board == Board::BOARD_JUMPER_T12 || board == Board::BOARD_RADIOMASTER_TX12; + return board == Board::BOARD_JUMPER_T12 || board == Board::BOARD_RADIOMASTER_TX12 || board == Board::BOARD_JUMPER_TLITE;; } inline bool IS_TARANIS_XLITE(Board::Type board) diff --git a/companion/src/firmwares/generalsettings.cpp b/companion/src/firmwares/generalsettings.cpp index 005900c93..f9df851b2 100644 --- a/companion/src/firmwares/generalsettings.cpp +++ b/companion/src/firmwares/generalsettings.cpp @@ -94,6 +94,12 @@ GeneralSettings::GeneralSettings() vBatMin = -23; // 6.7V vBatMax = -37; // 8.3V } + else if (IS_JUMPER_TLITE(board)) { + // 1S Li-Ion + vBatWarn = 32; + vBatMin = -60; //3V + vBatMax = -78; //4.2V + } else if (IS_TARANIS(board)) { // NI-MH 7.2V, X9D, X9D+ and X7 vBatWarn = 65; @@ -239,6 +245,10 @@ void GeneralSettings::setDefaultControlTypes(Board::Type board) switchConfig[i] = Boards::getSwitchInfo(board, i).config; } + // TLite does not have pots or sliders + if (IS_JUMPER_TLITE(board)) + return; + // TODO: move to Boards, like with switches if (IS_FAMILY_HORUS_OR_T16(board)) { potConfig[0] = Board::POT_WITH_DETENT; diff --git a/companion/src/firmwares/opentx/opentxeeprom.h b/companion/src/firmwares/opentx/opentxeeprom.h index aabbe2284..115885474 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.h +++ b/companion/src/firmwares/opentx/opentxeeprom.h @@ -37,6 +37,7 @@ #define TARANIS_X9LITES_VARIANT 0x0801 #define JUMPER_T12_VARIANT 0x4001 #define RADIOMASTER_TX12_VARIANT 0x4002 +#define JUMPER_TLITE_VARIANT 0x4003 class OpenTxGeneralData: public TransformedField { public: diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 04f02eb29..0b22e4f37 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -60,6 +60,8 @@ const char * OpenTxEepromInterface::getName() switch (board) { case BOARD_JUMPER_T12: return "OpenTX for Jumper T12"; + case BOARD_JUMPER_TLITE: + return "OpenTX for Jumper T-Lite"; case BOARD_JUMPER_T16: return "OpenTX for Jumper T16"; case BOARD_JUMPER_T18: @@ -336,6 +338,9 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u else if (IS_JUMPER_T12(board)) { variant |= JUMPER_T12_VARIANT; } + else if (IS_JUMPER_TLITE(board)) { + variant |= JUMPER_TLITE_VARIANT; + } else if (IS_RADIOMASTER_TX12(board)) { variant |= RADIOMASTER_TX12_VARIANT; } @@ -683,6 +688,8 @@ int OpenTxFirmware::getCapability(::Capability capability) return TARANIS_XLITE_VARIANT; else if (IS_JUMPER_T12(board)) return JUMPER_T12_VARIANT; + else if (IS_JUMPER_TLITE(board)) + return JUMPER_TLITE_VARIANT; else if (IS_RADIOMASTER_TX12(board)) return RADIOMASTER_TX12_VARIANT; else @@ -746,7 +753,7 @@ bool OpenTxFirmware::isAvailable(PulsesProtocol proto, int port) case PULSES_ACCST_ISRM_D16: return IS_ACCESS_RADIO(board, id); case PULSES_MULTIMODULE: - return id.contains("internalmulti") || IS_RADIOMASTER_TX16S(board) || IS_JUMPER_T18(board); + return id.contains("internalmulti") || IS_RADIOMASTER_TX16S(board) || IS_JUMPER_T18(board) || IS_RADIOMASTER_TX12(board) || IS_JUMPER_TLITE(board); default: return false; } @@ -778,7 +785,7 @@ bool OpenTxFirmware::isAvailable(PulsesProtocol proto, int port) case PULSES_XJT_LITE_X16: case PULSES_XJT_LITE_D8: case PULSES_XJT_LITE_LR12: - return (IS_TARANIS_XLITE(board) || IS_TARANIS_X9LITE(board)); + return (IS_TARANIS_XLITE(board) || IS_TARANIS_X9LITE(board) || IS_JUMPER_TLITE(board)); default: return false; } @@ -949,6 +956,11 @@ bool OpenTxEepromInterface::checkVariant(unsigned int version, unsigned int vari variantError = true; } } + else if (IS_JUMPER_TLITE(board)) { + if (variant != JUMPER_TLITE_VARIANT) { + variantError = true; + } + } else if (IS_RADIOMASTER_TX12(board)) { if (variant != RADIOMASTER_TX12_VARIANT) { variantError = true; @@ -1275,6 +1287,16 @@ void registerOpenTxFirmwares() registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, FLEX); + /* Jumper T-Lite board */ + firmware = new OpenTxFirmware("opentx-tlite", QCoreApplication::translate("Firmware", "Jumper T-Lite"), BOARD_JUMPER_TLITE); + 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); + /* Jumper T16 board */ firmware = new OpenTxFirmware("opentx-t16", Firmware::tr("Jumper T16 / T16+ / T16 Pro"), BOARD_JUMPER_T16); addOpenTxFrskyOptions(firmware); diff --git a/companion/src/generaledit/hardware.cpp b/companion/src/generaledit/hardware.cpp index 9d2e8e452..1d211d280 100644 --- a/companion/src/generaledit/hardware.cpp +++ b/companion/src/generaledit/hardware.cpp @@ -24,7 +24,7 @@ void HardwarePanel::setupSwitchType(int index, QLabel * label, AutoLineEdit * name, AutoComboBox * type, bool threePos) { Board::Type board = getCurrentBoard(); - if (IS_STM32(board) && index < getBoardCapability(board, Board::Switches)) { + if (IS_STM32(board) && index < getBoardCapability(board, Board::AvailableSwitches)) { type->addItem(tr("None"), Board::SWITCH_NOT_AVAILABLE); type->addItem(tr("2 Positions Toggle"), Board::SWITCH_TOGGLE); type->addItem(tr("2 Positions"), Board::SWITCH_2POS); @@ -75,7 +75,7 @@ void HardwarePanel::setupPotType(int index, QLabel * label, AutoLineEdit * name, { Board::Type board = firmware->getBoard(); - if (IS_STM32(board) && index < getBoardCapability(board, Board::Pots)) { + if (IS_STM32(board) && index < getBoardCapability(board, Board::AvailablePots)) { label->setText(RawSource(SOURCE_TYPE_STICK, CPN_MAX_STICKS+index).toString()); type->addItem(tr("None"), Board::POT_NONE); type->addItem(tr("Pot with detent"), Board::POT_WITH_DETENT); diff --git a/companion/src/images/simulator/JumperTLITE/bottom.png b/companion/src/images/simulator/JumperTLITE/bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e3f42fc8a247ef4f04200d0ddb2e81cff0eba9 GIT binary patch literal 27316 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 literal 0 HcmV?d00001 diff --git a/companion/src/images/simulator/JumperTLITE/center_LCD.png b/companion/src/images/simulator/JumperTLITE/center_LCD.png new file mode 100644 index 0000000000000000000000000000000000000000..f3249de1682f2581d5aa8f11fe6c948b8de2ba4c GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58aUX1EZzkxv|GpM$51V@SoVw^s}W84NfWHU|CQbxYJeq1jr9)4pcUpVEe@ v>sS&P8WgP)$&)M; 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 N002ovPDHLkV1id*?8N{8 literal 0 HcmV?d00001 diff --git a/companion/src/images/simulator/JumperTLITE/right.png b/companion/src/images/simulator/JumperTLITE/right.png new file mode 100644 index 0000000000000000000000000000000000000000..6c455081f38e16955c7388b115e3fe12effd22c5 GIT binary patch literal 29322 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 z zUTg5d%&Li^txa-i3Zg!>^NW;-?X1Cz_Iu)ubiWRHG$m{NSsU%UA;87%VV939{^{aC)7luW2t{jXMr68MlM~s$^Lvke22k3G z*fMC4KJTd!xxVprUC*z1yR2$wM3Ye+I*(M5ksJM%4rU$Y$nE51u{G97J!2VfLmtV8 z9YG`nyxkguW6K)a@7OE<(O{Jz`Q6czz?(BP~>X>Hc^)Qn!ocFTC5 zpp0?E0KI6WhUixQ${2= z6n`fm25#--Rv@W^PXmLs^CghwFxtlQ5dqY=2c&H~QDY5dSOAzZ4E=5td6zQQ9u25l z6sZ$}HRA5}ZRZ6>HF(l=VDRWHV}N<^VJZ7sVvn-c#>+BvdKt17k?Uz~Iw4(Ly+&0! zXgBAl0;U{@=#hgPCs7+srH|S5g}=-G&P}rgt&M1N2m4O*ww+Uw)m}PU9zJTdK>l6N z{g}M}ODGL7__qmOzlz(}KgUV`1Xx|WGLJm3g@Daqx7gNk)?W+RIss(>MHwe;b#JTN z*>f&Uda|^*TThL>GQi{UCW?w5ibR&%SW18Eur@?nqO^lU(P>d=r8%_dyP;5G!fA^& zwm2L+66(a^t(0WXW4Ff4;i6*0V|MKbuP0TlQ}1A$*5-}NQ1pc(!|SQ%y-kp(MpKvG zIN2wDsUV6lnj2csG7IxMh;6(xp_&EORJ!+%J)~S3-<#?#c<*foFYySEz71M?RMo*q z>pwK*?d$Deur!&8&$n8~04^C)JGi-x@zzuOy{(=8<{3}BBW;S`z8AK5|O;_l5|yn6W} z9zJ;-%W~ZR6{i+S;Jsqxdbh7$#haHe;>r6T#qa;~5ApGDKZ(ar9_`BC!l^iiL1m!i zHo_U51}ob+#AG3{ZNuR0-%uM?unq5tXK1LrGkj}`wWD6t-R%^Z6}*5{_HYq{835Y^ z)$a|^KoC*KxVW(~cXY(9dl=UHN2S;n=TNY8uqy>m)6typXcBe7f$@kC z06a31!rX&bEh>bwrSnOav<)8bVM^tjrwZkgjyR{BjhJ&j)qXbmy8woIY{R1tqa8Ae z5lw>Xb?~`IAX?9<(K@sI!~Fa!!8~;hj$LuYdj&|M%Vh#6SM`@A1R)|Bt61{$@Xq zaNLV;>)Oyli2B)|{v2QY@yqz+cmENOpS~9l-Z@?f?VQ-&uW+B+lwJ8Oa@>n#=K@9= z^Q<|Sowzp{bC2I(v(t5ASFFF8R7;u*5#dS}>BQ2=+)^tJoOt3Y}HP4ggxK!{f{m!ho z#}~%MsetupUi(this); + + act = new RadioUiAction(3, QList() << Qt::Key_Up << Qt::Key_PageUp, SIMU_STR_HLP_KEYS_GO_UP, SIMU_STR_HLP_ACT_UP); + addRadioWidget(ui->rightbuttons->addArea(QRect(40, 15, 70, 50), "JumperTLITE/right_top.png", act)); + + act = new RadioUiAction(2, QList() << Qt::Key_Down << Qt::Key_PageDown, SIMU_STR_HLP_KEYS_GO_DN, SIMU_STR_HLP_ACT_DN); + addRadioWidget(ui->rightbuttons->addArea(QRect(47, 65, 70, 50), "JumperTLITE/right_bottom.png", act)); + + act = new RadioUiAction(4, QList() << Qt::Key_Right << Qt::Key_Plus, SIMU_STR_HLP_KEY_RGT % "|" % SIMU_STR_HLP_KEY_PLS, SIMU_STR_HLP_ACT_PLS); + addRadioWidget(ui->bottombuttons->addArea(QRect(150, 73, 80, 30), "JumperTLITE/bottom_right.png", act)); + + act = new RadioUiAction(5, QList() << Qt::Key_Left << Qt::Key_Minus, SIMU_STR_HLP_KEY_LFT % "|" % SIMU_STR_HLP_KEY_MIN, SIMU_STR_HLP_ACT_MIN); + addRadioWidget(ui->bottombuttons->addArea(QRect(24, 73, 80, 30), "JumperTLITE/bottom_left.png", act)); + + m_mouseMidClickAction = new RadioUiAction(1, QList() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_ACTIVATE, SIMU_STR_HLP_ACT_ENT); + addRadioWidget(ui->leftbuttons->addArea(QRect(5, 15, 70, 50), "JumperTLITE/left_top.png", m_mouseMidClickAction)); + + act = new RadioUiAction(0, QList() << Qt::Key_Delete << Qt::Key_Escape << Qt::Key_Backspace, SIMU_STR_HLP_KEYS_EXIT, SIMU_STR_HLP_ACT_EXIT); + addRadioWidget(ui->leftbuttons->addArea(QRect(10, 65, 70, 50), "JumperTLITE/left_bottom.png", act)); + + //addRadioWidget(ui->leftbuttons->addArea(QRect(10, 65, 70, 50), "JumperTLITE/left_scrnshot.png", m_screenshotAction)); + + m_backlightColors << QColor(215, 243, 255); // X7 Blue + m_backlightColors << QColor(166,247,159); + m_backlightColors << QColor(247,159,166); + m_backlightColors << QColor(255,195,151); + m_backlightColors << QColor(247,242,159); + + setLcd(ui->lcd); + + QString css = "#radioUiWidget {" + "background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:1," + "stop:0 rgba(255, 255, 255, 255)," + "stop:0.757062 rgba(241, 238, 238, 255)," + "stop:1 rgba(247, 245, 245, 255));" + "}"; + + QTimer * tim = new QTimer(this); + tim->setSingleShot(true); + connect(tim, &QTimer::timeout, [this, css]() { + emit customStyleRequest(css); + }); + tim->start(100); +} + +SimulatedUIWidgetJumperTLITE::~SimulatedUIWidgetJumperTLITE() +{ + delete ui; +} diff --git a/companion/src/simulation/simulateduiwidgetJumperTLITE.ui b/companion/src/simulation/simulateduiwidgetJumperTLITE.ui new file mode 100644 index 000000000..407b3954d --- /dev/null +++ b/companion/src/simulation/simulateduiwidgetJumperTLITE.ui @@ -0,0 +1,258 @@ + + + SimulatedUIWidgetJumperTLITE + + + + 0 + 0 + 501 + 310 + + + + + 0 + 0 + + + + + 501 + 310 + + + + + 501 + 310 + + + + Jumper T-Lite 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 + + + + + 122 + 287 + + + + + 122 + 287 + + + + background:url(:/images/simulator/JumperTLITE/left.png); + + + + + + + + 0 + 0 + + + + + 800 + 155 + + + + + 800 + 155 + + + + background-color: rgb(215, 243, 255); + + + + + + + + 0 + 0 + + + + + 122 + 287 + + + + + 122 + 287 + + + + background:url(:/images/simulator/JumperTLITE/right.png) + + + + + + + + 0 + 0 + + + + + 258 + 26 + + + + + 258 + 26 + + + + background:url(:/images/simulator/JumperTLITE/top.png) + + + + + + + + 0 + 0 + + + + + 258 + 106 + + + + + 258 + 106 + + + + background:url(:/images/simulator/JumperTLITE/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 cab7600d4..6692b0ebb 100644 --- a/companion/src/simulation/simulatorwidget.cpp +++ b/companion/src/simulation/simulatorwidget.cpp @@ -91,6 +91,9 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato case Board::BOARD_JUMPER_T12: radioUiWidget = new SimulatedUIWidgetJumperT12(simulator, this); break; + case Board::BOARD_JUMPER_TLITE: + radioUiWidget = new SimulatedUIWidgetJumperTLITE(simulator, this); + break; case Board::BOARD_JUMPER_T16: radioUiWidget = new SimulatedUIWidgetJumperT16(simulator, this); break; diff --git a/radio/src/gui/128x64/radio_setup.cpp b/radio/src/gui/128x64/radio_setup.cpp index e3fd06bb3..6579f1523 100644 --- a/radio/src/gui/128x64/radio_setup.cpp +++ b/radio/src/gui/128x64/radio_setup.cpp @@ -251,7 +251,7 @@ void menuRadioSetup(event_t event) putsVolts(lcdLastRightPos+FW, y, 120+g_eeGeneral.vBatMax, (menuHorizontalPosition>0 ? attr : 0)|LEFT|NO_UNIT); if (attr && s_editMode>0) { if (menuHorizontalPosition==0) - CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatMin, -50, g_eeGeneral.vBatMax+29); // min=4.0V + CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatMin, -60, g_eeGeneral.vBatMax+29); // min=3.0V else CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatMax, g_eeGeneral.vBatMin-29, +40); // max=16.0V } @@ -411,7 +411,7 @@ void menuRadioSetup(event_t event) case ITEM_RADIO_SETUP_BATTERY_WARNING: lcdDrawTextAlignedLeft(y, STR_BATTERYWARNING); putsVolts(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.vBatWarn, attr|LEFT); - if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 40, 120); //4-12V + if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 30, 120); //3-12V break; case ITEM_RADIO_SETUP_MEMORY_WARNING: diff --git a/radio/src/gui/common/stdlcd/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp index fca6e047c..9cd46a377 100644 --- a/radio/src/gui/common/stdlcd/radio_hardware.cpp +++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp @@ -195,19 +195,29 @@ enum { ITEM_RADIO_HARDWARE_MAX }; -#if (NUM_POTS + NUM_SLIDERS) == 1 +#if (NUM_POTS + NUM_SLIDERS) == 0 + #define POT_LABEL_ROW HIDDEN_ROW + #define POTS_ROWS HIDDEN_ROW +#elif (NUM_POTS + NUM_SLIDERS) == 1 + #define POT_LABEL_ROW LABEL(Pots) #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1 #elif (NUM_POTS + NUM_SLIDERS) == 2 + #define POT_LABEL_ROW LABEL(Pots) #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 #elif (NUM_POTS + NUM_SLIDERS) == 3 + #define POT_LABEL_ROW LABEL(Pots) #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 #elif defined(PCBX9D) // TODO defined(STORAGE_POT3) && !defined(STORAGE_POT3) + #define POT_LABEL_ROW LABEL(Pots) #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, HIDDEN_ROW, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 #elif (NUM_POTS + NUM_SLIDERS) == 4 + #define POT_LABEL_ROW LABEL(Pots) #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 #elif (NUM_POTS + NUM_SLIDERS) == 5 + #define POT_LABEL_ROW LABEL(Pots) #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 #elif (NUM_POTS + NUM_SLIDERS) == 8 + #define POT_LABEL_ROW LABEL(Pots) #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 #endif @@ -326,7 +336,7 @@ void menuRadioHardware(event_t event) 0 /* stick 2 */, 0 /* stick 3 */, 0 /* stick 4 */, - LABEL(Pots), + POT_LABEL_ROW, POTS_ROWS, LABEL(Switches), SWITCHES_ROWS, diff --git a/radio/src/gui/navigation/navigation_9x.cpp b/radio/src/gui/navigation/navigation_9x.cpp index bbc958c63..746dfdde8 100644 --- a/radio/src/gui/navigation/navigation_9x.cpp +++ b/radio/src/gui/navigation/navigation_9x.cpp @@ -82,7 +82,7 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla } #endif - if (event==EVT_KEY_FIRST(KEY_RIGHT) || event==EVT_KEY_REPT(KEY_RIGHT) || (s_editMode>0 && (IS_ROTARY_RIGHT(event) || event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP)))) { + if ((s_editMode>0 && (IS_ROTARY_RIGHT(event) || event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP)))) { do { if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { newval += min(10, i_max-val); @@ -98,7 +98,7 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla AUDIO_KEY_ERROR(); } } - else if (event==EVT_KEY_FIRST(KEY_LEFT) || event==EVT_KEY_REPT(KEY_LEFT) || (s_editMode>0 && (IS_ROTARY_LEFT(event) || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)))) { + else if ((s_editMode>0 && (IS_ROTARY_LEFT(event) || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)))) { do { if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { newval -= min(10, val-i_min); diff --git a/radio/src/gui/navigation/navigation_xlite.cpp b/radio/src/gui/navigation/navigation_xlite.cpp index 9cbafda8b..5484b9525 100644 --- a/radio/src/gui/navigation/navigation_xlite.cpp +++ b/radio/src/gui/navigation/navigation_xlite.cpp @@ -29,15 +29,6 @@ horzpos_t menuHorizontalPosition; int8_t checkIncDec_Ret; -#if defined(RADIO_T12) -#define DBLKEYS_PRESSED_RGT_LFT(in) ((in & (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_LEFT)) == (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_LEFT)) -// set to 0 -#define DBLKEYS_PRESSED_UP_DWN(in) ((in & (KEYS_GPIO_PIN_UP + KEYS_GPIO_PIN_DOWN)) == (KEYS_GPIO_PIN_UP + KEYS_GPIO_PIN_DOWN)) -// set to max -#define DBLKEYS_PRESSED_RGT_UP(in) ((in & (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_UP)) == (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_UP)) -// set to min -#define DBLKEYS_PRESSED_LFT_DWN(in) ((in & (KEYS_GPIO_PIN_LEFT + KEYS_GPIO_PIN_DOWN)) == (KEYS_GPIO_PIN_LEFT + KEYS_GPIO_PIN_DOWN)) -#else // invert the value #define DBLKEYS_PRESSED_RGT_LFT(in) ((in & ((1<SQR2 = (ADC_CHANNEL_BATT << 0) + (ADC_Channel_Vbat << 5); ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH << 0) + (ADC_CHANNEL_STICK_LV << 5) + (ADC_CHANNEL_STICK_RV << 10) + (ADC_CHANNEL_STICK_RH << 15) + (ADC_CHANNEL_POT1 << 20) + (ADC_CHANNEL_POT2 << 25); } +#elif defined(RADIO_TLITE) + ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT << 0) + (ADC_Channel_Vbat << 5); + ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH << 0) + (ADC_CHANNEL_STICK_LV << 5) + (ADC_CHANNEL_STICK_RV << 10) + (ADC_CHANNEL_STICK_RH << 15); #elif defined(PCBX7) ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT << 0) + (ADC_Channel_Vbat << 5); ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH << 0) + (ADC_CHANNEL_STICK_LV << 5) + (ADC_CHANNEL_STICK_RV << 10) + (ADC_CHANNEL_STICK_RH << 15) + (ADC_CHANNEL_POT1 << 20) + (ADC_CHANNEL_POT2 << 25); @@ -136,7 +139,7 @@ void adcInit() ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH << 0) + (ADC_CHANNEL_STICK_LV << 5) + (ADC_CHANNEL_STICK_RV << 10) + (ADC_CHANNEL_STICK_RH << 15) + (ADC_CHANNEL_POT1 << 20) + (ADC_CHANNEL_POT2 << 25); #endif - ADC_MAIN->SMPR1 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (ADC_SAMPTIME << 24); + ADC_MAIN->SMPR1 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (VBAT_ADC_SAMPTIME << 24); ADC_MAIN->SMPR2 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (ADC_SAMPTIME << 24) + (ADC_SAMPTIME << 27); ADC->CCR = ADC_CCR_VBATE; // Enable vbat sensor diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt index 55bcdeb66..3f57a743a 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt @@ -89,7 +89,7 @@ set(BOOTLOADER_SRC bin_files.cpp ) -if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL X9E OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) OR (PCB STREQUAL X7 AND NOT (PCBREV STREQUAL T12)) OR PCB STREQUAL X9LITE OR PCB STREQUAL X9LITES) +if(ROTARY_ENCODER) set(BOOTLOADER_SRC ${BOOTLOADER_SRC} ../../../../../targets/common/arm/stm32/rotary_encoder_driver.cpp diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index fbf963b71..2a7f14ec5 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -20,6 +20,7 @@ set(LINKER_SCRIPT targets/horus/stm32f4_flash.ld) set(RTC_BACKUP_RAM YES) set(PPM_LIMITS_SYMETRICAL YES) set(USB_SERIAL ON CACHE BOOL "Enable USB serial (CDC)") +set(ROTARY_ENCODER YES) # for size report script set(CPU_TYPE_FULL STM32F429xI) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 479dd88c5..e63e13e14 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -275,6 +275,7 @@ #define ADC_DMA DMA2 #define ADC_DMA_Stream DMA2_Stream0 #define ADC_SAMPTIME 3 + #define VBAT_ADC_SAMPTIME ADC_SAMPTIME #define ADC_VREF_PREC2 300 #elif defined(PCBX10) #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2) @@ -315,6 +316,7 @@ #define ADC_CHANNEL_EXT2 ADC_Channel_7 // ADC3_IN7 #define ADC_MAIN ADC3 #define ADC_SAMPTIME 3 + #define VBAT_ADC_SAMPTIME ADC_SAMPTIME #define ADC_DMA DMA2 #define ADC_DMA_SxCR_CHSEL DMA_SxCR_CHSEL_1 #define ADC_DMA_Stream DMA2_Stream0 diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index a287605df..e32f8c72c 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -128,8 +128,21 @@ elseif(PCB STREQUAL X7) set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) set(LUA_EXPORT lua_export_t12) add_definitions(-DRADIO_T12) + add_definitions(-DRADIO_FAMILY_JUMPER_T12) add_definitions(-DEEPROM_VARIANT=0x4001) add_definitions(-DMANUFACTURER_JUMPER) + elseif(PCBREV STREQUAL TLITE) + option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON) + set(FLAVOUR tlite) + set(NAVIGATION_TYPE 9x) + set(CPU_TYPE STM32F2) + set(CPU_TYPE_FULL STM32F205xE) # for size report + set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) + set(LUA_EXPORT lua_export_tlite) + add_definitions(-DRADIO_TLITE) + add_definitions(-DRADIO_FAMILY_JUMPER_T12) + add_definitions(-DEEPROM_VARIANT=0x4003) + add_definitions(-DMANUFACTURER_JUMPER) elseif(PCBREV STREQUAL TX12) option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON) set(FLAVOUR tx12) diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 6ffff9df9..ca2acc903 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -117,7 +117,7 @@ uint32_t isBootloaderStart(const uint8_t * buffer); #define INTERNAL_MODULE_OFF() GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) #endif -#if !defined(PCBX9LITE) || defined(PCBX9LITES) +#if (defined(INTERNAL_MODULE_PXX1) || defined(INTERNAL_MODULE_PXX2)) && (!defined(PCBX9LITE) || defined(PCBX9LITES)) #define HARDWARE_INTERNAL_RAS #endif @@ -432,7 +432,12 @@ enum EnumSwitchesPositions #define STORAGE_NUM_SWITCHES 6 #define DEFAULT_SWITCH_CONFIG (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); #define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 2) + (POT_WITHOUT_DETENT << 0) -#elif defined(RADIO_T12) +#elif defined(RADIO_TLITE) + #define NUM_SWITCHES 4 + #define STORAGE_NUM_SWITCHES 8 + #define DEFAULT_SWITCH_CONFIG (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); + #define DEFAULT_POTS_CONFIG (0) +#elif defined(RADIO_FAMILY_JUMPER_T12) #define NUM_SWITCHES 8 #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) @@ -544,6 +549,11 @@ enum Analogs { #define NUM_SLIDERS 0 #define STORAGE_NUM_POTS 1 #define STORAGE_NUM_SLIDERS 0 +#elif defined(RADIO_TLITE) + #define NUM_POTS 0 + #define NUM_SLIDERS 0 + #define STORAGE_NUM_POTS 2 + #define STORAGE_NUM_SLIDERS 0 #elif defined(PCBXLITE) || defined(PCBX7) #define NUM_POTS 2 #define NUM_SLIDERS 0 @@ -644,6 +654,11 @@ extern uint16_t adcValues[NUM_ANALOGS]; #define BATTERY_WARN 66 // 6.6V #define BATTERY_MIN 67 // 6.7V #define BATTERY_MAX 83 // 8.3V +#elif defined(RADIO_TLITE) + // 1S Li-ion / Lipo + #define BATTERY_WARN 33 // 3.3V + #define BATTERY_MIN 32 // 3.2V + #define BATTERY_MAX 42 // 4.2V #else // NI-MH 7.2V #define BATTERY_WARN 65 // 6.5V @@ -710,6 +725,10 @@ uint8_t isBacklightEnabled(); #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 */ +#elif defined(RADIO_TLITE) + #define USB_NAME "Jumper TLite" + #define USB_MANUFACTURER 'J', 'U', 'M', 'P', 'E', 'R', ' ', ' ' /* 8 bytes */ + #define USB_PRODUCT 'T', '-', 'L', 'I', 'T', 'E', ' ', ' ' /* 8 Bytes */ #else #define USB_NAME "FrSky Taranis" #define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */ @@ -889,8 +908,8 @@ void ledBlue(); #define IS_LCD_RESET_NEEDED() true #define LCD_CONTRAST_MIN 10 #define LCD_CONTRAST_MAX 30 -#if defined(RADIO_TX12) - #define LCD_CONTRAST_DEFAULT 21 +#if defined(RADIO_TX12) || defined(RADIO_FAMILY_JUMPER_T12) + #define LCD_CONTRAST_DEFAULT 25 #else #define LCD_CONTRAST_DEFAULT 15 #endif diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index f70e1e690..5cf8513fe 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -46,7 +46,7 @@ #define KEYS_GPIO_PIN_LEFT GPIO_Pin_12 // PE.12 #define KEYS_GPIO_REG_RIGHT GPIOE->IDR #define KEYS_GPIO_PIN_RIGHT GPIO_Pin_13 // PE.13 -#elif defined(RADIO_T12) +#elif defined(RADIO_FAMILY_JUMPER_T12) #define KEYS_GPIO_REG_EXIT GPIOD->IDR #define KEYS_GPIO_PIN_EXIT GPIO_Pin_2 // PD.02 #define KEYS_GPIO_REG_ENTER GPIOE->IDR @@ -362,6 +362,13 @@ #define SWITCHES_GPIO_PIN_B_L GPIO_Pin_6 // PA.06 #define SWITCHES_GPIO_REG_B_H GPIOA->IDR #define SWITCHES_GPIO_PIN_B_H GPIO_Pin_5 // PA.05 +#elif defined(RADIO_TLITE) + #define STORAGE_SWITCH_B + #define HARDWARE_SWITCH_B + #define SWITCHES_GPIO_REG_B_L GPIOE->IDR + #define SWITCHES_GPIO_PIN_B_L GPIO_Pin_1 // PE.01 + #define SWITCHES_GPIO_REG_B_H GPIOE->IDR + #define SWITCHES_GPIO_PIN_B_H GPIO_Pin_2 // PE.02 #elif defined(PCBX7) #define STORAGE_SWITCH_B #define HARDWARE_SWITCH_B @@ -406,6 +413,11 @@ #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(RADIO_TLITE) + #define STORAGE_SWITCH_C + #define HARDWARE_SWITCH_C + #define SWITCHES_GPIO_REG_C GPIOE->IDR + #define SWITCHES_GPIO_PIN_C GPIO_Pin_14 // PE.14 #elif defined(PCBX7) #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C @@ -453,6 +465,11 @@ #define HARDWARE_SWITCH_D #define SWITCHES_GPIO_REG_D GPIOE->IDR #define SWITCHES_GPIO_PIN_D GPIO_Pin_8 // PE.08 +#elif defined(RADIO_TLITE) + #define STORAGE_SWITCH_D + #define HARDWARE_SWITCH_D + #define SWITCHES_GPIO_REG_D GPIOD->IDR + #define SWITCHES_GPIO_PIN_D GPIO_Pin_14 // PD.14 #elif defined(PCBX7) #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D @@ -539,6 +556,9 @@ #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(RADIO_TLITE) + // no SWF + #define STORAGE_SWITCH_F #elif defined(PCBX7) #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F @@ -587,6 +607,9 @@ #elif defined(PCBXLITE) || defined(PCBX9LITE) // no SWH #elif defined(RADIO_TX12) +#elif defined(RADIO_TLITE) + // no SWH + #define STORAGE_SWITCH_H #elif defined(PCBX7) #define STORAGE_SWITCH_H #define HARDWARE_SWITCH_H @@ -624,6 +647,11 @@ #define HARDWARE_SWITCH_J #define SWITCHES_GPIO_REG_J GPIOD->IDR #define SWITCHES_GPIO_PIN_J GPIO_Pin_14 // PD.14 +#elif defined(RADIO_TLITE) + // no SWI + #define STORAGE_SWITCH_I + // no SWJ + #define STORAGE_SWITCH_J #elif defined(PCBX7) #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I @@ -733,7 +761,7 @@ #define KEYS_GPIOB_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5) #define KEYS_GPIOC_PINS (GPIO_Pin_4 | GPIO_Pin_5) #define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14) -#elif defined(RADIO_T12) +#elif defined(RADIO_FAMILY_JUMPER_T12) #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) @@ -789,6 +817,11 @@ #define ADC_SET_DMA_FLAGS() ADC_DMA->HIFCR = (DMA_HIFCR_CTCIF4 | DMA_HIFCR_CHTIF4 | DMA_HIFCR_CTEIF4 | DMA_HIFCR_CDMEIF4 | DMA_HIFCR_CFEIF4) #define ADC_TRANSFER_COMPLETE() (ADC_DMA->HISR & DMA_HISR_TCIF4) #define ADC_SAMPTIME 2 // sample time = 28 cycles +#if defined(RADIO_TLITE) + #define VBAT_ADC_SAMPTIME (ADC_SAMPTIME + 1) +#else + #define VBAT_ADC_SAMPTIME ADC_SAMPTIME +#endif #if defined(PCBX9E) #define HARDWARE_POT1 #define HARDWARE_POT2 @@ -900,6 +933,24 @@ #define ADC_CHANNEL_POT2 ADC_Channel_12 // ADC1_IN12 #define ADC_CHANNEL_BATT ADC_Channel_10 // ADC1_IN10 #define ADC_VREF_PREC2 330 +#elif defined(RADIO_TLITE) + #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define ADC_RCC_APB1Periph 0 + #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 + #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 + #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01 + #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_2 // PA.02 + #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_3 // PA.03 + #define ADC_CHANNEL_STICK_RV ADC_Channel_0 // ADC1_IN0 + #define ADC_CHANNEL_STICK_RH ADC_Channel_1 // ADC1_IN1 + #define ADC_CHANNEL_STICK_LV ADC_Channel_2 // ADC1_IN2 + #define ADC_CHANNEL_STICK_LH ADC_Channel_3 // ADC1_IN3 + #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 + #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV) + #define ADC_GPIOB_PINS 0 + #define ADC_GPIOC_PINS ADC_GPIO_PIN_BATT + #define ADC_CHANNEL_BATT ADC_Channel_10 + #define ADC_VREF_PREC2 330 #elif defined(PCBX7) #define HARDWARE_POT1 #define HARDWARE_POT2 @@ -1152,7 +1203,7 @@ #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) || defined(RADIO_TX12) +#elif defined(RADIO_FAMILY_JUMPER_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 @@ -1692,7 +1743,7 @@ #define KEYS_BACKLIGHT_RCC_AHB1Periph 0 // LCD driver -#if defined(RADIO_TX12) || defined(RADIO_T12) +#if defined(RADIO_TX12) || defined(RADIO_FAMILY_JUMPER_T12) #define LCD_VERTICAL_INVERT #endif #if defined(PCBX9E) @@ -1887,11 +1938,15 @@ #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) +#elif defined(RADIO_TX12) || defined(RADIO_TLITE) #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 +#if defined(RADIO_TLITE) + #define AUDIO_UNMUTE_DELAY 250 // ms +#else #define AUDIO_UNMUTE_DELAY 150 // ms +#endif #define AUDIO_MUTE_DELAY 500 // ms #else #define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1) @@ -2013,7 +2068,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) || defined(RADIO_T12) || defined(RADIO_TX12) +#elif defined(PCBX9D) || defined(PCBX9DP) || defined(RADIO_FAMILY_JUMPER_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 6883740c4..a7e7d794d 100644 --- a/radio/src/targets/taranis/keys_driver.cpp +++ b/radio/src/targets/taranis/keys_driver.cpp @@ -204,6 +204,11 @@ uint32_t switchState(uint8_t index) ADD_2POS_CASE(A); ADD_3POS_CASE(B, 1); ADD_3POS_CASE(C, 2); +#elif defined(RADIO_TLITE) + ADD_3POS_CASE(A, 0); + ADD_3POS_CASE(B, 1); + ADD_2POS_CASE(C); + ADD_2POS_CASE(D); #else ADD_3POS_CASE(A, 0); ADD_3POS_CASE(B, 1); @@ -235,6 +240,8 @@ uint32_t switchState(uint8_t index) ADD_2POS_CASE(D); ADD_3POS_CASE(E, 4); ADD_3POS_CASE(F, 5); +#elif defined(RADIO_TLITE) + // Only 4 switches #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 e1efa8e15..556c250fb 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) || defined(RADIO_TX12) +#if defined(RADIO_FAMILY_JUMPER_T12) || defined(RADIO_TX12) #define LCD_CONTRAST_OFFSET -10 #else #define LCD_CONTRAST_OFFSET 160 diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 2f42f7edd..967f94c40 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -288,7 +288,7 @@ #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) +#elif defined(RADIO_FAMILY_JUMPER_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Dolů\0""Nhoru""Vprvo""Vlevo" #elif defined(RADIO_TX12) diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 1e85008b0..c8d872ed0 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -294,7 +294,7 @@ #elif defined(PCBXLITE) #define LEN_VKEYS "\005" #define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" -#elif defined(RADIO_T12) +#elif defined(RADIO_FAMILY_JUMPER_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #elif defined(RADIO_TX12) diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index ad49d6997..dc4ae41ce 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -294,7 +294,7 @@ #elif defined(PCBXLITE) #define LEN_VKEYS "\005" #define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" -#elif defined(RADIO_T12) +#elif defined(RADIO_FAMILY_JUMPER_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #elif defined(RADIO_TX12) diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index e89998d7f..24bf15860 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -291,7 +291,7 @@ #elif defined(PCBXLITE) #define LEN_VKEYS "\005" #define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" -#elif defined(RADIO_T12) +#elif defined(RADIO_FAMILY_JUMPER_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #elif defined(RADIO_TX12) diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index e18b51102..ae5d03fb8 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -312,7 +312,7 @@ #elif defined(PCBXLITE) #define LEN_VKEYS "\005" #define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" -#elif defined(RADIO_T12) +#elif defined(RADIO_FAMILY_JUMPER_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #elif defined(RADIO_TX12) diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index ffaeb38c6..d124583e8 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -314,7 +314,7 @@ #elif defined(PCBXLITE) #define LEN_VKEYS "\005" #define TR_VKEYS "Shift""Exit\0""Enter""Bas\0 ""Haut\0""Droit""Gauch" -#elif defined(RADIO_T12) +#elif defined(RADIO_FAMILY_JUMPER_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #elif defined(RADIO_TX12) diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index c1e8c0be0..4034b6664 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -315,7 +315,7 @@ #elif defined(PCBXLITE) #define LEN_VKEYS "\005" #define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" -#elif defined(RADIO_T12) +#elif defined(RADIO_FAMILY_JUMPER_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #elif defined(RADIO_TX12) diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index fe5abbfe3..098a54af7 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -292,7 +292,7 @@ #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) +#elif defined(RADIO_FAMILY_JUMPER_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #elif defined(RADIO_TX12) diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 8212ce84d..96ae0b342 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -312,7 +312,7 @@ #elif defined(PCBXLITE) #define LEN_VKEYS "\005" #define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" -#elif defined(RADIO_T12) +#elif defined(RADIO_FAMILY_JUMPER_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #elif defined(RADIO_TX12) diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 412e3698a..8fbe1a59e 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -305,7 +305,7 @@ #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) +#elif defined(RADIO_FAMILY_JUMPER_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #elif defined(RADIO_TX12) diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 57cf99ba6..3b45f2655 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -306,7 +306,7 @@ #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) +#elif defined(RADIO_FAMILY_JUMPER_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #elif defined(RADIO_TX12) diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index fedc875c0..2702a0d69 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -41,7 +41,7 @@ #elif defined(PCBXLITE) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0" -#elif defined(RADIO_T12) +#elif defined(RADIO_FAMILY_JUMPER_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) diff --git a/tools/build-jumper.py b/tools/build-jumper.py index 6e7f3d733..2df2aa46d 100755 --- a/tools/build-jumper.py +++ b/tools/build-jumper.py @@ -9,6 +9,11 @@ import tempfile boards = { + "TLITE": { + "PCB": "X7", + "PCBREV": "TLITE", + "DEFAULT_MODE": "2", + }, "T12": { "PCB": "X7", "PCBREV": "T12", @@ -53,7 +58,7 @@ def build(board, translation, srcdir): command = "cmake %s -DTRANSLATIONS=%s -DJUMPER_RELEASE=YES %s" % (cmake_options, translation, srcdir) print(command) os.system(command) - os.system("make firmware -j6") + os.system("make firmware -j16") os.chdir(cwd) index = 0 while 1: diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh index 6c5642ccd..4e2ca83ea 100755 --- a/tools/commit-tests.sh +++ b/tools/commit-tests.sh @@ -139,6 +139,24 @@ if [[ " TX12 X7 ALL " =~ \ ${FLAVOR}\ ]] ; then make -j"${CORES}" tests-radio fi +if [[ " TLITE X7 ALL " =~ \ ${FLAVOR}\ ]] ; then + # OpenTX on TLITE + rm -rf ./* + cmake "${COMMON_OPTIONS}" -DPCB=X7 -DPCBREV=TLITE -DHELI=YES -DGVARS=YES "${SRCDIR}" + make -j"${CORES}" ${FIRMARE_TARGET} + make -j"${CORES}" libsimulator + make -j"${CORES}" tests-radio +fi + +if [[ " TX12 X7 ALL " =~ \ ${FLAVOR}\ ]] ; then + # OpenTX on TX12 + rm -rf ./* + cmake "${COMMON_OPTIONS}" -DPCB=X7 -DPCBREV=TX12 -DHELI=YES -DGVARS=YES "${SRCDIR}" + make -j"${CORES}" ${FIRMARE_TARGET} + make -j"${CORES}" libsimulator + make -j"${CORES}" tests-radio +fi + if [[ " XLITE ALL " =~ \ ${FLAVOR}\ ]] ; then # OpenTX on X-Lite rm -rf ./*