diff --git a/.travis.yml b/.travis.yml index 582215347..cd3f1e948 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,6 +24,7 @@ env: # - FLAVOR=SKY9X # - FLAVOR=9XRPRO - FLAVOR=X9LITE + - FLAVOR=X9LITES - FLAVOR=X7 - FLAVOR=T12 - FLAVOR=XLITE diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index 9f375411f..99094edf3 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -75,6 +75,8 @@ uint32_t Boards::getFourCC(Type board) return 0x3378746F; case BOARD_TARANIS_X9LITE: return 0x3C78746F; + case BOARD_TARANIS_X9LITES: + return 0x3E78746F; case BOARD_SKY9X: case BOARD_AR9X: case BOARD_9XRPRO: @@ -113,6 +115,7 @@ int Boards::getEEpromSize(Board::Type board) case BOARD_TARANIS_XLITE: case BOARD_TARANIS_X7: case BOARD_TARANIS_X9LITE: + case BOARD_TARANIS_X9LITES: case BOARD_TARANIS_X9D: case BOARD_TARANIS_X9DP: case BOARD_TARANIS_X9DP_2019: @@ -149,6 +152,7 @@ int Boards::getFlashSize(Type board) case BOARD_TARANIS_XLITE: case BOARD_TARANIS_X7: case BOARD_TARANIS_X9LITE: + case BOARD_TARANIS_X9LITES: case BOARD_TARANIS_X9D: case BOARD_TARANIS_X9DP: case BOARD_TARANIS_X9DP_2019: @@ -505,6 +509,8 @@ QString Boards::getBoardName(Board::Type board) return "Taranis X9E"; case BOARD_TARANIS_X9LITE: return "Taranis X9-Lite"; + case BOARD_TARANIS_X9LITES: + return "Taranis X9-Lite S"; case BOARD_SKY9X: return "Sky9x"; case BOARD_9XRPRO: diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index 06a7a0f04..7a60ad4f4 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -50,6 +50,7 @@ namespace Board { BOARD_TARANIS_XLITE, BOARD_TARANIS_XLITES, BOARD_TARANIS_X9LITE, + BOARD_TARANIS_X9LITES, BOARD_JUMPER_T12, }; @@ -239,7 +240,7 @@ inline bool IS_TARANIS_X7(Board::Type board) inline bool IS_TARANIS_X9LITE(Board::Type board) { - return board == Board::BOARD_TARANIS_X9LITE; + return board == Board::BOARD_TARANIS_X9LITE || board == Board::BOARD_TARANIS_X9LITES; } inline bool IS_TARANIS_X9(Board::Type board) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 3ba4f2a7a..1ab1f3aba 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -78,6 +78,8 @@ const char * OpenTxEepromInterface::getName() return "OpenTX for FrSky Taranis X9E"; case BOARD_TARANIS_X7: return "OpenTX for FrSky Taranis X7"; + case BOARD_TARANIS_X9LITES: + return "OpenTX for FrSky Taranis X9-Lite S"; case BOARD_TARANIS_X9LITE: return "OpenTX for FrSky Taranis X9-Lite"; case BOARD_TARANIS_XLITE: @@ -1238,6 +1240,12 @@ void registerOpenTxFirmwares() firmware->addOption("autoupdate", Firmware::tr("Support for auto update on boot")); registerOpenTxFirmware(firmware); + /* FrSky X9-LiteS board */ + firmware = new OpenTxFirmware("opentx-x9lites", Firmware::tr("FrSky Taranis X9-Lite S"), BOARD_TARANIS_X9LITES); + addOpenTxTaranisOptions(firmware); + firmware->addOption("autoupdate", Firmware::tr("Support for auto update on boot")); + registerOpenTxFirmware(firmware); + /* FrSky X7 board */ firmware = new OpenTxFirmware("opentx-x7", Firmware::tr("FrSky Taranis X7 / X7S"), BOARD_TARANIS_X7); addOpenTxTaranisOptions(firmware); diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp index 4858d7135..e5c7e2903 100644 --- a/companion/src/simulation/simulatorwidget.cpp +++ b/companion/src/simulation/simulatorwidget.cpp @@ -60,6 +60,7 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato switch(m_board) { case Board::BOARD_TARANIS_X9LITE: + case Board::BOARD_TARANIS_X9LITES: radioUiWidget = new SimulatedUIWidgetX9LITE(simulator, this); break; case Board::BOARD_TARANIS_X7: diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 4cc05489d..1f7c2c542 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -1,7 +1,7 @@ include(CMakeForceCompiler) include(Bitmaps) -set(PCB_TYPES X9LITE X7 XLITE XLITES X9D X9D+ X9E X10 X12S SKY9X 9XRPRO AR9X) +set(PCB_TYPES X9LITE X9LITES X7 XLITE XLITES X9D X9D+ X9E X10 X12S SKY9X 9XRPRO AR9X) set(GUI_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL) set(TTS_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL RU) @@ -86,7 +86,7 @@ set(FATFS_SRC if(PCB STREQUAL X12S OR PCB STREQUAL X10) include(targets/horus/CMakeLists.txt) -elseif(PCB STREQUAL X9E OR PCB STREQUAL X9D+ OR PCB STREQUAL X9D OR PCB STREQUAL X7 OR PCB STREQUAL X9LITE OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES) +elseif(PCB STREQUAL X9E OR PCB STREQUAL X9D+ OR PCB STREQUAL X9D OR PCB STREQUAL X7 OR PCB STREQUAL X9LITE OR PCB STREQUAL X9LITES OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES) include(targets/taranis/CMakeLists.txt) elseif(PCB STREQUAL SKY9X OR PCB STREQUAL 9XRPRO OR PCB STREQUAL AR9X) include(targets/sky9x/CMakeLists.txt) @@ -469,7 +469,7 @@ if(NOT MSVC) set(SRC ${SRC} bin_allocator.cpp) endif() - if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X9D OR PCB STREQUAL X9D+ OR PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL X9LITE OR PCB STREQUAL X10 OR PCB STREQUAL X12S) + if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X9D OR PCB STREQUAL X9D+ OR PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL X9LITE OR PCB STREQUAL X9LITES OR PCB STREQUAL X10 OR PCB STREQUAL X12S) add_subdirectory(targets/common/arm/stm32/bootloader) include_directories(${CMAKE_CURRENT_BINARY_DIR}/targets/common/arm/stm32/bootloader) set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} bootloader) diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index 24b709fde..8f95220ae 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -297,6 +297,36 @@ void onMainViewMenu(const char *result) } } +void drawSmallSwitch(coord_t x, coord_t y, int width, unsigned int index) +{ + if (SWITCH_EXISTS(index)) { + int val = getValue(MIXSRC_FIRST_SWITCH+index); + + if (val >= 0) { + lcdDrawSolidHorizontalLine(x, y, width); + lcdDrawSolidHorizontalLine(x, y+2, width); + y += 4; + if (val > 0) { + lcdDrawSolidHorizontalLine(x, y, width); + lcdDrawSolidHorizontalLine(x, y+2, width); + y += 4; + } + } + + lcdDrawChar(width==5 ? x+1 : x, y, 'A'+index, SMLSIZE); + y += 7; + + if (val <= 0) { + lcdDrawSolidHorizontalLine(x, y, width); + lcdDrawSolidHorizontalLine(x, y+2, width); + if (val < 0) { + lcdDrawSolidHorizontalLine(x, y+4, width); + lcdDrawSolidHorizontalLine(x, y+6, width); + } + } + } +} + void menuMainView(event_t event) { uint8_t view = g_eeGeneral.view; @@ -472,7 +502,19 @@ void menuMainView(event_t event) doMainScreenGraphics(); // Switches -#if defined(PCBX9LITE) +#if defined(PCBX9LITES) + static const uint8_t x[NUM_SWITCHES-2] = {2*FW-2, 2*FW-2, 17*FW+1, 2*FW-2, 17*FW+1}; + static const uint8_t y[NUM_SWITCHES-2] = {4*FH+1, 5*FH+1, 5*FH+1, 6*FH+1, 6*FH+1}; + for (int i=0; iIDR + #define SWITCHES_GPIO_PIN_F GPIO_Pin_3 // PC.03 #elif defined(PCBX9LITE) // no SWF #elif defined(PCBX7) @@ -469,6 +474,11 @@ #define SWITCHES_GPIO_PIN_G_H GPIO_Pin_3 // PF.03 #define SWITCHES_GPIO_REG_G_L GPIOF->IDR #define SWITCHES_GPIO_PIN_G_L GPIO_Pin_4 // PF.04 +#elif defined(PCBX9LITES) + #define STORAGE_SWITCH_G + #define HARDWARE_SWITCH_G + #define SWITCHES_GPIO_REG_G GPIOC->IDR + #define SWITCHES_GPIO_PIN_G GPIO_Pin_2 // PC.02 #elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) // no SWG #else @@ -635,6 +645,13 @@ #define KEYS_GPIOC_PINS (GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_10 | 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_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15) +#elif defined(PCBX9LITES) + #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_GPIOB_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5) + #define KEYS_GPIOC_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_13) + #define KEYS_GPIOD_PINS (GPIO_Pin_8 | GPIO_Pin_9) + #define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14) #elif defined(PCBX9LITE) #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) @@ -891,6 +908,14 @@ #define LED_RED_GPIO_PIN GPIO_Pin_5 // PC.05 #define LED_BLUE_GPIO GPIOB #define LED_BLUE_GPIO_PIN GPIO_Pin_1 // PB.01 +#elif defined(PCBX9LITES) + #define STATUS_LEDS + #define GPIO_LED_GPIO_ON GPIO_SetBits + #define GPIO_LED_GPIO_OFF GPIO_ResetBits + #define LED_RED_GPIO GPIOE + #define LED_RED_GPIO_PIN GPIO_Pin_5 // PE.05 + #define LED_BLUE_GPIO GPIOE + #define LED_BLUE_GPIO_PIN GPIO_Pin_6 // PE.06 #elif defined(PCBX9LITE) #define STATUS_LEDS #define GPIO_LED_GPIO_ON GPIO_SetBits @@ -1788,7 +1813,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(PCBX9DP) && PCBREV >= 2019) +#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITES) || (defined(PCBX9DP) && PCBREV >= 2019) #define STORAGE_BLUETOOTH #define BT_RCC_APB1Periph RCC_APB1Periph_USART3 #define BT_RCC_APB2Periph 0 @@ -1800,6 +1825,10 @@ #define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOE) // RCC_AHB1Periph_DMA1 #define BT_EN_GPIO GPIOE #define BT_EN_GPIO_PIN GPIO_Pin_15 // PE.15 + #elif defined(PCBX9LITES) + #define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOD) // RCC_AHB1Periph_DMA1 + #define BT_EN_GPIO GPIOD + #define BT_EN_GPIO_PIN GPIO_Pin_14 // PD.14 #else #define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOE) // RCC_AHB1Periph_DMA1 #define BT_EN_GPIO GPIOE diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp index 144d7e97e..380c7d9cc 100644 --- a/radio/src/targets/taranis/keys_driver.cpp +++ b/radio/src/targets/taranis/keys_driver.cpp @@ -179,7 +179,12 @@ uint32_t switchState(uint8_t index) ADD_3POS_CASE(B, 1); ADD_3POS_CASE(C, 2); -#if defined(PCBX9LITE) +#if defined(PCBX9LITES) + ADD_2POS_CASE(D); + ADD_2POS_CASE(E); + ADD_2POS_CASE(F); + ADD_2POS_CASE(G); +#elif defined(PCBX9LITE) ADD_2POS_CASE(D); ADD_2POS_CASE(E); #elif defined(PCBXLITES) diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index 83ddc3095..5d7420330 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -50,6 +50,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(PCBX9LITES) + #define TR_POTS_VSRCRAW "\310S1\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0" #elif defined(PCBX9LITE) #define TR_POTS_VSRCRAW "\310S1\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0" diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py index 41be5705a..e34ac4237 100755 --- a/radio/util/build-firmware.py +++ b/radio/util/build-firmware.py @@ -88,7 +88,11 @@ def main(): cmake_options["PCB"] = "X9LITE" firmware_options = options_taranis_x9lite maxsize = 65536 * 8 - elif board_name == "x7": + elif board_name == "x9lites": + cmake_options["PCB"] = "X9LITES" + firmware_options = options_taranis_x9lite + maxsize = 65536 * 8 + elif options[optcount] == "x7": cmake_options["PCB"] = "X7" firmware_options = options_taranis_x9dp maxsize = 65536 * 8 diff --git a/tools/build-companion-nightly.sh b/tools/build-companion-nightly.sh index c0cf47bd1..0b21114dc 100755 --- a/tools/build-companion-nightly.sh +++ b/tools/build-companion-nightly.sh @@ -50,6 +50,9 @@ make -j${JOBS} libsimulator cmake ${COMMON_OPTIONS} -DPCB=X9LITE ${SRCDIR} make -j${JOBS} libsimulator +cmake ${COMMON_OPTIONS} -DPCB=X9LITES ${SRCDIR} +make -j${JOBS} libsimulator + cmake ${COMMON_OPTIONS} -DPCB=X7 ${SRCDIR} make -j${JOBS} libsimulator diff --git a/tools/build-companion-release.sh b/tools/build-companion-release.sh index 14bda21bf..81a20b6cd 100755 --- a/tools/build-companion-release.sh +++ b/tools/build-companion-release.sh @@ -50,6 +50,9 @@ make -j${JOBS} libsimulator cmake ${COMMON_OPTIONS} -DPCB=X9LITE ${SRCDIR} make -j${JOBS} libsimulator +cmake ${COMMON_OPTIONS} -DPCB=X9LITES ${SRCDIR} +make -j${JOBS} libsimulator + cmake ${COMMON_OPTIONS} -DPCB=X7 ${SRCDIR} make -j${JOBS} libsimulator diff --git a/tools/build-frsky.py b/tools/build-frsky.py index 03beec3e3..9e538bc4a 100755 --- a/tools/build-frsky.py +++ b/tools/build-frsky.py @@ -61,6 +61,21 @@ boards = { "SBUS": "NO", "DEFAULT_MODE": "2", }, + "X9LITES": { + "PCB": "X9LITES", + "LUA": "NO_MODEL_SCRIPTS", + "GVARS": "YES", + "AUTOUPDATE": "YES", + "PXX1": "YES", + "XJT": "NO", + "MODULE_SIZE_STD": "NO", + "PPM": "NO", + "DSM2": "NO", + "MULTIMODULE": "NO", + "CROSSFIRE": "NO", + "SBUS": "NO", + "DEFAULT_MODE": "2", + }, "X9D+": { "PCB": "X9D+", "PCBREV": "2019", diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh index 73c7a2775..6e4719955 100755 --- a/tools/commit-tests.sh +++ b/tools/commit-tests.sh @@ -94,6 +94,15 @@ if [[ " X9LITE ALL " =~ " ${FLAVOR} " ]] ; then make -j${CORES} tests fi +if [[ " X9LITES ALL " =~ " ${FLAVOR} " ]] ; then + # OpenTX on X9LITES + rm -rf * + cmake ${COMMON_OPTIONS} -DPCB=X9LITES -DHELI=YES -DGVARS=YES ${SRCDIR} + make -j${CORES} ${FIRMARE_TARGET} + make -j${CORES} libsimulator + make -j${CORES} tests +fi + if [[ " X7 ALL " =~ " ${FLAVOR} " ]] ; then # OpenTX on X7 rm -rf *